PD9waHAKLyoqCiAqIEJvZGggTmVlciAtIGJyYW5kZWQgdHJhbnNhY3Rpb25hbCBtYWlsZXIKICoKICogVXNlcyBQSFBNYWlsZXIncyBuYXRpdmUgSFRNTCArIEFsdEJvZHkgaW5zdGVhZCBvZiBhIGhhbmQtYnVpbHQKICogbXVsdGlwYXJ0L3JlbGF0ZWQgc3RyaW5nLiBUaGUgbWFudWFsIE1JTUUgYm9keSB0aGF0IHVzZWQgdG8gbGl2ZSBoZXJlIGJyb2tlCiAqIHdwX21haWwoKTogV29yZFByZXNzIHBhcnNlZCB0aGUgQ29udGVudC1UeXBlIGhlYWRlciwgY291bGQgbm90IGZpbmQgYSBjaGFyc2V0CiAqIGluIGl0LCBhbmQgUEhQTWFpbGVyIHRoZW4gY2FsbGVkIG1iX3N0cmxlbigkc3RyLCAnJykgLT4gVmFsdWVFcnJvci4KICogTGV0dGluZyBQSFBNYWlsZXIgYnVpbGQgdGhlIE1JTUUgdHJlZSBpcyBib3RoIHNob3J0ZXIgYW5kIGNvcnJlY3QuCiAqCiAqIFRyYW5zcG9ydDogbG9jYWwgRXhpbSAoMTI3LjAuMC4xOjI1KS4gU2VlIGluY2x1ZGVzL21haWxlci1sb2NhbC5waHAuCiAqLwoKaWYgKCFkZWZpbmVkKCdBQlNQQVRIJykpIHsKICAgIGV4aXQ7Cn0KCmZ1bmN0aW9uIGJuc19tYWlsX2lkZW50aXR5KCkKewogICAgJGMgPSBibnNfZ2V0X2NvbmZpZygpOwoKICAgIHJldHVybiBhcnJheSgKICAgICAgICAnZnJvbV9lbWFpbCcgPT4gJ2NvbnRhY3RAYm9kaG5lZXIudG9wJywKICAgICAgICAnZnJvbV9uYW1lJyAgPT4gJ0JvZGggTmVlcicsCiAgICAgICAgJ3JlcGx5X3RvJyAgID0 ICdjb250YWN0QGJvZGhuZWVyLnRvcCcsCiAgICAgICAgJ3JlcGx5X25hbWUnID0 ICdCb2RoIE5lZXInLAogICAgICAgICdzaXRlJyAgICAgICA9PiAnaHR0cHM6Ly9ib2RobmVlci50b3AnLAogICAgICAgICdsb2dvX2ZpbGUnICA9PiBXUF9DT05URU5UX0RJUiAuICcvdXBsb2Fkcy9ib2RobmVlci9wcml2YXRlL21haWwtbG9nby0zNjAucG5nJywKICAgICAgICAnbG9nb19jaWQnICAgPT4gJ2JvZGhuZWVyLWxvZ28nLAogICAgICAgICd3YScgICAgICAgICA9PiBpc3NldCgkY1snd2hhdHNhcHBfbnVtYmVyJ10pID8gJGNbJ3doYXRzYXBwX251bWJlciddIDogJycsCiAgICAgICAgJ2ZiJyAgICAgICAgID0 IGlzc2V0KCRjWydmYWNlYm9va19wYWdlJ10pID8gJGNbJ2ZhY2Vib29rX3BhZ2UnXSA6ICcnLAogICAgKTsKfQoKLyoqCiAqIEhUTUwgYm9keSB3cmFwcGVyOiBkYXJrIGxvZ28gaGVhZGVyLCBjb250ZW50LCBwbGFpbiBmb290ZXIuCiAqCiAqIEBwYXJhbSBzdHJpbmcgJGlubmVyX2h0bWwgSFRNTCBmb3IgdGhlIG1pZGRsZSBvZiB0aGUgbWVzc2FnZSAoYWxyZWFkeSBzYWZlKS4KICogQHBhcmFtIHN0cmluZyAkcHJlaGVhZGVyICBIaWRkZW4gcHJldmlldyB0ZXh0IHNob3duIGJ5IHRoZSBpbmJveCBsaXN0LgogKi8KZnVuY3Rpb24gYm5zX21haWxfaHRtbCgkaW5uZXJfaHRtbCwgJHByZWhlYWRlciA9ICcnKQp7CiAgICAkaSAgICA9IGJuc19tYWlsX2lkZW50aXR5KCk7CiAgICAkbG9nbyA9ICdjaWQ6JyAuICRpWydsb2dvX2NpZCddOwogICAgJHNpdGUgPSBlc2NfdXJsKCRpWydzaXRlJ10pOwogICAgJHByZSAgPSAkcHJlaGVhZGVyICE9PSAnJyA/ICRwcmVoZWFkZXIgOiAn4KaG4Kaq4Kao4Ka 4KawIENsYXNzIDUgRW5nbGlzaCBHcmFtbWFyIE1hc3RlciBCb29rIOCmquCnjeCmsOCmuOCnjeCmpOCngeCmpOClpCc7CgogICAgJGh0bWwgID0gJzwhRE9DVFlQRSBodG1sPjxodG1sIGxhbmc9ImJuIj48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI JzsKICAgICRodG1sIC49ICc8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSI JzsKICAgICRodG1sIC49ICc8dGl0bGU Qm9kaCBOZWVyPC90aXRsZT48L2hlYWQ JzsKICAgICRodG1sIC49ICc8Ym9keSBzdHlsZT0ibWFyZ2luOjA7cGFkZGluZzowO2JhY2tncm91bmQ6I2YxZjVmOTsiPic7CiAgICAkaHRtbCAuPSAnPGRpdiBzdHlsZT0iZGlzcGxheTpub25lO21heC1oZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW47b3BhY2l0eTowOyI JwogICAgICAgICAgIC4gZXNjX2h0bWwoJHByZSkgLiAnPC9kaXY JzsKCiAgICAkaHRtbCAuPSAnPHRhYmxlIHJvbGU9InByZXNlbnRhdGlvbiIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIicKICAgICAgICAgICAuICcgc3R5bGU9ImJhY2tncm91bmQ6I2YxZjVmOTtwYWRkaW5nOjI0cHggMTJweDsiPjx0cj48dGQgYWxpZ249ImNlbnRlciI JzsKCiAgICAkaHRtbCAuPSAnPHRhYmxlIHJvbGU9InByZXNlbnRhdGlvbiIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIicKICAgICAgICAgICAuICcgc3R5bGU9Im1heC13aWR0aDo1NjBweDtiYWNrZ3JvdW5kOiNmZmZmZmY7Ym9yZGVyLXJhZGl1czoxNnB4O292ZXJmbG93OmhpZGRlbjsnCiAgICAgICAgICAgLiAnZm9udC1mYW1pbHk6QXJpYWwsSGluZCBTaWxpZ3VyaSxOb3RvIFNhbnMgQmVuZ2FsaSxzYW5zLXNlcmlmOyI JzsKCiAgICAkaHRtbCAuPSAnPHRyPjx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYmFja2dyb3VuZDojMGYxNzJhO3BhZGRpbmc6MjZweCAyMHB4OyI JzsKICAgICRodG1sIC49ICc8YSBocmVmPSInIC4gJHNpdGUgLiAnIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ij4nOwogICAgJGh0bWwgLj0gJzxpbWcgc3JjPSInIC4gZXNjX2F0dHIoJGxvZ28pIC4gJyIgYWx0PSJCb2RoIE5lZXIiIHdpZHRoPSIxNTAiJwogICAgICAgICAgIC4gJyBzdHlsZT0iZGlzcGxheTpibG9jaztib3JkZXI6MDtvdXRsaW5lOm5vbmU7d2lkdGg6MTUwcHg7aGVpZ2h0OmF1dG87bWF4LXdpZHRoOjE1MHB4OyI JzsKICAgICRodG1sIC49ICc8L2E JzsKICAgICRodG1sIC49ICc8ZGl2IHN0eWxlPSJjb2xvcjojZTJlOGYwO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tdG9wOjEwcHg7Ij5Cb2RoIE5lZXI8L2Rpdj4nOwogICAgJGh0bWwgLj0gJzwvdGQ PC90cj4nOwoKICAgICRodG1sIC49ICc8dHI PHRkIHN0eWxlPSJwYWRkaW5nOjI4cHggMjZweCA4cHg7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MS43NTtjb2xvcjojMWUyOTNiOyI JzsKICAgICRodG1sIC49ICRpbm5lcl9odG1sOwogICAgJGh0bWwgLj0gJzwvdGQ PC90cj4nOwoKICAgICRodG1sIC49ICc8dHI PHRkIHN0eWxlPSJwYWRkaW5nOjIycHggMjZweCAyOHB4O2JvcmRlci10b3A6MXB4IHNvbGlkICNlMmU4ZjA7JwogICAgICAgICAgIC4gJ2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjojNjQ3NDhiOyI JzsKICAgICRodG1sIC49ICc8cCBzdHlsZT0ibWFyZ2luOjAgMCA4cHg7Ij48c3Ryb25nIHN0eWxlPSJjb2xvcjojMWUzYThhOyI Qm9kaCBOZWVyPC9zdHJvbmc JwogICAgICAgICAgIC4gJyAmbWRhc2g7IOCmleCnjeCmsuCmvuCmuCDgp6sg4KaH4KaC4Kaw4KeH4Kac4Ka/IOCml CnjeCmsOCmvuCmruCmvuCmsCDgpqzgpoc8L3A JzsKICAgIGlmICghZW1wdHkoJGlbJ3dhJ10pKSB7CiAgICAgICAgJGh0bWwgLj0gJzxwIHN0eWxlPSJtYXJnaW46MCAwIDhweDsiPldoYXRzQXBwOiA8YSBocmVmPSJodHRwczovL3dhLm1lLzg4JwogICAgICAgICAgICAgICAuIGVzY19hdHRyKHByZWdfcmVwbGFjZSgnL1teMC05XS8nLCAnJywgJGlbJ3dhJ10pKQogICAgICAgICAgICAgICAuICciIHN0eWxlPSJjb2xvcjojMWUzYThhO3RleHQtZGVjb3JhdGlvbjpub25lOyI JyAuIGVzY19odG1sKCRpWyd3YSddKSAuICc8L2E PC9wPic7CiAgICB9CiAgICBpZiAoIWVtcHR5KCRpWydmYiddKSkgewogICAgICAgICRodG1sIC49ICc8cCBzdHlsZT0ibWFyZ2luOjAgMCA4cHg7Ij48YSBocmVmPSInIC4gZXNjX3VybCgkaVsnZmInXSkKICAgICAgICAgICAgICAgLiAnIiBzdHlsZT0iY29sb3I6IzFlM2E4YTt0ZXh0LWRlY29yYXRpb246bm9uZTsiPuCmhuCmruCmvuCmpuCnh CmsCDgpqvgp4fgprjgpqzgp4HgppUg4Kaq4KeH4KacPC9hPjwvcD4nOwogICAgfQogICAgJGh0bWwgLj0gJzxwIHN0eWxlPSJtYXJnaW46MDtjb2xvcjojOTRhM2I4O2ZvbnQtc2l6ZToxMnB4OyI JwogICAgICAgICAgIC4gJ Cmj CmhyDgpofgpq7gp4fgpofgprLgpp/gpr8g4KaG4Kaq4Kao4Ka/IOCmheCmsOCnjeCmoeCmvuCmsCDgppXgprDgpr7gprAg4KaV4Ka 4Kaw4Kaj4KeHIOCmquCnh Cmr CmvOCnh Cmm Cnh CmqOClpDwvcD4nOwogICAgJGh0bWwgLj0gJzwvdGQ PC90cj4nOwoKICAgICRodG1sIC49ICc8L3RhYmxlPjwvdGQ PC90cj48L3RhYmxlPjwvYm9keT48L2h0bWw JzsKCiAgICByZXR1cm4gJGh0bWw7Cn0KCi8qKgogKiBQbGFpbi10ZXh0IGFsdGVybmF0aXZlIGZvciBjbGllbnRzIHRoYXQgZG8gbm90IHJlbmRlciBIVE1MLgogKi8KZnVuY3Rpb24gYm5zX21haWxfdGV4dCgkbGluZXMpCnsKICAgICRpICAgPSBibnNfbWFpbF9pZGVudGl0eSgpOwogICAgJG91dCA9IGltcGxvZGUoIlxuXG4iLCAkbGluZXMpOwogICAgJG91dCAuPSAiXG5cbi0tLVxuQm9kaCBOZWVyXG4iIC4gJGlbJ3NpdGUnXSAuICJcbiI7CiAgICBpZiAoIWVtcHR5KCRpWyd3YSddKSkgewogICAgICAgICRvdXQgLj0gJ1doYXRzQXBwOiAnIC4gJGlbJ3dhJ10gLiAiXG4iOwogICAgfQogICAgcmV0dXJuICRvdXQ7Cn0KCi8qKgogKiBPcmFuZ2UgY2FsbC10by1hY3Rpb24gYnV0dG9uLgogKi8KZnVuY3Rpb24gYm5zX21haWxfYnV0dG9uKCRsYWJlbCwgJHVybCkKewogICAgcmV0dXJuICc8YSBocmVmPSInIC4gZXNjX3VybCgkdXJsKSAuICciIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOiNmOTczMTY7JwogICAgICAgICAuICdjb2xvcjojZmZmZmZmO3BhZGRpbmc6MTRweCAyOHB4O2JvcmRlci1yYWRpdXM6MTBweDtmb250LXNpemU6MTZweDsnCiAgICAgICAgIC4gJ2ZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ij4nIC4gZXNjX2h0bWwoJGxhYmVsKSAuICc8L2E JzsKfQoKLyoqCiAqIFNlbmQgb25lIGJyYW5kZWQgbWVzc2FnZS4KICoKICogQHBhcmFtIHN0cmluZyAgICAgICR0byAgICAgIFJlY2lwaWVudC4KICogQHBhcmFtIHN0cmluZyAgICAgICRzdWJqZWN0IFN1YmplY3QgbGluZS4KICogQHBhcmFtIHN0cmluZyAgICAgICRpbm5lciAgIEhUTUwgYm9keSAobWlkLXNlY3Rpb24gb25seSkuCiAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkcGxhaW4gICBQbGFpbi10ZXh0IGFsdGVybmF0aXZlLgogKiBAcmV0dXJuIGJvb2wKICovCmZ1bmN0aW9uIGJuc19zZW5kX21haWwoJHRvLCAkc3ViamVjdCwgJGlubmVyLCAkcGxhaW4gPSBudWxsKQp7CiAgICAkaSA9IGJuc19tYWlsX2lkZW50aXR5KCk7CgogICAgJGlubmVyICAgICAgPSAoc3RyaW5nKSAkaW5uZXI7CiAgICAkcGxhaW5fdGV4dCA9ICgkcGxhaW4gPT09IG51bGwpID8gd3Bfc3RyaXBfYWxsX3RhZ3MoJGlubmVyKSA6IChzdHJpbmcpICRwbGFpbjsKICAgIGlmICh0cmltKCRwbGFpbl90ZXh0KSA9PT0gJycpIHsKICAgICAgICAkcGxhaW5fdGV4dCA9ICRpWydzaXRlJ107CiAgICB9CgogICAgJGh0bWwgPSBibnNfbWFpbF9odG1sKCRpbm5lcik7CiAgICBpZiAoZmlsZV9leGlzdHMoJGlbJ2xvZ29fZmlsZSddKSkgewogICAgICAgICRkYXRhID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnIC4gYmFzZTY0X2VuY29kZSgoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkaVsnbG9nb19maWxlJ10pKTsKICAgICAgICAkaHRtbCA9IHN0cl9yZXBsYWNlKCdjaWQ6JyAuICRpWydsb2dvX2NpZCddLCAkZGF0YSwgJGh0bWwpOwogICAgfQoKICAgICRoZWFkZXJzID0gYXJyYXkoCiAgICAgICAgJ0Zyb206ICcgLiAkaVsnZnJvbV9uYW1lJ10gLiAnIDwnIC4gJGlbJ2Zyb21fZW1haWwnXSAuICc JywKICAgICAgICAnUmVwbHktVG86ICcgLiAkaVsncmVwbHlfbmFtZSddIC4gJyA8JyAuICRpWydyZXBseV90byddIC4gJz4nLAogICAgKTsKCiAgICByZXR1cm4gKGJvb2wpIHdwX21haWwoJHRvLCAkc3ViamVjdCwgJGh0bWwsICRoZWFkZXJzLCBhcnJheSgkcGxhaW5fdGV4dCkpOwp9Cg==