إن Friction Force and Transmission Efficiency Calculator is a practical engineering tool designed to calculate friction force, power loss, output power, and mechanical transmission efficiency. By entering parameters such as normal force, friction coefficient, speed, torque, and input power, users can quickly evaluate energy losses and transmission performance. The Friction Force and Transmission Efficiency Calculator helps engineers optimize mechanical systems, improve power transfer efficiency, reduce friction-related heat, and support reliable machine and transmission design.
LyoqDQogKiBGcmljdGlvbiBGb3JjZSBhbmQgVHJhbnNtaXNzaW9uIEVmZmljaWVuY3kgQ2FsY3VsYXRvcg0KICogU2NvcGVkIGZvciBXb3JkUHJlc3MgZW1iZWQg4oCUICNmcmljdGlvbi10cmFuc21pc3Npb24tZWZmaWNpZW5jeS1jYWxjdWxhdG9yDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgdmFyIFJPT1RfSUQgPSAnZnJpY3Rpb24tdHJhbnNtaXNzaW9uLWVmZmljaWVuY3ktY2FsY3VsYXRvcic7DQogICAgdmFyIE5fVE9fS04gPSAwLjAwMTsNCiAgICB2YXIgS05fVE9fTiA9IDEwMDA7DQogICAgdmFyIE5fVE9fTEJGID0gMC4yMjQ4MDg5NDM7DQogICAgdmFyIExCRl9UT19OID0gMSAvIE5fVE9fTEJGOw0KICAgIHZhciBOTV9UT19MQkZGVCA9IDAuNzM3NTYyMTQ5Ow0KICAgIHZhciBMQkZGVF9UT19OTSA9IDEgLyBOTV9UT19MQkZGVDsNCiAgICB2YXIgV19UT19LVyA9IDAuMDAxOw0KICAgIHZhciBLV19UT19XID0gMTAwMDsNCiAgICB2YXIgV19UT19IUCA9IDAuMDAxMzQxMDI7DQogICAgdmFyIEhQX1RPX1cgPSAxIC8gV19UT19IUDsNCiAgICB2YXIgRlRTX1RPX01QUyA9IDAuMzA0ODsNCiAgICB2YXIgTVBTX1RPX0ZUUyA9IDEgLyBGVFNfVE9fTVBTOw0KICAgIHZhciBGVFBNX1RPX01QUyA9IDAuMDA1MDg7DQogICAgdmFyIE1QU19UT19GVFBNID0gMSAvIEZUUE1fVE9fTVBTOw0KICAgIHZhciBHQVVHRV9BUkMgPSAyODIuNzQzOw0KICAgIHZhciBOQSA9ICfigJQnOw0KICAgIHZhciBQSTIgPSAyICogTWF0aC5QSTsNCg0KICAgIHZhciBNQVRFUklBTF9QUkVTRVRTID0gew0KICAgICAgICAnc3RlZWwtc3RlZWwnOiB7DQogICAgICAgICAgICBsYWJlbDogJ1N0ZWVsIG9uIFN0ZWVsJywNCiAgICAgICAgICAgIGRyeTogeyBtdXM6IDAuNzQsIG11azogMC41NyB9LA0KICAgICAgICAgICAgbGlnaHQ6IHsgbXVzOiAwLjE1LCBtdWs6IDAuMTAgfSwNCiAgICAgICAgICAgIG9pbDogeyBtdXM6IDAuMTIsIG11azogMC4wOCB9LA0KICAgICAgICAgICAgZ3JlYXNlOiB7IG11czogMC4xNCwgbXVrOiAwLjA5IH0sDQogICAgICAgICAgICBleGNlbGxlbnQ6IHsgbXVzOiAwLjA4LCBtdWs6IDAuMDUgfSwNCiAgICAgICAgICAgIGN1c3RvbTogbnVsbA0KICAgICAgICB9LA0KICAgICAgICAnc3RlZWwtYnJvbnplJzogew0KICAgICAgICAgICAgbGFiZWw6ICdTdGVlbCBvbiBCcm9uemUnLA0KICAgICAgICAgICAgZHJ5OiB7IG11czogMC4zNSwgbXVrOiAwLjI4IH0sDQogICAgICAgICAgICBsaWdodDogeyBtdXM6IDAuMTgsIG11azogMC4xNCB9LA0KICAgICAgICAgICAgb2lsOiB7IG11czogMC4xMiwgbXVrOiAwLjEwIH0sDQogICAgICAgICAgICBncmVhc2U6IHsgbXVzOiAwLjE0LCBtdWs6IDAuMTEgfSwNCiAgICAgICAgICAgIGV4Y2VsbGVudDogeyBtdXM6IDAuMDgsIG11azogMC4wNiB9LA0KICAgICAgICAgICAgY3VzdG9tOiBudWxsDQogICAgICAgIH0sDQogICAgICAgICdzdGVlbC1jYXN0LWlyb24nOiB7DQogICAgICAgICAgICBsYWJlbDogJ1N0ZWVsIG9uIENhc3QgSXJvbicsDQogICAgICAgICAgICBkcnk6IHsgbXVzOiAwLjQwLCBtdWs6IDAuMzAgfSwNCiAgICAgICAgICAgIGxpZ2h0OiB7IG11czogMC4xOCwgbXVrOiAwLjE0IH0sDQogICAgICAgICAgICBvaWw6IHsgbXVzOiAwLjEyLCBtdWs6IDAuMTAgfSwNCiAgICAgICAgICAgIGdyZWFzZTogeyBtdXM6IDAuMTUsIG11azogMC4xMSB9LA0KICAgICAgICAgICAgZXhjZWxsZW50OiB7IG11czogMC4wOSwgbXVrOiAwLjA2IH0sDQogICAgICAgICAgICBjdXN0b206IG51bGwNCiAgICAgICAgfSwNCiAgICAgICAgJ3N0ZWVsLXB0ZmUnOiB7DQogICAgICAgICAgICBsYWJlbDogJ1N0ZWVsIG9uIFBURkUnLA0KICAgICAgICAgICAgZHJ5OiB7IG11czogMC4xMCwgbXVrOiAwLjA4IH0sDQogICAgICAgICAgICBsaWdodDogeyBtdXM6IDAuMDgsIG11azogMC4wNiB9LA0KICAgICAgICAgICAgb2lsOiB7IG11czogMC4wNiwgbXVrOiAwLjA0IH0sDQogICAgICAgICAgICBncmVhc2U6IHsgbXVzOiAwLjA3LCBtdWs6IDAuMDUgfSwNCiAgICAgICAgICAgIGV4Y2VsbGVudDogeyBtdXM6IDAuMDQsIG11azogMC4wMyB9LA0KICAgICAgICAgICAgY3VzdG9tOiBudWxsDQogICAgICAgIH0sDQogICAgICAgICdhbHVtaW51bS1zdGVlbCc6IHsNCiAgICAgICAgICAgIGxhYmVsOiAnQWx1bWludW0gb24gU3RlZWwnLA0KICAgICAgICAgICAgZHJ5OiB7IG11czogMC40NSwgbXVrOiAwLjM1IH0sDQogICAgICAgICAgICBsaWdodDogeyBtdXM6IDAuMjIsIG11azogMC4xNiB9LA0KICAgICAgICAgICAgb2lsOiB7IG11czogMC4xNiwgbXVrOiAwLjEyIH0sDQogICAgICAgICAgICBncmVhc2U6IHsgbXVzOiAwLjE4LCBtdWs6IDAuMTMgfSwNCiAgICAgICAgICAgIGV4Y2VsbGVudDogeyBtdXM6IDAuMTAsIG11azogMC4wNyB9LA0KICAgICAgICAgICAgY3VzdG9tOiBudWxsDQogICAgICAgIH0sDQogICAgICAgIGN1c3RvbTogeyBsYWJlbDogJ0N1c3RvbScsIGRyeTogbnVsbCwgbGlnaHQ6IG51bGwsIG9pbDogbnVsbCwgZ3JlYXNlOiBudWxsLCBleGNlbGxlbnQ6IG51bGwsIGN1c3RvbTogbnVsbCB9DQogICAgfTsNCg0KICAgIHZhciBMVUJFX0xBQkVMUyA9IHsNCiAgICAgICAgZHJ5OiAnRHJ5JywNCiAgICAgICAgbGlnaHQ6ICdMaWdodCBMdWJyaWNhdGlvbicsDQogICAgICAgIG9pbDogJ09pbCBMdWJyaWNhdGVkJywNCiAgICAgICAgZ3JlYXNlOiAnR3JlYXNlIEx1YnJpY2F0ZWQnLA0KICAgICAgICBleGNlbGxlbnQ6ICdFeGNlbGxlbnQgTHVicmljYXRpb24nLA0KICAgICAgICBjdXN0b206ICdDdXN0b20nDQogICAgfTsNCg0KICAgIHZhciBERUZBVUxUUyA9IHsNCiAgICAgICAgdW5pdDogJ21ldHJpYycsDQogICAgICAgIG1vZGU6ICdjb21iaW5lZCcsDQogICAgICAgIG1vdGlvbjogJ2xpbmVhcicsDQogICAgICAgIG5vcm1hbEZvcmNlOiA1MDAwLA0KICAgICAgICBub3JtYWxGb3JjZVVuaXQ6ICdOJywNCiAgICAgICAgbXVzOiAnJywNCiAgICAgICAgbXVrOiAwLjEyLA0KICAgICAgICBzbGlkaW5nU3BlZWQ6IDAuNSwNCiAgICAgICAgc2xpZGluZ1NwZWVkVW5pdDogJ20vcycsDQogICAgICAgIGZyaWN0aW9uVG9ycXVlOiAnJywNCiAgICAgICAgZnJpY3Rpb25Ub3JxdWVVbml0OiAnTsK3bScsDQogICAgICAgIHJwbTogJycsDQogICAgICAgIGlucHV0UG93ZXI6IDIsDQogICAgICAgIGlucHV0UG93ZXJVbml0OiAna1cnLA0KICAgICAgICBpbnB1dFRvcnF1ZTogJycsDQogICAgICAgIGlucHV0VG9ycXVlVW5pdDogJ07Ct20nLA0KICAgICAgICBvdXRwdXRUb3JxdWU6ICcnLA0KICAgICAgICBvdXRwdXRUb3JxdWVVbml0OiAnTsK3bScsDQogICAgICAgIGlucHV0U3BlZWQ6ICcnLA0KICAgICAgICBvdXRwdXRTcGVlZDogJycsDQogICAgICAgIGx1YmU6ICdvaWwnLA0KICAgICAgICBtYXRlcmlhbDogJ3N0ZWVsLWJyb256ZScsDQogICAgICAgIHRlbXA6ICcnDQogICAgfTsNCg0KICAgIHZhciByb290LCBlbHMsIHN0YXRlLCBtYW51YWxNdU92ZXJyaWRlOw0KDQogICAgZnVuY3Rpb24gJChpZCkgew0KICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwYXJzZU51bSh2KSB7DQogICAgICAgIGlmICh2ID09PSAnJyB8fCB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7DQogICAgICAgIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodikucmVwbGFjZSgnLCcsICcuJykpOw0KICAgICAgICByZXR1cm4gaXNOYU4obikgPyBudWxsIDogbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmbXQodiwgZCkgew0KICAgICAgICBpZiAoIWlzRmluaXRlKHYpKSByZXR1cm4gTkE7DQogICAgICAgIHJldHVybiB2LnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsNCiAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZCwNCiAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMA0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzZXRWaXNpYmxlKG5vZGVzLCBzaG93KSB7DQogICAgICAgIFtdLmZvckVhY2guY2FsbChub2RlcywgZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBpZiAoIWVsKSByZXR1cm47DQogICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdmdGVjLWhpZGRlbicsICFzaG93KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NZXRyaWNGb3JjZSh2LCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAnTicpIHJldHVybiB2Ow0KICAgICAgICBpZiAodW5pdCA9PT0gJ2tOJykgcmV0dXJuIHYgKiBLTl9UT19OOw0KICAgICAgICByZXR1cm4gdiAqIExCRl9UT19OOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZyb21NZXRyaWNGb3JjZSh2LCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAnTicpIHJldHVybiB2Ow0KICAgICAgICBpZiAodW5pdCA9PT0gJ2tO JykgcmV0dXJuIHYgKiBOX1RPX0tOOw0KICAgICAgICByZXR1cm4gdiAqIE5fVE9fTEJGOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljVG9ycXVlKHYsIHVuaXQpIHsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdOwrdtJykgcmV0dXJuIHY7DQogICAgICAgIHJldHVybiB2ICogTEJGRlRfVE9fTk07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZnJvbU1ldHJpY1RvcnF1ZSh2LCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAnTsK3bScpIHJldHVybiB2Ow0KICAgICAgICByZXR1cm4gdiAqIE5NX1RPX0xCRkZUOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljUG93ZXIodiwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ1cnKSByZXR1cm4gdjsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdrVycpIHJldHVybiB2ICogS1dfVE9fVzsNCiAgICAgICAgcmV0dXJuIHYgKiBIUF9UT19XOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZyb21NZXRyaWNQb3dlcih2LCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAnVycpIHJldHVybiB2Ow0KICAgICAgICBpZiAodW5pdCA9PT0gJ2tXJykgcmV0dXJuIHYgKiBXX1RPX0tXOw0KICAgICAgICByZXR1cm4gdiAqIFdfVE9fSFA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NZXRyaWNTcGVlZCh2LCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAnbS9zJykgcmV0dXJuIHY7DQogICAgICAgIGlmICh1bml0ID09PSAnZnQvcycpIHJldHVybiB2ICogRlRTX1RPX01QUzsNCiAgICAgICAgcmV0dXJuIHYgKiBGVFBNX1RPX01QUzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmcm9tTWV0cmljU3BlZWQodiwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ20vcycpIHJldHVybiB2Ow0KICAgICAgICBpZiAodW5pdCA9PT0gJ2Z0L3MnKSByZXR1cm4gdiAqIE1QU19UT19GVFM7DQogICAgICAgIHJldHVybiB2ICogTVBTX1RPX0ZUUE07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcnBtVG9PbWVnYShycG0pIHsNCiAgICAgICAgcmV0dXJuIFBJMiAqIHJwbSAvIDYwOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGlzTGluZWFyTW90aW9uKCkgew0KICAgICAgICByZXR1cm4gc3RhdGUubW90aW9uID09PSAnbGluZWFyJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpc1JvdGF0aW9uYWxNb3Rpb24oKSB7DQogICAgICAgIHJldHVybiBzdGF0ZS5tb3Rpb24gIT09ICdsaW5lYXInOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG1vZGVOZWVkc1Bvd2VyKCkgew0KICAgICAgICByZXR1cm4gc3RhdGUubW9kZSA9PT0gJ3Bvd2VyLWxvc3MnIHx8IHN0YXRlLm1vZGUgPT09ICdlZmZpY2llbmN5JyB8fCBzdGF0ZS5tb2RlID09PSAnY29tYmluZWQnOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG1vZGVOZWVkc0VmZmljaWVuY3koKSB7DQogICAgICAgIHJldHVybiBzdGF0ZS5tb2RlID09PSAnZWZmaWNpZW5jeScgfHwgc3RhdGUubW9kZSA9PT0gJ2NvbWJpbmVkJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKSB7DQogICAgICAgIHZhciBsaW5lYXIgPSBpc0xpbmVhck1vdGlvbigpOw0KICAgICAgICB2YXIgcm90YXRpb25hbCA9IGlzUm90YXRpb25hbE1vdGlvbigpOw0KICAgICAgICB2YXIgbmVlZHNQb3dlciA9IG1vZGVOZWVkc1Bvd2VyKCk7DQogICAgICAgIHZhciBuZWVkc0VmZiA9IG1vZGVOZWVkc0VmZmljaWVuY3koKTsNCg0KICAgICAgICBzZXRWaXNpYmxlKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmZ0ZWMtZmllbGQtbGluZWFyJyksIGxpbmVhcik7DQogICAgICAgIHNldFZpc2libGUocm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuZnRlYy1maWVsZC1yb3RhdGlvbmFsJyksIHJvdGF0aW9uYWwpOw0KICAgICAgICBzZXRWaXNpYmxlKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmZ0ZWMtZmllbGQtcG93ZXInKSwgbmVlZHNQb3dlcik7DQogICAgICAgIHNldFZpc2libGUocm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuZnRlYy1maWVsZC10b3JxdWUtZWZmJyksIG5lZWRzRWZmICYmIHJvdGF0aW9uYWwpOw0KICAgICAgICBzZXRWaXNpYmxlKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmZ0ZWMtZmllbGQtcnBtJyksIHJvdGF0aW9uYWwgJiYgbmVlZHNQb3dlcik7DQogICAgICAgIHNldFZpc2libGUocm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuZnRlYy1maWVsZC1mcmljdGlvbicpLCBzdGF0ZS5tb2RlICE9PSAnZWZmaWNpZW5jeScgfHwgbGluZWFyKTsNCg0KICAgICAgICB2YXIgbW9kZU5vdGVzID0gew0KICAgICAgICAgICAgJ2ZyaWN0aW9uLWZvcmNlJzogJ0NhbGN1bGF0ZSBzdGF0aWMgYW5kIGtpbmV0aWMgZnJpY3Rpb24gZm9yY2UgZnJvbSBub3JtYWwgbG9hZCBhbmQgZnJpY3Rpb24gY29lZmZpY2llbnRzLicsDQogICAgICAgICAgICAncG93ZXItbG9zcyc6ICdDYWxjdWxhdGUgZnJpY3Rpb25hbCBwb3dlciBsb3NzIGZyb20gZnJpY3Rpb24gZm9yY2UvdG9ycXVlIGFuZCBzcGVlZC4nLA0KICAgICAgICAgICAgJ2VmZmljaWVuY3knOiAnQ2FsY3VsYXRlIHRyYW5zbWlzc2lvbiBlZmZpY2llbmN5IGZyb20gaW5wdXQvb3V0cHV0IHBvd2VyIG9yIHRvcnF1ZSBhbmQgc3BlZWQuJywNCiAgICAgICAgICAgIGNvbWJpbmVkOiAnQ29tcGxldGUgZnJpY3Rpb24gZm9yY2UsIHBvd2VyIGxvc3MsIG91dHB1dCBwb3dlciwgZWZmaWNpZW5jeSwgYW5kIHJpc2sgYW5hbHlzaXMuJw0KICAgICAgICB9Ow0KICAgICAgICBpZiAoZWxzLm1vZGVOb3RlKSB7DQogICAgICAgICAgICBlbHMubW9kZU5vdGUudGV4dENvbnRlbnQgPSBtb2RlTm90ZXNbc3RhdGUubW9kZV0gfHwgJyc7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVVbml0TGFiZWxzKCkgew0KICAgICAgICB2YXIgbWV0cmljID0gc3RhdGUudW5pdCA9PT0gJ21ldHJpYyc7DQogICAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdW5pdD0ic3BlZWQiXScpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IG1ldHJpYyA/ICdtL3MnIDogJ2Z0L21pbic7DQogICAgICAgIH0pOw0KICAgICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXVuaXQ9InRlbXAiXScpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IG1ldHJpYyA/ICfCsEMnIDogJ8KwRic7DQogICAgICAgIH0pOw0KICAgICAgICBpZiAoZWxzLnNsaWRpbmdTcGVlZFVuaXQpIHsNCiAgICAgICAgICAgIGVscy5zbGlkaW5nU3BlZWRVbml0LmlubmVySFRNTCA9IG1ldHJpYw0KICAgICAgICAgICAgICAgID8gJzxvcHRpb24gdmFsdWU9Im0vcyI+bS9zPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZnQvcyI+ZnQvczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImZ0L21pbiI+ZnQvbWluPC9vcHRpb24+Jw0KICAgICAgICAgICAgICAgIDogJzxvcHRpb24gdmFsdWU9ImZ0L21pbiI+ZnQvbWluPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZnQvcyI+ZnQvczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im0vcyI+bS9zPC9vcHRpb24+JzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFwcGx5TWF0ZXJpYWxQcmVzZXQoKSB7DQogICAgICAgIGlmIChtYW51YWxNdU92ZXJyaWRlKSByZXR1cm47DQogICAgICAgIHZhciBtYXQgPSBNQVRFUklBTF9QUkVTRVRTW3N0YXRlLm1hdGVyaWFsXTsNCiAgICAgICAgaWYgKCFtYXQpIHJldHVybjsNCiAgICAgICAgdmFyIHByZXNldCA9IG1hdFtzdGF0ZS5sdWJlXTsNCiAgICAgICAgaWYgKCFwcmVzZXQpIHsNCiAgICAgICAgICAgIGlmIChlbHMucHJlc2V0SGludCkgew0KICAgICAgICAgICAgICAgIGVscy5wcmVzZXRIaW50LnRleHRDb250ZW50ID0gJ0N1c3RvbSBtYXRlcmlhbC9sdWJyaWNhdGlvbiDigJQgZW50ZXIgZnJpY3Rpb24gY29lZmZpY2llbnRzIG1hbnVhbGx5Lic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5tdXMgJiYgIWVscy5tdXMudmFsdWUpIHsNCiAgICAgICAgICAgIGVscy5tdXMucGxhY2Vob2xkZXIgPSAnVHlwaWNhbDogJyArIHByZXNldC5tdXM7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5tdWspIHsNCiAgICAgICAgICAgIGVscy5tdWsudmFsdWUgPSBwcmVzZXQubXVrOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMucHJlc2V0SGludCkgew0KICAgICAgICAgICAgZWxzLnByZXNldEhpbnQudGV4dENvbnRlbnQgPSBtYXQubGFiZWwgKyAnIC8gJyArIExVQkVfTEFCRUxTW3N0YXRlLmx1YmVdICsNCiAgICAgICAgICAgICAgICAnIOKAlCB0eXBpY2FsIHJhbmdlOiDOvHMg4omIICcgKyBwcmVzZXQubXVzICsgJywgzrxrIOKJiCAnICsgcHJlc2V0Lm11ayArDQogICAgICAgICAgICAgICAgJyAoZWRpdGFibGU7IG5vdCB1bml2ZXJzYWwgY29uc3RhbnRzKS4nOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVhZElucHV0cygp IHsNCiAgICAgICAgc3RhdGUubW9kZSA9IGVscy5tb2RlLnZhbHVlOw0KICAgICAgICBzdGF0ZS5tb3Rpb24gPSBlbHMubW90aW9uLnZhbHVlOw0KICAgICAgICBzdGF0ZS51bml0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJmdGVjLXVuaXRTeXN0ZW0iXTpjaGVja2VkJykudmFsdWU7DQogICAgICAgIHN0YXRlLmx1YmUgPSBlbHMubHViZS52YWx1ZTsNCiAgICAgICAgc3RhdGUubWF0ZXJpYWwgPSBlbHMubWF0ZXJpYWwudmFsdWU7DQoNCiAgICAgICAgdmFyIE4gPSB0b01ldHJpY0ZvcmNlKHBhcnNlTnVtKGVscy5ub3JtYWxGb3JjZS52YWx1ZSkgfHwgMCwgZWxzLm5vcm1hbEZvcmNlVW5pdC52YWx1ZSk7DQogICAgICAgIHZhciBtdXNWYWwgPSBwYXJzZU51bShlbHMubXVzLnZhbHVlKTsNCiAgICAgICAgdmFyIG11a1ZhbCA9IHBhcnNlTnVtKGVscy5tdWsudmFsdWUpOw0KICAgICAgICB2YXIgdiA9IHBhcnNlTnVtKGVscy5zbGlkaW5nU3BlZWQudmFsdWUpOw0KICAgICAgICB2YXIgdlVuaXQgPSBlbHMuc2xpZGluZ1NwZWVkVW5pdCA/IGVscy5zbGlkaW5nU3BlZWRVbml0LnZhbHVlIDogJ20vcyc7DQogICAgICAgIHZhciBUZiA9IHBhcnNlTnVtKGVscy5mcmljdGlvblRvcnF1ZS52YWx1ZSk7DQogICAgICAgIHZhciBUZlVuaXQgPSBlbHMuZnJpY3Rpb25Ub3JxdWVVbml0LnZhbHVlOw0KICAgICAgICB2YXIgcnBtID0gcGFyc2VOdW0oZWxzLnJwbS52YWx1ZSk7DQogICAgICAgIHZhciBQaW4gPSBwYXJzZU51bShlbHMuaW5wdXRQb3dlci52YWx1ZSk7DQogICAgICAgIHZhciBQaW5Vbml0ID0gZWxzLmlucHV0UG93ZXJVbml0LnZhbHVlOw0KICAgICAgICB2YXIgVGluID0gcGFyc2VOdW0oZWxzLmlucHV0VG9ycXVlLnZhbHVlKTsNCiAgICAgICAgdmFyIFRpblVuaXQgPSBlbHMuaW5wdXRUb3JxdWVVbml0LnZhbHVlOw0KICAgICAgICB2YXIgVG91dCA9IHBhcnNlTnVtKGVscy5vdXRwdXRUb3JxdWUudmFsdWUpOw0KICAgICAgICB2YXIgVG91dFVuaXQgPSBlbHMub3V0cHV0VG9ycXVlVW5pdC52YWx1ZTsNCiAgICAgICAgdmFyIG5pbiA9IHBhcnNlTnVtKGVscy5pbnB1dFNwZWVkLnZhbHVlKTsNCiAgICAgICAgdmFyIG5vdXQgPSBwYXJzZU51bShlbHMub3V0cHV0U3BlZWQudmFsdWUpOw0KICAgICAgICB2YXIgdGVtcCA9IHBhcnNlTnVtKGVscy50ZW1wLnZhbHVlKTsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgTjogTiwNCiAgICAgICAgICAgIG11czogbXVzVmFsLA0KICAgICAgICAgICAgbXVrOiBtdWtWYWwgIT09IG51bGwgPyBtdWtWYWwgOiAwLA0KICAgICAgICAgICAgdjogdiAhPT0gbnVsbCA/IHRvTWV0cmljU3BlZWQodiwgdlVuaXQpIDogbnVsbCwNCiAgICAgICAgICAgIFRmOiBUZiAhPT0gbnVsbCA/IHRvTWV0cmljVG9ycXVlKFRmLCBUZlVuaXQpIDogbnVsbCwNCiAgICAgICAgICAgIHJwbTogcnBtLA0KICAgICAgICAgICAgUGluOiBQaW4gIT09IG51bGwgPyB0b01ldHJpY1Bvd2VyKFBpbiwgUGluVW5pdCkgOiBudWxsLA0KICAgICAgICAgICAgVGluOiBUaW4gIT09IG51bGwgPyB0b01ldHJpY1RvcnF1ZShUaW4sIFRpblVuaXQpIDogbnVsbCwNCiAgICAgICAgICAgIFRvdXQ6IFRvdXQgIT09IG51bGwgPyB0b01ldHJpY1RvcnF1ZShUb3V0LCBUb3V0VW5pdCkgOiBudWxsLA0KICAgICAgICAgICAgbmluOiBuaW4sDQogICAgICAgICAgICBub3V0OiBub3V0LA0KICAgICAgICAgICAgdGVtcDogdGVtcA0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlKGlucCkgew0KICAgICAgICB2YXIgZXJyb3JzID0gW107DQogICAgICAgIHZhciB3YXJuaW5ncyA9IFtdOw0KDQogICAgICAgIGlmIChpbnAuTiA8IDApIGVycm9ycy5wdXNoKCdOb3JtYWwgZm9yY2UgY2Fubm90IGJlIG5lZ2F0aXZlLicpOw0KICAgICAgICBpZiAoaW5wLm11ayA8IDApIGVycm9ycy5wdXNoKCdLaW5ldGljIGZyaWN0aW9uIGNvZWZmaWNpZW50IG11c3QgYmUgbm9uLW5lZ2F0aXZlLicpOw0KICAgICAgICBpZiAoaW5wLm11cyAhPT0gbnVsbCAmJiBpbnAubXVzIDwgMCkgZXJyb3JzLnB1c2goJ1N0YXRpYyBmcmljdGlvbiBjb2VmZmljaWVudCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4nKTsNCiAgICAgICAgaWYgKGlucC5QaW4gIT09IG51bGwgJiYgaW5wLlBpbiA8IDApIGVycm9ycy5wdXNoKCdJbnB1dCBwb3dlciBjYW5ub3QgYmUgbmVnYXRpdmUuJyk7DQoNCiAgICAgICAgaWYgKGlzTGluZWFyTW90aW9uKCkpIHsNCiAgICAgICAgICAgIGlmIChtb2RlTmVlZHNQb3dlcigpICYmIChpbnAudiA9PT0gbnVsbCB8fCBpbnAudiA8IDApKSB7DQogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goJ0VudGVyIGEgdmFsaWQgbm9uLW5lZ2F0aXZlIHNsaWRpbmcgc3BlZWQgZm9yIHBvd2VyIGxvc3MgY2FsY3VsYXRpb24uJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAobW9kZU5lZWRzUG93ZXIoKSAmJiBpbnAucnBtID09PSBudWxsICYmIGlucC5uaW4gPT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCgnRW50ZXIgcm90YXRpb25hbCBzcGVlZCAocnBtKSBmb3IgcG93ZXIgY2FsY3VsYXRpb25zLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09ICdmcmljdGlvbi1mb3JjZScgJiYgaW5wLk4gPD0gMCkgew0KICAgICAgICAgICAgZXJyb3JzLnB1c2goJ0VudGVyIGEgcG9zaXRpdmUgbm9ybWFsIGZvcmNlLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHsgZXJyb3JzOiBlcnJvcnMsIHdhcm5pbmdzOiB3YXJuaW5ncyB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNvbXB1dGUoaW5wKSB7DQogICAgICAgIHZhciByZXN1bHQgPSB7DQogICAgICAgICAgICBGZjogbnVsbCwNCiAgICAgICAgICAgIEZzTWF4OiBudWxsLA0KICAgICAgICAgICAgVGY6IG51bGwsDQogICAgICAgICAgICBvbWVnYTogbnVsbCwNCiAgICAgICAgICAgIFBpbjogaW5wLlBpbiwNCiAgICAgICAgICAgIFBsb3NzOiBudWxsLA0KICAgICAgICAgICAgUG91dDogbnVsbCwNCiAgICAgICAgICAgIGV0YTogbnVsbCwNCiAgICAgICAgICAgIGV0YUxvc3M6IG51bGwsDQogICAgICAgICAgICBsb3NzUmF0aW86IG51bGwsDQogICAgICAgICAgICBoZWF0OiBudWxsLA0KICAgICAgICAgICAgd2FybmluZ3M6IFtdDQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIG11ayA9IGlucC5tdWs7DQogICAgICAgIHZhciBtdXMgPSBpbnAubXVzICE9PSBudWxsID8gaW5wLm11cyA6IG11ayAqIDEuMjsNCg0KICAgICAgICBpZiAoaXNMaW5lYXJNb3Rpb24oKSkgew0KICAgICAgICAgICAgcmVzdWx0LkZmID0gbXVrICogaW5wLk47DQogICAgICAgICAgICByZXN1bHQuRnNNYXggPSBtdXMgKiBpbnAuTjsNCg0KICAgICAgICAgICAgaWYgKGlucC52ICE9PSBudWxsICYmIGlucC52ID49IDApIHsNCiAgICAgICAgICAgICAgICByZXN1bHQuUGxvc3MgPSByZXN1bHQuRmYgKiBpbnAudjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmIChpbnAuVGYgIT09IG51bGwgJiYgaW5wLlRmID49IDApIHsNCiAgICAgICAgICAgICAgICByZXN1bHQuVGYgPSBpbnAuVGY7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGlucC5OID4gMCAmJiBtdWsgPiAwKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LlRmID0gbXVrICogaW5wLk4gKiAwLjA1Ow0KICAgICAgICAgICAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKCdGcmljdGlvbiB0b3JxdWUgZXN0aW1hdGVkIGFzIM68ayDDlyBOIMOXIDAuMDUgbSBlcXVpdmFsZW50IHJhZGl1cy4gRW50ZXIgZnJpY3Rpb24gdG9ycXVlIGRpcmVjdGx5IGZvciBhY2N1cmFjeS4nKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHJwbSA9IGlucC5ycG0gIT09IG51bGwgPyBpbnAucnBtIDogKGlucC5uaW4gIT09IG51bGwgPyBpbnAubmluIDogbnVsbCk7DQogICAgICAgICAgICBpZiAocnBtICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0Lm9tZWdhID0gcnBtVG9PbWVnYShycG0pOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocmVzdWx0LlRmICE9PSBudWxsICYmIHJlc3VsdC5vbWVnYSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5QbG9zcyA9IHJlc3VsdC5UZiAqIHJlc3VsdC5vbWVnYTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmVzdWx0LkZmID0gcmVzdWx0LlRmICE9PSBudWxsID8gcmVzdWx0LlRmIC8gMC4wNSA6IG11ayAqIGlucC5OOw0KICAgICAgICAgICAgcmVzdWx0LkZzTWF4ID0gbXVzICogaW5wLk47DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoaW5wLlRpbiAhPT0gbnVsbCAmJiBpbnAubmluICE9PSBudWxsKSB7DQogICAgICAgICAgICB2YXIgb21lZ2FJbiA9IHJwbVRvT21lZ2EoaW5wLm5pbik7DQogICAgICAgICAgICB2YXIgY2FsY1BpbiA9 IGlucC5UaW4gKiBvbWVnYUluOw0KICAgICAgICAgICAgaWYgKHJlc3VsdC5QaW4gPT09IG51bGwpIHJlc3VsdC5QaW4gPSBjYWxjUGluOw0KICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoY2FsY1BpbiAtIHJlc3VsdC5QaW4pIC8gTWF0aC5tYXgocmVzdWx0LlBpbiwgMSkgPiAwLjA1KSB7DQogICAgICAgICAgICAgICAgcmVzdWx0Lndhcm5pbmdzLnB1c2goJ0lucHV0IHBvd2VyIGRpZmZlcnMgZnJvbSBUaW4gw5cgz4lpbiDigJQgdmVyaWZ5IGNvbnNpc3RlbmN5LicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGlucC5Ub3V0ICE9PSBudWxsICYmIGlucC5ub3V0ICE9PSBudWxsICYmIGlucC5UaW4gIT09IG51bGwgJiYgaW5wLm5pbiAhPT0gbnVsbCkgew0KICAgICAgICAgICAgdmFyIGV0YVRvcnF1ZSA9IChpbnAuVG91dCAqIHJwbVRvT21lZ2EoaW5wLm5vdXQpKSAvIChpbnAuVGluICogcnBtVG9PbWVnYShpbnAubmluKSkgKiAxMDA7DQogICAgICAgICAgICBpZiAobW9kZU5lZWRzRWZmaWNpZW5jeSgpKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LmV0YSA9IGV0YVRvcnF1ZTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LlBpbiAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQuUG91dCA9IHJlc3VsdC5QaW4gKiBldGFUb3JxdWUgLyAxMDA7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5QbG9zcyA9IHJlc3VsdC5QaW4gLSByZXN1bHQuUG91dDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocmVzdWx0LlBpbiAhPT0gbnVsbCAmJiByZXN1bHQuUGxvc3MgIT09IG51bGwgJiYgcmVzdWx0LmV0YSA9PT0gbnVsbCkgew0KICAgICAgICAgICAgaWYgKHJlc3VsdC5QbG9zcyA+IHJlc3VsdC5QaW4pIHsNCiAgICAgICAgICAgICAgICByZXN1bHQud2FybmluZ3MucHVzaCgnRnJpY3Rpb24gcG93ZXIgbG9zcyBleGNlZWRzIGlucHV0IHBvd2VyIOKAlCBjaGVjayBpbnB1dHMuJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXN1bHQuUG91dCA9IHJlc3VsdC5QaW4gLSByZXN1bHQuUGxvc3M7DQogICAgICAgICAgICBpZiAocmVzdWx0LlBvdXQgPCAwKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0Lndhcm5pbmdzLnB1c2goJ0NhbGN1bGF0ZWQgb3V0cHV0IHBvd2VyIGlzIG5lZ2F0aXZlIOKAlCBpbmNvbnNpc3RlbnQgaW5wdXRzLicpOw0KICAgICAgICAgICAgICAgIHJlc3VsdC5Qb3V0ID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXN1bHQuUGluID4gMCkgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5ldGEgPSAocmVzdWx0LlBvdXQgLyByZXN1bHQuUGluKSAqIDEwMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyZXN1bHQuUGluICE9PSBudWxsICYmIHJlc3VsdC5QbG9zcyAhPT0gbnVsbCAmJiByZXN1bHQuUGluID4gMCkgew0KICAgICAgICAgICAgcmVzdWx0Lmxvc3NSYXRpbyA9IChyZXN1bHQuUGxvc3MgLyByZXN1bHQuUGluKSAqIDEwMDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyZXN1bHQuZXRhICE9PSBudWxsKSB7DQogICAgICAgICAgICByZXN1bHQuZXRhTG9zcyA9IDEwMCAtIHJlc3VsdC5ldGE7DQogICAgICAgICAgICBpZiAocmVzdWx0LmV0YSA+IDEwMCkgew0KICAgICAgICAgICAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKCdFZmZpY2llbmN5IGV4Y2VlZHMgMTAwJSDigJQgaW5wdXQgdmFsdWVzIG1heSBiZSBpbmNvbnNpc3RlbnQuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocmVzdWx0LlBsb3NzICE9PSBudWxsKSB7DQogICAgICAgICAgICByZXN1bHQuaGVhdCA9IHJlc3VsdC5QbG9zczsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChzdGF0ZS5sdWJlID09PSAnZHJ5JyAmJiBpc0xpbmVhck1vdGlvbigpICYmIGlucC52ICE9PSBudWxsICYmIGlucC52ID4gMSAmJiBpbnAuTiA+IDEwMDApIHsNCiAgICAgICAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKCdEcnkgb3BlcmF0aW9uIHdpdGggaGlnaCBzcGVlZCBhbmQgbG9hZCDigJQgZWxldmF0ZWQgd2VhciBhbmQgaGVhdGluZyByaXNrLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmVzdWx0LmVmZlN0YXR1cyA9IGNsYXNzaWZ5RWZmaWNpZW5jeShyZXN1bHQuZXRhKTsNCiAgICAgICAgcmVzdWx0LmZyaWN0aW9uUmlzayA9IGNsYXNzaWZ5RnJpY3Rpb25SaXNrKG11aywgcmVzdWx0LlBsb3NzLCByZXN1bHQuZXRhLCBzdGF0ZS5sdWJlLCBpbnAudGVtcCk7DQoNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjbGFzc2lmeUVmZmljaWVuY3koZXRhKSB7DQogICAgICAgIGlmIChldGEgPT09IG51bGwpIHJldHVybiB7IGxhYmVsOiBOQSwgY2xzOiAnJyB9Ow0KICAgICAgICBpZiAoZXRhID49IDkwKSByZXR1cm4geyBsYWJlbDogJ0hpZ2ggRWZmaWNpZW5jeScsIGNsczogJ2Z0ZWMtc3RhdHVzLWdvb2QnIH07DQogICAgICAgIGlmIChldGEgPj0gNzUpIHJldHVybiB7IGxhYmVsOiAnQWNjZXB0YWJsZScsIGNsczogJ2Z0ZWMtc3RhdHVzLXdhcm4nIH07DQogICAgICAgIHJldHVybiB7IGxhYmVsOiAnTG93IEVmZmljaWVuY3knLCBjbHM6ICdmdGVjLXN0YXR1cy1iYWQnIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2xhc3NpZnlGcmljdGlvblJpc2sobXVrLCBQbG9zcywgZXRhLCBsdWJlLCB0ZW1wKSB7DQogICAgICAgIHZhciBzY29yZSA9IDA7DQogICAgICAgIGlmIChtdWsgPiAwLjMpIHNjb3JlICs9IDI7DQogICAgICAgIGVsc2UgaWYgKG11ayA+IDAuMTUpIHNjb3JlICs9IDE7DQogICAgICAgIGlmIChsdWJlID09PSAnZHJ5Jykgc2NvcmUgKz0gMjsNCiAgICAgICAgZWxzZSBpZiAobHViZSA9PT0gJ2xpZ2h0Jykgc2NvcmUgKz0gMTsNCiAgICAgICAgaWYgKFBsb3NzICE9PSBudWxsICYmIFBsb3NzID4gNTAwMCkgc2NvcmUgKz0gMTsNCiAgICAgICAgaWYgKGV0YSAhPT0gbnVsbCAmJiBldGEgPCA3NSkgc2NvcmUgKz0gMjsNCiAgICAgICAgZWxzZSBpZiAoZXRhICE9PSBudWxsICYmIGV0YSA8IDg1KSBzY29yZSArPSAxOw0KICAgICAgICBpZiAodGVtcCAhPT0gbnVsbCAmJiB0ZW1wID4gODApIHNjb3JlICs9IDE7DQoNCiAgICAgICAgaWYgKHNjb3JlID49IDQpIHJldHVybiB7IGxhYmVsOiAnSGlnaCcsIGNsczogJ2Z0ZWMtcmlzay1oaWdoJyB9Ow0KICAgICAgICBpZiAoc2NvcmUgPj0gMikgcmV0dXJuIHsgbGFiZWw6ICdNb2RlcmF0ZScsIGNsczogJ2Z0ZWMtcmlzay1tb2RlcmF0ZScgfTsNCiAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICdMb3cnLCBjbHM6ICdmdGVjLXJpc2stbG93JyB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJ1aWxkUmVjb21tZW5kYXRpb25zKHJlcywgaW5wKSB7DQogICAgICAgIHZhciByZWNzID0gW107DQogICAgICAgIGlmIChpbnAubXVrID4gMC4yKSB7DQogICAgICAgICAgICByZWNzLnB1c2goJ0ZyaWN0aW9uIGNvZWZmaWNpZW50IGlzIHJlbGF0aXZlbHkgaGlnaCDigJQgY29uc2lkZXIgaW1wcm92aW5nIGx1YnJpY2F0aW9uIG9yIHVzaW5nIGEgbG93ZXItZnJpY3Rpb24gbWF0ZXJpYWwgcGFpci4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoc3RhdGUubHViZSA9PT0gJ2RyeScpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnRHJ5IGNvbnRhY3QgaW5jcmVhc2VzIGZyaWN0aW9uIGFuZCB3ZWFyIOKAlCBhcHBseSBhcHByb3ByaWF0ZSBsdWJyaWNhdGlvbiB3aGVyZSBwb3NzaWJsZS4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzLmV0YSAhPT0gbnVsbCAmJiByZXMuZXRhIDwgODUpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnVHJhbnNtaXNzaW9uIGVmZmljaWVuY3kgaXMgYmVsb3cgdHlwaWNhbCBleHBlY3RhdGlvbnMg4oCUIGluc3BlY3QgYmVhcmluZ3MsIGdlYXJzLCBzZWFscywgYW5kIGFsaWdubWVudC4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzLlBsb3NzICE9PSBudWxsICYmIHJlcy5QbG9zcyA+IDMwMDApIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnU2lnbmlmaWNhbnQgZnJpY3Rpb25hbCBwb3dlciBsb3NzIGRldGVjdGVkIOKAlCB2ZXJpZnkgY29tcG9uZW50IGNvbmRpdGlvbiBhbmQgcmVkdWNlIHVubmVjZXNzYXJ5IHByZWxvYWQgb3Igbm9ybWFsIGZvcmNlLicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChpbnAudGVtcCAhPT0gbnVsbCAmJiBpbnAudGVtcCA+IDcwKSB7DQogICAgICAgICAgICByZWNzLnB1c2goJ09wZXJhdGluZyB0ZW1wZXJhdHVyZSBpcyBlbGV2YXRlZCDigJQgaW1wcm92ZSBjb29saW5nIGFuZCB2ZXJpZnkgbHVicmljYXRpb24gYWRlcXVhY3kuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGlzTGluZWFyTW90aW9uKCkgJiYgaW5wLnYgIT09IG51bGwgJiYgaW5wLnYgPiAyICYmIHJlcy5QbG9zcyAhPT0gbnVsbCAmJiByZXMuUGxvc3MgPiAxMDAwKSB7DQog ICAgICAgICAgICByZWNzLnB1c2goJ0hpZ2ggc2xpZGluZyBzcGVlZCB3aXRoIHN1YnN0YW50aWFsIGZyaWN0aW9uIGhlYXRpbmcg4oCUIGNvbnNpZGVyIHNwZWVkIHJlZHVjdGlvbiBvciBlbmhhbmNlZCBjb29saW5nLicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChyZWNzLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgcmVjcy5wdXNoKCdPcGVyYXRpbmcgcGFyYW1ldGVycyBhcHBlYXIgd2l0aGluIHR5cGljYWwgcmFuZ2VzIOKAlCBjb250aW51ZSBtb25pdG9yaW5nIGx1YnJpY2F0aW9uIGFuZCBhbGlnbm1lbnQgZHVyaW5nIHNlcnZpY2UuJyk7DQogICAgICAgIH0NCiAgICAgICAgcmVjcy5wdXNoKCdWZXJpZnkgbWFudWZhY3R1cmVyIGVmZmljaWVuY3kgZGF0YSBmb3IgZ2VhcmJveGVzIGFuZCB0cmFuc21pc3Npb24gY29tcG9uZW50cyBpbiBjcml0aWNhbCBhcHBsaWNhdGlvbnMuJyk7DQogICAgICAgIHJldHVybiByZWNzOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdEZvcmNlKHZOKSB7DQogICAgICAgIHZhciB1ID0gZWxzLm5vcm1hbEZvcmNlVW5pdC52YWx1ZTsNCiAgICAgICAgcmV0dXJuIGZtdChmcm9tTWV0cmljRm9yY2Uodk4sIHUpLCB1ID09PSAna04nID8gMyA6IDEpICsgJyAnICsgdTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JtYXRUb3JxdWUodk5tKSB7DQogICAgICAgIHZhciB1ID0gZWxzLmZyaWN0aW9uVG9ycXVlVW5pdC52YWx1ZTsNCiAgICAgICAgcmV0dXJuIGZtdChmcm9tTWV0cmljVG9ycXVlKHZObSwgdSksIDIpICsgJyAnICsgdTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JtYXRQb3dlcih2VywgdW5pdCkgew0KICAgICAgICByZXR1cm4gZm10KGZyb21NZXRyaWNQb3dlcih2VywgdW5pdCksIHVuaXQgPT09ICdrVycgPyAzIDogdW5pdCA9PT0gJ2hwJyA/IDIgOiAwKSArICcgJyArIHVuaXQ7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm9ybWF0U3BlZWQodk1wcykgew0KICAgICAgICB2YXIgdSA9IGVscy5zbGlkaW5nU3BlZWRVbml0ID8gZWxzLnNsaWRpbmdTcGVlZFVuaXQudmFsdWUgOiAnbS9zJzsNCiAgICAgICAgcmV0dXJuIGZtdChmcm9tTWV0cmljU3BlZWQodk1wcywgdSksIDMpICsgJyAnICsgdTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJSZXN1bHRzKHJlcywgaW5wKSB7DQogICAgICAgIGlmIChlbHMub3V0RmYpIGVscy5vdXRGZi50ZXh0Q29udGVudCA9IHJlcy5GZiAhPT0gbnVsbCA/IGZvcm1hdEZvcmNlKHJlcy5GZikgOiBOQTsNCiAgICAgICAgaWYgKGVscy5vdXRGc01heCkgZWxzLm91dEZzTWF4LnRleHRDb250ZW50ID0gcmVzLkZzTWF4ICE9PSBudWxsID8gZm9ybWF0Rm9yY2UocmVzLkZzTWF4KSA6IE5BOw0KICAgICAgICBpZiAoZWxzLm91dFRmKSBlbHMub3V0VGYudGV4dENvbnRlbnQgPSByZXMuVGYgIT09IG51bGwgPyBmb3JtYXRUb3JxdWUocmVzLlRmKSA6IE5BOw0KICAgICAgICBpZiAoZWxzLm91dE9tZWdhKSBlbHMub3V0T21lZ2EudGV4dENvbnRlbnQgPSByZXMub21lZ2EgIT09IG51bGwgPyBmbXQocmVzLm9tZWdhLCAzKSArICcgcmFkL3MnIDogTkE7DQogICAgICAgIGlmIChlbHMub3V0UGluKSBlbHMub3V0UGluLnRleHRDb250ZW50ID0gcmVzLlBpbiAhPT0gbnVsbCA/IGZvcm1hdFBvd2VyKHJlcy5QaW4sIGVscy5pbnB1dFBvd2VyVW5pdC52YWx1ZSkgOiBOQTsNCiAgICAgICAgaWYgKGVscy5vdXRQbG9zcykgZWxzLm91dFBsb3NzLnRleHRDb250ZW50ID0gcmVzLlBsb3NzICE9PSBudWxsID8gZm9ybWF0UG93ZXIocmVzLlBsb3NzLCBlbHMuaW5wdXRQb3dlclVuaXQudmFsdWUpIDogTkE7DQogICAgICAgIGlmIChlbHMub3V0UG91dCkgZWxzLm91dFBvdXQudGV4dENvbnRlbnQgPSByZXMuUG91dCAhPT0gbnVsbCA/IGZvcm1hdFBvd2VyKHJlcy5Qb3V0LCBlbHMuaW5wdXRQb3dlclVuaXQudmFsdWUpIDogTkE7DQogICAgICAgIGlmIChlbHMub3V0RXRhKSBlbHMub3V0RXRhLnRleHRDb250ZW50ID0gcmVzLmV0YSAhPT0gbnVsbCA/IGZtdChyZXMuZXRhLCAyKSArICcgJScgOiBOQTsNCiAgICAgICAgaWYgKGVscy5vdXRFdGFMb3NzKSBlbHMub3V0RXRhTG9zcy50ZXh0Q29udGVudCA9IHJlcy5ldGFMb3NzICE9PSBudWxsID8gZm10KHJlcy5ldGFMb3NzLCAyKSArICcgJScgOiBOQTsNCiAgICAgICAgaWYgKGVscy5vdXRMb3NzUmF0aW8pIGVscy5vdXRMb3NzUmF0aW8udGV4dENvbnRlbnQgPSByZXMubG9zc1JhdGlvICE9PSBudWxsID8gZm10KHJlcy5sb3NzUmF0aW8sIDIpICsgJyAlJyA6IE5BOw0KICAgICAgICBpZiAoZWxzLm91dEhlYXQpIGVscy5vdXRIZWF0LnRleHRDb250ZW50ID0gcmVzLmhlYXQgIT09IG51bGwgPyBmb3JtYXRQb3dlcihyZXMuaGVhdCwgJ2tXJykgOiBOQTsNCg0KICAgICAgICBpZiAoZWxzLm91dEVmZlN0YXR1cykgew0KICAgICAgICAgICAgZWxzLm91dEVmZlN0YXR1cy50ZXh0Q29udGVudCA9IHJlcy5lZmZTdGF0dXMubGFiZWw7DQogICAgICAgICAgICBlbHMub3V0RWZmU3RhdHVzLmNsYXNzTmFtZSA9ICdmdGVjLXJlc3VsdC12YWx1ZSBmdGVjLW91dC1zdGF0dXMgJyArIHJlcy5lZmZTdGF0dXMuY2xzOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMub3V0RnJpY3Rpb25SaXNrKSB7DQogICAgICAgICAgICBlbHMub3V0RnJpY3Rpb25SaXNrLnRleHRDb250ZW50ID0gcmVzLmZyaWN0aW9uUmlzay5sYWJlbDsNCiAgICAgICAgICAgIGVscy5vdXRGcmljdGlvblJpc2suY2xhc3NOYW1lID0gJ2Z0ZWMtcmVzdWx0LXZhbHVlIGZ0ZWMtb3V0LXJpc2sgJyArIHJlcy5mcmljdGlvblJpc2suY2xzOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVscy5oZXJvRWZmaWNpZW5jeSkgew0KICAgICAgICAgICAgZWxzLmhlcm9FZmZpY2llbmN5LnRleHRDb250ZW50ID0gcmVzLmV0YSAhPT0gbnVsbCA/IGZtdChyZXMuZXRhLCAxKSArICclJyA6IE5BOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMuaGVyb1Bsb3NzKSB7DQogICAgICAgICAgICBlbHMuaGVyb1Bsb3NzLnRleHRDb250ZW50ID0gcmVzLlBsb3NzICE9PSBudWxsID8gZm9ybWF0UG93ZXIocmVzLlBsb3NzLCBlbHMuaW5wdXRQb3dlclVuaXQudmFsdWUpIDogTkE7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgdXRpbFBjdCA9IHJlcy5ldGFMb3NzICE9PSBudWxsID8gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCByZXMuZXRhTG9zcykpIDogMDsNCiAgICAgICAgaWYgKGVscy51dGlsRmlsbCkgew0KICAgICAgICAgICAgZWxzLnV0aWxGaWxsLnN0eWxlLndpZHRoID0gdXRpbFBjdCArICclJzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZWxzLnV0aWxMYWJlbCkgew0KICAgICAgICAgICAgZWxzLnV0aWxMYWJlbC50ZXh0Q29udGVudCA9IHJlcy5ldGFMb3NzICE9PSBudWxsID8gZm10KHJlcy5ldGFMb3NzLCAxKSArICclIGxvc3MnIDogTkE7DQogICAgICAgIH0NCg0KICAgICAgICB1cGRhdGVHYXVnZShyZXMuZXRhKTsNCiAgICAgICAgdXBkYXRlU2NoZW1hdGljKHJlcywgaW5wKTsNCiAgICAgICAgdXBkYXRlUG93ZXJGbG93KHJlcyk7DQoNCiAgICAgICAgdmFyIGFsbFdhcm5pbmdzID0gW10uY29uY2F0KHJlcy53YXJuaW5ncyk7DQogICAgICAgIHJlbmRlcldhcm5pbmdzKGFsbFdhcm5pbmdzKTsNCg0KICAgICAgICBpZiAoZWxzLnJlY29tbWVuZGF0aW9ucykgew0KICAgICAgICAgICAgZWxzLnJlY29tbWVuZGF0aW9ucy5pbm5lckhUTUwgPSAnJzsNCiAgICAgICAgICAgIGJ1aWxkUmVjb21tZW5kYXRpb25zKHJlcywgaW5wKS5mb3JFYWNoKGZ1bmN0aW9uICh0ZXh0KSB7DQogICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCiAgICAgICAgICAgICAgICBsaS50ZXh0Q29udGVudCA9IHRleHQ7DQogICAgICAgICAgICAgICAgZWxzLnJlY29tbWVuZGF0aW9ucy5hcHBlbmRDaGlsZChsaSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbHMuc3RhdHVzQmFubmVyKSB7DQogICAgICAgICAgICBlbHMuc3RhdHVzQmFubmVyLmNsYXNzTmFtZSA9ICdmdGVjLXN0YXR1cy1iYW5uZXIgJyArIChyZXMuZWZmU3RhdHVzLmNscyB8fCAnZnRlYy1zdGF0dXMtbmV1dHJhbCcpOw0KICAgICAgICAgICAgaWYgKGVscy5zdGF0dXNUaXRsZSkgZWxzLnN0YXR1c1RpdGxlLnRleHRDb250ZW50ID0gcmVzLmVmZlN0YXR1cy5sYWJlbCAhPT0gTkEgPyByZXMuZWZmU3RhdHVzLmxhYmVsIDogJ1Jlc3VsdHMgUmVhZHknOw0KICAgICAgICAgICAgaWYgKGVscy5zdGF0dXNTdWIpIHsNCiAgICAgICAgICAgICAgICBlbHMuc3RhdHVzU3ViLnRleHRDb250ZW50ID0gcmVzLmV0YSAhPT0gbnVsbA0KICAgICAgICAgICAgICAgICAgICA/ICdUcmFuc21pc3Npb24gZWZmaWNpZW5jeSDOtyA9ICcgKyBmbXQocmVzLmV0YSwgMikgKyAnJSB8IEZyaWN0aW9uIHJpc2s6ICcgKyByZXMuZnJpY3Rpb25SaXNrLmxhYmVsDQogICAgICAgICAgICAgICAgICAgIDogJ0ZyaWN0aW9u IGFuYWx5c2lzIGNvbXBsZXRlJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUdhdWdlKGV0YSkgew0KICAgICAgICBpZiAoIWVscy5nYXVnZUFyYyB8fCAhZWxzLmdhdWdlTmVlZGxlKSByZXR1cm47DQogICAgICAgIHZhciBwY3QgPSBldGEgIT09IG51bGwgPyBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIGV0YSkpIDogMDsNCiAgICAgICAgdmFyIG9mZnNldCA9IEdBVUdFX0FSQyAqICgxIC0gcGN0IC8gMTAwKTsNCiAgICAgICAgZWxzLmdhdWdlQXJjLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hvZmZzZXQnLCBvZmZzZXQudG9GaXhlZCgyKSk7DQogICAgICAgIHZhciBhbmdsZSA9IC05MCArIChwY3QgLyAxMDApICogMTgwOw0KICAgICAgICBlbHMuZ2F1Z2VOZWVkbGUuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCAncm90YXRlKCcgKyBhbmdsZS50b0ZpeGVkKDEpICsgJyAxMjAgMTE4KScpOw0KICAgICAgICBpZiAoZWxzLmdhdWdlUmVhZCkgZWxzLmdhdWdlUmVhZC50ZXh0Q29udGVudCA9IGV0YSAhPT0gbnVsbCA/IGZtdChldGEsIDEpICsgJyUnIDogTkE7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2V0R3JvdXBWaXNpYmxlKG5vZGVzLCBzaG93KSB7DQogICAgICAgIFtdLmZvckVhY2guY2FsbChub2RlcywgZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBpZiAoIWVsKSByZXR1cm47DQogICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdmdGVjLWhpZGRlbicsICFzaG93KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlU2NoZW1hdGljKHJlcywgaW5wKSB7DQogICAgICAgIGlmICghZWxzLnNjaGVtYXRpYykgcmV0dXJuOw0KICAgICAgICB2YXIgc3ZnID0gZWxzLnNjaGVtYXRpYzsNCiAgICAgICAgdmFyIGxpbmVhckVscyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCcuZnRlYy1zY2gtbGluZWFyJyk7DQogICAgICAgIHZhciByb3RFbHMgPSBzdmcucXVlcnlTZWxlY3RvckFsbCgnLmZ0ZWMtc2NoLXJvdGF0aW9uYWwnKTsNCg0KICAgICAgICBpZiAoaXNMaW5lYXJNb3Rpb24oKSkgew0KICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnZGF0YS1tb3Rpb24nLCAnbGluZWFyJyk7DQogICAgICAgICAgICBzZXRHcm91cFZpc2libGUobGluZWFyRWxzLCB0cnVlKTsNCiAgICAgICAgICAgIHNldEdyb3VwVmlzaWJsZShyb3RFbHMsIGZhbHNlKTsNCiAgICAgICAgICAgIGlmIChlbHMuc2NoRm9yY2UpIGVscy5zY2hGb3JjZS50ZXh0Q29udGVudCA9ICdGZiA9ICcgKyAocmVzLkZmICE9PSBudWxsID8gZm9ybWF0Rm9yY2UocmVzLkZmKSA6IE5BKTsNCiAgICAgICAgICAgIGlmIChlbHMuc2NoTm9ybWFsKSBlbHMuc2NoTm9ybWFsLnRleHRDb250ZW50ID0gJ04gPSAnICsgZm9ybWF0Rm9yY2UoaW5wLk4pOw0KICAgICAgICAgICAgaWYgKGVscy5zY2hTcGVlZCkgZWxzLnNjaFNwZWVkLnRleHRDb250ZW50ID0gaW5wLnYgIT09IG51bGwgPyAndiA9ICcgKyBmb3JtYXRTcGVlZChpbnAudikgOiAndiA9IOKAlCc7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdkYXRhLW1vdGlvbicsICdyb3RhdGlvbmFsJyk7DQogICAgICAgICAgICBzZXRHcm91cFZpc2libGUobGluZWFyRWxzLCBmYWxzZSk7DQogICAgICAgICAgICBzZXRHcm91cFZpc2libGUocm90RWxzLCB0cnVlKTsNCiAgICAgICAgICAgIGlmIChlbHMuc2NoVG9ycXVlKSBlbHMuc2NoVG9ycXVlLnRleHRDb250ZW50ID0gcmVzLlRmICE9PSBudWxsID8gJ1RmID0gJyArIGZvcm1hdFRvcnF1ZShyZXMuVGYpIDogJ1RmID0g4oCUJzsNCiAgICAgICAgICAgIGlmIChlbHMuc2NoUnBtKSBlbHMuc2NoUnBtLnRleHRDb250ZW50ID0gaW5wLnJwbSAhPT0gbnVsbCA/IGlucC5ycG0gKyAnIHJwbScgOiAoaW5wLm5pbiAhPT0gbnVsbCA/IGlucC5uaW4gKyAnIHJwbScgOiAn4oCUIHJwbScpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlUG93ZXJGbG93KHJlcykgew0KICAgICAgICBpZiAoIWVscy5mbG93UGluKSByZXR1cm47DQogICAgICAgIGVscy5mbG93UGluLnRleHRDb250ZW50ID0gcmVzLlBpbiAhPT0gbnVsbCA/IGZvcm1hdFBvd2VyKHJlcy5QaW4sIGVscy5pbnB1dFBvd2VyVW5pdC52YWx1ZSkgOiAnUGluJzsNCiAgICAgICAgZWxzLmZsb3dQbG9zcy50ZXh0Q29udGVudCA9IHJlcy5QbG9zcyAhPT0gbnVsbCA/IGZvcm1hdFBvd2VyKHJlcy5QbG9zcywgZWxzLmlucHV0UG93ZXJVbml0LnZhbHVlKSA6ICdQbG9zcyc7DQogICAgICAgIGVscy5mbG93UG91dC50ZXh0Q29udGVudCA9IHJlcy5Qb3V0ICE9PSBudWxsID8gZm9ybWF0UG93ZXIocmVzLlBvdXQsIGVscy5pbnB1dFBvd2VyVW5pdC52YWx1ZSkgOiAnUG91dCc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVuZGVyRXJyb3JzKGVycm9ycykgew0KICAgICAgICBpZiAoIWVscy53YXJuaW5ncykgcmV0dXJuOw0KICAgICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MID0gJyc7DQogICAgICAgIGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsNCiAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgICAgIGRpdi5jbGFzc05hbWUgPSAnZnRlYy1hbGVydCBmdGVjLWFsZXJ0LWVycm9yJzsNCiAgICAgICAgICAgIGRpdi50ZXh0Q29udGVudCA9IG1zZzsNCiAgICAgICAgICAgIGVscy53YXJuaW5ncy5hcHBlbmRDaGlsZChkaXYpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJXYXJuaW5ncyh3YXJuaW5ncykgew0KICAgICAgICBpZiAoIWVscy53YXJuaW5ncykgcmV0dXJuOw0KICAgICAgICB2YXIgZXhpc3RpbmcgPSBlbHMud2FybmluZ3MucXVlcnlTZWxlY3RvckFsbCgnLmZ0ZWMtYWxlcnQtd2FybicpOw0KICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZXhpc3RpbmcsIGZ1bmN0aW9uIChlbCkgeyBlbC5yZW1vdmUoKTsgfSk7DQogICAgICAgIHdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKG1zZykgew0KICAgICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdmdGVjLWFsZXJ0IGZ0ZWMtYWxlcnQtd2Fybic7DQogICAgICAgICAgICBkaXYudGV4dENvbnRlbnQgPSBtc2c7DQogICAgICAgICAgICBlbHMud2FybmluZ3MuYXBwZW5kQ2hpbGQoZGl2KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaGlkZVJlc3VsdHMoKSB7DQogICAgICAgIGlmICghZWxzLnJlc3VsdHMpIHJldHVybjsNCiAgICAgICAgZWxzLnJlc3VsdHMuY2xhc3NMaXN0LmFkZCgnZnRlYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93UmVzdWx0cygpIHsNCiAgICAgICAgaWYgKCFlbHMucmVzdWx0cykgcmV0dXJuOw0KICAgICAgICBlbHMucmVzdWx0cy5jbGFzc0xpc3QucmVtb3ZlKCdmdGVjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsNCiAgICAgICAgc3RhdGUubW9kZSA9IGVscy5tb2RlLnZhbHVlOw0KICAgICAgICBzdGF0ZS5tb3Rpb24gPSBlbHMubW90aW9uLnZhbHVlOw0KICAgICAgICB2YXIgaW5wID0gcmVhZElucHV0cygpOw0KICAgICAgICB2YXIgdmFsID0gdmFsaWRhdGUoaW5wKTsNCg0KICAgICAgICByZW5kZXJFcnJvcnMoW10pOw0KICAgICAgICBpZiAodmFsLmVycm9ycy5sZW5ndGgpIHsNCiAgICAgICAgICAgIHJlbmRlckVycm9ycyh2YWwuZXJyb3JzKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzKCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgcmVzID0gY29tcHV0ZShpbnApOw0KICAgICAgICByZW5kZXJSZXN1bHRzKHJlcywgaW5wKTsNCiAgICAgICAgc2hvd1Jlc3VsdHMoKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzKCkgew0KICAgICAgICBlbHMubW9kZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBzdGF0ZS5tb2RlID0gZWxzLm1vZGUudmFsdWU7DQogICAgICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgfSk7DQogICAgICAgIGVscy5tb3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgc3RhdGUubW90aW9uID0gZWxzLm1vdGlvbi52YWx1ZTsNCiAgICAgICAgICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOw0KICAgICAgICB9KTsNCiAgICAgICAgZWxzLmx1YmUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgc3RhdGUubHViZSA9IGVscy5sdWJlLnZhbHVlOw0KICAgICAgICAgICAgbWFudWFsTXVPdmVycmlkZSA9IGZhbHNlOw0KICAgICAgICAgICAgYXBwbHlNYXRlcmlhbFByZXNldCgpOw0KICAgICAgICB9KTsNCiAgICAgICAgZWxzLm1h dGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHN0YXRlLm1hdGVyaWFsID0gZWxzLm1hdGVyaWFsLnZhbHVlOw0KICAgICAgICAgICAgbWFudWFsTXVPdmVycmlkZSA9IGZhbHNlOw0KICAgICAgICAgICAgYXBwbHlNYXRlcmlhbFByZXNldCgpOw0KICAgICAgICB9KTsNCiAgICAgICAgZWxzLm11ay5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIG1hbnVhbE11T3ZlcnJpZGUgPSB0cnVlOw0KICAgICAgICB9KTsNCiAgICAgICAgZWxzLm11cy5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIG1hbnVhbE11T3ZlcnJpZGUgPSB0cnVlOw0KICAgICAgICB9KTsNCg0KICAgICAgICBbXS5mb3JFYWNoLmNhbGwocm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPSJmdGVjLXVuaXRTeXN0ZW0iXScpLCBmdW5jdGlvbiAocmFkaW8pIHsNCiAgICAgICAgICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICBzdGF0ZS51bml0ID0gcmFkaW8udmFsdWU7DQogICAgICAgICAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5jYWxjQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWNoZUVsZW1lbnRzKCkgew0KICAgICAgICBlbHMgPSB7DQogICAgICAgICAgICBtb2RlOiAkKCdmdGVjTW9kZScpLA0KICAgICAgICAgICAgbW90aW9uOiAkKCdmdGVjTW90aW9uJyksDQogICAgICAgICAgICBtb2RlTm90ZTogJCgnZnRlY01vZGVOb3RlJyksDQogICAgICAgICAgICBub3JtYWxGb3JjZTogJCgnZnRlY05vcm1hbEZvcmNlJyksDQogICAgICAgICAgICBub3JtYWxGb3JjZVVuaXQ6ICQoJ2Z0ZWNOb3JtYWxGb3JjZVVuaXQnKSwNCiAgICAgICAgICAgIG11czogJCgnZnRlY011cycpLA0KICAgICAgICAgICAgbXVrOiAkKCdmdGVjTXVrJyksDQogICAgICAgICAgICBzbGlkaW5nU3BlZWQ6ICQoJ2Z0ZWNTbGlkaW5nU3BlZWQnKSwNCiAgICAgICAgICAgIHNsaWRpbmdTcGVlZFVuaXQ6ICQoJ2Z0ZWNTbGlkaW5nU3BlZWRVbml0JyksDQogICAgICAgICAgICBmcmljdGlvblRvcnF1ZTogJCgnZnRlY0ZyaWN0aW9uVG9ycXVlJyksDQogICAgICAgICAgICBmcmljdGlvblRvcnF1ZVVuaXQ6ICQoJ2Z0ZWNGcmljdGlvblRvcnF1ZVVuaXQnKSwNCiAgICAgICAgICAgIHJwbTogJCgnZnRlY1JwbScpLA0KICAgICAgICAgICAgaW5wdXRQb3dlcjogJCgnZnRlY0lucHV0UG93ZXInKSwNCiAgICAgICAgICAgIGlucHV0UG93ZXJVbml0OiAkKCdmdGVjSW5wdXRQb3dlclVuaXQnKSwNCiAgICAgICAgICAgIGlucHV0VG9ycXVlOiAkKCdmdGVjSW5wdXRUb3JxdWUnKSwNCiAgICAgICAgICAgIGlucHV0VG9ycXVlVW5pdDogJCgnZnRlY0lucHV0VG9ycXVlVW5pdCcpLA0KICAgICAgICAgICAgb3V0cHV0VG9ycXVlOiAkKCdmdGVjT3V0cHV0VG9ycXVlJyksDQogICAgICAgICAgICBvdXRwdXRUb3JxdWVVbml0OiAkKCdmdGVjT3V0cHV0VG9ycXVlVW5pdCcpLA0KICAgICAgICAgICAgaW5wdXRTcGVlZDogJCgnZnRlY0lucHV0U3BlZWQnKSwNCiAgICAgICAgICAgIG91dHB1dFNwZWVkOiAkKCdmdGVjT3V0cHV0U3BlZWQnKSwNCiAgICAgICAgICAgIGx1YmU6ICQoJ2Z0ZWNMdWJlJyksDQogICAgICAgICAgICBtYXRlcmlhbDogJCgnZnRlY01hdGVyaWFsJyksDQogICAgICAgICAgICB0ZW1wOiAkKCdmdGVjVGVtcCcpLA0KICAgICAgICAgICAgcHJlc2V0SGludDogJCgnZnRlY1ByZXNldEhpbnQnKSwNCiAgICAgICAgICAgIHdhcm5pbmdzOiAkKCdmdGVjV2FybmluZ3MnKSwNCiAgICAgICAgICAgIHJlc3VsdHM6ICQoJ2Z0ZWNSZXN1bHRzJyksDQogICAgICAgICAgICBjYWxjQnRuOiAkKCdmdGVjQ2FsY3VsYXRlQnRuJyksDQogICAgICAgICAgICBzdGF0dXNCYW5uZXI6ICQoJ2Z0ZWNTdGF0dXNCYW5uZXInKSwNCiAgICAgICAgICAgIHN0YXR1c1RpdGxlOiAkKCdmdGVjU3RhdHVzVGl0bGUnKSwNCiAgICAgICAgICAgIHN0YXR1c1N1YjogJCgnZnRlY1N0YXR1c1N1YicpLA0KICAgICAgICAgICAgaGVyb0VmZmljaWVuY3k6ICQoJ2Z0ZWNIZXJvRWZmaWNpZW5jeScpLA0KICAgICAgICAgICAgaGVyb1Bsb3NzOiAkKCdmdGVjSGVyb1Bsb3NzJyksDQogICAgICAgICAgICBvdXRGZjogJCgnZnRlY091dEZmJyksDQogICAgICAgICAgICBvdXRGc01heDogJCgnZnRlY091dEZzTWF4JyksDQogICAgICAgICAgICBvdXRUZjogJCgnZnRlY091dFRmJyksDQogICAgICAgICAgICBvdXRPbWVnYTogJCgnZnRlY091dE9tZWdhJyksDQogICAgICAgICAgICBvdXRQaW46ICQoJ2Z0ZWNPdXRQaW4nKSwNCiAgICAgICAgICAgIG91dFBsb3NzOiAkKCdmdGVjT3V0UGxvc3MnKSwNCiAgICAgICAgICAgIG91dFBvdXQ6ICQoJ2Z0ZWNPdXRQb3V0JyksDQogICAgICAgICAgICBvdXRFdGE6ICQoJ2Z0ZWNPdXRFdGEnKSwNCiAgICAgICAgICAgIG91dEV0YUxvc3M6ICQoJ2Z0ZWNPdXRFdGFMb3NzJyksDQogICAgICAgICAgICBvdXRMb3NzUmF0aW86ICQoJ2Z0ZWNPdXRMb3NzUmF0aW8nKSwNCiAgICAgICAgICAgIG91dEhlYXQ6ICQoJ2Z0ZWNPdXRIZWF0JyksDQogICAgICAgICAgICBvdXRFZmZTdGF0dXM6ICQoJ2Z0ZWNPdXRFZmZTdGF0dXMnKSwNCiAgICAgICAgICAgIG91dEZyaWN0aW9uUmlzazogJCgnZnRlY091dEZyaWN0aW9uUmlzaycpLA0KICAgICAgICAgICAgdXRpbEZpbGw6ICQoJ2Z0ZWNVdGlsRmlsbCcpLA0KICAgICAgICAgICAgdXRpbExhYmVsOiAkKCdmdGVjVXRpbExhYmVsJyksDQogICAgICAgICAgICBnYXVnZUFyYzogJCgnZnRlY0dhdWdlQXJjJyksDQogICAgICAgICAgICBnYXVnZU5lZWRsZTogJCgnZnRlY0dhdWdlTmVlZGxlJyksDQogICAgICAgICAgICBnYXVnZVJlYWQ6ICQoJ2Z0ZWNHYXVnZVJlYWQnKSwNCiAgICAgICAgICAgIHNjaGVtYXRpYzogJCgnZnRlY1NjaGVtYXRpYycpLA0KICAgICAgICAgICAgc2NoRm9yY2U6ICQoJ2Z0ZWNTY2hGb3JjZScpLA0KICAgICAgICAgICAgc2NoTm9ybWFsOiAkKCdmdGVjU2NoTm9ybWFsJyksDQogICAgICAgICAgICBzY2hTcGVlZDogJCgnZnRlY1NjaFNwZWVkJyksDQogICAgICAgICAgICBzY2hUb3JxdWU6ICQoJ2Z0ZWNTY2hUb3JxdWUnKSwNCiAgICAgICAgICAgIHNjaFJwbTogJCgnZnRlY1NjaFJwbScpLA0KICAgICAgICAgICAgZmxvd1BpbjogJCgnZnRlY0Zsb3dQaW4nKSwNCiAgICAgICAgICAgIGZsb3dQbG9zczogJCgnZnRlY0Zsb3dQbG9zcycpLA0KICAgICAgICAgICAgZmxvd1BvdXQ6ICQoJ2Z0ZWNGbG93UG91dCcpLA0KICAgICAgICAgICAgcmVjb21tZW5kYXRpb25zOiAkKCdmdGVjUmVjb21tZW5kYXRpb25zJykNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpbml0KCkgew0KICAgICAgICByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoUk9PVF9JRCk7DQogICAgICAgIGlmICghcm9vdCkgcmV0dXJuOw0KICAgICAgICBjYWNoZUVsZW1lbnRzKCk7DQogICAgICAgIHN0YXRlID0geyB1bml0OiAnbWV0cmljJywgbW9kZTogREVGQVVMVFMubW9kZSwgbW90aW9uOiBERUZBVUxUUy5tb3Rpb24sIGx1YmU6IERFRkFVTFRTLmx1YmUsIG1hdGVyaWFsOiBERUZBVUxUUy5tYXRlcmlhbCB9Ow0KICAgICAgICBtYW51YWxNdU92ZXJyaWRlID0gZmFsc2U7DQogICAgICAgIGJpbmRFdmVudHMoKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgYXBwbHlNYXRlcmlhbFByZXNldCgpOw0KICAgICAgICBoaWRlUmVzdWx0cygpOw0KICAgIH0NCg0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXQpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGluaXQoKTsNCiAgICB9DQp9KSgpOw0K
نتائج الحساب
⚙
Results Ready
Friction and efficiency analysis complete
Transmission Efficiency
—
η = Pout / Pin × 100%
Friction Power Loss
—
Ploss = Ff × v or Tf × ω
Friction & Motion Diagram
N = 5000 N
Ff = —
motion →
← friction
v = 0.5 m/s
Tf = —
— rpm
Rotational friction
Power Flow & Heat Generation
🔥
Q̇ ≈ Ploss (heat generation rate)
Transmission Efficiency Gauge
Efficiency Loss
Loss from friction & transmission
—
Efficiency Loss = 100% − η
Friction Force (Ff)
—
Maximum Static Friction (Fs,max)
—
Friction Torque (Tf)
—
Angular Velocity (ω)
—
Input Power (Pin)
—
Friction Power Loss (Ploss)
—
Output Power (Pout)
—
Transmission Efficiency (η)
—
Efficiency Loss
—
Friction Loss Ratio
—
Estimated Heat Generation (Q̇)
—
Efficiency Status
—
Friction Risk
—
Engineering Recommendations