IiIiIFRlc3Qgc2NyaXB0IGZvciB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KCldyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgoKKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KCiIiIgpmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQppbXBvcnQgc3lzCgpkZWYgdGVzdChtZXRob2QsIGlucHV0LCBvdXRwdXQsICphcmdzKToKICAgIGlmIHZlcmJvc2U6CiAgICAgICAgcHJpbnQgJyVzLiVzJXMgPT8gJXMuLi4gJyAlIChyZXByKGlucHV0KSwgbWV0aG9kLCBhcmdzLCBvdXRwdXQpLAogICAgdHJ5OgogICAgICAgIGYgPSBnZXRhdHRyKGlucHV0LCBtZXRob2QpCiAgICAgICAgdmFsdWUgPSBhcHBseShmLCBhcmdzKQogICAgZXhjZXB0OgogICAgICAgIHZhbHVlID0gc3lzLmV4Y190eXBlCiAgICAgICAgZXhjID0gc3lzLmV4Y19pbmZvKClbOjJdCiAgICBlbHNlOgogICAgICAgIGV4YyA9IE5vbmUKICAgIGlmIHZhbHVlICE9IG91dHB1dDoKICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICBwcmludCAnbm8nCiAgICAgICAgcHJpbnQgJyonLGYsIGBpbnB1dGAsIGBvdXRwdXRgLCBgdmFsdWVgCiAgICAgICAgaWYgZXhjOgogICAgICAgICAgICBwcmludCAnICB2YWx1ZSA9PSAlczogJXMnICUgKGV4YykKICAgIGVsc2U6CiAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgcHJpbnQgJ3llcycKCnRlc3QoJ2NhcGl0YWxpemUnLCB1JyBoZWxsbyAnLCB1JyBoZWxsbyAnKQp0ZXN0KCdjYXBpdGFsaXplJywgdSdoZWxsbyAnLCB1J0hlbGxvICcpCgp0ZXN0KCd0aXRsZScsIHUnIGhlbGxvICcsIHUnIEhlbGxvICcpCnRlc3QoJ3RpdGxlJywgdSdoZWxsbyAnLCB1J0hlbGxvICcpCnRlc3QoJ3RpdGxlJywgdSJmT3JNYVQgdGhJcyBhUyB0aXRMZSBTdHJpbmciLCB1J0Zvcm1hdCBUaGlzIEFzIFRpdGxlIFN0cmluZycpCnRlc3QoJ3RpdGxlJywgdSJmT3JNYVQsdGhJcy1hUyp0aXRMZTtTdHJpbmciLCB1J0Zvcm1hdCxUaGlzLUFzKlRpdGxlO1N0cmluZycpCnRlc3QoJ3RpdGxlJywgdSJnZXRJbnQiLCB1J0dldGludCcpCgp0ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCAwLCB1J2FiYycpCnRlc3QoJ2ZpbmQnLCB1J2FiY2RlZmdoaWFiYycsIDksIHUnYWJjJywgMSkKdGVzdCgnZmluZCcsIHUnYWJjZGVmZ2hpYWJjJywgLTEsIHUnZGVmJywgNCkKCnRlc3QoJ3JmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCA5LCB1J2FiYycpCgp0ZXN0KCdsb3dlcicsIHUnSGVMTG8nLCB1J2hlbGxvJykKdGVzdCgnbG93ZXInLCB1J2hlbGxvJywgdSdoZWxsbycpCgp0ZXN0KCd1cHBlcicsIHUnSGVMTG8nLCB1J0hFTExPJykKdGVzdCgndXBwZXInLCB1J0hFTExPJywgdSdIRUxMTycpCgppZiAwOgogICAgdHJhbnN0YWJsZSA9ICdcMDAwXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyAhIiMkJSZcJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXF1eX2B4eXpkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cMTc3XDIwMFwyMDFcMjAyXDIwM1wyMDRcMjA1XDIwNlwyMDdcMjEwXDIxMVwyMTJcMjEzXDIxNFwyMTVcMjE2XDIxN1wyMjBcMjIxXDIyMlwyMjNcMjI0XDIyNVwyMjZcMjI3XDIzMFwyMzFcMjMyXDIzM1wyMzRcMjM1XDIzNlwyMzdcMjQwXDI0MVwyNDJcMjQzXDI0NFwyNDVcMjQ2XDI0N1wyNTBcMjUxXDI1MlwyNTNcMjU0XDI1NVwyNTZcMjU3XDI2MFwyNjFcMjYyXDI2M1wyNjRcMjY1XDI2NlwyNjdcMjcwXDI3MVwyNzJcMjczXDI3NFwyNzVcMjc2XDI3N1wzMDBcMzAxXDMwMlwzMDNcMzA0XDMwNVwzMDZcMzA3XDMxMFwzMTFcMzEyXDMxM1wzMTRcMzE1XDMxNlwzMTdcMzIwXDMyMVwzMjJcMzIzXDMyNFwzMjVcMzI2XDMyN1wzMzBcMzMxXDMzMlwzMzNcMzM0XDMzNVwzMzZcMzM3XDM0MFwzNDFcMzQyXDM0M1wzNDRcMzQ1XDM0NlwzNDdcMzUwXDM1MVwzNTJcMzUzXDM1NFwzNTVcMzU2XDM1N1wzNjBcMzYxXDM2MlwzNjNcMzY0XDM2NVwzNjZcMzY3XDM3MFwzNzFcMzcyXDM3M1wzNzRcMzc1XDM3NlwzNzcnCgogICAgdGVzdCgnbWFrZXRyYW5zJywgdSdhYmMnLCB0cmFuc3RhYmxlLCB1J3h5eicpCiAgICB0ZXN0KCdtYWtldHJhbnMnLCB1J2FiYycsIFZhbHVlRXJyb3IsIHUneHl6cScpCgp0ZXN0KCdzcGxpdCcsIHUndGhpcyBpcyB0aGUgc3BsaXQgZnVuY3Rpb24nLAogICAgIFt1J3RoaXMnLCB1J2lzJywgdSd0aGUnLCB1J3NwbGl0JywgdSdmdW5jdGlvbiddKQp0ZXN0KCdzcGxpdCcsIHUnYXxifGN8ZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgdSd8JykKdGVzdCgnc3BsaXQnLCB1J2F8YnxjfGQnLCBbdSdhJywgdSdiJywgdSdjfGQnXSwgdSd8JywgMikKdGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiIGMgZCddLCBOb25lLCAxKQp0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MgZCddLCBOb25lLCAyKQp0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgTm9uZSwgMykKdGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIE5vbmUsIDQpCnRlc3QoJ3NwbGl0JywgdSdhIGIgYyBkJywgW3UnYSBiIGMgZCddLCBOb25lLCAwKQp0ZXN0KCdzcGxpdCcsIHUnYSAgYiAgYyAgZCcsIFt1J2EnLCB1J2InLCB1J2MgIGQnXSwgTm9uZSwgMikKdGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQgJywgW3UnYScsIHUnYicsIHUnYycsIHUnZCddKQoKIyBqb2luIG5vdyB3b3JrcyB3aXRoIGFueSBzZXF1ZW5jZSB0eXBlCmNsYXNzIFNlcXVlbmNlOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9ICd3eHl6JwogICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5zZXEpCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6IHJldHVybiBzZWxmLnNlcVtpXQoKdGVzdCgnam9pbicsIHUnICcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSkKdGVzdCgnam9pbicsIHUnJywgdSdhYmNkJywgKHUnYScsIHUnYicsIHUnYycsIHUnZCcpKQp0ZXN0KCdqb2luJywgdScgJywgdSd3IHggeSB6JywgU2VxdWVuY2UoKSkKdGVzdCgnam9pbicsIHUnICcsIFR5cGVFcnJvciwgNykKCmNsYXNzIEJhZFNlcShTZXF1ZW5jZSk6CiAgICBkZWYgX19pbml0X18oc2VsZik6IHNlbGYuc2VxID0gWzcsIHUnaGVsbG8nLCAxMjNMXQoKdGVzdCgnam9pbicsIHUnICcsIFR5cGVFcnJvciwgQmFkU2VxKCkpCgpyZXN1bHQgPSB1JycKZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgaWYgaSA+IDA6CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgdSc6JwogICAgcmVzdWx0ID0gcmVzdWx0ICsgdSd4JyoxMAp0ZXN0KCdqb2luJywgdSc6JywgcmVzdWx0LCBbdSd4JyAqIDEwXSAqIDEwKQp0ZXN0KCdqb2luJywgdSc6JywgcmVzdWx0LCAodSd4JyAqIDEwLCkgKiAxMCkKCnRlc3QoJ3N0cmlwJywgdScgICBoZWxsbyAgICcsIHUnaGVsbG8nKQp0ZXN0KCdsc3RyaXAnLCB1JyAgIGhlbGxvICAgJywgdSdoZWxsbyAgICcpCnRlc3QoJ3JzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1JyAgIGhlbGxvJykKdGVzdCgnc3RyaXAnLCB1J2hlbGxvJywgdSdoZWxsbycpCgp0ZXN0KCdzd2FwY2FzZScsIHUnSGVMTG8gY09tcFV0ZVJzJywgdSdoRWxsTyBDb01QdVRFclMnKQoKaWYgMDoKICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUneHl6YWJjZGVmJywgdSd4eXp4eXonLCB0cmFuc3RhYmxlLCB1J2RlZicpCgogICAgdGFibGUgPSBzdHJpbmcubWFrZXRyYW5zKCdhJywgdSdBJykKICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUnYWJjJywgdSdBYmMnLCB0YWJsZSkKICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUneHl6JywgdSd4eXonLCB0YWJsZSkKCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvIXRocmVlIScsIHUnIScsIHUnQCcsIDEpCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmV0d290aHJlZScsICchJywgJycpCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlIScsIHUnIScsIHUnQCcsIDIpCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcsIDMpCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcsIDQpCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmUhdHdvIXRocmVlIScsIHUnIScsIHUnQCcsIDApCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcpCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmUhdHdvIXRocmVlIScsIHUneCcsIHUnQCcpCnRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmUhdHdvIXRocmVlIScsIHUneCcsIHUnQCcsIDIpCgp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnaGUnKQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnaGVsbG8nKQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnaGVsbG8gd29ybGQnKQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnJykKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAwLCB1J2VsbG8nKQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnZWxsbycsIDEpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdSdvJywgNCkKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAwLCB1J28nLCA1KQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnJywgNSkKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAwLCB1J2xvJywgNikKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDEsIHUnbG93bycsIDMpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAzLCA3KQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMCwgdSdsb3dvJywgMywgNikKCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsbycsIDEsIHUnbG8nKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAwLCB1J2hlJykKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvJywgMSwgdScnKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAwLCB1J2hlbGxvIHdvcmxkJykKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J3dvcmwnKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDEsIHUnd29ybCcsIDMsIDkpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSd3b3JsZCcsIDMsIDEyKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDEsIHUnbG93bycsIDEsIDcpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSdsb3dvJywgMiwgNykKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAzLCA3KQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDAsIHUnbG93bycsIDQsIDcpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMCwgdSdsb3dvJywgMywgOCkKdGVzdCgnZW5kc3dpdGgnLCB1J2FiJywgMCwgdSdhYicsIDAsIDEpCnRlc3QoJ2VuZHN3aXRoJywgdSdhYicsIDAsIHUnYWInLCAwLCAwKQoKdGVzdCgnZXhwYW5kdGFicycsIHUnYWJjXHJhYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScpCnRlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyYWJcdGRlZlxuZ1x0aGknLCB1J2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknLCA4KQp0ZXN0KCdleHBhbmR0YWJzJywgdSdhYmNccmFiXHRkZWZcbmdcdGhpJywgdSdhYmNccmFiICBkZWZcbmcgICBoaScsIDQpCnRlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyXG5hYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJcbmFiICBkZWZcbmcgICBoaScsIDQpCgppZiAwOgogICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiYyBkZWYgZ2hpJywgdSdBYmMgRGVmIEdoaScpCiAgICB0ZXN0KCdjYXB3b3JkcycsIHUnYWJjXHRkZWZcbmdoaScsIHUnQWJjIERlZiBHaGknKQogICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiY1x0ICAgZGVmICBcbmdoaScsIHUnQWJjIERlZiBHaGknKQoKIyBDb21wYXJpc29uczoKcHJpbnQgJ1Rlc3RpbmcgVW5pY29kZSBjb21wYXJpc29ucy4uLicsCmFzc2VydCB1J2FiYycgPT0gJ2FiYycKYXNzZXJ0ICdhYmMnID09IHUnYWJjJwphc3NlcnQgdSdhYmMnID09IHUnYWJjJwphc3NlcnQgdSdhYmNkJyA+ICdhYmMnCmFzc2VydCAnYWJjZCcgPiB1J2FiYycKYXNzZXJ0IHUnYWJjZCcgPiB1J2FiYycKYXNzZXJ0IHUnYWJjJyA8ICdhYmNkJwphc3NlcnQgJ2FiYycgPCB1J2FiY2QnCmFzc2VydCB1J2FiYycgPCB1J2FiY2QnCnByaW50ICdkb25lLicKCnRlc3QoJ2xqdXN0JywgdSdhYmMnLCAgdSdhYmMgICAgICAgJywgMTApCnRlc3QoJ3JqdXN0JywgdSdhYmMnLCAgdScgICAgICAgYWJjJywgMTApCnRlc3QoJ2NlbnRlcicsIHUnYWJjJywgdScgICBhYmMgICAgJywgMTApCnRlc3QoJ2xqdXN0JywgdSdhYmMnLCAgdSdhYmMgICAnLCA2KQp0ZXN0KCdyanVzdCcsIHUnYWJjJywgIHUnICAgYWJjJywgNikKdGVzdCgnY2VudGVyJywgdSdhYmMnLCB1JyBhYmMgICcsIDYpCnRlc3QoJ2xqdXN0JywgdSdhYmMnLCB1J2FiYycsIDIpCnRlc3QoJ3JqdXN0JywgdSdhYmMnLCB1J2FiYycsIDIpCnRlc3QoJ2NlbnRlcicsIHUnYWJjJywgdSdhYmMnLCAyKQoKdGVzdCgnaXNsb3dlcicsIHUnYScsIDEpCnRlc3QoJ2lzbG93ZXInLCB1J0EnLCAwKQp0ZXN0KCdpc2xvd2VyJywgdSdcbicsIDApCnRlc3QoJ2lzbG93ZXInLCB1J1x1MUZGYycsIDApCnRlc3QoJ2lzbG93ZXInLCB1J2FiYycsIDEpCnRlc3QoJ2lzbG93ZXInLCB1J2FCYycsIDApCnRlc3QoJ2lzbG93ZXInLCB1J2FiY1xuJywgMSkKCnRlc3QoJ2lzdXBwZXInLCB1J2EnLCAwKQp0ZXN0KCdpc3VwcGVyJywgdSdBJywgMSkKdGVzdCgnaXN1cHBlcicsIHUnXG4nLCAwKQp0ZXN0KCdpc3VwcGVyJywgdSdcdTFGRmMnLCAwKQp0ZXN0KCdpc3VwcGVyJywgdSdBQkMnLCAxKQp0ZXN0KCdpc3VwcGVyJywgdSdBYkMnLCAwKQp0ZXN0KCdpc3VwcGVyJywgdSdBQkNcbicsIDEpCgp0ZXN0KCdpc3RpdGxlJywgdSdhJywgMCkKdGVzdCgnaXN0aXRsZScsIHUnQScsIDEpCnRlc3QoJ2lzdGl0bGUnLCB1J1xuJywgMCkKdGVzdCgnaXN0aXRsZScsIHUnXHUxRkZjJywgMSkKdGVzdCgnaXN0aXRsZScsIHUnQSBUaXRsZWNhc2VkIExpbmUnLCAxKQp0ZXN0KCdpc3RpdGxlJywgdSdBXG5UaXRsZWNhc2VkIExpbmUnLCAxKQp0ZXN0KCdpc3RpdGxlJywgdSdBIFRpdGxlY2FzZWQsIExpbmUnLCAxKQp0ZXN0KCdpc3RpdGxlJywgdSdHcmVlayBcdTFGRmNpdGxlY2FzZXMgLi4uJywgMSkKdGVzdCgnaXN0aXRsZScsIHUnTm90IGEgY2FwaXRhbGl6ZWQgU3RyaW5nJywgMCkKdGVzdCgnaXN0aXRsZScsIHUnTm90XHRhIFRpdGxlY2FzZSBTdHJpbmcnLCAwKQp0ZXN0KCdpc3RpdGxlJywgdSdOb3QtLWEgVGl0bGVjYXNlIFN0cmluZycsIDApCgp0ZXN0KCdpc2FscGhhJywgdSdhJywgMSkKdGVzdCgnaXNhbHBoYScsIHUnQScsIDEpCnRlc3QoJ2lzYWxwaGEnLCB1J1xuJywgMCkKdGVzdCgnaXNhbHBoYScsIHUnXHUxRkZjJywgMSkKdGVzdCgnaXNhbHBoYScsIHUnYWJjJywgMSkKdGVzdCgnaXNhbHBoYScsIHUnYUJjMTIzJywgMCkKdGVzdCgnaXNhbHBoYScsIHUnYWJjXG4nLCAwKQoKdGVzdCgnaXNhbG51bScsIHUnYScsIDEpCnRlc3QoJ2lzYWxudW0nLCB1J0EnLCAxKQp0ZXN0KCdpc2FsbnVtJywgdSdcbicsIDApCnRlc3QoJ2lzYWxudW0nLCB1JzEyM2FiYzQ1NicsIDEpCnRlc3QoJ2lzYWxudW0nLCB1J2ExYjNjJywgMSkKdGVzdCgnaXNhbG51bScsIHUnYUJjMDAwICcsIDApCnRlc3QoJ2lzYWxudW0nLCB1J2FiY1xuJywgMCkKCnRlc3QoJ3NwbGl0bGluZXMnLCB1ImFiY1xuZGVmXG5ccmdoaSIsIFt1J2FiYycsIHUnZGVmJywgdScnLCB1J2doaSddKQp0ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxuXHJcbmdoaSIsIFt1J2FiYycsIHUnZGVmJywgdScnLCB1J2doaSddKQp0ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxyXG5naGkiLCBbdSdhYmMnLCB1J2RlZicsIHUnZ2hpJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1ImFiY1xuZGVmXHJcbmdoaVxuIiwgW3UnYWJjJywgdSdkZWYnLCB1J2doaSddKQp0ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnYWJjJywgdSdkZWYnLCB1J2doaScsIHUnJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1IlxuYWJjXG5kZWZcclxuZ2hpXG5cciIsIFt1JycsIHUnYWJjJywgdSdkZWYnLCB1J2doaScsIHUnJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1IlxuYWJjXG5kZWZcclxuZ2hpXG5cciIsIFt1J1xuJywgdSdhYmNcbicsIHUnZGVmXHJcbicsIHUnZ2hpXG4nLCB1J1xyJ10sIDEpCgp0ZXN0KCd0cmFuc2xhdGUnLCB1ImFiYWJhYmMiLCB1J2JiYmMnLCB7b3JkKCdhJyk6Tm9uZX0pCnRlc3QoJ3RyYW5zbGF0ZScsIHUiYWJhYmFiYyIsIHUnaWlpYycsIHtvcmQoJ2EnKTpOb25lLCBvcmQoJ2InKTpvcmQoJ2knKX0pCnRlc3QoJ3RyYW5zbGF0ZScsIHUiYWJhYmFiYyIsIHUnaWlpeCcsIHtvcmQoJ2EnKTpOb25lLCBvcmQoJ2InKTpvcmQoJ2knKSwgb3JkKCdjJyk6dSd4J30pCgojIENvbnRhaW5zOgpwcmludCAnVGVzdGluZyBVbmljb2RlIGNvbnRhaW5zIG1ldGhvZC4uLicsCmFzc2VydCAoJ2EnIGluIHUnYWJkYicpID09IDEKYXNzZXJ0ICgnYScgaW4gdSdiZGFiJykgPT0gMQphc3NlcnQgKCdhJyBpbiB1J2JkYWJhJykgPT0gMQphc3NlcnQgKCdhJyBpbiB1J2JkYmEnKSA9PSAxCmFzc2VydCAoJ2EnIGluIHUnYmRiYScpID09IDEKYXNzZXJ0ICh1J2EnIGluIHUnYmRiYScpID09IDEKYXNzZXJ0ICh1J2EnIGluIHUnYmRiJykgPT0gMAphc3NlcnQgKHUnYScgaW4gJ2JkYicpID09IDAKYXNzZXJ0ICh1J2EnIGluICdiZGJhJykgPT0gMQphc3NlcnQgKHUnYScgaW4gKCdhJywxLE5vbmUpKSA9PSAxCmFzc2VydCAodSdhJyBpbiAoMSxOb25lLCdhJykpID09IDEKYXNzZXJ0ICh1J2EnIGluICgxLE5vbmUsdSdhJykpID09IDEKYXNzZXJ0ICgnYScgaW4gKCdhJywxLE5vbmUpKSA9PSAxCmFzc2VydCAoJ2EnIGluICgxLE5vbmUsJ2EnKSkgPT0gMQphc3NlcnQgKCdhJyBpbiAoMSxOb25lLHUnYScpKSA9PSAxCmFzc2VydCAoJ2EnIGluICgneCcsMSx1J3knKSkgPT0gMAphc3NlcnQgKCdhJyBpbiAoJ3gnLDEsTm9uZSkpID09IDAKcHJpbnQgJ2RvbmUuJwoKIyBGb3JtYXR0aW5nOgpwcmludCAnVGVzdGluZyBVbmljb2RlIGZvcm1hdHRpbmcgc3RyaW5ncy4uLicsCmFzc2VydCB1IiVzLCAlcyIgJSAodSJhYmMiLCAiYWJjIikgPT0gdSdhYmMsIGFiYycKYXNzZXJ0IHUiJXMsICVzLCAlaSwgJWYsICU1LjJmIiAlICh1ImFiYyIsICJhYmMiLCAxLCAyLCAzKSA9PSB1J2FiYywgYWJjLCAxLCAyLjAwMDAwMCwgIDMuMDAnCmFzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgMSwgLTIsIDMpID09IHUnYWJjLCBhYmMsIDEsIC0yLjAwMDAwMCwgIDMuMDAnCmFzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAzLjUpID09IHUnYWJjLCBhYmMsIC0xLCAtMi4wMDAwMDAsICAzLjUwJwphc3NlcnQgdSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIC0xLCAtMiwgMy41NykgPT0gdSdhYmMsIGFiYywgLTEsIC0yLjAwMDAwMCwgIDMuNTcnCmFzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAxMDAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAxMDAzLjU3Jwphc3NlcnQgdSIlYyIgJSAodSJhIiwpID09IHUnYScKYXNzZXJ0IHUiJWMiICUgKCJhIiwpID09IHUnYScKYXNzZXJ0IHUiJWMiICUgKDM0LCkgPT0gdSciJwphc3NlcnQgdSIlYyIgJSAoMzYsKSA9PSB1JyQnCnZhbHVlID0gdSIlciwgJXIiICUgKHUiYWJjIiwgImFiYyIpIAppZiB2YWx1ZSAhPSB1InUnYWJjJywgJ2FiYyciOgogICAgcHJpbnQgJyoqKiBmb3JtYXR0aW5nIGZhaWxlZCBmb3IgIiVzIicgJSAndSIlciwgJXIiICUgKHUiYWJjIiwgImFiYyIpJwoKYXNzZXJ0IHUiJSh4KXMsICUoeSlzIiAlIHsneCc6dSJhYmMiLCAneSc6ImRlZiJ9ID09IHUnYWJjLCBkZWYnCnRyeToKICAgIHZhbHVlID0gdSIlKHgpcywgJSjkKXMiICUgeyd4Jzp1ImFiYyIsIHUn5CcuZW5jb2RlKCd1dGYtOCcpOiJkZWYifSAKZXhjZXB0IEtleUVycm9yOgogICAgcHJpbnQgJyoqKiBmb3JtYXR0aW5nIGZhaWxlZCBmb3IgIiVzIicgJSAidSdhYmMsIGRlZiciCmVsc2U6CiAgICBhc3NlcnQgdmFsdWUgPT0gdSdhYmMsIGRlZicKCiMgZm9ybWF0dGluZyBqb2JzIGRlbGVnYXRlZCBmcm9tIHRoZSBzdHJpbmcgaW1wbGVtZW50YXRpb246CmFzc2VydCAnLi4uJShmb28pcy4uLicgJSB7J2Zvbyc6dSJhYmMifSA9PSB1Jy4uLmFiYy4uLicKYXNzZXJ0ICcuLi4lKGZvbylzLi4uJyAlIHsnZm9vJzoiYWJjIn0gPT0gJy4uLmFiYy4uLicKYXNzZXJ0ICcuLi4lKGZvbylzLi4uJyAlIHt1J2Zvbyc6ImFiYyJ9ID09ICcuLi5hYmMuLi4nCmFzc2VydCAnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIn0gPT0gdScuLi5hYmMuLi4nCmFzc2VydCAnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIiwnZGVmJzoxMjN9ID09ICB1Jy4uLmFiYy4uLicKYXNzZXJ0ICcuLi4lKGZvbylzLi4uJyAlIHt1J2Zvbyc6dSJhYmMiLHUnZGVmJzoxMjN9ID09IHUnLi4uYWJjLi4uJwphc3NlcnQgJy4uLiVzLi4uJXMuLi4lcy4uLiVzLi4uJyAlICgxLDIsMyx1ImFiYyIpID09IHUnLi4uMS4uLjIuLi4zLi4uYWJjLi4uJwphc3NlcnQgJy4uLiVzLi4uJyAlIHUiYWJjIiA9PSB1Jy4uLmFiYy4uLicKcHJpbnQgJ2RvbmUuJwoKIyBUZXN0IGJ1aWx0aW4gY29kZWNzCnByaW50ICdUZXN0aW5nIGJ1aWx0aW4gY29kZWNzLi4uJywKCmFzc2VydCB1bmljb2RlKCdoZWxsbycsJ2FzY2lpJykgPT0gdSdoZWxsbycKYXNzZXJ0IHVuaWNvZGUoJ2hlbGxvJywndXRmLTgnKSA9PSB1J2hlbGxvJwphc3NlcnQgdW5pY29kZSgnaGVsbG8nLCd1dGY4JykgPT0gdSdoZWxsbycKYXNzZXJ0IHVuaWNvZGUoJ2hlbGxvJywnbGF0aW4tMScpID09IHUnaGVsbG8nCgp0cnk6CiAgICB1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknKQogICAgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywnc3RyaWN0JykKZXhjZXB0IFZhbHVlRXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInUnQW5kclwyMDInLmVuY29kZSgnYXNjaWknKSBmYWlsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIgphc3NlcnQgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywnaWdub3JlJykgPT0gIkFuZHIgeCIKYXNzZXJ0IHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsJ3JlcGxhY2UnKSA9PSAiQW5kcj8geCIKCnRyeToKICAgIHVuaWNvZGUoJ0FuZHJcMjAyIHgnLCdhc2NpaScpCiAgICB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdzdHJpY3QnKQpleGNlcHQgVmFsdWVFcnJvcjoKICAgIHBhc3MKZWxzZToKICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCAidW5pY29kZSgnQW5kclwyMDInKSBmYWlsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIgphc3NlcnQgdW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJywnaWdub3JlJykgPT0gdSJBbmRyIHgiCmFzc2VydCB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdyZXBsYWNlJykgPT0gdSdBbmRyXHVGRkZEIHgnCgphc3NlcnQgdSdoZWxsbycuZW5jb2RlKCdhc2NpaScpID09ICdoZWxsbycKYXNzZXJ0IHUnaGVsbG8nLmVuY29kZSgndXRmLTgnKSA9PSAnaGVsbG8nCmFzc2VydCB1J2hlbGxvJy5lbmNvZGUoJ3V0ZjgnKSA9PSAnaGVsbG8nCmFzc2VydCB1J2hlbGxvJy5lbmNvZGUoJ3V0Zi0xNi1sZScpID09ICdoXDAwMGVcMDAwbFwwMDBsXDAwMG9cMDAwJwphc3NlcnQgdSdoZWxsbycuZW5jb2RlKCd1dGYtMTYtYmUnKSA9PSAnXDAwMGhcMDAwZVwwMDBsXDAwMGxcMDAwbycKYXNzZXJ0IHUnaGVsbG8nLmVuY29kZSgnbGF0aW4tMScpID09ICdoZWxsbycKCnUgPSB1Jycuam9pbihtYXAodW5pY2hyLCByYW5nZSgxMDI0KSkpCmZvciBlbmNvZGluZyBpbiAoJ3V0Zi04JywgJ3V0Zi0xNicsICd1dGYtMTYtbGUnLCAndXRmLTE2LWJlJywKICAgICAgICAgICAgICAgICAncmF3X3VuaWNvZGVfZXNjYXBlJywgJ3VuaWNvZGVfZXNjYXBlJywgJ3VuaWNvZGVfaW50ZXJuYWwnKToKICAgIGFzc2VydCB1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZykgPT0gdQoKdSA9IHUnJy5qb2luKG1hcCh1bmljaHIsIHJhbmdlKDI1NikpKQpmb3IgZW5jb2RpbmcgaW4gKAogICAgJ2xhdGluLTEnLAogICAgKToKICAgIHRyeToKICAgICAgICBhc3NlcnQgdW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpID09IHUKICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvcjoKICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCgp1ID0gdScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMTI4KSkpCmZvciBlbmNvZGluZyBpbiAoCiAgICAnYXNjaWknLAogICAgKToKICAgIHRyeToKICAgICAgICBhc3NlcnQgdW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpID09IHUKICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvcjoKICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCgpwcmludCAnZG9uZS4nCgpwcmludCAnVGVzdGluZyBzdGFuZGFyZCBtYXBwaW5nIGNvZGVjcy4uLicsCgpwcmludCAnMC0xMjcuLi4nLApzID0gJycuam9pbihtYXAoY2hyLCByYW5nZSgxMjgpKSkKZm9yIGVuY29kaW5nIGluICgKICAgICdjcDAzNycsICdjcDEwMjYnLAogICAgJ2NwNDM3JywgJ2NwNTAwJywgJ2NwNzM3JywgJ2NwNzc1JywgJ2NwODUwJywKICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCiAgICAnY3A4NjMnLCAnY3A4NjUnLCAnY3A4NjYnLCAKICAgICdpc284ODU5XzEwJywgJ2lzbzg4NTlfMTMnLCAnaXNvODg1OV8xNCcsICdpc284ODU5XzE1JywKICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKICAgICdpc284ODU5XzcnLCAnaXNvODg1OV85JywgJ2tvaThfcicsICdsYXRpbl8xJywKICAgICdtYWNfY3lyaWxsaWMnLCAnbWFjX2xhdGluMicsCgogICAgJ2NwMTI1MCcsICdjcDEyNTEnLCAnY3AxMjUyJywgJ2NwMTI1MycsICdjcDEyNTQnLCAnY3AxMjU1JywKICAgICdjcDEyNTYnLCAnY3AxMjU3JywgJ2NwMTI1OCcsCiAgICAnY3A4NTYnLCAnY3A4NTcnLCAnY3A4NjQnLCAnY3A4NjknLCAnY3A4NzQnLAoKICAgICdtYWNfZ3JlZWsnLCAnbWFjX2ljZWxhbmQnLCdtYWNfcm9tYW4nLCAnbWFjX3R1cmtpc2gnLAogICAgJ2NwMTAwNicsICdjcDg3NScsICdpc284ODU5XzgnLAogICAgCiAgICAjIyMgVGhlc2UgaGF2ZSB1bmRlZmluZWQgbWFwcGluZ3M6CiAgICAjJ2NwNDI0JywKICAgIAogICAgKToKICAgIHRyeToKICAgICAgICBhc3NlcnQgdW5pY29kZShzLGVuY29kaW5nKS5lbmNvZGUoZW5jb2RpbmcpID09IHMKICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvcjoKICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCgpwcmludCAnMTI4LTI1NS4uLicsCnMgPSAnJy5qb2luKG1hcChjaHIsIHJhbmdlKDEyOCwyNTYpKSkKZm9yIGVuY29kaW5nIGluICgKICAgICdjcDAzNycsICdjcDEwMjYnLAogICAgJ2NwNDM3JywgJ2NwNTAwJywgJ2NwNzM3JywgJ2NwNzc1JywgJ2NwODUwJywKICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCiAgICAnY3A4NjMnLCAnY3A4NjUnLCAnY3A4NjYnLCAKICAgICdpc284ODU5XzEwJywgJ2lzbzg4NTlfMTMnLCAnaXNvODg1OV8xNCcsICdpc284ODU5XzE1JywKICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKICAgICdpc284ODU5XzcnLCAnaXNvODg1OV85JywgJ2tvaThfcicsICdsYXRpbl8xJywKICAgICdtYWNfY3lyaWxsaWMnLCAnbWFjX2xhdGluMicsCiAgICAKICAgICMjIyBUaGVzZSBoYXZlIHVuZGVmaW5lZCBtYXBwaW5nczoKICAgICMnY3AxMjUwJywgJ2NwMTI1MScsICdjcDEyNTInLCAnY3AxMjUzJywgJ2NwMTI1NCcsICdjcDEyNTUnLAogICAgIydjcDEyNTYnLCAnY3AxMjU3JywgJ2NwMTI1OCcsCiAgICAjJ2NwNDI0JywgJ2NwODU2JywgJ2NwODU3JywgJ2NwODY0JywgJ2NwODY5JywgJ2NwODc0JywKICAgICMnbWFjX2dyZWVrJywgJ21hY19pY2VsYW5kJywnbWFjX3JvbWFuJywgJ21hY190dXJraXNoJywKICAgIAogICAgIyMjIFRoZXNlIGZhaWwgdGhlIHJvdW5kLXRyaXA6CiAgICAjJ2NwMTAwNicsICdjcDg3NScsICdpc284ODU5XzgnLAogICAgCiAgICApOgogICAgdHJ5OgogICAgICAgIGFzc2VydCB1bmljb2RlKHMsZW5jb2RpbmcpLmVuY29kZShlbmNvZGluZykgPT0gcwogICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgogICAgICAgIHByaW50ICcqKiogY29kZWMgIiVzIiBmYWlsZWQgcm91bmQtdHJpcCcgJSBlbmNvZGluZwogICAgZXhjZXB0IFZhbHVlRXJyb3Isd2h5OgogICAgICAgIHByaW50ICcqKiogY29kZWMgZm9yICIlcyIgZmFpbGVkOiAlcycgJSAoZW5jb2RpbmcsIHdoeSkKCnByaW50ICdkb25lLicKCnByaW50ICdUZXN0aW5nIFVuaWNvZGUgc3RyaW5nIGNvbmNhdGVuYXRpb24uLi4nLAphc3NlcnQgKHUiYWJjIiB1ImRlZiIpID09IHUiYWJjZGVmIgphc3NlcnQgKCJhYmMiIHUiZGVmIikgPT0gdSJhYmNkZWYiCmFzc2VydCAodSJhYmMiICJkZWYiKSA9PSB1ImFiY2RlZiIKYXNzZXJ0ICh1ImFiYyIgdSJkZWYiICJnaGkiKSA9PSB1ImFiY2RlZmdoaSIKYXNzZXJ0ICgiYWJjIiAiZGVmIiB1ImdoaSIpID09IHUiYWJjZGVmZ2hpIgpwcmludCAnZG9uZS4nCgo=