השוואת קופות גמל מתקדמת
חפש, סנן והשווה מתוך … מוצרים פנסיוניים · לחץ "פרטים" לדף הקופה המלא
—
פנסיה
—
השתלמות
—
גמל
—
פוליסות
מציג 0 מתוך 0 קופות
| שם הקופה ↕ | סוג מוצר ↕ | מספר קופה ↕ |
|---|
הבהרה משפטית: המידע מוצג לצורך השוואה בלבד ואינו מהווה ייעוץ השקעות, ייעוץ פנסיוני או המלצה לרכישה/מכירה. לפני קבלת החלטה פנסיונית יש להתייעץ עם יועץ פנסיוני מוסמך. הנתונים מבוססים על דיווחי החברות המנהלות ועל מאגר גמלנט.
📊
השוואה
בחר 2–3 קופות
השוואת קופות
KGZ1bmN0aW9uKCl7CgovLyDilIDilIAgRXh0cmFjdCBmdW5kIGRhdGEgZnJvbSBnZW1lbHRvcCBzZWFyY2ggc2NyaXB0IOKUgOKUgAp2YXIgRlVORFMgPSBbXTsKdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQ6bm90KFtzcmNdKScpOwpmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKICB2YXIgdHh0ID0gc2NyaXB0c1tpXS50ZXh0Q29udGVudCB8fCAnJzsKICBpZiAodHh0LmluZGV4T2YoJ2d0U2VhcmNoSW5wdXQnKSA+IC0xKSB7CiAgICB2YXIgbSA9IHR4dC5tYXRjaCgvdmFyIGZ1bmRzXHMqPVxzKihcW1tcc1xTXSs/XF0pOy8pOwogICAgaWYgKG0pIHsgdHJ5IHsgRlVORFMgPSBKU09OLnBhcnNlKG1bMV0pOyB9IGNhdGNoKGUpe30gYnJlYWs7IH0KICB9Cn0KCi8vIOKUgOKUgCBLbm93biBtYW5hZ2VycyB0byBkZXRlY3QgaW4gZnVuZCBuYW1lcyDilIDilIAKdmFyIEtOT1dOX01HUlMgPSBbCiAgJ9eU16TXoNeZ16fXoScsJ9ee15LXk9ecJywn157XoNeV16jXlCDXnteR15jXl9eZ150nLCfXnteg15XXqNeUJywn15vXnNecJywn15TXqNeQ15wnLAogICfXkNec15jXqdeV15zXqCDXqdeX150nLCfXnteZ15jXkScsJ9eQ16DXnNeZ16HXmCcsJ9eZ15zXmdefINec16TXmdeT15XXqicsJ9ek16HXkteV16onLCfXnteV16gnLAogICfXkNeZLteR15ku15DXmScsJ9ei157Xmdeq15nXnScsJ9eU15vXqdeo15QnLCfXkNeV157XkteUJywn15DXmdeg16TXmdeg15nXmNeZJywn15DXp9eh15zXoNehJywKICAn15PXqScsJ9eR16DXpyDXlNek15XXotec15nXnScsJ9eR16DXpyDXnNeQ15XXnteZJywn16DXmNeVJywn157Xmdeo15DXnCcsJ9ec15TXkScsCiAgJ9eQ15LXldeT15Qg16nXmdeq15XXpNeZ16onLCfXodec16InLCfXkdeZ15jXldeXINeZ16nXmdeoJywn15DXldeo158nLCfXnteR15jXl9eZ150nLCfXp9eo158g157Xp9eZ16TXlCcsCiAgJ9ei15XXkdeT15kg157Xk9eZ16DXlCcsJ9eU16TXldei15zXmdedJywn15vXnNecINek16DXodeZ15QnLCfXlNeR16DXp9eQ15nXnScsJ9eq16LXqdeZ15nXlCDXldee15zXkNeb15QnLCfXnteh15LXqNeqJwpdOwoKLy8g4pSA4pSAIFN1Yi10eXBlIG9wdGlvbnMgcGVyIGNhdGVnb3J5IOKUgOKUgAp2YXIgU1VCX1RZUEVTID0gewogIGd0X3BlbnNpeWE6IFsKICAgIHt2OifXnten15nXpNeUJyxsOifXpNeg16HXmdeUINee16fXmdek15QnfSwKICAgIHt2OifXntep15zXmdee15QnLGw6J9ek16DXodeZ15Qg157Xqdec15nXnteUJ30sCiAgICB7djon15HXqNeZ16jXqiDXnteX15PXnCcsbDon15HXqNeZ16jXqiDXnteX15PXnCd9LAogICAge3Y6J9ee16DXmdeV16onLGw6J9ee16HXnNeV15wg157XoNeZ15XXqid9LAogICAge3Y6J9eb15zXnNeZJyxsOifXnteh15zXldecINeb15zXnNeZJ30sCiAgXSwKICBndF9oaXNodGFsbXV0OiBbCiAgICB7djon157XoNeZ15XXqicsbDon16fXqNefINeU16nXqtec157XldeqINee16DXmdeV16onfSwKICAgIHt2OifXm9ec15zXmScsbDon16fXqNefINeU16nXqtec157XldeqINeb15zXnNeZ16onfSwKICAgIHt2OifXkNeS15cnLGw6J9en16jXnyDXlNep16rXnNee15XXqiDXkNeSIteXJ30sCiAgICB7djon157Xl9en15QnLGw6J9en16jXnyDXlNep16rXnNee15XXqiDXnteX16fXlCDXnteT15MnfSwKICAgIHt2OifXlNec15vXlCcsbDon16fXqNefINeU16nXqtec157XldeqINeU15zXm9eUJ30sCiAgICB7djon16HXl9eZ16gnLGw6J9ee16HXnNeV15wg16HXl9eZ16gnfSwKICBdLAogIGd0X2dlbWVsOiBbCiAgICB7djon15zXlNep16fXoteUJyxsOifXktee15wg15zXlNep16fXoteUJ30sCiAgICB7djon15zXpNeZ16bXldeZ15nXnScsbDon15LXntecINec16TXmdem15XXmdeZ150nfSwKICAgIHt2OifXpNeZ16bXldeZ15nXnScsbDon15LXntecINek15nXpteV15nXmdedJ30sCiAgICB7djon157XoNeZ15XXqicsbDon157Xodec15XXnCDXnteg15nXldeqJ30sCiAgICB7djon15vXnNec15knLGw6J9ee16HXnNeV15wg15vXnNec15knfSwKICAgIHt2OifXkNeS15cnLGw6J9ee16HXnNeV15wg15DXkiLXlyd9LAogICAge3Y6J9eU15zXm9eUJyxsOifXnteh15zXldecINeU15zXm9eUJ30sCiAgICB7djon157Xl9en15QnLGw6J9ee16HXnNeV15wg157Xl9en15Qg157Xk9eTJ30sCiAgXSwKICBndF9wb2xpc2E6IFsKICAgIHt2OifXodeX15nXqCcsbDon16TXldec15nXodeUINeh15fXmdeo15QnfSwKICAgIHt2OifXnteg15nXldeqJyxsOifXnteh15zXldecINee16DXmdeV16onfSwKICAgIHt2OifXm9ec15zXmScsbDon157Xodec15XXnCDXm9ec15zXmSd9LAogICAge3Y6J9ee157Xqdec16rXmScsbDon157Xodec15XXnCDXntee16nXnNeq15knfSwKICBdLAogIGd0X3RhZ211bGltOlsKICAgIHt2OifXnteg15nXldeqJyxsOifXnteh15zXldecINee16DXmdeV16onfSwKICAgIHt2OifXm9ec15zXmScsbDon157Xodec15XXnCDXm9ec15zXmSd9LAogIF0sCiAgZ3RfeWVsYWRpbTpbCiAgICB7djon157XoNeZ15XXqicsbDon157Xodec15XXnCDXnteg15nXldeqJ30sCiAgICB7djon15vXnNec15knLGw6J9ee16HXnNeV15wg15vXnNec15knfSwKICAgIHt2OifXnteX16fXlCcsbDon157Xodec15XXnCDXnteX16fXlCd9LAogIF0KfTsKCnZhciBUTCA9IHsKICBndF9oaXNodGFsbXV0OifXp9eo158g15TXqdeq15zXnteV16onLCBndF9nZW1lbDon16fXldek16og15LXntecJywKICBndF9wZW5zaXlhOifXpNeg16HXmdeUJywgZ3RfdGFnbXVsaW06J9eq15LXnteV15zXmdedJywKICBndF9wb2xpc2E6J9ek15XXnNeZ16HXqiDXl9eZ16HXm9eV158nLCBndF95ZWxhZGltOifXl9eZ16HXm9eV158g15zXm9ecINeZ15zXkycKfTsKCi8vIOKUgOKUgCBQb3B1bGF0ZSBtYW5hZ2VycyBkeW5hbWljYWxseSDilIDilIAKZnVuY3Rpb24gcG9wdWxhdGVNYW5hZ2VycygpewogIHZhciBmb3VuZCA9IHt9OwogIEZVTkRTLmZvckVhY2goZnVuY3Rpb24oZil7CiAgICBLTk9XTl9NR1JTLmZvckVhY2goZnVuY3Rpb24obWdyKXsKICAgICAgaWYoZi5uYW1lLmluZGV4T2YobWdyKSA+IC0xKSBmb3VuZFttZ3JdID0gdHJ1ZTsKICAgIH0pOwogIH0pOwogIHZhciBzb3J0ZWQgPSBPYmplY3Qua2V5cyhmb3VuZCkuc29ydCgpOwogIHZhciBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnAtbWdyJyk7CiAgaWYoIXNlbCkgcmV0dXJuOwogIHNlbC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iIj7Xm9ecINeU15LXldek15nXnTwvb3B0aW9uPicgKwogICAgc29ydGVkLm1hcChmdW5jdGlvbihtKXsgcmV0dXJuICc8b3B0aW9uIHZhbHVlPSInK20rJyI+JyttKyc8L29wdGlvbj4nOyB9KS5qb2luKCcnKTsKfQoKLy8g4pSA4pSAIFBvcHVsYXRlIHN1Yi10eXBlcyDilIDilIAKZnVuY3Rpb24gcG9wdWxhdGVTdWJUeXBlcyhjYXQpewogIHZhciBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnAtc3ViJyk7CiAgaWYoIXNlbCkgcmV0dXJuOwogIHZhciBvcHRzID0gU1VCX1RZUEVTW2NhdF0gfHwgW107CiAgc2VsLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSIiPteb15wg15TXodeV15LXmdedPC9vcHRpb24+JyArCiAgICBvcHRzLm1hcChmdW5jdGlvbihvKXsgcmV0dXJuICc8b3B0aW9uIHZhbHVlPSInK28udisnIj4nK28ubCsnPC9vcHRpb24+JzsgfSkuam9pbignJyk7CiAgUy5zdWIgPSAnJzsKfQoKd2luZG93LmdmdENhdENoYW5nZSA9IGZ1bmN0aW9uKHYpewogIFMudHlwZSA9IHY7IFMuc3ViID0gJyc7CiAgcG9wdWxhdGVTdWJUeXBlcyh2ID09PSAnZ3RfZ2VtZWxfaW52ZXN0JyA/ICcnIDogdik7CiAgZmlsdGVyKCk7Cn07CgovLyDilIDilIAgU3RhdHMg4pSA4pSACmZ1bmN0aW9uIHN0YXRzKCkgewogIHZhciBjID0ge307CiAgRlVORFMuZm9yRWFjaChmdW5jdGlvbihmKXsgY1tmLnR5cGVdPShjW2YudHlwZV18fDApKzE7IH0pOwogIGZ1bmN0aW9uIHMoaWQsdil7IHZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgaWYoZSkgZS50ZXh0Q29udGVudD12OyB9CiAgcygnc2gtcGVuJywgYy5ndF9wZW5zaXlhfHwwKTsKICBzKCdzaC1oaXNoJywgYy5ndF9oaXNodGFsbXV0fHwwKTsKICBzKCdzaC1nZW0nLCAoYy5ndF9nZW1lbHx8MCkrKGMuZ3RfdGFnbXVsaW18fDApKTsKICBzKCdzaC1wb2wnLCAoYy5ndF9wb2xpc2F8fDApKyhjLmd0X3llbGFkaW18fDApKTsKICBzKCdnZnQtdG90YWwtaGVybycsIEZVTkRTLmxlbmd0aCk7Cn0KCi8vIOKUgOKUgCBTZWFyY2gg4pSA4pSACmZ1bmN0aW9uIG5vcm0ocyl7IHJldHVybiAoc3x8JycpLnRvTG93ZXJDYXNlKCkudHJpbSgpLnJlcGxhY2UoL1tccyIn17TXs1wtXS9nLCcnKTsgfQpmdW5jdGlvbiBzYyhmLHEpewogIHZhciBjPW5vcm0oZi5jb2RlKSxuPW5vcm0oZi5uYW1lKSxhPW5vcm0oZi5hbGlhc2VzfHwnJyksdD1ub3JtKFRMW2YudHlwZV18fCcnKTsKICB2YXIgcz0wOwogIGlmKGM9PT1xKXMrPTEyMDsgaWYobj09PXEpcys9MTEwOyBpZihhPT09cSlzKz0xMDA7CiAgaWYoYy5pbmRleE9mKHEpPT09MClzKz04MDsgaWYobi5pbmRleE9mKHEpPT09MClzKz03MDsKICBpZihhLmluZGV4T2YocSk9PT0wKXMrPTUwOyBpZih0LmluZGV4T2YocSk9PT0wKXMrPTI1OwogIGlmKGMuaW5kZXhPZihxKT4tMSlzKz0zNTsgaWYobi5pbmRleE9mKHEpPi0xKXMrPTMwOwogIGlmKGEuaW5kZXhPZihxKT4tMSlzKz0yMDsgaWYodC5pbmRleE9mKHEpPi0xKXMrPTEwOwogIHJldHVybiBzOwp9CmZ1bmN0aW9uIGhsKHRleHQscSl7CiAgaWYoIXEpIHJldHVybiB0ZXh0OwogIHZhciBzYWZlPXEucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csJ1xcJCYnKTsKICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoJygnK3NhZmUrJyknLCdnaScpLCc8bWFyaz4kMTwvbWFyaz4nKTsKfQoKLy8g4pSA4pSAIFN0YXRlIOKUgOKUgAp2YXIgUyA9IHtxOicnLHR5cGU6J2FsbCcsc3ViOicnLG1ncjonJyxzb3J0OidzY29yZScscGFnZToxLHBwOjQwLHJlczpbXSxzZWw6e319OwoKZnVuY3Rpb24gZmlsdGVyKCl7CiAgdmFyIHE9bm9ybShTLnEpOwogIHZhciBsaXN0PUZVTkRTLmZpbHRlcihmdW5jdGlvbihmKXsKICAgIGlmKFMudHlwZT09PSdndF9nZW1lbF9pbnZlc3QnKXsKICAgICAgaWYoZi50eXBlIT09J2d0X2dlbWVsJykgcmV0dXJuIGZhbHNlOwogICAgICBpZihmLm5hbWUuaW5kZXhPZign15zXlNep16fXoteUJyk8MCkgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmKFMudHlwZSE9PSdhbGwnICYmIGYudHlwZSE9PVMudHlwZSkgcmV0dXJuIGZhbHNlOwogICAgaWYoUy5zdWIgJiYgZi5uYW1lLmluZGV4T2YoUy5zdWIpPDApIHJldHVybiBmYWxzZTsKICAgIGlmKFMubWdyICYmIGYubmFtZS5pbmRleE9mKFMubWdyKTwwKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9KTsKICBpZihxKXsKICAgIGxpc3Q9bGlzdC5tYXAoZnVuY3Rpb24oZil7cmV0dXJue2Y6ZixzOnNjKGYscSl9O30pCiAgICAgIC5maWx0ZXIoZnVuY3Rpb24oeCl7cmV0dXJuIHgucz4wO30pCiAgICAgIC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIucy1hLnM7fSkKICAgICAgLm1hcChmdW5jdGlvbih4KXtyZXR1cm4geC5mO30pOwogIH0gZWxzZSBpZihTLnNvcnQhPT0nc2NvcmUnKXsKICAgIGxpc3Quc29ydChmdW5jdGlvbihhLGIpewogICAgICB2YXIgYXY9Uy5zb3J0PT09J2NvZGVfYXNjJz9hLmNvZGU6YS5uYW1lOwogICAgICB2YXIgYnY9Uy5zb3J0PT09J2NvZGVfYXNjJz9iLmNvZGU6Yi5uYW1lOwogICAgICBhdj1hdnx8Jyc7IGJ2PWJ2fHwnJzsKICAgICAgdmFyIHI9YXY8YnY/LTE6YXY+YnY/MTowOwogICAgICByZXR1cm4gUy5zb3J0PT09J25hbWVfZGVzYyc/LXI6cjsKICAgIH0pOwogIH0KICBTLnJlcz1saXN0OyBTLnBhZ2U9MTsgZHJhdygpOwp9CgpmdW5jdGlvbiBkcmF3KCl7CiAgdmFyIHRvdGFsPVMucmVzLmxlbmd0aCwgc3RhcnQ9KFMucGFnZS0xKSpTLnBwLCBwYWdlPVMucmVzLnNsaWNlKHN0YXJ0LHN0YXJ0K1MucHApLCBxPVMucTsKICB2YXIgc2g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dmdC1zaG93bicpLCB0bz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2Z0LXRvdGFsJyk7CiAgaWYoc2gpIHNoLnRleHRDb250ZW50PU1hdGgubWluKHRvdGFsLHN0YXJ0K3BhZ2UubGVuZ3RoKTsKICBpZih0bykgdG8udGV4dENvbnRlbnQ9dG90YWw7CiAgdmFyIHRiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZnQtdGJvZHknKTsKICBpZighdGIpIHJldHVybjsKICBpZighcGFnZS5sZW5ndGgpewogICAgdGIuaW5uZXJIVE1MPSc8dHI+PHRkIGNvbHNwYW49IjUiPjxkaXYgY2xhc3M9ImdmdC1lbXB0eSI+15zXkCDXoNee16bXkNeVINen15XXpNeV16og15TXqteV15DXnteV16o8L2Rpdj48L3RkPjwvdHI+JzsKICB9IGVsc2UgewogICAgdGIuaW5uZXJIVE1MPXBhZ2UubWFwKGZ1bmN0aW9uKGYpewogICAgICB2YXIgaXNTZWw9ISFTLnNlbFtmLmNvZGVdOwogICAgICB2YXIgbm09cT9obChmLm5hbWUsUy5xKTpmLm5hbWU7CiAgICAgIHZhciBjZD1xP2hsKGYuY29kZSxTLnEpOmYuY29kZTsKICAgICAgcmV0dXJuICc8dHIgY2xhc3M9IicrKGlzU2VsPydzZWxlY3RlZCc6JycpKyciPicrCiAgICAgICAgJzx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImdmdC1jaGsiICcrKGlzU2VsPydjaGVja2VkJzonJykrCiAgICAgICAgICAnIG9uY2hhbmdlPSJnZnRUb2dnbGUodGhpcyxcJycrZi5jb2RlKydcJykiIHRpdGxlPSLXlNeV16HXoyDXnNeU16nXldeV15DXlCI+PC90ZD4nKwogICAgICAgICc8dGQ+PGRpdiBjbGFzcz0iZ2Z0LWZuYW1lIj4nK25tKyc8L2Rpdj48L3RkPicrCiAgICAgICAgJzx0ZD48c3BhbiBjbGFzcz0iZ2Z0LWJhZGdlICcrZi50eXBlKyciPicrVExbZi50eXBlXSsnPC9zcGFuPjwvdGQ+JysKICAgICAgICAnPHRkPjxkaXYgY2xhc3M9ImdmdC1mY29kZSI+JytjZCsnPC9kaXY+PC90ZD4nKwogICAgICAgICc8dGQgc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxJTsiPjxhIGNsYXNzPSJnZnQtYnRuIiBocmVmPSInK2YudXJsKyciIHRhcmdldD0iX2JsYW5rIj7XpNeo15jXmdedIOKAujwvYT48L3RkPicrCiAgICAgICc8L3RyPic7CiAgICB9KS5qb2luKCcnKTsKICB9CiAgZHJhd1BhZ2VyKHRvdGFsKTsKfQoKZnVuY3Rpb24gZHJhd1BhZ2VyKHRvdGFsKXsKICB2YXIgcGFnZXM9TWF0aC5jZWlsKHRvdGFsL1MucHApLCBlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2Z0LXBhZ2VyJyk7CiAgaWYoIWVsKSByZXR1cm47CiAgaWYocGFnZXM8PTEpe2VsLmlubmVySFRNTD0nJztyZXR1cm47fQogIHZhciBoPSc8YnV0dG9uIGNsYXNzPSJnZnQtcGciJysoUy5wYWdlPD0xPycgZGlzYWJsZWQnOicnKSsnIG9uY2xpY2s9ImdmdFBnKCcrKFMucGFnZS0xKSsnKSI+4oC5PC9idXR0b24+JzsKICB2YXIgcz1NYXRoLm1heCgxLFMucGFnZS0yKSwgZT1NYXRoLm1pbihwYWdlcyxTLnBhZ2UrMik7CiAgaWYocz4xKSBoKz0nPGJ1dHRvbiBjbGFzcz0iZ2Z0LXBnIiBvbmNsaWNrPSJnZnRQZygxKSI+MTwvYnV0dG9uPicrKHM+Mj8nPHNwYW4gc3R5bGU9InBhZGRpbmc6MCA1cHg7Y29sb3I6dmFyKC0tbXUpIj7igKY8L3NwYW4+JzonJyk7CiAgZm9yKHZhciBpPXM7aTw9ZTtpKyspIGgrPSc8YnV0dG9uIGNsYXNzPSJnZnQtcGcnKyhpPT09Uy5wYWdlPycgb24nOicnKSsnIiBvbmNsaWNrPSJnZnRQZygnK2krJykiPicraSsnPC9idXR0b24+JzsKICBpZihlPHBhZ2VzKSBoKz0oZTxwYWdlcy0xPyc8c3BhbiBzdHlsZT0icGFkZGluZzowIDVweDtjb2xvcjp2YXIoLS1tdSkiPuKApjwvc3Bhbj4nOicnKSsnPGJ1dHRvbiBjbGFzcz0iZ2Z0LXBnIiBvbmNsaWNrPSJnZnRQZygnK3BhZ2VzKycpIj4nK3BhZ2VzKyc8L2J1dHRvbj4nOwogIGgrPSc8YnV0dG9uIGNsYXNzPSJnZnQtcGciJysoUy5wYWdlPj1wYWdlcz8nIGRpc2FibGVkJzonJykrJyBvbmNsaWNrPSJnZnRQZygnKyhTLnBhZ2UrMSkrJykiPuKAujwvYnV0dG9uPic7CiAgZWwuaW5uZXJIVE1MPWg7Cn0KCi8vIOKUgOKUgCBDb21wYXJlIOKUgOKUgApmdW5jdGlvbiBnZXRTZWxGdW5kcygpeyByZXR1cm4gT2JqZWN0LmtleXMoUy5zZWwpLm1hcChmdW5jdGlvbihjb2RlKXsgcmV0dXJuIFMuc2VsW2NvZGVdOyB9KTsgfQoKZnVuY3Rpb24gdXBkYXRlQmFyKCl7CiAgdmFyIGZ1bmRzPWdldFNlbEZ1bmRzKCksIGJhcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2Z0LWNiYXInKTsKICB2YXIgY2hpcHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dmdC1jaGlwcycpLCBjbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dmdC1jYmFyLWNvdW50Jyk7CiAgaWYoIWJhcnx8IWNoaXBzKSByZXR1cm47CiAgaWYoZnVuZHMubGVuZ3RoPT09MCl7IGJhci5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IHJldHVybjsgfQogIGJhci5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7CiAgaWYoY250KSBjbnQudGV4dENvbnRlbnQgPSBmdW5kcy5sZW5ndGggKyAnLzMg16fXldek15XXqiDXoNeR15fXqNeVIMK3INec15fXpSAi15TXqdeV15XXlCIg15zXpNeq15nXl9eqINeU15TXqdeV15XXkNeUJzsKICBjaGlwcy5pbm5lckhUTUw9ZnVuZHMubWFwKGZ1bmN0aW9uKGYpewogICAgdmFyIHNob3J0ID0gZi5uYW1lLmxlbmd0aD4yOCA/IGYubmFtZS5zdWJzdHJpbmcoMCwyNykrJ+KApicgOiBmLm5hbWU7CiAgICByZXR1cm4gJzxkaXYgY2xhc3M9ImdmdC1jaGlwIj4nKwogICAgICAnPHNwYW4gY2xhc3M9ImdmdC1jaGlwLW5hbWUiIHRpdGxlPSInK2YubmFtZSsnIj4nK3Nob3J0Kyc8L3NwYW4+JysKICAgICAgJzxidXR0b24gb25jbGljaz0iZ2Z0UmVtb3ZlKFwnJytmLmNvZGUrJ1wnKSIgdGl0bGU9IteU16HXqCI+w5c8L2J1dHRvbj4nKwogICAgJzwvZGl2Pic7CiAgfSkuam9pbignJyk7Cn0KCndpbmRvdy5nZnRUb2dnbGU9ZnVuY3Rpb24oZWwsY29kZSl7CiAgaWYoZWwuY2hlY2tlZCl7CiAgICBpZihnZXRTZWxGdW5kcygpLmxlbmd0aD49Myl7IGVsLmNoZWNrZWQ9ZmFsc2U7IHNob3dUb2FzdCgn16DXmdeq158g15zXlNep15XXldeqINei15MgMyDXp9eV16TXldeqJyk7IHJldHVybjsgfQogICAgdmFyIGY9RlVORFMuZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5jb2RlPT09Y29kZTt9KTsKICAgIGlmKGYpeyBTLnNlbFtjb2RlXT1mOyBzaG93VG9hc3QoJ+KckyAnK2YubmFtZS5zdWJzdHJpbmcoMCwyMCkrJyDigJQg16DXldeh16Mg15zXlNep15XXldeQ15QnKTsgfQogIH0gZWxzZSB7CiAgICBkZWxldGUgUy5zZWxbY29kZV07CiAgfQogIHZhciB0cj1lbC5jbG9zZXN0KCd0cicpOwogIGlmKHRyKSB0ci5jbGFzc0xpc3QudG9nZ2xlKCdzZWxlY3RlZCcsZWwuY2hlY2tlZCk7CiAgdXBkYXRlQmFyKCk7Cn07Cgp3aW5kb3cuZ2Z0UmVtb3ZlPWZ1bmN0aW9uKGNvZGUpewogIGRlbGV0ZSBTLnNlbFtjb2RlXTsgZHJhdygpOyB1cGRhdGVCYXIoKTsKfTsKCmZ1bmN0aW9uIHNob3dUb2FzdChtc2cpewogIHZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZnQtdG9hc3QnKTsKICBpZighdCl7IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IHQuaWQ9J2dmdC10b2FzdCc7CiAgICB0LnN0eWxlLmNzc1RleHQ9J3Bvc2l0aW9uOmZpeGVkO3RvcDoyMHB4O2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO2JhY2tncm91bmQ6IzFhM2E1Yztjb2xvcjojZmZmO3BhZGRpbmc6MTBweCAyMHB4O2JvcmRlci1yYWRpdXM6OHB4O2ZvbnQtc2l6ZTouOXJlbTt6LWluZGV4Ojk5OTk7dHJhbnNpdGlvbjpvcGFjaXR5IC4zcztwb2ludGVyLWV2ZW50czpub25lO2ZvbnQtZmFtaWx5OmluaGVyaXQ7ZGlyZWN0aW9uOnJ0bDsnOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTsgfQogIHQudGV4dENvbnRlbnQ9bXNnOyB0LnN0eWxlLm9wYWNpdHk9JzEnOwogIGNsZWFyVGltZW91dCh0Ll90KTsgdC5fdD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zdHlsZS5vcGFjaXR5PScwJzt9LDI1MDApOwp9Cgp3aW5kb3cuZ2Z0Q29sU29ydD1mdW5jdGlvbihrKXsKICB2YXIgbWFwPXtuYW1lOiduYW1lX2FzYycsdHlwZTonc2NvcmUnLGNvZGU6J2NvZGVfYXNjJ307CiAgUy5zb3J0PW1hcFtrXXx8J3Njb3JlJzsgZmlsdGVyKCk7Cn07CgovLyDilIDilIAgQ29tcGFyZSBtb2RhbCDigJQgcmVhbCBBUEkgZGF0YSBmcm9tIHdwLWpzb24vZ3QvdjEg4pSA4pSACnZhciBDTVBfQ09MT1JTID0gWycjMmE1Mjk4JywnIzFhOGE1MCcsJyNhZDE0NTcnXTsKdmFyIFRZUEVfQVBJID0gewogIGd0X3BvbGlzYToncG9saXNhJywgZ3RfaGlzaHRhbG11dDonaGFzaHRhbGFtdXQnLAogIGd0X2dlbWVsOidnZW1lbCcsIGd0X3BlbnNpeWE6J3BlbnNpeWEnLAogIGd0X3RhZ211bGltOid0YWdtdWxpbScsIGd0X3llbGFkaW06J3llbGFkaW0nCn07CgpmdW5jdGlvbiBmbXRQY3Qodil7CiAgaWYodj09bnVsbHx8dj09PScnfHx2PT09dW5kZWZpbmVkKSByZXR1cm4gJzxzcGFuIHN0eWxlPSJjb2xvcjojYWFhIj7igJQ8L3NwYW4+JzsKICB2YXIgbj1wYXJzZUZsb2F0KHYpOyBpZihpc05hTihuKSkgcmV0dXJuICc8c3BhbiBzdHlsZT0iY29sb3I6I2FhYSI+4oCUPC9zcGFuPic7CiAgcmV0dXJuICc8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwO2NvbG9yOicrKG4+PTA/JyMxYThhNTAnOicjYzAzOTJiJykrJyI+Jysobj49MD8nKyc6JycpK24udG9GaXhlZCgyKSsnJTwvc3Bhbj4nOwp9CmZ1bmN0aW9uIGZtdE4odixkZWMsc3VmKXsKICBpZih2PT1udWxsfHx2PT09Jyd8fHY9PT11bmRlZmluZWQpIHJldHVybiAnPHNwYW4gc3R5bGU9ImNvbG9yOiNhYWEiPuKAlDwvc3Bhbj4nOwogIHZhciBuPXBhcnNlRmxvYXQodik7IGlmKGlzTmFOKG4pKSByZXR1cm4gJzxzcGFuIHN0eWxlPSJjb2xvcjojYWFhIj7igJQ8L3NwYW4+JzsKICByZXR1cm4gJzxiPicrbi50b0ZpeGVkKGRlY3x8MikrKHN1Znx8JycpKyc8L2I+JzsKfQpmdW5jdGlvbiBiZXN0SWR4KHZhbHMsIGhpZ2hlcil7CiAgaWYoaGlnaGVyPT09bnVsbHx8aGlnaGVyPT09dW5kZWZpbmVkKSByZXR1cm4gLTE7CiAgdmFyIGJlc3Q9LUluZmluaXR5LCBpZHg9LTE7CiAgdmFscy5mb3JFYWNoKGZ1bmN0aW9uKHYsaSl7CiAgICB2YXIgbj1wYXJzZUZsb2F0KHYpOyBpZihpc05hTihuKXx8dj09bnVsbHx8dj09PScnKSByZXR1cm47CiAgICB2YXIgcz1oaWdoZXI/bjotbjsgaWYocz5iZXN0KXtiZXN0PXM7aWR4PWk7fQogIH0pOyByZXR1cm4gaWR4Owp9Cgp2YXIgQ01QX1JPV1MgPSBbCiAge2s6J3JldHVybl8xbScsICBsYmw6J9eq16nXldeQ15Qg15fXldeT16kg15DXl9eo15XXnycsICAgIGZtdDpmbXRQY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaTp0cnVlfSwKICB7azoncmV0dXJuXzF5JywgIGxibDon16rXqdeV15DXlCDXqdeg15Qg15DXl9eo15XXoNeUJywgICAgZm10OmZtdFBjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpOnRydWV9LAogIHtrOidyZXR1cm5fM3knLCAgbGJsOifXqtep15XXkNeUINee157Xldem16LXqiAzINep16DXmdedJywgZm10OmZtdFBjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpOnRydWV9LAogIHtrOidyZXR1cm5fNXknLCAgbGJsOifXqtep15XXkNeUINee157Xldem16LXqiA1INep16DXmdedJywgZm10OmZtdFBjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpOnRydWV9LAogIHtrOidzaGFycGUnLCAgICAgbGJsOifXnteT15Mg16nXkNeo16QnLCAgICAgICAgICAgIGZtdDpmdW5jdGlvbih2KXtyZXR1cm4gZm10Tih2LDIsJycpO30sICBoaTp0cnVlfSwKICB7azonc3RkX2RldicsICAgIGxibDon16HXmNeZ15nXqiDXqten158nLCAgICAgICAgICAgZm10OmZ1bmN0aW9uKHYpe3JldHVybiBmbXROKHYsMiwnJScpO30sIGhpOmZhbHNlfSwKICB7azonbWdtdF9mZWUnLCAgIGxibDon15PXnteZINeg15nXlNeV15wnLCAgICAgICAgICAgZm10OmZ1bmN0aW9uKHYpe3JldHVybiBmbXROKHYsMiwnJScpO30sIGhpOmZhbHNlfSwKICB7azonYXNzZXRzJywgICAgIGxibDon16DXm9eh15nXnSAo157Xmdec15nXldefIOKCqiknLCAgICAgZm10OmZ1bmN0aW9uKHYpe3JldHVybiBmbXROKHYsMSwnJyk7fSwgIGhpOnRydWV9LApdOwoKZnVuY3Rpb24gcmVuZGVyQ21wTW9kYWwoZnVuZHMsIGFwaURhdGEpewogIHZhciBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dmdC1tb2RhbC1ib2R5Jyk7CiAgaWYoIWJvZHkpIHJldHVybjsKCiAgdmFyIGdlbWVsbmV0VXJsID0gJ2h0dHBzOi8vZ2VtZWxuZXQuY21hLmdvdi5pbC9nZW1lbG5ldC9tYWluLmFzcHg/dHlwZT0zJmtvZD0nKwogICAgZnVuZHMubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBmLmNvZGU7fSkuam9pbignJmtvZD0nKTsKCiAgLy8gRnVuZCBoZWFkZXIgY2FyZHMKICB2YXIgY2FyZHMgPSAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDoxMHB4O2ZsZXgtd3JhcDp3cmFwO3BhZGRpbmc6MTZweCAxOHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkY2UzZWQ7YmFja2dyb3VuZDojZjdmOWZjIj4nKwogICAgZnVuZHMubWFwKGZ1bmN0aW9uKGYsaSl7CiAgICAgIHZhciBkID0gYXBpRGF0YVtTdHJpbmcoZi5jb2RlKV0gfHwge307CiAgICAgIHJldHVybiAnPGRpdiBzdHlsZT0iZmxleDoxO21pbi13aWR0aDoxOTBweDtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXRvcDo0cHggc29saWQgJytDTVBfQ09MT1JTW2ldKyc7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MTRweDtib3gtc2l6aW5nOmJvcmRlci1ib3giPicrCiAgICAgICAgJzxkaXYgc3R5bGU9ImZvbnQtc2l6ZTouN3JlbTtmb250LXdlaWdodDo4MDA7Y29sb3I6JytDTVBfQ09MT1JTW2ldKyc7bWFyZ2luLWJvdHRvbTo1cHgiPten15XXpNeUICcrKGkrMSkrJzwvZGl2PicrCiAgICAgICAgJzxkaXYgc3R5bGU9ImZvbnQtd2VpZ2h0OjgwMDtjb2xvcjojMWEzYTVjO2ZvbnQtc2l6ZTouODhyZW07bGluZS1oZWlnaHQ6MS4zO21hcmdpbi1ib3R0b206N3B4Ij4nK2YubmFtZSsnPC9kaXY+JysKICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo1cHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLWJvdHRvbTo5cHgiPicrCiAgICAgICAgICAnPHNwYW4gY2xhc3M9ImdmdC1iYWRnZSAnK2YudHlwZSsnIiBzdHlsZT0iZm9udC1zaXplOi43cmVtIj4nK1RMW2YudHlwZV0rJzwvc3Bhbj4nKwogICAgICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6LjdyZW07Y29sb3I6IzZiN2E5MDtiYWNrZ3JvdW5kOiNmMGY0Zjg7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggNnB4Ij7Xnteh17MgJytmLmNvZGUrJzwvc3Bhbj4nKwogICAgICAgICc8L2Rpdj4nKwogICAgICAgICc8YSBocmVmPSInK2YudXJsKyciIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iZGlzcGxheTpibG9jaztiYWNrZ3JvdW5kOicrQ01QX0NPTE9SU1tpXSsnO2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzo2cHg7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZTouNzhyZW0iPtec15PXoyDXlNen15XXpNeUIOKAujwvYT4nKwogICAgICAnPC9kaXY+JzsKICAgIH0pLmpvaW4oJycpKwogICc8L2Rpdj4nOwoKICAvLyBUYWJsZQogIHZhciB0aGVhZCA9ICc8dHIgc3R5bGU9ImJhY2tncm91bmQ6IzFhM2E1YyI+JysKICAgICc8dGggc3R5bGU9InBhZGRpbmc6MTBweCAxNHB4O3RleHQtYWxpZ246cmlnaHQ7Y29sb3I6IzliYjtmb250LXNpemU6Ljc1cmVtO2ZvbnQtd2VpZ2h0OjYwMDt3aGl0ZS1zcGFjZTpub3dyYXA7bWluLXdpZHRoOjE0MHB4Ij7XpNeo157XmNeoPC90aD4nKwogICAgZnVuZHMubWFwKGZ1bmN0aW9uKGYsaSl7CiAgICAgIHJldHVybiAnPHRoIHN0eWxlPSJwYWRkaW5nOjEwcHggMTRweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojZmZmO2ZvbnQtc2l6ZTouOHJlbTtmb250LXdlaWdodDo3MDA7Ym9yZGVyLXJpZ2h0OjNweCBzb2xpZCAnK0NNUF9DT0xPUlNbaV0rJzttaW4td2lkdGg6MTMwcHgiPicrCiAgICAgICAgKGYubmFtZS5sZW5ndGg+MjY/Zi5uYW1lLnN1YnN0cmluZygwLDI1KSsn4oCmJzpmLm5hbWUpKyc8L3RoPic7CiAgICB9KS5qb2luKCcnKSsnPC90cj4nOwoKICB2YXIgdGJvZHkgPSBDTVBfUk9XUy5tYXAoZnVuY3Rpb24ocm93KXsKICAgIHZhciB2YWxzID0gZnVuZHMubWFwKGZ1bmN0aW9uKGYpeyB2YXIgZD1hcGlEYXRhW1N0cmluZyhmLmNvZGUpXXx8e307IHJldHVybiBkW3Jvdy5rXTsgfSk7CiAgICB2YXIgYmkgPSBiZXN0SWR4KHZhbHMsIHJvdy5oaSk7CiAgICB2YXIgY2VsbHMgPSB2YWxzLm1hcChmdW5jdGlvbih2LGkpewogICAgICB2YXIgaXNCZXN0ID0gKGk9PT1iaSAmJiB2IT1udWxsICYmIHYhPT0nJyk7CiAgICAgIHJldHVybiAnPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHggMTRweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVmMGY0O3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQ6JysoaXNCZXN0PydyZ2JhKDI2LDEzOCw4MCwuMDcpJzonI2ZmZicpKyciPicrCiAgICAgICAgcm93LmZtdCh2KSsoaXNCZXN0Pyc8c3BhbiBzdHlsZT0iY29sb3I6IzFhOGE1MDtmb250LXNpemU6Ljc1cmVtO21hcmdpbi1yaWdodDozcHgiPiDinJM8L3NwYW4+JzonJykrCiAgICAgICc8L3RkPic7CiAgICB9KS5qb2luKCcnKTsKICAgIHJldHVybiAnPHRyPjx0ZCBzdHlsZT0icGFkZGluZzoxMHB4IDE0cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZjBmNDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzZiN2E5MDtmb250LXNpemU6LjhyZW07YmFja2dyb3VuZDojZjdmOWZjO3doaXRlLXNwYWNlOm5vd3JhcCI+Jytyb3cubGJsKyc8L3RkPicrY2VsbHMrJzwvdHI+JzsKICB9KS5qb2luKCcnKTsKCiAgYm9keS5pbm5lckhUTUwgPQogICAgY2FyZHMrCiAgICAnPGRpdiBzdHlsZT0iZm9udC1zaXplOi43NXJlbTtjb2xvcjojNmI3YTkwO3BhZGRpbmc6N3B4IDE4cHg7YmFja2dyb3VuZDojZmZmYmYwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkY2UzZWQiPicrCiAgICAgICfinJMgPSDXoNeq15XXnyDXmNeV15Eg15nXldeq16gg15HXqdeV16jXlCDXlteVICZuYnNwO8K3Jm5ic3A7INeg16rXldeg15nXnSDXni1kYXRhLmdvdi5pbCDXk9eo15og15QtQVBJINeU16TXoNeZ157XmSDXqdecINeU15DXqteoPC9kaXY+JysKICAgICc8ZGl2IHN0eWxlPSJvdmVyZmxvdy14OmF1dG8iPjx0YWJsZSBzdHlsZT0id2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2UiPjx0aGVhZD4nK3RoZWFkKyc8L3RoZWFkPjx0Ym9keT4nK3Rib2R5Kyc8L3Rib2R5PjwvdGFibGU+PC9kaXY+JysKICAgICcnOwp9CgovLyDilIDilIAgUGFyc2UgZnVuZCBwYWdlIEhUTUwg4oaSIGZpbmFuY2lhbCBkYXRhIOKUgOKUgApmdW5jdGlvbiBwYXJzZUZ1bmRQYWdlKGh0bWwpIHsKICB2YXIgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7CiAgdmFyIGQgPSB7fTsKCiAgLy8gMS4gY2hhcnREYXRhIHZhcmlhYmxlIChtb3N0IHJlbGlhYmxlIOKAlCBvcmRlcjogbW9udGhseSwgMXksIDN5LCA1eSkKICB2YXIgc2NyaXB0cyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQ6bm90KFtzcmNdKScpOwogIGZvciAodmFyIHNpID0gMDsgc2kgPCBzY3JpcHRzLmxlbmd0aDsgc2krKykgewogICAgdmFyIG0gPSBzY3JpcHRzW3NpXS50ZXh0Q29udGVudC5tYXRjaCgvdmFyIGNoYXJ0RGF0YVxzKj1ccypcWyhbXlxdXSspXF0vKTsKICAgIGlmIChtKSB7CiAgICAgIHZhciB2YWxzID0gbVsxXS5zcGxpdCgnLCcpLm1hcChwYXJzZUZsb2F0KTsKICAgICAgaWYgKCFpc05hTih2YWxzWzBdKSkgZC5yZXR1cm5fMW0gPSB2YWxzWzBdOwogICAgICBpZiAoIWlzTmFOKHZhbHNbMV0pKSBkLnJldHVybl8xeSA9IHZhbHNbMV07CiAgICAgIGlmICghaXNOYU4odmFsc1syXSkpIGQucmV0dXJuXzN5ID0gdmFsc1syXTsKICAgICAgaWYgKCFpc05hTih2YWxzWzNdKSkgZC5yZXR1cm5fNXkgPSB2YWxzWzNdOwogICAgICBicmVhazsKICAgIH0KICB9CgogIC8vIDIuIGd0LXJldC1zdHJpcCBib3hlcyAocGVyaW9kIGxhYmVsICsgdmFsdWUpCiAgdmFyIHJldEJveGVzID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ndC1yZXQtc3RyaXAgLmd0LXJldC1ib3gnKTsKICByZXRCb3hlcy5mb3JFYWNoKGZ1bmN0aW9uKGJveCkgewogICAgdmFyIHBlcmlvZCA9IChib3gucXVlcnlTZWxlY3RvcignLmd0LXJldC1wZXJpb2QnKXx8e30pLnRleHRDb250ZW50fHwnJzsKICAgIHZhciB2YWwgICAgPSBwYXJzZUZsb2F0KCgoYm94LnF1ZXJ5U2VsZWN0b3IoJy5ndC1yZXQtdmFsJyl8fHt9KS50ZXh0Q29udGVudHx8JycpLnJlcGxhY2UoJyUnLCcnKS5yZXBsYWNlKCfigJQnLCcnKSk7CiAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuOwogICAgaWYgKHBlcmlvZC5pbmRleE9mKCcxMicpPi0xIHx8IHBlcmlvZC5pbmRleE9mKCfXqdeg15QnKT4tMSkgZC5yZXR1cm5fMXkgPSBkLnJldHVybl8xeXx8dmFsOwogICAgZWxzZSBpZiAocGVyaW9kLmluZGV4T2YoJzMg16nXoCcpPi0xKSBkLnJldHVybl8zeSA9IGQucmV0dXJuXzN5fHx2YWw7CiAgICBlbHNlIGlmIChwZXJpb2QuaW5kZXhPZignNSDXqdegJyk+LTEpIGQucmV0dXJuXzV5ID0gZC5yZXR1cm5fNXl8fHZhbDsKICAgIGVsc2UgaWYgKCFkLnJldHVybl8xbSkgZC5yZXR1cm5fMW0gPSB2YWw7CiAgfSk7CgogIC8vIDMuIEtQSSBncmlkIOKAlCBmZWUsIGFzc2V0cwogIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCcuZ3Qta3BpJykuZm9yRWFjaChmdW5jdGlvbihrcGkpIHsKICAgIHZhciBsYmwgPSAoa3BpLnF1ZXJ5U2VsZWN0b3IoJy5ndC1rcGktbGFiZWwnKXx8e30pLnRleHRDb250ZW50fHwnJzsKICAgIHZhciB2YWwgPSAoKGtwaS5xdWVyeVNlbGVjdG9yKCcuZ3Qta3BpLXZhbCcpfHx7fSkudGV4dENvbnRlbnR8fCcnKS5yZXBsYWNlKCclJywnJykucmVwbGFjZSgnLCcsJycpLnRyaW0oKTsKICAgIHZhciBuID0gcGFyc2VGbG9hdCh2YWwpOwogICAgaWYgKGxibC5pbmRleE9mKCfXoNeZ15TXldecJyk+LTEgJiYgIWQubWdtdF9mZWUgICAmJiAhaXNOYU4obikpIGQubWdtdF9mZWUgPSBuOwogICAgaWYgKGxibC5pbmRleE9mKCfXoNeb16HXmdedJyk+LTEgJiYgIWQuYXNzZXRzICAgICAgJiYgIWlzTmFOKHBhcnNlRmxvYXQodmFsKSkpIGQuYXNzZXRzID0gcGFyc2VGbG9hdCh2YWwucmVwbGFjZSgn157Xmdec15nXldefJywnJykucmVwbGFjZSgn4oKqJywnJykpOwogIH0pOwoKICAvLyA0LiBTaGFycGUgKyBzdGQgZGV2CiAgZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ndC1tZXRyaWMnKS5mb3JFYWNoKGZ1bmN0aW9uKG0pIHsKICAgIHZhciBsYmwgPSAobS5xdWVyeVNlbGVjdG9yKCcuZ3QtbWV0cmljLWxhYmVsJyl8fHt9KS50ZXh0Q29udGVudHx8Jyc7CiAgICB2YXIgdmFsID0gcGFyc2VGbG9hdCgoKG0ucXVlcnlTZWxlY3RvcignLmd0LW1ldHJpYy12YWwnKXx8e30pLnRleHRDb250ZW50fHwnJykucmVwbGFjZSgnJScsJycpKTsKICAgIGlmIChsYmwuaW5kZXhPZign16nXkNeo16QnKT4tMSAgICYmICFpc05hTih2YWwpICYmICFkLnNoYXJwZSkgIGQuc2hhcnBlICA9IHZhbDsKICAgIGlmIChsYmwuaW5kZXhPZign16HXmNeZ15nXqicpPi0xICAmJiAhaXNOYU4odmFsKSAmJiAhZC5zdGRfZGV2KSBkLnN0ZF9kZXYgPSB2YWw7CiAgfSk7CgogIC8vIDUuIG1ldGEtcm93IGZhbGxiYWNrIGZvciBmZWUKICBkb2MucXVlcnlTZWxlY3RvckFsbCgnLmd0LW1ldGEtcm93JykuZm9yRWFjaChmdW5jdGlvbihyb3cpIHsKICAgIHZhciBrZXkgPSAocm93LnF1ZXJ5U2VsZWN0b3IoJy5ndC1tZXRhLWtleScpfHx7fSkudGV4dENvbnRlbnR8fCcnOwogICAgdmFyIHZhbCA9IHBhcnNlRmxvYXQoKChyb3cucXVlcnlTZWxlY3RvcignLmd0LW1ldGEtdmFsJyl8fHt9KS50ZXh0Q29udGVudHx8JycpLnJlcGxhY2UoJyUnLCcnKS5yZXBsYWNlKCcsJywnJykpOwogICAgaWYgKGtleS5pbmRleE9mKCfXoNeZ15TXldecJyk+LTEgJiYgIWQubWdtdF9mZWUgJiYgIWlzTmFOKHZhbCkpIGQubWdtdF9mZWUgPSB2YWw7CiAgfSk7CgogIHJldHVybiBkOwp9Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLWNvbXBhcmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgdmFyIGZ1bmRzID0gZ2V0U2VsRnVuZHMoKTsKICBpZihmdW5kcy5sZW5ndGggPCAyKXsgc2hvd1RvYXN0KCfXmdepINec16HXntefINec16TXl9eV16ogMiDXp9eV16TXldeqINec15TXqdeV15XXkNeUJyk7IHJldHVybjsgfQogIHZhciBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dmdC1tb2RhbC1ib2R5Jyk7CiAgaWYoIWJvZHkpIHJldHVybjsKICBib2R5LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjQ4cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzZiN2E5MDtmb250LXNpemU6Ljk1cmVtO2ZvbnQtZmFtaWx5OmluaGVyaXQiPuKPsyDXmNeV16LXnyDXoNeq15XXoNeZINeq16nXldeQ15XXqi4uLjwvZGl2Pic7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dmdC1vdmVybGF5JykuY2xhc3NMaXN0LmFkZCgnb3BlbicpOwoKICB2YXIgYXBpRGF0YSA9IHt9LCBwZW5kaW5nID0gZnVuZHMubGVuZ3RoOwogIGZ1bmRzLmZvckVhY2goZnVuY3Rpb24oZil7CiAgICBmZXRjaChmLnVybCkKICAgICAgLnRoZW4oZnVuY3Rpb24ocil7IHJldHVybiByLnRleHQoKTsgfSkKICAgICAgLnRoZW4oZnVuY3Rpb24oaHRtbCl7IGFwaURhdGFbZi5jb2RlXSA9IHBhcnNlRnVuZFBhZ2UoaHRtbCk7IH0pCiAgICAgIC5jYXRjaChmdW5jdGlvbigpeyBhcGlEYXRhW2YuY29kZV0gPSB7fTsgfSkKICAgICAgLmZpbmFsbHkoZnVuY3Rpb24oKXsgaWYoLS1wZW5kaW5nPT09MCkgcmVuZGVyQ21wTW9kYWwoZnVuZHMsIGFwaURhdGEpOyB9KTsKICB9KTsKfSk7Cgp3aW5kb3cuZ2Z0Q2xvc2VNb2RhbD1mdW5jdGlvbihlKXsKICBpZighZXx8ZS50YXJnZXQ9PT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2Z0LW92ZXJsYXknKSkKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZnQtb3ZlcmxheScpLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKfTsKCi8vIOKUgOKUgCBQYWdpbmF0aW9uIOKUgOKUgAp3aW5kb3cuZ2Z0UGc9ZnVuY3Rpb24ocCl7IFMucGFnZT1wOyBkcmF3KCk7IHdpbmRvdy5zY3JvbGxUbygwLChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2Z0LWFwcCcpfHx7fSkub2Zmc2V0VG9wfHwwKTsgfTsKCi8vIOKUgOKUgCBQaWxsIGdyb3VwcyDilIDilIAKZnVuY3Rpb24gcGlsbHMoaWQsZXhjbHVzaXZlLGNiKXsKICB2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgaWYoIWcpIHJldHVybjsKICBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgIHZhciBidG49ZS50YXJnZXQuY2xvc2VzdCgnLmdmdC1waWxsJyk7IGlmKCFidG4pIHJldHVybjsKICAgIGlmKGV4Y2x1c2l2ZSkgZy5xdWVyeVNlbGVjdG9yQWxsKCcuZ2Z0LXBpbGwnKS5mb3JFYWNoKGZ1bmN0aW9uKHApe3AuY2xhc3NMaXN0LnJlbW92ZSgnb24nKTt9KTsKICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdvbicpOwogICAgaWYoZXhjbHVzaXZlKSBidG4uY2xhc3NMaXN0LmFkZCgnb24nKTsKICAgIGlmKGNiKSBjYihidG4uZGF0YXNldC52KTsKICB9KTsKfQoKLy8g4pSA4pSAIEluaXQg4pSA4pSACmZ1bmN0aW9uIGluaXQoKXsKICBzdGF0cygpOwogIHBvcHVsYXRlTWFuYWdlcnMoKTsKICBwb3B1bGF0ZVN1YlR5cGVzKCdhbGwnKTsKCiAgdmFyIGNhdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnAtY2F0Jyk7CiAgaWYoY2F0KSBjYXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpeyBnZnRDYXRDaGFuZ2UodGhpcy52YWx1ZSk7IH0pOwoKICB2YXIgc3ViPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmcC1zdWInKTsKICBpZihzdWIpIHN1Yi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGZ1bmN0aW9uKCl7IFMuc3ViPXRoaXMudmFsdWU7IGZpbHRlcigpOyB9KTsKCiAgdmFyIG1ncj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnAtbWdyJyk7CiAgaWYobWdyKSBtZ3IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpeyBTLm1ncj10aGlzLnZhbHVlOyBmaWx0ZXIoKTsgfSk7CgogIHZhciBzb3J0U2VsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmcC1zb3J0LXNlbCcpOwogIGlmKHNvcnRTZWwpIHNvcnRTZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpeyBTLnNvcnQ9dGhpcy52YWx1ZTsgZmlsdGVyKCk7IH0pOwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLXJlc2V0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICBTLnE9Jyc7IFMudHlwZT0nYWxsJzsgUy5zdWI9Jyc7IFMubWdyPScnOyBTLnNvcnQ9J3Njb3JlJzsKICAgIHZhciBzYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2Z0LXNiJyk7IGlmKHNiKSBzYi52YWx1ZT0nJzsKICAgIHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmcC1jYXQnKTsgaWYoYykgYy52YWx1ZT0nYWxsJzsKICAgIHZhciBzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmcC1zdWInKTsgaWYocykgcy52YWx1ZT0nJzsKICAgIHZhciBtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmcC1tZ3InKTsgaWYobSkgbS52YWx1ZT0nJzsKICAgIHZhciBzcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnAtc29ydC1zZWwnKTsgaWYoc3MpIHNzLnZhbHVlPSdzY29yZSc7CiAgICBwb3B1bGF0ZVN1YlR5cGVzKCdhbGwnKTsKICAgIGZpbHRlcigpOwogIH0pOwoKICB2YXIgc2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dmdC1zYicpOwogIGlmKHNiKSBzYi5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsZnVuY3Rpb24oKXsgUy5xPXRoaXMudmFsdWUudHJpbSgpOyBmaWx0ZXIoKTsgfSk7CgogIHZhciBkZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2Z0LXNvcnQtZGQnKTsKICBpZihkZCkgZGQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpeyBTLnNvcnQ9dGhpcy52YWx1ZTsgZmlsdGVyKCk7IH0pOwoKICBpZihGVU5EUy5sZW5ndGg9PT0wKXsKICAgIHZhciB0Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2Z0LXRib2R5Jyk7CiAgICBpZih0YikgdGIuaW5uZXJIVE1MPSc8dHI+PHRkIGNvbHNwYW49IjUiPjxkaXYgY2xhc3M9ImdmdC1lbXB0eSI+15zXkCDXoNee16bXkNeVINeg16rXldeg15kg16fXldek15XXqi4g15DXoNeQINeo16LXoNefINeQ16og15TXk9ejLjwvZGl2PjwvdGQ+PC90cj4nOwogICAgcmV0dXJuOwogIH0KICBmaWx0ZXIoKTsKfQoKaWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSdsb2FkaW5nJyl7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsaW5pdCk7Cn0gZWxzZSB7IGluaXQoKTsgfQoKfSkoKTs=
