LyogVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHVudG91Y2hlZCBhdCBhbGwgdGltZXMuCnd6X2dyYXBoZXIuanMKCkNvcHlyaWdodCAoYykgMjAwMyBXYWx0ZXIgWm9ybi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KQ3JlYXRlZCAzMC4gOS4gMjAwMyBieSBXYWx0ZXIgWm9ybiAoV2ViOiBodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tICkKTGFzdCBtb2RpZmllZDogMjguIDMuIDIwMDcKClRoZSBsYXRlc3QgdmVyc2lvbiBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbQpvciBodHRwOi8vd3d3LmRldmlyYS5jb20Kb3IgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmRlCgpDcm9zcy1icm93c2VyIEphdmFTY3JpcHQgZnVuY3Rpb24gZ3JhcGhlci4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOwp5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CmVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CndpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuClNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYXQgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sIGZvciBtb3JlIGRldGFpbHMuCiovCgoKLyoqKioqKioqKioqICBDb25maWcgdmFyaWFibGVzICAqKioqKioqKioqLwp2YXIgQk9SREVSQ09MT1IgPSAnI2Q2ZDZkNic7CnZhciBGUkFNRUNPTE9SID0gJyNlZWVlZWUnOwp2YXIgQ05WQ09MT1IgPSAnI2ZmZmZmZic7CnZhciBTQ0FMRUNPTE9SID0gJyMwMDAwMDAnOwp2YXIgQVhDT0xPUiA9ICcjNjY2NjY2JzsKdmFyIEdSSURDT0xPUiA9ICcjZDZkNmQ2JzsKdmFyIEdSQVBIQ09MT1IgPSBbCgknZmYwMDAwJywKCScwMDlmMDAnLAoJJzQ0NDRmZicsCgknZmZhYTAwJywKCScwMGUwZTAnLAoJJ2IwMDA5OScsCgknMDBkMDAwJywKCSdjYzY2MzMnLAoJJzMzMzNjYycsCgknZmY3NzQ0JywKCScwMGMwYWEnLAoJJ2ZmMDBmZicsCgknMDA2ZjAwJywKCSdjYzAwMDAnLAoJJzAwOTZkMCcsCgknOTkwMGVlJwpdOwp2YXIgREVGVyA9IDUyMDsgLy8gZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNhbnZhcwp2YXIgTEVGVCA9IDUwOyAgLy8gbGVmdCBtYXJnaW4gY29ubnRhaW5pbmcgeS1oYXNoIGxheWVyCnZhciBUT1AgPSA0OyAgICAvLyB0b3AgICAiCnZhciBSSUdIVCA9IDEyNDsvLyByaWdodCAiICBjb250YWluaW5nIG9wdGlvbnMKdmFyIEJPVFRPTSA9IDIyOy8vIGJvdHRvbSBtYXJnaW4gY29udGFpbmluZyB4LWhhc2ggbGF5ZXIKLyoqKioqKioqKiAgIEVuZCBjb25maWcgdmFyaWFibGVzICAgKioqKioqKioqKiovCgoKdmFyIGdfZnJhbWUsCmdfaW5wdXRUYiwKZ19jbnYsICAgICAgICAgLy8gY2FudmFzCmdfZ3JpZGx5ciwKZ194bHlyLCBnX3lseXIsLy8gbGF5ZXJzIGZvciB4LSBhbmQgeS1oYXNoCmdfdGVybWx5ciwgICAgIC8vIHRlcm1zdHJpbmctbGF5ZXIgb24gYm90dG9tIG9mIGNhbnZhcwpnX29wdHNseXIsCmdfY29vcmR0aXAsICAgIC8vIHRvb2x0aXAgZGlzcGxheWluZyBtb3VzZS1jby1vcmRpbmF0ZXMKZ19uID0gMCwgICAgICAgLy8gbnVtYmVyIG9mIGdyYXBocyBvbiBjbnYKZ19odG0gPSAnJywKZ190ZXJtLApnX3csIGdfaCwgICAgICAvLyBzaXplIG9mIGNudgpnX3hhLCBnX3h6LCAgICAvLyB4IG1pbiwgeCBtYXgKZ195YSwgZ195eiwKZ19keCwgZ19keSwgICAgLy8gZGVsdGEgdmFsdWUvcHgKZ19wYWdlWCwgZ19wYWdlWSwgLy8gcG9zaXRpb24gb2YgY2FudmFzCmdfd2FpdCA9IDAsCmdfaW5maW4gPSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAsCgpnX2FkaHRtLCBnX2RvbSwKZ19tb3osCmdfdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksCmdfaWUgPSAhISghd2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmFsbCAmJiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpKSwKZ19pZW1hYyA9ICEhKGdfaWUgJiYgZ191YS5pbmRleE9mKCdtYWMnKSA+PSAwKSwKZ19rcSA9ICEhKGdfdWEuaW5kZXhPZigna29ucXUnKSA+PSAwKSwKZ19kYiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5IHx8IG51bGw7CgoKZnVuY3Rpb24gaW5pdChvKQp7CglnX2ZyYW1lID0gZ2V0RGl2KCdncmFwaGZyYW1lJyk7CglpZiAoIWdfZnJhbWUpIHJldHVybjsKCWdfdyA9IGdfaCA9IERFRlc7CgkobyA9IGdfZnJhbWUuc3R5bGUpLndpZHRoID0gKExFRlQrZ193KzErUklHSFQpKydweCc7CglvLmhlaWdodCA9IChUT1ArZ19oK0JPVFRPTSkrJ3B4JzsKCW8uYmFja2dyb3VuZCA9IChnX2lucHV0VGIgPSBnZXREaXYoJ2lucHV0cycpKS5zdHlsZS5iYWNrZ3JvdW5kID0gRlJBTUVDT0xPUjsKCWdfaW5wdXRUYi5zdHlsZS53aWR0aCA9IChnX3crMStMRUZUK1JJR0hUKSsncHgnOwoJby5ib3JkZXJCb3R0b20gPSBvLmJvcmRlclJpZ2h0ID0gby5ib3JkZXJMZWZ0ID0gZ19pbnB1dFRiLnN0eWxlLmJvcmRlclRvcCA9IGdfaW5wdXRUYi5zdHlsZS5ib3JkZXJSaWdodCA9IGdfaW5wdXRUYi5zdHlsZS5ib3JkZXJMZWZ0ID0gJzFweCBzb2xpZCAnK0JPUkRFUkNPTE9SOwoJZ19hZGh0bSA9ICh0eXBlb2YgZ19mcmFtZS5pbnNlcnRBZGphY2VudEhUTUwgIT0gInVuZGVmaW5lZCIpOwoJZ19kb20gPSAoIWdfYWRodG0gJiYKCQl0eXBlb2YgZ19mcmFtZS5hcHBlbmRDaGlsZCAhPSAidW5kZWZpbmVkIiAmJgoJCXR5cGVvZiBkb2N1bWVudC5jcmVhdGVSYW5nZSAhPSAidW5kZWZpbmVkIiAmJgoJCXR5cGVvZiAobyA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkpLnNldFN0YXJ0QmVmb3JlICE9ICJ1bmRlZmluZWQiICYmCgkJdHlwZW9mIG8uY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50ICE9ICJ1bmRlZmluZWQiKTsKCWdfbW96ID0gZG9jdW1lbnQuYm9keSAmJiB0eXBlb2YgZG9jdW1lbnQuYm9keS5zdHlsZS5Nb3pPcGFjaXR5ICE9ICJ1bmRlZmluZWQiOwoJZ2V0Q252UG9zKCk7CglwYWludChnX2ZyYW1lLAoJCW1rRGl2KCcnLCAnJywgTEVGVCwgVE9QLCBnX3crMSwgZ19oKzEsIENOVkNPTE9SLCAnYmdseXInKSsKCQlta0RpdignJywgJycsIExFRlQsIFRPUCwgZ193KzEsIGdfaCsxLCAnJywgJ2dyaWRseXInKSsKCQlta0RpdignJywgJycsIExFRlQsIFRPUCwgZ193KzEsIGdfaCsxLCAnJywgJ2Nudmx5cicpKwoJCW1rRGl2KCcnLCAnJywgTEVGVCwgVE9QK2dfaCsxLCBnX3crMSwgQk9UVE9NLCAnJywgJ3hseXInLCB0cnVlKSsKCQlta0RpdignJywgJ3JpZ2h0JywgMCwgVE9QLCBMRUZULCBnX2grMSwgJycsICd5bHlyJywgdHJ1ZSkrCgkJbWtEaXYoJycsICcnLCBMRUZUK2dfdys0LCBUT1ArKGdfaD4+MSktMjAwLCBSSUdIVCwgZ19oLCAnJywgJ29wdHMnLCB0cnVlKQoJKTsKCXBhaW50KGdldERpdignb3B0cycpLAoJCSc8aW5wdXQgbmFtZT0iR1JJRCIgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQgb25jbGljaz0ic2V0VGltZW91dChcJ3NldEdyaWRWaXMoKTtcJywgMTApIj4nK1NfU0hPV0dSSUQrCgkJJzxicj4mbmJzcDs8YnI+PGlucHV0IG5hbWU9IlhZUkFUSU8iIHR5cGU9ImNoZWNrYm94Ij4nK1NfU0FNRVNDQUxFKwoJCSc8YnI+Jm5ic3A7PGJyPjxpbnB1dCBuYW1lPSJGSVRXTkQiIHR5cGU9ImNoZWNrYm94Ij4nK1NfRklUV05EKwoJCSc8YnI+Jm5ic3A7PGJyPjxpbnB1dCBuYW1lPSJQUlQiIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJzZXRUaW1lb3V0KFwncHJ0KCk7XCcsIDEwKSI+JytTX1BSVFZJRVcrCgkJJzxicj4mbmJzcDs8YnI+Jm5ic3A7PGJyPiZuYnNwOzxicj4nK1NfUE9TVFJFUElORywKCQl0cnVlCgkpOwoJKG8gPSAoZ19jbnYgPSBnZXREaXYoJ2Nudmx5cicpKS5zdHlsZSkuekluZGV4ID0gMTsKCW8uY3Vyc29yID0gJ2Nyb3NzaGFpcic7CglnX3hseXIgPSBnZXREaXYoJ3hseXInKTsKCWdfeWx5ciA9IGdldERpdigneWx5cicpOwoJZ19ncmlkbHlyID0gZ2V0RGl2KCdncmlkbHlyJyk7CglnX3Rlcm1seXIgPSBnZXREaXYoJ3Rlcm1zJyk7CglnX29wdHNseXIgPSBnZXREaXYoJ29wdHMnKTsKCWlmIChkb2N1bWVudC5jYXB0dXJlRXZlbnRzKSBkb2N1bWVudC5jYXB0dXJlRXZlbnRzKEV2ZW50Lk1PVVNFTU9WRSk7Cgl3aW5kb3cub25yZXNpemUgPSBnZXRDbnZQb3M7Cn0KCgpmdW5jdGlvbiBpc051bSh4KQp7CglyZXR1cm4gKCFpc05hTih4KSAmJiB0eXBlb2YgeCA9PSAnbnVtYmVyJyk7Cn0KCgpmdW5jdGlvbiBnZXREaXYoeCkKewoJeCA9ICEhZG9jdW1lbnQuYWxsPyBkb2N1bWVudC5hbGxbeF0gOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh4KSA6IG51bGw7CglyZXR1cm4gKHggJiYgdHlwZW9mIHguc3R5bGUgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHguaW5uZXJIVE1MICE9ICd1bmRlZmluZWQnKT8geCA6IG51bGw7Cn0KCgpmdW5jdGlvbiBnZXRDbnZQb3MobykKewoJZ19wYWdlWCA9IExFRlQrMTsKCWdfcGFnZVkgPSBUT1A7CglvID0gZ19mcmFtZTsKCXdoaWxlIChvLm9mZnNldFBhcmVudCkKCXsKCQlnX3BhZ2VYICs9IG8ub2Zmc2V0TGVmdDsKCQlnX3BhZ2VZICs9IG8ub2Zmc2V0VG9wOwoJCW8gPSBvLm9mZnNldFBhcmVudDsKCX0KfQoKCmZ1bmN0aW9uIGdldFZhbChlbCwgeSkKewoJcmV0dXJuICgoeSA9IGVsLnZhbHVlLnJlcGxhY2UoLyAvZywgJycpKSA9PSAnJyB8fCAhaXNOYU4oeSA9IHBhcnNlRmxvYXQoeS5yZXBsYWNlKC9cLC8sJy4nKSkpKT8geSA6ICduJzsKfQoKCmZ1bmN0aW9uIGFsZXJ0RXJyKGVsLCBzdHIpCnsKCWFsZXJ0KFNfRVJSX0JBU0UgKyBzdHIpOwoJZWwuZm9jdXMoKTsKCWVsLnNlbGVjdCgpOwp9CgoKZnVuY3Rpb24gc2V0Q3NzV0gobywgdywgaCwgb3ZlcikKewoJKG8gPSBvLnN0eWxlKS53aWR0aCA9IHcrJ3B4JzsKCW8uaGVpZ2h0ID0gaCsncHgnOwoJaWYgKCFvdmVyKQoJewoJCW8uY2xpcCA9ICdyZWN0KDAsJyt3KydweCwnK2grJ3B4LDApJzsKCQlvLm92ZXJmbG93ID0gJ2hpZGRlbic7Cgl9Cn0KCgpmdW5jdGlvbiByZXNpemVDbnYobykKewoJZ19pbnB1dFRiLnN0eWxlLndpZHRoID0gKExFRlQrZ193KzErUklHSFQpKydweCc7CglzZXRDc3NXSChnX2ZyYW1lLCBMRUZUK2dfdysxK1JJR0hULCBNYXRoLm1heCgzNTAsIFRPUCtnX2grQk9UVE9NKSk7CglzZXRDc3NXSChnZXREaXYoJ2JnbHlyJyksIGdfdysxLCBnX2grMSk7CglzZXRDc3NXSChnX2NudiwgZ193KzEsIGdfaCsxKTsKCXNldENzc1dIKGdfZ3JpZGx5ciwgZ193KzEsIGdfaCsxKTsKCXNldENzc1dIKGdfeWx5ciwgTEVGVCwgZ19oKzEsIHRydWUpOwoJc2V0Q3NzV0goKG8gPSBnX3hseXIpLCBnX3crMSwgQk9UVE9NLCB0cnVlKTsKCW8uc3R5bGUudG9wID0gKFRPUCtnX2grMSkrJ3B4JzsKCWdfb3B0c2x5ci5zdHlsZS5sZWZ0ID0gKExFRlQrZ193KzUpKydweCc7Cn0KCgpmdW5jdGlvbiBmaXRXbmQoKQp7CglpZiAoZG9jdW1lbnQuZm9ybXMuZm8uRklUV05ELmNoZWNrZWQpCgl7CgkJaWYgKCEhKChvID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpICYmIG8uY2xpZW50V2lkdGgpKQoJCXsKCQkJdmFyIF93ID0gby5jbGllbnRXaWR0aDsKCQkJdmFyIF9oID0gby5jbGllbnRIZWlnaHQ7CgkJfQoJCWVsc2UKCQl7CgkJCXZhciBfdyA9IHdpbmRvdy5pbm5lcldpZHRoOwoJCQl2YXIgX2ggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CgkJfQoJCWdfdyA9IGdfaCA9IE1hdGgubWluKF93LV93JTItTEVGVC1SSUdIVCwgX2gtX2glMi1UT1AtQk9UVE9NKS00OwoJfQoJZWxzZSBnX3cgPSBnX2ggPSBERUZXOwoJcmVzaXplQ252KCk7CglnZXRDbnZQb3MoKTsKfQoKCmZ1bmN0aW9uIGluaXRDb29yZHRpcChvKQp7CgkobyA9IChnX2Nvb3JkdGlwID0gZ2V0RGl2KCdjb29yZHRpcCcpKS5zdHlsZSkubGVmdCA9IChnX3BhZ2VYKzE1KSsncHgnOwoJby50b3AgPSAoZ19wYWdlWSsxMCkrJ3B4JzsKCW8uekluZGV4ID0gMjsKCXBhaW50KGdfY29vcmR0aXAsICc8c21hbGwgc3R5bGU9ImJhY2tncm91bmQ6JytDTlZDT0xPUisnO3doaXRlLXNwYWNlOm5vd3JhcDsiPicrU19DT09SRFRJUCsnPFwvc21hbGw+Jyk7CglnX2Nudi5vbm1vdXNlb3ZlciA9IGZ1bmN0aW9uKCkge2RvY3VtZW50Lm9ubW91c2Vtb3ZlID0gY29vcmRUaXA7IGdfY252Lm9ubW91c2VvdmVyID0gbnVsbDt9Cn0KCgpmdW5jdGlvbiBwcnQoKQp7CglnZXREaXYoJ2JvZHkxJykuc3R5bGUuZGlzcGxheSA9IGdldERpdignYm9keTInKS5zdHlsZS5kaXNwbGF5ID0gKGRvY3VtZW50LmZvcm1zLmZvLlBSVC5jaGVja2VkKT8gJ25vbmUnIDogJ2Jsb2NrJzsKCWdldENudlBvcygpOwp9CgoKZnVuY3Rpb24gc2V0R3JpZFZpcygpCnsKCWdfZ3JpZGx5ci5zdHlsZS52aXNpYmlsaXR5ID0gKGRvY3VtZW50LmZvcm1zLmZvLkdSSUQuY2hlY2tlZCk/ICd2aXNpYmxlJyA6ICdoaWRkZW4nOwp9CgoKZnVuY3Rpb24gZGVsR3JhcGhzKGFzaykKewoJaWYgKGFzayAmJiAhKGdfbiAmJiB3aW5kb3cuY29uZmlybShTX0RFTEdSQVBIUykpKSByZXR1cm47CglnX24gPSAwOwoJcGFpbnQoZ19jbnYsICcnKTsKCXBhaW50KGdfdGVybWx5ciwgJycpOwp9CgoKU3RyaW5nLnByb3RvdHlwZS50b0V4cCA9IGZ1bmN0aW9uKCkKewoJdmFyIG5lZyA9ICh0aGlzLmNoYXJBdCgwKSA9PSAnLScpKjE7Cgl2YXIgbiA9IHRoaXMubWF0Y2goL1sxLTldL2cpLmxlbmd0aDsKCWlmIChNYXRoLmFicyhwYXJzZUZsb2F0KHRoaXMpKSA+IDEpCgkJcmV0dXJuIHRoaXMuc3Vic3RyaW5nKDAsbmVnKzEpICsgKChuLTEpPyAoJy4nK3RoaXMuc3Vic3RyaW5nKG5lZysxLCB0aGlzLmluZGV4T2YoJzAnKSkpIDogJycpICsgJyoxMDxzdXA+JyArICh0aGlzLmxlbmd0aC0xLW5lZykgKyAnPFwvc3VwPic7CglyZXR1cm4gKG5lZz8gJy0nIDogJycpICsgdGhpcy5tYXRjaCgvWzEtOV0vKVswXSArICgobi0xKT8gKCcuJyt0aGlzLnN1YnN0cmluZyh0aGlzLmxlbmd0aC1uKzEpKSA6ICcnKSArICcqMTA8c3VwPi0nICsgKHRoaXMuc3Vic3RyaW5nKHRoaXMuaW5kZXhPZignLicpKzEpLmxlbmd0aC1uKzEpICsgJzxcL3N1cD4nOwp9CgoKZnVuY3Rpb24gc2hpZnRMKHgsIG4pCnsKCXZhciBuZWcgPSAoeCA8IDApPyAnLScgOiAnJzsKCXggPSAnJytNYXRoLmFicyh4KTsKCXdoaWxlIChuLS0pCgl7CgkJaWYgKHguY2hhckF0KHgubGVuZ3RoLTEpID09ICcwJykKCQkJeCA9IHguc3Vic3RyaW5nKDAsIHgubGVuZ3RoLTEpOwoJCWVsc2UgaWYgKCEoL1wuLykudGVzdCh4KSkKCQkJeCA9IHguc3Vic3RyaW5nKDAsIHgubGVuZ3RoLTEpKycuJyt4LmNoYXJBdCh4Lmxlbmd0aC0xKTsKCQllbHNlIGlmICgheC5pbmRleE9mKCcuJykpCgkJCXggPSAnLjAnK3guc3Vic3RyaW5nKDEpOwoJCWVsc2UgeCA9IHguc3Vic3RyaW5nKDAsIHguaW5kZXhPZignLicpLTEpKycuJyt4LmNoYXJBdCh4LmluZGV4T2YoJy4nKS0xKSt4LnN1YnN0cmluZyh4LmluZGV4T2YoJy4nKSsxKTsKCX0KCWlmICh4LmNoYXJBdCgwKSA9PSAnLicpIHggPSAnMCcreDsKCXJldHVybiBuZWcreDsKfQoKCmZ1bmN0aW9uIG1rSXYoeCkKewoJeCAqPSBERUZXL2dfdzs7Cgl2YXIgaSA9IDA7Cgl3aGlsZSAoeC0xMDAgPD0gMCkKCXsKCQl4ICo9IDEwOwoJCWkrKzsKCX0KCXdoaWxlICh4LTEwMDAgPiAwKQoJewoJCXggLz0gMTA7CgkJaS0tOwoJfQoJeCA9IE1hdGguZmxvb3IoeCk7Cgl4ID0gKHgtNjAwID49IDApPyAxMDAgOiAoeC0zMDAgPj0gMCk/IDUwIDogKHgtMjAwID49IDApPyAyNSA6IDIwOwoJd2hpbGUgKGkgPCAwKQoJewoJCXggPSBwYXJzZUludCh4ICs9ICcwJyk7CgkJaSsrOwoJfQoJcmV0dXJuIHBhcnNlRmxvYXQoc2hpZnRMKHgsIGkpKTsKfQoKCmZ1bmN0aW9uIG1rTnVtU3RyKG4sIGl2LCB0b0UpCnsKCXZhciBpID0gMDsKCWlmICghbiB8fCAhaXYpIHJldHVybiAnMCc7Cgl3aGlsZSAoTWF0aC5hYnMoaXYpLTEgPCAwKQoJewoJCWl2ICo9IDEwOwoJCWkrKzsKCX0KCW4gPSBzaGlmdEwoIXRvRT8gTWF0aC5yb3VuZChuKml2KSA6IChuKml2KSwgaSk7CglyZXR1cm4gKHRvRSAmJiBuLmxlbmd0aCA+IDYpPyBuLnRvRXhwKCkgOiBuOwp9CgoKZnVuY3Rpb24gbWtTY2FsZSgpCnsKCXZhciBpdnggPSBta0l2KGdfeHotZ194YSksIGl2eSA9IG1rSXYoKGdfeXotZ195YSkqZ193L2dfaCksCglyeCA9IGl2eC9nX2R4LCByeSA9IGl2eS9nX2R5LAoJaHRtID0gJycsIGdyaWRodG0gPSAnJywKCXBvcywgc3RyLCBzdHJzLCBzdHJsLAoJbGltdCA9IE1hdGgucm91bmQoZ194ei9nX2R4KSwgbGltYiA9IE1hdGgucm91bmQoZ194YS9nX2R4KSwKCWogPSBNYXRoLmNlaWwoZ194YS9pdngpLAoJaSA9IE1hdGgucm91bmQoaipyeCk7Cgl3aGlsZSAoaS1saW10IDw9IDApCgl7CgkJc3RycyA9IChzdHIgPSAnJytta051bVN0cihqLCBpdngsIHRydWUpKS5tYXRjaCgvW15cPlw8YS16XSsvZyk7CgkJc3RybCA9IHN0cnNbMF0ubGVuZ3RoICsgKHN0cnNbMV0/IHN0cnNbMV0ubGVuZ3RoIDogMCk7CgkJaHRtICs9IG1rRGl2KCcnLCAnJywgKHBvcyA9IGktbGltYiksIDAsIDEsIDQsIFNDQUxFQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSkrCgkJCW1rRGl2KCc8Zm9udCBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6YmxhY2s7Ij4nK3N0cisnPFwvZm9udD4nLCAnJywgcG9zLTMqc3RybCwgNCwgMTYqc3RybCwgMTIsICcnLCAnJywgdHJ1ZSwgZmFsc2UpOwoJCWdyaWRodG0gKz0gbWtEaXYoJycsICcnLCAgcG9zLCAwLCAxLCBnX2grMSwgIWo/IEFYQ09MT1IgOiBHUklEQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSk7CgkJaSA9IE1hdGgucm91bmQoKytqKnJ4KTsKCX0KCXBhaW50KGdfeGx5ciwgaHRtKTsKCXZhciBzY2x3ID0gcGFyc2VJbnQoZ195bHlyLnN0eWxlLndpZHRoKTsKCWh0bSA9ICcnOwoJbGltdCA9IE1hdGgucm91bmQoZ195ei9nX2R5KSwgbGltYiA9IE1hdGgucm91bmQoZ195YS9nX2R5KTsKCWogPSBNYXRoLmNlaWwoZ195YS9pdnkpOwoJaSA9IE1hdGgucm91bmQoaipyeSk7Cgl3aGlsZSAoaS1saW10IDw9IDApCgl7CgkJc3RybCA9IChzdHIgPSAnJytta051bVN0cihqLCBpdnksIHRydWUpKS5sZW5ndGg7CgkJaHRtICs9IG1rRGl2KCcnLCAnJywgc2Nsdy00LCAocG9zID0gZ19oLWkrbGltYiksIDQsIDEsIFNDQUxFQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSkrCgkJCW1rRGl2KCc8Zm9udCBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6YmxhY2s7Ij4nK3N0cisnPFwvZm9udD4nLCAncmlnaHQnLCAwLCBwb3MtNywgc2Nsdy02LCAxMiwgJycsICcnLCB0cnVlLCBmYWxzZSk7CgkJZ3JpZGh0bSArPSBta0RpdignJywgJycsICAwLCBwb3MsIGdfdysxLCAxLCAhaj8gQVhDT0xPUiA6IEdSSURDT0xPUiwgJycsIGZhbHNlLCB0cnVlKTsKCQlpID0gTWF0aC5yb3VuZCgrK2oqcnkpOwoJfQoJcGFpbnQoZ195bHlyLCBodG0pOwoJcGFpbnQoZ19ncmlkbHlyLCBncmlkaHRtKTsKfQoKCmZ1bmN0aW9uIG1rRGl2KHR4dCwgYWxpZ24sIHgsIHksIHcsIGgsIGMsIGlkLCBvdmVyLCBjdXQpCnsKCWlmIChjdXQpCgl7CgkJaWYgKHgtZ193ID4gMCB8fCB4K3cgPCAwIHx8IHktZ19oID4gMCB8fCB5K2ggPCAwKSByZXR1cm4gJyc7CgkJaWYgKHkgPCAwKQoJCXsKCQkJaCArPSB5OwoJCQl5ID0gMDsKCQl9CgkJaWYgKHkraC1nX2gtMSA+IDApIGggPSBnX2grMS15OwoJCWlmICh4IDwgMCkKCQl7CgkJCXcgKz0geDsKCQkJeCA9IDA7CgkJfQoJCWlmICh4K3ctZ193LTEgPiAwKSB3ID0gZ193KzEreDsKCX0KCWlmIChnX2llKSByZXR1cm4gKCclJScreCsnOycreSsnOycrdysnOycraCsnOycrKGFsaWduPyAncmlnaDsnIDogJ2xlZjsnKSsoYz8gKGMrJzsnKSA6ICc7JykrKG92ZXI/ICd2aXNpYmxlOycgOiAnaGlkZGVuOycpKyhpZD8gKCcgaWQ9IicraWQrJyI+JykgOiAnPicpK3R4dCk7CglyZXR1cm4gKCc8ZGl2JysKCQkoaWQ/ICcgaWQ9IicraWQrJyInIDogJycpKwoJCScgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6JyArIHggKyAncHg7dG9wOicgKyB5ICsgJ3B4O3dpZHRoOicgKyB3ICsgJ3B4O2hlaWdodDonICsgaCArICdweDsnKwoJCShvdmVyPyAnJyA6ICgnY2xpcDpyZWN0KDAsJyArIHcgKyAncHgsJyArIGggKyAncHgsMCk7JyArIChnX21vej8gJycgOiAnb3ZlcmZsb3c6aGlkZGVuOycpKSkrCgkJKGM/ICdiYWNrZ3JvdW5kLWNvbG9yOicgKyBjICsgJzsnIDogJycpKwoJCSd0ZXh0LWFsaWduOicgKyAoYWxpZ24gfHwgJ2xlZnQnKSArICc7Ij4nICsgdHh0ICsgJzxcL2Rpdj4nCgkpOwp9CgoKZnVuY3Rpb24gZ1JlcGxhY2UoeCkKewoJcmV0dXJuIHgucmVwbGFjZSgvJSUoW147XSspOyhbXjtdKyk7KFteO10rKTsoW147XSspOyhbXjtdKyk7KFteO10qKTsoW147XSspOyhbXiUlXSopL2csCgkJJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6JDFweDt0b3A6JDJweDt3aWR0aDokM3B4O2hlaWdodDokNHB4O3RleHQtYWxpZ246JDV0OycrCgkJJ2JhY2tncm91bmQ6JDY7b3ZlcmZsb3c6JDc7IiQ4PFwvZGl2PicpOwp9CgoKZnVuY3Rpb24gcGFpbnQoY252LCBodG0sIGFkZCkKewoJaWYgKGNudikKCXsKCQlpZiAoYWRkKQoJCXsKCQkJdmFyIG87CgkJCWlmIChnX2FkaHRtKSBjbnYuaW5zZXJ0QWRqYWNlbnRIVE1MKCJCZWZvcmVFbmQiLCBnUmVwbGFjZShodG0pKTsKCQkJZWxzZSBpZiAoZ19kb20pCgkJCXsKCQkJCW8gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCQkJby5zZXRTdGFydEJlZm9yZShjbnYpOwoJCQkJbyA9IG8uY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bSk7CgkJCQljbnYuYXBwZW5kQ2hpbGQobyk7CgkJCX0KCQkJZWxzZSBjbnYuaW5uZXJIVE1MICs9IGh0bTsKCQl9CgkJZWxzZSBjbnYuaW5uZXJIVE1MID0gZ19pZT8gZ1JlcGxhY2UoaHRtKSA6IGh0bTsKCX0KfQoKCmZ1bmN0aW9uIHNjYWxlWSh4KQp7CglyZXR1cm4gKE1hdGgubWluKE1hdGgubWF4KGdfaCtNYXRoLnJvdW5kKChnX3lhLXgpL2dfZHkpLCAtMSksIGdfaCsxKSk7Cn0KCgpmdW5jdGlvbiBta1Rlcm0oeCkKewoJeCA9IHgudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccy9nLCcnKS4KCQlyZXBsYWNlKC9mKFwofFx7fFxbKXgoXCl8XH18XF0pXD0vZywgJycpLgoJCXJlcGxhY2UoL21hdGhcLi9nLCcnKS4KCQlyZXBsYWNlKC9cLipcOysvZywnOycpLgoJCXJlcGxhY2UoL1tcLlw7XSokLywnJykuCgkJcmVwbGFjZSgvXHwoW15cfF0qKVx8L2csJ2FicygkMSknKS4KCQlyZXBsYWNlKC86L2csJ1wvJykuCgkJcmVwbGFjZSgvsi9nLCdeMicpLgoJCXJlcGxhY2UoL7MvZywnXjMnKS4KCQlyZXBsYWNlKC9bXCJcJ10vZywnXicpLgoJCXJlcGxhY2UoL2UvZywnRScpLgoJCXJlcGxhY2UoL2xvZyhcZCkvZywnTE9HJDEnKS4KCQlyZXBsYWNlKC9sbihcZCkvZywnTE4kMScpLgoJCXJlcGxhY2UoL2FyYyh1cyk/fGFyRWF8YXIvZywnYScpLgoJCXJlcGxhY2UoL2h5cChFcmJvbGljdXMpPy9nLCdoJykuCgkJcmVwbGFjZSgvY29zaW4odXN8RSk/L2csJ2NvcycpLgoJCXJlcGxhY2UoL3Npbih1c3xFKS9nLCdzaW4nKS4KCQlyZXBsYWNlKC9zRWMoYW4oc3x0KSk/L2csJ3NlYycpLgoJCXJlcGxhY2UoL2Nvc2VjL2csJ2NzYycpLgoJCXJlcGxhY2UoL3RhbmdFbltzdF0vZywndGFuJykuCgkJcmVwbGFjZSgvY290YW4vZywnY290JykuCgkJcmVwbGFjZSgvcmFuZG9tKFwofFx7fFxbKShcKXxcfXxcXSl8cmFuZChvbSk/L2csJ3JhbmRvbSgpJykuCgkJcmVwbGFjZSgvKHB8cG93ZXIpKFwofFx7fFxbKS9nLCdwb3ckMicpLgoJCXJlcGxhY2UoLyhifHEpcihcKHxce3xcWykvZywnJDFydCQyJykuCgkJcmVwbGFjZSgvKHNxcnxzcXJ0KShcZCkvZywnU1FSVCQyJykuCgkJcmVwbGFjZSgvdGFuMi9nLCAndGFueicpLgoJCXJlcGxhY2UoL21heC9nLCdtYXonKS4KCQlyZXBsYWNlKC9waS9nLCdQSScpLgoJCXJlcGxhY2UoL3BoaS9nLCdQSEknKS4KCQlyZXBsYWNlKC95LywnbnV0cycpLgoJCXJlcGxhY2UoL2NFaWwvZywnY2VpbCcpLgoJCXJlcGxhY2UoL0V4cG93fEV4cC9nLCdleHAnKS4KCQlyZXBsYWNlKC8oW15tXXxeKShcKHxce3xcWykoXCl8XH18XF0pL2csJyQxJDJ4JDMnKS4KCQlyZXBsYWNlKC8oXCh8XHt8XFspXCwvZywnJDF4LCcpLgoJCXJlcGxhY2UoL1wsKFwpfFx9fFxdKS9nLCcseCQxJykuCgkJcmVwbGFjZSgvXCxcLC9nLCcseCwnKTsKCXggPSB4LnJlcGxhY2UoLyhbXkddXGRcZHxbXkdcZF1cZHxeXGR8XlxkXGQpRS9nLCckMSpFJyk7Cgl4ID0geC5yZXBsYWNlKC8oUlQxXzJ8UlQyfExOMTB8TE4yKShcZCkvZywnJDEqJDInKTsKCXZhciByZWcgPSAvKHh8RXxQSXxcKXxcfXxcXSkoRXxcZCkvZzsKCXdoaWxlICh4Lm1hdGNoKHJlZykpIHggPSB4LnJlcGxhY2UocmVnLCckMSokMicpOwoJcmVnID0gLyhcZHxFfFBJfHh8XCl8XH18XF0pKFwofFx7fFxbfHh8YXxjfGV4cHxmfGdhdXN8bHxtfHBvd3xyfHN8dGFufEx8UEl8U1FSVCkvZzsKCXdoaWxlICh4Lm1hdGNoKHJlZykpIHggPSB4LnJlcGxhY2UocmVnLCckMSokMicpOwoJeCA9IHgucmVwbGFjZSgvdGFuei9nLCd0YW4yJykucmVwbGFjZSgvbWF6L2csJ21heCcpOwoJcmV0dXJuIHg7Cn0KCgpmdW5jdGlvbiBXek1hdGgoKQp7Cgl0aGlzLlBISSA9IDEuNjE4MDMzOTg4NzQ5ODk0ODQ4MjA0NTg2ODM0MzY1NjsKCXRoaXMucm9vdCA9IGZ1bmN0aW9uKHgsIHhwKSB7cmV0dXJuIE1hdGgucG93KHgsIDEveHApO307Cgl0aGlzLmNicnQgPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgucG93KHgsIDEvMyk7fTsKCXRoaXMubG9nbiA9IGZ1bmN0aW9uKHgsIGJzKSB7cmV0dXJuIE1hdGgubG9nKHgpL01hdGgubG9nKGJzKTt9OwoJdGhpcy5sbiA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5sb2coeCk7fTsKCXRoaXMubGcgPSBmdW5jdGlvbiAoeCkge3JldHVybiBNYXRoLmxvZyh4KS9NYXRoLkxOMTA7fTsKCXRoaXMubGIgPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKHgpL01hdGguTE4yO307Cgl0aGlzLmNvdCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5jb3MoeCkvTWF0aC5zaW4oeCk7fTsKCXRoaXMuc2VjID0gZnVuY3Rpb24oeCkge3JldHVybiAxL01hdGguY29zKHgpO307Cgl0aGlzLmNzYyA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gMS9NYXRoLnNpbih4KTt9OwoJdGhpcy5hY290ID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmF0YW4oLXgpK01hdGguUEkvMjt9OwoJdGhpcy5hc2VjID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmFjb3MoMS94KTt9OwoJdGhpcy5hY3NjID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmFzaW4oMS94KTt9OwoJdGhpcy5zaW5oID0gZnVuY3Rpb24oeCkge3JldHVybiAoTWF0aC5leHAoeCktTWF0aC5leHAoLXgpKS8yO307Cgl0aGlzLmNvc2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCh4KStNYXRoLmV4cCgteCkpLzI7fTsKCXRoaXMuc2VjaCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gMi8oTWF0aC5leHAoeCkrTWF0aC5leHAoLXgpKTt9OwoJdGhpcy5jc2NoID0gZnVuY3Rpb24oeCkge3JldHVybiAyLyhNYXRoLmV4cCh4KS1NYXRoLmV4cCgteCkpO307Cgl0aGlzLnRhbmggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCgyKngpLTEpLyhNYXRoLmV4cCgyKngpKzEpO307Cgl0aGlzLmNvdGggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCgyKngpKzEpLyhNYXRoLmV4cCgyKngpLTEpO307Cgl0aGlzLmFzaW5oID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZyh4K01hdGguc3FydCh4KngrMSkpO307Cgl0aGlzLmFjb3NoID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZyh4K01hdGguc3FydCh4KngtMSkpO307Cgl0aGlzLmF0YW5oID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZygoMSt4KS8oMS14KSkvMjt9OwoJdGhpcy5hY290aCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5sb2coKHgrMSkvKHgtMSkpLzI7fTsKCXRoaXMuYXNlY2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKDEveCtNYXRoLnNxcnQoMS8oeCp4KS0xKSk7fTsKCXRoaXMuYWNzY2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKDEveCtNYXRoLnNxcnQoMS8oeCp4KSsxKSk7fTsKCXRoaXMuZ2F1c3NkID0gZnVuY3Rpb24oeCxtLHMpIHtyZXR1cm4gMS8ocyoyLjUwNjYyODI3NDYzMTAwMDIpKk1hdGguZXhwKC0oeCAtPSBtKSp4LygyKnMqcykpO307Cgl0aGlzLnNnbiA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gKHggPCAwKT8gLTEgOiAoeCA+IDApPyAxIDogMDt9OwoJdGhpcy5mYWN0ID0gZnVuY3Rpb24oeCkKCXsKCQl4ID0gTWF0aC5yb3VuZChNYXRoLmFicyh4KSk7CgkJaWYgKHggPiAxKSByZXR1cm4geCp0aGlzLmZhY3QoeC0xKTsKCQlyZXR1cm4gMTsKCX07IAp9Cld6TWF0aC5wcm90b3R5cGUgPSBNYXRoOwpXek1hdGggPSBuZXcgV3pNYXRoKCk7ICAgICAgICAKCgpmdW5jdGlvbiBta1Bvdyh4KQp7Cgl4ID0geC5yZXBsYWNlKC9ce3xcWy9nLCcoJykucmVwbGFjZSgvXH18XF0vZywnKScpOwoJd2hpbGUgKC9cXi8udGVzdCh4KSkKCXsKCQl2YXIgYXogPSB4LnNlYXJjaCgvXF4vKSwKCQlhID0geC5zdWJzdHJpbmcoMCwgYXopLCB6ID0geC5zdWJzdHJpbmcoYXorMSksCgkJcCA9IDAsIGNoLCBsaW0gPSBhei0xOwoJCXdoaWxlICh0cnVlKQoJCXsKCQkJY2ggPSBhLmNoYXJBdChsaW0pOwoJCQlpZiAoY2ggPT0gJyknKSBwKys7CgkJCWVsc2UgaWYgKGNoID09ICcoJykgcC0tOwoJCQlpZiAocCA8IDAgfHwgIXAgJiYgKCEobGltKzEpIHx8IC9bXCtcLVwqXC9cLF0vLnRlc3QoY2gpKSkgYnJlYWs7CgkJCWxpbS0tOwoJCX0KCQlhID0gYS5zdWJzdHJpbmcoMCwgbGltKzEpICsgJ3BvdygnICsgYS5zdWJzdHJpbmcobGltKzEsIGF6KTsKCQlsaW0gPSAwOyBwID0gMDsKCQl3aGlsZSAodHJ1ZSkKCQl7CgkJCWNoID0gei5jaGFyQXQobGltKTsKCQkJaWYgKGNoID09ICcoJykgcCsrOwoJCQllbHNlIGlmIChjaCA9PSAnKScpIHAtLTsKCQkJaWYgKHAgPCAwIHx8ICFwICYmIChsaW0gPT0gei5sZW5ndGggfHwgbGltID4gMCAmJiAvW1wrXC1cKlwvXF5cLF0vLnRlc3QoY2gpKSkgYnJlYWs7CgkJCWxpbSsrOwoJCX0KCQl6ID0gei5zdWJzdHJpbmcoMCwgbGltKSArICcpJyArIHouc3Vic3RyaW5nKGxpbSk7CgkJeCA9IGErJywnK3o7Cgl9CglyZXR1cm4geDsKfQoKCk51bWJlci5wcm90b3R5cGUubGltID0gZnVuY3Rpb24oaSwgaiwgeGRpciwgeWRpcikKewoJdmFyIHl5ID0gcGFyc2VGbG9hdCh0aGlzKSwgeSwKCWluY3IgPSBnX2R4LzEwMCwgX2luY3IgPSBpbmNyKnhkaXIsIHF0ID0gMSwgbGltID0gKGdfeGErKGoreGRpcikqZ19keCksCgl4ID0gZ194YStqKmdfZHg7Cgl3aGlsZSAocXQgPCAweDEwMDAwMCAmJiAhISgoeGRpciA8IDApPyAoeC1saW0gPiAwKSA6ICh4LWxpbSA8IDApKSkKCXsKCQl4ICs9IF9pbmNyOwoJCXkgPSBnRXZhbCh4LCBnX3Rlcm1baV0pOwoJCWlmIChpc051bSh5KSAmJiB5KnlkaXIteXkqeWRpciA+IDApIHl5ID0geTsKCQllbHNlCgkJewoJCQl4IC09IF9pbmNyOwoJCQlfaW5jciA9IGluY3IqeGRpci8ocXQgPDw9IDMpOwoJCX0KCX0KCXJldHVybiB5eTsKfQoKCmZ1bmN0aW9uIGdFdmFsKHgsIHRlcm0sIHkpCnsKCXdpdGggKFd6TWF0aCkgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHBhcnNlRmxvYXQoZXZhbCh0ZXJtKSksLWdfaW5maW4pLGdfaW5maW4pOwp9CgoKZnVuY3Rpb24gbWtHcmFwaChmKQp7CglpZiAoIWdfY252KQoJewoJCWFsZXJ0KFNfT0xEQlJPV1NFUik7CgkJcmV0dXJuOwoJfQoJZ19odG0gPSAnJzsKCXZhciB4YSA9IGdldFZhbChmLlhBKSwKCXh6ID0gZ2V0VmFsKGYuWFopOwoJaWYgKCFpc051bSh4YSkpIHJldHVybiBhbGVydEVycihmLlhBLCAneCBtaW4nKTsKCWlmICghaXNOdW0oeHopKSByZXR1cm4gYWxlcnRFcnIoZi5YWiwgJ3ggbWF4Jyk7CglpZiAoeGEgPj0geHopIHJldHVybiBhbGVydEVycihmLlhBLCBTX0VSUl9YUkFOR0UpOwoJaWYgKCFmLkFkZC5jaGVja2VkKSBnX24gPSAwOwoJaWYgKCFnX24pCgl7CgkJdmFyIHlhID0gZ2V0VmFsKGYuWUEpLAoJCXl6ID0gZ2V0VmFsKGYuWVopOwoJCWlmICghaXNOdW0oeWEpICYmIHlhICE9ICcnKSByZXR1cm4gYWxlcnRFcnIoZi5ZQSwgJ3kgbWluJyk7CgkJaWYgKCFpc051bSh5eikgJiYgeXogIT0gJycpIHJldHVybiBhbGVydEVycihmLllaLCAneSBtYXgnKTsKCQlpZiAoaXNOdW0oeWEpICYmIGlzTnVtKHl6KSAmJiB5YSA+PSB5eikgcmV0dXJuIGFsZXJ0RXJyKGYuWUEsIFNfRVJSX1lSQU5HRSk7CgkJZml0V25kKCk7CgkJZ194YSA9IHhhOwoJCWdfeHogPSB4ejsKCQlnX2R4ID0gKHh6LXhhKS9nX3c7CgkJZ195YSA9IHlhOwoJCWdfeXogPSB5ejsKCQlpZiAoIWlzTnVtKHlhKSkgeWEgPSBnX2luZmluOwoJCWlmICghaXNOdW0oeXopKSB5eiA9IC1nX2luZmluOwoJCWRlbEdyYXBocygpOwoJfQoJZ190ZXJtID0gbWtUZXJtKGYuRi52YWx1ZSkuc3BsaXQoJzsnKTsKCXZhciB0ZXJtID0gW107Cgl2YXIgeXkgPSBbXSwgeTsKCXRyeQoJewoJCWZvciAoaSA9IDA7IGkgPCBnX3Rlcm0ubGVuZ3RoOyBpKyspCgkJewoJCQlnX3Rlcm1baV0gPSBta1Bvdyh0ZXJtW2ldID0gZ190ZXJtW2ldKTsKCQkJd2hpbGUgKHRydWUpCgkJCXsKCQkJCXZhciBjb21zID0gKGdfdGVybVtpXS5tYXRjaCgvXCwvZykgfHwgW10pLmxlbmd0aCwgbWV0aHMgPSAoZ190ZXJtW2ldLm1hdGNoKC9wb3d8bWlufG1heHxhdGFuMnxyb290fGxvZ258Z2F1fHNzZD8vZykgfHwgW10pLmxlbmd0aDsKCQkJCWlmIChjb21zID4gbWV0aHMgJiYgZ190ZXJtW2ldLm1hdGNoKC9cZCtcLFxkLykpIHJldHVybiBhbGVydEVycihmLkYsIFNfRVJSX1RERUNJKTsKCQkJCWVsc2UgaWYgKGNvbXMgPiBtZXRocykgcmV0dXJuIGFsZXJ0RXJyKGYuRiwgU19FUlJfVENPTU0pOwoJCQkJZWxzZSBpZiAoY29tcyA8IG1ldGhzKSByZXR1cm4gYWxlcnRFcnIoZi5GLCBTX0VSUl9UTUlTU0NPTU0pOwoJCQkJZWxzZSBicmVhazsKCQkJfQoJCQlpZiAoL1x8Ly50ZXN0KGdfdGVybVtpXSkpIHJldHVybiBhbGVydEVycihmLkYsIFNfRVJSX1RQSVBFKTsKCQkJaWYgKChnX3Rlcm1baV0ubWF0Y2goL1woL2cpIHx8IFtdKS5sZW5ndGggIT0gKGdfdGVybVtpXS5tYXRjaCgvXCkvZykgfHwgW10pLmxlbmd0aCkgcmV0dXJuIGFsZXJ0RXJyKGYuRiwgU19FUlJfVFBBUkVOVEgpOwoJCQl2YXIgcmFuZCA9ICEoZ190ZXJtW2ldLmluZGV4T2YoJ3JhbicpIDwgMCk7CgkJCXl5W2ldID0gW107CgkJCXl5W2ldW2dfd10gPSBnRXZhbChnX3h6LCBnX3Rlcm1baV0pOwoJCQl2YXIgaiA9IGdfdysxOyB3aGlsZSAoai0tKQoJCQl7CgkJCQlpZiAoaikgeXlbaV1bai0xXSA9IGdFdmFsKGdfeGErKGotMSkqZ19keCwgZ190ZXJtW2ldKTsKCQkJCWlmIChpc051bSh5ID0geXlbaV1bal0pKQoJCQkJewoJCQkJCWlmICghcmFuZCkKCQkJCQl7CgkJCQkJCWlmIChpc051bSh5eVtpXVtqLTFdKSAmJiBpc051bSh5eVtpXVtqKzFdKSkKCQkJCQkJewoJCQkJCQkJaWYgKHl5W2ldW2otMV0gPCAwICYmIHkgPiAwICYmIHl5W2ldW2orMV0teSA8IDApCgkJCQkJCQkJeSA9IHkubGltKGksaiwtMSwxKTsKCQkJCQkJCWVsc2UgaWYgKHl5W2ldW2otMV0gPiAwICYmIHkgPCAwICYmIHl5W2ldW2orMV0teSA+IDApCgkJCQkJCQkJeSA9IHkubGltKGksaiwtMSwtMSk7CgkJCQkJCQllbHNlIGlmICh5eVtpXVtqKzFdID4gMCAmJiB5IDwgMCAmJiB5eVtpXVtqLTFdLXkgPiAwKQoJCQkJCQkJCXkgPSB5LmxpbShpLGosMSwtMSk7CgkJCQkJCQllbHNlIGlmICh5eVtpXVtqKzFdIDwgMCAmJiB5ID4gMCAmJiB5eVtpXVtqLTFdLXkgPCAwKQoJCQkJCQkJCXkgPSB5LmxpbShpLGosMSwxKTsKCQkJCQkJfQoJCQkJCQllbHNlIGlmIChqLWdfdyAmJiAhaXNOdW0oeXlbaV1baisxXSkgJiYgaXNOdW0oeXlbaV1bai0xXSkpCgkJCQkJCQl5ID0geS5saW0oaSxqLDEsKHkteXlbaV1bai0xXSA+IDApPyAxIDogLTEpOwoJCQkJCQllbHNlIGlmIChqICYmICFpc051bSh5eVtpXVtqLTFdKSAmJiBpc051bSh5eVtpXVtqKzFdKSkKCQkJCQkJCXkgPSB5LmxpbShpLGosLTEsKHkteXlbaV1baisxXSA+IDApPyAxIDogLTEpOwoJCQkJCQl5eVtpXVtqXSA9IHk7CgkJCQkJfQoJCQkJCWlmICghaXNOdW0oZ195YSkpIHlhID0gTWF0aC5taW4oeWEsIHkpOwoJCQkJCWlmICghaXNOdW0oZ195eikpIHl6ID0gTWF0aC5tYXgoeXosIHkpOwoJCQkJfQoJCQl9CgkJfQoJfQoJY2F0Y2ggKGVycikKCXsKCQlhbGVydEVycihmLkYsIFNfRVJSX1RFUk0pOwoJCXJldHVybjsKCX0KCWlmICghZ19uKQoJewoJCWdfeXogPSB5ejsKCQlnX3lhID0geWE7CgkJdmFyIG9sZGggPSBnX2g7CgkJaWYgKGRvY3VtZW50LmZvcm1zLmZvLlhZUkFUSU8uY2hlY2tlZCkKCQl7CgkJCWdfZHkgPSBnX2R4OwoJCQl2YXIgaCA9IChnX3l6LWdfeWEpL2dfZHk7CgkJCWlmIChoID4gMTAwKmdfdykKCQkJewoJCQkJaWYgKGdfeWEgPCAwICYmIGdfeWEgPCAtZ193KmdfZHkpIGdfeWEgKj0gMTAwKmdfdy9oOwoJCQkJaWYgKGdfeXogPiAwICYmIGdfeXogPiBnX3cqZ19keSkgZ195eiAqPSAxMDAqZ193L2g7CgkJCX0KCQkJaWYgKGgtMSA8IDApIGdfeWEgLT0gZ19keTsKCQkJZ19oID0gTWF0aC5yb3VuZCgoZ195ei1nX3lhKS9nX2R5KTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKCEoZ195ei1nX3lhKSkKCQkJewoJCQkJZ195YSAtPSAoZ194ei1nX3hhKS8yOwoJCQkJZ195eiArPSAoZ194ei1nX3hhKS8yOwoJCQl9CgkJCWdfaCA9IGdfdzsKCQkJZ19keSA9IChnX3l6LWdfeWEpL2dfaDsKCQl9CgkJaWYgKG9sZGggIT0gZ19oKSByZXNpemVDbnYoKTsKCQlta1NjYWxlKCk7Cgl9Cgl2YXIgdGVybWh0bSA9ICcnLCBjaSA9IDAsIHg7CgkvL3ZhciB0MCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Cglmb3IgKGkgPSAwOyBpIDwgZ190ZXJtLmxlbmd0aDsgaSsrKQoJewoJCXZhciBjID0gJyMnICsgR1JBUEhDT0xPUlsoY2krKyklR1JBUEhDT0xPUi5sZW5ndGhdOwoJCXZhciB0cCwgYm90OwoJCXZhciBveCA9IGdfdysxOwoJCXZhciBveSA9ICcnOwoJCXZhciBueSA9IChpc051bSh5eVtpXVtnX3ddKSk/IHNjYWxlWSh5eVtpXVtnX3ddKSA6ICcnOwoJCXggPSBnX3crMTsgd2hpbGUgKHgtLSkKCQl7CgkJCXkgPSBueTsKCQkJbnkgPSAoeCAmJiBpc051bSh5eVtpXVt4LTFdKSk/IHNjYWxlWSh5eVtpXVt4LTFdKSA6ICcnOwoJCQlpZiAoaXNOdW0oeSkpCgkJCXsKCQkJCWlmICghaXNOdW0ob3kpKSBveSA9IHk7CgkJCQlpZiAoIWlzTnVtKG55KSkKCQkJCXsKCQkJCQlpZiAob3gteC0xIHx8ICEob3kteSkpCgkJCQkJewoJCQkJCQl0cCA9IHk7CgkJCQkJCWJvdCA9IHkrMTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAob3kteSA8IDApCgkJCQkJewoJCQkJCQl0cCA9IG95OwoJCQkJCQlib3QgPSB5KzE7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXRwID0geTsKCQkJCQkJYm90ID0gb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveCA9IHg7CgkJCQkJb3kgPSAnJzsKCQkJCX0KCQkJCWVsc2UgaWYgKG55LXkgPiAwKQoJCQkJewoJCQkJCWlmIChveC14LTEpCgkJCQkJewoJCQkJCQlib3QgPSB5KzE7CgkJCQkJCXRwID0geTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoKG95LXkgPiAwIHx8ICEob3kteSkgJiYgeSA8IDApICYmIG55ID4gb3kgJiYgKGlzTnVtKHl5W2ldW3gtMl0pPyB5eVtpXVt4LTJdLXl5W2ldW3gtMV0gPj0gMCA6IHRydWUpKQoJCQkJCXsKCQkJCQkJdHAgPSB5OwoJCQkJCQlib3QgPSAhaXNOdW0oeXlbaV1beCsxXSk/IG55IDogb3k7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWlmIChpc051bSh5eVtpXVt4LTJdKSAmJiBzY2FsZVkoeXlbaV1beC0yXSktbnkgPD0gMCkgYm90ID0gbnk7CgkJCQkJCWVsc2UgYm90ID0geStNYXRoLnJvdW5kKChueS15KS8yKTsKCQkJCQkJdHAgPSAob3kteSA+IDApPyB5IDogb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveSA9IGJvdDsKCQkJCQlveCA9IHg7CgkJCQl9CgkJCQllbHNlIGlmIChueS15IDwgMCkKCQkJCXsKCQkJCQlpZiAob3gteC0xKQoJCQkJCXsKCQkJCQkJdHAgPSB5OwoJCQkJCQlib3QgPSB5KzE7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKChveS15IDwgMCB8fCAhKG95LXkpICYmIHktZ19oID4gMCkgJiYgbnkgPCBveSkKCQkJCQl7CgkJCQkJCXRwID0gIWlzTnVtKHl5W2ldW3grMV0pPyBueSsxIDogb3k7CgkJCQkJCWJvdCA9IHkrMTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaWYgKGlzTnVtKHl5W2ldW3gtMl0pICYmIHNjYWxlWSh5eVtpXVt4LTJdKS1ueSA+PSAwKSB0cCA9IG55KzE7CgkJCQkJCWVsc2UgdHAgPSB5LU1hdGguZmxvb3IoKHktbnkpLzIpOwoJCQkJCQlib3QgPSAob3kteSA8PSAwKT8geSsxIDogb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveSA9IHRwOwoJCQkJCW94ID0geDsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCW95ID0gJyc7CgkJCQlveCA9IHg7CgkJCX0KCQl9CgkJLy90ZXJtW2ldID0gZ190ZXJtW2ldOwoJCXRlcm1odG0gKz0gKCc8c21hbGwgc3R5bGU9ImNvbG9yOicgKyBjICsgJyI+PGI+JyArIHRlcm1baV0ucmVwbGFjZSgvcmFuZG9tXChcKS9nLCdyYW5kJykucmVwbGFjZSgvcG93L2csJ3AnKS5yZXBsYWNlKC9sb2dcKC9nLCdsbignKS5yZXBsYWNlKC9ydFwoL2csJ3IoJykucmVwbGFjZSgvUlQvZywnUicpICsgJzxcL2I+PFwvc21hbGw+PGJyPicpOwoJCWdfbiArKzsKCX0KCXBhaW50KGdfY252LCBnX2h0bSwgdHJ1ZSk7CgkvL2FsZXJ0KChuZXcgRGF0ZSgpKS5nZXRUaW1lKCktdDApOwoJcGFpbnQoZ190ZXJtbHlyLCB0ZXJtaHRtLCB0cnVlKTsKCWlmICghZ19jb29yZHRpcCkgaW5pdENvb3JkdGlwKCk7Cn0KCgpmdW5jdGlvbiBjb29yZFRpcChlKQp7CglpZiAoZ193YWl0KSByZXR1cm47CglnX3dhaXQgPSAxOwoJc2V0VGltZW91dCgnZ193YWl0ID0gMDsnLCAxKTsKCXZhciB4ID0gKGUgPSBlIHx8IHdpbmRvdy5ldmVudCkucGFnZVggfHwgZS5jbGllbnRYIHx8IDAsCgl5ID0gZS5wYWdlWSB8fCBlLmNsaWVudFkgfHwgMDsKCWlmIChnX2llIHx8IGdfa3EpCgl7CgkJeCArPSBnX2RiLnNjcm9sbExlZnQtKGdfaWUgJiYgIWdfaWVtYWMpKjI7CgkJeSArPSBnX2RiLnNjcm9sbFRvcC0oZ19pZSAmJiAhZ19pZW1hYykqMjsKCX0KCWlmICh4LWdfcGFnZVggPj0gMCAmJiB4LWdfcGFnZVgtZ193IDw9IDAgJiYgeS1nX3BhZ2VZID49IDAgJiYgeS1nX3BhZ2VZLWdfaCA8PSAwKQoJewoJCWdfY29vcmR0aXAuc3R5bGUubGVmdCA9ICh4KzE2KSsncHgnOwoJCWdfY29vcmR0aXAuc3R5bGUudG9wID0gKHktMTIpKydweCc7CgkJcGFpbnQoZ19jb29yZHRpcCwKCQkJJzxzbWFsbCBzdHlsZT0iYmFja2dyb3VuZDonK0NOVkNPTE9SKyc7d2hpdGUtc3BhY2U6bm93cmFwOyI+eCA9ICcrCgkJCW1rTnVtU3RyKHgtZ19wYWdlWCtNYXRoLnJvdW5kKGdfeGEvZ19keCksIGdfZHgpKycmbmJzcDs8YnI+eSA9ICcrCgkJCW1rTnVtU3RyKGdfaC15K2dfcGFnZVkrTWF0aC5yb3VuZChnX3lhL2dfZHkpLCBnX2R5KSsnJm5ic3A7PFwvc21hbGw+JywKCQkJZmFsc2UKCQkpOwoJCWlmIChnX2Nvb3JkdGlwLnN0eWxlLnZpc2liaWxpdHkgPT0gJ2hpZGRlbicpIGdfY29vcmR0aXAuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKCX0KCWVsc2UgZ19jb29yZHRpcC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7Cn0KCgpkb2N1bWVudC53cml0ZShnX2llPyBnUmVwbGFjZShta0RpdignJywgJycsIDAsIDAsIDAsIDAsICcnLCAnY29vcmR0aXAnLCB0cnVlKSkgOiBta0RpdignJywgJycsIDAsIDAsIDAsIDAsICcnLCAnY29vcmR0aXAnLCB0cnVlKSk7CndpbmRvdy5vbmxvYWQgPSBpbml0Owo=