IyEvdXNyL2Jpbi9weXRob24NCiMgLSotIGNvZGluZzogZ2JrIC0qLQ0KDQpmcm9tIGN0eXBlcyBpbXBvcnQgKg0KDQpiY2NjbHRfZGxsID0gTm9uZQ0KeHBhY2tfcGF0aCA9ICdjcGFjay5kYXQnDQoNCmNwYWNrX2ZpZWxkcyA9IFsNCiJzY3VzdF9ubyIsDQoic2N1c3Rfbm8yIiwNCiJzaG9sZGVyX2FjX25vIiwNCiJzaG9sZGVyX2FjX25vMiIsDQoic2hvbGRlcl90eXBlIiwNCiJzaG9sZGVyX3R5cGUyIiwNCiJzbmFtZSIsDQoic25hbWUyIiwNCiJzYWxsX25hbWUiLA0KInNtYXJrZXRfY29kZSIsDQoic21hcmtldF9jb2RlMiIsDQoic2RhdGUwIiwNCiJzZGF0ZTEiLA0KInNkYXRlMiIsDQoic2RhdGUzIiwNCiJzdGltZTAiLA0KInN0aW1lMSIsDQoic3RpbWUyIiwNCiJzdGltZTMiLA0KImx2b2wwIiwNCiJsdm9sMSIsDQoibHZvbDIiLA0KImx2b2wzIiwNCiJsdm9sNCIsDQoibHZvbDUiLA0KImx2b2w2IiwNCiJsdm9sNyIsDQoibHZvbDgiLA0KImx2b2w5IiwNCiJsdm9sMTAiLA0KImx2b2wxMSIsDQoibHZvbDEyIiwNCiJkYW10MCIsDQoiZGFtdDEiLA0KImRhbXQyIiwNCiJkYW10MyIsDQoiZGFtdDQiLA0KImRhbXQ1IiwNCiJkYW10NiIsDQoiZGFtdDciLA0KImRhbXQ4IiwNCiJkYW10OSIsDQoiZGFtdDEwIiwNCiJkYW10MTEiLA0KImRhbXQxMiIsDQoiZGFtdDEzIiwNCiJkYW10MTQiLA0KImRhbXQxNSIsDQoiZGFtdDE2IiwNCiJkYW10MTciLA0KImRhbXQxOCIsDQoiZGFtdDE5IiwNCiJkYW10MjAiLA0KImRhbXQyMSIsDQoiZGFtdDIyIiwNCiJkYW10MjMiLA0KImRhbXQyNCIsDQoiZGFtdDI1IiwNCiJkYW10MjYiLA0KImRhbXQyNyIsDQoiZGFtdDI4IiwNCiJkYW10MjkiLA0KImRhbXQzMCIsDQoiZGFtdDMxIiwNCiJkYW10MzIiLA0KImRhbXQzMyIsDQoic3N0b2NrX2NvZGUiLA0KInNzdG9ja19jb2RlMiIsDQoic2N1c3RfdHlwZSIsDQoic2N1c3RfdHlwZTIiLA0KInNzdGF0X3R5cGUiLA0KInNzdGF0X3R5cGUyIiwNCiJzcm9vbV9ubyIsDQoic3Jvb21fbm8yIiwNCiJzb3Blbl9lbXAiLA0KInNjbG9zZV9lbXAiLA0KInNjaGFuZ2VfZW1wIiwNCiJzY2hlY2tfZW1wIiwNCiJzZW1wIiwNCiJzbmF0aW9uX2NvZGUiLA0KImxjZXJ0X2NvZGUiLA0KInN0eF9wd2QiLA0KInN0eF9wd2QyIiwNCiJzd2l0aGRyYXdfcHdkIiwNCiJzd2l0aGRyYXdfcHdkMiIsDQoic2VtcF9wd2QiLA0KInNlbXBfcHdkMiIsDQoic2JhbmtfcHdkIiwNCiJzYmFua19wd2QyIiwNCiJzY3VzdF9hdXRoIiwNCiJzY3VzdF9hdXRoMiIsDQoic2N1c3RfbGltaXQiLA0KInNjdXN0X2xpbWl0MiIsDQoibHNhZmVfbGV2ZWwiLA0KImxzYWZlX2xldmVsMiIsDQoic3Bvc3RfY29kZSIsDQoic3Bvc3RfY29kZTIiLA0KInNwaG9uZSIsDQoic3Bob25lMiIsDQoic3Bob25lMyIsDQoic3BhZ2VyIiwNCiJzZW1haWwiLA0KInNlbWFpbDIiLA0KInNub3RlIiwNCiJzbm90ZTIiLA0KInNjZXJ0X25vIiwNCiJzY2VydF9ubzIiLA0KInNjZXJ0X2FkZHIiLA0KInNzdGF0dXMwIiwNCiJzc3RhdHVzMSIsDQoic3N0YXR1czIiLA0KInNzdGF0dXMzIiwNCiJzc3RhdHVzNCIsDQoibHdpdGhkcmF3X2ZsYWciLA0KInNhZGRyIiwNCiJzYWRkcjIiLA0KInNzZXJpYWwwIiwNCiJzc2VyaWFsMSIsDQoic3NlcmlhbDIiLA0KInNzZXJpYWwzIiwNCiJzc2VyaWFsNCIsDQoic2N1cnJlbmN5X3R5cGUiLA0KInNjdXJyZW5jeV90eXBlMiIsDQoic2JyYW5jaF9jb2RlMCIsDQoic2JyYW5jaF9jb2RlMSIsDQoic2JyYW5jaF9jb2RlMiIsDQoidXNzZXQwIiwNCiJ1c3NldDEiLA0KInVzc2V0MiIsDQoidXNzZXQzIiwNCiJ1c3NldDQiLA0KInVzc2V0NSIsDQoidXNzZXQ2IiwNCiJzc3RhdGlvbjAiLA0KInNzdGF0aW9uMSIsDQoic2JhbmtfYWNjIiwNCiJzYmFua19hY2MyIiwNCiJsYmFua19hY2NfdHlwZSIsDQoibGJhbmtfYWNjX3R5cGUyIiwNCiJzbWFpbl9mbGFnIiwNCiJzbWFpbl9mbGFnMiIsDQoic2JhbmtfY29kZSIsDQoic2JhbmtfY29kZTIiLA0KInNlbXBfbm8iLA0KInNlbXBfbm8yIiwNCiJkcmF0ZTAiLA0KImRyYXRlMSIsDQoibHNlcmlhbDAiLA0KImxzZXJpYWwxIiwNCiJzYmFua25hbWUiLA0KInNiYW5rbmFtZTIiLA0KInNjYXJkMCIsDQoic2NhcmQxIiwNCiJzb3JkZXIwIiwNCiJzb3JkZXIxIiwNCiJzb3JkZXIyIiwNCiJzY3VzdHR5cGVzIiwNCiJzc2VjdHlwZXMiLA0KInZzbWVzcyIsDQoidnN2YXJzdHIwIiwNCiJ2c3ZhcnN0cjEiLA0KInZzdmFyc3RyMiINCl0NCg0KZGVmIGxvYWRfYmNjY2x0KCk6DQogICAgZ2xvYmFsIGJjY2NsdF9kbGwNCiAgICBiY2NjbHRfZGxsID0gY2RsbC5Mb2FkTGlicmFyeSgnYmNjY2x0LmRsbCcpDQogICAgDQogIA0KbG9hZF9iY2NjbHQoKSAgDQoNCmNsYXNzIHB5QmNjY2x0Og0KICAgIGRydHBfbm8gPSAtMQ0KICAgIA0KICAgIGRlZiBzZXR1cChpcCxwb3J0LHhwYWNrPSdjcGFjay5kYXQnLGRlYnVnPTApOg0KICAgICAgICAnJycgs/XKvLuvICcnJw0KICAgICAgICBnbG9iYWwgeHBhY2tfcGF0aA0KICAgICAgICB4cGFja19wYXRoID0geHBhY2sNCiAgICAgICAgYmNjY2x0X2RsbC5TZXREZWJ1Z1N3aXRjaCggZGVidWcgKQ0KICAgICAgICByID0gYmNjY2x0X2RsbC5CQ0NDTFRJbml0KDEpDQogICAgICAgIGlmIG5vdCByOg0KICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCKz9cq8u6/BrL3Tyqew3CIpDQogICAgICAgIG5vID0gYmNjY2x0X2RsbC5BZGREcnRwTm9kZShpcCxwb3J0KQ0KICAgICAgICBweUJjY2NsdC5kcnRwX25vID0gbm8NCiAgICAgICAgaWYgcHlCY2NjbHQuZHJ0cF9ubyA8IDA6DQogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ7P1yry7r82o0bbGvcyoway908qnsNwnKQ0KICAgICAgICAgICAgDQogICAgICAgIA0KICAgICAgICANCiAgICBzZXR1cCA9IHN0YXRpY21ldGhvZChzZXR1cCkNCiAgICAgICAgDQogICAgZGVmIF9faW5pdF9fKHNlbGYsbWFpbmZ1bmMpOg0KICAgICAgICBzZWxmLmhhbmRsZSA9IGJjY2NsdF9kbGwuTmV3WHBhY2tIYW5kbGUoIHhwYWNrX3BhdGggKQ0KICAgICAgICBzZWxmLm1haW5mdW5jID0gbWFpbmZ1bmMNCiAgICAgICAgc2VsZi5yZXNldCgpDQogICAgICAgIA0KICAgIGRlZiBnZXRfZXJyb3Jtc2coc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLmVycm9yX21zZy52YWx1ZQ0KICAgICAgICANCiAgICBkZWYgcmVzZXQoc2VsZik6DQogICAgICAgIHNlbGYucmVxdWVzdF9yb3cgPSAwDQogICAgICAgIHNlbGYuZXJyb3JfY29kZSA9IGNfaW50KDApDQogICAgICAgIHNlbGYuZXJyb3JfbXNnID0gY3JlYXRlX3N0cmluZ19idWZmZXIoJ1wwMDAnICogMTAyNCkNCiAgICAgICAgc2VsZi5yZXR1cm5fY29kZSA9IGNfaW50KDApDQogICAgICAgIHNlbGYucmVjb3JkX2NvdW50ID0gMA0KICAgICAgICBzZWxmLnJlY29yZCA9IE5vbmUNCiAgICAgICAgc2VsZi50aW1lb3V0ID0gNTAwMA0KICAgICAgICBzZWxmLnJlc3BvbnNlX3JvdyA9IDANCiAgICAgICAgYmNjY2x0X2RsbC5SZXNldFBhY2tIYW5kbGUoc2VsZi5oYW5kbGUpDQogICAgICAgIA0KICAgIGRlZiBjbG9zZShzZWxmKToNCiAgICAgICAgaWYgc2VsZi5oYW5kbGUgPD4gTm9uZToNCiAgICAgICAgICAgIGJjY2NsdF9kbGwuRGVsZXRlWHBhY2tIYW5kbGUoIHNlbGYuaGFuZGxlICkNCiAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQ0KICAgICAgICANCiAgICBkZWYgY2FsbHN2cihzZWxmLGZ1bmMscmVxdWVzdCx0aW1lb3V0ID0gMTAwMCk6DQogICAgICAgIHNlbGYucmVzZXQoKQ0KICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0DQogICAgICAgIGZvciBrLHYgaW4gcmVxdWVzdC5pdGVyaXRlbXMoKToNCiAgICAgICAgICAgIGlmIGsgbm90IGluIGNwYWNrX2ZpZWxkczoNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCLX1rbOICVzILK7tObU2iIgJSBrKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsaW50KToNCiAgICAgICAgICAgICAgICBiY2NjbHRfZGxsLlNldEludEZpZWxkQnlOYW1lKHNlbGYuaGFuZGxlLHNlbGYucmVxdWVzdF9yb3csayx2KQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHYsZmxvYXQpOg0KICAgICAgICAgICAgICAgIGJjY2NsdF9kbGwuU2V0RG91YmxlRmllbGRCeU5hbWUoc2VsZi5oYW5kbGUsc2VsZi5yZXF1ZXN0X3JvdyxrLHYpDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodixzdHIpOg0KICAgICAgICAgICAgICAgIGJjY2NsdF9kbGwuU2V0U3RyaW5nRmllbGRCeU5hbWUoc2VsZi5oYW5kbGUsc2VsZi5yZXF1ZXN0X3JvdyxrLHYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoItfWts4gJXMgyv2+3cDg0M207c7zIiAlIGspDQogICAgICAgICAgICAgICANCiAgICAgICAgYmNjY2x0X2RsbC5TZXRSZXF1ZXN0VHlwZShzZWxmLmhhbmRsZSxmdW5jKQ0KICAgICAgICAjcHJpbnQgIkNhbGxSZXF1ZXN0ICVkOiVkIiAlIChzZWxmLm1haW5mdW5jLGZ1bmMpDQogICAgICAgIGlmIG5vdCBiY2NjbHRfZGxsLkNhbGxSZXF1ZXN0KHNlbGYuaGFuZGxlLHB5QmNjY2x0LmRydHBfbm8sMCxzZWxmLm1haW5mdW5jLHRpbWVvdXQsYnlyZWYoc2VsZi5lcnJvcl9jb2RlKSxzZWxmLmVycm9yX21zZyk6DQogICAgICAgICAgICAjcHJpbnQgIkNhbGxSZXF1ZXN0IGVycm9yICINCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICAgICAgDQogICAgICAgIHNlbGYuZ2V0X3JldHVybl9lcnJvcigpDQogICAgICAgIA0KICAgICAgICBjbnQgPSBjX2ludCgwKQ0KICAgICAgICBiY2NjbHRfZGxsLkdldFJlY29yZENvdW50KHNlbGYuaGFuZGxlLGJ5cmVmKGNudCkpDQogICAgICAgIHNlbGYucmVjb3JkX2NvdW50ID0gY250LnZhbHVlDQogICAgICAgIHJldHVybiBUcnVlDQogICAgICAgICAgICAgICAgDQogICAgZGVmIGdldF9yZXRjb2RlKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5fY29kZS52YWx1ZQ0KICAgICAgICANCiAgICBkZWYgZ2V0X3JldHVybl9lcnJvcihzZWxmKToNCiAgICAgICAgciA9IGJjY2NsdF9kbGwuR2V0UmV0Q29kZShzZWxmLmhhbmRsZSxieXJlZihzZWxmLnJldHVybl9jb2RlKSkNCiAgICAgICAgaWYgbm90IHI6DQogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ8iht7W72MLrtO3O8ycpDQogICAgICAgIGlmIHNlbGYuZ2V0X3JldGNvZGUoKSA8PiAwOg0KICAgICAgICAgICAgYmNjY2x0X2RsbC5HZXRTdHJpbmdGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSwwLCJ2c21lc3MiLHNlbGYuZXJyb3JfbXNnKQ0KICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5fY29kZS52YWx1ZQ0KICAgICAgICANCiAgICBkZWYgaGFzX21vcmVfcmVjb3JkKHNlbGYpOg0KICAgICAgICAjcHJpbnQgInJlc3A6JWQsIHJlY29yZDogJWQiICUgKHNlbGYucmVzcG9uc2Vfcm93ICwgc2VsZi5yZWNvcmRfY291bnQpDQogICAgICAgIGlmIHNlbGYucmVzcG9uc2Vfcm93IDwgc2VsZi5yZWNvcmRfY291bnQ6DQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KICAgICAgICBlbGlmIG5vdCBiY2NjbHRfZGxsLkhhdmVOZXh0UGFjayggc2VsZi5oYW5kbGUgKToNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICBlbGlmIG5vdCBiY2NjbHRfZGxsLkNhbGxOZXh0KHNlbGYuaGFuZGxlLHNlbGYudGltZW91dCxieXJlZihzZWxmLmVycm9yX2NvZGUpLHNlbGYuZXJyb3JfbXNnKToNCiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignu/HIobrz0PjK/b7dsPzS7LOjJykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYucmVzcG9uc2Vfcm93ID0gMA0KICAgICAgICAgICAgc2VsZi5yZWNvcmRfY291bnQgPSAwDQogICAgICAgICAgICBzZWxmLmdldF9yZXR1cm5fZXJyb3IoKQ0KICAgICAgICAgICAgaWYgc2VsZi5nZXRfcmV0Y29kZSgpIDw+IDA6DQogICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCfIobrz0PjK/b7dt7W72LTtzvOjrHJldD0lZCcgJSBzZWxmLmdldF9yZXRjb2RlKCkpDQogICAgICAgICAgICBjbnQgPSBjX2ludCgwKQ0KICAgICAgICAgICAgYmNjY2x0X2RsbC5HZXRSZWNvcmRDb3VudChzZWxmLmhhbmRsZSxieXJlZihjbnQpKQ0KICAgICAgICAgICAgc2VsZi5yZWNvcmRfY291bnQgPSBjbnQudmFsdWUNCiAgICAgICAgICAgIGlmIHNlbGYucmVzcG9uc2Vfcm93ICA8IHNlbGYucmVjb3JkX2NvdW50Og0KICAgICAgICAgICAgICAgIHJldHVybiBUcnVlDQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICANCiAgICBkZWYgY29udmVydF9hc2NpaShzZWxmLGRhdGEpOg0KICAgICAgICBpID0gMA0KICAgICAgICBkYXRhbGVuID0gbGVuKGRhdGEpDQogICAgICAgIHJlc3VsdCA9ICcnDQogICAgICAgIHdoaWxlIGkgPCBkYXRhbGVuOg0KICAgICAgICAgICAgdCA9IGRhdGFbaTppKzJdDQogICAgICAgICAgICB0MSA9IGludCh0LDE2KSAmIDB4RkYNCiAgICAgICAgICAgIGlmICh0MSA8IG9yZCgnMCcpIG9yIHQxID4gb3JkKCc5JykpIGFuZCAodDEgPCBvcmQoJ0EnKSBvciB0MSA+IG9yZCgnRicpKToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJWYWx1ZSBpcyBub24taGV4ZGljaW1hbCAlczolZCIgJSAoY2hyKHQxKSx0MSkpDQogICAgICAgICAgICByZXN1bHQgKz0gY2hyKHQxKQ0KICAgICAgICAgICAgaSArPSAyDQogICAgICAgIHJldHVybiByZXN1bHQNCiAgICAgICAgDQogICAgZGVmIG5leHRfcmVjb3JkKHNlbGYsZmllbGRzKToNCiAgICAgICAgaWYgc2VsZi5yZXNwb25zZV9yb3cgPj0gc2VsZi5yZWNvcmRfY291bnQ6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCfO3r/J08O8x8K8JykNCiAgICAgICAgDQogICAgICAgIHNlbGYucmVjb3JkID0ge30NCiAgICAgICAgZm9yIGYgaW4gZmllbGRzOg0KICAgICAgICAgICAgI3ByaW50ICK78cih19a2ziAiLGYNCiAgICAgICAgICAgIGlmIGYgbm90IGluIGNwYWNrX2ZpZWxkczoNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCLX1rbOICVzILK7tObU2iIgJSBmKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjdHlwZV9maWVsZCA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKGYpDQogICAgICAgICAgICBpZiBmWzBdID09ICdsJzoNCiAgICAgICAgICAgICAgICB2ID0gY19pbnQoMCkNCiAgICAgICAgICAgICAgICByID0gYmNjY2x0X2RsbC5HZXRJbnRGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlc3BvbnNlX3JvdyxjdHlwZV9maWVsZCxieXJlZih2KSkNCiAgICAgICAgICAgICAgICBpZiBub3QgcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigi19a2ziAlcyDOtLe1u9giICUgZikNCiAgICAgICAgICAgICAgICBzZWxmLnJlY29yZFtmXSA9IHYudmFsdWUNCiAgICAgICAgICAgIGVsaWYgZlswXSA9PSAncyc6DQogICAgICAgICAgICAgICAgdiA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCdcMDAwJyAqIDUxMikNCiAgICAgICAgICAgICAgICByID0gYmNjY2x0X2RsbC5HZXRTdHJpbmdGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlc3BvbnNlX3JvdyxjdHlwZV9maWVsZCx2LDUxMSkNCiAgICAgICAgICAgICAgICBpZiBub3QgcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigi19a2ziAlcyDOtLe1u9giICUgZikNCiAgICAgICAgICAgICAgICAjcHJpbnQgIiVzOiAlcyIgJSAoZix2LnZhbHVlKQ0KICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkW2ZdID0gdi52YWx1ZQ0KICAgICAgICAgICAgZWxpZiBmWzBdID09ICdkJzoNCiAgICAgICAgICAgICAgICB2ID0gY19kb3VibGUoMC4wKQ0KICAgICAgICAgICAgICAgIHIgPSBiY2NjbHRfZGxsLkdldERvdWJsZUZpZWxkQnlOYW1lKHNlbGYuaGFuZGxlLHNlbGYucmVzcG9uc2Vfcm93LGN0eXBlX2ZpZWxkLGJ5cmVmKHYpKQ0KICAgICAgICAgICAgICAgIGlmIG5vdCByOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCLX1rbOICVzIM60t7W72CIgJSBmKQ0KICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkW2ZdID0gdi52YWx1ZQ0KICAgICAgICAgICAgZWxpZiBmWzBdID09ICd1JzoNCiAgICAgICAgICAgICAgICB2ID0gY3JlYXRlX3N0cmluZ19idWZmZXIoJ1wwMDAnICogMTAyNCkNCiAgICAgICAgICAgICAgICByID0gYmNjY2x0X2RsbC5HZXRTdHJpbmdGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlc3BvbnNlX3JvdyxjdHlwZV9maWVsZCx2LDEwMjMpDQogICAgICAgICAgICAgICAgaWYgbm90IHI6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoItfWts4gJXMgzrS3tbvYIiAlIGYpDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGRhdGEgPSB2LnZhbHVlDQogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbMjpdDQogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuY29udmVydF9hc2NpaShkYXRhKQ0KICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkW2ZdID0gZGF0YQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCfX1rbOwODQzbTtzvMgJXMnICUgZikNCiAgICAgICAgc2VsZi5yZXNwb25zZV9yb3cgKz0gMQ0KICAgICAgICAjcHJpbnQgImZldGNoIG9uZSByZWNvcmQgLCAiICxzZWxmLnJlY29yZA0KICAgICAgICByZXR1cm4gc2VsZi5yZWNvcmQNCiAgICAgICAgDQogICAgZGVmIGZldGNoX3JlY29yZChzZWxmLGZpZWxkcyk6DQogICAgICAgIHdoaWxlIHNlbGYuaGFzX21vcmVfcmVjb3JkKCk6DQogICAgICAgICAgICByZXQgPSBzZWxmLm5leHRfcmVjb3JkKGZpZWxkcykNCiAgICAgICAgICAgIHlpZWxkIHJldA0KICAgICAgICAgICAgDQogICAgDQogICAgDQogICAgDQogICAgICAgIA==