ZGlmZiAtLWdpdCBhL2JlbmNobWFyay9zY3JpcHRzL3Rlc3RfQmVuY2htYXJrX0RyaXZlci5weSBiL2JlbmNobWFyay9zY3JpcHRzL3Rlc3RfQmVuY2htYXJrX0RyaXZlci5weQppbmRleCA1MWNjOTViLi44YTc1ZDNhIDEwMDY0NAotLS0gYS9iZW5jaG1hcmsvc2NyaXB0cy90ZXN0X0JlbmNobWFya19Ecml2ZXIucHkKKysrIGIvYmVuY2htYXJrL3NjcmlwdHMvdGVzdF9CZW5jaG1hcmtfRHJpdmVyLnB5CkBAIC01NywxMyArNTcsMTMgQEAKIAogICAgIGRlZiB0ZXN0X3J1bl9iZW5jaG1hcmtzX2J5X25hbWVfb3Jfb3JkaW5hbChzZWxmKToKICAgICAgICAgYmVuY2htYXJrcyA9IFsnQW5ncnlQaG9uZWJvb2snLCAnNDInXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHBhcnNlX2FyZ3MoWydydW4nXSArIGJlbmNobWFya3MpLmJlbmNobWFya3MsIGJlbmNobWFya3MpCiAKICAgICBkZWYgdGVzdF9ydW5fYmVuY2htYXJrc19tYXRjaGluZ19wYXR0ZXJuKHNlbGYpOgogICAgICAgICByZWdleGVzID0gWydQcmVmaXgnLCAnLipTdWZmaXguKiddCiAgICAgICAgIGZpbHRlcnMgPSBbJy1mJywgcmVnZXhlc1swXSwgJy1mJywgcmVnZXhlc1sxXV0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfYXJncyhbJ3J1biddICsgZmlsdGVycykuZmlsdGVycywgcmVnZXhlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZV9hcmdzKFsncnVuJ10gKyBmaWx0ZXJzKS5maWx0ZXJzLCByZWdleGVzKQogCiAgICAgZGVmIHRlc3RfcnVuX2JlbmNobWFya3NfYW5kX2ZpbHRlcnNfYXJlX2V4Y2x1c2l2ZShzZWxmKToKICAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoKSBhcyAoXywgZXJyKToKQEAgLTc2LDE3ICs3NiwxNyBAQAogCiAgICAgZGVmIHRlc3RfdGVzdHNfbG9jYXRpb24oc2VsZik6CiAgICAgICAgIGhlcmUgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfYXJncyhbJ3J1biddKS50ZXN0cywgaGVyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZV9hcmdzKFsncnVuJ10pLnRlc3RzLCBoZXJlKQogICAgICAgICB0ZXN0cyA9ICcvYmVuY2htYXJrcy9hcmUvaGVyZScKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfYXJncyhbJ3J1bicsICctdCcsIHRlc3RzXSkudGVzdHMsIHRlc3RzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2FyZ3MoWydydW4nLCAnLXQnLCB0ZXN0c10pLnRlc3RzLCB0ZXN0cykKIAogICAgIGRlZiB0ZXN0X29wdGltaXphdGlvbl9hcmd1bWVudChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfYXJncyhbJ3J1biddKS5vcHRpbWl6YXRpb24sICdPJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfYXJncyhbJ3J1biddKS5vcHRpbWl6YXRpb24sICdPJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHBhcnNlX2FyZ3MoWydydW4nLCAnLW8nLCAnTyddKS5vcHRpbWl6YXRpb24sICdPJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBwYXJzZV9hcmdzKFsncnVuJywgJy1vJywgJ09ub25lJ10pLm9wdGltaXphdGlvbiwgJ09ub25lJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBwYXJzZV9hcmdzKFsncnVuJywgJy1vJywgJ09zaXplJ10pLm9wdGltaXphdGlvbiwgJ09zaXplJykKIAogICAgICAgICB3aXRoIGNhcHR1cmVkX291dHB1dCgpIGFzIChfLCBlcnIpOgpAQCAtOTksOSArOTksOSBAQAogICAgICAgICAgICAgZXJyLmdldHZhbHVlKCkpCiAKICAgICBkZWYgdGVzdF9pbmRlcGVuZGVudF9zYW1wbGVzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZV9hcmdzKFsncnVuJ10pLmluZGVwZW5kZW50X3NhbXBsZXMsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX2FyZ3MoWydydW4nLCAnLWknLCAnMyddKS5pbmRlcGVuZGVudF9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2FyZ3MoWydydW4nXSkuaW5kZXBlbmRlbnRfc2FtcGxlcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZV9hcmdzKFsncnVuJywgJy1pJywgJzMnXSkuaW5kZXBlbmRlbnRfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAzKQogICAgICAgICB3aXRoIGNhcHR1cmVkX291dHB1dCgpIGFzIChvdXQsIGVycik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfYXJncywgWydydW4nLCAnLWknLCAnLTMnXSkKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAgICAgZGVmIHRlc3Rfb3V0cHV0X2RpcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocGFyc2VfYXJncyhbJ3J1biddKS5vdXRwdXRfZGlyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHBhcnNlX2FyZ3MoWydydW4nLCAnLS1vdXRwdXQtZGlyJywgJy9sb2cnXSkub3V0cHV0X2RpciwgJy9sb2cnKQogCiAgICAgZGVmIHRlc3RfY2hlY2tfc3VwcG9ydHNfdmVib3NlX291dHB1dChzZWxmKToKQEAgLTE2OSwxMiArMTY5LDEyIEBACiAgICAgICAgIHNlbGYuc3VicHJvY2Vzc19tb2NrID0gU3VicHJvY2Vzc01vY2soKQogCiAgICAgZGVmIHRlc3RfdGVzdF9oYXJuZXNzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIEJlbmNobWFya0RyaXZlcihzZWxmLmFyZ3MsIHRlc3RzPVsnaWdub3JlZCddKS50ZXN0X2hhcm5lc3MsCiAgICAgICAgICAgICAnL2JlbmNobWFya3MvQmVuY2htYXJrX08nKQogICAgICAgICBzZWxmLmFyZ3MudGVzdHMgPSAnL3BhdGgnCiAgICAgICAgIHNlbGYuYXJncy5vcHRpbWl6YXRpb24gPSAnU3VmZml4JwotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIEJlbmNobWFya0RyaXZlcihzZWxmLmFyZ3MsIHRlc3RzPVsnaWdub3JlZCddKS50ZXN0X2hhcm5lc3MsCiAgICAgICAgICAgICAnL3BhdGgvQmVuY2htYXJrX1N1ZmZpeCcpCiAKQEAgLTE4NSwxMCArMTg1LDEwIEBACiAgICAgICAgIGRyaXZlciA9IEJlbmNobWFya0RyaXZlcigKICAgICAgICAgICAgIHNlbGYuYXJncywgX3N1YnByb2Nlc3M9c2VsZi5zdWJwcm9jZXNzX21vY2spCiAgICAgICAgIHNlbGYuc3VicHJvY2Vzc19tb2NrLmFzc2VydF9jYWxsZWRfYWxsX2V4cGVjdGVkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHJpdmVyLnRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0JlbmNobWFyazEnLCAnQmVuY2htYXJrMiddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkcml2ZXIuYWxsX3Rlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0JlbmNobWFyazEnLCAnQmVuY2htYXJrMiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRyaXZlci50ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0JlbmNobWFyazEnLCAnQmVuY2htYXJrMiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRyaXZlci5hbGxfdGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgWydCZW5jaG1hcmsxJywgJ0JlbmNobWFyazInXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHJpdmVyLnRlc3RfbnVtYmVyWydCZW5jaG1hcmsxJ10sICIxIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHJpdmVyLnRlc3RfbnVtYmVyWydCZW5jaG1hcmsyJ10sICIyIikKIApAQCAtMjA3LDkgKzIwNyw5IEBACiAgICAgICAgIGRyaXZlciA9IEJlbmNobWFya0RyaXZlcigKICAgICAgICAgICAgIHNlbGYuYXJncywgX3N1YnByb2Nlc3M9c2VsZi5zdWJwcm9jZXNzX21vY2spCiAgICAgICAgIHNlbGYuc3VicHJvY2Vzc19tb2NrLmFzc2VydF9jYWxsZWRfYWxsX2V4cGVjdGVkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHJpdmVyLnRlc3RzLCBbJ0JlbmNobWFyazEnLCAnQmVuY2htYXJrMyddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkcml2ZXIuYWxsX3Rlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0JlbmNobWFyazEnLCAnQmVuY2htYXJrMicsICdCZW5jaG1hcmszJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHJpdmVyLnRlc3RzLCBbJ0JlbmNobWFyazEnLCAnQmVuY2htYXJrMyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRyaXZlci5hbGxfdGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgWydCZW5jaG1hcmsxJywgJ0JlbmNobWFyazInLCAnQmVuY2htYXJrMyddKQogCiAgICAgZGVmIHRlc3RfZmlsdGVyc19iZW5jaG1hcmtzX2J5X3BhdHRlcm4oc2VsZik6CiAgICAgICAgIHNlbGYuYXJncy5maWx0ZXJzID0gJy1mIC4rMycuc3BsaXQoKQpAQCAtMjE3LDkgKzIxNyw5IEBACiAgICAgICAgIGRyaXZlciA9IEJlbmNobWFya0RyaXZlcigKICAgICAgICAgICAgIHNlbGYuYXJncywgX3N1YnByb2Nlc3M9c2VsZi5zdWJwcm9jZXNzX21vY2spCiAgICAgICAgIHNlbGYuc3VicHJvY2Vzc19tb2NrLmFzc2VydF9jYWxsZWRfYWxsX2V4cGVjdGVkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHJpdmVyLnRlc3RzLCBbJ0JlbmNobWFyazMnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHJpdmVyLmFsbF90ZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWydCZW5jaG1hcmsxJywgJ0JlbmNobWFyazInLCAnQmVuY2htYXJrMyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRyaXZlci50ZXN0cywgWydCZW5jaG1hcmszJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHJpdmVyLmFsbF90ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0JlbmNobWFyazEnLCAnQmVuY2htYXJrMicsICdCZW5jaG1hcmszJ10pCiAKICAgICBkZWYgdGVzdF9sb2dfZmlsZShzZWxmKToKICAgICAgICAgIiIiV2hlbiBzd2lmdC1yZXBvIGlzIHNldCwgbG9nIGlzIHRpZWQgdG8gR2l0IGJyYW5jaCBhbmQgcmV2aXNpb24uIiIiCkBAIC0yMzAsOCArMjMwLDggQEAKICAgICAgICAgZHJpdmVyID0gQmVuY2htYXJrRHJpdmVyKAogICAgICAgICAgICAgU3R1YihvdXRwdXRfZGlyPScvcGF0aCcsIHRlc3RzPScvYmluLycsIG9wdGltaXphdGlvbj0nU3VmZml4JywKICAgICAgICAgICAgICAgICAgc3dpZnRfcmVwbz1Ob25lLCksIHRlc3RzPVsnaWdub3JlZCddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkcml2ZXIubG9nX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICcvcGF0aC9CZW5jaG1hcmtfU3VmZml4LScgKyBub3cgKyAnLmxvZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHJpdmVyLmxvZ19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICcvcGF0aC9CZW5jaG1hcmtfU3VmZml4LScgKyBub3cgKyAnLmxvZycpCiAKICAgICAgICAgciA9ICcvcmVwby8nCiAgICAgICAgIHN1YnByb2Nlc3NfbW9jayA9IFN1YnByb2Nlc3NNb2NrKHJlc3BvbnNlcz1bCkBAIC0yNDMsOCArMjQzLDggQEAKICAgICAgICAgZHJpdmVyID0gQmVuY2htYXJrRHJpdmVyKAogICAgICAgICAgICAgU3R1YihvdXRwdXRfZGlyPScvbG9nLycsIHRlc3RzPScnLCBvcHRpbWl6YXRpb249J1MnLCBzd2lmdF9yZXBvPXIpLAogICAgICAgICAgICAgdGVzdHM9WydpZ25vcmVkJ10sIF9zdWJwcm9jZXNzPXN1YnByb2Nlc3NfbW9jaykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHJpdmVyLmxvZ19maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnL2xvZy9icmFuY2gvQmVuY2htYXJrX1MtJyArIG5vdyArICctc2hvcnRfaGFzaC5sb2cnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRyaXZlci5sb2dfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnL2xvZy9icmFuY2gvQmVuY2htYXJrX1MtJyArIG5vdyArICctc2hvcnRfaGFzaC5sb2cnKQogICAgICAgICBzdWJwcm9jZXNzX21vY2suYXNzZXJ0X2NhbGxlZF9hbGxfZXhwZWN0ZWQoKQogCiAKQEAgLTMzMiwxNCArMzMyLDE0IEBACiAgICAgICAgICIiIkV4dHJhY3QgdXAgdG8gMjAgbWVhc3VyZW1lbnRzIGZyb20gYW4gaW5kZXBlbmRlbnQgcnVuLiIiIgogICAgICAgICBzZWxmLmRyaXZlci5hcmdzLmluZGVwZW5kZW50X3NhbXBsZXMgPSAzCiAgICAgICAgIHIgPSBzZWxmLmRyaXZlci5ydW5faW5kZXBlbmRlbnRfc2FtcGxlcygnYjEnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnN1YnByb2Nlc3NfbW9jay5jYWxscy5jb3VudCgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1YnByb2Nlc3NfbW9jay5jYWxscy5jb3VudCgKICAgICAgICAgICAgICgnL2JlbmNobWFya3MvQmVuY2htYXJrX08nLCAnYjEnLCAnLS1udW0taXRlcnM9MScsICctLW1lbW9yeScsCiAgICAgICAgICAgICAgJy0tcXVhbnRpbGU9MjAnLCAnLS1kZWx0YScpKSwgMykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5udW1fc2FtcGxlcywgMykgICMgcmVzdWx0cyBhcmUgbWVyZ2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5udW1fc2FtcGxlcywgMykgICMgcmVzdWx0cyBhcmUgbWVyZ2VkCiAKICAgICBkZWYgdGVzdF9ydW5fYW5kX2xvZyhzZWxmKToKICAgICAgICAgZGVmIG1vY2tfcnVuKHRlc3QpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGVzdCwgJ2IxJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdCwgJ2IxJykKICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtYW5jZVRlc3RSZXN1bHQoCiAgICAgICAgICAgICAgICAgJzMsYjEsNSwxMDEsMSwxLDEsMSw4ODgnLnNwbGl0KCcsJyksCiAgICAgICAgICAgICAgICAgcXVhbnRpbGVzPVRydWUsIGRlbHRhPVRydWUsIG1lbW9yeT1UcnVlKQpAQCAtMzUyLDggKzM1Miw4IEBACiAgICAgICAgIGhlYWRlciA9ICcjLFRFU1QsU0FNUExFUyxNSU4ozrxzKSxRMSjOvHMpLE1FRElBTijOvHMpLFEzKM68cyksTUFYKM68cyksJyArXAogICAgICAgICAgICAgJ01BWF9SU1MoQilcbicKICAgICAgICAgY3N2X2xvZyA9ICczLGIxLDUsMTAxLDEwMiwxMDMsMTA0LDEwNSw4ODhcbicKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobG9nLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2csIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBvdXQuZ2V0dmFsdWUoKSwKICAgICAgICAgICAgIGhlYWRlciArCiAgICAgICAgICAgICBjc3ZfbG9nICsKQEAgLTM2Myw4ICszNjMsOCBAQAogICAgICAgICB3aXRoIGNhcHR1cmVkX291dHB1dCgpIGFzIChvdXQsIF8pOgogICAgICAgICAgICAgbG9nID0gZHJpdmVyLnJ1bl9hbmRfbG9nKGNzdl9jb25zb2xlPUZhbHNlKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxvZywgaGVhZGVyICsgY3N2X2xvZykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nLCBoZWFkZXIgKyBjc3ZfbG9nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgb3V0LmdldHZhbHVlKCksCiAgICAgICAgICAgICAnICAjIFRFU1QgICAgICAgICAgICAgICAgICAgICAgU0FNUExFUyBNSU4ozrxzKSBRMSjOvHMpJyArCiAgICAgICAgICAgICAnIE1FRElBTijOvHMpIFEzKM68cykgTUFYKM68cykgTUFYX1JTUyhCKVxuJyArCkBAIC0zNzYsMTEgKzM3NiwxMSBAQAogICAgIGRlZiB0ZXN0X2xvZ19yZXN1bHRzKHNlbGYpOgogICAgICAgICAiIiJDcmVhdGUgbG9nIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCB3cml0ZSB0aGUgbG9nIGZpbGUuIiIiCiAgICAgICAgIGRlZiBhc3NlcnRfbG9nX3dyaXR0ZW4ob3V0LCBsb2dfZmlsZSwgY29udGVudCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvdXQuZ2V0dmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMb2dnaW5nIHJlc3VsdHMgdG86ICcgKyBsb2dfZmlsZSArICdcbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTG9nZ2luZyByZXN1bHRzIHRvOiAnICsgbG9nX2ZpbGUgKyAnXG4nKQogICAgICAgICAgICAgd2l0aCBvcGVuKGxvZ19maWxlLCAnclUnKSBhcyBmOgogICAgICAgICAgICAgICAgIHRleHQgPSBmLnJlYWQoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGV4dCwgImZvcm1hdHRlZCBvdXRwdXQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCAiZm9ybWF0dGVkIG91dHB1dCIpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IHRlbXBmaWxlICAjIHNldFVwCkBAIC00MDgsNyArNDA4LDcgQEAKICAgICBkZWYgdGVzdF9kZXRlcm1pbmlzdGluZ19oYXNoaW5nKHNlbGYpOgogICAgICAgICBjbWQgPSBbJ3ByaW50ZW52JywgJ1NXSUZUX0RFVEVSTUlOSVNUSUNfSEFTSElORyddCiAgICAgICAgIGRyaXZlciA9IEJlbmNobWFya0RyaXZlcihbJ25vIGFyZ3MnXSwgdGVzdHM9WydpZ25vcmVkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRyaXZlci5faW52b2tlKGNtZCkuc3RyaXAoKSwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRyaXZlci5faW52b2tlKGNtZCkuc3RyaXAoKSwgJzEnKQogCiAKIGNsYXNzIEJlbmNobWFya0RyaXZlck1vY2soTW9jayk6CkBAIC00MzcsNyArNDM3LDcgQEAKICAgICAgICAgICAgICduYW1lJzogJ0Jhc2UuY2F0ZWdvcnknLCAnbGV2ZWwnOiBsb2dnaW5nLkRFQlVHLAogICAgICAgICAgICAgJ2xldmVsbmFtZSc6ICdERUJVRycsICdtc2cnOiAnSGkhJ30pCiAgICAgICAgIGYgPSBMb2dnaW5nUmVwb3J0Rm9ybWF0dGVyKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5mb3JtYXQobHIpLCAnREVCVUcgY2F0ZWdvcnk6IEhpIScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5mb3JtYXQobHIpLCAnREVCVUcgY2F0ZWdvcnk6IEhpIScpCiAKICAgICBkZWYgdGVzdF9jb2xvcmVkX2xvZ19mb3JtYXQoc2VsZik6CiAgICAgICAgIGRlZiByZWNvcmQobGV2ZWwsIGxldmVsX25hbWUpOgpAQCAtNDQ1LDIzICs0NDUsMjMgQEAKICAgICAgICAgICAgICAgICAnbmFtZSc6ICdCYXNlLmNhdGVnb3J5JywgJ2xldmVsbm8nOiBsZXZlbCwKICAgICAgICAgICAgICAgICAnbGV2ZWxuYW1lJzogbGV2ZWxfbmFtZSwgJ21zZyc6ICdIaSEnfSkKICAgICAgICAgZiA9IExvZ2dpbmdSZXBvcnRGb3JtYXR0ZXIodXNlX2NvbG9yPVRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuZm9ybWF0KHJlY29yZChsb2dnaW5nLkRFQlVHLCAnREVCVUcnKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdceDFiWzE7MzltY2F0ZWdvcnk6IEhpIVx4MWJbMTswbScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuZm9ybWF0KHJlY29yZChsb2dnaW5nLklORk8sICdJTkZPJykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnXHgxYlsxOzMybWNhdGVnb3J5OiBIaSFceDFiWzE7MG0nKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLmZvcm1hdChyZWNvcmQobG9nZ2luZy5XQVJOSU5HLCAnV0FSTklORycpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4MWJbMTszM21jYXRlZ29yeTogSGkhXHgxYlsxOzBtJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5mb3JtYXQocmVjb3JkKGxvZ2dpbmcuRVJST1IsICdFUlJPUicpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4MWJbMTszMW1jYXRlZ29yeTogSGkhXHgxYlsxOzBtJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5mb3JtYXQocmVjb3JkKGxvZ2dpbmcuQ1JJVElDQUwsICdDUklUSUNBTCcpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4MWJbMTszNW1jYXRlZ29yeTogSGkhXHgxYlsxOzBtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZvcm1hdChyZWNvcmQobG9nZ2luZy5ERUJVRywgJ0RFQlVHJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdceDFiWzE7MzltY2F0ZWdvcnk6IEhpIVx4MWJbMTswbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5mb3JtYXQocmVjb3JkKGxvZ2dpbmcuSU5GTywgJ0lORk8nKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4MWJbMTszMm1jYXRlZ29yeTogSGkhXHgxYlsxOzBtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZvcm1hdChyZWNvcmQobG9nZ2luZy5XQVJOSU5HLCAnV0FSTklORycpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXHgxYlsxOzMzbWNhdGVnb3J5OiBIaSFceDFiWzE7MG0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZm9ybWF0KHJlY29yZChsb2dnaW5nLkVSUk9SLCAnRVJST1InKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4MWJbMTszMW1jYXRlZ29yeTogSGkhXHgxYlsxOzBtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZvcm1hdChyZWNvcmQobG9nZ2luZy5DUklUSUNBTCwgJ0NSSVRJQ0FMJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdceDFiWzE7MzVtY2F0ZWdvcnk6IEhpIVx4MWJbMTswbScpCiAKICAgICBkZWYgdGVzdF9ub19wcmVmaXhfZm9yX2Jhc2VfbG9nZ2luZyhzZWxmKToKICAgICAgICAgbHIgPSBsb2dnaW5nLm1ha2VMb2dSZWNvcmQoewogICAgICAgICAgICAgJ25hbWUnOiAnQmFzZScsICdsZXZlbCc6IGxvZ2dpbmcuSU5GTywKICAgICAgICAgICAgICdsZXZlbG5hbWUnOiAnSU5GTycsICdtc2cnOiAnSGkhJ30pCiAgICAgICAgIGYgPSBMb2dnaW5nUmVwb3J0Rm9ybWF0dGVyKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5mb3JtYXQobHIpLCAnSU5GTyBIaSEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZm9ybWF0KGxyKSwgJ0lORk8gSGkhJykKIAogCiBjbGFzcyBUZXN0TWFya2Rvd25SZXBvcnRIYW5kbGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQ4MSw3ICs0ODEsNyBAQAogICAgICAgICAgICAgJ2xldmVsbm8nOiBsZXZlbCwgJ21zZyc6IG1zZ30pCiAKICAgICBkZWYgdGVzdF9pbml0X3dyaXRlc190YWJsZV9oZWFkZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuaGFuZGxlci5sZXZlbCwgbG9nZ2luZy5JTkZPKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5sZXZlbCwgbG9nZ2luZy5JTkZPKQogICAgICAgICBzZWxmLmFzc2VydF9jb250YWlucyhbJ0JlbmNobWFyayBDaGVjayBSZXBvcnRcbicsICctLS18LS0tJ10pCiAKICAgICBkZWYgdGVzdF9jbG9zZV93cml0ZXNfZmluYWxfbmV3bGluZXMoc2VsZik6CkBAIC01NTIsNyArNTUyLDcgQEAKICAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoKSBhcyAob3V0LCBfKToKICAgICAgICAgICAgIEJlbmNobWFya0RvY3RvcihzZWxmLmFyZ3MsIGRyaXZlcikKICAgICAgICAgc2VsZi5hc3NlcnRfY29udGFpbnMoWydDaGVja2luZyB0ZXN0czogQjEsIEIyJ10sIHNlbGYubG9nc1snZGVidWcnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob3V0LmdldHZhbHVlKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCAnJykKIAogICAgIGRlZiB0ZXN0X3N1cHBvcnRzX3ZlcmJvc2Vfb3V0cHV0KHNlbGYpOgogICAgICAgICBkcml2ZXIgPSBCZW5jaG1hcmtEcml2ZXJNb2NrKHRlc3RzPVsnQjEnLCAnQjInXSkKQEAgLTYwNyw3ICs2MDcsNyBAQAogICAgICAgICAgICAgICdCMSBPIGkxYScsICdCMSBPIGkxYicsICdCMSBPIGkxYycsICdCMSBPIGkxZCcsICdCMSBPIGkxZScsCiAgICAgICAgICAgICAgJ0IxIE8gaTJhJywgJ0IxIE8gaTJiJywgJ0IxIE8gaTJjJywgJ0IxIE8gaTJkJywgJ0IxIE8gaTJlJ10sCiAgICAgICAgICAgICBtZWFzdXJlbWVudHMua2V5cygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtZWFzdXJlbWVudHNbJ25hbWUnXSwgJ0IxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZWFzdXJlbWVudHNbJ25hbWUnXSwgJ0IxJykKICAgICAgICAgc2VsZi5hc3NlcnRfY29udGFpbnMoCiAgICAgICAgICAgICBbJ0NhbGlicmF0aW5nIG51bS1zYW1wbGVzIGZvciBCMTonLAogICAgICAgICAgICAgICdSdW50aW1lIDMwMCDOvHMgeWllbGRzIDQwOTYgYWRqdXN0ZWQgc2FtcGxlcyBwZXIgc2Vjb25kLicsCmRpZmYgLS1naXQgYS9iZW5jaG1hcmsvc2NyaXB0cy90ZXN0X2NvbXBhcmVfcGVyZl90ZXN0cy5weSBiL2JlbmNobWFyay9zY3JpcHRzL3Rlc3RfY29tcGFyZV9wZXJmX3Rlc3RzLnB5CmluZGV4IDA0YWYwNGMuLjZhYzBhMzMgMTAwNjQ0Ci0tLSBhL2JlbmNobWFyay9zY3JpcHRzL3Rlc3RfY29tcGFyZV9wZXJmX3Rlc3RzLnB5CisrKyBiL2JlbmNobWFyay9zY3JpcHRzL3Rlc3RfY29tcGFyZV9wZXJmX3Rlc3RzLnB5CkBAIC0zNSwxNSArMzUsMTUgQEAKIGNsYXNzIFRlc3RTYW1wbGUodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2hhc19uYW1lZF9maWVsZHMoc2VsZik6CiAgICAgICAgIHMgPSBTYW1wbGUoMSwgMiwgMykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5pLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLm51bV9pdGVycywgMikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5ydW50aW1lLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuaSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLm51bV9pdGVycywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJ1bnRpbWUsIDMpCiAKICAgICBkZWYgdGVzdF9pc19pdGVyYWJsZShzZWxmKToKICAgICAgICAgcyA9IFNhbXBsZSgxLCAyLCAzKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWzBdLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWzFdLCAyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWzJdLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMF0sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1sxXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzJdLCAzKQogCiAKIGNsYXNzIFRlc3RQZXJmb3JtYW5jZVRlc3RTYW1wbGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTUyLDM0ICs1MiwzNCBAQAogICAgICAgICBzZWxmLnNhbXBsZXMuYWRkKFNhbXBsZSg3LCA0MiwgMTAwMCkpCiAKICAgICBkZWYgdGVzdF9oYXNfbmFtZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLm5hbWUsICdCMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zYW1wbGVzLm5hbWUsICdCMScpCiAKICAgICBkZWYgdGVzdF9zdG9yZXNfc2FtcGxlcyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLmNvdW50LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2FtcGxlcy5jb3VudCwgMSkKICAgICAgICAgcyA9IHNlbGYuc2FtcGxlcy5zYW1wbGVzWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHMsIFNhbXBsZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuaSwgNykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5udW1faXRlcnMsIDQyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnJ1bnRpbWUsIDEwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMubnVtX2l0ZXJzLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJ1bnRpbWUsIDEwMDApCiAKICAgICBkZWYgdGVzdF9xdWFudGlsZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLnF1YW50aWxlKDEpLCAxMDAwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnNhbXBsZXMucXVhbnRpbGUoMCksIDEwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zYW1wbGVzLnF1YW50aWxlKDEpLCAxMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2FtcGxlcy5xdWFudGlsZSgwKSwgMTAwMCkKICAgICAgICAgc2VsZi5zYW1wbGVzLmFkZChTYW1wbGUoMiwgMSwgMTEwMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc2FtcGxlcy5xdWFudGlsZSgwKSwgMTAwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLnF1YW50aWxlKDEpLCAxMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2FtcGxlcy5xdWFudGlsZSgwKSwgMTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNhbXBsZXMucXVhbnRpbGUoMSksIDExMDApCiAgICAgICAgIHNlbGYuc2FtcGxlcy5hZGQoU2FtcGxlKDMsIDEsIDEwNTApKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnNhbXBsZXMucXVhbnRpbGUoMCksIDEwMDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc2FtcGxlcy5xdWFudGlsZSguNSksIDEwNTApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc2FtcGxlcy5xdWFudGlsZSgxKSwgMTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNhbXBsZXMucXVhbnRpbGUoMCksIDEwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zYW1wbGVzLnF1YW50aWxlKC41KSwgMTA1MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNhbXBsZXMucXVhbnRpbGUoMSksIDExMDApCiAKICAgICBkZWYgYXNzZXJ0RXF1YWxGaXZlTnVtYmVyU3VtbWFyeShzZWxmLCBzcywgZXhwZWN0ZWRfZm5zKToKICAgICAgICAgZV9taW4sIGVfcTEsIGVfbWVkaWFuLCBlX3EzLCBlX21heCA9IGV4cGVjdGVkX2ZucwotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzcy5taW4sIGVfbWluKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzcy5xMSwgZV9xMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3MubWVkaWFuLCBlX21lZGlhbikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3MucTMsIGVfcTMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNzLm1heCwgZV9tYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3MubWluLCBlX21pbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcy5xMSwgZV9xMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcy5tZWRpYW4sIGVfbWVkaWFuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNzLnEzLCBlX3EzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNzLm1heCwgZV9tYXgpCiAKICAgICBkZWYgdGVzdF9jb21wdXRlc19maXZlX251bWJlcl9zdW1tYXJ5KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsRml2ZU51bWJlclN1bW1hcnkoCkBAIC05OCwzOCArOTgsMzggQEAKICAgICAgICAgICAgIHNlbGYuc2FtcGxlcywgKDEwMDAsIDEwMjUsIDEwNTAsIDEwNzUsIDExMDApKQogCiAgICAgZGVmIHRlc3RfY29tcHV0ZXNfaW50ZXJfcXVhcnRpbGVfcmFuZ2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc2FtcGxlcy5pcXIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zYW1wbGVzLmlxciwgMCkKICAgICAgICAgc2VsZi5zYW1wbGVzLmFkZChTYW1wbGUoMiwgMSwgMTAyNSkpCiAgICAgICAgIHNlbGYuc2FtcGxlcy5hZGQoU2FtcGxlKDMsIDEsIDEwNTApKQogICAgICAgICBzZWxmLnNhbXBsZXMuYWRkKFNhbXBsZSg0LCAxLCAxMDc1KSkKICAgICAgICAgc2VsZi5zYW1wbGVzLmFkZChTYW1wbGUoNSwgMSwgMTEwMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc2FtcGxlcy5pcXIsIDUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2FtcGxlcy5pcXIsIDUwKQogCi0gICAgZGVmIGFzc2VydEVxdWFsU3RhdHMoc2VsZiwgc3RhdHMsIGV4cGVjdGVkX3N0YXRzKToKKyAgICBkZWYgYXNzZXJ0RXF1YWx0YXRzKHNlbGYsIHN0YXRzLCBleHBlY3RlZF9zdGF0cyk6CiAgICAgICAgIGZvciBhY3R1YWwsIGV4cGVjdGVkIGluIHppcChzdGF0cywgZXhwZWN0ZWRfc3RhdHMpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgcGxhY2VzPTIpCiAKICAgICBkZWYgdGVzdF9jb21wdXRlc19tZWFuX3NkX2N2KHNlbGYpOgogICAgICAgICBzcyA9IHNlbGYuc2FtcGxlcwotICAgICAgICBzZWxmLmFzc2VydEVxdWFsU3RhdHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWx0YXRzKAogICAgICAgICAgICAgKHNzLm1lYW4sIHNzLnNkLCBzcy5jdiksICgxMDAwLjAsIDAuMCwgMC4wKSkKICAgICAgICAgc2VsZi5zYW1wbGVzLmFkZChTYW1wbGUoMiwgMSwgMTEwMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxTdGF0cygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHRhdHMoCiAgICAgICAgICAgICAoc3MubWVhbiwgc3Muc2QsIHNzLmN2KSwgKDEwNTAuMCwgNzAuNzEsIDYuNyAvIDEwMCkpCiAKICAgICBkZWYgdGVzdF9jb21wdXRlc19yYW5nZV9zcHJlYWQoc2VsZik6CiAgICAgICAgIHNzID0gc2VsZi5zYW1wbGVzCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxTdGF0cygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHRhdHMoCiAgICAgICAgICAgICAoc3MucmFuZ2UsIHNzLnNwcmVhZCksICgwLCAwKSkKICAgICAgICAgc2VsZi5zYW1wbGVzLmFkZChTYW1wbGUoMiwgMSwgMTEwMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxTdGF0cygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHRhdHMoCiAgICAgICAgICAgICAoc3MucmFuZ2UsIHNzLnNwcmVhZCksICgxMDAsIDEwLjAgLyAxMDApKQogCiAgICAgZGVmIHRlc3RfaW5pdF93aXRoX3NhbXBsZXMoc2VsZik6CiAgICAgICAgIHNlbGYuc2FtcGxlcyA9IFBlcmZvcm1hbmNlVGVzdFNhbXBsZXMoCiAgICAgICAgICAgICAnQjInLCBbU2FtcGxlKDAsIDEsIDEwMDApLCBTYW1wbGUoMSwgMSwgMTEwMCldKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnNhbXBsZXMuY291bnQsIDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxTdGF0cygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNhbXBsZXMuY291bnQsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWx0YXRzKAogICAgICAgICAgICAgKHNlbGYuc2FtcGxlcy5tZWFuLCBzZWxmLnNhbXBsZXMuc2QsCiAgICAgICAgICAgICAgc2VsZi5zYW1wbGVzLnJhbmdlLCBzZWxmLnNhbXBsZXMuc3ByZWFkKSwKICAgICAgICAgICAgICgxMDUwLjAsIDcwLjcxLCAxMDAsIDkuNTIgLyAxMDApKQpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgICMgZ3VhcmQgYWdhaW5zdCBkaXZpZGluZyBieSAwCiAgICAgICAgIHNlbGYuc2FtcGxlcyA9IFBlcmZvcm1hbmNlVGVzdFNhbXBsZXMoJ1plcm8nKQogICAgICAgICBzZWxmLnNhbXBsZXMuYWRkKFNhbXBsZSgwLCAxLCAwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbFN0YXRzKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsdGF0cygKICAgICAgICAgICAgIChzZWxmLnNhbXBsZXMubWVhbiwgc2VsZi5zYW1wbGVzLnNkLCBzZWxmLnNhbXBsZXMuY3YsCiAgICAgICAgICAgICAgc2VsZi5zYW1wbGVzLnJhbmdlLCBzZWxmLnNhbXBsZXMuc3ByZWFkKSwKICAgICAgICAgICAgICgwLCAwLCAwLjAsIDAsIDAuMCkpCkBAIC0xNDksMTcgKzE0OSwxNyBAQAogICAgICAgICAgICAgICAnNSAxIDEwMDAsIDYgMSAxMDI1LCA3IDEgMTA1MCwgOCAxIDEwNzUsIDkgMSAxMTAwLCAnCiAgICAgICAgICAgICAgICcxMCAxIDEwNTAsIDExIDEgOTQ5LCAxMiAxIDExNTEnLnNwbGl0KCcsJyldCiAgICAgICAgIHNlbGYuc2FtcGxlcyA9IFBlcmZvcm1hbmNlVGVzdFNhbXBsZXMoJ091dGxpZXJzJywgc3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuc2FtcGxlcy5jb3VudCwgMTMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxTdGF0cygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNhbXBsZXMuY291bnQsIDEzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsdGF0cygKICAgICAgICAgICAgIChzZWxmLnNhbXBsZXMubWVhbiwgc2VsZi5zYW1wbGVzLnNkKSwgKDEwNTAsIDUyLjM2KSkKIAogICAgICAgICBzZWxmLnNhbXBsZXMuZXhjbHVkZV9vdXRsaWVycygpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLmNvdW50LCAxMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLm91dGxpZXJzLCBzc1sxMTpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2FtcGxlcy5jb3VudCwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zYW1wbGVzLm91dGxpZXJzLCBzc1sxMTpdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsRml2ZU51bWJlclN1bW1hcnkoCiAgICAgICAgICAgICBzZWxmLnNhbXBsZXMsICgxMDAwLCAxMDI1LCAxMDUwLCAxMDc1LCAxMTAwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbFN0YXRzKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsdGF0cygKICAgICAgICAgICAgIChzZWxmLnNhbXBsZXMubWVhbiwgc2VsZi5zYW1wbGVzLnNkKSwgKDEwNTAsIDM1LjM2KSkKIAogICAgIGRlZiB0ZXN0X2V4Y2x1ZGVzX291dGxpZXJzX3plcm9fSVFSKHNlbGYpOgpAQCAtMTY4LDEyICsxNjgsMTIgQEAKICAgICAgICAgc2VsZi5zYW1wbGVzLmFkZChTYW1wbGUoMSwgMiwgMTgpKQogICAgICAgICBzZWxmLnNhbXBsZXMuYWRkKFNhbXBsZSgyLCAyLCAxOCkpCiAgICAgICAgIHNlbGYuc2FtcGxlcy5hZGQoU2FtcGxlKDMsIDIsIDE4KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLmlxciwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNhbXBsZXMuaXFyLCAwKQogCiAgICAgICAgIHNlbGYuc2FtcGxlcy5leGNsdWRlX291dGxpZXJzKCkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnNhbXBsZXMuY291bnQsIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxTdGF0cygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNhbXBsZXMuY291bnQsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWx0YXRzKAogICAgICAgICAgICAgKHNlbGYuc2FtcGxlcy5taW4sIHNlbGYuc2FtcGxlcy5tYXgpLCAoMTgsIDE4KSkKIAogICAgIGRlZiB0ZXN0X2V4Y2x1ZGVzX291dGxpZXJzX3RvcF9vbmx5KHNlbGYpOgpAQCAtMTgxLDYxICsxODEsNjEgQEAKICAgICAgICAgICAgICAgJzAgMSAxLCAxIDEgMiwgMiAxIDIsIDMgMSAyLCA0IDEgMycuc3BsaXQoJywnKV0KICAgICAgICAgc2VsZi5zYW1wbGVzID0gUGVyZm9ybWFuY2VUZXN0U2FtcGxlcygnVG9wJywgc3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxGaXZlTnVtYmVyU3VtbWFyeShzZWxmLnNhbXBsZXMsICgxLCAyLCAyLCAyLCAzKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLmlxciwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNhbXBsZXMuaXFyLCAwKQogCiAgICAgICAgIHNlbGYuc2FtcGxlcy5leGNsdWRlX291dGxpZXJzKHRvcF9vbmx5PVRydWUpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5zYW1wbGVzLmNvdW50LCA0KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsU3RhdHMoKHNlbGYuc2FtcGxlcy5taW4sIHNlbGYuc2FtcGxlcy5tYXgpLCAoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zYW1wbGVzLmNvdW50LCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsdGF0cygoc2VsZi5zYW1wbGVzLm1pbiwgc2VsZi5zYW1wbGVzLm1heCksICgxLCAyKSkKIAogCiBjbGFzcyBUZXN0UGVyZm9ybWFuY2VUZXN0UmVzdWx0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgogICAgICAgICBsb2dfbGluZSA9ICcxLEFuZ3J5UGhvbmVib29rLDIwLDEwNjY0LDEyOTMzLDExMDM1LDU3NiwxMDg4NCcKICAgICAgICAgciA9IFBlcmZvcm1hbmNlVGVzdFJlc3VsdChsb2dfbGluZS5zcGxpdCgnLCcpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLnRlc3RfbnVtLCAnMScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIubmFtZSwgJ0FuZ3J5UGhvbmVib29rJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci50ZXN0X251bSwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubmFtZSwgJ0FuZ3J5UGhvbmVib29rJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIChyLm51bV9zYW1wbGVzLCByLm1pbiwgci5tYXgsIHIubWVhbiwgci5zZCwgci5tZWRpYW4pLAogICAgICAgICAgICAgKDIwLCAxMDY2NCwgMTI5MzMsIDExMDM1LCA1NzYsIDEwODg0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5zYW1wbGVzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuc2FtcGxlcywgTm9uZSkKIAogICAgICAgICBsb2dfbGluZSA9ICcxLEFuZ3J5UGhvbmVib29rLDEsMTIwNDUsMTIwNDUsMTIwNDUsMCwxMjA0NSwxMDUxMDMzNicKICAgICAgICAgciA9IFBlcmZvcm1hbmNlVGVzdFJlc3VsdChsb2dfbGluZS5zcGxpdCgnLCcpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLm1heF9yc3MsIDEwNTEwMzM2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubWF4X3JzcywgMTA1MTAzMzYpCiAKICAgICBkZWYgdGVzdF9pbml0X3F1YW50aWxlcyhzZWxmKToKICAgICAgICAgIyAjLFRFU1QsU0FNUExFUyxNSU4ozrxzKSxNRURJQU4ozrxzKSxNQVgozrxzKQogICAgICAgICBsb2cgPSAnMSxBY2tlcm1hbm4sMyw1NDM4Myw1NDUxMiw1NDYwMScKICAgICAgICAgciA9IFBlcmZvcm1hbmNlVGVzdFJlc3VsdChsb2cuc3BsaXQoJywnKSwgcXVhbnRpbGVzPVRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIudGVzdF9udW0sICcxJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5uYW1lLCAnQWNrZXJtYW5uJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHIubnVtX3NhbXBsZXMsIHIubWluLCByLm1lZGlhbiwgci5tYXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgNTQzODMsIDU0NTEyLCA1NDYwMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci50ZXN0X251bSwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubmFtZSwgJ0Fja2VybWFubicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHIubnVtX3NhbXBsZXMsIHIubWluLCByLm1lZGlhbiwgci5tYXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgzLCA1NDM4MywgNTQ1MTIsIDU0NjAxKSkKICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMoci5tZWFuLCA1NDQ5OC42NywgcGxhY2VzPTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHIuc2QsIDEwOS42MSwgcGxhY2VzPTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIuc2FtcGxlcy5jb3VudCwgMykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5zYW1wbGVzLm51bV9zYW1wbGVzLCAzKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbcy5ydW50aW1lIGZvciBzIGluIHIuc2FtcGxlcy5hbGxfc2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFs1NDM4MywgNTQ1MTIsIDU0NjAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnNhbXBsZXMuY291bnQsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5zYW1wbGVzLm51bV9zYW1wbGVzLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtzLnJ1bnRpbWUgZm9yIHMgaW4gci5zYW1wbGVzLmFsbF9zYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbNTQzODMsIDU0NTEyLCA1NDYwMV0pCiAKICAgICAgICAgIyAjLFRFU1QsU0FNUExFUyxNSU4ozrxzKSxNRURJQU4ozrxzKSxNQVgozrxzKSxNQVhfUlNTKEIpCiAgICAgICAgIGxvZyA9ICcxLEFja2VybWFubiwzLDU0NTI5LDU0NzYwLDU1ODA3LDI2NjI0MCcKICAgICAgICAgciA9IFBlcmZvcm1hbmNlVGVzdFJlc3VsdChsb2cuc3BsaXQoJywnKSwgcXVhbnRpbGVzPVRydWUsIG1lbW9yeT1UcnVlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoci5zYW1wbGVzLmNvdW50LCByLm1heF9yc3MpLCAoMywgMjY2MjQwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoci5zYW1wbGVzLmNvdW50LCByLm1heF9yc3MpLCAoMywgMjY2MjQwKSkKICAgICAgICAgIyAjLFRFU1QsU0FNUExFUyxNSU4ozrxzKSxRMSjOvHMpLFEyKM68cyksUTMozrxzKSxNQVgozrxzKQogICAgICAgICBsb2cgPSAnMSxBY2tlcm1hbm4sNSw1NDU3MCw1NDU5Myw1NDY0NCw1NzIxMiw1ODMwNCcKICAgICAgICAgciA9IFBlcmZvcm1hbmNlVGVzdFJlc3VsdChsb2cuc3BsaXQoJywnKSwgcXVhbnRpbGVzPVRydWUsIG1lbW9yeT1GYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHIubnVtX3NhbXBsZXMsIHIubWluLCByLm1lZGlhbiwgci5tYXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgNTQ1NzAsIDU0NjQ0LCA1ODMwNCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKChyLnNhbXBsZXMucTEsIHIuc2FtcGxlcy5xMyksICg1NDU5MywgNTcyMTIpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLnNhbXBsZXMuY291bnQsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHIubnVtX3NhbXBsZXMsIHIubWluLCByLm1lZGlhbiwgci5tYXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICg1LCA1NDU3MCwgNTQ2NDQsIDU4MzA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoci5zYW1wbGVzLnExLCByLnNhbXBsZXMucTMpLCAoNTQ1OTMsIDU3MjEyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnNhbXBsZXMuY291bnQsIDUpCiAgICAgICAgICMgIyxURVNULFNBTVBMRVMsTUlOKM68cyksUTEozrxzKSxRMijOvHMpLFEzKM68cyksTUFYKM68cyksTUFYX1JTUyhCKQogICAgICAgICBsb2cgPSAnMSxBY2tlcm1hbm4sNSw1NDY4Niw1NDczMSw1NDc3NCw1NTAzMCw2MzQ2NiwyNzAzMzYnCiAgICAgICAgIHIgPSBQZXJmb3JtYW5jZVRlc3RSZXN1bHQobG9nLnNwbGl0KCcsJyksIHF1YW50aWxlcz1UcnVlLCBtZW1vcnk9VHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5zYW1wbGVzLm51bV9zYW1wbGVzLCA1KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLnNhbXBsZXMuY291bnQsIDQpICAjIG91dGxpZXIgd2FzIGV4Y2x1ZGVkCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIubWF4X3JzcywgMjcwMzM2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuc2FtcGxlcy5udW1fc2FtcGxlcywgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnNhbXBsZXMuY291bnQsIDQpICAjIG91dGxpZXIgd2FzIGV4Y2x1ZGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5tYXhfcnNzLCAyNzAzMzYpCiAKICAgICBkZWYgdGVzdF9pbml0X2RlbHRhX3F1YW50aWxlcyhzZWxmKToKICAgICAgICAgIyAjLFRFU1QsU0FNUExFUyxNSU4ozrxzKSzwnZqrTUVESUFOLPCdmqtNQVgKQEAgLTI0MywxMCArMjQzLDEwIEBACiAgICAgICAgICMgdGhlIGRpZmZlcmVuY2UgaXMgMCwgd2hpY2ggaXMgb21taXRlZCAtLSBvbmx5IHNlcGFyYXRvciByZW1haW5zCiAgICAgICAgIGxvZyA9ICcyMDIsRHJvcFdoaWxlQXJyYXksMiwyNjUsLDIyJwogICAgICAgICByID0gUGVyZm9ybWFuY2VUZXN0UmVzdWx0KGxvZy5zcGxpdCgnLCcpLCBxdWFudGlsZXM9VHJ1ZSwgZGVsdGE9VHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHIubnVtX3NhbXBsZXMsIHIubWluLCByLm1lZGlhbiwgci5tYXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMjY1LCAyNjUsIDI4NykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIuc2FtcGxlcy5jb3VudCwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5zYW1wbGVzLm51bV9zYW1wbGVzLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChyLm51bV9zYW1wbGVzLCByLm1pbiwgci5tZWRpYW4sIHIubWF4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMjY1LCAyNjUsIDI4NykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5zYW1wbGVzLmNvdW50LCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuc2FtcGxlcy5udW1fc2FtcGxlcywgMikKIAogICAgIGRlZiB0ZXN0X2luaXRfb3ZlcnNhbXBsZWRfcXVhbnRpbGVzKHNlbGYpOgogICAgICAgICAiIiJXaGVuIG51bV9zYW1wbGVzIGlzIDwgcXVhbnRpbGUgKyAxLCBzb21lIG9mIHRoZSBtZWFzdXJlbWVudHMgYXJlCkBAIC0yNjUsOSArMjY1LDkgQEAKICAgICAgICAgICAgIG51bV9zYW1wbGVzID0gZGVxLmNvdW50KCcxJykKICAgICAgICAgICAgIHIgPSBQZXJmb3JtYW5jZVRlc3RSZXN1bHQoWycwJywgJ0InLCBzdHIobnVtX3NhbXBsZXMpXSArIGRlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpbGVzPVRydWUsIGRlbHRhPVRydWUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLnNhbXBsZXMubnVtX3NhbXBsZXMsIG51bV9zYW1wbGVzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoW3MucnVudGltZSBmb3IgcyBpbiByLnNhbXBsZXMuYWxsX3NhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UoMSwgbnVtX3NhbXBsZXMgKyAxKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5zYW1wbGVzLm51bV9zYW1wbGVzLCBudW1fc2FtcGxlcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3MucnVudGltZSBmb3IgcyBpbiByLnNhbXBsZXMuYWxsX3NhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSgxLCBudW1fc2FtcGxlcyArIDEpKQogCiAgICAgICAgIGRlbHRhX2VuY29kZWRfcXVhbnRpbGVzID0gIiIiCiAxLCwKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CiAgICAgICAgIGxvZ19saW5lID0gJzEsQW5ncnlQaG9uZWJvb2ssMjAsMTA2NjQsMTI5MzMsMTEwMzUsNTc2LDEwODg0JwogICAgICAgICByID0gUGVyZm9ybWFuY2VUZXN0UmVzdWx0KGxvZ19saW5lLnNwbGl0KCcsJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgc3RyKHIpLAogICAgICAgICAgICAgJzxQZXJmb3JtYW5jZVRlc3RSZXN1bHQgbmFtZTpcJ0FuZ3J5UGhvbmVib29rXCcgc2FtcGxlczoyMCAnCiAgICAgICAgICAgICAnbWluOjEwNjY0IG1heDoxMjkzMyBtZWFuOjExMDM1IHNkOjU3NiBtZWRpYW46MTA4ODQ+JwpAQCAtMzMzLDE3ICszMzMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgci5zZCwgci5tZWRpYW4sIHIubWF4X3Jzcywgci5zZXR1cCkKIAogICAgICAgICByID0gcmVzdWx0c1swXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhc190dXBsZShyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsIDEyMDQ1LCAxMjA0NSwgMTIwNDUsIDAsIDEyMDQ1LCBOb25lLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc190dXBsZShyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgMTIwNDUsIDEyMDQ1LCAxMjA0NSwgMCwgMTIwNDUsIE5vbmUsIE5vbmUpKQogICAgICAgICByLm1lcmdlKHJlc3VsdHNbMV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFzX3R1cGxlKHIpLCAgIyBkcm9wcyBTRCBhbmQgbWVkaWFuLCArbWF4X3JzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMTIwNDUsIDEyMzI1LCAxMjE4NSwgTm9uZSwgTm9uZSwgMTA1MTAzMzYsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzX3R1cGxlKHIpLCAgIyBkcm9wcyBTRCBhbmQgbWVkaWFuLCArbWF4X3JzcworICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAxMjA0NSwgMTIzMjUsIDEyMTg1LCBOb25lLCBOb25lLCAxMDUxMDMzNiwgTm9uZSkpCiAgICAgICAgIHIubWVyZ2UocmVzdWx0c1syXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXNfdHVwbGUociksICAjIHBpY2tzIHNtYWxsZXIgb2YgdGhlIE1BWF9SU1MsICtzZXR1cAotICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgMTE2MTYsIDEyMzI1LCAxMTk5NS4zMywgTm9uZSwgTm9uZSwgMTA1MDIxNDQsIDkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzX3R1cGxlKHIpLCAgIyBwaWNrcyBzbWFsbGVyIG9mIHRoZSBNQVhfUlNTLCArc2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMywgMTE2MTYsIDEyMzI1LCAxMTk5NS4zMywgTm9uZSwgTm9uZSwgMTA1MDIxNDQsIDkpKQogICAgICAgICByLm1lcmdlKHJlc3VsdHNbM10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFzX3R1cGxlKHIpLCAgIyBwaWNrcyBzbWFsbGVyIG9mIHRoZSBzZXR1cCB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsIDExNjE2LCAxMjMyNSwgMTIwNjQsIE5vbmUsIE5vbmUsIDEwNDk4MDQ4LCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc190dXBsZShyKSwgICMgcGlja3Mgc21hbGxlciBvZiB0aGUgc2V0dXAgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgKDQsIDExNjE2LCAxMjMyNSwgMTIwNjQsIE5vbmUsIE5vbmUsIDEwNDk4MDQ4LCA3KSkKIAogCiBjbGFzcyBUZXN0UmVzdWx0Q29tcGFyaXNvbih1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0zNTksMTQgKzM1OSwxNCBAQAogCiAgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKICAgICAgICAgcmMgPSBSZXN1bHRDb21wYXJpc29uKHNlbGYucjEsIHNlbGYucjIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJjLm5hbWUsICdBbmdyeVBob25lYm9vaycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMubmFtZSwgJ0FuZ3J5UGhvbmVib29rJykKICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMocmMucmF0aW8sIDEyMzI1LjAgLyAxMTYxNi4wKQogICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFscyhyYy5kZWx0YSwgKCgoMTE2MTYuMCAvIDEyMzI1LjApIC0gMSkgKiAxMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZXM9MykKICAgICAgICAgIyBoYW5kbGUgdGVzdCByZXN1bHRzIHRoYXQgc29tZXRpbWVzIGNoYW5nZSB0byB6ZXJvLCB3aGVuIGNvbXBpbGVyCiAgICAgICAgICMgb3B0aW1pemVzIG91dCB0aGUgYm9keSBvZiB0aGUgaW5jb3JyZWN0bHkgd3JpdHRlbiB0ZXN0CiAgICAgICAgIHJjID0gUmVzdWx0Q29tcGFyaXNvbihzZWxmLnIwLCBzZWxmLnIwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyYy5uYW1lLCAnR2xvYmFsQ2xhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLm5hbWUsICdHbG9iYWxDbGFzcycpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHJjLnJhdGlvLCAxKQogICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFscyhyYy5kZWx0YSwgMCwgcGxhY2VzPTMpCiAgICAgICAgIHJjID0gUmVzdWx0Q29tcGFyaXNvbihzZWxmLnIwLCBzZWxmLnIwMSkKQEAgLTQ1MiwxNCArNDUyLDE0IEBACiAgICAgICAgIHBhcnNlciA9IExvZ1BhcnNlcigpCiAgICAgICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2VfcmVzdWx0cyhsb2cuc3BsaXRsaW5lcygpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyZXN1bHRzWzBdLCBQZXJmb3JtYW5jZVRlc3RSZXN1bHQpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHRzWzBdLm5hbWUsICdCaXRDb3VudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0c1swXS5uYW1lLCAnQml0Q291bnQnKQogCiAgICAgZGVmIHRlc3RfcGFyc2VfcmVzdWx0c190YWJfZGVsaW1pdGVkKHNlbGYpOgogICAgICAgICBsb2cgPSAnMzRcdEJpdENvdW50XHQyMFx0M1x0NFx0NFx0MFx0NCcKICAgICAgICAgcGFyc2VyID0gTG9nUGFyc2VyKCkKICAgICAgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZV9yZXN1bHRzKGxvZy5zcGxpdGxpbmVzKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJlc3VsdHNbMF0sIFBlcmZvcm1hbmNlVGVzdFJlc3VsdCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdHNbMF0ubmFtZSwgJ0JpdENvdW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzWzBdLm5hbWUsICdCaXRDb3VudCcpCiAKICAgICBkZWYgdGVzdF9wYXJzZV9yZXN1bHRzX2Zvcm1hdHRlZF90ZXh0KHNlbGYpOgogICAgICAgICAiIiJQYXJzZSBmb3JtYXQgdGhhdCBCZW5jaG1hcmtfRHJpdmVyIHByaW50cyB0byBjb25zb2xlIiIiCkBAIC00NzMsMzIgKzQ3MywzMiBAQAogICAgICAgICByZXN1bHRzID0gcGFyc2VyLnBhcnNlX3Jlc3VsdHMobG9nLnNwbGl0bGluZXMoKVsxOl0pICAjIHdpdGhvdXQgMXN0IFxuCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJlc3VsdHNbMF0sIFBlcmZvcm1hbmNlVGVzdFJlc3VsdCkpCiAgICAgICAgIHIgPSByZXN1bHRzWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIubmFtZSwgJ0FycmF5MkQnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLm1heF9yc3MsIDIwOTE1MjAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubmFtZSwgJ0FycmF5MkQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubWF4X3JzcywgMjA5MTUyMDApCiAKICAgICBkZWYgdGVzdF9wYXJzZV9xdWFudGlsZXMoc2VsZik6CiAgICAgICAgICIiIkdhdGhlcnMgc2FtcGxlcyBmcm9tIHJlcG9ydGVkIHF1YW50aWxlcy4gSGFuZGxlcyBvcHRpb25hbCBtZW1vcnkuIiIiCiAgICAgICAgIHIgPSBMb2dQYXJzZXIucmVzdWx0c19mcm9tX3N0cmluZygKICAgICAgICAgICAgICIiIiMsVEVTVCxTQU1QTEVTLE1JTijOvHMpLE1FRElBTijOvHMpLE1BWCjOvHMpCiAxLEFja2VybWFubiwzLDU0MzgzLDU0NTEyLDU0NjAxIiIiKVsnQWNrZXJtYW5uJ10KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoW3MucnVudGltZSBmb3IgcyBpbiByLnNhbXBsZXMuYWxsX3NhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBbNTQzODMsIDU0NTEyLCA1NDYwMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3MucnVudGltZSBmb3IgcyBpbiByLnNhbXBsZXMuYWxsX3NhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFs1NDM4MywgNTQ1MTIsIDU0NjAxXSkKICAgICAgICAgciA9IExvZ1BhcnNlci5yZXN1bHRzX2Zyb21fc3RyaW5nKAogICAgICAgICAgICAgIiIiIyxURVNULFNBTVBMRVMsTUlOKM68cyksTUVESUFOKM68cyksTUFYKM68cyksTUFYX1JTUyhCKQogMSxBY2tlcm1hbm4sMyw1NDUyOSw1NDc2MCw1NTgwNywyNjYyNDAiIiIpWydBY2tlcm1hbm4nXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbcy5ydW50aW1lIGZvciBzIGluIHIuc2FtcGxlcy5hbGxfc2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFs1NDUyOSwgNTQ3NjAsIDU1ODA3XSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5tYXhfcnNzLCAyNjYyNDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3MucnVudGltZSBmb3IgcyBpbiByLnNhbXBsZXMuYWxsX3NhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFs1NDUyOSwgNTQ3NjAsIDU1ODA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLm1heF9yc3MsIDI2NjI0MCkKIAogICAgIGRlZiB0ZXN0X3BhcnNlX2RlbHRhX3F1YW50aWxlcyhzZWxmKToKICAgICAgICAgciA9IExvZ1BhcnNlci5yZXN1bHRzX2Zyb21fc3RyaW5nKCAgIyAyLXF1YW50aWxlIGFrYS4gbWVkaWFuCiAgICAgICAgICAgICAnIyxURVNULFNBTVBMRVMsTUlOKM68cyks8J2aq01FRElBTizwnZqrTUFYXG4wLEIsMSwxMDEsLCcpWydCJ10KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAoci5udW1fc2FtcGxlcywgci5taW4sIHIubWVkaWFuLCByLm1heCwgci5zYW1wbGVzLmNvdW50KSwKICAgICAgICAgICAgICgxLCAxMDEsIDEwMSwgMTAxLCAxKSkKICAgICAgICAgciA9IExvZ1BhcnNlci5yZXN1bHRzX2Zyb21fc3RyaW5nKAogICAgICAgICAgICAgJyMsVEVTVCxTQU1QTEVTLE1JTijOvHMpLPCdmqtNRURJQU4s8J2aq01BWFxuMCxCLDIsMTAxLCwxJylbJ0InXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIChyLm51bV9zYW1wbGVzLCByLm1pbiwgci5tZWRpYW4sIHIubWF4LCByLnNhbXBsZXMuY291bnQpLAogICAgICAgICAgICAgKDIsIDEwMSwgMTAxLCAxMDIsIDIpKQogICAgICAgICByID0gTG9nUGFyc2VyLnJlc3VsdHNfZnJvbV9zdHJpbmcoICAjIDIwLXF1YW50aWxlcyBha2EuIHZlbnRpbGVzCkBAIC01MDYsNyArNTA2LDcgQEAKICAgICAgICAgICAgICfwnZqrVjks8J2aq1ZBLPCdmqtWQizwnZqrVkMs8J2aq1ZELPCdmqtWRSzwnZqrVkYs8J2aq1ZHLPCdmqtWSCzwnZqrVkks8J2aq1ZKLPCdmqtNQVhcbicgKwogICAgICAgICAgICAgJzIwMixEcm9wV2hpbGVBcnJheSwyMDAsMjE0LCwsLCwsLCwsLCwsMSwsLCwsLDIsMTYsNDY0JwogICAgICAgICApWydEcm9wV2hpbGVBcnJheSddCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgKHIubnVtX3NhbXBsZXMsIHIubWluLCByLm1heCwgci5zYW1wbGVzLmNvdW50KSwKICAgICAgICAgICAgICMgbGFzdCAzIHZlbnRpbGVzIHdlcmUgb3V0bGllcnMgYW5kIHdlcmUgZXhjbHVkZWQgZnJvbSB0aGUgc2FtcGxlCiAgICAgICAgICAgICAoMjAwLCAyMTQsIDIxNSwgMTgpKQpAQCAtNTM4LDI4ICs1MzgsMjggQEAKICAgICAgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZV9yZXN1bHRzKHZlcmJvc2VfbG9nLnNwbGl0KCdcbicpKQogCiAgICAgICAgIHIgPSByZXN1bHRzWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgKHIubmFtZSwgci5taW4sIHIubWF4LCBpbnQoci5tZWFuKSwgaW50KHIuc2QpLCByLm1lZGlhbiksCiAgICAgICAgICAgICAoJ0FuZ3J5UGhvbmVib29rJywgMTE0NjcsIDEzODk4LCAxMjM5MiwgMTMxNSwgMTE4MTIpCiAgICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5udW1fc2FtcGxlcywgci5zYW1wbGVzLm51bV9zYW1wbGVzKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHRzWzBdLnNhbXBsZXMuYWxsX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwgNzgsIDExODEyKSwgKDEsIDkwLCAxMzg5OCksICgyLCA5MCwgMTE0NjcpXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci55aWVsZHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5udW1fc2FtcGxlcywgci5zYW1wbGVzLm51bV9zYW1wbGVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHNbMF0uc2FtcGxlcy5hbGxfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDAsIDc4LCAxMTgxMiksICgxLCA5MCwgMTM4OTgpLCAoMiwgOTAsIDExNDY3KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci55aWVsZHMsIE5vbmUpCiAKICAgICAgICAgciA9IHJlc3VsdHNbMV0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAoci5uYW1lLCByLm1pbiwgci5tYXgsIGludChyLm1lYW4pLCBpbnQoci5zZCksIHIubWVkaWFuKSwKICAgICAgICAgICAgICgnQXJyYXkyRCcsIDM2OTkwMCwgMzgxMDM5LCAzNzM5OTQsIDYxMjcsIDM3MTA0MykKICAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLnNldHVwLCAxNDQ0NCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5udW1fc2FtcGxlcywgci5zYW1wbGVzLm51bV9zYW1wbGVzKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHRzWzFdLnNhbXBsZXMuYWxsX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwgMSwgMzY5OTAwKSwgKDEsIDEsIDM4MTAzOSksICgyLCAxLCAzNzEwNDMpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnNldHVwLCAxNDQ0NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLm51bV9zYW1wbGVzLCByLnNhbXBsZXMubnVtX3NhbXBsZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0c1sxXS5zYW1wbGVzLmFsbF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwgMSwgMzY5OTAwKSwgKDEsIDEsIDM4MTAzOSksICgyLCAxLCAzNzEwNDMpXSkKICAgICAgICAgeWllbGRlZCA9IHIueWllbGRzWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHlpZWxkZWQuYmVmb3JlX3NhbXBsZSwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeWllbGRlZC5hZnRlciwgMzY5OTE4KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLnlpZWxkcywgWygxLCAzNjk5MTgpLCAoMiwgMzgxMDM5KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeWllbGRlZC5iZWZvcmVfc2FtcGxlLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHlpZWxkZWQuYWZ0ZXIsIDM2OTkxOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnlpZWxkcywgWygxLCAzNjk5MTgpLCAoMiwgMzgxMDM5KV0pCiAKICAgICBkZWYgdGVzdF9wYXJzZV9lbnZpcm9ubWVudF92ZXJib3NlKHNlbGYpOgogICAgICAgICAiIiJQYXJzZSBzdGF0cyBhYm91dCBlbnZpcm9ubWVudCBpbiB2ZXJib3NlIG1vZGUuIiIiCkBAIC01NzIsMjEgKzU3MiwyMSBAQAogICAgICAgICByZXN1bHRzID0gcGFyc2VyLnBhcnNlX3Jlc3VsdHModmVyYm9zZV9sb2cuc3BsaXQoJ1xuJykpCiAKICAgICAgICAgciA9IHJlc3VsdHNbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5tYXhfcnNzLCAzMjc2OCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5tZW1fcGFnZXMsIDgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIudm9sdW50YXJ5X2NzLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLmludm9sdW50YXJ5X2NzLCAxMTA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubWF4X3JzcywgMzI3NjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5tZW1fcGFnZXMsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci52b2x1bnRhcnlfY3MsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5pbnZvbHVudGFyeV9jcywgMTEwOSkKIAogICAgIGRlZiB0ZXN0X3Jlc3VsdHNfZnJvbV9tZXJnZShzZWxmKToKICAgICAgICAgIiIiUGFyc2luZyBjb25jYXRlbmF0ZWQgbG9nIG1lcmdlcyBzYW1lIFBlcmZvcm1hbmNlVGVzdFJlc3VsdHMiIiIKICAgICAgICAgY29uY2F0ZW5hdGVkX2xvZ3MgPSAiIiI0LEFycmF5QXBwZW5kLDIwLDIzNjQxLDI5MDAwLDI0OTkwLDAsMjQ5OTAKIDQsQXJyYXlBcHBlbmQsMSwyMDAwMCwyMDAwMCwyMDAwMCwwLDIwMDAwIiIiCiAgICAgICAgIHJlc3VsdHMgPSBMb2dQYXJzZXIucmVzdWx0c19mcm9tX3N0cmluZyhjb25jYXRlbmF0ZWRfbG9ncykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0cy5rZXlzKCksIFsnQXJyYXlBcHBlbmQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzLmtleXMoKSwgWydBcnJheUFwcGVuZCddKQogICAgICAgICByZXN1bHQgPSByZXN1bHRzWydBcnJheUFwcGVuZCddCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJlc3VsdCwgUGVyZm9ybWFuY2VUZXN0UmVzdWx0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0Lm1pbiwgMjAwMDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5tYXgsIDI5MDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5taW4sIDIwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5tYXgsIDI5MDAwKQogCiAgICAgZGVmIHRlc3RfcmVzdWx0c19mcm9tX21lcmdlX3ZlcmJvc2Uoc2VsZik6CiAgICAgICAgICIiIlBhcnNpbmcgdmVyYm9zZSBsb2cgIG1lcmdlcyBhbGwgUGVyZm9ybWFuY2VUZXN0U2FtcGxlcy4KQEAgLTYwNCwxOCArNjA0LDE4IEBACiAgICAgU2FtcGxlIDMsMzY0MjQ1CiAzLEFycmF5MkQsNCwzNjMwOTQsMzc2MTMxLDM2ODE1OSw1OTMxLDM2OTE2OSIiIgogICAgICAgICByZXN1bHRzID0gTG9nUGFyc2VyLnJlc3VsdHNfZnJvbV9zdHJpbmcoY29uY2F0ZW5hdGVkX2xvZ3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdHMua2V5cygpLCBbJ0FycmF5MkQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzLmtleXMoKSwgWydBcnJheTJEJ10pCiAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbJ0FycmF5MkQnXQogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyZXN1bHQsIFBlcmZvcm1hbmNlVGVzdFJlc3VsdCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5taW4sIDM1MDgxNSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0Lm1heCwgMzc2MTMxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQubWVkaWFuLCAzNTg4MTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Lm1pbiwgMzUwODE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5tYXgsIDM3NjEzMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQubWVkaWFuLCAzNTg4MTcpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHJlc3VsdC5zZCwgODQ0My4zNywgcGxhY2VzPTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHJlc3VsdC5tZWFuLCAzNjE0NjMuMjUsIHBsYWNlcz0yKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQubnVtX3NhbXBsZXMsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Lm51bV9zYW1wbGVzLCA4KQogICAgICAgICBzYW1wbGVzID0gcmVzdWx0LnNhbXBsZXMKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2FtcGxlcywgUGVyZm9ybWFuY2VUZXN0U2FtcGxlcykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNhbXBsZXMuY291bnQsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FtcGxlcy5jb3VudCwgOCkKIAogICAgIGRlZiB0ZXN0X2V4Y2x1ZGVzX291dGxpZXJzX2Zyb21fc2FtcGxlcyhzZWxmKToKICAgICAgICAgdmVyYm9zZV9sb2cgPSAiIiJSdW5uaW5nIERyb3BGaXJzdEFueVNlcUNudFJhbmdlTGF6eSBmb3IgMTAgc2FtcGxlcy4KQEAgLTY0Myw5ICs2NDMsOSBAQAogIiIiCiAgICAgICAgIHBhcnNlciA9IExvZ1BhcnNlcigpCiAgICAgICAgIHJlc3VsdCA9IHBhcnNlci5wYXJzZV9yZXN1bHRzKHZlcmJvc2VfbG9nLnNwbGl0KCdcbicpKVswXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQubnVtX3NhbXBsZXMsIDEwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuc2FtcGxlcy5jb3VudCwgOCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHJlc3VsdC5zYW1wbGVzLm91dGxpZXJzKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQubnVtX3NhbXBsZXMsIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5zYW1wbGVzLmNvdW50LCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuc2FtcGxlcy5vdXRsaWVycyksIDIpCiAKIAogY2xhc3MgVGVzdFRlc3RDb21wYXJhdG9yKE9sZEFuZE5ld0xvZyk6CkBAIC02NTQsMjcgKzY1NCwyNyBAQAogICAgICAgICAgICAgcmV0dXJuIFt0Lm5hbWUgZm9yIHQgaW4gdGVzdHNdCiAKICAgICAgICAgdGMgPSBUZXN0Q29tcGFyYXRvcihzZWxmLm9sZF9yZXN1bHRzLCBzZWxmLm5ld19yZXN1bHRzLCAwLjA1KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lcyh0Yy51bmNoYW5nZWQpLCBbJ0FuZ3J5UGhvbmVib29rJywgJ0FycmF5MkQnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobmFtZXModGMuaW5jcmVhc2VkKSwgWydCeXRlU3dhcCcsICdBcnJheUFwcGVuZCddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lcyh0Yy5kZWNyZWFzZWQpLCBbJ0JpdENvdW50J10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG5hbWVzKHRjLmFkZGVkKSwgWydUd29TdW0nXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobmFtZXModGMucmVtb3ZlZCksIFsnQW55SGFzaGFibGVXaXRoQUNsYXNzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXModGMudW5jaGFuZ2VkKSwgWydBbmdyeVBob25lYm9vaycsICdBcnJheTJEJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXModGMuaW5jcmVhc2VkKSwgWydCeXRlU3dhcCcsICdBcnJheUFwcGVuZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVzKHRjLmRlY3JlYXNlZCksIFsnQml0Q291bnQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lcyh0Yy5hZGRlZCksIFsnVHdvU3VtJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXModGMucmVtb3ZlZCksIFsnQW55SGFzaGFibGVXaXRoQUNsYXNzJ10pCiAgICAgICAgICMgb3RoZXIgd2F5IGFyb3VuZAogICAgICAgICB0YyA9IFRlc3RDb21wYXJhdG9yKHNlbGYubmV3X3Jlc3VsdHMsIHNlbGYub2xkX3Jlc3VsdHMsIDAuMDUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG5hbWVzKHRjLnVuY2hhbmdlZCksIFsnQW5ncnlQaG9uZWJvb2snLCAnQXJyYXkyRCddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lcyh0Yy5pbmNyZWFzZWQpLCBbJ0JpdENvdW50J10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG5hbWVzKHRjLmRlY3JlYXNlZCksIFsnQnl0ZVN3YXAnLCAnQXJyYXlBcHBlbmQnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobmFtZXModGMuYWRkZWQpLCBbJ0FueUhhc2hhYmxlV2l0aEFDbGFzcyddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lcyh0Yy5yZW1vdmVkKSwgWydUd29TdW0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lcyh0Yy51bmNoYW5nZWQpLCBbJ0FuZ3J5UGhvbmVib29rJywgJ0FycmF5MkQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lcyh0Yy5pbmNyZWFzZWQpLCBbJ0JpdENvdW50J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXModGMuZGVjcmVhc2VkKSwgWydCeXRlU3dhcCcsICdBcnJheUFwcGVuZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVzKHRjLmFkZGVkKSwgWydBbnlIYXNoYWJsZVdpdGhBQ2xhc3MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lcyh0Yy5yZW1vdmVkKSwgWydUd29TdW0nXSkKICAgICAgICAgIyBkZWx0YV90aHJlc2hvbGQgZGV0ZXJtaW5lcyB0aGUgc29ydGluZyBpbnRvIGNoYW5nZSBncm91cHM7CiAgICAgICAgICMgcmVwb3J0IG9ubHkgY2hhbmdlIGFib3ZlIDEwMCUgKEJ5dGVTd2FwJ3MgcnVudGltZSB3ZW50IHRvIDApOgogICAgICAgICB0YyA9IFRlc3RDb21wYXJhdG9yKHNlbGYub2xkX3Jlc3VsdHMsIHNlbGYubmV3X3Jlc3VsdHMsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgbmFtZXModGMudW5jaGFuZ2VkKSwKICAgICAgICAgICAgIFsnQW5ncnlQaG9uZWJvb2snLCAnQXJyYXkyRCcsICdBcnJheUFwcGVuZCcsICdCaXRDb3VudCddCiAgICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobmFtZXModGMuaW5jcmVhc2VkKSwgWydCeXRlU3dhcCddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0Yy5kZWNyZWFzZWQsIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVzKHRjLmluY3JlYXNlZCksIFsnQnl0ZVN3YXAnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Yy5kZWNyZWFzZWQsIFtdKQogCiAKIGNsYXNzIFRlc3RSZXBvcnRGb3JtYXR0ZXIoT2xkQW5kTmV3TG9nKToKQEAgLTY5NiwxMiArNjk2LDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0X3JlcG9ydF9jb250YWlucyh0ZXh0cywgc2VsZi5odG1sKQogCiAgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIFJlcG9ydEZvcm1hdHRlci52YWx1ZXMoUGVyZm9ybWFuY2VUZXN0UmVzdWx0KAogICAgICAgICAgICAgICAgICcxLEFuZ3J5UGhvbmVib29rLDIwLDEwNjY0LDEyOTMzLDExMDM1LDU3NiwxMDg4NCcuc3BsaXQoJywnKSkpLAogICAgICAgICAgICAgKCdBbmdyeVBob25lYm9vaycsICcxMDY2NCcsICcxMjkzMycsICcxMTAzNScsICfigJQnKQogICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgUmVwb3J0Rm9ybWF0dGVyLnZhbHVlcyhQZXJmb3JtYW5jZVRlc3RSZXN1bHQoCiAgICAgICAgICAgICAgICAgJzEsQW5ncnlQaG9uZWJvb2ssMSwxMjA0NSwxMjA0NSwxMjA0NSwwLDEyMDQ1LDEwNTEwMzM2JwogICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpKSksCkBAIC03MTIsMTYgKzcxMiwxNiBAQAogICAgICAgICAgICAgJzEsQW5ncnlQaG9uZWJvb2ssMSwxMjMyNSwxMjMyNSwxMjMyNSwwLDEyMzI1LDEwNTEwMzM2Jy5zcGxpdCgnLCcpKQogICAgICAgICByMiA9IFBlcmZvcm1hbmNlVGVzdFJlc3VsdCgKICAgICAgICAgICAgICcxLEFuZ3J5UGhvbmVib29rLDEsMTE2MTYsMTE2MTYsMTE2MTYsMCwxMTYxNiwxMDUwMjE0NCcuc3BsaXQoJywnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBSZXBvcnRGb3JtYXR0ZXIudmFsdWVzKFJlc3VsdENvbXBhcmlzb24ocjEsIHIyKSksCiAgICAgICAgICAgICAoJ0FuZ3J5UGhvbmVib29rJywgJzEyMzI1JywgJzExNjE2JywgJy01LjglJywgJzEuMDZ4JykKICAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIFJlcG9ydEZvcm1hdHRlci52YWx1ZXMoUmVzdWx0Q29tcGFyaXNvbihyMiwgcjEpKSwKICAgICAgICAgICAgICgnQW5ncnlQaG9uZWJvb2snLCAnMTE2MTYnLCAnMTIzMjUnLCAnKzYuMSUnLCAnMC45NHgnKQogICAgICAgICApCiAgICAgICAgIHIyLm1heCA9IHIxLm1pbiArIDEKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBSZXBvcnRGb3JtYXR0ZXIudmFsdWVzKFJlc3VsdENvbXBhcmlzb24ocjEsIHIyKSlbNF0sCiAgICAgICAgICAgICAnMS4wNnggKD8pJyAgIyBpc19kdWJpb3VzCiAgICAgICAgICkKQEAgLTc0MiwxMiArNzQyLDEyIEBACiAgICAgICAgIFBlcmZvcm1hbmNlVGVzdFJlc3VsdHMuCiAgICAgICAgICIiIgogICAgICAgICBwZXJmb3JtYW5jZV90ZXN0X3Jlc3VsdCA9IHNlbGYudGMuYWRkZWRbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBSZXBvcnRGb3JtYXR0ZXIuaGVhZGVyX2ZvcihwZXJmb3JtYW5jZV90ZXN0X3Jlc3VsdCksCiAgICAgICAgICAgICAoJ1RFU1QnLCAnTUlOJywgJ01BWCcsICdNRUFOJywgJ01BWF9SU1MnKQogICAgICAgICApCiAgICAgICAgIGNvbXBhcmlzb25fcmVzdWx0ID0gc2VsZi50Yy5pbmNyZWFzZWRbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBSZXBvcnRGb3JtYXR0ZXIuaGVhZGVyX2Zvcihjb21wYXJpc29uX3Jlc3VsdCksCiAgICAgICAgICAgICAoJ1RFU1QnLCAnT0xEJywgJ05FVycsICdERUxUQScsICdSQVRJTycpCiAgICAgICAgICkKQEAgLTg1OSwxNyArODU5LDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzYWdlOiBjb21wYXJlX3BlcmZfdGVzdHMucHknLCBlcnIuZ2V0dmFsdWUoKSkKIAogICAgICAgICBhcmdzID0gcGFyc2VfYXJncyhzZWxmLnJlcXVpcmVkKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhcmdzLm9sZF9maWxlLCAnb2xkLmxvZycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFyZ3MubmV3X2ZpbGUsICduZXcubG9nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLm9sZF9maWxlLCAnb2xkLmxvZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncy5uZXdfZmlsZSwgJ25ldy5sb2cnKQogCiAgICAgZGVmIHRlc3RfZm9ybWF0X2FyZ3VtZW50KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZV9hcmdzKHNlbGYucmVxdWlyZWQpLmZvcm1hdCwgJ21hcmtkb3duJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfYXJncyhzZWxmLnJlcXVpcmVkKS5mb3JtYXQsICdtYXJrZG93bicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBwYXJzZV9hcmdzKHNlbGYucmVxdWlyZWQgKyBbJy0tZm9ybWF0JywgJ21hcmtkb3duJ10pLmZvcm1hdCwKICAgICAgICAgICAgICdtYXJrZG93bicpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgcGFyc2VfYXJncyhzZWxmLnJlcXVpcmVkICsgWyctLWZvcm1hdCcsICdnaXQnXSkuZm9ybWF0LCAnZ2l0JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBwYXJzZV9hcmdzKHNlbGYucmVxdWlyZWQgKyBbJy0tZm9ybWF0JywgJ2h0bWwnXSkuZm9ybWF0LCAnaHRtbCcpCiAKICAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoKSBhcyAoXywgZXJyKToKQEAgLTg4MiwxNCArODgyLDE0IEBACiAgICAgZGVmIHRlc3RfZGVsdGFfdGhyZXNob2xkX2FyZ3VtZW50KHNlbGYpOgogICAgICAgICAjIGRlZmF1bHQgdmFsdWUKICAgICAgICAgYXJncyA9IHBhcnNlX2FyZ3Moc2VsZi5yZXF1aXJlZCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXJncy5kZWx0YV90aHJlc2hvbGQsIDAuMDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncy5kZWx0YV90aHJlc2hvbGQsIDAuMDUpCiAgICAgICAgICMgZmxvYXQgcGFyc2luZwogICAgICAgICBhcmdzID0gcGFyc2VfYXJncyhzZWxmLnJlcXVpcmVkICsgWyctLWRlbHRhLXRocmVzaG9sZCcsICcwLjEnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXJncy5kZWx0YV90aHJlc2hvbGQsIDAuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLmRlbHRhX3RocmVzaG9sZCwgMC4xKQogICAgICAgICBhcmdzID0gcGFyc2VfYXJncyhzZWxmLnJlcXVpcmVkICsgWyctLWRlbHRhLXRocmVzaG9sZCcsICcxJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFyZ3MuZGVsdGFfdGhyZXNob2xkLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncy5kZWx0YV90aHJlc2hvbGQsIDEuMCkKICAgICAgICAgYXJncyA9IHBhcnNlX2FyZ3Moc2VsZi5yZXF1aXJlZCArIFsnLS1kZWx0YS10aHJlc2hvbGQnLCAnLjInXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXJncy5kZWx0YV90aHJlc2hvbGQsIDAuMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLmRlbHRhX3RocmVzaG9sZCwgMC4yKQogCiAgICAgICAgIHdpdGggY2FwdHVyZWRfb3V0cHV0KCkgYXMgKF8sIGVycik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0LCBwYXJzZV9hcmdzLApAQCAtODk5LDEwICs4OTksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICBlcnIuZ2V0dmFsdWUoKSkKIAogICAgIGRlZiB0ZXN0X291dHB1dF9hcmd1bWVudChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfYXJncyhzZWxmLnJlcXVpcmVkKS5vdXRwdXQsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX2FyZ3Moc2VsZi5yZXF1aXJlZCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyctLW91dHB1dCcsICdyZXBvcnQubG9nJ10pLm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9ydC5sb2cnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2FyZ3Moc2VsZi5yZXF1aXJlZCkub3V0cHV0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2FyZ3Moc2VsZi5yZXF1aXJlZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy0tb3V0cHV0JywgJ3JlcG9ydC5sb2cnXSkub3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQubG9nJykKIAogICAgIGRlZiB0ZXN0X2NoYW5nZXNfb25seV9hcmd1bWVudChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZV9hcmdzKHNlbGYucmVxdWlyZWQpLmNoYW5nZXNfb25seSkKQEAgLTk2Miw3ICs5NjIsNyBAQAogICAgICAgICAiIiJXcml0ZXMgTWFya2Rvd24gZm9ybWF0dGVkIHJlcG9ydCB0byBzdGRvdXQgYW5kIGAtLW91dHB1dGAgZmlsZS4iIiIKICAgICAgICAgcmVwb3J0X291dCwgcmVwb3J0X2ZpbGUgPSAoCiAgICAgICAgICAgICBzZWxmLmV4ZWN1dGVfbWFpbl93aXRoX2Zvcm1hdCgnbWFya2Rvd24nLCB0ZXN0X291dHB1dD1UcnVlKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVwb3J0X291dCwgcmVwb3J0X2ZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwb3J0X291dCwgcmVwb3J0X2ZpbGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0X3JlcG9ydF9jb250YWlucyhzZWxmLm1hcmtkb3duLCByZXBvcnRfZmlsZSkKIAogICAgIGRlZiB0ZXN0X2dpdChzZWxmKToKQEAgLTk3NCw3ICs5NzQsNyBAQAogICAgICAgICAiIiJXcml0ZXMgR2l0IGZvcm1hdHRlZCByZXBvcnQgdG8gc3Rkb3V0IGFuZCBgLS1vdXRwdXRgIGZpbGUuIiIiCiAgICAgICAgIHJlcG9ydF9vdXQsIHJlcG9ydF9maWxlID0gKAogICAgICAgICAgICAgc2VsZi5leGVjdXRlX21haW5fd2l0aF9mb3JtYXQoJ2dpdCcsIHRlc3Rfb3V0cHV0PVRydWUpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXBvcnRfb3V0LCByZXBvcnRfZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXBvcnRfb3V0LCByZXBvcnRfZmlsZSkKICAgICAgICAgc2VsZi5hc3NlcnRfcmVwb3J0X2NvbnRhaW5zKHNlbGYuZ2l0LCByZXBvcnRfZmlsZSkKIAogICAgIGRlZiB0ZXN0X2h0bWwoc2VsZik6CkBAIC05ODYsNyArOTg2LDcgQEAKICAgICAgICAgIiIiV3JpdGVzIEhUTUwgZm9ybWF0dGVkIHJlcG9ydCB0byBzdGRvdXQgYW5kIGAtLW91dHB1dGAgZmlsZS4iIiIKICAgICAgICAgcmVwb3J0X291dCwgcmVwb3J0X2ZpbGUgPSAoCiAgICAgICAgICAgICBzZWxmLmV4ZWN1dGVfbWFpbl93aXRoX2Zvcm1hdCgnaHRtbCcsIHRlc3Rfb3V0cHV0PVRydWUpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXBvcnRfb3V0LCByZXBvcnRfZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXBvcnRfb3V0LCByZXBvcnRfZmlsZSkKICAgICAgICAgc2VsZi5hc3NlcnRfcmVwb3J0X2NvbnRhaW5zKHNlbGYuaHRtbCwgcmVwb3J0X2ZpbGUpCiAKIApkaWZmIC0tZ2l0IGEvYmVuY2htYXJrL3NpbmdsZS1zb3VyY2UvQ29kYWJsZS5zd2lmdCBiL2JlbmNobWFyay9zaW5nbGUtc291cmNlL0NvZGFibGUuc3dpZnQKaW5kZXggYjBjNDUxYS4uMTcyOWE3YSAxMDA2NDQKLS0tIGEvYmVuY2htYXJrL3NpbmdsZS1zb3VyY2UvQ29kYWJsZS5zd2lmdAorKysgYi9iZW5jaG1hcmsvc2luZ2xlLXNvdXJjZS9Db2RhYmxlLnN3aWZ0CkBAIC0xMDcsMTcgKzEwNywzMyBAQAogICBKU09OVGVzdGVyID0gQ29kYWJsZVBlcmZUZXN0ZXIoZW5jb2RlcjogSlNPTkVuY29kZXIoKSwgZGVjb2RlcjogSlNPTkRlY29kZXIoKSkKIH0KIAorI2lmICFfcnVudGltZShfT2JqQykKKy8vIElmIHdlIGRvIG5vdCBoYXZlIGFuIG9iamMtcnVudGltZSwgdGhlbiB3ZSBkbyBub3QgaGF2ZSBhIGRlZmluaXRpb24gZm9yCisvLyBhdXRvcmVsZWFzZXBvb2wuIEFkZCBpbiBvdXIgb3duIGZha2UgYXV0b2Nsb3N1cmUgZm9yIGl0IHRoYXQgaXMgaW5saW5lCisvLyBhbHdheXMuIFRoYXQgc2hvdWxkIGJlIGFibGUgdG8gYmUgZWF0ZW4gdGhyb3VnaCBieSB0aGUgb3B0aW1pemVyIG5vIHByb2JsZW0uCitAaW5saW5lKF9fYWx3YXlzKQorcHVibGljIGZ1bmMgYXV0b3JlbGVhc2Vwb29sPFJlc3VsdD4oCisgIGludm9raW5nIGJvZHk6ICgpIHRocm93cyAtPiBSZXN1bHQKKykgcmV0aHJvd3MgLT4gUmVzdWx0IHsKKyAgcmV0dXJuIHRyeSBib2R5KCkKK30KKyNlbmRpZgorCiBAaW5saW5lKG5ldmVyKQogcHVibGljIGZ1bmMgcnVuX0pTT05QZXJmRW5jb2RlKF8gTjogSW50KSB7Ci0gIGZvciBfIGluIDAgLi48IE4gewotICAgIEpTT05UZXN0ZXIuZW5jb2RlKCkKKyAgYXV0b3JlbGVhc2Vwb29sIHsKKyAgICBmb3IgXyBpbiAwIC4uPCBOIHsKKyAgICAgIEpTT05UZXN0ZXIuZW5jb2RlKCkKKyAgICB9CiAgIH0KIH0KIAogQGlubGluZShuZXZlcikKIHB1YmxpYyBmdW5jIHJ1bl9KU09OUGVyZkRlY29kZShfIE46IEludCkgewotICBmb3IgXyBpbiAwIC4uPCBOIHsKLSAgICBKU09OVGVzdGVyLmRlY29kZSgpCisgIGF1dG9yZWxlYXNlcG9vbCB7CisgICAgZm9yIF8gaW4gMCAuLjwgTiB7CisgICAgICBKU09OVGVzdGVyLmRlY29kZSgpCisgICAgfQogICB9CiB9CiAKQEAgLTEzMSwxNSArMTQ3LDE5IEBACiAKIEBpbmxpbmUobmV2ZXIpCiBwdWJsaWMgZnVuYyBydW5fUGxpc3RQZXJmRW5jb2RlKF8gTjogSW50KSB7Ci0gIGZvciBfIGluIDAgLi48IE4gewotICAgIHBsaXN0VGVzdGVyLmVuY29kZSgpCisgIGF1dG9yZWxlYXNlcG9vbCB7CisgICAgZm9yIF8gaW4gMCAuLjwgTiB7CisgICAgICBwbGlzdFRlc3Rlci5lbmNvZGUoKQorICAgIH0KICAgfQogfQogCiBAaW5saW5lKG5ldmVyKQogcHVibGljIGZ1bmMgcnVuX1BsaXN0UGVyZkRlY29kZShfIE46IEludCkgewotICBmb3IgXyBpbiAwIC4uPCBOIHsKLSAgICBwbGlzdFRlc3Rlci5kZWNvZGUoKQorICBhdXRvcmVsZWFzZXBvb2wgeworICAgIGZvciBfIGluIDAgLi48IE4geworICAgICAgcGxpc3RUZXN0ZXIuZGVjb2RlKCkKKyAgICB9CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9BZGRTd2lmdC5jbWFrZSBiL2NtYWtlL21vZHVsZXMvQWRkU3dpZnQuY21ha2UKaW5kZXggOGU1MTEwNi4uZjNlOWQyYiAxMDA2NDQKLS0tIGEvY21ha2UvbW9kdWxlcy9BZGRTd2lmdC5jbWFrZQorKysgYi9jbWFrZS9tb2R1bGVzL0FkZFN3aWZ0LmNtYWtlCkBAIC03NTUsOSArNzU1LDEwIEBACiAgICAgZW5kaWYoKQogICBlbmRpZigpCiAKLSAgaWYgKFNXSUZUX0NPTVBJTEVSX1ZFUlNJT04pCi0gICAgaWYoJHtTV0lGVExJQl9TSU5HTEVfU0RLfSBJTl9MSVNUIFNXSUZUX0FQUExFX1BMQVRGT1JNUykKLSAgICAgIGxpc3QoQVBQRU5EIFNXSUZUTElCX1NJTkdMRV9MSU5LX0ZMQUdTICItWGxpbmtlciIgIi1jdXJyZW50X3ZlcnNpb24iICItWGxpbmtlciIgIiR7U1dJRlRfQ09NUElMRVJfVkVSU0lPTn0iICItWGxpbmtlciIgIi1jb21wYXRpYmlsaXR5X3ZlcnNpb24iICItWGxpbmtlciIgIjEiKQorICBpZigke1NXSUZUTElCX1NJTkdMRV9TREt9IElOX0xJU1QgU1dJRlRfQVBQTEVfUExBVEZPUk1TKQorICAgIGxpc3QoQVBQRU5EIFNXSUZUTElCX1NJTkdMRV9MSU5LX0ZMQUdTICItWGxpbmtlciIgIi1jb21wYXRpYmlsaXR5X3ZlcnNpb24iICItWGxpbmtlciIgIjEiKQorICAgIGlmIChTV0lGVF9DT01QSUxFUl9WRVJTSU9OKQorICAgICAgbGlzdChBUFBFTkQgU1dJRlRMSUJfU0lOR0xFX0xJTktfRkxBR1MgIi1YbGlua2VyIiAiLWN1cnJlbnRfdmVyc2lvbiIgIi1YbGlua2VyIiAiJHtTV0lGVF9DT01QSUxFUl9WRVJTSU9OfSIgKQogICAgIGVuZGlmKCkKICAgZW5kaWYoKQogCkBAIC0xODQ4LDEyICsxODQ5LDYgQEAKICAgICAgICAgc2V0KHN3aWZ0bGliX3N3aWZ0X2NvbXBpbGVfcHJpdmF0ZV9mcmFtZXdvcmtzX2ZsYWcgIi1Gc3lzdGVtIiAiJHtTV0lGVF9TREtfJHtzZGt9X0FSQ0hfJHthcmNofV9QQVRIfS9TeXN0ZW0vTGlicmFyeS9Qcml2YXRlRnJhbWV3b3Jrcy8iKQogICAgICAgZW5kaWYoKQogCi0gICAgICBpZigiJHtzZGt9IiBTVFJFUVVBTCBXSU5ET1dTKQotICAgICAgICBpZihhcmNoIFNUUkVRVUFMIHg4Nl82NCkKLSAgICAgICAgICBzZXQoc3dpZnRsaWJfc3dpZnRfY29tcGlsZV9mbGFnc19hcmNoIC1YY2MgLURfQU1ENjRfKQotICAgICAgICBlbmRpZigpCi0gICAgICBlbmRpZigpCi0KICAgICAgICMgQWRkIHRoaXMgbGlicmFyeSB2YXJpYW50LgogICAgICAgX2FkZF9zd2lmdF9saWJyYXJ5X3NpbmdsZSgKICAgICAgICAgJHtWQVJJQU5UX05BTUV9CkBAIC0yMjAwLDgzICsyMTk1LDYgQEAKICAgICAgIFBST1BFUlRJRVMgRk9MREVSICJTd2lmdCBleGVjdXRhYmxlcyIpCiBlbmRmdW5jdGlvbigpCiAKLSMgQWRkIGFuIGV4ZWN1dGFibGUgZm9yIHRoZSBob3N0IG1hY2hpbmUuCi0jCi0jIFVzYWdlOgotIyAgIGFkZF9zd2lmdF9leGVjdXRhYmxlKG5hbWUKLSMgICAgIFtERVBFTkRTIGRlcDEgLi4uXQotIyAgICAgW0xMVk1fQ09NUE9ORU5UX0RFUEVORFMgY29tcDEgLi4uXQotIyAgICAgW0ZJTEVfREVQRU5EUyB0YXJnZXQxIC4uLl0KLSMgICAgIFtMSU5LX0xJQlJBUklFUyB0YXJnZXQxIC4uLl0KLSMgICAgIFtFWENMVURFX0ZST01fQUxMXQotIyAgICAgW0RPTlRfU1RSSVBfTk9OX01BSU5fU1lNQk9MU10KLSMgICAgIFtESVNBQkxFX0FTTFJdCi0jICAgICBzb3VyY2UxIFtzb3VyY2UyIHNvdXJjZTMgLi4uXSkKLSMKLSMgICBuYW1lCi0jICAgICBOYW1lIG9mIHRoZSBleGVjdXRhYmxlIChlLmcuLCBzd2lmdCkuCi0jCi0jICAgTElCUkFSSUVTCi0jICAgICBMaWJyYXJpZXMgdGhpcyBleGVjdXRhYmxlIGRlcGVuZHMgb24sIHdpdGhvdXQgdmFyaWFudCBzdWZmaXhlcy4KLSMKLSMgICBMTFZNX0NPTVBPTkVOVF9ERVBFTkRTCi0jICAgICBMTFZNIGNvbXBvbmVudHMgdGhpcyBleGVjdXRhYmxlIGRlcGVuZHMgb24uCi0jCi0jICAgRklMRV9ERVBFTkRTCi0jICAgICBBZGRpdGlvbmFsIGZpbGVzIHRoaXMgZXhlY3V0YWJsZSBkZXBlbmRzIG9uLgotIwotIyAgIExJTktfTElCUkFSSUVTCi0jICAgICBMaWJyYXJpZXMgdG8gbGluayB3aXRoLgotIwotIyAgIEVYQ0xVREVfRlJPTV9BTEwKLSMgICAgIFdoZXRoZXIgdG8gZXhjbHVkZSB0aGlzIGV4ZWN1dGFibGUgZnJvbSB0aGUgQUxMX0JVSUxEIHRhcmdldC4KLSMKLSMgICBET05UX1NUUklQX05PTl9NQUlOX1NZTUJPTFMKLSMgICAgIFNob3VsZCB3ZSBub3Qgc3RyaXAgbm9uIG1haW4gc3ltYm9scy4KLSMKLSMgICBESVNBQkxFX0FTTFIKLSMgICAgIFNob3VsZCB3ZSBjb21waWxlIHdpdGggLVdsLC1ub19waWUgc28gdGhhdCBBU0xSIGlzIGRpc2FibGVkPwotIwotIyAgIHNvdXJjZTEgLi4uCi0jICAgICBTb3VyY2VzIHRvIGFkZCBpbnRvIHRoaXMgZXhlY3V0YWJsZS4KLSMKLSMgTm90ZToKLSMgICBIb3N0IGV4ZWN1dGFibGVzIGFyZSBub3QgZ2l2ZW4gYSB2YXJpYW50IHN1ZmZpeC4gVG8gYnVpbGQgYW4gZXhlY3V0YWJsZSBmb3IKLSMgICBlYWNoIFNESyBhbmQgQVJDSCB2YXJpYW50LCB1c2UgYWRkX3N3aWZ0X3RhcmdldF9leGVjdXRhYmxlLgotZnVuY3Rpb24oYWRkX3N3aWZ0X2V4ZWN1dGFibGUgbmFtZSkKLSAgIyBQYXJzZSB0aGUgYXJndW1lbnRzIHdlIHdlcmUgZ2l2ZW4uCi0gIGNtYWtlX3BhcnNlX2FyZ3VtZW50cyhTV0lGVEVYRQotICAgICJFWENMVURFX0ZST01fQUxMO0RPTlRfU1RSSVBfTk9OX01BSU5fU1lNQk9MUztESVNBQkxFX0FTTFIiCi0gICAgIiIKLSAgICAiREVQRU5EUztMTFZNX0NPTVBPTkVOVF9ERVBFTkRTO0xJTktfTElCUkFSSUVTO0NPTVBJTEVfRkxBR1MiCi0gICAgJHtBUkdOfSkKLQotICB0cmFuc2xhdGVfZmxhZygke1NXSUZURVhFX0VYQ0xVREVfRlJPTV9BTEx9Ci0gICAgICAiRVhDTFVERV9GUk9NX0FMTCIKLSAgICAgIFNXSUZURVhFX0VYQ0xVREVfRlJPTV9BTExfRkxBRykKLSAgdHJhbnNsYXRlX2ZsYWcoJHtTV0lGVEVYRV9ET05UX1NUUklQX05PTl9NQUlOX1NZTUJPTFN9Ci0gICAgICAiRE9OVF9TVFJJUF9OT05fTUFJTl9TWU1CT0xTIgotICAgICAgU1dJRlRFWEVfRE9OVF9TVFJJUF9OT05fTUFJTl9TWU1CT0xTX0ZMQUcpCi0gIHRyYW5zbGF0ZV9mbGFnKCR7U1dJRlRFWEVfRElTQUJMRV9BU0xSfQotICAgICAgIkRJU0FCTEVfQVNMUiIKLSAgICAgIFNXSUZURVhFX0RJU0FCTEVfQVNMUl9GTEFHKQotCi0gIHNldChTV0lGVEVYRV9TT1VSQ0VTICR7U1dJRlRFWEVfVU5QQVJTRURfQVJHVU1FTlRTfSkKLQotICBfYWRkX3N3aWZ0X2V4ZWN1dGFibGVfc2luZ2xlKAotICAgICAgJHtuYW1lfQotICAgICAgJHtTV0lGVEVYRV9TT1VSQ0VTfQotICAgICAgREVQRU5EUyAke1NXSUZURVhFX0RFUEVORFN9Ci0gICAgICBMTFZNX0NPTVBPTkVOVF9ERVBFTkRTICR7U1dJRlRFWEVfTExWTV9DT01QT05FTlRfREVQRU5EU30KLSAgICAgIExJTktfTElCUkFSSUVTICR7U1dJRlRFWEVfTElOS19MSUJSQVJJRVN9Ci0gICAgICBTREsgJHtTV0lGVF9IT1NUX1ZBUklBTlRfU0RLfQotICAgICAgQVJDSElURUNUVVJFICR7U1dJRlRfSE9TVF9WQVJJQU5UX0FSQ0h9Ci0gICAgICBDT01QSUxFX0ZMQUdTICR7U1dJRlRFWEVfQ09NUElMRV9GTEFHU30KLSAgICAgICR7U1dJRlRFWEVfRVhDTFVERV9GUk9NX0FMTF9GTEFHfQotICAgICAgJHtTV0lGVEVYRV9ET05UX1NUUklQX05PTl9NQUlOX1NZTUJPTFNfRkxBR30KLSAgICAgICR7U1dJRlRFWEVfRElTQUJMRV9BU0xSX0ZMQUd9KQotZW5kZnVuY3Rpb24oKQotCiBtYWNybyhhZGRfc3dpZnRfdG9vbF9zdWJkaXJlY3RvcnkgbmFtZSkKICAgYWRkX2xsdm1fc3ViZGlyZWN0b3J5KFNXSUZUIFRPT0wgJHtuYW1lfSkKIGVuZG1hY3JvKCkKQEAgLTIzMDAsNyArMjIxOCw5IEBACiAgICAgICAgICAgICAgICBNRVNTQUdFICJTd2lmdCBDb21wb25lbnQgaXMgcmVxdWlyZWQgdG8gYWRkIGEgaG9zdCB0b29sIikKIAogICAjIENyZWF0ZSB0aGUgZXhlY3V0YWJsZSBydWxlLgotICBhZGRfc3dpZnRfZXhlY3V0YWJsZSgke2V4ZWN1dGFibGV9CisgIF9hZGRfc3dpZnRfZXhlY3V0YWJsZV9zaW5nbGUoJHtleGVjdXRhYmxlfQorICAgIFNESyAke1NXSUZUX0hPU1RfVkFSSUFOVF9TREt9CisgICAgQVJDSElURUNUVVJFICR7U1dJRlRfSE9TVF9WQVJJQU5UX0FSQ0h9CiAgICAgJHtBU0hUX1VOUEFSU0VEX0FSR1VNRU5UU30pCiAKICAgc3dpZnRfaW5zdGFsbF9pbl9jb21wb25lbnQoJHtBU0hUX1NXSUZUX0NPTVBPTkVOVH0KZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvU3RhbmRhbG9uZU92ZXJsYXkuY21ha2UgYi9jbWFrZS9tb2R1bGVzL1N0YW5kYWxvbmVPdmVybGF5LmNtYWtlCmluZGV4IDk4ZjU1ZWYuLmE0Y2Q5N2UgMTAwNjQ0Ci0tLSBhL2NtYWtlL21vZHVsZXMvU3RhbmRhbG9uZU92ZXJsYXkuY21ha2UKKysrIGIvY21ha2UvbW9kdWxlcy9TdGFuZGFsb25lT3ZlcmxheS5jbWFrZQpAQCAtMTksNiArMTksNyBAQAogc2V0KFNXSUZUX0RBUldJTl9ERVBMT1lNRU5UX1ZFUlNJT05fSU9TICI3LjAiIENBQ0hFIFNUUklORyAiIikKIHNldChTV0lGVF9EQVJXSU5fREVQTE9ZTUVOVF9WRVJTSU9OX1RWT1MgIjkuMCIgQ0FDSEUgU1RSSU5HICIiKQogc2V0KFNXSUZUX0RBUldJTl9ERVBMT1lNRU5UX1ZFUlNJT05fV0FUQ0hPUyAiMi4wIiBDQUNIRSBTVFJJTkcgIiIpCitzZXQoU1dJRlRfRU5BQkxFX1BBUlNFQUJMRV9NT0RVTEVfSU5URVJGQUNFUyBUUlVFKQogCiBzZXQoU1dJRlRfU09VUkNFX0RJUiAiJHtTV0lGVF9TT1VSQ0VfUk9PVH0vc3JjL3N3aWZ0IiBDQUNIRSBQQVRIICIiKQogc2V0KFNXSUZUX1BBVEhfVE9fTExWTV9TT1VSQ0UgIiR7U1dJRlRfU09VUkNFX1JPT1R9L3NyYy9sbHZtIiBDQUNIRSBQQVRIICIiKQpAQCAtNjEsNiArNjIsNyBAQAogIyBTb21lIG92ZXJsYXlzIGluY2x1ZGUgdGhlIHJ1bnRpbWUncyBoZWFkZXJzLAogIyBhbmQgc29tZSBvZiB0aG9zZSBoZWFkZXJzIGFyZSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KIGFkZF9zdWJkaXJlY3RvcnkoIiR7U1dJRlRfU09VUkNFX0RJUn0vaW5jbHVkZSIgInN3aWZ0L2luY2x1ZGUiKQorYWRkX3N1YmRpcmVjdG9yeSgiJHtTV0lGVF9TT1VSQ0VfRElSfS9hcGlub3RlcyIgInN3aWZ0L2FwaW5vdGVzIikKIAogIyBXaXRob3V0IHRoaXMgbGluZSwgaW5zdGFsbGluZyBjb21wb25lbnRzIGlzIGJyb2tlbi4gVGhpcyBuZWVkcyByZWZhY3RvcmluZy4KIHN3aWZ0X2NvbmZpZ3VyZV9jb21wb25lbnRzKCkKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvU3dpZnRDb21wb25lbnRzLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9Td2lmdENvbXBvbmVudHMuY21ha2UKaW5kZXggYWRhNGExYS4uNzI1YzY4NSAxMDA2NDQKLS0tIGEvY21ha2UvbW9kdWxlcy9Td2lmdENvbXBvbmVudHMuY21ha2UKKysrIGIvY21ha2UvbW9kdWxlcy9Td2lmdENvbXBvbmVudHMuY21ha2UKQEAgLTY3LDEwICs2NywyNSBAQAogc2V0KF9TV0lGVF9ERUZJTkVEX0NPTVBPTkVOVFMKICAgImF1dG9saW5rLWRyaXZlcjtjb21waWxlcjtjbGFuZy1idWlsdGluLWhlYWRlcnM7Y2xhbmctcmVzb3VyY2UtZGlyLXN5bWxpbms7Y2xhbmctYnVpbHRpbi1oZWFkZXJzLWluLWNsYW5nLXJlc291cmNlLWRpcjtzdGRsaWI7c3RkbGliLWV4cGVyaW1lbnRhbDtzZGstb3ZlcmxheTtwYXJzZXItbGliO2VkaXRvci1pbnRlZ3JhdGlvbjt0b29sczt0ZXN0c3VpdGUtdG9vbHM7dG9vbGNoYWluLWRldi10b29scztkZXY7bGljZW5zZTtzb3VyY2VraXQteHBjLXNlcnZpY2U7c291cmNla2l0LWlucHJvYztzd2lmdC1yZW1vdGUtbWlycm9yO3N3aWZ0LXJlbW90ZS1taXJyb3ItaGVhZGVycyIpCiAKKyMgVGhlIGRlZmF1bHQgaW5zdGFsbCBjb21wb25lbnRzIGluY2x1ZGUgYWxsIG9mIHRoZSBkZWZpbmVkIGNvbXBvbmVudHMsIGV4Y2VwdAorIyBmb3IgdGhlIGZvbGxvd2luZyBleGNlcHRpb25zLgorc2V0KF9TV0lGVF9ERUZBVUxUX0NPTVBPTkVOVFMgIiR7X1NXSUZUX0RFRklORURfQ09NUE9ORU5UU30iKQorIyAnZGV2JyB0YWtlcyB1cCBhIGxvdCBvZiBkaXNrIHNwYWNlIGFuZCBpc24ndCBwYXJ0IG9mIGEgbm9ybWFsIHRvb2xjaGFpbi4KK2xpc3QoUkVNT1ZFX0lURU0gX1NXSUZUX0RFRkFVTFRfQ09NUE9ORU5UUyAiZGV2IikKKyMgVGhlc2UgY2xhbmcgaGVhZGVyIG9wdGlvbnMgY29uZmxpY3Qgd2l0aCAnY2xhbmctYnVpbHRpbi1oZWFkZXJzJy4KK2xpc3QoUkVNT1ZFX0lURU0gX1NXSUZUX0RFRkFVTFRfQ09NUE9ORU5UUyAiY2xhbmctcmVzb3VyY2UtZGlyLXN5bWxpbmsiKQorbGlzdChSRU1PVkVfSVRFTSBfU1dJRlRfREVGQVVMVF9DT01QT05FTlRTICJjbGFuZy1idWlsdGluLWhlYWRlcnMtaW4tY2xhbmctcmVzb3VyY2UtZGlyIikKKyMgVGhlIHNvdXJjZWtpdCBpbnN0YWxsIHZhcmlhbnRzIGFyZSBjdXJyZW50bHkgbXV0dWFsbHkgZXhjbHVzaXZlLgoraWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIikKKyAgbGlzdChSRU1PVkVfSVRFTSBfU1dJRlRfREVGQVVMVF9DT01QT05FTlRTICJzb3VyY2VraXQtaW5wcm9jIikKK2Vsc2UoKQorICBsaXN0KFJFTU9WRV9JVEVNIF9TV0lGVF9ERUZBVUxUX0NPTVBPTkVOVFMgInNvdXJjZWtpdC14cGMtc2VydmljZSIpCitlbmRpZigpCisKIG1hY3JvKHN3aWZ0X2NvbmZpZ3VyZV9jb21wb25lbnRzKQogICAjIFNldCB0aGUgU1dJRlRfSU5TVEFMTF9DT01QT05FTlRTIHZhcmlhYmxlIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGl0IGlzIG5vdCBwYXNzZWQgaW4gdmlhIC1ECi0gIHNldChTV0lGVF9JTlNUQUxMX0NPTVBPTkVOVFMgIiR7X1NXSUZUX0RFRklORURfQ09NUE9ORU5UU30iIENBQ0hFIFNUUklORwotICAgICJBIHNlbWljb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBjb21wb25lbnRzIHRvIGluc3RhbGwgJHtfU1dJRlRfREVGSU5FRF9DT01QT05FTlRTfSIpCisgIHNldChTV0lGVF9JTlNUQUxMX0NPTVBPTkVOVFMgIiR7X1NXSUZUX0RFRkFVTFRfQ09NUE9ORU5UU30iIENBQ0hFIFNUUklORworICAgICJBIHNlbWljb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBjb21wb25lbnRzIHRvIGluc3RhbGwgZnJvbSB0aGUgc2V0ICR7X1NXSUZUX0RFRklORURfQ09NUE9ORU5UU30iKQogCiAgIGZvcmVhY2goY29tcG9uZW50ICR7X1NXSUZUX0RFRklORURfQ09NUE9ORU5UU30pCiAgICAgc3RyaW5nKFRPVVBQRVIgIiR7Y29tcG9uZW50fSIgdmFyX25hbWVfcGllY2UpCmRpZmYgLS1naXQgYS9kb2NzL0FCSS9NYW5nbGluZy5yc3QgYi9kb2NzL0FCSS9NYW5nbGluZy5yc3QKaW5kZXggMzRiZWYzMS4uODY4NzBkZCAxMDA2NDQKLS0tIGEvZG9jcy9BQkkvTWFuZ2xpbmcucnN0CisrKyBiL2RvY3MvQUJJL01hbmdsaW5nLnJzdApAQCAtMSw2ICsxLDUgQEAKIDpvcnBoYW46CiAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKIC4uIF9BQkk6CiAKIC4uIGhpZ2hsaWdodDo6IG5vbmUKZGlmZiAtLWdpdCBhL2RvY3MvQUJJL1R5cGVMYXlvdXQucnN0IGIvZG9jcy9BQkkvVHlwZUxheW91dC5yc3QKaW5kZXggN2Y1NTY5Yy4uNGQ2ZmViMyAxMDA2NDQKLS0tIGEvZG9jcy9BQkkvVHlwZUxheW91dC5yc3QKKysrIGIvZG9jcy9BQkkvVHlwZUxheW91dC5yc3QKQEAgLTEsNiArMSw1IEBACiA6b3JwaGFuOgogCi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCiAuLiBfQUJJOgogCiAuLiBoaWdobGlnaHQ6OiBub25lCmRpZmYgLS1naXQgYS9kb2NzL0FCSS9UeXBlTWV0YWRhdGEucnN0IGIvZG9jcy9BQkkvVHlwZU1ldGFkYXRhLnJzdAppbmRleCA0MDkxMTA4Li4zNTA5NDVhIDEwMDY0NAotLS0gYS9kb2NzL0FCSS9UeXBlTWV0YWRhdGEucnN0CisrKyBiL2RvY3MvQUJJL1R5cGVNZXRhZGF0YS5yc3QKQEAgLTEsNiArMSw1IEBACiA6b3JwaGFuOgogCi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCiAuLiBfQUJJOgogCiAuLiBoaWdobGlnaHQ6OiBub25lCmRpZmYgLS1naXQgYS9kb2NzL0NNYWtlTGlzdHMudHh0IGIvZG9jcy9DTWFrZUxpc3RzLnR4dAppbmRleCA3NWZjNzA2Li5hMGYzNmNiIDEwMDY0NAotLS0gYS9kb2NzL0NNYWtlTGlzdHMudHh0CisrKyBiL2RvY3MvQ01ha2VMaXN0cy50eHQKQEAgLTI0LDExMiArMjQsNiBAQAogICBtZXNzYWdlKFdBUk5JTkcgIlVuYWJsZSB0byBmaW5kIHNwaGlueC1idWlsZCBwcm9ncmFtLiBOb3QgYnVpbGRpbmcgZG9jcyIpCiBlbmRpZigpCiAKLSMjIEV4YW1wbGUgdGVzdGluZwotCi1maW5kX3Byb2dyYW0oTElUUkVfRVhFQ1VUQUJMRQotICBOQU1FUyBsaXRyZQotICBET0MgIkxpdFJlIGxpdGVyYXRlIHByb2dyYW1taW5nIHRvb2wgZm9yIGRvY3V0aWxzIikKLQotZmluZF9wcm9ncmFtKFNQSElOWF9FWEVDVVRBQkxFCi0gIE5BTUVTIHNwaGlueC1idWlsZAotICBISU5UUyAkRU5We1NQSElOWF9ESVJ9Ci0gIFBBVEhfU1VGRklYRVMgYmluCi0gIERPQyAiU3BoaW54IGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yIikKLQotaWYoTElUUkVfRVhFQ1VUQUJMRSkKLSAgIyBGaW5kIGFsbCB0aGUgLnJzdCBmaWxlcwotICBmaWxlKEdMT0JfUkVDVVJTRSByc3RfZmlsZXMgUkVMQVRJVkUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICoucnN0KQotICBzZXQoc3ViZGlyX0NNYWtlTGlzdHMpCi0KLSAgZm9yZWFjaChyc3QgJHtyc3RfZmlsZXN9KQotICAgICMgUHJlcGFyZSBhIHRlc3RpbmcgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBDTWFrZUxpc3RzLnR4dAotICAgICMgYW5kIGV4YW1wbGUgZmlsZXMgZXh0cmFjdGVkIGZyb20gdGhlIC5yc3QKLSAgICBzZXQodGVzdF9kaXIgImxpdHJlLXRlc3RzLyR7cnN0fS5saXRyZS10ZXN0cyIpCi0KLSAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCi0gICAgICBPVVRQVVQKLSAgICAgICAgJHt0ZXN0X2Rpcn0vQ01ha2VMaXN0cy50eHQKLSAgICAgIENPTU1BTkQKLSAgICAgICAgJHtMSVRSRV9FWEVDVVRBQkxFfQotICAgICAgICAtLWRlZmF1bHRfY29tcGlsZXI9JHtDTUFLRV9CSU5BUllfRElSfS9iaW4vc3dpZnQKLSAgICAgICAgIi0tZHVtcF9kaXI9JHt0ZXN0X2Rpcn0iCi0gICAgICAgIC0tdHJhY2ViYWNrCi0gICAgICAgIC0tcmVwb3J0PXNldmVyZSAgIyBzdXBwcmVzcyBtb3N0IC5yc3QgZXJyb3JzLiAgV2UgaGF2ZSBsb3RzIG9mIHRoZW0uCi0gICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke3JzdH0KLSAgICAgIERFUEVORFMKLSAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7cnN0fQotICAgICAgQ09NTUVOVAotICAgICAgICAiR2VuZXJhdGluZy9VcGRhdGluZyBMaXRSZSB0ZXN0cyBmb3IgJHtyc3R9IgotICAgICAgVkVSQkFUSU0KLSAgICAgICkKLQotICAgIGxpc3QoQVBQRU5EIHN1YmRpcl9DTWFrZUxpc3RzICR7dGVzdF9kaXJ9L0NNYWtlTGlzdHMudHh0KQotICBlbmRmb3JlYWNoKCkKLQotICAjIENyZWF0ZSBhIHRvcC1sZXZlbCBDTWFrZUxpc3RzLnR4dCBpbiBhIHRlbXBvcmFyeSBmaWxlCi0gIGFkZF9jdXN0b21fY29tbWFuZCgKLSAgICBPVVRQVVQKLSAgICAgIGxpdHJlLXRvcC1DTWFrZUxpc3RzLmNtYWtlCi0gICAgQ09NTUFORAotICAgICAgJHtDTUFLRV9DT01NQU5EfSAtRE9VVFBVVD1saXRyZS10b3AtQ01ha2VMaXN0cy5jbWFrZQotICAgICAgICAgICAgICAgICAgICAgIC1EU09VUkNFX0RJUj0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KLSAgICAgICAgICAtUCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vR2VuZXJhdGVUb3BMZXZlbExpdHJlQ01ha2VMaXN0cy5jbWFrZQotICAgICAgICAgICR7cnN0X2ZpbGVzfQotICAgIERFUEVORFMKLSAgICAgICR7cnN0X2ZpbGVzfQotICAgIENPTU1FTlQKLSAgICAgICJHZW5lcmF0aW5nIHRvcC1sZXZlbCBMaXRSZSBDTWFrZUxpc3RzLnR4dCBjb250ZW50IgotICAgIFZFUkJBVElNCi0gICAgKQotCi0gICMgT25seSB1cGRhdGUgdGhlIHJlYWwgdG9wLWxldmVsIENNYWtlTGlzdHMudHh0IGlmIHNvbWV0aGluZyBjaGFuZ2VkCi0gIGFkZF9jdXN0b21fY29tbWFuZCgKLSAgICBPVVRQVVQKLSAgICAgICJsaXRyZS10ZXN0cy9DTWFrZUxpc3RzLnR4dCIKLSAgICBDT01NQU5ECi0gICAgICAiJHtDTUFLRV9DT01NQU5EfSIgIi1FIiAiY29weV9pZl9kaWZmZXJlbnQiCi0gICAgICAibGl0cmUtdG9wLUNNYWtlTGlzdHMuY21ha2UiICJsaXRyZS10ZXN0cy9DTWFrZUxpc3RzLnR4dCIKLSAgICBERVBFTkRTCi0gICAgICAibGl0cmUtdG9wLUNNYWtlTGlzdHMuY21ha2UiCi0gICAgQ09NTUVOVAotICAgICAgIlVwZGF0aW5nIHRvcC1sZXZlbCBMaXRSZSBDTWFrZUxpc3RzLnR4dCIKLSAgICBWRVJCQVRJTSkKLQotICAjIENyZWF0ZSBhIGJ1aWxkIGRpcmVjdG9yeQotICBhZGRfY3VzdG9tX2NvbW1hbmQoCi0gICAgT1VUUFVUICJsaXRyZS10ZXN0cy9idWlsZCIKLSAgICBDT01NQU5EICIke0NNQUtFX0NPTU1BTkR9IiAiLUUiICJtYWtlX2RpcmVjdG9yeSIgImxpdHJlLXRlc3RzL2J1aWxkIikKLQotICAjIFJ1biBDTWFrZSBpdHNlbGYgdG8gY29uZmlndXJlL2J1aWxkIHRoZSB0ZXN0cwotICBhZGRfY3VzdG9tX2NvbW1hbmQoCi0gICAgT1VUUFVUCi0gICAgICBsaXRyZS10ZXN0cy9yZXN1bHRzCi0gICAgQ09NTUFORAotICAgICAgJHtDTUFLRV9DT01NQU5EfSAtRyAiJHtDTUFLRV9HRU5FUkFUT1J9IiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpdHJlLXRlc3RzIgotICAgIENPTU1BTkQKLSAgICAgICR7Q01BS0VfQ09NTUFORH0gLS1idWlsZCAuCi0gICAgQ09NTUFORAotICAgICAgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpdHJlLXRlc3RzL3Jlc3VsdHMiCi0gICAgV09SS0lOR19ESVJFQ1RPUlkKLSAgICAgIGxpdHJlLXRlc3RzL2J1aWxkCi0gICAgREVQRU5EUwotICAgICAgJHtDTUFLRV9CSU5BUllfRElSfS9iaW4vc3dpZnQKLSAgICAgIGxpdHJlLXRlc3RzL0NNYWtlTGlzdHMudHh0IGxpdHJlLXRlc3RzL2J1aWxkICR7c3ViZGlyX0NNYWtlTGlzdHN9Ci0gICAgQ09NTUVOVAotICAgICAgIlJ1bm5pbmcgTGl0UmUgdGVzdHMiCi0gICAgVkVSQkFUSU0KLSAgICAgICkKLQotICAjIEFkZCBhIHRhcmdldCBzbyB0aGVzZSB0ZXN0cyBzaG93IHVwIGluIHRoZSBYY29kZSBwcm9qZWN0LgotICBhZGRfY3VzdG9tX3RhcmdldCgKLSAgICBMaXRlcmF0ZVRlc3RzIFNPVVJDRVMgJHtyc3RfZmlsZXN9Ci0gICAgREVQRU5EUyBsaXRyZS10ZXN0cy9yZXN1bHRzCi0gICAgKQotICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoTGl0ZXJhdGVUZXN0cyBQUk9QRVJUSUVTIEZPTERFUiAiVGVzdHMiKQotZWxzZSgpCi0gIG1lc3NhZ2UoV0FSTklORyAiTGl0UmUgbm90IGZvdW5kOyBjb2RlIGV4YW1wbGVzIHdvbid0IGJlIHRlc3RlZC4iKQotZW5kaWYoKQotCiBpZiAoTExWTV9FTkFCTEVfRE9YWUdFTikKIGlmIChET1hZR0VOX0ZPVU5EKQogICBzZXQoYWJzX3NyY2RpciAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCmRpZmYgLS1naXQgYS9kb2NzL0NvbnRpbnVvdXNJbnRlZ3JhdGlvbi5tZCBiL2RvY3MvQ29udGludW91c0ludGVncmF0aW9uLm1kCmluZGV4IDE5NjNiMWUuLmU5NWJjNTYgMTAwNjQ0Ci0tLSBhL2RvY3MvQ29udGludW91c0ludGVncmF0aW9uLm1kCisrKyBiL2RvY3MvQ29udGludW91c0ludGVncmF0aW9uLm1kCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgLSBbVmFsaWRhdGlvbiBUZXN0aW5nXSgjdmFsaWRhdGlvbi10ZXN0aW5nKQogICAgIC0gW0xpbnRpbmddKCNsaW50aW5nKQogICAgIC0gW1NvdXJjZSBDb21wYXRpYmlsaXR5IFRlc3RpbmddKCNzb3VyY2UtY29tcGF0aWJpbGl0eS10ZXN0aW5nKQorICAgIC0gW1NvdXJjZWtpdCBTdHJlc3MgVGVzdGluZ10oI3NvdXJjZWtpdC1zdHJlc3MtdGVzdGluZykKICAgICAtIFtTcGVjaWZpYyBQcmVzZXQgVGVzdGluZ10oI3NwZWNpZmljLXByZXNldC10ZXN0aW5nKQogICAgIC0gW0J1aWxkIFN3aWZ0IFRvb2xjaGFpbl0oI2J1aWxkLXN3aWZ0LXRvb2xjaGFpbikKICAgICAtIFtUZXN0aW5nIENvbXBpbGVyIFBlcmZvcm1hbmNlXSgjdGVzdGluZy1jb21waWxlci1wZXJmb3JtYW5jZSkKQEAgLTEzOSw2ICsxNDAsMTIgQEAKIG1hY09TIHBsYXRmb3JtIHwgQHN3aWZ0LWNpIFBsZWFzZSBUZXN0IFNvdXJjZSBDb21wYXRpYmlsaXR5IFJlbGVhc2UgfCBTd2lmdCBTb3VyY2UgQ29tcGF0aWJpbGl0eSBTdWl0ZSBvbiBtYWNPUyBQbGF0Zm9ybSAoUmVsZWFzZSkKIG1hY09TIHBsYXRmb3JtIHwgQHN3aWZ0LWNpIFBsZWFzZSBUZXN0IFNvdXJjZSBDb21wYXRpYmlsaXR5IERlYnVnIHwgU3dpZnQgU291cmNlIENvbXBhdGliaWxpdHkgU3VpdGUgb24gbWFjT1MgUGxhdGZvcm0gKERlYnVnKQogCisjIyMgU291cmNla2l0IFN0cmVzcyBUZXN0aW5nCisKK1BsYXRmb3JtICAgICAgIHwgQ29tbWVudCB8IENoZWNrIFN0YXR1cworLS0tLS0tLS0tLS0tICAgfCAtLS0tLS0tIHwgLS0tLS0tLS0tLS0tCittYWNPUyBwbGF0Zm9ybSB8IEBzd2lmdC1jaSBQbGVhc2UgU291cmNla2l0IFN0cmVzcyB0ZXN0IHwgU3dpZnQgU291cmNla2l0IFN0cmVzcyBUZXN0ZXIgb24gbWFjT1MgUGxhdGZvcm0KKwogIyMjIFNwZWNpZmljIFByZXNldCBUZXN0aW5nCiAKIFBsYXRmb3JtICAgICAgIHwgQ29tbWVudCB8IENoZWNrIFN0YXR1cwpkaWZmIC0tZ2l0IGEvZG9jcy9EZXBlbmRlbmN5QW5hbHlzaXMucnN0IGIvZG9jcy9EZXBlbmRlbmN5QW5hbHlzaXMucnN0CmluZGV4IDkxYTFhOTcuLmU3YTFhMzYgMTAwNjQ0Ci0tLSBhL2RvY3MvRGVwZW5kZW5jeUFuYWx5c2lzLnJzdAorKysgYi9kb2NzL0RlcGVuZGVuY3lBbmFseXNpcy5yc3QKQEAgLTEsNyArMSw1IEBACiA6b3JwaGFuOgogCi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCi0KID09PT09PT09PT09PT09PT09PT0KIERlcGVuZGVuY3kgQW5hbHlzaXMKID09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RvY3MvR2VuZXJhdGVUb3BMZXZlbExpdHJlQ01ha2VMaXN0cy5jbWFrZSBiL2RvY3MvR2VuZXJhdGVUb3BMZXZlbExpdHJlQ01ha2VMaXN0cy5jbWFrZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmYTNhZi4uMDAwMDAwMAotLS0gYS9kb2NzL0dlbmVyYXRlVG9wTGV2ZWxMaXRyZUNNYWtlTGlzdHMuY21ha2UKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjgpCi1zZXQocnN0X2ZpbGVzKQotZm9yZWFjaChpIFJBTkdFIDUgJHtDTUFLRV9BUkdDfSkKLSAgbGlzdChBUFBFTkQgcnN0X2ZpbGVzICR7Q01BS0VfQVJHViR7aX19KQotZW5kZm9yZWFjaCgpCi1jb25maWd1cmVfZmlsZSgke1NPVVJDRV9ESVJ9L0xpdFJlVGVtcGxhdGUuY21ha2UgJHtPVVRQVVR9IEBPTkxZKQpkaWZmIC0tZ2l0IGEvZG9jcy9MZXhpY29uLnJzdCBiL2RvY3MvTGV4aWNvbi5yc3QKaW5kZXggYjE1ZmFiOC4uOGQwYTc2YyAxMDA2NDQKLS0tIGEvZG9jcy9MZXhpY29uLnJzdAorKysgYi9kb2NzL0xleGljb24ucnN0CkBAIC0zLDggKzMsNiBAQAogLi4gdGl0bGU6OiBMZXhpY29uCiAuLiBkZWZhdWx0LXJvbGU6OiB0ZXJtCiAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKLQogVGhpcyBmaWxlIGRlZmluZXMgc2V2ZXJhbCB0ZXJtcyB1c2VkIGJ5IHRoZSBTd2lmdCBjb21waWxlciBhbmQgc3RhbmRhcmQgbGlicmFyeQogc291cmNlIGNvZGUsIHRlc3RzLCBhbmQgY29tbWl0IG1lc3NhZ2VzLiBTZWUgYWxzbyB0aGUgYExMVk0gbGV4aWNvbmBfLgogCmRpZmYgLS1naXQgYS9kb2NzL0xpdGVyYWxzLnJzdCBiL2RvY3MvTGl0ZXJhbHMucnN0CmluZGV4IGM3ZmRlNTUuLmY2ZDQzOTYgMTAwNjQ0Ci0tLSBhL2RvY3MvTGl0ZXJhbHMucnN0CisrKyBiL2RvY3MvTGl0ZXJhbHMucnN0CkBAIC0xLDcgKzEsNSBAQAogOm9ycGhhbjoKIAotLi4gQHJhaXNlIGxpdHJlLlRlc3RzQXJlTWlzc2luZwotCiBMaXRlcmFscwogPT09PT09PT0KIApkaWZmIC0tZ2l0IGEvZG9jcy9MaXRyZVRlbXBsYXRlLmNtYWtlIGIvZG9jcy9MaXRyZVRlbXBsYXRlLmNtYWtlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmZiYjcxNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9MaXRyZVRlbXBsYXRlLmNtYWtlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKLQotZmluZF9wcm9ncmFtKExJVFJFX0VYRUNVVEFCTEUKLSAgTkFNRVMgbGl0cmUKLSAgRE9DICJMaXRSZSBsaXRlcmF0ZSBwcm9ncmFtbWluZyB0b29sIGZvciBkb2N1dGlscyIpCi0KLSMgTWFrZSB0aGUgTGl0cmVUZXN0aW5nIGNtYWtlIG1vZHVsZSBhdmFpbGFibGUKLWV4ZWN1dGVfcHJvY2VzcygKLSAgQ09NTUFORCAke0xJVFJFX0VYRUNVVEFCTEV9IC0tY21ha2VfbW9kdWxlX3BhdGgKLSAgT1VUUFVUX1ZBUklBQkxFIGxpdHJlX2NtYWtlX21vZHVsZV9wYXRoCi0gIE9VVFBVVF9TVFJJUF9UUkFJTElOR19XSElURVNQQUNFCi0gICkKLQotbGlzdChBUFBFTkQgQ01BS0VfTU9EVUxFX1BBVEggJHtsaXRyZV9jbWFrZV9tb2R1bGVfcGF0aH0pCi1zZXQocnN0X2ZpbGVzICJAcnN0X2ZpbGVzQCIpCi1mb3JlYWNoKHJzdCAke3JzdF9maWxlc30pCi0gIGFkZF9zdWJkaXJlY3RvcnkoIiR7cnN0fS5saXRyZS10ZXN0cyIpCi1lbmRmb3JlYWNoKCkKZGlmZiAtLWdpdCBhL2RvY3MvTG9naWNhbE9iamVjdHMucnN0IGIvZG9jcy9Mb2dpY2FsT2JqZWN0cy5yc3QKaW5kZXggYTVmZWY1ZC4uNmUzMmRhMCAxMDA2NDQKLS0tIGEvZG9jcy9Mb2dpY2FsT2JqZWN0cy5yc3QKKysrIGIvZG9jcy9Mb2dpY2FsT2JqZWN0cy5yc3QKQEAgLTEsNSArMSwzIEBACi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCi0KIExvZ2ljYWwgT2JqZWN0cwogPT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL2RvY3MvTW9kdWxlcy5yc3QgYi9kb2NzL01vZHVsZXMucnN0CmluZGV4IDE2ZGZjNGYuLmZiZWEyM2QgMTAwNjQ0Ci0tLSBhL2RvY3MvTW9kdWxlcy5yc3QKKysrIGIvZG9jcy9Nb2R1bGVzLnJzdApAQCAtMSw2ICsxLDUgQEAKIDpvcnBoYW46CiAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKIC4uIGRlZmF1bHQtcm9sZTo6IHRlcm0KIC4uIHRpdGxlOjogTW9kdWxlcyBVc2VyIE1vZGVsCiAKZGlmZiAtLWdpdCBhL2RvY3MvT3B0aW1pemF0aW9uVGlwcy5yc3QgYi9kb2NzL09wdGltaXphdGlvblRpcHMucnN0CmluZGV4IDlhNjMxMmMuLmYwMGRlMWYgMTAwNjQ0Ci0tLSBhL2RvY3MvT3B0aW1pemF0aW9uVGlwcy5yc3QKKysrIGIvZG9jcy9PcHRpbWl6YXRpb25UaXBzLnJzdApAQCAtMTYxLDcgKzE2MSw3IEBACiAgIGZ1bmMgdXNpbmdFKF8gZTogRSkgewogICAgIGUuZG9Tb21ldGhpbmcoKSAvLyBUaGVyZSBpcyBubyBzdWIgY2xhc3MgaW4gdGhlIGZpbGUgdGhhdCBkZWNsYXJlcyB0aGlzIGNsYXNzLgogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29tcGlsZXIgY2FuIHJlbW92ZSB2aXJ0dWFsIGNhbGxzIHRvIGRvU29tZXRoaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRpcmVjdGx5IGNhbGwgQSdzIGRvU29tZXRoaW5nIG1ldGhvZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRpcmVjdGx5IGNhbGwgRSdzIGRvU29tZXRoaW5nIG1ldGhvZC4KICAgfQogCiAgIGZ1bmMgdXNpbmdGKF8gZjogRikgLT4gSW50IHsKZGlmZiAtLWdpdCBhL2RvY3MvUGF0dGVybk1hdGNoaW5nLnJzdCBiL2RvY3MvUGF0dGVybk1hdGNoaW5nLnJzdAppbmRleCBmMjZkN2U4Li4wOTY4YmZhIDEwMDY0NAotLS0gYS9kb2NzL1BhdHRlcm5NYXRjaGluZy5yc3QKKysrIGIvZG9jcy9QYXR0ZXJuTWF0Y2hpbmcucnN0CkBAIC0xLDQgKzEsMyBAQAotLi4gQHJhaXNlIGxpdHJlLlRlc3RzQXJlTWlzc2luZwogLi4gX1BhdHRlcm5NYXRjaGluZzoKIAogUGF0dGVybiBNYXRjaGluZwpkaWZmIC0tZ2l0IGEvZG9jcy9TSUwucnN0IGIvZG9jcy9TSUwucnN0CmluZGV4IDY5OWU5ZjMuLjFlNWI3ODEgMTAwNjQ0Ci0tLSBhL2RvY3MvU0lMLnJzdAorKysgYi9kb2NzL1NJTC5yc3QKQEAgLTEsNCArMSwzIEBACi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCiAuLiBoaWdobGlnaHQ6OiBub25lCiAKIFN3aWZ0IEludGVybWVkaWF0ZSBMYW5ndWFnZSAoU0lMKQpAQCAtMjgyOCw2ICsyODI3LDEzIEBACiBgYCRPcHRpb25hbDxUPmBgLCBleGNlcHQgdGhhdCBpdCBpcyBgYG51bGxgYCBpZiB0aGUgaGVhcCBvYmplY3QgaGFzIGJlZ3VuCiBkZWFsbG9jYXRpb24uCiAKK0lmIGBgW3Rha2VdYGAgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIHVuZGVybHlpbmcgd2VhayByZWZlcmVuY2UgaXMgaW52YWxpZGF0ZWQKK2ltcGx5aW5nIHRoYXQgdGhlIHdlYWsgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBsb2FkZWQgdmFsdWUgaXMgZGVjcmVtZW50ZWQuIElmCitgYFt0YWtlXWBgIGlzIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgdW5kZXJseWluZyB3ZWFrIHJlZmVyZW5jZSBjb3VudCBpcyBub3QKK2FmZmVjdGVkIGJ5IHRoaXMgb3BlcmF0aW9uIChpLmUuIGl0IGlzIGEgKzAgd2VhayByZWYgY291bnQgb3BlcmF0aW9uKS4gSW4gZWl0aGVyCitjYXNlLCB0aGUgc3Ryb25nIHJlZmVyZW5jZSBjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkIGJlZm9yZSBhbnkgY2hhbmdlcyB0byB0aGUKK3dlYWsgcmVmZXJlbmNlIGNvdW50LgorCiBUaGlzIG9wZXJhdGlvbiBtdXN0IGJlIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gdGhlIGZpbmFsIGBgc3Ryb25nX3JlbGVhc2VgYCBvbgogdGhlIG9wZXJhbmQgaGVhcCBvYmplY3QuICBJdCBuZWVkIG5vdCBiZSBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGBgc3RvcmVfd2Vha2BgCiBvcGVyYXRpb25zIG9uIHRoZSBzYW1lIGFkZHJlc3MuCkBAIC0yODQ2LDcgKzI4NTIsMTMgQEAKIAogSWYgYGBbaW5pdGlhbGl6YXRpb25dYGAgaXMgZ2l2ZW4sIHRoZSB3ZWFrIHJlZmVyZW5jZSBtdXN0IGN1cnJlbnRseSBlaXRoZXIgYmUKIHVuaW5pdGlhbGl6ZWQgb3IgZGVzdHJveWVkLiAgSWYgaXQgaXMgbm90IGdpdmVuLCB0aGUgd2VhayByZWZlcmVuY2UgbXVzdAotY3VycmVudGx5IGJlIGluaXRpYWxpemVkLgorY3VycmVudGx5IGJlIGluaXRpYWxpemVkLiBBZnRlciB0aGUgZXZhbHVhdGlvbjoKKworKiBUaGUgdmFsdWUgdGhhdCB3YXMgb3JpZ2luYWxseSByZWZlcmVuY2VkIGJ5IHRoZSB3ZWFrIHJlZmVyZW5jZSB3aWxsIGhhdmUKKyAgaXRzIHdlYWsgcmVmZXJlbmNlIGNvdW50IGRlY3JlbWVudGVkIGJ5IDEuCisqIElmIHRoZSBvcHRpb25hbGx5IHR5cGVkIG9wZXJhbmQgaXMgbm9uLW5pbCwgdGhlIHN0cm9uZyByZWZlcmVuY2Ugd3JhcHBlZCBpbgorICB0aGUgb3B0aW9uYWwgaGFzIGl0cyB3ZWFrIHJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZCBieSAxLiBJbiBjb250cmFzdCwgdGhlIHJlZmVyZW5jZSdzCisgIHN0cm9uZyByZWZlcmVuY2UgY291bnQgaXMgbm90IHRvdWNoZWQuCiAKIFRoaXMgb3BlcmF0aW9uIG11c3QgYmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byB0aGUgZmluYWwgYGBzdHJvbmdfcmVsZWFzZWBgIG9uCiB0aGUgb3BlcmFuZCAoc291cmNlKSBoZWFwIG9iamVjdC4gIEl0IG5lZWQgbm90IGJlIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8KQEAgLTMzNDgsMTEgKzMzNjAsMTIgQEAKIGBgYGBgYGBgYGBgYGAKIDo6CiAKLSAgc2lsLWluc3RydWN0aW9uIDo6PSAncGFydGlhbF9hcHBseScgY2FsbGVlLW93bmVyc2hpcC1hdHRyPyBzaWwtdmFsdWUKKyAgc2lsLWluc3RydWN0aW9uIDo6PSAncGFydGlhbF9hcHBseScgY2FsbGVlLW93bmVyc2hpcC1hdHRyPyBvbi1zdGFjay1hdHRyPyBzaWwtdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgIHNpbC1hcHBseS1zdWJzdGl0dXRpb24tbGlzdD8KICAgICAgICAgICAgICAgICAgICAgICAgICcoJyAoc2lsLXZhbHVlICgnLCcgc2lsLXZhbHVlKSopPyAnKScKICAgICAgICAgICAgICAgICAgICAgICAgICc6JyBzaWwtdHlwZQogICBjYWxsZWUtb3duZXJzaGlwLWF0dHIgOjo9ICdbY2FsbGVlX2d1YXJhbnRlZWRdJworICBvbi1zdGFjay1hdHRyIDo6PSAnW29uX3N0YWNrXScKIAogICAlYyA9IHBhcnRpYWxfYXBwbHkgJTAoJTEsICUyLCAuLi4pIDogJChaLi4uLCBBLCBCLCAuLi4pIC0+IFIKICAgLy8gTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSBjYWxsZWUgJyUwJyBpcyBzcGVjaWZpZWQgKmFmdGVyKiB0aGUgYXJndW1lbnRzCkBAIC0zMzcwLDEyICszMzgzLDE4IEBACiBDcmVhdGVzIGEgY2xvc3VyZSBieSBwYXJ0aWFsbHkgYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIGBgJTBgYCB0byBhIHBhcnRpYWwKIHNlcXVlbmNlIG9mIGl0cyBhcmd1bWVudHMuIEluIHRoZSBpbnN0cnVjdGlvbiBzeW50YXgsIHRoZSB0eXBlIG9mIHRoZSBjYWxsZWUgaXMKIHNwZWNpZmllZCBhZnRlciB0aGUgYXJndW1lbnQgbGlzdDsgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudCBhbmQgb2YgdGhlIGRlZmluZWQKLXZhbHVlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIGNhbGxlZS4gVGhlIGNsb3N1cmUgY29udGV4dCB3aWxsCi1iZSBhbGxvY2F0ZWQgd2l0aCByZXRhaW4gY291bnQgMSBhbmQgaW5pdGlhbGl6ZWQgdG8gY29udGFpbiB0aGUgdmFsdWVzIGBgJTFgYCwKK3ZhbHVlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIGNhbGxlZS4gSWYgdGhlIGBgcGFydGlhbF9hcHBseWBgCitoYXMgYW4gZXNjYXBpbmcgZnVuY3Rpb24gdHlwZSAobm90IGBgW29uX3N0YWNrXWBgKSB0aGUgY2xvc3VyZSBjb250ZXh0IHdpbGwgYmUKK2FsbG9jYXRlZCB3aXRoIHJldGFpbiBjb3VudCAxIGFuZCBpbml0aWFsaXplZCB0byBjb250YWluIHRoZSB2YWx1ZXMgYGAlMWBgLAogYGAlMmBgLCBldGMuICBUaGUgY2xvc2VkLW92ZXIgdmFsdWVzIHdpbGwgbm90IGJlIHJldGFpbmVkOyB0aGF0IG11c3QgYmUgZG9uZQotc2VwYXJhdGVseSBiZWZvcmUgdGhlIGBgcGFydGlhbF9hcHBseWBgLiBUaGUgY2xvc3VyZSBkb2VzIGhvd2V2ZXIgdGFrZQotb3duZXJzaGlwIG9mIHRoZSBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHM7IHdoZW4gdGhlIGNsb3N1cmUgcmVmZXJlbmNlCi1jb3VudCByZWFjaGVzIHplcm8sIHRoZSBjb250YWluZWQgdmFsdWVzIHdpbGwgYmUgZGVzdHJveWVkLgorc2VwYXJhdGVseSBiZWZvcmUgdGhlIGBgcGFydGlhbF9hcHBseWBgLiBUaGUgY2xvc3VyZSBkb2VzIGhvd2V2ZXIgdGFrZSBvd25lcnNoaXAKK29mIHRoZSBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHM7IHdoZW4gdGhlIGNsb3N1cmUgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMKK3plcm8sIHRoZSBjb250YWluZWQgdmFsdWVzIHdpbGwgYmUgZGVzdHJveWVkLiBJZiB0aGUgYGBwYXJ0aWFsX2FwcGx5YGAgaGFzIGEKK2BgQG5vZXNjYXBlYGAgZnVuY3Rpb24gdHlwZSAoYGBwYXJ0aWFsX2FwcGx5IFtvbl9zdGFja11gYCkgdGhlIGNsb3N1cmUgY29udGV4dAoraXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBhbmQgaW50aWFsaXplZCB0byBjb250YWluIHRoZSBjbG9zZWQtb3ZlciB2YWx1ZXMuIFRoZQorY2xvc2VkLW92ZXIgdmFsdWVzIGFyZSBub3QgcmV0YWluZWQsIGxpZmV0aW1lIG9mIHRoZSBjbG9zZWQtb3ZlciB2YWx1ZXMgbXVzdCBiZQorbWFuYWdlZCBzZXBhcmF0ZWx5LiBUaGUgbGlmZXRpbWUgb2YgdGhlIHN0YWNrIGNvbnRleHQgb2YgYSBgYHBhcnRpYWxfYXBwbHkKK1tzdGFja11gYCBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhIGBgZGVhbGxvY19zdGFja2BgLgogCiBJZiB0aGUgY2FsbGVlIGlzIGdlbmVyaWMsIGFsbCBvZiBpdHMgZ2VuZXJpYyBwYXJhbWV0ZXJzIG11c3QgYmUgYm91bmQgYnkgdGhlCiBnaXZlbiBzdWJzdGl0dXRpb24gbGlzdC4gVGhlIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gd2l0aCB0aGVzZSBnZW5lcmljCmRpZmYgLS1naXQgYS9kb2NzL1NlcXVlbmNlc0FuZENvbGxlY3Rpb25zLnJzdCBiL2RvY3MvU2VxdWVuY2VzQW5kQ29sbGVjdGlvbnMucnN0CmluZGV4IGUwMDEwYzkuLjJlZWY5NDQgMTAwNjQ0Ci0tLSBhL2RvY3MvU2VxdWVuY2VzQW5kQ29sbGVjdGlvbnMucnN0CisrKyBiL2RvY3MvU2VxdWVuY2VzQW5kQ29sbGVjdGlvbnMucnN0CkBAIC0xLDYgKzEsNSBAQAogOm9ycGhhbjoKIAotLi4gQHJhaXNlIGxpdHJlLlRlc3RzQXJlTWlzc2luZwogLi4gZGVmYXVsdC1yb2xlOjogY29kZQogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RvY3MvU3RkbGliUmF0aW9uYWxlcy5yc3QgYi9kb2NzL1N0ZGxpYlJhdGlvbmFsZXMucnN0CmluZGV4IDA5N2RjOGEuLjNiODUwM2IgMTAwNjQ0Ci0tLSBhL2RvY3MvU3RkbGliUmF0aW9uYWxlcy5yc3QKKysrIGIvZG9jcy9TdGRsaWJSYXRpb25hbGVzLnJzdApAQCAtMSw3ICsxLDUgQEAKIDpvcnBoYW46CiAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKLQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogUmF0aW9uYWxlcyBmb3IgdGhlIFN3aWZ0IHN0YW5kYXJkIGxpYnJhcnkgZGVzaWducwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvZG9jcy9TdG9yZWRBbmRDb21wdXRlZFZhcmlhYmxlcy5yc3QgYi9kb2NzL1N0b3JlZEFuZENvbXB1dGVkVmFyaWFibGVzLnJzdAppbmRleCAzZDhjMTk2Li4yMmRkNjI1IDEwMDY0NAotLS0gYS9kb2NzL1N0b3JlZEFuZENvbXB1dGVkVmFyaWFibGVzLnJzdAorKysgYi9kb2NzL1N0b3JlZEFuZENvbXB1dGVkVmFyaWFibGVzLnJzdApAQCAtMSw1ICsxLDMgQEAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKLQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFN0b3JlZCBhbmQgQ29tcHV0ZWQgVmFyaWFibGVzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvZG9jcy9TdHJpbmdEZXNpZ24ucnN0IGIvZG9jcy9TdHJpbmdEZXNpZ24ucnN0CmluZGV4IGQ4OTczYmMuLjI2YzBjOGYgMTAwNjQ0Ci0tLSBhL2RvY3MvU3RyaW5nRGVzaWduLnJzdAorKysgYi9kb2NzL1N0cmluZ0Rlc2lnbi5yc3QKQEAgLTEsNyArMSw1IEBACiA6b3JwaGFuOgogCi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCi0KIC4uIHJhdzo6IGh0bWwKIAogICAgIDxzdHlsZT4KZGlmZiAtLWdpdCBhL2RvY3MvVHlwZUNoZWNrZXIucnN0IGIvZG9jcy9UeXBlQ2hlY2tlci5yc3QKaW5kZXggNmFlY2U5OS4uZDM4Mzc4MSAxMDA2NDQKLS0tIGEvZG9jcy9UeXBlQ2hlY2tlci5yc3QKKysrIGIvZG9jcy9UeXBlQ2hlY2tlci5yc3QKQEAgLTEsNSArMSwzIEBACi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCi0KIFR5cGUgQ2hlY2tlciBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL2RvY3MvV2luZG93c0J1aWxkLm1kIGIvZG9jcy9XaW5kb3dzQnVpbGQubWQKaW5kZXggNDY3MzE3Ny4uZWNkZDEwMSAxMDA2NDQKLS0tIGEvZG9jcy9XaW5kb3dzQnVpbGQubWQKKysrIGIvZG9jcy9XaW5kb3dzQnVpbGQubWQKQEAgLTEwMyw3ICsxMDMsNyBAQAogY21ha2UgLUcgTmluamFeCiAgIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1Z14KICAgLURDTUFLRV9DX0NPTVBJTEVSPWNsXgotICAtRENNQUtFX0NYWF9DT01QSUVMUj1jbF4KKyAgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xeCiAgIFM6XGNtYXJrCiBwb3BkCiBjbWFrZSAtLWJ1aWxkICJTOlxidWlsZFxOaW5qYS1EZWJ1Z0Fzc2VydFxjbWFyay13aW5kb3dzLWFtZDY0IgpAQCAtMTMzLDcgKzEzMyw3IEBACiAtIFVwZGF0ZSB5b3VyIHBhdGggdG8gaW5jbHVkZSB0aGUgTExWTSB0b29scy4KIAogYGBgY21kCi1zZXQgUEFUSD0lUEFUSCU7UzpcYnVpbGRcTmluamEtRGVidWdBc3NlcnRcbGx2bS13aW5kb3dzLWFtZDY0XGJpbgorc2V0IFBBVEg9UzpcYnVpbGRcTmluamEtRGVidWdBc3NlcnRcbGx2bS13aW5kb3dzLWFtZDY0XGJpbjslUEFUSCUKIGBgYAogCiAjIyMgNy4gQnVpbGQgU3dpZnQKZGlmZiAtLWdpdCBhL2RvY3MvYXJjaGl2ZS9MYW5nUmVmTmV3LnJzdCBiL2RvY3MvYXJjaGl2ZS9MYW5nUmVmTmV3LnJzdAppbmRleCBkMTRlYzc5Li4xMzFkM2NlIDEwMDY0NAotLS0gYS9kb2NzL2FyY2hpdmUvTGFuZ1JlZk5ldy5yc3QKKysrIGIvZG9jcy9hcmNoaXZlL0xhbmdSZWZOZXcucnN0CkBAIC0xLDcgKzEsNSBAQAogOm9ycGhhbjoKIAotLi4gQHJhaXNlIGxpdHJlLlRlc3RzQXJlTWlzc2luZwotCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBTd2lmdCBMYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kb2NzL2FyY2hpdmUvTmFtZXNwYWNlTGV2ZWxWYXJzQW5kVG9wTGV2ZWxDb2RlLnJzdCBiL2RvY3MvYXJjaGl2ZS9OYW1lc3BhY2VMZXZlbFZhcnNBbmRUb3BMZXZlbENvZGUucnN0CmluZGV4IDVlOWZlNzEuLjE4YWFkMjYgMTAwNjQ0Ci0tLSBhL2RvY3MvYXJjaGl2ZS9OYW1lc3BhY2VMZXZlbFZhcnNBbmRUb3BMZXZlbENvZGUucnN0CisrKyBiL2RvY3MvYXJjaGl2ZS9OYW1lc3BhY2VMZXZlbFZhcnNBbmRUb3BMZXZlbENvZGUucnN0CkBAIC0xLDcgKzEsNSBAQAogOm9ycGhhbjoKIAotLi4gQHJhaXNlIGxpdHJlLlRlc3RzQXJlTWlzc2luZwotCiAuLiB3YXJuaW5nOjogVGhpcyBkb2N1bWVudCB3YXMgdXNlZCBpbiBwbGFubmluZyBTd2lmdCAxLjA7IGl0IGhhcyBub3QgYmVlbiBrZXB0CiAgIHVwIHRvIGRhdGUgYW5kIGRvZXMgbm90IGRlc2NyaWJlIHRoZSBjdXJyZW50IG9yIHBsYW5uZWQgYmVoYXZpb3Igb2YgU3dpZnQuCiAKZGlmZiAtLWdpdCBhL2RvY3MvYXJjaGl2ZS9PYmplY3RpdmUtQ0ludGVyb3BlcmFiaWxpdHkucnN0IGIvZG9jcy9hcmNoaXZlL09iamVjdGl2ZS1DSW50ZXJvcGVyYWJpbGl0eS5yc3QKaW5kZXggMmFkOTY4OS4uNGUxMjFiZSAxMDA2NDQKLS0tIGEvZG9jcy9hcmNoaXZlL09iamVjdGl2ZS1DSW50ZXJvcGVyYWJpbGl0eS5yc3QKKysrIGIvZG9jcy9hcmNoaXZlL09iamVjdGl2ZS1DSW50ZXJvcGVyYWJpbGl0eS5yc3QKQEAgLTEsNyArMSw1IEBACiA6b3JwaGFuOgogCi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCi0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIE9iamVjdGl2ZS1DIEludGVyb3BlcmFiaWxpdHkKID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RvY3MvYXJjaGl2ZS9SZXNpbGllbmNlLnJzdCBiL2RvY3MvYXJjaGl2ZS9SZXNpbGllbmNlLnJzdAppbmRleCBhNjUwNzlmLi42NGIzMmY4IDEwMDY0NAotLS0gYS9kb2NzL2FyY2hpdmUvUmVzaWxpZW5jZS5yc3QKKysrIGIvZG9jcy9hcmNoaXZlL1Jlc2lsaWVuY2UucnN0CkBAIC0xLDYgKzEsNSBAQAogOm9ycGhhbjoKIAotLi4gQHJhaXNlIGxpdHJlLlRlc3RzQXJlTWlzc2luZwogLi4gX1Jlc2lsaWVuY2U6CiAKIFJlc2lsaWVuY2UKZGlmZiAtLWdpdCBhL2RvY3MvY29udGVudHMucnN0IGIvZG9jcy9jb250ZW50cy5yc3QKaW5kZXggOGQyZTllZS4uMWE1NzU1NCAxMDA2NDQKLS0tIGEvZG9jcy9jb250ZW50cy5yc3QKKysrIGIvZG9jcy9jb250ZW50cy5yc3QKQEAgLTEsNCArMSwzIEBACi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCiAuLiBfY29udGVudHM6CiAKIENvbnRlbnRzCmRpZmYgLS1naXQgYS9kb2NzL3Byb3Bvc2Fscy9Db25jdXJyZW5jeS5yc3QgYi9kb2NzL3Byb3Bvc2Fscy9Db25jdXJyZW5jeS5yc3QKaW5kZXggMGUzNGIwNS4uZGZmZjcxOSAxMDA2NDQKLS0tIGEvZG9jcy9wcm9wb3NhbHMvQ29uY3VycmVuY3kucnN0CisrKyBiL2RvY3MvcHJvcG9zYWxzL0NvbmN1cnJlbmN5LnJzdApAQCAtMSw2ICsxLDUgQEAKIDpvcnBoYW46CiAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKIC4uIENvbmN1cnJlbmN5TW9kZWw6CiAKICpOb3RlKjogVGhpcyBkb2N1bWVudCBpcyAqKm5vdCBhbiBhY2NlcHRlZCBTd2lmdCBwcm9wb3NhbCoqLiBJdCBkb2VzIG5vdCBkZXNjcmliZSBTd2lmdCdzIGNvbmN1cnJlbmN5IG1lY2hhbmlzbXMgYXMgdGhleSBjdXJyZW50bHkgZXhpc3QsIG5vciBpcyBpdCBhIHJvYWRtYXAgZm9yIHRoZSBhZGRpdGlvbiBvZiBjb25jdXJyZW5jeSBtZWNoYW5pc21zIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTd2lmdC4KZGlmZiAtLWdpdCBhL2RvY3MvcHJvcG9zYWxzL0RlY2xhcmF0aW9uVHlwZUNoZWNrZXIucnN0IGIvZG9jcy9wcm9wb3NhbHMvRGVjbGFyYXRpb25UeXBlQ2hlY2tlci5yc3QKaW5kZXggNWQzZDM5NS4uNzExYzBmNiAxMDA2NDQKLS0tIGEvZG9jcy9wcm9wb3NhbHMvRGVjbGFyYXRpb25UeXBlQ2hlY2tlci5yc3QKKysrIGIvZG9jcy9wcm9wb3NhbHMvRGVjbGFyYXRpb25UeXBlQ2hlY2tlci5yc3QKQEAgLTEsNyArMSw1IEBACiA6b3JwaGFuOgogCi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCi0KIERlY2xhcmF0aW9uIFR5cGUgQ2hlY2tlcgogPT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL2RvY3MvcHJvcG9zYWxzL0lucGxhY2UucnN0IGIvZG9jcy9wcm9wb3NhbHMvSW5wbGFjZS5yc3QKaW5kZXggYzU3MWI3My4uZjE0ZTBkMSAxMDA2NDQKLS0tIGEvZG9jcy9wcm9wb3NhbHMvSW5wbGFjZS5yc3QKKysrIGIvZG9jcy9wcm9wb3NhbHMvSW5wbGFjZS5yc3QKQEAgLTEsNyArMSw1IEBACiA6b3JwaGFuOgogCi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCi0KID09PT09PT09PT09PT09PT09PT09PQogIEluLVBsYWNlIE9wZXJhdGlvbnMKID09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvZG9jcy9wcm9wb3NhbHMvVHlwZVN0YXRlLnJzdCBiL2RvY3MvcHJvcG9zYWxzL1R5cGVTdGF0ZS5yc3QKaW5kZXggYTA5NzAwZC4uZTRiOTRkOSAxMDA2NDQKLS0tIGEvZG9jcy9wcm9wb3NhbHMvVHlwZVN0YXRlLnJzdAorKysgYi9kb2NzL3Byb3Bvc2Fscy9UeXBlU3RhdGUucnN0CkBAIC0xLDcgKzEsNSBAQAogOm9ycGhhbjoKIAotLi4gQHJhaXNlIGxpdHJlLlRlc3RzQXJlTWlzc2luZwotCiBHZW5lcmFsIFR5cGUgU3RhdGUgTm90ZXMKID09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9kb2NzL3Byb3Bvc2Fscy9WYWx1ZVNlbWFudGljcy5yc3QgYi9kb2NzL3Byb3Bvc2Fscy9WYWx1ZVNlbWFudGljcy5yc3QKaW5kZXggNzJkNTE0Zi4uMDRjZTdmYyAxMDA2NDQKLS0tIGEvZG9jcy9wcm9wb3NhbHMvVmFsdWVTZW1hbnRpY3MucnN0CisrKyBiL2RvY3MvcHJvcG9zYWxzL1ZhbHVlU2VtYW50aWNzLnJzdApAQCAtMSw2ICsxLDUgQEAKIDpvcnBoYW46CiAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKIC4uIF9WYWx1ZVNlbWFudGljczoKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RvY3MvcHJvcG9zYWxzL2FyY2hpdmUvTWVtb3J5QW5kQ29uY3VycmVuY3lNb2RlbC5yc3QgYi9kb2NzL3Byb3Bvc2Fscy9hcmNoaXZlL01lbW9yeUFuZENvbmN1cnJlbmN5TW9kZWwucnN0CmluZGV4IDNmMWZjZmYuLjZlMzViM2YgMTAwNjQ0Ci0tLSBhL2RvY3MvcHJvcG9zYWxzL2FyY2hpdmUvTWVtb3J5QW5kQ29uY3VycmVuY3lNb2RlbC5yc3QKKysrIGIvZG9jcy9wcm9wb3NhbHMvYXJjaGl2ZS9NZW1vcnlBbmRDb25jdXJyZW5jeU1vZGVsLnJzdApAQCAtMSw2ICsxLDUgQEAKIDpvcnBoYW46CiAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKIC4uIF9NZW1vcnlBbmRDb25jdXJyZW5jeU1vZGVsOgogCiBTd2lmdCBNZW1vcnkgYW5kIENvbmN1cnJlbmN5IE1vZGVsCmRpZmYgLS1naXQgYS9kb2NzL3Byb3Bvc2Fscy9hcmNoaXZlL1Byb2dyYW1TdHJ1Y3R1cmVBbmRDb21waWxhdGlvbk1vZGVsLnJzdCBiL2RvY3MvcHJvcG9zYWxzL2FyY2hpdmUvUHJvZ3JhbVN0cnVjdHVyZUFuZENvbXBpbGF0aW9uTW9kZWwucnN0CmluZGV4IGU2MjE5ZWEuLjQ5ZDZjZDkgMTAwNjQ0Ci0tLSBhL2RvY3MvcHJvcG9zYWxzL2FyY2hpdmUvUHJvZ3JhbVN0cnVjdHVyZUFuZENvbXBpbGF0aW9uTW9kZWwucnN0CisrKyBiL2RvY3MvcHJvcG9zYWxzL2FyY2hpdmUvUHJvZ3JhbVN0cnVjdHVyZUFuZENvbXBpbGF0aW9uTW9kZWwucnN0CkBAIC0xLDYgKzEsNSBAQAogOm9ycGhhbjoKIAotLi4gQHJhaXNlIGxpdHJlLlRlc3RzQXJlTWlzc2luZwogLi4gX1Byb2dyYW1TdHJ1Y3R1cmVBbmRDb21waWxhdGlvbk1vZGVsOgogCiAuLiBoaWdobGlnaHQ6OiBub25lCmRpZmYgLS1naXQgYS9kb2NzL3Byb3Bvc2Fscy9yZWplY3RlZC9DbG9uYWJsZS5yc3QgYi9kb2NzL3Byb3Bvc2Fscy9yZWplY3RlZC9DbG9uYWJsZS5yc3QKaW5kZXggMmRmYWY5ZS4uYjY3YjA1YiAxMDA2NDQKLS0tIGEvZG9jcy9wcm9wb3NhbHMvcmVqZWN0ZWQvQ2xvbmFibGUucnN0CisrKyBiL2RvY3MvcHJvcG9zYWxzL3JlamVjdGVkL0Nsb25hYmxlLnJzdApAQCAtMSw3ICsxLDUgQEAKIDpvcnBoYW46CiAKLS4uIEByYWlzZSBsaXRyZS5UZXN0c0FyZU1pc3NpbmcKLQogPT09PT09PT09PQogIENsb25hYmxlCiA9PT09PT09PT09CmRpZmYgLS1naXQgYS9kb2NzL3Byb3Bvc2Fscy92YWxyZWYucnN0IGIvZG9jcy9wcm9wb3NhbHMvdmFscmVmLnJzdAppbmRleCBiMzczMDk3Li5jMWQ4NjIzIDEwMDY0NAotLS0gYS9kb2NzL3Byb3Bvc2Fscy92YWxyZWYucnN0CisrKyBiL2RvY3MvcHJvcG9zYWxzL3ZhbHJlZi5yc3QKQEAgLTEsNiArMSw1IEBACiA6b3JwaGFuOgogCi0uLiBAcmFpc2UgbGl0cmUuVGVzdHNBcmVNaXNzaW5nCiAuLiBfdmFscmVmOgogCiA9PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9BU1QvRGVjbC5oIGIvaW5jbHVkZS9zd2lmdC9BU1QvRGVjbC5oCmluZGV4IGZlZTY0N2MuLjUyNzk1YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvQVNUL0RlY2wuaAorKysgYi9pbmNsdWRlL3N3aWZ0L0FTVC9EZWNsLmgKQEAgLTQ5Myw3ICs0OTMsNyBAQAogICAgIEhhc0xhenlDb25mb3JtYW5jZXMgOiAxCiAgICk7CiAKLSAgU1dJRlRfSU5MSU5FX0JJVEZJRUxEX0ZVTEwoUHJvdG9jb2xEZWNsLCBOb21pbmFsVHlwZURlY2wsIDErMSsxKzErMSsxKzErMis4KzE2LAorICBTV0lGVF9JTkxJTkVfQklURklFTERfRlVMTChQcm90b2NvbERlY2wsIE5vbWluYWxUeXBlRGVjbCwgMSsxKzErMSsxKzErMSsyKzErOCsxNiwKICAgICAvLy8gV2hldGhlciB0aGUgXGMgUmVxdWlyZXNDbGFzcyBiaXQgaXMgdmFsaWQuCiAgICAgUmVxdWlyZXNDbGFzc1ZhbGlkIDogMSwKIApAQCAtNTE5LDYgKzUxOSw5IEBACiAgICAgLy8vIFRoZSBzdGFnZSBvZiB0aGUgY2lyY3VsYXJpdHkgY2hlY2sgZm9yIHRoaXMgcHJvdG9jb2wuCiAgICAgQ2lyY3VsYXJpdHkgOiAyLAogCisgICAgLy8vIFdoZXRoZXIgd2UndmUgY29tcHV0ZWQgdGhlIGluaGVyaXRlZCBwcm90b2NvbHMgbGlzdCB5ZXQuCisgICAgSW5oZXJpdGVkUHJvdG9jb2xzVmFsaWQgOiAxLAorCiAgICAgOiBOdW1QYWRCaXRzLAogCiAgICAgLy8vIElmIHRoaXMgaXMgYSBjb21waWxlci1rbm93biBwcm90b2NvbCwgdGhpcyB3aWxsIGJlIGEgS25vd25Qcm90b2NvbEtpbmQKQEAgLTM1NjIsMTEgKzM1NjUsMTYgQEAKICAgdm9pZCBjcmVhdGVPYmpDTWV0aG9kTG9va3VwKCk7CiAKICAgc3RydWN0IHsKKyAgICAvLy8gVGhlIHN1cGVyY2xhc3MgZGVjbCBhbmQgYSBiaXQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKKyAgICAvLy8gc3VwZXJjbGFzcyB3YXMgY29tcHV0ZWQgeWV0IG9yIG5vdC4KKyAgICBsbHZtOjpQb2ludGVySW50UGFpcjxDbGFzc0RlY2wgKiwgMSwgYm9vbD4gU3VwZXJjbGFzc0RlY2w7CisKICAgICAvLy8gVGhlIHN1cGVyY2xhc3MgdHlwZSBhbmQgYSBiaXQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKICAgICAvLy8gc3VwZXJjbGFzcyB3YXMgY29tcHV0ZWQgeWV0IG9yIG5vdC4KLSAgICBsbHZtOjpQb2ludGVySW50UGFpcjxUeXBlLCAxLCBib29sPiBTdXBlcmNsYXNzOworICAgIGxsdm06OlBvaW50ZXJJbnRQYWlyPFR5cGUsIDEsIGJvb2w+IFN1cGVyY2xhc3NUeXBlOwogICB9IExhenlTZW1hbnRpY0luZm87CiAKKyAgZnJpZW5kIGNsYXNzIFN1cGVyY2xhc3NEZWNsUmVxdWVzdDsKICAgZnJpZW5kIGNsYXNzIFN1cGVyY2xhc3NUeXBlUmVxdWVzdDsKICAgZnJpZW5kIGNsYXNzIFR5cGVDaGVja2VyOwogCkBAIC0zODg4LDYgKzM4OTYsMTggQEAKIGNsYXNzIFByb3RvY29sRGVjbCBmaW5hbCA6IHB1YmxpYyBOb21pbmFsVHlwZURlY2wgewogICBTb3VyY2VMb2MgUHJvdG9jb2xMb2M7CiAKKyAgQXJyYXlSZWY8UHJvdG9jb2xEZWNsICo+IEluaGVyaXRlZFByb3RvY29sczsKKworICBzdHJ1Y3QgeworICAgIC8vLyBUaGUgc3VwZXJjbGFzcyBkZWNsIGFuZCBhIGJpdCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorICAgIC8vLyBzdXBlcmNsYXNzIHdhcyBjb21wdXRlZCB5ZXQgb3Igbm90LgorICAgIGxsdm06OlBvaW50ZXJJbnRQYWlyPENsYXNzRGVjbCAqLCAxLCBib29sPiBTdXBlcmNsYXNzRGVjbDsKKworICAgIC8vLyBUaGUgc3VwZXJjbGFzcyB0eXBlIGFuZCBhIGJpdCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorICAgIC8vLyBzdXBlcmNsYXNzIHdhcyBjb21wdXRlZCB5ZXQgb3Igbm90LgorICAgIGxsdm06OlBvaW50ZXJJbnRQYWlyPFR5cGUsIDEsIGJvb2w+IFN1cGVyY2xhc3NUeXBlOworICB9IExhenlTZW1hbnRpY0luZm87CisKICAgLy8vIFRoZSBnZW5lcmljIHNpZ25hdHVyZSByZXByZXNlbnRpbmcgZXhhY3RseSB0aGUgbmV3IHJlcXVpcmVtZW50cyBpbnRyb2R1Y2VkCiAgIC8vLyBieSB0aGlzIHByb3RvY29sLgogICBjb25zdCBSZXF1aXJlbWVudCAqUmVxdWlyZW1lbnRTaWduYXR1cmUgPSBudWxscHRyOwpAQCAtMzg5OCwxMiArMzkxOCw5IEBACiAKICAgYm9vbCBleGlzdGVudGlhbFR5cGVTdXBwb3J0ZWRTbG93KExhenlSZXNvbHZlciAqcmVzb2x2ZXIpOwogCi0gIHN0cnVjdCB7Ci0gICAgLy8vIFRoZSBzdXBlcmNsYXNzIHR5cGUgYW5kIGEgYml0IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCi0gICAgLy8vIHN1cGVyY2xhc3Mgd2FzIGNvbXB1dGVkIHlldCBvciBub3QuCi0gICAgbGx2bTo6UG9pbnRlckludFBhaXI8VHlwZSwgMSwgYm9vbD4gU3VwZXJjbGFzczsKLSAgfSBMYXp5U2VtYW50aWNJbmZvOworICBBcnJheVJlZjxQcm90b2NvbERlY2wgKj4gZ2V0SW5oZXJpdGVkUHJvdG9jb2xzU2xvdygpOwogCisgIGZyaWVuZCBjbGFzcyBTdXBlcmNsYXNzRGVjbFJlcXVlc3Q7CiAgIGZyaWVuZCBjbGFzcyBTdXBlcmNsYXNzVHlwZVJlcXVlc3Q7CiAgIGZyaWVuZCBjbGFzcyBUeXBlQ2hlY2tlcjsKIApAQCAtMzkxNSw3ICszOTMyLDEyIEBACiAgIHVzaW5nIERlY2w6OmdldEFTVENvbnRleHQ7CiAKICAgLy8vIFJldHJpZXZlIHRoZSBzZXQgb2YgcHJvdG9jb2xzIGluaGVyaXRlZCBmcm9tIHRoaXMgcHJvdG9jb2wuCi0gIGxsdm06OlRpbnlQdHJWZWN0b3I8UHJvdG9jb2xEZWNsICo+IGdldEluaGVyaXRlZFByb3RvY29scygpIGNvbnN0OworICBBcnJheVJlZjxQcm90b2NvbERlY2wgKj4gZ2V0SW5oZXJpdGVkUHJvdG9jb2xzKCkgY29uc3QgeworICAgIGlmIChCaXRzLlByb3RvY29sRGVjbC5Jbmhlcml0ZWRQcm90b2NvbHNWYWxpZCkKKyAgICAgIHJldHVybiBJbmhlcml0ZWRQcm90b2NvbHM7CisKKyAgICByZXR1cm4gY29uc3RfY2FzdDxQcm90b2NvbERlY2wgKj4odGhpcyktPmdldEluaGVyaXRlZFByb3RvY29sc1Nsb3coKTsKKyAgfQogCiAgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHByb3RvY29sIGhhcyBhIHN1cGVyY2xhc3MuCiAgIGJvb2wgaGFzU3VwZXJjbGFzcygpIGNvbnN0IHsgcmV0dXJuIChib29sKWdldFN1cGVyY2xhc3NEZWNsKCk7IH0KQEAgLTU4NzUsNyArNTg5Nyw3IEBACiAvLy8gZW51bS4gRW51bUVsZW1lbnREZWNscyBhcmUgcmVwcmVzZW50ZWQgaW4gdGhlIEFTVCBhcyBtZW1iZXJzIG9mIHRoZWlyCiAvLy8gcGFyZW50IEVudW1EZWNsLCBhbHRob3VnaCBzeW50YWN0aWNhbGx5IHRoZXkgYXJlIHN1Ym9yZGluYXRlIHRvIHRoZQogLy8vIEVudW1DYXNlRGVjbC4KLWNsYXNzIEVudW1FbGVtZW50RGVjbCA6IHB1YmxpYyBWYWx1ZURlY2wgeworY2xhc3MgRW51bUVsZW1lbnREZWNsIDogcHVibGljIERlY2xDb250ZXh0LCBwdWJsaWMgVmFsdWVEZWNsIHsKICAgLy8vIFRoaXMgaXMgdGhlIHR5cGUgc3BlY2lmaWVkIHdpdGggdGhlIGVudW0gZWxlbWVudCwgZm9yCiAgIC8vLyBleGFtcGxlICdJbnQnIGluICdjYXNlIFkoSW50KScuICBUaGlzIGlzIG51bGwgaWYgdGhlcmUgaXMgbm8gdHlwZQogICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCwgYXMgaW4gJ2Nhc2UgWicgb3IgaW4gYWxsIGVsZW1lbnRzIG9mIGVudW0KQEAgLTU4OTUsNyArNTkxNyw4IEBACiAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2MgRXF1YWxzTG9jLAogICAgICAgICAgICAgICAgICAgTGl0ZXJhbEV4cHIgKlJhd1ZhbHVlRXhwciwKICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpEQykKLSAgOiBWYWx1ZURlY2woRGVjbEtpbmQ6OkVudW1FbGVtZW50LCBEQywgTmFtZSwgSWRlbnRpZmllckxvYyksCisgIDogRGVjbENvbnRleHQoRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2wsIERDKSwKKyAgICBWYWx1ZURlY2woRGVjbEtpbmQ6OkVudW1FbGVtZW50LCBEQywgTmFtZSwgSWRlbnRpZmllckxvYyksCiAgICAgUGFyYW1zKFBhcmFtcyksCiAgICAgRXF1YWxzTG9jKEVxdWFsc0xvYyksCiAgICAgUmF3VmFsdWVFeHByKFJhd1ZhbHVlRXhwcikKQEAgLTU5NjMsMTQgKzU5ODYsMjMgQEAKICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyTGlzdCgpICE9IG51bGxwdHI7CiAgIH0KIAotICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsKLSAgICByZXR1cm4gRC0+Z2V0S2luZCgpID09IERlY2xLaW5kOjpFbnVtRWxlbWVudDsKLSAgfQotCiAgIC8vLyBUcnVlIGlmIHRoZSBjYXNlIGlzIG1hcmtlZCAnaW5kaXJlY3QnLgogICBib29sIGlzSW5kaXJlY3QoKSBjb25zdCB7CiAgICAgcmV0dXJuIGdldEF0dHJzKCkuaGFzQXR0cmlidXRlPEluZGlyZWN0QXR0cj4oKTsKICAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeworICAgIHJldHVybiBELT5nZXRLaW5kKCkgPT0gRGVjbEtpbmQ6OkVudW1FbGVtZW50OworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsQ29udGV4dCAqREMpIHsKKyAgICBpZiAoYXV0byBEID0gREMtPmdldEFzRGVjbCgpKQorICAgICAgcmV0dXJuIGNsYXNzb2YoRCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdXNpbmcgRGVjbENvbnRleHQ6Om9wZXJhdG9yIG5ldzsKKyAgdXNpbmcgRGVjbDo6Z2V0QVNUQ29udGV4dDsKIH07CiAgIAogaW5saW5lIFNvdXJjZVJhbmdlIEVudW1DYXNlRGVjbDo6Z2V0U291cmNlUmFuZ2UoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L0FTVC9EZWNsQ29udGV4dC5oIGIvaW5jbHVkZS9zd2lmdC9BU1QvRGVjbENvbnRleHQuaAppbmRleCAxNDQ5N2I5Li5kZGZiYmI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N3aWZ0L0FTVC9EZWNsQ29udGV4dC5oCisrKyBiL2luY2x1ZGUvc3dpZnQvQVNUL0RlY2xDb250ZXh0LmgKQEAgLTc4LDYgKzc4LDcgQEAKICAgSW5pdGlhbGl6ZXIsCiAgIFRvcExldmVsQ29kZURlY2wsCiAgIFN1YnNjcmlwdERlY2wsCisgIEVudW1FbGVtZW50RGVjbCwKICAgQWJzdHJhY3RGdW5jdGlvbkRlY2wsCiAgIFNlcmlhbGl6ZWRMb2NhbCwKICAgTGFzdF9Mb2NhbERlY2xDb250ZXh0S2luZCA9IFNlcmlhbGl6ZWRMb2NhbCwKQEAgLTIzMCw2ICsyMzEsNyBAQAogICAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpUb3BMZXZlbENvZGVEZWNsOgogICAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpBYnN0cmFjdEZ1bmN0aW9uRGVjbDoKICAgICBjYXNlIERlY2xDb250ZXh0S2luZDo6U3Vic2NyaXB0RGVjbDoKKyAgICBjYXNlIERlY2xDb250ZXh0S2luZDo6RW51bUVsZW1lbnREZWNsOgogICAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpHZW5lcmljVHlwZURlY2w6CiAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkV4dGVuc2lvbkRlY2w6CiAgICAgICByZXR1cm4gQVNUSGllcmFyY2h5OjpEZWNsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9BU1QvRGVjbE5vZGVzLmRlZiBiL2luY2x1ZGUvc3dpZnQvQVNUL0RlY2xOb2Rlcy5kZWYKaW5kZXggZWNhMjI1YS4uNWFlZWY5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9BU1QvRGVjbE5vZGVzLmRlZgorKysgYi9pbmNsdWRlL3N3aWZ0L0FTVC9EZWNsTm9kZXMuZGVmCkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICBBQlNUUkFDVF9GVU5DVElPTl9ERUNMKEZ1bmMsIEFic3RyYWN0RnVuY3Rpb25EZWNsKQogICAgICAgQUJTVFJBQ1RfRlVOQ1RJT05fREVDTChBY2Nlc3NvciwgRnVuY0RlY2wpCiAgICAgREVDTF9SQU5HRShBYnN0cmFjdEZ1bmN0aW9uLCBDb25zdHJ1Y3RvciwgQWNjZXNzb3IpCi0gIFZBTFVFX0RFQ0woRW51bUVsZW1lbnQsIFZhbHVlRGVjbCkKKyAgQ09OVEVYVF9WQUxVRV9ERUNMKEVudW1FbGVtZW50LCBWYWx1ZURlY2wpCiAgIERFQ0xfUkFOR0UoVmFsdWUsIEVudW0sIEVudW1FbGVtZW50KQogCiBJVEVSQUJMRV9HRU5FUklDX0RFQ0woRXh0ZW5zaW9uLCBEZWNsKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9BU1QvRGlhZ25vc3RpY3NTZW1hLmRlZiBiL2luY2x1ZGUvc3dpZnQvQVNUL0RpYWdub3N0aWNzU2VtYS5kZWYKaW5kZXggZjljNDMyMS4uOTZmZTQzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9BU1QvRGlhZ25vc3RpY3NTZW1hLmRlZgorKysgYi9pbmNsdWRlL3N3aWZ0L0FTVC9EaWFnbm9zdGljc1NlbWEuZGVmCkBAIC0zMTcyLDYgKzMxNzIsMTIgQEAKIEVSUk9SKGNvbnRpbnVlX25vdF9pbl90aGlzX3N0bXQsbm9uZSwKICAgICAgICInY29udGludWUnIGNhbm5vdCBiZSB1c2VkIHdpdGggJTAgc3RhdGVtZW50cyIsIChTdHJpbmdSZWYpKQogCitFUlJPUih1bnJlc29sdmVkX2xhYmVsLG5vbmUsCisgICAgICAidXNlIG9mIHVucmVzb2x2ZWQgbGFiZWwgJTAiLCAoSWRlbnRpZmllcikpCitFUlJPUih1bnJlc29sdmVkX2xhYmVsX2NvcnJlY3RlZCxub25lLAorICAgICAgInVzZSBvZiB1bnJlc29sdmVkIGxhYmVsICUwOyBkaWQgeW91IG1lYW4gJTE/IiwKKyAgICAgIChJZGVudGlmaWVyLCBJZGVudGlmaWVyKSkKKwogLy8gU3dpdGNoIFN0bXQKIEVSUk9SKG5vX21hdGNoX29wZXJhdG9yLG5vbmUsCiAgICAgICAibm8gYmluYXJ5ICd+PScgb3BlcmF0b3IgYXZhaWxhYmxlIGZvciAnc3dpdGNoJyBzdGF0ZW1lbnQiLCAoKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3dpZnQvQVNUL05hbWVMb29rdXBSZXF1ZXN0cy5oIGIvaW5jbHVkZS9zd2lmdC9BU1QvTmFtZUxvb2t1cFJlcXVlc3RzLmgKaW5kZXggN2Y3MzIzMC4uNWY3MTc3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9BU1QvTmFtZUxvb2t1cFJlcXVlc3RzLmgKKysrIGIvaW5jbHVkZS9zd2lmdC9BU1QvTmFtZUxvb2t1cFJlcXVlc3RzLmgKQEAgLTEzMyw3ICsxMzMsNyBAQAogLy8vIFJlcXVlc3QgdGhlIHN1cGVyY2xhc3MgZGVjbGFyYXRpb24gZm9yIHRoZSBnaXZlbiBjbGFzcy4KIGNsYXNzIFN1cGVyY2xhc3NEZWNsUmVxdWVzdCA6CiAgICAgcHVibGljIFNpbXBsZVJlcXVlc3Q8U3VwZXJjbGFzc0RlY2xSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlS2luZDo6VW5jYWNoZWQsIC8vIEZJWE1FOiBDYWNoZSB0aGVzZQorICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlS2luZDo6U2VwYXJhdGVseUNhY2hlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2wgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICBOb21pbmFsVHlwZURlY2wgKj4gewogcHVibGljOgpAQCAtMTQ5LDYgKzE0OSw4IEBACiBwdWJsaWM6CiAgIC8vIENhY2hpbmcKICAgYm9vbCBpc0NhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgT3B0aW9uYWw8Q2xhc3NEZWNsICo+IGdldENhY2hlZFJlc3VsdCgpIGNvbnN0OworICB2b2lkIGNhY2hlUmVzdWx0KENsYXNzRGVjbCAqdmFsdWUpIGNvbnN0OwogCiAgIC8vIEN5Y2xlIGhhbmRsaW5nCiAgIHZvaWQgZGlhZ25vc2VDeWNsZShEaWFnbm9zdGljRW5naW5lICZkaWFncykgY29uc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L0FTVC9UeXBlcy5oIGIvaW5jbHVkZS9zd2lmdC9BU1QvVHlwZXMuaAppbmRleCAwZTRlNWU2Li5iMDU2NWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N3aWZ0L0FTVC9UeXBlcy5oCisrKyBiL2luY2x1ZGUvc3dpZnQvQVNUL1R5cGVzLmgKQEAgLTMyMDgsNiArMzIwOCw4IEBACiAgICAgcmV0dXJuIGNhc3Q8R2VuZXJpY0Z1bmN0aW9uVHlwZT4oZm5UeXBlLT5nZXRDYW5vbmljYWxUeXBlKCkpOwogICB9CiAKKyAgQ2FuRnVuY3Rpb25UeXBlIHN1YnN0R2VuZXJpY0FyZ3MoU3Vic3RpdHV0aW9uTWFwIHN1YnMpIGNvbnN0OworCiAgIENhbkdlbmVyaWNTaWduYXR1cmUgZ2V0R2VuZXJpY1NpZ25hdHVyZSgpIGNvbnN0IHsKICAgICByZXR1cm4gQ2FuR2VuZXJpY1NpZ25hdHVyZShnZXRQb2ludGVyKCktPmdldEdlbmVyaWNTaWduYXR1cmUoKSk7CiAgIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3dpZnQvRnJvbnRlbmQvRnJvbnRlbmQuaCBiL2luY2x1ZGUvc3dpZnQvRnJvbnRlbmQvRnJvbnRlbmQuaAppbmRleCBjY2FiYzZmLi5kODRmODJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N3aWZ0L0Zyb250ZW5kL0Zyb250ZW5kLmgKKysrIGIvaW5jbHVkZS9zd2lmdC9Gcm9udGVuZC9Gcm9udGVuZC5oCkBAIC02MTQsOCArNjE0LDcgQEAKIAogcHJpdmF0ZToKICAgdm9pZCBjcmVhdGVSRVBMRmlsZShjb25zdCBJbXBsaWNpdEltcG9ydHMgJmltcGxpY2l0SW1wb3J0cyk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxEZWxheWVkUGFyc2luZ0NhbGxiYWNrcz4KLSAgY29tcHV0ZURlbGF5ZWRQYXJzaW5nQ2FsbGJhY2soYm9vbCBpc1ByaW1hcnkpOworICBzdGQ6OnVuaXF1ZV9wdHI8RGVsYXllZFBhcnNpbmdDYWxsYmFja3M+IGNvbXB1dGVEZWxheWVkUGFyc2luZ0NhbGxiYWNrKCk7CiAKICAgdm9pZCBhZGRNYWluRmlsZVRvTW9kdWxlKGNvbnN0IEltcGxpY2l0SW1wb3J0cyAmaW1wbGljaXRJbXBvcnRzKTsKIApAQCAtNjI2LDE1ICs2MjUsMTMgQEAKICAgdm9pZCBwYXJzZUxpYnJhcnlGaWxlKHVuc2lnbmVkIEJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1wbGljaXRJbXBvcnRzICZpbXBsaWNpdEltcG9ydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW50UGFyc2VyU3RhdGUgJlBlcnNpc3RlbnRTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpQcmltYXJ5RGVsYXllZENCLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVsYXllZFBhcnNpbmdDYWxsYmFja3MgKlNlY29uZGFyeURlbGF5ZWRDQik7CisgICAgICAgICAgICAgICAgICAgICAgICBEZWxheWVkUGFyc2luZ0NhbGxiYWNrcyAqRGVsYXllZENCKTsKIAogICAvLy8gUmV0dXJuIHRydWUgaWYgaGFkIGxvYWQgZXJyb3IKICAgYm9vbAogICBwYXJzZVBhcnRpYWxNb2R1bGVzQW5kTGlicmFyeUZpbGVzKGNvbnN0IEltcGxpY2l0SW1wb3J0cyAmaW1wbGljaXRJbXBvcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbnRQYXJzZXJTdGF0ZSAmUGVyc2lzdGVudFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpQcmltYXJ5RGVsYXllZENCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpTZWNvbmRhcnlEZWxheWVkQ0IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpEZWxheWVkQ0IpOwogCiAgIE9wdGlvblNldDxUeXBlQ2hlY2tpbmdGbGFncz4gY29tcHV0ZVR5cGVDaGVja2luZ09wdGlvbnMoKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9EZWxheWVkUGFyc2luZ0NhbGxiYWNrcy5oIGIvaW5jbHVkZS9zd2lmdC9QYXJzZS9EZWxheWVkUGFyc2luZ0NhbGxiYWNrcy5oCmluZGV4IGI4ZGZjMDQuLjczNTlkY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvUGFyc2UvRGVsYXllZFBhcnNpbmdDYWxsYmFja3MuaAorKysgYi9pbmNsdWRlL3N3aWZ0L1BhcnNlL0RlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzLmgKQEAgLTM1LDE1ICszNSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgQm9keVJhbmdlKSA9IDA7CiB9OwogCi1jbGFzcyBBbHdheXNEZWxheWVkQ2FsbGJhY2tzIDogcHVibGljIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzIHsKLSAgYm9vbCBzaG91bGREZWxheUZ1bmN0aW9uQm9keVBhcnNpbmcoUGFyc2VyICZUaGVQYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0RnVuY3Rpb25EZWNsICpBRkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xBdHRyaWJ1dGVzICZBdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgQm9keVJhbmdlKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBjYWxsYmFja3MgdGhhdCBndWlkZSB0aGUgcGFyc2VyIGluIGRlbGF5ZWQKIC8vLyBwYXJzaW5nIGZvciBjb2RlIGNvbXBsZXRpb24uCiBjbGFzcyBDb2RlQ29tcGxldGVEZWxheWVkQ2FsbGJhY2tzIDogcHVibGljIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3dpZnQvUGFyc2UvTGV4ZXIuaCBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvTGV4ZXIuaAppbmRleCA1Y2Y5YjIwLi5jYmU4MmM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N3aWZ0L1BhcnNlL0xleGVyLmgKKysrIGIvaW5jbHVkZS9zd2lmdC9QYXJzZS9MZXhlci5oCkBAIC0yMiw4ICsyMiw3IEBACiAjaW5jbHVkZSAic3dpZnQvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL0xleGVyU3RhdGUuaCIKICNpbmNsdWRlICJzd2lmdC9QYXJzZS9Ub2tlbi5oIgotI2luY2x1ZGUgInN3aWZ0L1N5bnRheC9SZWZlcmVuY2VzLmgiCi0jaW5jbHVkZSAic3dpZnQvU3ludGF4L1RyaXZpYS5oIgorI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1BhcnNlZFRyaXZpYS5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NhdmVBbmRSZXN0b3JlLmgiCiAKQEAgLTExOCwxMyArMTE3LDEzIEBACiAgIC8vLwogICAvLy8gVGhpcyBpcyBvbmx5IHByZXNlcnZlZCBpZiB0aGlzIExleGVyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoCiAgIC8vLyBgVHJpdmlhUmV0ZW50aW9uTW9kZTo6V2l0aFRyaXZpYWAuCi0gIHN5bnRheDo6VHJpdmlhIExlYWRpbmdUcml2aWE7CisgIFBhcnNlZFRyaXZpYSBMZWFkaW5nVHJpdmlhOwogCiAgIC8vLyBUaGUgY3VycmVudCB0cmFpbGluZyB0cml2aWEgZm9yIHRoZSBuZXh0IHRva2VuLgogICAvLy8KICAgLy8vIFRoaXMgaXMgb25seSBwcmVzZXJ2ZWQgaWYgdGhpcyBMZXhlciB3YXMgY29uc3RydWN0ZWQgd2l0aAogICAvLy8gYFRyaXZpYVJldGVudGlvbk1vZGU6OldpdGhUcml2aWFgLgotICBzeW50YXg6OlRyaXZpYSBUcmFpbGluZ1RyaXZpYTsKKyAgUGFyc2VkVHJpdmlhIFRyYWlsaW5nVHJpdmlhOwogICAKICAgTGV4ZXIoY29uc3QgTGV4ZXImKSA9IGRlbGV0ZTsKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTGV4ZXImKSA9IGRlbGV0ZTsKQEAgLTE4NSw4ICsxODQsOCBAQAogCiAgIC8vLyBMZXggYSB0b2tlbi4gSWYgXGMgVHJpdmlhUmV0ZW50aW9uTW9kZSBpcyBcYyBXaXRoVHJpdmlhLCBwYXNzZWQgcG9pbnRlcnMKICAgLy8vIHRvIHRyaXZpYXMgYXJlIHBvcHVsYXRlZC4KLSAgdm9pZCBsZXgoVG9rZW4gJlJlc3VsdCwgc3ludGF4OjpUcml2aWEgJkxlYWRpbmdUcml2aWFSZXN1bHQsCi0gICAgICAgICAgIHN5bnRheDo6VHJpdmlhICZUcmFpbGluZ1RyaXZpYVJlc3VsdCkgeworICB2b2lkIGxleChUb2tlbiAmUmVzdWx0LCBQYXJzZWRUcml2aWEgJkxlYWRpbmdUcml2aWFSZXN1bHQsCisgICAgICAgICAgIFBhcnNlZFRyaXZpYSAmVHJhaWxpbmdUcml2aWFSZXN1bHQpIHsKICAgICBSZXN1bHQgPSBOZXh0VG9rZW47CiAgICAgaWYgKFRyaXZpYVJldGVudGlvbiA9PSBUcml2aWFSZXRlbnRpb25Nb2RlOjpXaXRoVHJpdmlhKSB7CiAgICAgICBMZWFkaW5nVHJpdmlhUmVzdWx0ID0ge0xlYWRpbmdUcml2aWF9OwpAQCAtMTk3LDcgKzE5Niw3IEBACiAgIH0KIAogICB2b2lkIGxleChUb2tlbiAmUmVzdWx0KSB7Ci0gICAgc3ludGF4OjpUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CisgICAgUGFyc2VkVHJpdmlhIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhOwogICAgIGxleChSZXN1bHQsIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhKTsKICAgfQogCkBAIC0yMjksNyArMjI4LDcgQEAKICAgLy8vIEFmdGVyIHJlc3RvcmluZyB0aGUgc3RhdGUsIGxleGVyIHdpbGwgcmV0dXJuIHRoaXMgdG9rZW4gYW5kIGNvbnRpbnVlIGZyb20KICAgLy8vIHRoZXJlLgogICBTdGF0ZSBnZXRTdGF0ZUZvckJlZ2lubmluZ09mVG9rZW4oY29uc3QgVG9rZW4gJlRvaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bnRheDo6VHJpdmlhICZMZWFkaW5nVHJpdmlhID0ge30pIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRyaXZpYSAmTGVhZGluZ1RyaXZpYSA9IHt9KSBjb25zdCB7CiAKICAgICAvLyBJZiB0aGUgdG9rZW4gaGFzIGEgY29tbWVudCBhdHRhY2hlZCB0byBpdCwgcmV3aW5kIHRvIGJlZm9yZSB0aGUgY29tbWVudCwKICAgICAvLyBub3QganVzdCB0aGUgc3RhcnQgb2YgdGhlIHRva2VuLiAgVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbCByZS1sZXggYW5kCkBAIC01MjksNyArNTI4LDcgQEAKICAgdm9pZCBsZXhPcGVyYXRvcklkZW50aWZpZXIoKTsKICAgdm9pZCBsZXhIZXhOdW1iZXIoKTsKICAgdm9pZCBsZXhOdW1iZXIoKTsKLSAgdm9pZCBsZXhUcml2aWEoc3ludGF4OjpUcml2aWEgJlQsIGJvb2wgSXNGb3JUcmFpbGluZ1RyaXZpYSk7CisgIHZvaWQgbGV4VHJpdmlhKFBhcnNlZFRyaXZpYSAmVCwgYm9vbCBJc0ZvclRyYWlsaW5nVHJpdmlhKTsKICAgc3RhdGljIHVuc2lnbmVkIGxleFVuaWNvZGVFc2NhcGUoY29uc3QgY2hhciAqJkN1clB0ciwgTGV4ZXIgKkRpYWdzKTsKIAogICB1bnNpZ25lZCBsZXhDaGFyYWN0ZXIoY29uc3QgY2hhciAqJkN1clB0ciwgY2hhciBTdG9wUXVvdGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1BhcnNlL0xleGVyU3RhdGUuaCBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvTGV4ZXJTdGF0ZS5oCmluZGV4IDVjZTY1ZDMuLmY0MDBjZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvUGFyc2UvTGV4ZXJTdGF0ZS5oCisrKyBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvTGV4ZXJTdGF0ZS5oCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgogI2luY2x1ZGUgInN3aWZ0L0Jhc2ljL1NvdXJjZUxvYy5oIgotI2luY2x1ZGUgInN3aWZ0L1N5bnRheC9Ucml2aWEuaCIKKyNpbmNsdWRlICJzd2lmdC9QYXJzZS9QYXJzZWRUcml2aWEuaCIKIAogbmFtZXNwYWNlIHN3aWZ0IHsKIGNsYXNzIExleGVyOwpAQCAtMzksNyArMzksNyBAQAogcHJpdmF0ZToKICAgZXhwbGljaXQgTGV4ZXJTdGF0ZShTb3VyY2VMb2MgTG9jKSA6IExvYyhMb2MpIHt9CiAgIFNvdXJjZUxvYyBMb2M7Ci0gIGxsdm06Ok9wdGlvbmFsPHN5bnRheDo6VHJpdmlhPiBMZWFkaW5nVHJpdmlhOworICBsbHZtOjpPcHRpb25hbDxQYXJzZWRUcml2aWE+IExlYWRpbmdUcml2aWE7CiAgIGZyaWVuZCBjbGFzcyBMZXhlcjsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3dpZnQvUGFyc2UvUGFyc2VkUmF3U3ludGF4Tm9kZS5oIGIvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRSYXdTeW50YXhOb2RlLmgKaW5kZXggZTQxNTc4OS4uYTQzNjM5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRSYXdTeW50YXhOb2RlLmgKKysrIGIvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRSYXdTeW50YXhOb2RlLmgKQEAgLTE0LDE0ICsxNCwxNSBAQAogI2RlZmluZSBTV0lGVF9QQVJTRV9QQVJTRURSQVdTWU5UQVhOT0RFX0gKIAogI2luY2x1ZGUgInN3aWZ0L0Jhc2ljL1NvdXJjZUxvYy5oIgorI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1BhcnNlZFRyaXZpYS5oIgogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1Rva2VuLmgiCiAjaW5jbHVkZSAic3dpZnQvU3ludGF4L1N5bnRheEtpbmQuaCIKLSNpbmNsdWRlICJzd2lmdC9TeW50YXgvVHJpdmlhLmgiCiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2Ugc3dpZnQgewogCiB0eXBlZGVmIHZvaWQgKk9wYXF1ZVN5bnRheE5vZGU7CitjbGFzcyBTeW50YXhQYXJzaW5nQ29udGV4dDsKIAogLy8vIFJlcHJlc2VudHMgYSByYXcgc3ludGF4IG5vZGUgZm9ybWVkIGJ5IHRoZSBwYXJzZXIuCiAvLy8KQEAgLTUwLDEyICs1MSwxNCBAQAogICAgIENoYXJTb3VyY2VSYW5nZSBSYW5nZTsKICAgfTsKICAgc3RydWN0IERlZmVycmVkTGF5b3V0Tm9kZSB7Ci0gICAgc3RkOjp2ZWN0b3I8UGFyc2VkUmF3U3ludGF4Tm9kZT4gQ2hpbGRyZW47CisgICAgQXJyYXlSZWY8UGFyc2VkUmF3U3ludGF4Tm9kZT4gQ2hpbGRyZW47CiAgIH07CiAgIHN0cnVjdCBEZWZlcnJlZFRva2VuTm9kZSB7Ci0gICAgVG9rZW4gVG9rOwotICAgIHN5bnRheDo6VHJpdmlhIExlYWRpbmdUcml2aWE7Ci0gICAgc3ludGF4OjpUcml2aWEgVHJhaWxpbmdUcml2aWE7CisgICAgY29uc3QgUGFyc2VkVHJpdmlhUGllY2UgKlRyaXZpYVBpZWNlczsKKyAgICBTb3VyY2VMb2MgVG9rTG9jOworICAgIHVuc2lnbmVkIFRva0xlbmd0aDsKKyAgICB1aW50MTZfdCBOdW1MZWFkaW5nVHJpdmlhOworICAgIHVpbnQxNl90IE51bVRyYWlsaW5nVHJpdmlhOwogICB9OwogCiAgIHVuaW9uIHsKQEAgLTc3LDE2ICs4MCwyMiBAQAogICAgIGFzc2VydChnZXRLaW5kKCkgPT0gayAmJiAiU3ludGF4IGtpbmQgd2l0aCB0b28gbGFyZ2UgdmFsdWUhIik7CiAgIH0KIAotICBQYXJzZWRSYXdTeW50YXhOb2RlKFRva2VuIHRvaywKLSAgICAgICAgICAgICAgICAgICAgICBzeW50YXg6OlRyaXZpYSBsZWFkaW5nVHJpdmlhLAotICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDo6VHJpdmlhIHRyYWlsaW5nVHJpdmlhKQotICAgIDogRGVmZXJyZWRUb2tlbntzdGQ6Om1vdmUodG9rKSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGxlYWRpbmdUcml2aWEpLAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodHJhaWxpbmdUcml2aWEpfSwKKyAgUGFyc2VkUmF3U3ludGF4Tm9kZSh0b2sgdG9rS2luZCwgU291cmNlTG9jIHRva0xvYywgdW5zaWduZWQgdG9rTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRyaXZpYVBpZWNlICp0cml2aWFQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtTGVhZGluZ1RyaXZpYSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1UcmFpbGluZ1RyaXZpYSkKKyAgICA6IERlZmVycmVkVG9rZW57dHJpdmlhUGllY2VzLAorICAgICAgICAgICAgICAgICAgICB0b2tMb2MsIHRva0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QobnVtTGVhZGluZ1RyaXZpYSksCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KG51bVRyYWlsaW5nVHJpdmlhKX0sCiAgICAgICBTeW5LaW5kKHVpbnQxNl90KHN5bnRheDo6U3ludGF4S2luZDo6VG9rZW4pKSwKLSAgICAgIFRva0tpbmQodWludDE2X3QodG9rLmdldEtpbmQoKSkpLAorICAgICAgVG9rS2luZCh1aW50MTZfdCh0b2tLaW5kKSksCiAgICAgICBESyhEYXRhS2luZDo6RGVmZXJyZWRUb2tlbikgewotICAgIGFzc2VydChnZXRUb2tlbktpbmQoKSA9PSB0b2suZ2V0S2luZCgpICYmICJUb2tlbiBraW5kIGlzIHRvbyBsYXJnZSB2YWx1ZSEiKTsKKyAgICBhc3NlcnQoZ2V0VG9rZW5LaW5kKCkgPT0gdG9rS2luZCAmJiAiVG9rZW4ga2luZCBpcyB0b28gbGFyZ2UgdmFsdWUhIik7CisgICAgYXNzZXJ0KERlZmVycmVkVG9rZW4uTnVtTGVhZGluZ1RyaXZpYSA9PSBudW1MZWFkaW5nVHJpdmlhICYmCisgICAgICAgICAgICJudW1MZWFkaW5nVHJpdmlhIGlzIHRvbyBsYXJnZSB2YWx1ZSEiKTsKKyAgICBhc3NlcnQoRGVmZXJyZWRUb2tlbi5OdW1UcmFpbGluZ1RyaXZpYSA9PSBudW1UcmFpbGluZ1RyaXZpYSAmJgorICAgICAgICAgICAibnVtTGVhZGluZ1RyaXZpYSBpcyB0b28gbGFyZ2UgdmFsdWUhIik7CiAgIH0KIAogcHVibGljOgpAQCAtMTA2LDYzICsxMTUsNiBAQAogICAgIGFzc2VydChnZXRUb2tlbktpbmQoKSA9PSB0b2tLaW5kICYmICJUb2tlbiBraW5kIHdpdGggdG9vIGxhcmdlIHZhbHVlISIpOwogICB9CiAKLSAgUGFyc2VkUmF3U3ludGF4Tm9kZShjb25zdCBQYXJzZWRSYXdTeW50YXhOb2RlICZvdGhlcikgewotICAgIHN3aXRjaCAob3RoZXIuREspIHsKLSAgICBjYXNlIERhdGFLaW5kOjpOdWxsOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXRhS2luZDo6UmVjb3JkZWQ6Ci0gICAgICBuZXcoJnRoaXMtPlJlY29yZGVkRGF0YSlSZWNvcmRlZFN5bnRheE5vZGUob3RoZXIuUmVjb3JkZWREYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRGF0YUtpbmQ6OkRlZmVycmVkTGF5b3V0OgotICAgICAgbmV3KCZ0aGlzLT5EZWZlcnJlZExheW91dClEZWZlcnJlZExheW91dE5vZGUob3RoZXIuRGVmZXJyZWRMYXlvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXRhS2luZDo6RGVmZXJyZWRUb2tlbjoKLSAgICAgIG5ldygmdGhpcy0+RGVmZXJyZWRUb2tlbilEZWZlcnJlZFRva2VuTm9kZShvdGhlci5EZWZlcnJlZFRva2VuKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICB0aGlzLT5TeW5LaW5kID0gb3RoZXIuU3luS2luZDsKLSAgICB0aGlzLT5Ub2tLaW5kID0gb3RoZXIuVG9rS2luZDsKLSAgICB0aGlzLT5ESyA9IG90aGVyLkRLOwotICB9Ci0KLSAgUGFyc2VkUmF3U3ludGF4Tm9kZShQYXJzZWRSYXdTeW50YXhOb2RlICYmb3RoZXIpIHsKLSAgICBzd2l0Y2ggKG90aGVyLkRLKSB7Ci0gICAgY2FzZSBEYXRhS2luZDo6TnVsbDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRGF0YUtpbmQ6OlJlY29yZGVkOgotICAgICAgbmV3KCZ0aGlzLT5SZWNvcmRlZERhdGEpUmVjb3JkZWRTeW50YXhOb2RlKAotICAgICAgICAgIHN0ZDo6bW92ZShvdGhlci5SZWNvcmRlZERhdGEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRGF0YUtpbmQ6OkRlZmVycmVkTGF5b3V0OgotICAgICAgbmV3KCZ0aGlzLT5EZWZlcnJlZExheW91dClEZWZlcnJlZExheW91dE5vZGUoCi0gICAgICAgICAgc3RkOjptb3ZlKG90aGVyLkRlZmVycmVkTGF5b3V0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERhdGFLaW5kOjpEZWZlcnJlZFRva2VuOgotICAgICAgbmV3KCZ0aGlzLT5EZWZlcnJlZFRva2VuKURlZmVycmVkVG9rZW5Ob2RlKAotICAgICAgICAgIHN0ZDo6bW92ZShvdGhlci5EZWZlcnJlZFRva2VuKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgdGhpcy0+U3luS2luZCA9IG90aGVyLlN5bktpbmQ7Ci0gICAgdGhpcy0+VG9rS2luZCA9IG90aGVyLlRva0tpbmQ7Ci0gICAgdGhpcy0+REsgPSBvdGhlci5ESzsKLSAgfQotCi0gIH5QYXJzZWRSYXdTeW50YXhOb2RlKCkgewotICAgIHJlbGVhc2VNZW1vcnkoKTsKLSAgfQotCi0gIFBhcnNlZFJhd1N5bnRheE5vZGUgJm9wZXJhdG9yPShjb25zdCBQYXJzZWRSYXdTeW50YXhOb2RlICZvdGhlcikgewotICAgIHJlbGVhc2VNZW1vcnkoKTsKLSAgICBuZXcgKHRoaXMpUGFyc2VkUmF3U3ludGF4Tm9kZShvdGhlcik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgUGFyc2VkUmF3U3ludGF4Tm9kZSAmb3BlcmF0b3I9KFBhcnNlZFJhd1N5bnRheE5vZGUgJiZvdGhlcikgewotICAgIHJlbGVhc2VNZW1vcnkoKTsKLSAgICBuZXcgKHRoaXMpUGFyc2VkUmF3U3ludGF4Tm9kZShzdGQ6Om1vdmUob3RoZXIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQogICBzeW50YXg6OlN5bnRheEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIHN5bnRheDo6U3ludGF4S2luZChTeW5LaW5kKTsgfQogICB0b2sgZ2V0VG9rZW5LaW5kKCkgY29uc3QgeyByZXR1cm4gdG9rKFRva0tpbmQpOyB9CiAKQEAgLTIwMSw0NCArMTUzLDQ0IEBACiAgICAgYXNzZXJ0KERLID09IERhdGFLaW5kOjpEZWZlcnJlZExheW91dCk7CiAgICAgcmV0dXJuIERlZmVycmVkTGF5b3V0LkNoaWxkcmVuOwogICB9Ci0gIHZvaWQgYWRkRGVmZXJyZWRDaGlsZChQYXJzZWRSYXdTeW50YXhOb2RlIHN1Ym5vZGUpIHsKLSAgICBhc3NlcnQoREsgPT0gRGF0YUtpbmQ6OkRlZmVycmVkTGF5b3V0KTsKLSAgICBEZWZlcnJlZExheW91dC5DaGlsZHJlbi5wdXNoX2JhY2soc3RkOjptb3ZlKHN1Ym5vZGUpKTsKLSAgfQogCiAgIC8vIERlZmVycmVkIFRva2VuIERhdGEgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwogCi0gIGNvbnN0IFRva2VuICZnZXRUb2tlbigpIGNvbnN0IHsKKyAgQ2hhclNvdXJjZVJhbmdlIGdldERlZmVycmVkVG9rZW5SYW5nZVdpdGhvdXRCYWNrdGlja3MoKSBjb25zdCB7CiAgICAgYXNzZXJ0KERLID09IERhdGFLaW5kOjpEZWZlcnJlZFRva2VuKTsKLSAgICByZXR1cm4gRGVmZXJyZWRUb2tlbi5Ub2s7CisgICAgcmV0dXJuIENoYXJTb3VyY2VSYW5nZXtEZWZlcnJlZFRva2VuLlRva0xvYywgRGVmZXJyZWRUb2tlbi5Ub2tMZW5ndGh9OwogICB9Ci0gIGNvbnN0IHN5bnRheDo6VHJpdmlhICZnZXRMZWFkaW5nVHJpdmlhKCkgY29uc3QgeworICBBcnJheVJlZjxQYXJzZWRUcml2aWFQaWVjZT4gZ2V0RGVmZXJyZWRMZWFkaW5nVHJpdmlhUGllY2VzKCkgY29uc3QgewogICAgIGFzc2VydChESyA9PSBEYXRhS2luZDo6RGVmZXJyZWRUb2tlbik7Ci0gICAgcmV0dXJuIERlZmVycmVkVG9rZW4uTGVhZGluZ1RyaXZpYTsKKyAgICByZXR1cm4gQXJyYXlSZWY8UGFyc2VkVHJpdmlhUGllY2U+KERlZmVycmVkVG9rZW4uVHJpdmlhUGllY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWRUb2tlbi5OdW1MZWFkaW5nVHJpdmlhKTsKICAgfQotICBjb25zdCBzeW50YXg6OlRyaXZpYSAmZ2V0VHJhaWxpbmdUcml2aWEoKSBjb25zdCB7CisgIEFycmF5UmVmPFBhcnNlZFRyaXZpYVBpZWNlPiBnZXREZWZlcnJlZFRyYWlsaW5nVHJpdmlhUGllY2VzKCkgY29uc3QgewogICAgIGFzc2VydChESyA9PSBEYXRhS2luZDo6RGVmZXJyZWRUb2tlbik7Ci0gICAgcmV0dXJuIERlZmVycmVkVG9rZW4uVHJhaWxpbmdUcml2aWE7CisgICAgcmV0dXJuIEFycmF5UmVmPFBhcnNlZFRyaXZpYVBpZWNlPigKKyAgICAgIERlZmVycmVkVG9rZW4uVHJpdmlhUGllY2VzICsgRGVmZXJyZWRUb2tlbi5OdW1MZWFkaW5nVHJpdmlhLAorICAgICAgRGVmZXJyZWRUb2tlbi5OdW1UcmFpbGluZ1RyaXZpYSk7CiAgIH0KIAogICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KIAogICAvLy8gRm9ybSBhIGRlZmVycmVkIHN5bnRheCBsYXlvdXQgbm9kZS4KICAgc3RhdGljIFBhcnNlZFJhd1N5bnRheE5vZGUgbWFrZURlZmVycmVkKHN5bnRheDo6U3ludGF4S2luZCBrLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkUmF3U3ludGF4Tm9kZT4gZGVmZXJyZWROb2RlcykgewotICAgIHJldHVybiBQYXJzZWRSYXdTeW50YXhOb2Rle2ssIGRlZmVycmVkTm9kZXN9OwotICB9CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZWRSYXdTeW50YXhOb2RlPiBkZWZlcnJlZE5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4UGFyc2luZ0NvbnRleHQgJmN0eCk7CiAKICAgLy8vIEZvcm0gYSBkZWZlcnJlZCB0b2tlbiBub2RlLgogICBzdGF0aWMgUGFyc2VkUmF3U3ludGF4Tm9kZSBtYWtlRGVmZXJyZWQoVG9rZW4gdG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4OjpUcml2aWEgbGVhZGluZ1RyaXZpYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDo6VHJpdmlhIHRyYWlsaW5nVHJpdmlhKSB7Ci0gICAgcmV0dXJuIFBhcnNlZFJhd1N5bnRheE5vZGV7c3RkOjptb3ZlKHRvayksIHN0ZDo6bW92ZShsZWFkaW5nVHJpdmlhKSwKLSAgICAgICAgc3RkOjptb3ZlKHRyYWlsaW5nVHJpdmlhKX07Ci0gIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRyaXZpYSAmbGVhZGluZ1RyaXZpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRyaXZpYSAmdHJhaWxpbmdUcml2aWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhQYXJzaW5nQ29udGV4dCAmY3R4KTsKIAogICAvLy8gRm9ybSBhIGRlZmVycmVkIG1pc3NpbmcgdG9rZW4gbm9kZS4KLSAgc3RhdGljIFBhcnNlZFJhd1N5bnRheE5vZGUgbWFrZURlZmVycmVkTWlzc2luZyh0b2sgdG9rS2luZCwgU291cmNlTG9jIGxvYyk7CisgIHN0YXRpYyBQYXJzZWRSYXdTeW50YXhOb2RlIG1ha2VEZWZlcnJlZE1pc3NpbmcodG9rIHRva0tpbmQsIFNvdXJjZUxvYyBsb2MpIHsKKyAgICBhdXRvIHJhdyA9IFBhcnNlZFJhd1N5bnRheE5vZGUodG9rS2luZCwgbG9jLCAwLCBudWxscHRyLCAwLCAwKTsKKyAgICByYXcuSXNNaXNzaW5nID0gdHJ1ZTsKKyAgICByZXR1cm4gcmF3OworICB9CiAKICAgLy8vIER1bXAgdGhpcyBwaWVjZSBvZiBzeW50YXggcmVjdXJzaXZlbHkgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLgogICBMTFZNX0FUVFJJQlVURV9ERVBSRUNBVEVEKApAQCAtMjUxLDIwICsyMDMsNiBAQAogICBzdGF0aWMgUGFyc2VkUmF3U3ludGF4Tm9kZSBudWxsKCkgewogICAgIHJldHVybiBQYXJzZWRSYXdTeW50YXhOb2Rle307CiAgIH0KLQotcHJpdmF0ZToKLSAgdm9pZCByZWxlYXNlTWVtb3J5KCkgewotICAgIHN3aXRjaCAoREspIHsKLSAgICBjYXNlIERhdGFLaW5kOjpOdWxsOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXRhS2luZDo6UmVjb3JkZWQ6Ci0gICAgICBSZWNvcmRlZERhdGEuflJlY29yZGVkU3ludGF4Tm9kZSgpOyBicmVhazsKLSAgICBjYXNlIERhdGFLaW5kOjpEZWZlcnJlZExheW91dDoKLSAgICAgIERlZmVycmVkTGF5b3V0Ln5EZWZlcnJlZExheW91dE5vZGUoKTsgYnJlYWs7Ci0gICAgY2FzZSBEYXRhS2luZDo6RGVmZXJyZWRUb2tlbjoKLSAgICAgIERlZmVycmVkVG9rZW4ufkRlZmVycmVkVG9rZW5Ob2RlKCk7IGJyZWFrOwotICAgIH0KLSAgfQogfTsKIAogfSAvLyBlbmQgbmFtZXNwYWNlIHN3aWZ0CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1BhcnNlL1BhcnNlZFJhd1N5bnRheFJlY29yZGVyLmggYi9pbmNsdWRlL3N3aWZ0L1BhcnNlL1BhcnNlZFJhd1N5bnRheFJlY29yZGVyLmgKaW5kZXggZjQzMzc1ZS4uOWFiODk3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRSYXdTeW50YXhSZWNvcmRlci5oCisrKyBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvUGFyc2VkUmF3U3ludGF4UmVjb3JkZXIuaApAQCAtMjQsNyArMjQsMTAgQEAKIAogbmFtZXNwYWNlIHN3aWZ0IHsKIAorY2xhc3MgQ2hhclNvdXJjZVJhbmdlOwogY2xhc3MgUGFyc2VkUmF3U3ludGF4Tm9kZTsKK3N0cnVjdCBQYXJzZWRUcml2aWE7CitjbGFzcyBQYXJzZWRUcml2aWFQaWVjZTsKIGNsYXNzIFN5bnRheFBhcnNlQWN0aW9uczsKIGNsYXNzIFNvdXJjZUxvYzsKIGNsYXNzIFRva2VuOwpAQCAtMzIsNyArMzUsNiBAQAogCiBuYW1lc3BhY2Ugc3ludGF4IHsKICAgZW51bSBjbGFzcyBTeW50YXhLaW5kOwotICBzdHJ1Y3QgVHJpdmlhOwogfQogCiBjbGFzcyBQYXJzZWRSYXdTeW50YXhSZWNvcmRlciB7CkBAIC00Myw4ICs0NSwxMiBAQAogICAgIDogU1BBY3Rpb25zKHN0ZDo6bW92ZShzcEFjdGlvbnMpKSB7fQogCiAgIFBhcnNlZFJhd1N5bnRheE5vZGUgcmVjb3JkVG9rZW4oY29uc3QgVG9rZW4gJnRvaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzeW50YXg6OlRyaXZpYSAmbGVhZGluZ1RyaXZpYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzeW50YXg6OlRyaXZpYSAmdHJhaWxpbmdUcml2aWEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRyaXZpYSAmbGVhZGluZ1RyaXZpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJzZWRUcml2aWEgJnRyYWlsaW5nVHJpdmlhKTsKKworICBQYXJzZWRSYXdTeW50YXhOb2RlIHJlY29yZFRva2VuKHRvayB0b2tlbktpbmQsIENoYXJTb3VyY2VSYW5nZSB0b2tlblJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFRyaXZpYVBpZWNlPiBsZWFkaW5nVHJpdmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFRyaXZpYVBpZWNlPiB0cmFpbGluZ1RyaXZpYSk7CiAKICAgLy8vIFJlY29yZCBhIG1pc3NpbmcgdG9rZW4uIFxwIGxvYyBjYW4gYmUgaW52YWxpZCBvciBhbiBhcHByb3hpbWF0ZSBsb2NhdGlvbgogICAvLy8gb2Ygd2hlcmUgdGhlIHRva2VuIHdvdWxkIGJlIGlmIG5vdCBtaXNzaW5nLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRTeW50YXhCdWlsZGVycy5oLmd5YiBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvUGFyc2VkU3ludGF4QnVpbGRlcnMuaC5neWIKaW5kZXggN2E2NGM3My4uOTVkMWY0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRTeW50YXhCdWlsZGVycy5oLmd5YgorKysgYi9pbmNsdWRlL3N3aWZ0L1BhcnNlL1BhcnNlZFN5bnRheEJ1aWxkZXJzLmguZ3liCkBAIC0zNCwxNyArMzQsMjAgQEAKICUgICBpZiBub2RlLmlzX2J1aWxkYWJsZSgpOgogJSAgICAgY2hpbGRfY291bnQgPSBsZW4obm9kZS5jaGlsZHJlbikKIGNsYXNzIFBhcnNlZCR7bm9kZS5uYW1lfUJ1aWxkZXIgewotICBQYXJzZWRSYXdTeW50YXhSZWNvcmRlciAmUmVjOwotICBib29sIElzQmFja3RyYWNraW5nOwotICBQYXJzZWRSYXdTeW50YXhOb2RlIExheW91dFske2NoaWxkX2NvdW50fV0gPSB7CisgIFN5bnRheFBhcnNpbmdDb250ZXh0ICZTUEN0eDsKKyAgUGFyc2VkUmF3U3ludGF4Tm9kZSBMYXlvdXRbJHtjaGlsZF9jb3VudH1dOwogJSAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGRyZW46Ci0gICAgUGFyc2VkUmF3U3ludGF4Tm9kZTo6bnVsbCgpLAorJSAgICAgICBjaGlsZF9ub2RlID0gTk9ERV9NQVAuZ2V0KGNoaWxkLnN5bnRheF9raW5kKQorJSAgICAgICBpZiBjaGlsZF9ub2RlIGFuZCBjaGlsZF9ub2RlLmlzX3N5bnRheF9jb2xsZWN0aW9uKCk6CislICAgICAgICAgY2hpbGRfZWx0ID0gY2hpbGRfbm9kZS5jb2xsZWN0aW9uX2VsZW1lbnRfbmFtZQorJSAgICAgICAgIGNoaWxkX2VsdF90eXBlID0gY2hpbGRfbm9kZS5jb2xsZWN0aW9uX2VsZW1lbnRfdHlwZQorICBTbWFsbFZlY3RvcjxQYXJzZWRSYXdTeW50YXhOb2RlLCA4PiAke2NoaWxkX2VsdH1Ob2RlczsKKyUgICAgICAgZW5kCiAlICAgICBlbmQKLSAgfTsKIAogcHVibGljOgogICBleHBsaWNpdCBQYXJzZWQke25vZGUubmFtZX1CdWlsZGVyKFN5bnRheFBhcnNpbmdDb250ZXh0ICZTUEN0eCkKLSAgICA6IFJlYyhTUEN0eC5nZXRSZWNvcmRlcigpKSwgSXNCYWNrdHJhY2tpbmcoU1BDdHguaXNCYWNrdHJhY2tpbmcoKSkge30KKyAgICA6IFNQQ3R4KFNQQ3R4KSB7fQogCiAlICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZHJlbjoKICAgUGFyc2VkJHtub2RlLm5hbWV9QnVpbGRlciAmdXNlJHtjaGlsZC5uYW1lfShQYXJzZWQke2NoaWxkLnR5cGVfbmFtZX0gJHtjaGlsZC5uYW1lfSk7CkBAIC02MSw3ICs2NCw3IEBACiAKIHByaXZhdGU6CiAgIFBhcnNlZCR7bm9kZS5uYW1lfSByZWNvcmQoKTsKLSAgdm9pZCBmaW5pc2hMYXlvdXQoKTsKKyAgdm9pZCBmaW5pc2hMYXlvdXQoYm9vbCBkZWZlcnJlZCk7CiB9OwogCiAlICAgZW5kCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1BhcnNlL1BhcnNlZFN5bnRheFJlY29yZGVyLmguZ3liIGIvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRTeW50YXhSZWNvcmRlci5oLmd5YgppbmRleCBkYTA3MzRhLi42MzFiY2U2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N3aWZ0L1BhcnNlL1BhcnNlZFN5bnRheFJlY29yZGVyLmguZ3liCisrKyBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvUGFyc2VkU3ludGF4UmVjb3JkZXIuaC5neWIKQEAgLTQ2LDcgKzQ2LDggQEAKICAgc3RhdGljIFBhcnNlZCR7bm9kZS5uYW1lfSByZWNvcmQke25vZGUuc3ludGF4X2tpbmR9KCR7Y2hpbGRfcGFyYW1zfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRSYXdTeW50YXhSZWNvcmRlciAmcmVjKTsKIHB1YmxpYzoKLSAgc3RhdGljIFBhcnNlZCR7bm9kZS5uYW1lfSBkZWZlciR7bm9kZS5zeW50YXhfa2luZH0oJHtjaGlsZF9wYXJhbXN9KTsKKyAgc3RhdGljIFBhcnNlZCR7bm9kZS5uYW1lfSBkZWZlciR7bm9kZS5zeW50YXhfa2luZH0oJHtjaGlsZF9wYXJhbXN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFBhcnNpbmdDb250ZXh0ICZTUEN0eCk7CiAgIHN0YXRpYyBQYXJzZWQke25vZGUubmFtZX0gbWFrZSR7bm9kZS5zeW50YXhfa2luZH0oJHtjaGlsZF9wYXJhbXN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFBhcnNpbmdDb250ZXh0ICZTUEN0eCk7CiAlICAgZWxpZiBub2RlLmlzX3N5bnRheF9jb2xsZWN0aW9uKCk6CkBAIC01Nyw3ICs1OCw4IEBACiAKIHB1YmxpYzoKICAgc3RhdGljIFBhcnNlZCR7bm9kZS5uYW1lfSBkZWZlciR7bm9kZS5zeW50YXhfa2luZH0oCi0gICAgICBBcnJheVJlZjxQYXJzZWQke25vZGUuY29sbGVjdGlvbl9lbGVtZW50X3R5cGV9PiBlbHRzKTsKKyAgICAgIEFycmF5UmVmPFBhcnNlZCR7bm9kZS5jb2xsZWN0aW9uX2VsZW1lbnRfdHlwZX0+IGVsdHMsCisgICAgICBTeW50YXhQYXJzaW5nQ29udGV4dCAmU1BDdHgpOwogICBzdGF0aWMgUGFyc2VkJHtub2RlLm5hbWV9IG1ha2Uke25vZGUuc3ludGF4X2tpbmR9KAogICAgICAgQXJyYXlSZWY8UGFyc2VkJHtub2RlLmNvbGxlY3Rpb25fZWxlbWVudF90eXBlfT4gZWx0cywKICAgICAgIFN5bnRheFBhcnNpbmdDb250ZXh0ICZTUEN0eCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1BhcnNlL1BhcnNlZFRyaXZpYS5oIGIvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRUcml2aWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY5ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZWRUcml2aWEuaApAQCAtMCwwICsxLDEzNiBAQAorLy89PT0tLS0gUGFyc2VkVHJpdmlhLmggLSBQYXJzZWRUcml2aWEgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIHBhcnQgb2YgdGhlIFN3aWZ0Lm9yZyBvcGVuIHNvdXJjZSBwcm9qZWN0CisvLworLy8gQ29weXJpZ2h0IChjKSAyMDE0IC0gMjAxOSBBcHBsZSBJbmMuIGFuZCB0aGUgU3dpZnQgcHJvamVjdCBhdXRob3JzCisvLyBMaWNlbnNlZCB1bmRlciBBcGFjaGUgTGljZW5zZSB2Mi4wIHdpdGggUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbgorLy8KKy8vIFNlZSBodHRwczovL3N3aWZ0Lm9yZy9MSUNFTlNFLnR4dCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbgorLy8gU2VlIGh0dHBzOi8vc3dpZnQub3JnL0NPTlRSSUJVVE9SUy50eHQgZm9yIHRoZSBsaXN0IG9mIFN3aWZ0IHByb2plY3QgYXV0aG9ycworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgU1dJRlRfUEFSU0VfUEFSU0VEVFJJVklBX0gKKyNkZWZpbmUgU1dJRlRfUEFSU0VfUEFSU0VEVFJJVklBX0gKKworI2luY2x1ZGUgInN3aWZ0L0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBzd2lmdCB7CisgIGNsYXNzIFNvdXJjZUxvYzsKKyAgY2xhc3MgU291cmNlTWFuYWdlcjsKKworbmFtZXNwYWNlIHN5bnRheCB7CisgIGVudW0gY2xhc3MgVHJpdmlhS2luZDsKKyAgc3RydWN0IFRyaXZpYTsKK30KKworY2xhc3MgUGFyc2VkVHJpdmlhUGllY2UgeworICBzeW50YXg6OlRyaXZpYUtpbmQgS2luZDsKKyAgdW5zaWduZWQgTGVuZ3RoOworCitwdWJsaWM6CisgIFBhcnNlZFRyaXZpYVBpZWNlKHN5bnRheDo6VHJpdmlhS2luZCBraW5kLCB1bnNpZ25lZCBsZW5ndGgpCisgICAgICA6IEtpbmQoa2luZCksIExlbmd0aChsZW5ndGgpIHt9CisKKyAgc3ludGF4OjpUcml2aWFLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgLy8vIFJldHVybiB0aGUgdGV4dCBvZiB0aGUgdHJpdmlhLgorICB1bnNpZ25lZCBnZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBMZW5ndGg7IH0KKworICB2b2lkIGV4dGVuZExlbmd0aCh1bnNpZ25lZCBsZW4pIHsKKyAgICBMZW5ndGggKz0gbGVuOworICB9CisKKyAgc3RhdGljIHNpemVfdCBnZXRUb3RhbExlbmd0aChBcnJheVJlZjxQYXJzZWRUcml2aWFQaWVjZT4gcGllY2VzKSB7CisgICAgc2l6ZV90IExlbiA9IDA7CisgICAgZm9yIChhdXRvICZwIDogcGllY2VzKQorICAgICAgTGVuICs9IHAuZ2V0TGVuZ3RoKCk7CisgICAgcmV0dXJuIExlbjsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQYXJzZWRUcml2aWFQaWVjZSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gS2luZCA9PSBPdGhlci5LaW5kICYmIExlbmd0aCA9PSBPdGhlci5MZW5ndGg7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyc2VkVHJpdmlhUGllY2UgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOworICB9CisKKyAgc3RhdGljIHN5bnRheDo6VHJpdmlhCisgIGNvbnZlcnRUb1N5bnRheFRyaXZpYShBcnJheVJlZjxQYXJzZWRUcml2aWFQaWVjZT4gcGllY2VzLCBTb3VyY2VMb2MgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00sIHVuc2lnbmVkIGJ1ZmZlcklEKTsKK307CisKK3VzaW5nIFBhcnNlZFRyaXZpYUxpc3QgPSBTbWFsbFZlY3RvcjxQYXJzZWRUcml2aWFQaWVjZSwgMz47CisKK3N0cnVjdCBQYXJzZWRUcml2aWEgeworICBQYXJzZWRUcml2aWFMaXN0IFBpZWNlczsKKworICAvLy8gR2V0IHRoZSBiZWdpbiBpdGVyYXRvciBvZiB0aGUgcGllY2VzLgorICBQYXJzZWRUcml2aWFMaXN0Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGllY2VzLmJlZ2luKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBlbmQgaXRlcmF0b3Igb2YgdGhlIHBpZWNlcy4KKyAgUGFyc2VkVHJpdmlhTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiBQaWVjZXMuZW5kKCk7CisgIH0KKworICAvLy8gQ2xlYXIgcGllY2VzLgorICB2b2lkIGNsZWFyKCkgeworICAgIFBpZWNlcy5jbGVhcigpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gcGllY2VzIGluIHRoaXMgVHJpdmlhIGNvbGxlY3Rpb24uCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIFBpZWNlcy5lbXB0eSgpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHBpZWNlcyBpbiB0aGlzIFRyaXZpYSBjb2xsZWN0aW9uLgorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUGllY2VzLnNpemUoKTsKKyAgfQorCisgIHNpemVfdCBnZXRMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcnNlZFRyaXZpYVBpZWNlOjpnZXRUb3RhbExlbmd0aChQaWVjZXMpOworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soc3ludGF4OjpUcml2aWFLaW5kIGtpbmQsIHVuc2lnbmVkIGxlbmd0aCkgeworICAgIFBpZWNlcy5lbXBsYWNlX2JhY2soa2luZCwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgYXBwZW5kT3JTcXVhc2goc3ludGF4OjpUcml2aWFLaW5kIGtpbmQsIHVuc2lnbmVkIGxlbmd0aCkgeworICAgIGlmIChlbXB0eSgpIHx8IFBpZWNlcy5iYWNrKCkuZ2V0S2luZCgpICE9IGtpbmQpIHsKKyAgICAgIHB1c2hfYmFjayhraW5kLCBsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBQaWVjZXMuYmFjaygpLmV4dGVuZExlbmd0aChsZW5ndGgpOworICAgIH0KKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQYXJzZWRUcml2aWEgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKFBpZWNlcy5zaXplKCkgIT0gT3RoZXIuc2l6ZSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBQaWVjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChQaWVjZXNbaV0gIT0gT3RoZXIuUGllY2VzW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQYXJzZWRUcml2aWEgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOworICB9CisKKyAgc3ludGF4OjpUcml2aWEgY29udmVydFRvU3ludGF4VHJpdmlhKFNvdXJjZUxvYyBsb2MsIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYnVmZmVySUQpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHN3aWZ0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZXIuaCBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvUGFyc2VyLmgKaW5kZXggNGJkNjFmMy4uYmZmNGJjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9QYXJzZXIuaAorKysgYi9pbmNsdWRlL3N3aWZ0L1BhcnNlL1BhcnNlci5oCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAic3dpZnQvUGFyc2UvUGFyc2VyUmVzdWx0LmgiCiAjaW5jbHVkZSAic3dpZnQvUGFyc2UvU3ludGF4UGFyc2VyUmVzdWx0LmgiCiAjaW5jbHVkZSAic3dpZnQvUGFyc2UvU3ludGF4UGFyc2luZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJzd2lmdC9TeW50YXgvUmVmZXJlbmNlcy5oIgogI2luY2x1ZGUgInN3aWZ0L0NvbmZpZy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgogCkBAIC0xNjQsNyArMTY1LDkgQEAKIAogICBEZWxheWVkUGFyc2luZ0NhbGxiYWNrcyAqRGVsYXllZFBhcnNlQ0IgPSBudWxscHRyOwogCi0gIGJvb2wgaXNEZWxheWVkUGFyc2luZ0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBEZWxheWVkUGFyc2VDQiAhPSBudWxscHRyOyB9CisgIGJvb2wgaXNEZWxheWVkUGFyc2luZ0VuYWJsZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIERlbGF5Qm9keVBhcnNpbmcgfHwgRGVsYXllZFBhcnNlQ0IgIT0gbnVsbHB0cjsKKyAgfQogCiAgIHZvaWQgc2V0RGVsYXllZFBhcnNpbmdDYWxsYmFja3MoRGVsYXllZFBhcnNpbmdDYWxsYmFja3MgKkRlbGF5ZWRQYXJzZUNCKSB7CiAgICAgdGhpcy0+RGVsYXllZFBhcnNlQ0IgPSBEZWxheWVkUGFyc2VDQjsKQEAgLTIwMCwxNCArMjAzLDIxIEBACiAKICAgLy8vIGxlYWRpbmcgdHJpdmlhcyBmb3IgXGMgVG9rLgogICAvLy8gQWx3YXlzIGVtcHR5IGlmICFTRi5zaG91bGRCdWlsZFN5bnRheFRyZWUoKS4KLSAgc3ludGF4OjpUcml2aWEgTGVhZGluZ1RyaXZpYTsKKyAgUGFyc2VkVHJpdmlhIExlYWRpbmdUcml2aWE7CiAKICAgLy8vIHRyYWlsaW5nIHRyaXZpYXMgZm9yIFxjIFRvay4KICAgLy8vIEFsd2F5cyBlbXB0eSBpZiAhU0Yuc2hvdWxkQnVpbGRTeW50YXhUcmVlKCkuCi0gIHN5bnRheDo6VHJpdmlhIFRyYWlsaW5nVHJpdmlhOworICBQYXJzZWRUcml2aWEgVHJhaWxpbmdUcml2aWE7CiAKLSAgLy8vIFdoZXRoZXIgd2Ugc2hvdWxkIGRpc2FibGUgZGVsYXllZCBwYXJzaW5nLgotICBib29sIERpc2FibGVEZWxheWVkUGFyc2luZzsKKyAgLy8vIFdoZXRoZXIgd2Ugc2hvdWxkIGRlbGF5IHBhcnNpbmcgbm9taW5hbCB0eXBlIGFuZCBleHRlbnNpb24gYm9kaWVzLAorICAvLy8gYW5kIHNraXAgZnVuY3Rpb24gYm9kaWVzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgZmFsc2UgaW4gcHJpbWFyeSBmaWxlcywgc2luY2Ugd2Ugd2FudCB0byB0eXBlIGNoZWNrIGFsbAorICAvLy8gZGVjbGFyYXRpb25zIGFuZCBmdW5jdGlvbiBib2RpZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyB0cnVlIGZvciBub24tcHJpbWFyeSBmaWxlcywgd2hlcmUgZGVjbGFyYXRpb25zIG9ubHkgbmVlZCB0byBiZQorICAvLy8gbGF6aWx5IHBhcnNlZCBhbmQgdHlwZSBjaGVja2VkLgorICBib29sIERlbGF5Qm9keVBhcnNpbmc7CiAKICAgLy8vIFRoZSByZWNlaXZlciB0byBjb2xsZWN0IGFsbCBjb25zdW1lZCB0b2tlbnMuCiAgIENvbnN1bWVUb2tlblJlY2VpdmVyICpUb2tSZWNlaXZlcjsKQEAgLTM1NiwxNiArMzY2LDE2IEBACiAgICAgICAgICBTSUxQYXJzZXJUVVN0YXRlQmFzZSAqU0lMLAogICAgICAgICAgUGVyc2lzdGVudFBhcnNlclN0YXRlICpQZXJzaXN0ZW50U3RhdGUsCiAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3ludGF4UGFyc2VBY3Rpb25zPiBTUEFjdGlvbnMgPSBudWxscHRyLAotICAgICAgICAgYm9vbCBEaXNhYmxlRGVsYXllZFBhcnNpbmcgPSBmYWxzZSk7CisgICAgICAgICBib29sIERlbGF5Qm9keVBhcnNpbmcgPSB0cnVlKTsKICAgUGFyc2VyKHVuc2lnbmVkIEJ1ZmZlcklELCBTb3VyY2VGaWxlICZTRiwgU0lMUGFyc2VyVFVTdGF0ZUJhc2UgKlNJTCwKICAgICAgICAgIFBlcnNpc3RlbnRQYXJzZXJTdGF0ZSAqUGVyc2lzdGVudFN0YXRlID0gbnVsbHB0ciwKICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTeW50YXhQYXJzZUFjdGlvbnM+IFNQQWN0aW9ucyA9IG51bGxwdHIsCi0gICAgICAgICBib29sIERpc2FibGVEZWxheWVkUGFyc2luZyA9IGZhbHNlKTsKKyAgICAgICAgIGJvb2wgRGVsYXlCb2R5UGFyc2luZyA9IHRydWUpOwogICBQYXJzZXIoc3RkOjp1bmlxdWVfcHRyPExleGVyPiBMZXgsIFNvdXJjZUZpbGUgJlNGLAogICAgICAgICAgU0lMUGFyc2VyVFVTdGF0ZUJhc2UgKlNJTCA9IG51bGxwdHIsCiAgICAgICAgICBQZXJzaXN0ZW50UGFyc2VyU3RhdGUgKlBlcnNpc3RlbnRTdGF0ZSA9IG51bGxwdHIsCiAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3ludGF4UGFyc2VBY3Rpb25zPiBTUEFjdGlvbnMgPSBudWxscHRyLAotICAgICAgICAgYm9vbCBEaXNhYmxlRGVsYXllZFBhcnNpbmcgPSBmYWxzZSk7CisgICAgICAgICBib29sIERlbGF5Qm9keVBhcnNpbmcgPSB0cnVlKTsKICAgflBhcnNlcigpOwogCiAgIGJvb2wgaXNJblNJTE1vZGUoKSBjb25zdCB7IHJldHVybiBTSUwgIT0gbnVsbHB0cjsgfQpAQCAtNjM2LDYgKzY0Niw5IEBACiAKICAgLy8vIEFkZCB0aGUgZ2l2ZW4gRGVjbCB0byB0aGUgY3VycmVudCBzY29wZS4KICAgdm9pZCBhZGRUb1Njb3BlKFZhbHVlRGVjbCAqRCkgeworICAgIGlmIChDb250ZXh0LkxhbmdPcHRzLkVuYWJsZUFTVFNjb3BlTG9va3VwKQorICAgICAgcmV0dXJuOworCiAgICAgZ2V0U2NvcGVJbmZvKCkuYWRkVG9TY29wZShELCAqdGhpcyk7CiAgIH0KIApAQCAtNzk0LDYgKzgwNywxMyBAQAogCiAgIHZvaWQgcGFyc2VEZWNsTGlzdERlbGF5ZWQoSXRlcmFibGVEZWNsQ29udGV4dCAqSURDKTsKIAorICBib29sIGNhbkRlbGF5TWVtYmVyRGVjbFBhcnNpbmcoKTsKKworICBib29sIGRlbGF5UGFyc2luZ0RlY2xMaXN0KFNvdXJjZUxvYyBMQkxvYywgU291cmNlTG9jICZSQkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2MgUG9zQmVmb3JlTEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VEZWNsT3B0aW9ucyBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhYmxlRGVjbENvbnRleHQgKklEQyk7CisKICAgUGFyc2VyUmVzdWx0PFR5cGVEZWNsPiBwYXJzZURlY2xUeXBlQWxpYXMoUGFyc2VEZWNsT3B0aW9ucyBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEF0dHJpYnV0ZXMgJkF0dHJpYnV0ZXMpOwogCkBAIC04OTAsNyArOTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPHZvaWQoRGVjbCopPiBoYW5kbGVyKTsKICAgYm9vbCBwYXJzZURlY2xMaXN0KFNvdXJjZUxvYyBMQkxvYywgU291cmNlTG9jICZSQkxvYywKICAgICAgICAgICAgICAgICAgICAgIERpYWc8PiBFcnJvckRpYWcsIFBhcnNlRGVjbE9wdGlvbnMgT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjx2b2lkKERlY2wqKT4gaGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgICBJdGVyYWJsZURlY2xDb250ZXh0ICpJREMpOwogICBQYXJzZXJSZXN1bHQ8RXh0ZW5zaW9uRGVjbD4gcGFyc2VEZWNsRXh0ZW5zaW9uKFBhcnNlRGVjbE9wdGlvbnMgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEF0dHJpYnV0ZXMgJkF0dHJpYnV0ZXMpOwogICBQYXJzZXJSZXN1bHQ8RW51bURlY2w+IHBhcnNlRGVjbEVudW0oUGFyc2VEZWNsT3B0aW9ucyBGbGFncywKQEAgLTE0MjQsOCArMTQ0NCw2IEBACiAgIHBhcnNlUGxhdGZvcm1WZXJzaW9uQ29uc3RyYWludFNwZWMoKTsKICAgUGFyc2VyUmVzdWx0PFBsYXRmb3JtQWdub3N0aWNWZXJzaW9uQ29uc3RyYWludEF2YWlsYWJpbGl0eVNwZWM+CiAgIHBhcnNlUGxhdGZvcm1BZ25vc3RpY1ZlcnNpb25Db25zdHJhaW50U3BlYygpOwotCi0gIGJvb2wgY2FuRGVsYXlNZW1iZXJEZWNsUGFyc2luZygpOwogfTsKIAogLy8vIERlc2NyaWJlcyBhIHBhcnNlZCBkZWNsYXJhdGlvbiBuYW1lLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9TeW50YXhQYXJzZUFjdGlvbnMuaCBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvU3ludGF4UGFyc2VBY3Rpb25zLmgKaW5kZXggOWJjZDI3Yy4uMWMxMmZhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9TeW50YXhQYXJzZUFjdGlvbnMuaAorKysgYi9pbmNsdWRlL3N3aWZ0L1BhcnNlL1N5bnRheFBhcnNlQWN0aW9ucy5oCkBAIC0yMywxMyArMjMsMTIgQEAKIG5hbWVzcGFjZSBzd2lmdCB7CiAKIGNsYXNzIENoYXJTb3VyY2VSYW5nZTsKK2NsYXNzIFBhcnNlZFRyaXZpYVBpZWNlOwogY2xhc3MgU291cmNlTG9jOwotY2xhc3MgVG9rZW47CiBlbnVtIGNsYXNzIHRvazsKIAogbmFtZXNwYWNlIHN5bnRheCB7CiAgIGVudW0gY2xhc3MgU3ludGF4S2luZDsKLSAgc3RydWN0IFRyaXZpYTsKIH0KIAogdHlwZWRlZiB2b2lkICpPcGFxdWVTeW50YXhOb2RlOwpAQCAtNDAsMTAgKzM5LDEwIEBACiBwdWJsaWM6CiAgIHZpcnR1YWwgflN5bnRheFBhcnNlQWN0aW9ucygpID0gZGVmYXVsdDsKIAotICB2aXJ0dWFsIE9wYXF1ZVN5bnRheE5vZGUgcmVjb3JkVG9rZW4oY29uc3QgVG9rZW4gJnRvaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bnRheDo6VHJpdmlhICZsZWFkaW5nVHJpdmlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ludGF4OjpUcml2aWEgJnRyYWlsaW5nVHJpdmlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIHJhbmdlKSA9IDA7CisgIHZpcnR1YWwgT3BhcXVlU3ludGF4Tm9kZSByZWNvcmRUb2tlbih0b2sgdG9rZW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHJpdmlhUGllY2U+IGxlYWRpbmdUcml2aWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZWRUcml2aWFQaWVjZT4gdHJhaWxpbmdUcml2aWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgcmFuZ2UpID0gMDsKIAogICAvLy8gUmVjb3JkIGEgbWlzc2luZyB0b2tlbi4gXGMgbG9jIGNhbiBiZSBpbnZhbGlkIG9yIGFuIGFwcHJveGltYXRlIGxvY2F0aW9uCiAgIC8vLyBvZiB3aGVyZSB0aGUgdG9rZW4gd291bGQgYmUgaWYgbm90IG1pc3NpbmcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1BhcnNlL1N5bnRheFBhcnNpbmdDb250ZXh0LmggYi9pbmNsdWRlL3N3aWZ0L1BhcnNlL1N5bnRheFBhcnNpbmdDb250ZXh0LmgKaW5kZXggNTI3ZWEzZS4uNGRmZWFjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9TeW50YXhQYXJzaW5nQ29udGV4dC5oCisrKyBiL2luY2x1ZGUvc3dpZnQvUGFyc2UvU3ludGF4UGFyc2luZ0NvbnRleHQuaApAQCAtMjQsNiArMjQsNyBAQAogCiBjbGFzcyBQYXJzZWRTeW50YXg7CiBjbGFzcyBQYXJzZWRUb2tlblN5bnRheDsKK3N0cnVjdCBQYXJzZWRUcml2aWE7CiBjbGFzcyBTb3VyY2VGaWxlOwogZW51bSBjbGFzcyB0b2s7CiBjbGFzcyBUb2tlbjsKQEAgLTkzLDYgKzk0LDggQEAKIAogICAgIFBhcnNlZFJhd1N5bnRheFJlY29yZGVyIFJlY29yZGVyOwogCisgICAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciBTY3JhdGNoQWxsb2M7CisKICAgICBSb290Q29udGV4dERhdGEoU291cmNlRmlsZSAmU0YsIERpYWdub3N0aWNFbmdpbmUgJkRpYWdzLAogICAgICAgICAgICAgICAgICAgICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsIHVuc2lnbmVkIEJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3ludGF4UGFyc2VBY3Rpb25zPiBzcEFjdGlvbnMpCkBAIC0yNDEsMTIgKzI0NCwxNiBAQAogCiAgIFBhcnNlZFJhd1N5bnRheFJlY29yZGVyICZnZXRSZWNvcmRlcigpIHsgcmV0dXJuIGdldFJvb3REYXRhKCktPlJlY29yZGVyOyB9CiAKKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmZ2V0U2NyYXRjaEFsbG9jKCkgeworICAgIHJldHVybiBnZXRSb290RGF0YSgpLT5TY3JhdGNoQWxsb2M7CisgIH0KKwogICAvLy8gQWRkIFJhd1N5bnRheCB0byB0aGUgcGFydHMuCiAgIHZvaWQgYWRkUmF3U3ludGF4KFBhcnNlZFJhd1N5bnRheE5vZGUgUmF3KTsKIAogICAvLy8gQWRkIFRva2VuIHdpdGggVHJpdmlhIHRvIHRoZSBwYXJ0cy4KLSAgdm9pZCBhZGRUb2tlbihUb2tlbiAmVG9rLCBUcml2aWEgJkxlYWRpbmdUcml2aWEsCi0gICAgICAgICAgICAgICAgVHJpdmlhICZUcmFpbGluZ1RyaXZpYSk7CisgIHZvaWQgYWRkVG9rZW4oVG9rZW4gJlRvaywgY29uc3QgUGFyc2VkVHJpdmlhICZMZWFkaW5nVHJpdmlhLAorICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRyaXZpYSAmVHJhaWxpbmdUcml2aWEpOwogCiAgIC8vLyBBZGQgU3ludGF4IHRvIHRoZSBwYXJ0cy4KICAgdm9pZCBhZGRTeW50YXgoUGFyc2VkU3ludGF4IE5vZGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9QYXJzZS9Ub2tlbi5oIGIvaW5jbHVkZS9zd2lmdC9QYXJzZS9Ub2tlbi5oCmluZGV4IGMxM2Y1ODUuLmQ2MDdhZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvUGFyc2UvVG9rZW4uaAorKysgYi9pbmNsdWRlL3N3aWZ0L1BhcnNlL1Rva2VuLmgKQEAgLTI0OCw2ICsyNDgsMTcgQEAKICAgICByZXR1cm4gQ2hhclNvdXJjZVJhbmdlKGdldExvYygpLCBnZXRMZW5ndGgoKSk7CiAgIH0KIAorICBDaGFyU291cmNlUmFuZ2UgZ2V0UmFuZ2VXaXRob3V0QmFja3RpY2tzKCkgY29uc3QgeworICAgIFNvdXJjZUxvYyBUb2tMb2MgPSBnZXRMb2MoKTsKKyAgICB1bnNpZ25lZCBUb2tMZW5ndGggPSBnZXRMZW5ndGgoKTsKKyAgICBpZiAoaXNFc2NhcGVkSWRlbnRpZmllcigpKSB7CisgICAgICAvLyBBZGp1c3QgdG8gYWNjb3VudCBmb3IgdGhlIGJhY2t0aWNrcy4KKyAgICAgIFRva0xvYyA9IFRva0xvYy5nZXRBZHZhbmNlZExvYygxKTsKKyAgICAgIFRva0xlbmd0aCAtPSAyOworICAgIH0KKyAgICByZXR1cm4gQ2hhclNvdXJjZVJhbmdlKFRva0xvYywgVG9rTGVuZ3RoKTsKKyAgfQorCiAgIGJvb2wgaGFzQ29tbWVudCgpIGNvbnN0IHsKICAgICByZXR1cm4gQ29tbWVudExlbmd0aCAhPSAwOwogICB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1NJTC9TSUxCdWlsZGVyLmggYi9pbmNsdWRlL3N3aWZ0L1NJTC9TSUxCdWlsZGVyLmgKaW5kZXggMjE2ZDQ1ZS4uNWJiMGJmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9TSUwvU0lMQnVpbGRlci5oCisrKyBiL2luY2x1ZGUvc3dpZnQvU0lML1NJTEJ1aWxkZXIuaApAQCAtMzI3LDEwICszMjcsMTIgQEAKICAgLy8gVHlwZSByZW1hcHBpbmcKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKLSAgc3RhdGljIFNJTFR5cGUgZ2V0UGFydGlhbEFwcGx5UmVzdWx0VHlwZShTSUxUeXBlIFR5LCB1bnNpZ25lZCBBcmdDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lMTW9kdWxlICZNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzdGl0dXRpb25NYXAgc3VicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQ29udmVudGlvbiBjYWxsZWVDb252ZW50aW9uKTsKKyAgc3RhdGljIFNJTFR5cGUKKyAgZ2V0UGFydGlhbEFwcGx5UmVzdWx0VHlwZShTSUxUeXBlIFR5LCB1bnNpZ25lZCBBcmdDb3VudCwgU0lMTW9kdWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnN0aXR1dGlvbk1hcCBzdWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckNvbnZlbnRpb24gY2FsbGVlQ29udmVudGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWFsQXBwbHlJbnN0OjpPblN0YWNrS2luZCBvblN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGlhbEFwcGx5SW5zdDo6T25TdGFja0tpbmQ6Ok5vdE9uU3RhY2spOwogCiAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogICAvLyBDRkcgTWFuaXB1bGF0aW9uCkBAIC00NzYsMTAgKzQ3OCwxMiBAQAogICBQYXJ0aWFsQXBwbHlJbnN0ICpjcmVhdGVQYXJ0aWFsQXBwbHkoCiAgICAgICBTSUxMb2NhdGlvbiBMb2MsIFNJTFZhbHVlIEZuLCBTdWJzdGl0dXRpb25NYXAgU3VicywKICAgICAgIEFycmF5UmVmPFNJTFZhbHVlPiBBcmdzLCBQYXJhbWV0ZXJDb252ZW50aW9uIENhbGxlZUNvbnZlbnRpb24sCisgICAgICBQYXJ0aWFsQXBwbHlJbnN0OjpPblN0YWNrS2luZCBPblN0YWNrID0KKyAgICAgICAgICBQYXJ0aWFsQXBwbHlJbnN0OjpPblN0YWNrS2luZDo6Tm90T25TdGFjaywKICAgICAgIGNvbnN0IEdlbmVyaWNTcGVjaWFsaXphdGlvbkluZm9ybWF0aW9uICpTcGVjaWFsaXphdGlvbkluZm8gPSBudWxscHRyKSB7CiAgICAgcmV0dXJuIGluc2VydChQYXJ0aWFsQXBwbHlJbnN0OjpjcmVhdGUoCiAgICAgICAgIGdldFNJTERlYnVnTG9jYXRpb24oTG9jKSwgRm4sIEFyZ3MsIFN1YnMsIENhbGxlZUNvbnZlbnRpb24sICpGLAotICAgICAgICBDLk9wZW5lZEFyY2hldHlwZXMsIFNwZWNpYWxpemF0aW9uSW5mbykpOworICAgICAgICBDLk9wZW5lZEFyY2hldHlwZXMsIFNwZWNpYWxpemF0aW9uSW5mbywgT25TdGFjaykpOwogICB9CiAKICAgQmVnaW5BcHBseUluc3QgKmNyZWF0ZUJlZ2luQXBwbHkoCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1NJTC9TSUxDbG9uZXIuaCBiL2luY2x1ZGUvc3dpZnQvU0lML1NJTENsb25lci5oCmluZGV4IDQ3ZjJlNmMuLjBiMjIwMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvU0lML1NJTENsb25lci5oCisrKyBiL2luY2x1ZGUvc3dpZnQvU0lML1NJTENsb25lci5oCkBAIC04NzgsNiArODc4LDcgQEAKICAgICAgICAgICAgICAgICBnZXRPcExvY2F0aW9uKEluc3QtPmdldExvYygpKSwgZ2V0T3BWYWx1ZShJbnN0LT5nZXRDYWxsZWUoKSksCiAgICAgICAgICAgICAgICAgZ2V0T3BTdWJzdGl0dXRpb25NYXAoSW5zdC0+Z2V0U3Vic3RpdHV0aW9uTWFwKCkpLCBBcmdzLAogICAgICAgICAgICAgICAgIEluc3QtPmdldFR5cGUoKS5nZXRBczxTSUxGdW5jdGlvblR5cGU+KCktPmdldENhbGxlZUNvbnZlbnRpb24oKSwKKyAgICAgICAgICAgICAgICBJbnN0LT5pc09uU3RhY2soKSwKICAgICAgICAgICAgICAgICBHZW5lcmljU3BlY2lhbGl6YXRpb25JbmZvcm1hdGlvbjo6Y3JlYXRlKEluc3QsIGdldEJ1aWxkZXIoKSkpKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9TSUwvU0lMSW5zdHJ1Y3Rpb24uaCBiL2luY2x1ZGUvc3dpZnQvU0lML1NJTEluc3RydWN0aW9uLmgKaW5kZXggMTg5OWIwMC4uNzQwMmU3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9TSUwvU0lMSW5zdHJ1Y3Rpb24uaAorKysgYi9pbmNsdWRlL3N3aWZ0L1NJTC9TSUxJbnN0cnVjdGlvbi5oCkBAIC0yMDcyLDYgKzIwNzIsMTIgQEAKICAgICAgIHB1YmxpYyBsbHZtOjpUcmFpbGluZ09iamVjdHM8UGFydGlhbEFwcGx5SW5zdCwgT3BlcmFuZD4gewogICBmcmllbmQgU0lMQnVpbGRlcjsKIAorcHVibGljOgorICBlbnVtIE9uU3RhY2tLaW5kIHsKKyAgICBOb3RPblN0YWNrLCBPblN0YWNrCisgIH07CisKK3ByaXZhdGU6CiAgIFBhcnRpYWxBcHBseUluc3QoU0lMRGVidWdMb2NhdGlvbiBEZWJ1Z0xvYywgU0lMVmFsdWUgQ2FsbGVlLAogICAgICAgICAgICAgICAgICAgIFNJTFR5cGUgU3Vic3RDYWxsZWVUeXBlLAogICAgICAgICAgICAgICAgICAgIFN1YnN0aXR1dGlvbk1hcCBTdWJzdGl0dXRpb25zLApAQCAtMjA4NCw3ICsyMDkwLDggQEAKICAgY3JlYXRlKFNJTERlYnVnTG9jYXRpb24gRGVidWdMb2MsIFNJTFZhbHVlIENhbGxlZSwgQXJyYXlSZWY8U0lMVmFsdWU+IEFyZ3MsCiAgICAgICAgICBTdWJzdGl0dXRpb25NYXAgU3Vic3RpdHV0aW9ucywgUGFyYW1ldGVyQ29udmVudGlvbiBDYWxsZWVDb252ZW50aW9uLAogICAgICAgICAgU0lMRnVuY3Rpb24gJkYsIFNJTE9wZW5lZEFyY2hldHlwZXNTdGF0ZSAmT3BlbmVkQXJjaGV0eXBlcywKLSAgICAgICAgIGNvbnN0IEdlbmVyaWNTcGVjaWFsaXphdGlvbkluZm9ybWF0aW9uICpTcGVjaWFsaXphdGlvbkluZm8pOworICAgICAgICAgY29uc3QgR2VuZXJpY1NwZWNpYWxpemF0aW9uSW5mb3JtYXRpb24gKlNwZWNpYWxpemF0aW9uSW5mbywKKyAgICAgICAgIE9uU3RhY2tLaW5kIG9uU3RhY2spOwogCiBwdWJsaWM6CiAgIC8vLyBSZXR1cm4gdGhlIHJlc3VsdCBmdW5jdGlvbiB0eXBlIG9mIHRoaXMgcGFydGlhbCBhcHBseS4KQEAgLTIwOTQsNiArMjEwMSwxMCBAQAogICBib29sIGhhc0NhbGxlZUd1YXJhbnRlZWRDb250ZXh0KCkgY29uc3QgewogICAgIHJldHVybiBnZXRUeXBlKCkuY2FzdFRvPFNJTEZ1bmN0aW9uVHlwZT4oKS0+aXNDYWxsZWVHdWFyYW50ZWVkKCk7CiAgIH0KKworICBPblN0YWNrS2luZCBpc09uU3RhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZ1bmN0aW9uVHlwZSgpLT5pc05vRXNjYXBlKCkgPyBPblN0YWNrIDogTm90T25TdGFjazsKKyAgfQogfTsKIAogY2xhc3MgQmVnaW5BcHBseUluc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1NJTC9UeXBlU3Vic3RDbG9uZXIuaCBiL2luY2x1ZGUvc3dpZnQvU0lML1R5cGVTdWJzdENsb25lci5oCmluZGV4IDEzZWY1OTQuLjczOGI3ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvU0lML1R5cGVTdWJzdENsb25lci5oCisrKyBiL2luY2x1ZGUvc3dpZnQvU0lML1R5cGVTdWJzdENsb25lci5oCkBAIC0yMTUsOCArMjE1LDggQEAKICAgICBQYXJ0aWFsQXBwbHlJbnN0ICpOID0gZ2V0QnVpbGRlcigpLmNyZWF0ZVBhcnRpYWxBcHBseSgKICAgICAgICAgZ2V0T3BMb2NhdGlvbihJbnN0LT5nZXRMb2MoKSksIEhlbHBlci5nZXRDYWxsZWUoKSwKICAgICAgICAgSGVscGVyLmdldFN1YnN0aXR1dGlvbnMoKSwgSGVscGVyLmdldEFyZ3VtZW50cygpLCBQYXJhbUNvbnZlbnRpb24sCi0gICAgICAgIEdlbmVyaWNTcGVjaWFsaXphdGlvbkluZm9ybWF0aW9uOjpjcmVhdGUoCi0gICAgICAgICAgSW5zdCwgZ2V0QnVpbGRlcigpKSk7CisgICAgICAgIEluc3QtPmlzT25TdGFjaygpLAorICAgICAgICBHZW5lcmljU3BlY2lhbGl6YXRpb25JbmZvcm1hdGlvbjo6Y3JlYXRlKEluc3QsIGdldEJ1aWxkZXIoKSkpOwogICAgIHJlY29yZENsb25lZEluc3RydWN0aW9uKEluc3QsIE4pOwogICB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3dpZnQvU0lMT3B0aW1pemVyL1Bhc3NNYW5hZ2VyL1Bhc3Nlcy5kZWYgYi9pbmNsdWRlL3N3aWZ0L1NJTE9wdGltaXplci9QYXNzTWFuYWdlci9QYXNzZXMuZGVmCmluZGV4IGYxNGY1MWQuLjZmZjUyMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvU0lMT3B0aW1pemVyL1Bhc3NNYW5hZ2VyL1Bhc3Nlcy5kZWYKKysrIGIvaW5jbHVkZS9zd2lmdC9TSUxPcHRpbWl6ZXIvUGFzc01hbmFnZXIvUGFzc2VzLmRlZgpAQCAtMjMyLDggKzIzMiwxMCBAQAogICAgICAiUGVyZm9ybWFuY2UgRnVuY3Rpb24gSW5saW5pbmciKQogUEFTUyhQZXJmb3JtYW5jZUNvbnN0YW50UHJvcGFnYXRpb24sICJwZXJmb3JtYW5jZS1jb25zdGFudC1wcm9wYWdhdGlvbiIsCiAgICAgICJDb25zdGFudCBQcm9wYWdhdGlvbiBmb3IgUGVyZm9ybWFuY2Ugd2l0aG91dCBEaWFnbm9zdGljcyIpCi1QQVNTKFByZWRpY3RhYmxlTWVtb3J5T3B0aW1pemF0aW9ucywgInByZWRpY3RhYmxlLW1lbW9wdCIsCi0gICAgICJQcmVkaWN0YWJsZSBNZW1vcnkgT3B0aW1pemF0aW9uIGZvciBEaWFnbm9zdGljcyIpCitQQVNTKFByZWRpY3RhYmxlTWVtb3J5QWNjZXNzT3B0aW1pemF0aW9ucywgInByZWRpY3RhYmxlLW1lbWFjY2Vzcy1vcHRzIiwKKyAgICAgIlByZWRpY3RhYmxlIE1lbW9yeSBBY2Nlc3MgT3B0aW1pemF0aW9ucyBmb3IgRGlhZ25vc3RpY3MiKQorUEFTUyhQcmVkaWN0YWJsZURlYWRBbGxvY2F0aW9uRWxpbWluYXRpb24sICJwcmVkaWN0YWJsZS1kZWFkYWxsb2MtZWxpbSIsCisgICAgICJFbGltaW5hdGUgZGVhZCB0ZW1wb3JhcnkgYWxsb2NhdGlvbnMgYWZ0ZXIgZGlhZ25vc3RpY3MiKQogUEFTUyhSZWxlYXNlRGV2aXJ0dWFsaXplciwgInJlbGVhc2UtZGV2aXJ0dWFsaXplciIsCiAgICAgICJTSUwgcmVsZWFzZSBEZXZpcnR1YWxpemF0aW9uIikKIFBBU1MoUmV0YWluU2lua2luZywgInJldGFpbi1zaW5raW5nIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3dpZnQvU0lMT3B0aW1pemVyL1V0aWxzL0xvY2FsLmggYi9pbmNsdWRlL3N3aWZ0L1NJTE9wdGltaXplci9VdGlscy9Mb2NhbC5oCmluZGV4IDc1NDhjNGEuLjM0ZWY5ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvU0lMT3B0aW1pemVyL1V0aWxzL0xvY2FsLmgKKysrIGIvaW5jbHVkZS9zd2lmdC9TSUxPcHRpbWl6ZXIvVXRpbHMvTG9jYWwuaApAQCAtMjEyLDYgKzIxMiwxMiBAQAogICAgIFNJTEJ1aWxkZXIgJkJ1aWxkZXIsIFNJTExvY2F0aW9uIExvYywgU0lMVmFsdWUgQXJnLCBTSUxQYXJhbWV0ZXJJbmZvIFBJbmZvLAogICAgIEluc3RNb2RDYWxsYmFja3MgQ2FsbGJhY2tzID0gSW5zdE1vZENhbGxiYWNrcygpKTsKIAorLy8vIEluc2VydCBkZXN0cm95cyBvZiBjYXB0dXJlZCBhcmd1bWVudHMgb2YgcGFydGlhbF9hcHBseSBbc3RhY2tdLgordm9pZCBpbnNlcnREZXN0cm95T2ZDYXB0dXJlZEFyZ3VtZW50cygKKyAgICBQYXJ0aWFsQXBwbHlJbnN0ICpQQUksIFNJTEJ1aWxkZXIgJkIsCisgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woU0lMVmFsdWUpPiBzaG91bGRJbnNlcnREZXN0cm95ID0KKyAgICAgICAgW10oU0lMVmFsdWUgYXJnKSAtPiBib29sIHsgcmV0dXJuIHRydWU7IH0pOworCiAvLy8gVGhpcyBjb21wdXRlcyB0aGUgbGlmZXRpbWUgb2YgYSBzaW5nbGUgU0lMVmFsdWUuCiAvLy8KIC8vLyBUaGlzIGRvZXMgbm90IGNvbXB1dGUgYSBzZXQgb2Ygam9pbnRseSBwb3N0ZG9taW5hdGluZyB1c2UgcG9pbnRzLiBJbnN0ZWFkIGl0CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1NJTE9wdGltaXplci9VdGlscy9TdGFja05lc3RpbmcuaCBiL2luY2x1ZGUvc3dpZnQvU0lMT3B0aW1pemVyL1V0aWxzL1N0YWNrTmVzdGluZy5oCmluZGV4IDk4OGIzYTUuLjhmNzEzMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvU0lMT3B0aW1pemVyL1V0aWxzL1N0YWNrTmVzdGluZy5oCisrKyBiL2luY2x1ZGUvc3dpZnQvU0lMT3B0aW1pemVyL1V0aWxzL1N0YWNrTmVzdGluZy5oCkBAIC05OCwxMCArOTgsMTAgQEAKICAgLy8vCiAgIC8vLyBFYWNoIHN0YWNrIGxvY2F0aW9uIGlzIGFsbG9jYXRlZCBieSBhIHNpbmdsZSBhbGxvY2F0aW9uIGluc3RydWN0aW9uLgogICBzdHJ1Y3QgU3RhY2tMb2MgewotICAgIFN0YWNrTG9jKEFsbG9jYXRpb25JbnN0ICpBbGxvYykgOiBBbGxvYyhBbGxvYykgeyB9CisgICAgU3RhY2tMb2MoU2luZ2xlVmFsdWVJbnN0cnVjdGlvbiAqQWxsb2MpIDogQWxsb2MoQWxsb2MpIHsgfQogCiAgICAgLy8vIEJhY2stbGluayB0byB0aGUgYWxsb2NhdGlvbiBpbnN0cnVjdGlvbi4KLSAgICBBbGxvY2F0aW9uSW5zdCAqQWxsb2M7CisgICAgU2luZ2xlVmFsdWVJbnN0cnVjdGlvbiAqQWxsb2M7CiAKICAgICAvLy8gQml0LXNldCB3aGljaCByZXByZXNlbnRzIGFsbCBhbGl2ZSBsb2NhdGlvbnMgYXQgdGhpcyBhbGxvY2F0aW9uLgogICAgIC8vLyBJdCBvYnZpb3VzbHkgaW5jbHVkZXMgdGhpcyBsb2NhdGlvbiBpdHNlbGYuIEFuZCBpdCBpbmNsdWRlcyBhbGwgIm91dGVyIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zd2lmdC9TZXJpYWxpemF0aW9uL01vZHVsZUZvcm1hdC5oIGIvaW5jbHVkZS9zd2lmdC9TZXJpYWxpemF0aW9uL01vZHVsZUZvcm1hdC5oCmluZGV4IDZjNDhiNWYuLjYzNzM4ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvU2VyaWFsaXphdGlvbi9Nb2R1bGVGb3JtYXQuaAorKysgYi9pbmNsdWRlL3N3aWZ0L1NlcmlhbGl6YXRpb24vTW9kdWxlRm9ybWF0LmgKQEAgLTUyLDcgKzUyLDcgQEAKIC8vLyBkZXNjcmliZSB3aGF0IGNoYW5nZSB5b3UgbWFkZS4gVGhlIGNvbnRlbnQgb2YgdGhpcyBjb21tZW50IGlzbid0IGltcG9ydGFudDsKIC8vLyBpdCBqdXN0IGVuc3VyZXMgYSBjb25mbGljdCBpZiB0d28gcGVvcGxlIGNoYW5nZSB0aGUgbW9kdWxlIGZvcm1hdC4KIC8vLyBEb24ndCB3b3JyeSBhYm91dCBhZGhlcmluZyB0byB0aGUgODAtY29sdW1uIGxpbWl0IGZvciB0aGlzIGxpbmUuCi1jb25zdCB1aW50MTZfdCBTV0lGVE1PRFVMRV9WRVJTSU9OX01JTk9SID0gNDcxOyAvLyBMYXN0IGNoYW5nZTogQWRkIEBhdmFpbGFibGUoX1BhY2thZ2VEZXNjcmlwdGlvbi4uKQorY29uc3QgdWludDE2X3QgU1dJRlRNT0RVTEVfVkVSU0lPTl9NSU5PUiA9IDQ3MjsgLy8gTGFzdCBjaGFuZ2U6IHBhcnRpYWxfYXBwbHkgW3N0YWNrXQogCiB1c2luZyBEZWNsSURGaWVsZCA9IEJDRml4ZWQ8MzE+OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1N1YnN5c3RlbXMuaCBiL2luY2x1ZGUvc3dpZnQvU3Vic3lzdGVtcy5oCmluZGV4IDBkMTMyM2YuLjY3M2U4ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3dpZnQvU3Vic3lzdGVtcy5oCisrKyBiL2luY2x1ZGUvc3dpZnQvU3Vic3lzdGVtcy5oCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTFBhcnNlclN0YXRlICpTSUwgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVudFBhcnNlclN0YXRlICpQZXJzaXN0ZW50U3RhdGUgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsYXllZFBhcnNpbmdDYWxsYmFja3MgKkRlbGF5ZWRQYXJzZUNCID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZURlbGF5ZWRQYXJzaW5nID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxheUJvZHlQYXJzaW5nID0gdHJ1ZSk7CiAKICAgLy8vIFBhcnNlIGEgc2luZ2xlIGJ1ZmZlciBpbnRvIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSwgdW50aWwgdGhlIGZ1bGwgc291cmNlCiAgIC8vLyBjb250ZW50cyBhcmUgcGFyc2VkLgpAQCAtMTMxLDcgKzEzMSw3IEBACiAgIGJvb2wgcGFyc2VJbnRvU291cmNlRmlsZUZ1bGwoU291cmNlRmlsZSAmU0YsIHVuc2lnbmVkIEJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW50UGFyc2VyU3RhdGUgKlBlcnNpc3RlbnRTdGF0ZSA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpEZWxheWVkUGFyc2VDQiA9IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlRGVsYXllZFBhcnNpbmcgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxheUJvZHlQYXJzaW5nID0gdHJ1ZSk7CiAKICAgLy8vIEZpbmlzaCB0aGUgcGFyc2luZyBieSBnb2luZyBvdmVyIHRoZSBub2RlcyB0aGF0IHdlcmUgZGVsYXllZAogICAvLy8gZHVyaW5nIHRoZSBmaXJzdCBwYXJzaW5nIHBhc3MuCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N3aWZ0L1N5bnRheC9Ucml2aWEuaC5neWIgYi9pbmNsdWRlL3N3aWZ0L1N5bnRheC9Ucml2aWEuaC5neWIKaW5kZXggNjIyYzA5YS4uMGY4OTk0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zd2lmdC9TeW50YXgvVHJpdmlhLmguZ3liCisrKyBiL2luY2x1ZGUvc3dpZnQvU3ludGF4L1RyaXZpYS5oLmd5YgpAQCAtMTA5LDYgKzEwOSw4IEBACiAlIGVuZAogfTsKIAorYm9vbCBpc0NvbW1lbnRUcml2aWFLaW5kKFRyaXZpYUtpbmQga2luZCk7CisKIC8vLyBBIGNvbnRpZ3VvdXMgc3RyZXRjaCBvZiBhIHNpbmdsZSBraW5kIG9mIHRyaXZpYS4gVGhlIGNvbnN0aXR1ZW50IHBhcnQgb2YKIC8vLyBhIGBUcml2aWFgIGNvbGxlY3Rpb24uCiAvLy8KQEAgLTE1MCw2ICsxNTIsOCBAQAogJSBlbmQKICUgZW5kCiAKKyAgc3RhdGljIFRyaXZpYVBpZWNlIGZyb21UZXh0KFRyaXZpYUtpbmQga2luZCwgU3RyaW5nUmVmIHRleHQpOworCiAgIC8vLyBSZXR1cm4ga2luZCBvZiB0aGUgdHJpdmlhLgogICBUcml2aWFLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CiAKQEAgLTE3NCw3ICsxNzgsOSBAQAogICAgIGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCBraW5kIik7CiAgIH0KIAotICBib29sIGlzQ29tbWVudCgpIGNvbnN0OworICBib29sIGlzQ29tbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDb21tZW50VHJpdmlhS2luZChnZXRLaW5kKCkpOworICB9CiAKICAgdm9pZCBhY2N1bXVsYXRlQWJzb2x1dGVQb3NpdGlvbihBYnNvbHV0ZVBvc2l0aW9uICZQb3MpIGNvbnN0OwogICAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3dpZnQvU3ludGF4UGFyc2UvU3ludGF4VHJlZUNyZWF0b3IuaCBiL2luY2x1ZGUvc3dpZnQvU3ludGF4UGFyc2UvU3ludGF4VHJlZUNyZWF0b3IuaAppbmRleCBjOGFkNTVlLi4zZWQ0NDk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N3aWZ0L1N5bnRheFBhcnNlL1N5bnRheFRyZWVDcmVhdG9yLmgKKysrIGIvaW5jbHVkZS9zd2lmdC9TeW50YXhQYXJzZS9TeW50YXhUcmVlQ3JlYXRvci5oCkBAIC0xOCw2ICsxOCw3IEBACiAKIG5hbWVzcGFjZSBzd2lmdCB7CiAgIGNsYXNzIFJhd1N5bnRheFRva2VuQ2FjaGU7CisgIGNsYXNzIFNvdXJjZU1hbmFnZXI7CiAgIGNsYXNzIFN5bnRheFBhcnNpbmdDYWNoZTsKICAgY2xhc3MgU291cmNlRmlsZTsKIApAQCAtMzIsNiArMzMsOCBAQAogLy8vIEl0IGFsc28gaGFuZGxlcyBjYWNoaW5nIHJlLXVzYWJsZSBSYXdTeW50YXggb2JqZWN0cyBhbmQgc2tpcHBpbmcgcGFyc2VkCiAvLy8gbm9kZXMgdmlhIGNvbnN1bHRpbmcgYSBcYyBTeW50YXhQYXJzaW5nQ2FjaGUuCiBjbGFzcyBTeW50YXhUcmVlQ3JlYXRvcjogcHVibGljIFN5bnRheFBhcnNlQWN0aW9ucyB7CisgIFNvdXJjZU1hbmFnZXIgJlNNOworICB1bnNpZ25lZCBCdWZmZXJJRDsKICAgUkM8c3ludGF4OjpTeW50YXhBcmVuYT4gQXJlbmE7CiAKICAgLy8vIEEgY2FjaGUgb2Ygbm9kZXMgdGhhdCBjYW4gYmUgcmV1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGN1cnJlbnQgc3ludGF4CkBAIC00MywxNiArNDYsMTcgQEAKICAgc3RkOjp1bmlxdWVfcHRyPFJhd1N5bnRheFRva2VuQ2FjaGU+IFRva2VuQ2FjaGU7CiAKIHB1YmxpYzoKLSAgU3ludGF4VHJlZUNyZWF0b3IoU3ludGF4UGFyc2luZ0NhY2hlICpzeW50YXhDYWNoZSwKKyAgU3ludGF4VHJlZUNyZWF0b3IoU291cmNlTWFuYWdlciAmU00sIHVuc2lnbmVkIGJ1ZmZlcklELAorICAgICAgICAgICAgICAgICAgICBTeW50YXhQYXJzaW5nQ2FjaGUgKnN5bnRheENhY2hlLAogICAgICAgICAgICAgICAgICAgICBSQzxzeW50YXg6OlN5bnRheEFyZW5hPiBhcmVuYSk7CiAgIH5TeW50YXhUcmVlQ3JlYXRvcigpOwogCiAgIHZvaWQgYWNjZXB0U3ludGF4Um9vdChPcGFxdWVTeW50YXhOb2RlIHJvb3QsIFNvdXJjZUZpbGUgJlNGKTsKIAogcHJpdmF0ZToKLSAgT3BhcXVlU3ludGF4Tm9kZSByZWNvcmRUb2tlbihjb25zdCBUb2tlbiAmdG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bnRheDo6VHJpdmlhICZsZWFkaW5nVHJpdmlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bnRheDo6VHJpdmlhICZ0cmFpbGluZ1RyaXZpYSwKKyAgT3BhcXVlU3ludGF4Tm9kZSByZWNvcmRUb2tlbih0b2sgdG9rZW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFRyaXZpYVBpZWNlPiBsZWFkaW5nVHJpdmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFRyaXZpYVBpZWNlPiB0cmFpbGluZ1RyaXZpYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgcmFuZ2UpIG92ZXJyaWRlOwogCiAgIE9wYXF1ZVN5bnRheE5vZGUgcmVjb3JkTWlzc2luZ1Rva2VuKHRvayB0b2tlbktpbmQsIFNvdXJjZUxvYyBsb2MpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9BU1RDb250ZXh0LmNwcCBiL2xpYi9BU1QvQVNUQ29udGV4dC5jcHAKaW5kZXggODIzMTcwOC4uOWRmZGRkNSAxMDA2NDQKLS0tIGEvbGliL0FTVC9BU1RDb250ZXh0LmNwcAorKysgYi9saWIvQVNUL0FTVENvbnRleHQuY3BwCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSAic3dpZnQvQmFzaWMvU3RhdGlzdGljLmgiCiAjaW5jbHVkZSAic3dpZnQvQmFzaWMvU3RyaW5nRXh0cmFzLmgiCiAjaW5jbHVkZSAic3dpZnQvUGFyc2UvTGV4ZXIuaCIgLy8gYmFkIGRlcGVuZGVuY3kKKyNpbmNsdWRlICJzd2lmdC9TeW50YXgvUmVmZXJlbmNlcy5oIgogI2luY2x1ZGUgInN3aWZ0L1N5bnRheC9TeW50YXhBcmVuYS5oIgogI2luY2x1ZGUgInN3aWZ0L1N0cmluZ3MuaCIKICNpbmNsdWRlICJzd2lmdC9TdWJzeXN0ZW1zLmgiCmRpZmYgLS1naXQgYS9saWIvQVNUL0FTVER1bXBlci5jcHAgYi9saWIvQVNUL0FTVER1bXBlci5jcHAKaW5kZXggOTliNThjYy4uNzcyZDg3OSAxMDA2NDQKLS0tIGEvbGliL0FTVC9BU1REdW1wZXIuY3BwCisrKyBiL2xpYi9BU1QvQVNURHVtcGVyLmNwcApAQCAtMTMzMSw2ICsxMzMxLDEwIEBACiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpTdWJzY3JpcHREZWNsOgogICAgIHByaW50TmFtZShvcywgY2FzdDxTdWJzY3JpcHREZWNsPihkYyktPmdldEZ1bGxOYW1lKCkpOwogICAgIGJyZWFrOworCisgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2w6CisgICAgcHJpbnROYW1lKG9zLCBjYXN0PEVudW1FbGVtZW50RGVjbD4oZGMpLT5nZXRGdWxsTmFtZSgpKTsKKyAgICBicmVhazsKICAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvQVNUL0FTVE1hbmdsZXIuY3BwIGIvbGliL0FTVC9BU1RNYW5nbGVyLmNwcAppbmRleCA3NmZhYWY4Li43MWQzNTFlIDEwMDY0NAotLS0gYS9saWIvQVNUL0FTVE1hbmdsZXIuY3BwCisrKyBiL2xpYi9BU1QvQVNUTWFuZ2xlci5jcHAKQEAgLTE1MDgsNiArMTUwOCwxMSBAQAogICAgIHJldHVybiBhcHBlbmRFbnRpdHkoZm4pOwogICB9CiAKKyAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkVudW1FbGVtZW50RGVjbDogeworICAgIGF1dG8gZWVkID0gY2FzdDxFbnVtRWxlbWVudERlY2w+KGN0eCk7CisgICAgcmV0dXJuIGFwcGVuZEVudGl0eShlZWQpOworICB9CisKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlN1YnNjcmlwdERlY2w6CiAgICAgLy8gRklYTUU6IFdlIG1heSBuZWVkIHRvIGRvIHNvbWV0aGluZyBoZXJlIGlmIHN1YnNjcmlwdHMgY29udGFpbiBhbnkgc3ltYm9scwogICAgIC8vIGV4cG9zZWQgd2l0aCBsaW5rYWdlIG5hbWVzLCBvciBpZi93aGVuIHRoZXkgZ2V0IGdlbmVyaWMgcGFyYW1ldGVycy4KZGlmZiAtLWdpdCBhL2xpYi9BU1QvQVNUVmVyaWZpZXIuY3BwIGIvbGliL0FTVC9BU1RWZXJpZmllci5jcHAKaW5kZXggMWI4NGZkNi4uMjZiNGIyNCAxMDA2NDQKLS0tIGEvbGliL0FTVC9BU1RWZXJpZmllci5jcHAKKysrIGIvbGliL0FTVC9BU1RWZXJpZmllci5jcHAKQEAgLTc1MCw2ICs3NTAsNyBAQAogICAgIEZVTkNUSU9OX0xJS0UoQ29uc3RydWN0b3JEZWNsKQogICAgIEZVTkNUSU9OX0xJS0UoRGVzdHJ1Y3RvckRlY2wpCiAgICAgRlVOQ1RJT05fTElLRShGdW5jRGVjbCkKKyAgICBGVU5DVElPTl9MSUtFKEVudW1FbGVtZW50RGVjbCkKICAgICBTQ09QRV9MSUtFKE5vbWluYWxUeXBlRGVjbCkKICAgICBTQ09QRV9MSUtFKEV4dGVuc2lvbkRlY2wpCiAKZGlmZiAtLWdpdCBhL2xpYi9BU1QvQWNjZXNzUmVxdWVzdHMuY3BwIGIvbGliL0FTVC9BY2Nlc3NSZXF1ZXN0cy5jcHAKaW5kZXggMTk4YmFiYS4uMTk2NDBmYiAxMDA2NDQKLS0tIGEvbGliL0FTVC9BY2Nlc3NSZXF1ZXN0cy5jcHAKKysrIGIvbGliL0FTVC9BY2Nlc3NSZXF1ZXN0cy5jcHAKQEAgLTEwNSw2ICsxMDUsNyBAQAogICBjYXNlIERlY2xDb250ZXh0S2luZDo6SW5pdGlhbGl6ZXI6CiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpBYnN0cmFjdEZ1bmN0aW9uRGVjbDoKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlN1YnNjcmlwdERlY2w6CisgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2w6CiAgICAgcmV0dXJuIEFjY2Vzc0xldmVsOjpQcml2YXRlOwogICBjYXNlIERlY2xDb250ZXh0S2luZDo6TW9kdWxlOgogICBjYXNlIERlY2xDb250ZXh0S2luZDo6RmlsZVVuaXQ6CmRpZmYgLS1naXQgYS9saWIvQVNUL0RlY2wuY3BwIGIvbGliL0FTVC9EZWNsLmNwcAppbmRleCA4YTMwODQyLi5hMzNiZGRjIDEwMDY0NAotLS0gYS9saWIvQVNUL0RlY2wuY3BwCisrKyBiL2xpYi9BU1QvRGVjbC5jcHAKQEAgLTM1NDcsNyArMzU0Nyw2IEBACiAgIC8vIENyZWF0ZSBhbiBlbXB0eSBib2R5IGZvciB0aGUgZGVzdHJ1Y3Rvci4KICAgREQtPnNldEJvZHkoQnJhY2VTdG10OjpjcmVhdGUoY3R4LCBnZXRMb2MoKSwgeyB9LCBnZXRMb2MoKSwgdHJ1ZSkpOwogICBhZGRNZW1iZXIoREQpOwotICBzZXRIYXNEZXN0cnVjdG9yKCk7CiAKICAgLy8gUHJvcGFnYXRlIGFjY2VzcyBjb250cm9sIGFuZCB2ZXJzaW9uZWQtbmVzcy4KICAgREQtPmNvcHlGb3JtYWxBY2Nlc3NGcm9tKHRoaXMsIC8qc291cmNlSXNQYXJlbnRDb250ZXh0Ki90cnVlKTsKQEAgLTM5MTAsMTYgKzM5MDksMTkgQEAKICAgQml0cy5Qcm90b2NvbERlY2wuRXhpc3RlbnRpYWxDb25mb3Jtc1RvU2VsZiA9IGZhbHNlOwogICBCaXRzLlByb3RvY29sRGVjbC5DaXJjdWxhcml0eQogICAgID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KENpcmN1bGFyaXR5Q2hlY2s6OlVuY2hlY2tlZCk7CisgIEJpdHMuUHJvdG9jb2xEZWNsLkluaGVyaXRlZFByb3RvY29sc1ZhbGlkID0gMDsKICAgQml0cy5Qcm90b2NvbERlY2wuTnVtUmVxdWlyZW1lbnRzSW5TaWduYXR1cmUgPSAwOwogICBCaXRzLlByb3RvY29sRGVjbC5IYXNNaXNzaW5nUmVxdWlyZW1lbnRzID0gZmFsc2U7CiAgIEJpdHMuUHJvdG9jb2xEZWNsLktub3duUHJvdG9jb2wgPSAwOwotICBzZXRUcmFpbGluZ1doZXJlQ2xhdXNlKFRyYWlsaW5nV2hlcmUpOworICAgIHNldFRyYWlsaW5nV2hlcmVDbGF1c2UoVHJhaWxpbmdXaGVyZSk7CiB9CiAKLWxsdm06OlRpbnlQdHJWZWN0b3I8UHJvdG9jb2xEZWNsICo+Ci1Qcm90b2NvbERlY2w6OmdldEluaGVyaXRlZFByb3RvY29scygpIGNvbnN0IHsKLSAgbGx2bTo6VGlueVB0clZlY3RvcjxQcm90b2NvbERlY2wgKj4gcmVzdWx0OwotICBTbWFsbFB0clNldDxjb25zdCBQcm90b2NvbERlY2wgKiwgND4ga25vd247CitBcnJheVJlZjxQcm90b2NvbERlY2wgKj4KK1Byb3RvY29sRGVjbDo6Z2V0SW5oZXJpdGVkUHJvdG9jb2xzU2xvdygpIHsKKyAgQml0cy5Qcm90b2NvbERlY2wuSW5oZXJpdGVkUHJvdG9jb2xzVmFsaWQgPSB0cnVlOworCisgIGxsdm06OlNtYWxsVmVjdG9yPFByb3RvY29sRGVjbCAqLCAyPiByZXN1bHQ7CisgIFNtYWxsUHRyU2V0PGNvbnN0IFByb3RvY29sRGVjbCAqLCAyPiBrbm93bjsKICAga25vd24uaW5zZXJ0KHRoaXMpOwogICBib29sIGFueU9iamVjdCA9IGZhbHNlOwogICBmb3IgKGNvbnN0IGF1dG8gZm91bmQgOgpAQCAtMzkzMSw3ICszOTMzLDkgQEAKICAgICB9CiAgIH0KIAotICByZXR1cm4gcmVzdWx0OworICBhdXRvICZjdHggPSBnZXRBU1RDb250ZXh0KCk7CisgIEluaGVyaXRlZFByb3RvY29scyA9IGN0eC5BbGxvY2F0ZUNvcHkocmVzdWx0KTsKKyAgcmV0dXJuIEluaGVyaXRlZFByb3RvY29sczsKIH0KIAogbGx2bTo6VGlueVB0clZlY3RvcjxBc3NvY2lhdGVkVHlwZURlY2wgKj4KQEAgLTM5NzMsNyArMzk3NywxMCBAQAogdm9pZCBQcm90b2NvbERlY2w6OnNldFN1cGVyY2xhc3MoVHlwZSBzdXBlcmNsYXNzKSB7CiAgIGFzc2VydCgoIXN1cGVyY2xhc3MgfHwgIXN1cGVyY2xhc3MtPmhhc0FyY2hldHlwZSgpKQogICAgICAgICAgJiYgInN1cGVyY2xhc3MgbXVzdCBiZSBpbnRlcmZhY2UgdHlwZSIpOwotICBMYXp5U2VtYW50aWNJbmZvLlN1cGVyY2xhc3Muc2V0UG9pbnRlckFuZEludChzdXBlcmNsYXNzLCB0cnVlKTsKKyAgTGF6eVNlbWFudGljSW5mby5TdXBlcmNsYXNzVHlwZS5zZXRQb2ludGVyQW5kSW50KHN1cGVyY2xhc3MsIHRydWUpOworICBMYXp5U2VtYW50aWNJbmZvLlN1cGVyY2xhc3NEZWNsLnNldFBvaW50ZXJBbmRJbnQoCisgICAgc3VwZXJjbGFzcyA/IHN1cGVyY2xhc3MtPmdldENsYXNzT3JCb3VuZEdlbmVyaWNDbGFzcygpIDogbnVsbHB0ciwKKyAgICB0cnVlKTsKIH0KIAogYm9vbCBQcm90b2NvbERlY2w6OndhbGtJbmhlcml0ZWRQcm90b2NvbHMoCkBAIC02NDc4LDcgKzY0ODUsMTAgQEAKIHZvaWQgQ2xhc3NEZWNsOjpzZXRTdXBlcmNsYXNzKFR5cGUgc3VwZXJjbGFzcykgewogICBhc3NlcnQoKCFzdXBlcmNsYXNzIHx8ICFzdXBlcmNsYXNzLT5oYXNBcmNoZXR5cGUoKSkKICAgICAgICAgICYmICJzdXBlcmNsYXNzIG11c3QgYmUgaW50ZXJmYWNlIHR5cGUiKTsKLSAgTGF6eVNlbWFudGljSW5mby5TdXBlcmNsYXNzLnNldFBvaW50ZXJBbmRJbnQoc3VwZXJjbGFzcywgdHJ1ZSk7CisgIExhenlTZW1hbnRpY0luZm8uU3VwZXJjbGFzc1R5cGUuc2V0UG9pbnRlckFuZEludChzdXBlcmNsYXNzLCB0cnVlKTsKKyAgTGF6eVNlbWFudGljSW5mby5TdXBlcmNsYXNzRGVjbC5zZXRQb2ludGVyQW5kSW50KAorICAgIHN1cGVyY2xhc3MgPyBzdXBlcmNsYXNzLT5nZXRDbGFzc09yQm91bmRHZW5lcmljQ2xhc3MoKSA6IG51bGxwdHIsCisgICAgdHJ1ZSk7CiB9CiAKIENsYW5nTm9kZSBEZWNsOjpnZXRDbGFuZ05vZGVJbXBsKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvbGliL0FTVC9EZWNsQ29udGV4dC5jcHAgYi9saWIvQVNUL0RlY2xDb250ZXh0LmNwcAppbmRleCA0Njk0ZTk1Li4xYzRkNjEwIDEwMDY0NAotLS0gYS9saWIvQVNUL0RlY2xDb250ZXh0LmNwcAorKysgYi9saWIvQVNUL0RlY2xDb250ZXh0LmNwcApAQCAtNDA1LDYgKzQwNSw5IEBACiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpTdWJzY3JpcHREZWNsOgogICAgIGJyZWFrOwogCisgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2w6CisgICAgYnJlYWs7CisKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6Ok1vZHVsZToKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkZpbGVVbml0OgogICAgIHJldHVybiB0cnVlOwpAQCAtNDYxLDYgKzQ2NCw4IEBACiAgICAgcmV0dXJuIGNhc3Q8QWJzdHJhY3RGdW5jdGlvbkRlY2w+KHRoaXMpLT53YWxrKFdhbGtlcik7CiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpTdWJzY3JpcHREZWNsOgogICAgIHJldHVybiBjYXN0PFN1YnNjcmlwdERlY2w+KHRoaXMpLT53YWxrKFdhbGtlcik7CisgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2w6CisgICAgcmV0dXJuIGNhc3Q8RW51bUVsZW1lbnREZWNsPih0aGlzKS0+d2FsayhXYWxrZXIpOwogICBjYXNlIERlY2xDb250ZXh0S2luZDo6U2VyaWFsaXplZExvY2FsOgogICAgIGxsdm1fdW5yZWFjaGFibGUoIndhbGsgaXMgdW5pbXBsZW1lbnRlZCBmb3IgZGVzZXJpYWxpemVkIGNvbnRleHRzIik7CiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpJbml0aWFsaXplcjoKQEAgLTU0Nyw2ICs1NTIsNyBAQAogICAgIEtpbmQgPSAiQWJzdHJhY3RGdW5jdGlvbkRlY2wiOwogICAgIGJyZWFrOwogICBjYXNlIERlY2xDb250ZXh0S2luZDo6U3Vic2NyaXB0RGVjbDogICAgS2luZCA9ICJTdWJzY3JpcHREZWNsIjsgYnJlYWs7CisgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2w6ICBLaW5kID0gIkVudW1FbGVtZW50RGVjbCI7IGJyZWFrOwogICB9CiAgIE9TLmluZGVudChEZXB0aCoyICsgaW5kZW50KSA8PCAodm9pZCopdGhpcyA8PCAiICIgPDwgS2luZDsKIApAQCAtNjAxLDYgKzYwNywxNSBAQAogICAgICAgT1MgPDwgIiA6IChubyB0eXBlIHNldCkiOwogICAgIGJyZWFrOwogICB9CisgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2w6IHsKKyAgICBhdXRvICpFRUQgPSBjYXN0PEVudW1FbGVtZW50RGVjbD4odGhpcyk7CisgICAgT1MgPDwgIiBuYW1lPSIgPDwgRUVELT5nZXRCYXNlTmFtZSgpOworICAgIGlmIChFRUQtPmhhc0ludGVyZmFjZVR5cGUoKSkKKyAgICAgIE9TIDw8ICIgOiAiIDw8IEVFRC0+Z2V0SW50ZXJmYWNlVHlwZSgpOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICIgOiAobm8gdHlwZSBzZXQpIjsKKyAgICBicmVhazsKKyAgfQogICBjYXNlIERlY2xDb250ZXh0S2luZDo6SW5pdGlhbGl6ZXI6CiAgICAgc3dpdGNoIChjYXN0PEluaXRpYWxpemVyPih0aGlzKS0+Z2V0SW5pdGlhbGl6ZXJLaW5kKCkpIHsKICAgICBjYXNlIEluaXRpYWxpemVyS2luZDo6UGF0dGVybkJpbmRpbmc6IHsKQEAgLTkyMCw2ICs5MzUsOCBAQAogICAgICAgcmV0dXJuIERlY2xDb250ZXh0S2luZDo6VG9wTGV2ZWxDb2RlRGVjbDsKICAgICBjYXNlIERlY2xLaW5kOjpTdWJzY3JpcHQ6CiAgICAgICByZXR1cm4gRGVjbENvbnRleHRLaW5kOjpTdWJzY3JpcHREZWNsOworICAgIGNhc2UgRGVjbEtpbmQ6OkVudW1FbGVtZW50OgorICAgICAgcmV0dXJuIERlY2xDb250ZXh0S2luZDo6RW51bUVsZW1lbnREZWNsOwogICAgIGNhc2UgRGVjbEtpbmQ6OkV4dGVuc2lvbjoKICAgICAgIHJldHVybiBEZWNsQ29udGV4dEtpbmQ6OkV4dGVuc2lvbkRlY2w7CiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2xpYi9BU1QvRGlhZ25vc3RpY0VuZ2luZS5jcHAgYi9saWIvQVNUL0RpYWdub3N0aWNFbmdpbmUuY3BwCmluZGV4IGVhODBiYzQuLjZmYjhkMTEgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvRGlhZ25vc3RpY0VuZ2luZS5jcHAKKysrIGIvbGliL0FTVC9EaWFnbm9zdGljRW5naW5lLmNwcApAQCAtNzY3LDYgKzc2Nyw3IEBACiAgICAgICAgICAgICBjYXNlIERlY2xDb250ZXh0S2luZDo6QWJzdHJhY3RDbG9zdXJlRXhwcjoKICAgICAgICAgICAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpBYnN0cmFjdEZ1bmN0aW9uRGVjbDoKICAgICAgICAgICAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpTdWJzY3JpcHREZWNsOgorICAgICAgICAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkVudW1FbGVtZW50RGVjbDoKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9BU1QvTmFtZUxvb2t1cC5jcHAgYi9saWIvQVNUL05hbWVMb29rdXAuY3BwCmluZGV4IGYzY2E2YmMuLjIyMGM4ZDQgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvTmFtZUxvb2t1cC5jcHAKKysrIGIvbGliL0FTVC9OYW1lTG9va3VwLmNwcApAQCAtNTk0LDYgKzU5NCwxNCBAQAogICBhdXRvICpleHREZWNsID0gZGVjbC5keW5fY2FzdDxFeHRlbnNpb25EZWNsICo+KCk7CiAKICAgRGVjbENvbnRleHQgKmRjID0gcHJvdG9EZWNsID8gKERlY2xDb250ZXh0ICopcHJvdG9EZWNsIDogKERlY2xDb250ZXh0ICopZXh0RGVjbDsKKworICAvLyBBIHByb3RvY29sIG9yIGV4dGVuc2lvbiAnd2hlcmUnIGNsYXVzZSBjYW4gcmVmZXJlbmNlIGFzc29jaWF0ZWQgdHlwZXMgb2YKKyAgLy8gdGhlIHByb3RvY29sIGl0c2VsZiwgc28gd2UgaGF2ZSB0byBzdGFydCB1bnF1YWxpZmllZCBsb29rdXAgZnJvbSAnZGMnLgorICAvLworICAvLyBIb3dldmVyLCB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGEgJ1NlbGYnIGNvbmZvcm1hbmNlIGNvbnN0cmFpbnQgbXVzdCBiZQorICAvLyByZXNvbHZlZCBiZWZvcmUgdW5xdWFsaWZpZWQgbG9va3VwIGludG8gJ2RjJyBjYW4gd29yaywgc28gd2UgbWFrZSBhbgorICAvLyBleGNlcHRpb24gaGVyZSBhbmQgYmVnaW4gbG9va3VwIGZyb20gdGhlIHBhcmVudCBjb250ZXh0IGluc3RlYWQuCisgIGF1dG8gKmxvb2t1cERDID0gZGMtPmdldFBhcmVudCgpOwogICBhdXRvIHJlcXVpcmVtZW50cyA9IHByb3RvRGVjbCA/IHByb3RvRGVjbC0+Z2V0VHJhaWxpbmdXaGVyZUNsYXVzZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZXh0RGVjbC0+Z2V0VHJhaWxpbmdXaGVyZUNsYXVzZSgpOwogCkBAIC02MjMsNyArNjMxLDcgQEAKICAgICAvLyBSZXNvbHZlIHRoZSByaWdodC1oYW5kIHNpZGUuCiAgICAgRGlyZWN0bHlSZWZlcmVuY2VkVHlwZURlY2xzIHJoc0RlY2xzOwogICAgIGlmIChhdXRvIHR5cGVSZXByID0gcmVxLmdldENvbnN0cmFpbnRSZXByKCkpIHsKLSAgICAgIHJoc0RlY2xzID0gZGlyZWN0UmVmZXJlbmNlc0ZvclR5cGVSZXByKGV2YWx1YXRvciwgY3R4LCB0eXBlUmVwciwgZGMpOworICAgICAgcmhzRGVjbHMgPSBkaXJlY3RSZWZlcmVuY2VzRm9yVHlwZVJlcHIoZXZhbHVhdG9yLCBjdHgsIHR5cGVSZXByLCBsb29rdXBEQyk7CiAgICAgfSBlbHNlIGlmIChUeXBlIHR5cGUgPSByZXEuZ2V0Q29uc3RyYWludCgpKSB7CiAgICAgICByaHNEZWNscyA9IGRpcmVjdFJlZmVyZW5jZXNGb3JUeXBlKHR5cGUpOwogICAgIH0KQEAgLTE0MzcsNiArMTQ0NSwxMSBAQAogfQogCiB2b2lkIE5vbWluYWxUeXBlRGVjbDo6YWRkZWRNZW1iZXIoRGVjbCAqbWVtYmVyKSB7CisgIC8vIFJlbWVtYmVyIGlmIHdlIGFkZGVkIGEgZGVzdHJ1Y3Rvci4KKyAgaWYgKGF1dG8gKkNEID0gZHluX2Nhc3Q8Q2xhc3NEZWNsPih0aGlzKSkKKyAgICBpZiAoaXNhPERlc3RydWN0b3JEZWNsPihtZW1iZXIpKQorICAgICAgQ0QtPnNldEhhc0Rlc3RydWN0b3IoKTsKKwogICAvLyBJZiB3ZSBoYXZlIGEgbG9va3VwIHRhYmxlLCBhZGQgdGhlIG5ldyBtZW1iZXIgdG8gaXQuCiAgIGlmIChMb29rdXBUYWJsZS5nZXRQb2ludGVyKCkpIHsKICAgICBMb29rdXBUYWJsZS5nZXRQb2ludGVyKCktPmFkZE1lbWJlcihtZW1iZXIpOwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9OYW1lTG9va3VwUmVxdWVzdHMuY3BwIGIvbGliL0FTVC9OYW1lTG9va3VwUmVxdWVzdHMuY3BwCmluZGV4IDI0NWU2Y2EuLjBhODJkYjYgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvTmFtZUxvb2t1cFJlcXVlc3RzLmNwcAorKysgYi9saWIvQVNUL05hbWVMb29rdXBSZXF1ZXN0cy5jcHAKQEAgLTc0LDYgKzc0LDMwIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogLy8gU3VwZXJjbGFzcyBkZWNsYXJhdGlvbiBjb21wdXRhdGlvbi4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCitPcHRpb25hbDxDbGFzc0RlY2wgKj4gU3VwZXJjbGFzc0RlY2xSZXF1ZXN0OjpnZXRDYWNoZWRSZXN1bHQoKSBjb25zdCB7CisgIGF1dG8gbm9taW5hbERlY2wgPSBzdGQ6OmdldDwwPihnZXRTdG9yYWdlKCkpOworCisgIGlmIChhdXRvICpjbGFzc0RlY2wgPSBkeW5fY2FzdDxDbGFzc0RlY2w+KG5vbWluYWxEZWNsKSkKKyAgICBpZiAoY2xhc3NEZWNsLT5MYXp5U2VtYW50aWNJbmZvLlN1cGVyY2xhc3NEZWNsLmdldEludCgpKQorICAgICAgcmV0dXJuIGNsYXNzRGVjbC0+TGF6eVNlbWFudGljSW5mby5TdXBlcmNsYXNzRGVjbC5nZXRQb2ludGVyKCk7CisKKyAgaWYgKGF1dG8gKnByb3RvY29sRGVjbCA9IGR5bl9jYXN0PFByb3RvY29sRGVjbD4obm9taW5hbERlY2wpKQorICAgIGlmIChwcm90b2NvbERlY2wtPkxhenlTZW1hbnRpY0luZm8uU3VwZXJjbGFzc0RlY2wuZ2V0SW50KCkpCisgICAgICByZXR1cm4gcHJvdG9jb2xEZWNsLT5MYXp5U2VtYW50aWNJbmZvLlN1cGVyY2xhc3NEZWNsLmdldFBvaW50ZXIoKTsKKworICByZXR1cm4gTm9uZTsKK30KKwordm9pZCBTdXBlcmNsYXNzRGVjbFJlcXVlc3Q6OmNhY2hlUmVzdWx0KENsYXNzRGVjbCAqdmFsdWUpIGNvbnN0IHsKKyAgYXV0byBub21pbmFsRGVjbCA9IHN0ZDo6Z2V0PDA+KGdldFN0b3JhZ2UoKSk7CisKKyAgaWYgKGF1dG8gKmNsYXNzRGVjbCA9IGR5bl9jYXN0PENsYXNzRGVjbD4obm9taW5hbERlY2wpKQorICAgIGNsYXNzRGVjbC0+TGF6eVNlbWFudGljSW5mby5TdXBlcmNsYXNzRGVjbC5zZXRQb2ludGVyQW5kSW50KHZhbHVlLCB0cnVlKTsKKworICBpZiAoYXV0byAqcHJvdG9jb2xEZWNsID0gZHluX2Nhc3Q8UHJvdG9jb2xEZWNsPihub21pbmFsRGVjbCkpCisgICAgcHJvdG9jb2xEZWNsLT5MYXp5U2VtYW50aWNJbmZvLlN1cGVyY2xhc3NEZWNsLnNldFBvaW50ZXJBbmRJbnQodmFsdWUsIHRydWUpOworfQorCiB2b2lkIFN1cGVyY2xhc3NEZWNsUmVxdWVzdDo6ZGlhZ25vc2VDeWNsZShEaWFnbm9zdGljRW5naW5lICZkaWFncykgY29uc3QgewogICAvLyBGSVhNRTogSW1wcm92ZSB0aGlzIGRpYWdub3N0aWMuCiAgIGF1dG8gc3ViamVjdERlY2wgPSBzdGQ6OmdldDwwPihnZXRTdG9yYWdlKCkpOwpAQCAtODcsNyArMTExLDcgQEAKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLS8vIFN1cGVyY2xhc3MgZGVjbGFyYXRpb24gY29tcHV0YXRpb24uCisvLyBFeHRlbmRlZCBub21pbmFsIGNvbXB1dGF0aW9uLgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KIE9wdGlvbmFsPE5vbWluYWxUeXBlRGVjbCAqPiBFeHRlbmRlZE5vbWluYWxSZXF1ZXN0OjpnZXRDYWNoZWRSZXN1bHQoKSBjb25zdCB7CiAgIC8vIE5vdGU6IGlmIHdlIGZhaWwgdG8gY29tcHV0ZSBhbnkgbm9taW5hbCBkZWNsYXJhdGlvbiwgaXQncyBjb25zaWRlcmVkCmRpZmYgLS1naXQgYS9saWIvQVNUL1R5cGUuY3BwIGIvbGliL0FTVC9UeXBlLmNwcAppbmRleCA2ZjI1MGJjLi4xNjNiNTYwIDEwMDY0NAotLS0gYS9saWIvQVNUL1R5cGUuY3BwCisrKyBiL2xpYi9BU1QvVHlwZS5jcHAKQEAgLTI2ODMsNiArMjY4MywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RGbi0+Z2V0UmVzdWx0KCksIGdldEV4dEluZm8oKSk7CiB9CiAKK0NhbkZ1bmN0aW9uVHlwZQorQ2FuR2VuZXJpY0Z1bmN0aW9uVHlwZTo6c3Vic3RHZW5lcmljQXJncyhTdWJzdGl0dXRpb25NYXAgc3VicykgY29uc3QgeworICByZXR1cm4gY2FzdDxGdW5jdGlvblR5cGU+KAorICAgICAgICAgICBnZXRQb2ludGVyKCktPnN1YnN0R2VuZXJpY0FyZ3Moc3VicyktPmdldENhbm9uaWNhbFR5cGUoKSk7Cit9CisKIHN0YXRpYyBUeXBlIGdldE1lbWJlckZvckJhc2VUeXBlKExvb2t1cENvbmZvcm1hbmNlRm4gbG9va3VwQ29uZm9ybWFuY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBvcmlnQmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgc3Vic3RCYXNlLApkaWZmIC0tZ2l0IGEvbGliL0FTVC9UeXBlQ2hlY2tSZXF1ZXN0cy5jcHAgYi9saWIvQVNUL1R5cGVDaGVja1JlcXVlc3RzLmNwcAppbmRleCA0NDJhZGNiLi40NjZmZjdjIDEwMDY0NAotLS0gYS9saWIvQVNUL1R5cGVDaGVja1JlcXVlc3RzLmNwcAorKysgYi9saWIvQVNUL1R5cGVDaGVja1JlcXVlc3RzLmNwcApAQCAtMTI1LDEyICsxMjUsMTIgQEAKICAgYXV0byBub21pbmFsRGVjbCA9IHN0ZDo6Z2V0PDA+KGdldFN0b3JhZ2UoKSk7CiAKICAgaWYgKGF1dG8gKmNsYXNzRGVjbCA9IGR5bl9jYXN0PENsYXNzRGVjbD4obm9taW5hbERlY2wpKQotICAgIGlmIChjbGFzc0RlY2wtPkxhenlTZW1hbnRpY0luZm8uU3VwZXJjbGFzcy5nZXRJbnQoKSkKLSAgICAgIHJldHVybiBjbGFzc0RlY2wtPkxhenlTZW1hbnRpY0luZm8uU3VwZXJjbGFzcy5nZXRQb2ludGVyKCk7CisgICAgaWYgKGNsYXNzRGVjbC0+TGF6eVNlbWFudGljSW5mby5TdXBlcmNsYXNzVHlwZS5nZXRJbnQoKSkKKyAgICAgIHJldHVybiBjbGFzc0RlY2wtPkxhenlTZW1hbnRpY0luZm8uU3VwZXJjbGFzc1R5cGUuZ2V0UG9pbnRlcigpOwogCiAgIGlmIChhdXRvICpwcm90b2NvbERlY2wgPSBkeW5fY2FzdDxQcm90b2NvbERlY2w+KG5vbWluYWxEZWNsKSkKLSAgICBpZiAocHJvdG9jb2xEZWNsLT5MYXp5U2VtYW50aWNJbmZvLlN1cGVyY2xhc3MuZ2V0SW50KCkpCi0gICAgICByZXR1cm4gcHJvdG9jb2xEZWNsLT5MYXp5U2VtYW50aWNJbmZvLlN1cGVyY2xhc3MuZ2V0UG9pbnRlcigpOworICAgIGlmIChwcm90b2NvbERlY2wtPkxhenlTZW1hbnRpY0luZm8uU3VwZXJjbGFzc1R5cGUuZ2V0SW50KCkpCisgICAgICByZXR1cm4gcHJvdG9jb2xEZWNsLT5MYXp5U2VtYW50aWNJbmZvLlN1cGVyY2xhc3NUeXBlLmdldFBvaW50ZXIoKTsKIAogICByZXR1cm4gTm9uZTsKIH0KQEAgLTEzOSwxMCArMTM5LDEwIEBACiAgIGF1dG8gbm9taW5hbERlY2wgPSBzdGQ6OmdldDwwPihnZXRTdG9yYWdlKCkpOwogCiAgIGlmIChhdXRvICpjbGFzc0RlY2wgPSBkeW5fY2FzdDxDbGFzc0RlY2w+KG5vbWluYWxEZWNsKSkKLSAgICBjbGFzc0RlY2wtPkxhenlTZW1hbnRpY0luZm8uU3VwZXJjbGFzcy5zZXRQb2ludGVyQW5kSW50KHZhbHVlLCB0cnVlKTsKKyAgICBjbGFzc0RlY2wtPkxhenlTZW1hbnRpY0luZm8uU3VwZXJjbGFzc1R5cGUuc2V0UG9pbnRlckFuZEludCh2YWx1ZSwgdHJ1ZSk7CiAKICAgaWYgKGF1dG8gKnByb3RvY29sRGVjbCA9IGR5bl9jYXN0PFByb3RvY29sRGVjbD4obm9taW5hbERlY2wpKQotICAgIHByb3RvY29sRGVjbC0+TGF6eVNlbWFudGljSW5mby5TdXBlcmNsYXNzLnNldFBvaW50ZXJBbmRJbnQodmFsdWUsIHRydWUpOworICAgIHByb3RvY29sRGVjbC0+TGF6eVNlbWFudGljSW5mby5TdXBlcmNsYXNzVHlwZS5zZXRQb2ludGVyQW5kSW50KHZhbHVlLCB0cnVlKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KZGlmZiAtLWdpdCBhL2xpYi9DbGFuZ0ltcG9ydGVyL0NsYW5nSW1wb3J0ZXIuY3BwIGIvbGliL0NsYW5nSW1wb3J0ZXIvQ2xhbmdJbXBvcnRlci5jcHAKaW5kZXggMjUwY2U5OS4uYmQzYWU2NyAxMDA2NDQKLS0tIGEvbGliL0NsYW5nSW1wb3J0ZXIvQ2xhbmdJbXBvcnRlci5jcHAKKysrIGIvbGliL0NsYW5nSW1wb3J0ZXIvQ2xhbmdJbXBvcnRlci5jcHAKQEAgLTExNjUsNiArMTE2NSwxNCBAQAogICBpZiAoIUR1bW15SW5jbHVkZUJ1ZmZlci5pc1ZhbGlkKCkpIHsKICAgICBjbGFuZzo6U291cmNlTG9jYXRpb24gaW5jbHVkZUxvYyA9CiAgICAgICAgIHNyY01nci5nZXRMb2NGb3JTdGFydE9mRmlsZShzcmNNZ3IuZ2V0TWFpbkZpbGVJRCgpKTsKKyAgICAvLyBQaWNraW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1haW4gRmlsZUlEIGFzIGluY2x1ZGUgbG9jYXRpb24gaXMgYWxzbyB3aGF0CisgICAgLy8gdGhlIGNsYW5nIFBDSCBtZWNoYW5pc20gaXMgZG9pbmcgKHNlZQorICAgIC8vIGNsYW5nOjpBU1RSZWFkZXI6OmdldEltcG9ydExvY2F0aW9uKCkpLiBDaG9vc2UgdGhlIG5leHQgc291cmNlIGxvY2F0aW9uCisgICAgLy8gaGVyZSB0byBhdm9pZCBoYXZpbmcgdGhlIGV4YWN0IHNhbWUgaW1wb3J0IGxvY2F0aW9uIGFzIHRoZSBjbGFuZyBQQ0guCisgICAgLy8gT3RoZXJ3aXNlLCBpZiB3ZSBhcmUgdXNpbmcgYSBQQ0ggZm9yIGJyaWRnaW5nIGhlYWRlciwgd2UnbGwgaGF2ZQorICAgIC8vIHByb2JsZW1zIHdpdGggc291cmNlIG9yZGVyIGNvbXBhcmlzb25zIG9mIGNsYW5nIHNvdXJjZSBsb2NhdGlvbnMgbm90CisgICAgLy8gYmVpbmcgZGV0ZXJtaW5pc3RpYy4KKyAgICBpbmNsdWRlTG9jID0gaW5jbHVkZUxvYy5nZXRMb2NXaXRoT2Zmc2V0KDEpOwogICAgIER1bW15SW5jbHVkZUJ1ZmZlciA9IHNyY01nci5jcmVhdGVGaWxlSUQoCiAgICAgICAgIGxsdm06Om1ha2VfdW5pcXVlPFplcm9GaWxsZWRNZW1vcnlCdWZmZXI+KAogICAgICAgICAgIDI1NioxMDI0LCBTdHJpbmdSZWYobW9kdWxlSW1wb3J0QnVmZmVyTmFtZSkpLApAQCAtMTM0NCw3ICsxMzUyLDEyIEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGltcG9ydExpbmV7IiNpbXBvcnQgXCIifTsKKyAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBpbXBvcnRMaW5lOworICBpZiAoSW1wbC5Td2lmdENvbnRleHQuTGFuZ09wdHMuRW5hYmxlT2JqQ0ludGVyb3ApCisgICAgaW1wb3J0TGluZSA9ICIjaW1wb3J0IFwiIjsKKyAgZWxzZQorICAgIGltcG9ydExpbmUgPSAiI2luY2x1ZGUgXCIiOworCiAgIGltcG9ydExpbmUgKz0gaGVhZGVyOwogICBpbXBvcnRMaW5lICs9ICJcIlxuIjsKIApkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0Zyb250ZW5kLmNwcCBiL2xpYi9Gcm9udGVuZC9Gcm9udGVuZC5jcHAKaW5kZXggM2MyYmIyYi4uNTU2NmM2ZCAxMDA2NDQKLS0tIGEvbGliL0Zyb250ZW5kL0Zyb250ZW5kLmNwcAorKysgYi9saWIvRnJvbnRlbmQvRnJvbnRlbmQuY3BwCkBAIC03MzUsMTIgKzczNSwxMCBAQAogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8RGVsYXllZFBhcnNpbmdDYWxsYmFja3M+Ci1Db21waWxlckluc3RhbmNlOjpjb21wdXRlRGVsYXllZFBhcnNpbmdDYWxsYmFjayhib29sIGlzUHJpbWFyeSkgeworQ29tcGlsZXJJbnN0YW5jZTo6Y29tcHV0ZURlbGF5ZWRQYXJzaW5nQ2FsbGJhY2soKSB7CiAgIGlmIChJbnZvY2F0aW9uLmlzQ29kZUNvbXBsZXRpb24oKSkKICAgICByZXR1cm4gbGx2bTo6bWFrZV91bmlxdWU8Q29kZUNvbXBsZXRlRGVsYXllZENhbGxiYWNrcz4oCiAgICAgICAgIFNvdXJjZU1nci5nZXRDb2RlQ29tcGxldGlvbkxvYygpKTsKLSAgaWYgKCFpc1ByaW1hcnkpCi0gICAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPEFsd2F5c0RlbGF5ZWRDYWxsYmFja3M+KCk7CiAgIHJldHVybiBudWxscHRyOwogfQogCkBAIC03NTQsMjIgKzc1MiwxMyBAQAogdm9pZCBDb21waWxlckluc3RhbmNlOjpwYXJzZUFuZENoZWNrVHlwZXNVcFRvKAogICAgIGNvbnN0IEltcGxpY2l0SW1wb3J0cyAmaW1wbGljaXRJbXBvcnRzLCBTb3VyY2VGaWxlOjpBU1RTdGFnZV90IGxpbWl0U3RhZ2UpIHsKICAgRnJvbnRlbmRTdGF0c1RyYWNlciB0cmFjZXIoQ29udGV4dC0+U3RhdHMsICJwYXJzZS1hbmQtY2hlY2stdHlwZXMiKTsKLSAgLy8gRGVsYXllZCBwYXJzaW5nIGNhbGxiYWNrIGZvciB0aGUgcHJpbWFyeSBmaWxlLCBvciBhbGwgZmlsZXMKLSAgLy8gaW4gbm9uLVdNTyBtb2RlLgotICBzdGQ6OnVuaXF1ZV9wdHI8RGVsYXllZFBhcnNpbmdDYWxsYmFja3M+IFByaW1hcnlEZWxheWVkQ0J7Ci0gICAgICBjb21wdXRlRGVsYXllZFBhcnNpbmdDYWxsYmFjayh0cnVlKX07Ci0KLSAgLy8gRGVsYXllZCBwYXJzaW5nIGNhbGxiYWNrIGZvciBub24tcHJpbWFyeSBmaWxlcy4gTm90IHVzZWQgaW4KLSAgLy8gV01PIG1vZGUuCi0gIHN0ZDo6dW5pcXVlX3B0cjxEZWxheWVkUGFyc2luZ0NhbGxiYWNrcz4gU2Vjb25kYXJ5RGVsYXllZENCewotICAgICAgY29tcHV0ZURlbGF5ZWRQYXJzaW5nQ2FsbGJhY2soZmFsc2UpfTsKKyAgc3RkOjp1bmlxdWVfcHRyPERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzPiBEZWxheWVkQ0J7CisgICAgICBjb21wdXRlRGVsYXllZFBhcnNpbmdDYWxsYmFjaygpfTsKIAogICBQZXJzaXN0ZW50UGFyc2VyU3RhdGUgUGVyc2lzdGVudFN0YXRlKGdldEFTVENvbnRleHQoKSk7CiAKICAgYm9vbCBoYWRMb2FkRXJyb3IgPSBwYXJzZVBhcnRpYWxNb2R1bGVzQW5kTGlicmFyeUZpbGVzKAotICAgICAgaW1wbGljaXRJbXBvcnRzLCBQZXJzaXN0ZW50U3RhdGUsCi0gICAgICBQcmltYXJ5RGVsYXllZENCLmdldCgpLAotICAgICAgU2Vjb25kYXJ5RGVsYXllZENCLmdldCgpKTsKKyAgICAgIGltcGxpY2l0SW1wb3J0cywgUGVyc2lzdGVudFN0YXRlLCBEZWxheWVkQ0IuZ2V0KCkpOwogICBpZiAoSW52b2NhdGlvbi5pc0NvZGVDb21wbGV0aW9uKCkpIHsKICAgICAvLyBXaGVuIHdlIGFyZSBkb2luZyBjb2RlIGNvbXBsZXRpb24sIG1ha2Ugc3VyZSB0byBlbWl0IGF0IGxlYXN0IG9uZQogICAgIC8vIGRpYWdub3N0aWMsIHNvIHRoYXQgQVNUQ29udGV4dCBpcyBtYXJrZWQgYXMgZXJyb25lb3VzLiAgSW4gdGhpcyBjYXNlCkBAIC03ODgsNyArNzc3LDcgQEAKICAgLy8gaW50ZXJ3aW5lZC4KICAgaWYgKE1haW5CdWZmZXJJRCAhPSBOT19TVUNIX0JVRkZFUikgewogICAgIHBhcnNlQW5kVHlwZUNoZWNrTWFpbkZpbGVVcFRvKGxpbWl0U3RhZ2UsIFBlcnNpc3RlbnRTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5RGVsYXllZENCLmdldCgpLCBUeXBlQ2hlY2tPcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxheWVkQ0IuZ2V0KCksIFR5cGVDaGVja09wdGlvbnMpOwogICB9CiAKICAgYXNzZXJ0KGxsdm06OmFsbF9vZihNYWluTW9kdWxlLT5nZXRGaWxlcygpLCBbXShjb25zdCBGaWxlVW5pdCAqRmlsZSkgLT4gYm9vbCB7CkBAIC04MjksOCArODE4LDcgQEAKIHZvaWQgQ29tcGlsZXJJbnN0YW5jZTo6cGFyc2VMaWJyYXJ5RmlsZSgKICAgICB1bnNpZ25lZCBCdWZmZXJJRCwgY29uc3QgSW1wbGljaXRJbXBvcnRzICZpbXBsaWNpdEltcG9ydHMsCiAgICAgUGVyc2lzdGVudFBhcnNlclN0YXRlICZQZXJzaXN0ZW50U3RhdGUsCi0gICAgRGVsYXllZFBhcnNpbmdDYWxsYmFja3MgKlByaW1hcnlEZWxheWVkQ0IsCi0gICAgRGVsYXllZFBhcnNpbmdDYWxsYmFja3MgKlNlY29uZGFyeURlbGF5ZWRDQikgeworICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpEZWxheWVkQ0IpIHsKICAgRnJvbnRlbmRTdGF0c1RyYWNlciB0cmFjZXIoQ29udGV4dC0+U3RhdHMsICJwYXJzZS1saWJyYXJ5LWZpbGUiKTsKIAogICBhdXRvICpOZXh0SW5wdXQgPSBjcmVhdGVTb3VyY2VGaWxlRm9yTWFpbk1vZHVsZSgKQEAgLTgzOCw3ICs4MjYsNiBAQAogICBhZGRBZGRpdGlvbmFsSW5pdGlhbEltcG9ydHNUbyhOZXh0SW5wdXQsIGltcGxpY2l0SW1wb3J0cyk7CiAKICAgYXV0byBJc1ByaW1hcnkgPSBpc1dob2xlTW9kdWxlQ29tcGlsYXRpb24oKSB8fCBpc1ByaW1hcnlJbnB1dChCdWZmZXJJRCk7Ci0gIGF1dG8gKkRlbGF5ZWRDQiA9IElzUHJpbWFyeSA/IFByaW1hcnlEZWxheWVkQ0IgOiBTZWNvbmRhcnlEZWxheWVkQ0I7CiAKICAgYXV0byAmRGlhZ3MgPSBOZXh0SW5wdXQtPmdldEFTVENvbnRleHQoKS5EaWFnczsKICAgYXV0byBEaWRTdXBwcmVzc1dhcm5pbmdzID0gRGlhZ3MuZ2V0U3VwcHJlc3NXYXJuaW5ncygpOwpAQCAtODQ5LDcgKzgzNiw3IEBACiAgICAgLy8gUGFyc2VyIG1heSBzdG9wIGF0IHNvbWUgZXJyb25lb3VzIGNvbnN0cnVjdGlvbnMgbGlrZSAjZWxzZSwgI2VuZGlmCiAgICAgLy8gb3IgJ30nIGluIHNvbWUgY2FzZXMsIGNvbnRpbnVlIHBhcnNpbmcgdW50aWwgd2UgYXJlIGRvbmUKICAgICBwYXJzZUludG9Tb3VyY2VGaWxlKCpOZXh0SW5wdXQsIEJ1ZmZlcklELCAmRG9uZSwgbnVsbHB0ciwgJlBlcnNpc3RlbnRTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRDQik7CisgICAgICAgICAgICAgICAgICAgICAgICBEZWxheWVkQ0IsIC8qRGVsYXllZEJvZHlQYXJzaW5nPSovIUlzUHJpbWFyeSk7CiAgIH0gd2hpbGUgKCFEb25lKTsKIAogICBEaWFncy5zZXRTdXBwcmVzc1dhcm5pbmdzKERpZFN1cHByZXNzV2FybmluZ3MpOwpAQCAtODc4LDggKzg2NSw3IEBACiBib29sIENvbXBpbGVySW5zdGFuY2U6OnBhcnNlUGFydGlhbE1vZHVsZXNBbmRMaWJyYXJ5RmlsZXMoCiAgICAgY29uc3QgSW1wbGljaXRJbXBvcnRzICZpbXBsaWNpdEltcG9ydHMsCiAgICAgUGVyc2lzdGVudFBhcnNlclN0YXRlICZQZXJzaXN0ZW50U3RhdGUsCi0gICAgRGVsYXllZFBhcnNpbmdDYWxsYmFja3MgKlByaW1hcnlEZWxheWVkQ0IsCi0gICAgRGVsYXllZFBhcnNpbmdDYWxsYmFja3MgKlNlY29uZGFyeURlbGF5ZWRDQikgeworICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpEZWxheWVkQ0IpIHsKICAgRnJvbnRlbmRTdGF0c1RyYWNlciB0cmFjZXIoQ29udGV4dC0+U3RhdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZS1wYXJ0aWFsLW1vZHVsZXMtYW5kLWxpYnJhcnktZmlsZXMiKTsKICAgYm9vbCBoYWRMb2FkRXJyb3IgPSBmYWxzZTsKQEAgLTg5NCw4ICs4ODAsNyBAQAogICAvLyBUaGVuIHBhcnNlIGFsbCB0aGUgbGlicmFyeSBmaWxlcy4KICAgZm9yIChhdXRvIEJ1ZmZlcklEIDogSW5wdXRTb3VyY2VDb2RlQnVmZmVySURzKSB7CiAgICAgaWYgKEJ1ZmZlcklEICE9IE1haW5CdWZmZXJJRCkgewotICAgICAgcGFyc2VMaWJyYXJ5RmlsZShCdWZmZXJJRCwgaW1wbGljaXRJbXBvcnRzLCBQZXJzaXN0ZW50U3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlEZWxheWVkQ0IsIFNlY29uZGFyeURlbGF5ZWRDQik7CisgICAgICBwYXJzZUxpYnJhcnlGaWxlKEJ1ZmZlcklELCBpbXBsaWNpdEltcG9ydHMsIFBlcnNpc3RlbnRTdGF0ZSwgRGVsYXllZENCKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIGhhZExvYWRFcnJvcjsKQEAgLTkyOCw3ICs5MTMsNyBAQAogICAgIC8vIHdpdGggJ3NpbCcgZGVmaW5pdGlvbnMuCiAgICAgcGFyc2VJbnRvU291cmNlRmlsZShNYWluRmlsZSwgTWFpbkZpbGUuZ2V0QnVmZmVySUQoKS5nZXRWYWx1ZSgpLCAmRG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVNJTE1vZHVsZSA/ICZTSUxDb250ZXh0IDogbnVsbHB0ciwgJlBlcnNpc3RlbnRTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzZUNCKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzZUNCLCAvKkRlbGF5ZWRCb2R5UGFyc2luZz0qL2ZhbHNlKTsKIAogICAgIGlmIChtYWluSXNQcmltYXJ5ICYmIChEb25lIHx8IEN1clRVRWxlbSA8IE1haW5GaWxlLkRlY2xzLnNpemUoKSkpIHsKICAgICAgIHN3aXRjaCAoTGltaXRTdGFnZSkgewpAQCAtMTA1NSwxMSArMTA0MCwxNCBAQAogICAgIGlmIChCdWZmZXJJRCA9PSBNYWluQnVmZmVySUQpCiAgICAgICBjb250aW51ZTsKIAorICAgIGF1dG8gSXNQcmltYXJ5ID0gaXNXaG9sZU1vZHVsZUNvbXBpbGF0aW9uKCkgfHwgaXNQcmltYXJ5SW5wdXQoQnVmZmVySUQpOworCiAgICAgU291cmNlRmlsZSAqTmV4dElucHV0ID0gY3JlYXRlU291cmNlRmlsZUZvck1haW5Nb2R1bGUoCiAgICAgICAgIFNvdXJjZUZpbGVLaW5kOjpMaWJyYXJ5LCBTb3VyY2VGaWxlOjpJbXBsaWNpdE1vZHVsZUltcG9ydEtpbmQ6Ok5vbmUsCiAgICAgICAgIEJ1ZmZlcklEKTsKIAotICAgIHBhcnNlSW50b1NvdXJjZUZpbGVGdWxsKCpOZXh0SW5wdXQsIEJ1ZmZlcklELCAmUGVyc2lzdGVudFN0YXRlKTsKKyAgICBwYXJzZUludG9Tb3VyY2VGaWxlRnVsbCgqTmV4dElucHV0LCBCdWZmZXJJRCwgJlBlcnNpc3RlbnRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAvKkRlbGF5Qm9keVBhcnNpbmc9Ki8hSXNQcmltYXJ5KTsKICAgfQogCiAgIC8vIE5vdyBwYXJzZSB0aGUgbWFpbiBmaWxlLgpAQCAtMTA2OSw3ICsxMDU3LDggQEAKICAgICBNYWluRmlsZS5TeW50YXhQYXJzaW5nQ2FjaGUgPSBJbnZvY2F0aW9uLmdldE1haW5GaWxlU3ludGF4UGFyc2luZ0NhY2hlKCk7CiAKICAgICBwYXJzZUludG9Tb3VyY2VGaWxlRnVsbChNYWluRmlsZSwgTWFpbkZpbGUuZ2V0QnVmZmVySUQoKS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQZXJzaXN0ZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQZXJzaXN0ZW50U3RhdGUsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypEZWxheUJvZHlQYXJzaW5nPSovZmFsc2UpOwogICB9CiAKICAgYXNzZXJ0KENvbnRleHQtPkxvYWRlZE1vZHVsZXMuc2l6ZSgpID09IDEgJiYKZGlmZiAtLWdpdCBhL2xpYi9JREUvQ29kZUNvbXBsZXRpb24uY3BwIGIvbGliL0lERS9Db2RlQ29tcGxldGlvbi5jcHAKaW5kZXggZTg3N2VhMi4uYmVkY2JjOSAxMDA2NDQKLS0tIGEvbGliL0lERS9Db2RlQ29tcGxldGlvbi5jcHAKKysrIGIvbGliL0lERS9Db2RlQ29tcGxldGlvbi5jcHAKQEAgLTE0MzcsNiArMTQzNyw3IEBACiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBjYXNlIERlY2xDb250ZXh0S2luZDo6QWJzdHJhY3RGdW5jdGlvbkRlY2w6CiAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlN1YnNjcmlwdERlY2w6CisgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkVudW1FbGVtZW50RGVjbDoKICAgICAgIHJldHVybiBmYWxzZTsKICAgICBkZWZhdWx0OgogICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9saWIvSURFL0V4cHJDb250ZXh0QW5hbHlzaXMuY3BwIGIvbGliL0lERS9FeHByQ29udGV4dEFuYWx5c2lzLmNwcAppbmRleCA4ODc1NzM3Li5hN2NkZjE3IDEwMDY0NAotLS0gYS9saWIvSURFL0V4cHJDb250ZXh0QW5hbHlzaXMuY3BwCisrKyBiL2xpYi9JREUvRXhwckNvbnRleHRBbmFseXNpcy5jcHAKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6Ok1vZHVsZToKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlNlcmlhbGl6ZWRMb2NhbDoKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlRvcExldmVsQ29kZURlY2w6CisgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2w6CiAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UuCiAgICAgYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2xpYi9JREUvUmVmYWN0b3JpbmcuY3BwIGIvbGliL0lERS9SZWZhY3RvcmluZy5jcHAKaW5kZXggODc5YjE1YS4uZDFhNGExOSAxMDA2NDQKLS0tIGEvbGliL0lERS9SZWZhY3RvcmluZy5jcHAKKysrIGIvbGliL0lERS9SZWZhY3RvcmluZy5jcHAKQEAgLTkzNSw2ICs5MzUsNyBAQAogICBzd2l0Y2ggKFJhbmdlSW5mby5SYW5nZUNvbnRleHQtPmdldENvbnRleHRLaW5kKCkpIHsKICAgY2FzZSBzd2lmdDo6RGVjbENvbnRleHRLaW5kOjpJbml0aWFsaXplcjoKICAgY2FzZSBzd2lmdDo6RGVjbENvbnRleHRLaW5kOjpTdWJzY3JpcHREZWNsOgorICBjYXNlIHN3aWZ0OjpEZWNsQ29udGV4dEtpbmQ6OkVudW1FbGVtZW50RGVjbDoKICAgY2FzZSBzd2lmdDo6RGVjbENvbnRleHRLaW5kOjpBYnN0cmFjdEZ1bmN0aW9uRGVjbDoKICAgY2FzZSBzd2lmdDo6RGVjbENvbnRleHRLaW5kOjpBYnN0cmFjdENsb3N1cmVFeHByOgogICBjYXNlIHN3aWZ0OjpEZWNsQ29udGV4dEtpbmQ6OlRvcExldmVsQ29kZURlY2w6CmRpZmYgLS1naXQgYS9saWIvSVJHZW4vR2VuQ2xhc3MuY3BwIGIvbGliL0lSR2VuL0dlbkNsYXNzLmNwcAppbmRleCA2N2FlMTMxLi4wZTg4NzdmIDEwMDY0NAotLS0gYS9saWIvSVJHZW4vR2VuQ2xhc3MuY3BwCisrKyBiL2xpYi9JUkdlbi9HZW5DbGFzcy5jcHAKQEAgLTE4NjcsNiArMTg2Nyw3IEBACiAgICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG91dHMob3V0KTsKIAogICAgICAgYXV0byBwcm9wVHkgPSBwcm9wLT5nZXRWYWx1ZUludGVyZmFjZVR5cGUoKTsKKyAgICAgIGF1dG8gcHJvcERDID0gcHJvcC0+Z2V0RGVjbENvbnRleHQoKTsKIAogICAgICAgLy8gRW1pdCB0aGUgdHlwZSBlbmNvZGluZyBmb3IgdGhlIHByb3BlcnR5LgogICAgICAgb3V0cyA8PCAnVCc7CkBAIC0xODg0LDEzICsxODg1LDEzIEBACiAgICAgICBpZiAocHJvcC0+Z2V0QXR0cnMoKS5oYXNBdHRyaWJ1dGU8TlNNYW5hZ2VkQXR0cj4oKSkKICAgICAgICAgb3V0cyA8PCAiLEQiOwogICAgICAgCi0gICAgICBhdXRvIGlzT2JqZWN0ID0gcHJvcC0+Z2V0RGVjbENvbnRleHQoKS0+bWFwVHlwZUludG9Db250ZXh0KHByb3BUeSkKKyAgICAgIGF1dG8gaXNPYmplY3QgPSBwcm9wREMtPm1hcFR5cGVJbnRvQ29udGV4dChwcm9wVHkpCiAgICAgICAgICAgLT5oYXNSZXRhaW5hYmxlUG9pbnRlclJlcHJlc2VudGF0aW9uKCk7CiAgICAgICBhdXRvIGhhc09iamVjdEVuY29kaW5nID0gdHlwZUVuY1swXSA9PSAnQCc7CiAgICAgICAKICAgICAgIC8vIERldGVybWluZSB0aGUgYXNzaWdubWVudCBzZW1hbnRpY3MuCiAgICAgICAvLyBHZXQtb25seSBwcm9wZXJ0aWVzIGFyZSAocmVhZG9ubHkpLgotICAgICAgaWYgKCFwcm9wLT5pc1NldHRhYmxlKHByb3AtPmdldERlY2xDb250ZXh0KCkpKQorICAgICAgaWYgKCFwcm9wLT5pc1NldHRhYmxlKHByb3BEQykpCiAgICAgICAgIG91dHMgPDwgIixSIjsKICAgICAgIC8vIFdlYWsgYW5kIFVub3duZWQgcHJvcGVydGllcyBhcmUgKHdlYWspLgogICAgICAgZWxzZSBpZiAocHJvcC0+Z2V0QXR0cnMoKS5oYXNBdHRyaWJ1dGU8UmVmZXJlbmNlT3duZXJzaGlwQXR0cj4oKSkKQEAgLTE5MDgsOSArMTkwOSwxMiBAQAogICAgICAgZWxzZQogICAgICAgICAodm9pZCkwOwogICAgICAgCi0gICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgYW5kIGhhcyBzdG9yYWdlLCBlbWl0IHRoZSBpdmFyCi0gICAgICAvLyBuYW1lIGxhc3QuCi0gICAgICBpZiAoIXByb3AtPmlzU3RhdGljKCkgJiYgcHJvcC0+aGFzU3RvcmFnZSgpKQorICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGlzIGFuIGluc3RhbmNlIHByb3BlcnR5IGFuZCBoYXMgc3RvcmFnZSwgYW5kIG1lYW53aGlsZQorICAgICAgLy8gaXRzIHR5cGUgaXMgdHJpdmlhbGx5IHJlcHJlc2VudGFibGUgaW4gT2JqQywgZW1pdCB0aGUgaXZhciBuYW1lIGxhc3QuCisgICAgICBib29sIGlzVHJpdmlhbGx5UmVwcmVzZW50YWJsZSA9CisgICAgICAgICAgcHJvcFR5LT5pc1RyaXZpYWxseVJlcHJlc2VudGFibGVJbihGb3JlaWduTGFuZ3VhZ2U6Ok9iamVjdGl2ZUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wREMpOworICAgICAgaWYgKCFwcm9wLT5pc1N0YXRpYygpICYmIHByb3AtPmhhc1N0b3JhZ2UoKSAmJiBpc1RyaXZpYWxseVJlcHJlc2VudGFibGUpCiAgICAgICAgIG91dHMgPDwgIixWIiA8PCBwcm9wLT5nZXROYW1lKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvSVJHZW4vR2VuRGVjbC5jcHAgYi9saWIvSVJHZW4vR2VuRGVjbC5jcHAKaW5kZXggYzNjYmUyNy4uOWE1YzliNCAxMDA2NDQKLS0tIGEvbGliL0lSR2VuL0dlbkRlY2wuY3BwCisrKyBiL2xpYi9JUkdlbi9HZW5EZWNsLmNwcApAQCAtNzcxLDYgKzc3MSw3IEBACiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpBYnN0cmFjdENsb3N1cmVFeHByOgogICBjYXNlIERlY2xDb250ZXh0S2luZDo6QWJzdHJhY3RGdW5jdGlvbkRlY2w6CiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpTdWJzY3JpcHREZWNsOgorICBjYXNlIERlY2xDb250ZXh0S2luZDo6RW51bUVsZW1lbnREZWNsOgogICBjYXNlIERlY2xDb250ZXh0S2luZDo6VG9wTGV2ZWxDb2RlRGVjbDoKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkluaXRpYWxpemVyOgogICBjYXNlIERlY2xDb250ZXh0S2luZDo6U2VyaWFsaXplZExvY2FsOgpAQCAtOTg0LDcgKzk4NSw3IEBACiAgIHJldHVybiBmLmdldFByb2ZpbGVyKCkgJiYgbS5nZXRPcHRpb25zKCkuRW1pdFByb2ZpbGVDb3ZlcmFnZU1hcHBpbmc7CiB9CiAKLXZvaWQgSVJHZW5lcmF0b3I6OmVtaXRHbG9iYWxUb3BMZXZlbChib29sIGVtaXRGb3JQYXJhbGxlbEVtaXNzaW9uKSB7Cit2b2lkIElSR2VuZXJhdG9yOjplbWl0R2xvYmFsVG9wTGV2ZWwoKSB7CiAgIC8vIEdlbmVyYXRlIG9yZGVyIG51bWJlcnMgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhlIFNJTCBtb2R1bGUgdGhhdAogICAvLyBjb3JyZXNwb25kIHRvIGRlZmluaXRpb25zIGluIHRoZSBMTFZNIG1vZHVsZS4KICAgdW5zaWduZWQgbmV4dE9yZGVyTnVtYmVyID0gMDsKQEAgLTk5NSwxMCArOTk2LDE0IEBACiAgIH0KIAogICAvLyBFbnN1cmUgdGhhdCByZWxhdGl2ZSBzeW1ib2xzIGFyZSBjb2xsb2NhdGVkIGluIHRoZSBzYW1lIExMVk0gbW9kdWxlLgotICBmb3IgKFNJTFdpdG5lc3NUYWJsZSAmd3QgOiBQcmltYXJ5SUdNLT5nZXRTSUxNb2R1bGUoKS5nZXRXaXRuZXNzVGFibGVMaXN0KCkpIHsKKyAgZm9yIChhdXRvICZ3dCA6IFByaW1hcnlJR00tPmdldFNJTE1vZHVsZSgpLmdldFdpdG5lc3NUYWJsZUxpc3QoKSkgewogICAgIEN1cnJlbnRJR01QdHIgSUdNID0gZ2V0R2VuTW9kdWxlKHd0LmdldERlY2xDb250ZXh0KCkpOwotICAgIGlmIChlbWl0Rm9yUGFyYWxsZWxFbWlzc2lvbikKLSAgICAgIElHTS0+ZW5zdXJlUmVsYXRpdmVTeW1ib2xDb2xsb2NhdGlvbih3dCk7CisgICAgZW5zdXJlUmVsYXRpdmVTeW1ib2xDb2xsb2NhdGlvbih3dCk7CisgIH0KKworICBmb3IgKGF1dG8gJnd0IDogUHJpbWFyeUlHTS0+Z2V0U0lMTW9kdWxlKCkuZ2V0RGVmYXVsdFdpdG5lc3NUYWJsZUxpc3QoKSkgeworICAgIEN1cnJlbnRJR01QdHIgSUdNID0gZ2V0R2VuTW9kdWxlKHd0LmdldFByb3RvY29sKCktPmdldERlY2xDb250ZXh0KCkpOworICAgIGVuc3VyZVJlbGF0aXZlU3ltYm9sQ29sbG9jYXRpb24od3QpOwogICB9CiAKICAgZm9yIChTSUxHbG9iYWxWYXJpYWJsZSAmdiA6IFByaW1hcnlJR00tPmdldFNJTE1vZHVsZSgpLmdldFNJTEdsb2JhbHMoKSkgewpAQCAtMTkwMyw2ICsxOTA4LDggQEAKICAgICAvLy8gQWRkIGEgemVybyBpbml0aWFsaXplci4KICAgICBpZiAoZm9yRGVmaW5pdGlvbikKICAgICAgIGd2YXItPnNldEluaXRpYWxpemVyKGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoc3RvcmFnZVR5cGVXaXRoQ29udGFpbmVyKSk7CisgICAgZWxzZQorICAgICAgZ3Zhci0+c2V0Q29tZGF0KG51bGxwdHIpOwogICB9CiAgIGxsdm06OkNvbnN0YW50ICphZGRyID0gZ3ZhcjsKICAgaWYgKHZhci0+aXNJbml0aWFsaXplZE9iamVjdCgpKSB7CkBAIC0yMTg0LDggKzIxOTEsMTEgQEAKICAgLy8gYXNzb2NpYXRlZCB3aXRoIGl0LiAgVGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gYWxsb3dzIHVzIHRvIGlkZW50aWZ5IHRoZQogICAvLyBAX3NpbGdlbl9uYW1lIGZ1bmN0aW9ucy4gIFRoZXNlIGFyZSBsb2NhbGx5IGRlZmluZWQgZnVuY3Rpb24gdGh1bmtzIHVzZWQgaW4KICAgLy8gdGhlIHN0YW5kYXJkIGxpYnJhcnkuICBEbyBub3QgZ2l2ZSB0aGVtIERMTEltcG9ydCBETEwgU3RvcmFnZS4KLSAgaWYgKHVzZURsbFN0b3JhZ2UoKSAmJiBmLT5oYXNDUmVmZXJlbmNlcygpICYmICFmb3JEZWZpbml0aW9uKQotICAgIGZuLT5zZXRETExTdG9yYWdlQ2xhc3MobGx2bTo6R2xvYmFsVmFsdWU6OkRlZmF1bHRTdG9yYWdlQ2xhc3MpOworICBpZiAoIWZvckRlZmluaXRpb24pIHsKKyAgICBmbi0+c2V0Q29tZGF0KG51bGxwdHIpOworICAgIGlmIChmLT5oYXNDUmVmZXJlbmNlcygpKQorICAgICAgZm4tPnNldERMTFN0b3JhZ2VDbGFzcyhsbHZtOjpHbG9iYWxWYWx1ZTo6RGVmYXVsdFN0b3JhZ2VDbGFzcyk7CisgIH0KIAogICAvLyBJZiB3ZSBoYXZlIGFuIG9yZGVyIG51bWJlciBmb3IgdGhpcyBmdW5jdGlvbiwgc2V0IGl0IHVwIGFzIGFwcHJvcHJpYXRlLgogICBpZiAoaGFzT3JkZXJOdW1iZXIpIHsKZGlmZiAtLWdpdCBhL2xpYi9JUkdlbi9HZW5GdW5jLmNwcCBiL2xpYi9JUkdlbi9HZW5GdW5jLmNwcAppbmRleCAwYTUyNDRjLi5iNmYxNzNlIDEwMDY0NAotLS0gYS9saWIvSVJHZW4vR2VuRnVuYy5jcHAKKysrIGIvbGliL0lSR2VuL0dlbkZ1bmMuY3BwCkBAIC0xMjU0LDcgKzEyNTQsNyBAQAogCiAvLy8gRW1pdCBhIHBhcnRpYWwgYXBwbGljYXRpb24gdGh1bmsgZm9yIGEgZnVuY3Rpb24gcG9pbnRlciBhcHBsaWVkIHRvIGEgcGFydGlhbAogLy8vIHNldCBvZiBhcmd1bWVudCB2YWx1ZXMuCi12b2lkIGlyZ2VuOjplbWl0RnVuY3Rpb25QYXJ0aWFsQXBwbGljYXRpb24oCitPcHRpb25hbDxTdGFja0FkZHJlc3M+IGlyZ2VuOjplbWl0RnVuY3Rpb25QYXJ0aWFsQXBwbGljYXRpb24oCiAgICAgSVJHZW5GdW5jdGlvbiAmSUdGLCBTSUxGdW5jdGlvbiAmU0lMRm4sIGNvbnN0IEZ1bmN0aW9uUG9pbnRlciAmZm4sCiAgICAgbGx2bTo6VmFsdWUgKmZuQ29udGV4dCwgRXhwbG9zaW9uICZhcmdzLCBBcnJheVJlZjxTSUxQYXJhbWV0ZXJJbmZvPiBwYXJhbXMsCiAgICAgU3Vic3RpdHV0aW9uTWFwIHN1YnMsIENhblNJTEZ1bmN0aW9uVHlwZSBvcmlnVHlwZSwKQEAgLTEyNzAsOCArMTI3MCw2IEBACiAgIFNtYWxsVmVjdG9yPFNJTFR5cGUsIDQ+IGFyZ1ZhbFR5cGVzOwogICBTbWFsbFZlY3RvcjxQYXJhbWV0ZXJDb252ZW50aW9uLCA0PiBhcmdDb252ZW50aW9uczsKIAotICBhc3NlcnQoIW91dFR5cGUtPmlzTm9Fc2NhcGUoKSk7Ci0KICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgcG9seW1vcnBoaWMgYmluZGluZ3MuCiAgIGF1dG8gYmluZGluZ3MgPSBOZWNlc3NhcnlCaW5kaW5nczo6Zm9yRnVuY3Rpb25JbnZvY2F0aW9ucyhJR0YuSUdNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ1R5cGUsIHN1YnMpOwpAQCAtMTM5OCw3ICsxMzk2LDcgQEAKICAgICBsbHZtOjpWYWx1ZSAqY3R4ID0gYXJncy5jbGFpbU5leHQoKTsKICAgICBjdHggPSBJR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KGN0eCwgSUdGLklHTS5SZWZDb3VudGVkUHRyVHkpOwogICAgIG91dC5hZGQoY3R4KTsKLSAgICByZXR1cm47CisgICAgcmV0dXJuIHt9OwogICB9CiAgIAogICBPcHRpb25hbDxGdW5jdGlvblBvaW50ZXI+IHN0YXRpY0ZuOwpAQCAtMTQzNywxNCArMTQzNSwyMCBAQAogICAgIGxsdm06OlZhbHVlICpjdHggPSBhcmdzLmNsYWltTmV4dCgpOwogICAgIGlmIChpc0luZGlyZWN0Rm9ybWFsUGFyYW1ldGVyKCpzaW5nbGVSZWZjb3VudGVkQ29udmVudGlvbikpCiAgICAgICBjdHggPSBJR0YuQnVpbGRlci5DcmVhdGVMb2FkKGN0eCwgSUdGLklHTS5nZXRQb2ludGVyQWxpZ25tZW50KCkpOworCisgICAgYXV0byBleHBlY3RlZENsb3N1cmVUeSA9CisgICAgICAgIG91dFR5cGUtPmlzTm9Fc2NhcGUoKSA/IElHRi5JR00uT3BhcXVlUHRyVHkgOiBJR0YuSUdNLlJlZkNvdW50ZWRQdHJUeTsKKwogICAgIC8vIFdlIG1pZ2h0IGdldCBhIHN0cnVjdCBjb250YWluaW5nIGEgcG9pbnRlciBlLmcgdHlwZSA8eyAlQUNsYXNzKiB9PgotICAgIGlmIChjdHgtPmdldFR5cGUoKSAhPSBJR0YuSUdNLlJlZkNvdW50ZWRQdHJUeSkKLSAgICAgIGN0eCA9IElHRi5jb2VyY2VWYWx1ZShjdHgsIElHRi5JR00uUmVmQ291bnRlZFB0clR5LCBJR0YuSUdNLkRhdGFMYXlvdXQpOworICAgIGlmIChjdHgtPmdldFR5cGUoKSAhPSBleHBlY3RlZENsb3N1cmVUeSkKKyAgICAgIGN0eCA9IElHRi5jb2VyY2VWYWx1ZShjdHgsIGV4cGVjdGVkQ2xvc3VyZVR5LCBJR0YuSUdNLkRhdGFMYXlvdXQpOwogICAgIG91dC5hZGQoY3R4KTsKLSAgICByZXR1cm47CisgICAgaWYgKG91dFR5cGUtPmlzTm9Fc2NhcGUoKSkKKyAgICAgIHJldHVybiBTdGFja0FkZHJlc3MoKTsKKyAgICByZXR1cm4ge307CiAgIH0KIAotICAvLyBTdG9yZSB0aGUgY29udGV4dCBhcmd1bWVudHMgb24gdGhlIGhlYXAuCisgIC8vIFN0b3JlIHRoZSBjb250ZXh0IGFyZ3VtZW50cyBvbiB0aGUgaGVhcC9zdGFjay4KICAgYXNzZXJ0KGFyZ1ZhbFR5cGVzLnNpemUoKSA9PSBhcmdUeXBlSW5mb3Muc2l6ZSgpCiAgICAgICAgICAmJiBhcmdUeXBlSW5mb3Muc2l6ZSgpID09IGFyZ0NvbnZlbnRpb25zLnNpemUoKQogICAgICAgICAgJiYgImFyZ3VtZW50IGluZm8gbGlzdHMgb3V0IG9mIHN5bmMiKTsKQEAgLTE0NTcsMTMgKzE0NjEsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQpOwogCiAgIGxsdm06OlZhbHVlICpkYXRhOwotICBpZiAoYXJncy5lbXB0eSgpICYmIGxheW91dC5pc0tub3duRW1wdHkoKSkgewotICAgIGRhdGEgPSBJR0YuSUdNLlJlZkNvdW50ZWROdWxsOwotICB9IGVsc2UgewotICAgIC8vIEFsbG9jYXRlIGEgbmV3IG9iamVjdC4KLSAgICBIZWFwTm9uRml4ZWRPZmZzZXRzIG9mZnNldHMoSUdGLCBsYXlvdXQpOwogCi0gICAgZGF0YSA9IElHRi5lbWl0VW5tYW5hZ2VkQWxsb2MobGF5b3V0LCAiY2xvc3VyZSIsIGRlc2NyaXB0b3IsICZvZmZzZXRzKTsKKyAgT3B0aW9uYWw8U3RhY2tBZGRyZXNzPiBzdGFja0FkZHI7CisKKyAgaWYgKGFyZ3MuZW1wdHkoKSAmJiBsYXlvdXQuaXNLbm93bkVtcHR5KCkpIHsKKyAgICBpZiAob3V0VHlwZS0+aXNOb0VzY2FwZSgpKQorICAgICAgZGF0YSA9IGxsdm06OkNvbnN0YW50UG9pbnRlck51bGw6OmdldChJR0YuSUdNLk9wYXF1ZVB0clR5KTsKKyAgICBlbHNlCisgICAgICBkYXRhID0gSUdGLklHTS5SZWZDb3VudGVkTnVsbDsKKyAgfSBlbHNlIHsKKworICAgIC8vIEFsbG9jYXRlIGEgbmV3IG9iamVjdCBvbiB0aGUgaGVhcCBvciBzdGFjay4KKyAgICBIZWFwTm9uRml4ZWRPZmZzZXRzIG9mZnNldHMoSUdGLCBsYXlvdXQpOworICAgIGlmIChvdXRUeXBlLT5pc05vRXNjYXBlKCkpIHsKKyAgICAgIHN0YWNrQWRkciA9IElHRi5lbWl0RHluYW1pY0FsbG9jYSgKKyAgICAgICAgICBJR0YuSUdNLkludDhUeSwgbGF5b3V0LmVtaXRTaXplKElHRi5JR00pLCBBbGlnbm1lbnQoMTYpKTsKKyAgICAgIHN0YWNrQWRkciA9IHN0YWNrQWRkci0+d2l0aEFkZHJlc3MoSUdGLkJ1aWxkZXIuQ3JlYXRlQml0Q2FzdCgKKyAgICAgICAgICBzdGFja0FkZHItPmdldEFkZHJlc3MoKSwgSUdGLklHTS5PcGFxdWVQdHJUeSkpOworICAgICAgZGF0YSA9IHN0YWNrQWRkci0+Z2V0QWRkcmVzcygpLmdldEFkZHJlc3MoKTsKKyAgICB9IGVsc2UKKyAgICAgIGRhdGEgPSBJR0YuZW1pdFVubWFuYWdlZEFsbG9jKGxheW91dCwgImNsb3N1cmUiLCBkZXNjcmlwdG9yLCAmb2Zmc2V0cyk7CiAgICAgQWRkcmVzcyBkYXRhQWRkciA9IGxheW91dC5lbWl0Q2FzdFRvKElHRiwgZGF0YSk7CiAgICAgCiAgICAgdW5zaWduZWQgaSA9IDA7CkBAIC0xNTMxLDYgKzE1NDgsNyBAQAogICBmb3J3YXJkZXIgPSBJR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KGZvcndhcmRlciwgSUdGLklHTS5JbnQ4UHRyVHkpOwogICBvdXQuYWRkKGZvcndhcmRlcik7CiAgIG91dC5hZGQoZGF0YSk7CisgIHJldHVybiBzdGFja0FkZHI7CiB9CiAKIC8vLyBFbWl0IHRoZSBibG9jayBjb3B5IGhlbHBlciBmb3IgYSBibG9jay4KZGlmZiAtLWdpdCBhL2xpYi9JUkdlbi9HZW5GdW5jLmggYi9saWIvSVJHZW4vR2VuRnVuYy5oCmluZGV4IDQ1Y2I2YTguLjA0YmMyZTQgMTAwNjQ0Ci0tLSBhL2xpYi9JUkdlbi9HZW5GdW5jLmgKKysrIGIvbGliL0lSR2VuL0dlbkZ1bmMuaApAQCAtNDcsNyArNDcsNyBAQAogCiAgIC8vLyBFbWl0IGEgcGFydGlhbCBhcHBsaWNhdGlvbiB0aHVuayBmb3IgYSBmdW5jdGlvbiBwb2ludGVyIGFwcGxpZWQgdG8gYQogICAvLy8gcGFydGlhbCBzZXQgb2YgYXJndW1lbnQgdmFsdWVzLgotICB2b2lkIGVtaXRGdW5jdGlvblBhcnRpYWxBcHBsaWNhdGlvbigKKyAgT3B0aW9uYWw8U3RhY2tBZGRyZXNzPiBlbWl0RnVuY3Rpb25QYXJ0aWFsQXBwbGljYXRpb24oCiAgICAgICBJUkdlbkZ1bmN0aW9uICZJR0YsIFNJTEZ1bmN0aW9uICZTSUxGbiwgY29uc3QgRnVuY3Rpb25Qb2ludGVyICZmblB0ciwKICAgICAgIGxsdm06OlZhbHVlICpmbkNvbnRleHQsIEV4cGxvc2lvbiAmYXJncywKICAgICAgIEFycmF5UmVmPFNJTFBhcmFtZXRlckluZm8+IGFyZ1R5cGVzLCBTdWJzdGl0dXRpb25NYXAgc3VicywKZGlmZiAtLWdpdCBhL2xpYi9JUkdlbi9HZW5PcGFxdWUuY3BwIGIvbGliL0lSR2VuL0dlbk9wYXF1ZS5jcHAKaW5kZXggYzdjYWI0ZC4uZDRlNmM1ZSAxMDA2NDQKLS0tIGEvbGliL0lSR2VuL0dlbk9wYXF1ZS5jcHAKKysrIGIvbGliL0lSR2VuL0dlbk9wYXF1ZS5jcHAKQEAgLTU1NSw3ICs1NTUsMTAgQEAKIC8vLyBsb2NhdGlvbiBiZWZvcmUgdGhlIGR5bmFtaWMgYWxsb2NhJ3MgY2FsbC4KIHZvaWQgSVJHZW5GdW5jdGlvbjo6ZW1pdERlYWxsb2NhdGVEeW5hbWljQWxsb2NhKFN0YWNrQWRkcmVzcyBhZGRyZXNzKSB7CiAgIC8vIEluIGNvcm91dGluZXMsIHVuY29uZGl0aW9uYWxseSBjYWxsIGxsdm0uY29yby5hbGxvY2EuZnJlZS4KLSAgaWYgKGlzQ29yb3V0aW5lKCkpIHsKKyAgLy8gRXhjZXB0IGlmIHRoZSBhZGRyZXNzIGlzIGludmFsaWQsIHRoaXMgaGFwcGVucyB3aGVuIHRoaXMgaXMgYSBTdGFja0FkZHJlc3MKKyAgLy8gZm9yIGEgcGFydGlhbF9hcHBseSBbc3RhY2tdIHRoYXQgZGlkIG5vdCBuZWVkIGEgY29udGV4dCBvYmplY3Qgb24gdGhlCisgIC8vIHN0YWNrLgorICBpZiAoaXNDb3JvdXRpbmUoKSAmJiBhZGRyZXNzLmdldEFkZHJlc3MoKS5pc1ZhbGlkKCkpIHsKICAgICBhdXRvIGFsbG9jVG9rZW4gPSBhZGRyZXNzLmdldEV4dHJhSW5mbygpOwogICAgIGFzc2VydChhbGxvY1Rva2VuICYmICJkeW5hbWljIGFsbG9jYSBpbiBjb3JvdXRpbmUgd2l0aG91dCBhbGxvYyB0b2tlbj8iKTsKICAgICBhdXRvIGZyZWVGbiA9IGxsdm06OkludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24oCkBAIC01NjMsNyArNTY2LDYgQEAKICAgICBCdWlsZGVyLkNyZWF0ZUNhbGwoZnJlZUZuLCBhbGxvY1Rva2VuKTsKICAgICByZXR1cm47CiAgIH0KLQogICAvLyBPdGhlcndpc2UsIGNhbGwgbGx2bS5zdGFja3Jlc3RvcmUgaWYgYW4gYWRkcmVzcyB3YXMgc2F2ZWQuCiAgIGF1dG8gc2F2ZWRTUCA9IGFkZHJlc3MuZ2V0RXh0cmFJbmZvKCk7CiAgIGlmIChzYXZlZFNQID09IG51bGxwdHIpCkBAIC0xNDQ0LDQgKzE0NDYsNCBAQAogICB9IGVsc2UgewogICAgIHN0b3JlRW51bVRhZ1NpbmdsZVBheWxvYWQoSUdGLCB0YWcsIHRhZywgYWRkcmVzcywgVCwgaXNPdXRsaW5lZCk7CiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvSVJHZW4vR2VuUHJvdG8uY3BwIGIvbGliL0lSR2VuL0dlblByb3RvLmNwcAppbmRleCAwMWViZmQ5Li4wZDE0MmI1IDEwMDY0NAotLS0gYS9saWIvSVJHZW4vR2VuUHJvdG8uY3BwCisrKyBiL2xpYi9JUkdlbi9HZW5Qcm90by5jcHAKQEAgLTM4LDggKzM4LDEwIEBACiAjaW5jbHVkZSAic3dpZnQvQ2xhbmdJbXBvcnRlci9DbGFuZ01vZHVsZS5oIgogI2luY2x1ZGUgInN3aWZ0L0lSR2VuL0xpbmtpbmcuaCIKICNpbmNsdWRlICJzd2lmdC9TSUwvU0lMRGVjbFJlZi5oIgorI2luY2x1ZGUgInN3aWZ0L1NJTC9TSUxEZWZhdWx0V2l0bmVzc1RhYmxlLmgiCiAjaW5jbHVkZSAic3dpZnQvU0lML1NJTE1vZHVsZS5oIgogI2luY2x1ZGUgInN3aWZ0L1NJTC9TSUxWYWx1ZS5oIgorI2luY2x1ZGUgInN3aWZ0L1NJTC9TSUxXaXRuZXNzVGFibGUuaCIKICNpbmNsdWRlICJzd2lmdC9TSUwvU0lMV2l0bmVzc1Zpc2l0b3IuaCIKICNpbmNsdWRlICJzd2lmdC9TSUwvVHlwZUxvd2VyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKQEAgLTIwNzksNyArMjA4MSwxMCBAQAogICBzZXRUcnVlQ29uc3RHbG9iYWwodmFyKTsKIH0KIAotdm9pZCBJUkdlbk1vZHVsZTo6ZW5zdXJlUmVsYXRpdmVTeW1ib2xDb2xsb2NhdGlvbihTSUxXaXRuZXNzVGFibGUgJnd0KSB7Cit2b2lkIElSR2VuZXJhdG9yOjplbnN1cmVSZWxhdGl2ZVN5bWJvbENvbGxvY2F0aW9uKFNJTFdpdG5lc3NUYWJsZSAmd3QpIHsKKyAgaWYgKCFDdXJyZW50SUdNKQorICAgIHJldHVybjsKKwogICAvLyBPbmx5IHJlc2lsaWVudCBjb25mb3JtYW5jZXMgdXNlIHJlbGF0aXZlIHBvaW50ZXJzIGZvciB3aXRuZXNzIG1ldGhvZHMuCiAgIGlmICh3dC5pc0RlY2xhcmF0aW9uKCkgfHwgaXNBdmFpbGFibGVFeHRlcm5hbGx5KHd0LmdldExpbmthZ2UoKSkgfHwKICAgICAgICFpc1Jlc2lsaWVudENvbmZvcm1hbmNlKHd0LmdldENvbmZvcm1hbmNlKCkpKQpAQCAtMjA5MCw3ICsyMDk1LDIwIEBACiAgICAgICBjb250aW51ZTsKICAgICBhdXRvICp3aXRuZXNzID0gZW50cnkuZ2V0TWV0aG9kV2l0bmVzcygpLldpdG5lc3M7CiAgICAgaWYgKHdpdG5lc3MpCi0gICAgICBJUkdlbi5mb3JjZUxvY2FsRW1pdE9mTGF6eUZ1bmN0aW9uKHdpdG5lc3MpOworICAgICAgZm9yY2VMb2NhbEVtaXRPZkxhenlGdW5jdGlvbih3aXRuZXNzKTsKKyAgfQorfQorCit2b2lkIElSR2VuZXJhdG9yOjplbnN1cmVSZWxhdGl2ZVN5bWJvbENvbGxvY2F0aW9uKFNJTERlZmF1bHRXaXRuZXNzVGFibGUgJnd0KSB7CisgIGlmICghQ3VycmVudElHTSkKKyAgICByZXR1cm47CisKKyAgZm9yIChhdXRvICZlbnRyeSA6IHd0LmdldEVudHJpZXMoKSkgeworICAgIGlmIChlbnRyeS5nZXRLaW5kKCkgIT0gU0lMV2l0bmVzc1RhYmxlOjpNZXRob2QpCisgICAgICBjb250aW51ZTsKKyAgICBhdXRvICp3aXRuZXNzID0gZW50cnkuZ2V0TWV0aG9kV2l0bmVzcygpLldpdG5lc3M7CisgICAgaWYgKHdpdG5lc3MpCisgICAgICBmb3JjZUxvY2FsRW1pdE9mTGF6eUZ1bmN0aW9uKHdpdG5lc3MpOwogICB9CiB9CiAKQEAgLTIyMzQsNiArMjI1MiwxMCBAQAogICBpZiAoaXNBdmFpbGFibGVFeHRlcm5hbGx5KHd0LT5nZXRMaW5rYWdlKCkpKQogICAgIHJldHVybjsKIAorICAvLyBFbnN1cmUgdGhhdCByZWxhdGl2ZWx5LXJlZmVyZW5jZWQgc3ltYm9scyBmb3Igd2l0bmVzcyB0aHVua3MgYXJlIGNvbGxvY2F0ZWQKKyAgLy8gaW4gdGhlIHNhbWUgTExWTSBtb2R1bGUuCisgIElSR2VuLmVuc3VyZVJlbGF0aXZlU3ltYm9sQ29sbG9jYXRpb24oKnd0KTsKKwogICBhdXRvIGNvbmYgPSB3dC0+Z2V0Q29uZm9ybWFuY2UoKTsKICAgUHJldHR5U3RhY2tUcmFjZUNvbmZvcm1hbmNlIF9zdChDb250ZXh0LCAiZW1pdHRpbmcgd2l0bmVzcyB0YWJsZSBmb3IiLCBjb25mKTsKIApkaWZmIC0tZ2l0IGEvbGliL0lSR2VuL0lSR2VuLmNwcCBiL2xpYi9JUkdlbi9JUkdlbi5jcHAKaW5kZXggNGU4M2I0Yi4uMWY3YjU0MSAxMDA2NDQKLS0tIGEvbGliL0lSR2VuL0lSR2VuLmNwcAorKysgYi9saWIvSVJHZW4vSVJHZW4uY3BwCkBAIC05NjQsMTEgKzk2NCwxMSBAQAogICB9CiAKICAgLy8gRW1pdCB0aGUgbW9kdWxlIGNvbnRlbnRzLgotICBpcmdlbi5lbWl0R2xvYmFsVG9wTGV2ZWwodHJ1ZSAvKmVtaXRGb3JQYXJhbGxlbEVtaXNzaW9uKi8pOworICBpcmdlbi5lbWl0R2xvYmFsVG9wTGV2ZWwoKTsKIAogICBmb3IgKGF1dG8gKkZpbGUgOiBNLT5nZXRGaWxlcygpKSB7CiAgICAgaWYgKGF1dG8gKlNGID0gZHluX2Nhc3Q8U291cmNlRmlsZT4oRmlsZSkpIHsKLSAgICAgIElSR2VuTW9kdWxlICpJR00gPSBpcmdlbi5nZXRHZW5Nb2R1bGUoU0YpOworICAgICAgQ3VycmVudElHTVB0ciBJR00gPSBpcmdlbi5nZXRHZW5Nb2R1bGUoU0YpOwogICAgICAgSUdNLT5lbWl0U291cmNlRmlsZSgqU0YpOwogICAgIH0gZWxzZSB7CiAgICAgICBGaWxlLT5jb2xsZWN0TGlua0xpYnJhcmllcyhbJl0oTGlua0xpYnJhcnkgTGlua0xpYikgewpkaWZmIC0tZ2l0IGEvbGliL0lSR2VuL0lSR2VuRGVidWdJbmZvLmNwcCBiL2xpYi9JUkdlbi9JUkdlbkRlYnVnSW5mby5jcHAKaW5kZXggOGRkOTBmMS4uNDc4YTMwMiAxMDA2NDQKLS0tIGEvbGliL0lSR2VuL0lSR2VuRGVidWdJbmZvLmNwcAorKysgYi9saWIvSVJHZW4vSVJHZW5EZWJ1Z0luZm8uY3BwCkBAIC00NjUsNiArNDY1LDcgQEAKICAgICBjYXNlIERlY2xDb250ZXh0S2luZDo6SW5pdGlhbGl6ZXI6CiAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkV4dGVuc2lvbkRlY2w6CiAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlN1YnNjcmlwdERlY2w6CisgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkVudW1FbGVtZW50RGVjbDoKICAgICBjYXNlIERlY2xDb250ZXh0S2luZDo6VG9wTGV2ZWxDb2RlRGVjbDoKICAgICAgIHJldHVybiBnZXRPckNyZWF0ZUNvbnRleHQoREMtPmdldFBhcmVudCgpKTsKIApkaWZmIC0tZ2l0IGEvbGliL0lSR2VuL0lSR2VuTW9kdWxlLmggYi9saWIvSVJHZW4vSVJHZW5Nb2R1bGUuaAppbmRleCA1NDc2MWMzLi40Zjk1MGMyIDEwMDY0NAotLS0gYS9saWIvSVJHZW4vSVJHZW5Nb2R1bGUuaAorKysgYi9saWIvSVJHZW4vSVJHZW5Nb2R1bGUuaApAQCAtOTMsNiArOTMsNyBAQAogICBjbGFzcyBQcm90b2NvbENvbXBvc2l0aW9uVHlwZTsKICAgY2xhc3MgUm9vdFByb3RvY29sQ29uZm9ybWFuY2U7CiAgIHN0cnVjdCBTSUxEZWNsUmVmOworICBjbGFzcyBTSUxEZWZhdWx0V2l0bmVzc1RhYmxlOwogICBjbGFzcyBTSUxHbG9iYWxWYXJpYWJsZTsKICAgY2xhc3MgU0lMTW9kdWxlOwogICBjbGFzcyBTSUxQcm9wZXJ0eTsKQEAgLTMxMSwxMSArMzEyLDcgQEAKICAgCiAgIC8vLyBFbWl0IGZ1bmN0aW9ucywgdmFyaWFibGVzIGFuZCB0YWJsZXMgd2hpY2ggYXJlIG5lZWRlZCBhbnl3YXksIGUuZy4gYmVjYXVzZQogICAvLy8gdGhleSBhcmUgZXh0ZXJuYWxseSB2aXNpYmxlLgotICAvLy8gSWYgXHAgZW1pdEZvclBhcmFsbGVsRW1pc3Npb24gaXMgdHJ1ZSBlbnN1cmVzIHRoYXQgc3ltYm9scyB0aGF0IGFyZQotICAvLy8gZXhwcmVzc2VkIGFzIHJlbGF0aXZlIHBvaW50ZXJzIGFyZSBjb2xsb2NhdGVkIGluIHRoZSBzYW1lIG91dHB1dCBtb2R1bGUKLSAgLy8vIHdpdGggdGhlaXIgYmFzZSBzeW1ib2wuIEZvciBleGFtcGxlLCB3aXRuZXNzIG1ldGhvZHMgbmVlZCB0byBiZSBjb2xsb2NhdGVkCi0gIC8vLyB3aXRoIHRoZSB3aXRuZXNzIHRhYmxlIGluIHRoZSBzYW1lIExMVk0gbW9kdWxlLgotICB2b2lkIGVtaXRHbG9iYWxUb3BMZXZlbChib29sIGVtaXRGb3JQYXJhbGxlbEVtaXNzaW9uID0gZmFsc2UpOworICB2b2lkIGVtaXRHbG9iYWxUb3BMZXZlbCgpOwogCiAgIC8vLyBFbWl0IHJlZmVyZW5jZXMgdG8gZWFjaCBvZiB0aGUgcHJvdG9jb2wgZGVzY3JpcHRvcnMgZGVmaW5lZCBpbiB0aGlzCiAgIC8vLyBJUiBtb2R1bGUuCkBAIC0zNTUsNiArMzUyLDEwIEBACiAgICAgRGVmYXVsdElHTUZvckZ1bmN0aW9uW2ZdID0gQ3VycmVudElHTTsKICAgfQogCisgIHZvaWQgZW5zdXJlUmVsYXRpdmVTeW1ib2xDb2xsb2NhdGlvbihTSUxXaXRuZXNzVGFibGUgJnd0KTsKKworICB2b2lkIGVuc3VyZVJlbGF0aXZlU3ltYm9sQ29sbG9jYXRpb24oU0lMRGVmYXVsdFdpdG5lc3NUYWJsZSAmd3QpOworCiAgIHZvaWQgbm90ZVVzZU9mVHlwZU1ldGFkYXRhKE5vbWluYWxUeXBlRGVjbCAqdHlwZSkgewogICAgIG5vdGVVc2VPZlR5cGVHbG9iYWxzKHR5cGUsIHRydWUsIFJlcXVpcmVNZXRhZGF0YSk7CiAgIH0KQEAgLTEzODYsOCArMTM4Nyw2IEBACiAKICAgdm9pZCBlbWl0U2hhcmVkQ29udGV4dERlc2NyaXB0b3IoRGVjbENvbnRleHQgKmRjKTsKIAotICB2b2lkIGVuc3VyZVJlbGF0aXZlU3ltYm9sQ29sbG9jYXRpb24oU0lMV2l0bmVzc1RhYmxlICZ3dCk7Ci0KICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKgogICBnZXRHbG9iYWxGb3JEeW5hbWljYWxseVJlcGxhY2VhYmxlVGh1bmsoTGlua0VudGl0eSAmZW50aXR5LCBsbHZtOjpUeXBlICp0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yRGVmaW5pdGlvbl90IGZvckRlZmluaXRpb24pOwpkaWZmIC0tZ2l0IGEvbGliL0lSR2VuL0lSR2VuU0lMLmNwcCBiL2xpYi9JUkdlbi9JUkdlblNJTC5jcHAKaW5kZXggNWFlYjYxNy4uY2Q4MWJhMyAxMDA2NDQKLS0tIGEvbGliL0lSR2VuL0lSR2VuU0lMLmNwcAorKysgYi9saWIvSVJHZW4vSVJHZW5TSUwuY3BwCkBAIC0zNzQsNiArMzc0LDcgQEAKIHsKIHB1YmxpYzoKICAgbGx2bTo6RGVuc2VNYXA8U0lMVmFsdWUsIExvd2VyZWRWYWx1ZT4gTG93ZXJlZFZhbHVlczsKKyAgbGx2bTo6RGVuc2VNYXA8U0lMVmFsdWUsIFN0YWNrQWRkcmVzcz4gTG93ZXJlZFBhcnRpYWxBcHBseUFsbG9jYXRpb25zOwogICBsbHZtOjpEZW5zZU1hcDxTSUxUeXBlLCBMb3dlcmVkVmFsdWU+IExvd2VyZWRVbmRlZnM7CiAKICAgLy8vIEFsbCBhbGxvY19yZWYgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFsbG9jYXRlIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrLgpAQCAtMjUyNywxMSArMjUyOCwxNiBAQAogCiAgIC8vIENyZWF0ZSB0aGUgdGh1bmsgYW5kIGZ1bmN0aW9uIHZhbHVlLgogICBFeHBsb3Npb24gZnVuY3Rpb247Ci0gIGVtaXRGdW5jdGlvblBhcnRpYWxBcHBsaWNhdGlvbigKKyAgYXV0byBjbG9zdXJlU3RhY2tBZGRyID0gZW1pdEZ1bmN0aW9uUGFydGlhbEFwcGxpY2F0aW9uKAogICAgICAgKnRoaXMsICpDdXJTSUxGbiwgY2FsbGVlRm4sIGlubmVyQ29udGV4dCwgbGxBcmdzLCBwYXJhbXMsCiAgICAgICBpLT5nZXRTdWJzdGl0dXRpb25NYXAoKSwgb3JpZ0NhbGxlZVR5LCBpLT5nZXRTdWJzdENhbGxlZVR5cGUoKSwKICAgICAgIGktPmdldFR5cGUoKS5jYXN0VG88U0lMRnVuY3Rpb25UeXBlPigpLCBmdW5jdGlvbiwgZmFsc2UpOwogICBzZXRMb3dlcmVkRXhwbG9zaW9uKHYsIGZ1bmN0aW9uKTsKKworICBpZiAoY2xvc3VyZVN0YWNrQWRkcikgeworICAgIGFzc2VydChpLT5pc09uU3RhY2soKSk7CisgICAgTG93ZXJlZFBhcnRpYWxBcHBseUFsbG9jYXRpb25zW3ZdID0gKmNsb3N1cmVTdGFja0FkZHI7CisgIH0KIH0KIAogdm9pZCBJUkdlblNJTEZ1bmN0aW9uOjp2aXNpdEludGVnZXJMaXRlcmFsSW5zdChzd2lmdDo6SW50ZWdlckxpdGVyYWxJbnN0ICppKSB7CkBAIC00MDc0LDYgKzQwODAsMTMgQEAKIH0KIAogdm9pZCBJUkdlblNJTEZ1bmN0aW9uOjp2aXNpdERlYWxsb2NTdGFja0luc3Qoc3dpZnQ6OkRlYWxsb2NTdGFja0luc3QgKmkpIHsKKyAgaWYgKGF1dG8gKmNsb3N1cmUgPSBkeW5fY2FzdDxQYXJ0aWFsQXBwbHlJbnN0PihpLT5nZXRPcGVyYW5kKCkpKSB7CisgICAgYXNzZXJ0KGNsb3N1cmUtPmlzT25TdGFjaygpKTsKKyAgICBhdXRvIHN0YWNrQWRkciA9IExvd2VyZWRQYXJ0aWFsQXBwbHlBbGxvY2F0aW9uc1tpLT5nZXRPcGVyYW5kKCldOworICAgIGVtaXREZWFsbG9jYXRlRHluYW1pY0FsbG9jYShzdGFja0FkZHIpOworICAgIHJldHVybjsKKyAgfQorCiAgIGF1dG8gYWxsb2NhdGVkVHlwZSA9IGktPmdldE9wZXJhbmQoKS0+Z2V0VHlwZSgpOwogICBjb25zdCBUeXBlSW5mbyAmYWxsb2NhdGVkVEkgPSBnZXRUeXBlSW5mbyhhbGxvY2F0ZWRUeXBlKTsKICAgU3RhY2tBZGRyZXNzIHN0YWNrQWRkciA9IGdldExvd2VyZWRTdGFja0FkZHJlc3MoaS0+Z2V0T3BlcmFuZCgpKTsKZGlmZiAtLWdpdCBhL2xpYi9JUkdlbi9Mb2FkYWJsZUJ5QWRkcmVzcy5jcHAgYi9saWIvSVJHZW4vTG9hZGFibGVCeUFkZHJlc3MuY3BwCmluZGV4IGM2MmZiYmYuLjg4NDE4MjkgMTAwNjQ0Ci0tLSBhL2xpYi9JUkdlbi9Mb2FkYWJsZUJ5QWRkcmVzcy5jcHAKKysrIGIvbGliL0lSR2VuL0xvYWRhYmxlQnlBZGRyZXNzLmNwcApAQCAtMTU5OSwxNCArMTU5OSwyMiBAQAogCiBwcml2YXRlOgogICB2b2lkIHVwZGF0ZUxvd2VyZWRUeXBlcyhTSUxGdW5jdGlvbiAqRik7Ci0gIHZvaWQgcmVjcmVhdGVBcHBsaWVzKCk7Ci0gIHZvaWQgcmVjcmVhdGVTaW5nbGVBcHBseShTSUxJbnN0cnVjdGlvbiAqYXBwbHlJbnN0KTsKLSAgdm9pZCByZWNyZWF0ZUNvbnZJbnN0cnMoKTsKLSAgdm9pZCByZWNyZWF0ZUJ1aWx0aW5JbnN0cnMoKTsKLSAgdm9pZCByZWNyZWF0ZUxvYWRJbnN0cnMoKTsKLSAgdm9pZCByZWNyZWF0ZVVuY2hlY2tlZEVudW1EYXRhSW5zdHJzKCk7Ci0gIHZvaWQgcmVjcmVhdGVVbmNoZWNrZWRUYWtlRW51bURhdGFBZGRySW5zdCgpOwotICB2b2lkIGZpeFN0b3JlVG9CbG9ja1N0b3JhZ2VJbnN0cnMoKTsKKyAgdm9pZCByZWNyZWF0ZVNpbmdsZUFwcGx5KFNJTEluc3RydWN0aW9uICphcHBseUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0lMSW5zdHJ1Y3Rpb24gKj4gJkRlbGV0ZSk7CisgIGJvb2wgcmVjcmVhdGVBcHBseShTSUxJbnN0cnVjdGlvbiAmSSwKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTSUxJbnN0cnVjdGlvbiAqPiAmRGVsZXRlKTsKKyAgYm9vbCByZWNyZWF0ZUNvbnZJbnN0cihTSUxJbnN0cnVjdGlvbiAmSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0lMSW5zdHJ1Y3Rpb24gKj4gJkRlbGV0ZSk7CisgIGJvb2wgcmVjcmVhdGVCdWlsdGluSW5zdHIoU0lMSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZEZWxldGUpOworICBib29sIHJlY3JlYXRlTG9hZEluc3RyKFNJTEluc3RydWN0aW9uICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTSUxJbnN0cnVjdGlvbiAqPiAmRGVsZXRlKTsKKyAgYm9vbCByZWNyZWF0ZVVuY2hlY2tlZEVudW1EYXRhSW5zdHIoU0lMSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZEZWxldGUpOworICBib29sIHJlY3JlYXRlVW5jaGVja2VkVGFrZUVudW1EYXRhQWRkckluc3QoU0lMSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZEZWxldGUpOworICBib29sIGZpeFN0b3JlVG9CbG9ja1N0b3JhZ2VJbnN0cihTSUxJbnN0cnVjdGlvbiAmSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0lMSW5zdHJ1Y3Rpb24gKj4gJkRlbGV0ZSk7CiAKIHByaXZhdGU6CiAgIGxsdm06OlNldFZlY3RvcjxTSUxGdW5jdGlvbiAqPiBtb2RGdW5jczsKQEAgLTIzNjksNyArMjM3Nyw4IEBACiAgIHJldHVybiBvcDsKIH0KIAotdm9pZCBMb2FkYWJsZUJ5QWRkcmVzczo6cmVjcmVhdGVTaW5nbGVBcHBseShTSUxJbnN0cnVjdGlvbiAqYXBwbHlJbnN0KSB7Cit2b2lkIExvYWRhYmxlQnlBZGRyZXNzOjpyZWNyZWF0ZVNpbmdsZUFwcGx5KAorICAgIFNJTEluc3RydWN0aW9uICphcHBseUluc3QsIFNtYWxsVmVjdG9ySW1wbDxTSUxJbnN0cnVjdGlvbiAqPiAmRGVsZXRlKSB7CiAgIGF1dG8gKkYgPSBhcHBseUluc3QtPmdldEZ1bmN0aW9uKCk7CiAgIElSR2VuTW9kdWxlICpjdXJySVJNb2QgPSBnZXRJUkdlbk1vZHVsZSgpLT5JUkdlbi5nZXRHZW5Nb2R1bGUoRik7CiAgIC8vIENvbGxlY3QgY29tbW9uIGluZm8KQEAgLTIzODAsNyArMjM4OSw3IEBACiAgICAgLy8gZWxzZSB2ZXJpZmljYXRpb24gd2lsbCBmYWlsIHdpdGggd3JvbmcgU3Vic3RDYWxsZWVUeXBlCiAgICAgYXV0byBjYWxsZUluc3RyID0gc2l0ZS5nZXRJbnN0cnVjdGlvbigpOwogICAgIGlmIChtb2RBcHBsaWVzLnJlbW92ZShjYWxsZUluc3RyKSkgewotICAgICAgcmVjcmVhdGVTaW5nbGVBcHBseShjYWxsZUluc3RyKTsKKyAgICAgIHJlY3JlYXRlU2luZ2xlQXBwbHkoY2FsbGVJbnN0ciwgRGVsZXRlKTsKICAgICAgIGNhbGxlZSA9IGFwcGx5U2l0ZS5nZXRDYWxsZWUoKTsKICAgICB9CiAgIH0KQEAgLTI0ODEsMTk2ICsyNDkwLDIxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXM8U0lMRnVuY3Rpb25UeXBlPigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0Q2FsbGVlQ29udmVudGlvbigpOwogCi0gICAgYXV0byBuZXdBcHBseSA9Ci0gICAgICBhcHBseUJ1aWxkZXIuY3JlYXRlUGFydGlhbEFwcGx5KGNhc3RlZEFwcGx5LT5nZXRMb2MoKSwgY2FsbGVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNpdGUuZ2V0U3Vic3RpdHV0aW9uTWFwKCksIGNhbGxBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsQXBwbHlDb252ZW50aW9uKTsKKyAgICBhdXRvIG5ld0FwcGx5ID0gYXBwbHlCdWlsZGVyLmNyZWF0ZVBhcnRpYWxBcHBseSgKKyAgICAgICAgY2FzdGVkQXBwbHktPmdldExvYygpLCBjYWxsZWUsIGFwcGx5U2l0ZS5nZXRTdWJzdGl0dXRpb25NYXAoKSwgY2FsbEFyZ3MsCisgICAgICAgIHBhcnRpYWxBcHBseUNvbnZlbnRpb24sIGNhc3RlZEFwcGx5LT5pc09uU3RhY2soKSk7CiAgICAgY2FzdGVkQXBwbHktPnJlcGxhY2VBbGxVc2VzV2l0aChuZXdBcHBseSk7CiAgICAgYnJlYWs7CiAgIH0KICAgZGVmYXVsdDoKICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGluc3RyOiB1bmtub3duIGFwcGx5IHR5cGUiKTsKICAgfQotICBhcHBseUluc3QtPmdldFBhcmVudCgpLT5lcmFzZShhcHBseUluc3QpOworICBEZWxldGUucHVzaF9iYWNrKGFwcGx5SW5zdCk7CiB9CiAKLXZvaWQgTG9hZGFibGVCeUFkZHJlc3M6OnJlY3JlYXRlQXBwbGllcygpIHsKLSAgd2hpbGUgKCFtb2RBcHBsaWVzLmVtcHR5KCkpIHsKLSAgICBhdXRvICphcHBseUluc3QgPSBtb2RBcHBsaWVzLnBvcF9iYWNrX3ZhbCgpOwotICAgIHJlY3JlYXRlU2luZ2xlQXBwbHkoYXBwbHlJbnN0KTsKLSAgfQorYm9vbCBMb2FkYWJsZUJ5QWRkcmVzczo6cmVjcmVhdGVBcHBseSgKKyAgICBTSUxJbnN0cnVjdGlvbiAmSSwgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZEZWxldGUpIHsKKyAgaWYgKCFtb2RBcHBsaWVzLmNvdW50KCZJKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJlY3JlYXRlU2luZ2xlQXBwbHkoJkksIERlbGV0ZSk7CisgIG1vZEFwcGxpZXMucmVtb3ZlKCZJKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgTG9hZGFibGVCeUFkZHJlc3M6OnJlY3JlYXRlTG9hZEluc3RycygpIHsKLSAgZm9yIChhdXRvICpsb2FkSW5zdHIgOiBsb2FkSW5zdHJzT2ZGdW5jKSB7Ci0gICAgU0lMQnVpbGRlcldpdGhTY29wZSBsb2FkQnVpbGRlcihsb2FkSW5zdHIpOwotICAgIC8vIElmIHRoaXMgaXMgYSBsb2FkIG9mIGEgZnVuY3Rpb24gZm9yIHdoaWNoIHdlIGNoYW5nZWQgdGhlIHJldHVybiB0eXBlOgotICAgIC8vIGFkZCBVbmNoZWNrZWRCaXRDYXN0IGJlZm9yZSB0aGUgbG9hZAotICAgIGF1dG8gbG9hZE9wID0gbG9hZEluc3RyLT5nZXRPcGVyYW5kKCk7Ci0gICAgbG9hZE9wID0gZ2V0T3BlcmFuZFR5cGVXaXRoQ2FzdElmTmVjZXNzYXJ5KAotICAgICAgICBsb2FkSW5zdHIsIGxvYWRPcCwgKmdldElSR2VuTW9kdWxlKCksIGxvYWRCdWlsZGVyLCBNYXBwZXJDYWNoZSk7Ci0gICAgYXV0byAqbmV3SW5zdHIgPSBsb2FkQnVpbGRlci5jcmVhdGVMb2FkKGxvYWRJbnN0ci0+Z2V0TG9jKCksIGxvYWRPcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEluc3RyLT5nZXRPd25lcnNoaXBRdWFsaWZpZXIoKSk7Ci0gICAgbG9hZEluc3RyLT5yZXBsYWNlQWxsVXNlc1dpdGgobmV3SW5zdHIpOwotICAgIGxvYWRJbnN0ci0+Z2V0UGFyZW50KCktPmVyYXNlKGxvYWRJbnN0cik7Ci0gIH0KK2Jvb2wgTG9hZGFibGVCeUFkZHJlc3M6OnJlY3JlYXRlTG9hZEluc3RyKAorICAgIFNJTEluc3RydWN0aW9uICZJLCBTbWFsbFZlY3RvckltcGw8U0lMSW5zdHJ1Y3Rpb24gKj4gJkRlbGV0ZSkgeworICBhdXRvICpsb2FkSW5zdHIgPSBkeW5fY2FzdDxMb2FkSW5zdD4oJkkpOworICBpZiAoIWxvYWRJbnN0ciB8fCAhbG9hZEluc3Ryc09mRnVuYy5jb3VudChsb2FkSW5zdHIpKQorICAgIHJldHVybiBmYWxzZTsKKworICBTSUxCdWlsZGVyV2l0aFNjb3BlIGxvYWRCdWlsZGVyKGxvYWRJbnN0cik7CisgIC8vIElmIHRoaXMgaXMgYSBsb2FkIG9mIGEgZnVuY3Rpb24gZm9yIHdoaWNoIHdlIGNoYW5nZWQgdGhlIHJldHVybiB0eXBlOgorICAvLyBhZGQgVW5jaGVja2VkQml0Q2FzdCBiZWZvcmUgdGhlIGxvYWQKKyAgYXV0byBsb2FkT3AgPSBsb2FkSW5zdHItPmdldE9wZXJhbmQoKTsKKyAgbG9hZE9wID0gZ2V0T3BlcmFuZFR5cGVXaXRoQ2FzdElmTmVjZXNzYXJ5KAorICAgICAgbG9hZEluc3RyLCBsb2FkT3AsICpnZXRJUkdlbk1vZHVsZSgpLCBsb2FkQnVpbGRlciwgTWFwcGVyQ2FjaGUpOworICBhdXRvICpuZXdJbnN0ciA9IGxvYWRCdWlsZGVyLmNyZWF0ZUxvYWQobG9hZEluc3RyLT5nZXRMb2MoKSwgbG9hZE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEluc3RyLT5nZXRPd25lcnNoaXBRdWFsaWZpZXIoKSk7CisgIGxvYWRJbnN0ci0+cmVwbGFjZUFsbFVzZXNXaXRoKG5ld0luc3RyKTsKKyAgRGVsZXRlLnB1c2hfYmFjayhsb2FkSW5zdHIpOworICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBMb2FkYWJsZUJ5QWRkcmVzczo6cmVjcmVhdGVVbmNoZWNrZWRFbnVtRGF0YUluc3RycygpIHsKLSAgZm9yIChhdXRvICplbnVtSW5zdHIgOiB1bmNoZWNrZWRFbnVtRGF0YU9mRnVuYykgewotICAgIFNJTEJ1aWxkZXJXaXRoU2NvcGUgZW51bUJ1aWxkZXIoZW51bUluc3RyKTsKLSAgICBTSUxGdW5jdGlvbiAqRiA9IGVudW1JbnN0ci0+Z2V0RnVuY3Rpb24oKTsKLSAgICBJUkdlbk1vZHVsZSAqY3VycklSTW9kID0gZ2V0SVJHZW5Nb2R1bGUoKS0+SVJHZW4uZ2V0R2VuTW9kdWxlKEYpOwotICAgIFNJTFR5cGUgb3JpZ1R5cGUgPSBlbnVtSW5zdHItPmdldFR5cGUoKTsKLSAgICBHZW5lcmljRW52aXJvbm1lbnQgKmdlbkVudiA9IEYtPmdldEdlbmVyaWNFbnZpcm9ubWVudCgpOwotICAgIFNJTFR5cGUgbmV3VHlwZSA9IE1hcHBlckNhY2hlLmdldE5ld1NJTFR5cGUoZ2VuRW52LCBvcmlnVHlwZSwgKmN1cnJJUk1vZCk7Ci0gICAgYXV0byBjYXNlVHkgPSBlbnVtSW5zdHItPmdldE9wZXJhbmQoKS0+Z2V0VHlwZSgpLmdldEVudW1FbGVtZW50VHlwZSgKLSAgICAgICAgZW51bUluc3RyLT5nZXRFbGVtZW50KCksIEYtPmdldE1vZHVsZSgpKTsKLSAgICBTaW5nbGVWYWx1ZUluc3RydWN0aW9uICpuZXdJbnN0ciA9IG51bGxwdHI7Ci0gICAgaWYgKG5ld1R5cGUuaXNBZGRyZXNzKCkpIHsKLSAgICAgIG5ld1R5cGUgPSBuZXdUeXBlLmdldE9iamVjdFR5cGUoKTsKLSAgICB9Ci0gICAgaWYgKGNhc2VUeSAhPSBuZXdUeXBlKSB7Ci0gICAgICBhdXRvICp0YWtlRW51bSA9IGVudW1CdWlsZGVyLmNyZWF0ZVVuY2hlY2tlZEVudW1EYXRhKAotICAgICAgICAgIGVudW1JbnN0ci0+Z2V0TG9jKCksIGVudW1JbnN0ci0+Z2V0T3BlcmFuZCgpLCBlbnVtSW5zdHItPmdldEVsZW1lbnQoKSwKLSAgICAgICAgICBjYXNlVHkpOwotICAgICAgbmV3SW5zdHIgPSBlbnVtQnVpbGRlci5jcmVhdGVVbmNoZWNrZWRCaXRDYXN0KGVudW1JbnN0ci0+Z2V0TG9jKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZUVudW0sIG5ld1R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBuZXdJbnN0ciA9IGVudW1CdWlsZGVyLmNyZWF0ZVVuY2hlY2tlZEVudW1EYXRhKAotICAgICAgICAgIGVudW1JbnN0ci0+Z2V0TG9jKCksIGVudW1JbnN0ci0+Z2V0T3BlcmFuZCgpLCBlbnVtSW5zdHItPmdldEVsZW1lbnQoKSwKLSAgICAgICAgICBuZXdUeXBlKTsKLSAgICB9Ci0gICAgZW51bUluc3RyLT5yZXBsYWNlQWxsVXNlc1dpdGgobmV3SW5zdHIpOwotICAgIGVudW1JbnN0ci0+Z2V0UGFyZW50KCktPmVyYXNlKGVudW1JbnN0cik7Citib29sIExvYWRhYmxlQnlBZGRyZXNzOjpyZWNyZWF0ZVVuY2hlY2tlZEVudW1EYXRhSW5zdHIoCisgICAgU0lMSW5zdHJ1Y3Rpb24gJkksIFNtYWxsVmVjdG9ySW1wbDxTSUxJbnN0cnVjdGlvbiAqPiAmRGVsZXRlKSB7CisgIGF1dG8gZW51bUluc3RyID0gZHluX2Nhc3Q8VW5jaGVja2VkRW51bURhdGFJbnN0PigmSSk7CisgIGlmICghZW51bUluc3RyIHx8ICF1bmNoZWNrZWRFbnVtRGF0YU9mRnVuYy5jb3VudChlbnVtSW5zdHIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgU0lMQnVpbGRlcldpdGhTY29wZSBlbnVtQnVpbGRlcihlbnVtSW5zdHIpOworICBTSUxGdW5jdGlvbiAqRiA9IGVudW1JbnN0ci0+Z2V0RnVuY3Rpb24oKTsKKyAgSVJHZW5Nb2R1bGUgKmN1cnJJUk1vZCA9IGdldElSR2VuTW9kdWxlKCktPklSR2VuLmdldEdlbk1vZHVsZShGKTsKKyAgU0lMVHlwZSBvcmlnVHlwZSA9IGVudW1JbnN0ci0+Z2V0VHlwZSgpOworICBHZW5lcmljRW52aXJvbm1lbnQgKmdlbkVudiA9IEYtPmdldEdlbmVyaWNFbnZpcm9ubWVudCgpOworICBTSUxUeXBlIG5ld1R5cGUgPSBNYXBwZXJDYWNoZS5nZXROZXdTSUxUeXBlKGdlbkVudiwgb3JpZ1R5cGUsICpjdXJySVJNb2QpOworICBhdXRvIGNhc2VUeSA9IGVudW1JbnN0ci0+Z2V0T3BlcmFuZCgpLT5nZXRUeXBlKCkuZ2V0RW51bUVsZW1lbnRUeXBlKAorICAgICAgZW51bUluc3RyLT5nZXRFbGVtZW50KCksIEYtPmdldE1vZHVsZSgpKTsKKyAgU2luZ2xlVmFsdWVJbnN0cnVjdGlvbiAqbmV3SW5zdHIgPSBudWxscHRyOworICBpZiAobmV3VHlwZS5pc0FkZHJlc3MoKSkgeworICAgIG5ld1R5cGUgPSBuZXdUeXBlLmdldE9iamVjdFR5cGUoKTsKICAgfQorICBpZiAoY2FzZVR5ICE9IG5ld1R5cGUpIHsKKyAgICBhdXRvICp0YWtlRW51bSA9IGVudW1CdWlsZGVyLmNyZWF0ZVVuY2hlY2tlZEVudW1EYXRhKAorICAgICAgICBlbnVtSW5zdHItPmdldExvYygpLCBlbnVtSW5zdHItPmdldE9wZXJhbmQoKSwgZW51bUluc3RyLT5nZXRFbGVtZW50KCksCisgICAgICAgIGNhc2VUeSk7CisgICAgbmV3SW5zdHIgPSBlbnVtQnVpbGRlci5jcmVhdGVVbmNoZWNrZWRCaXRDYXN0KGVudW1JbnN0ci0+Z2V0TG9jKCksIHRha2VFbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdJbnN0ciA9IGVudW1CdWlsZGVyLmNyZWF0ZVVuY2hlY2tlZEVudW1EYXRhKAorICAgICAgICBlbnVtSW5zdHItPmdldExvYygpLCBlbnVtSW5zdHItPmdldE9wZXJhbmQoKSwgZW51bUluc3RyLT5nZXRFbGVtZW50KCksCisgICAgICAgIG5ld1R5cGUpOworICB9CisgIGVudW1JbnN0ci0+cmVwbGFjZUFsbFVzZXNXaXRoKG5ld0luc3RyKTsKKyAgRGVsZXRlLnB1c2hfYmFjayhlbnVtSW5zdHIpOworICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgTG9hZGFibGVCeUFkZHJlc3M6OnJlY3JlYXRlVW5jaGVja2VkVGFrZUVudW1EYXRhQWRkckluc3QoKSB7Ci0gIGZvciAoYXV0byAqZW51bUluc3RyIDogdW5jaGVja2VkVGFrZUVudW1EYXRhQWRkck9mRnVuYykgewotICAgIFNJTEJ1aWxkZXJXaXRoU2NvcGUgZW51bUJ1aWxkZXIoZW51bUluc3RyKTsKLSAgICBTSUxGdW5jdGlvbiAqRiA9IGVudW1JbnN0ci0+Z2V0RnVuY3Rpb24oKTsKLSAgICBJUkdlbk1vZHVsZSAqY3VycklSTW9kID0gZ2V0SVJHZW5Nb2R1bGUoKS0+SVJHZW4uZ2V0R2VuTW9kdWxlKEYpOwotICAgIFNJTFR5cGUgb3JpZ1R5cGUgPSBlbnVtSW5zdHItPmdldFR5cGUoKTsKLSAgICBHZW5lcmljRW52aXJvbm1lbnQgKmdlbkVudiA9IEYtPmdldEdlbmVyaWNFbnZpcm9ubWVudCgpOwotICAgIFNJTFR5cGUgbmV3VHlwZSA9IE1hcHBlckNhY2hlLmdldE5ld1NJTFR5cGUoZ2VuRW52LCBvcmlnVHlwZSwgKmN1cnJJUk1vZCk7Ci0gICAgYXV0byBjYXNlVHkgPSBlbnVtSW5zdHItPmdldE9wZXJhbmQoKS0+Z2V0VHlwZSgpLmdldEVudW1FbGVtZW50VHlwZSgKLSAgICAgICAgZW51bUluc3RyLT5nZXRFbGVtZW50KCksIEYtPmdldE1vZHVsZSgpKTsKLSAgICBTaW5nbGVWYWx1ZUluc3RydWN0aW9uICpuZXdJbnN0ciA9IG51bGxwdHI7Ci0gICAgaWYgKGNhc2VUeSAhPSBvcmlnVHlwZS5nZXRPYmplY3RUeXBlKCkpIHsKLSAgICAgIGF1dG8gKnRha2VFbnVtID0gZW51bUJ1aWxkZXIuY3JlYXRlVW5jaGVja2VkVGFrZUVudW1EYXRhQWRkcigKLSAgICAgICAgICBlbnVtSW5zdHItPmdldExvYygpLCBlbnVtSW5zdHItPmdldE9wZXJhbmQoKSwgZW51bUluc3RyLT5nZXRFbGVtZW50KCksCi0gICAgICAgICAgY2FzZVR5LmdldEFkZHJlc3NUeXBlKCkpOwotICAgICAgbmV3SW5zdHIgPSBlbnVtQnVpbGRlci5jcmVhdGVVbmNoZWNrZWRBZGRyQ2FzdCgKLSAgICAgICAgICBlbnVtSW5zdHItPmdldExvYygpLCB0YWtlRW51bSwgbmV3VHlwZS5nZXRBZGRyZXNzVHlwZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgbmV3SW5zdHIgPSBlbnVtQnVpbGRlci5jcmVhdGVVbmNoZWNrZWRUYWtlRW51bURhdGFBZGRyKAotICAgICAgICAgIGVudW1JbnN0ci0+Z2V0TG9jKCksIGVudW1JbnN0ci0+Z2V0T3BlcmFuZCgpLCBlbnVtSW5zdHItPmdldEVsZW1lbnQoKSwKLSAgICAgICAgICBuZXdUeXBlLmdldEFkZHJlc3NUeXBlKCkpOwotICAgIH0KLSAgICBlbnVtSW5zdHItPnJlcGxhY2VBbGxVc2VzV2l0aChuZXdJbnN0cik7Ci0gICAgZW51bUluc3RyLT5nZXRQYXJlbnQoKS0+ZXJhc2UoZW51bUluc3RyKTsKK2Jvb2wgTG9hZGFibGVCeUFkZHJlc3M6OnJlY3JlYXRlVW5jaGVja2VkVGFrZUVudW1EYXRhQWRkckluc3QoCisgICAgU0lMSW5zdHJ1Y3Rpb24gJkksIFNtYWxsVmVjdG9ySW1wbDxTSUxJbnN0cnVjdGlvbiAqPiAmRGVsZXRlKSB7CisgIGF1dG8gKmVudW1JbnN0ciA9IGR5bl9jYXN0PFVuY2hlY2tlZFRha2VFbnVtRGF0YUFkZHJJbnN0PigmSSk7CisgIGlmICghZW51bUluc3RyIHx8ICF1bmNoZWNrZWRUYWtlRW51bURhdGFBZGRyT2ZGdW5jLmNvdW50KGVudW1JbnN0cikpCisgICAgcmV0dXJuIGZhbHNlOworICBTSUxCdWlsZGVyV2l0aFNjb3BlIGVudW1CdWlsZGVyKGVudW1JbnN0cik7CisgIFNJTEZ1bmN0aW9uICpGID0gZW51bUluc3RyLT5nZXRGdW5jdGlvbigpOworICBJUkdlbk1vZHVsZSAqY3VycklSTW9kID0gZ2V0SVJHZW5Nb2R1bGUoKS0+SVJHZW4uZ2V0R2VuTW9kdWxlKEYpOworICBTSUxUeXBlIG9yaWdUeXBlID0gZW51bUluc3RyLT5nZXRUeXBlKCk7CisgIEdlbmVyaWNFbnZpcm9ubWVudCAqZ2VuRW52ID0gRi0+Z2V0R2VuZXJpY0Vudmlyb25tZW50KCk7CisgIFNJTFR5cGUgbmV3VHlwZSA9IE1hcHBlckNhY2hlLmdldE5ld1NJTFR5cGUoZ2VuRW52LCBvcmlnVHlwZSwgKmN1cnJJUk1vZCk7CisgIGF1dG8gY2FzZVR5ID0gZW51bUluc3RyLT5nZXRPcGVyYW5kKCktPmdldFR5cGUoKS5nZXRFbnVtRWxlbWVudFR5cGUoCisgICAgICBlbnVtSW5zdHItPmdldEVsZW1lbnQoKSwgRi0+Z2V0TW9kdWxlKCkpOworICBTaW5nbGVWYWx1ZUluc3RydWN0aW9uICpuZXdJbnN0ciA9IG51bGxwdHI7CisgIGlmIChjYXNlVHkgIT0gb3JpZ1R5cGUuZ2V0T2JqZWN0VHlwZSgpKSB7CisgICAgYXV0byAqdGFrZUVudW0gPSBlbnVtQnVpbGRlci5jcmVhdGVVbmNoZWNrZWRUYWtlRW51bURhdGFBZGRyKAorICAgICAgICBlbnVtSW5zdHItPmdldExvYygpLCBlbnVtSW5zdHItPmdldE9wZXJhbmQoKSwgZW51bUluc3RyLT5nZXRFbGVtZW50KCksCisgICAgICAgIGNhc2VUeS5nZXRBZGRyZXNzVHlwZSgpKTsKKyAgICBuZXdJbnN0ciA9IGVudW1CdWlsZGVyLmNyZWF0ZVVuY2hlY2tlZEFkZHJDYXN0KAorICAgICAgICBlbnVtSW5zdHItPmdldExvYygpLCB0YWtlRW51bSwgbmV3VHlwZS5nZXRBZGRyZXNzVHlwZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdJbnN0ciA9IGVudW1CdWlsZGVyLmNyZWF0ZVVuY2hlY2tlZFRha2VFbnVtRGF0YUFkZHIoCisgICAgICAgIGVudW1JbnN0ci0+Z2V0TG9jKCksIGVudW1JbnN0ci0+Z2V0T3BlcmFuZCgpLCBlbnVtSW5zdHItPmdldEVsZW1lbnQoKSwKKyAgICAgICAgbmV3VHlwZS5nZXRBZGRyZXNzVHlwZSgpKTsKICAgfQorICBlbnVtSW5zdHItPnJlcGxhY2VBbGxVc2VzV2l0aChuZXdJbnN0cik7CisgIERlbGV0ZS5wdXNoX2JhY2soZW51bUluc3RyKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgTG9hZGFibGVCeUFkZHJlc3M6OmZpeFN0b3JlVG9CbG9ja1N0b3JhZ2VJbnN0cnMoKSB7Ci0gIGZvciAoYXV0byAqaW5zdHIgOiBzdG9yZVRvQmxvY2tTdG9yYWdlSW5zdHJzKSB7Ci0gICAgYXV0byBkZXN0ID0gaW5zdHItPmdldERlc3QoKTsKLSAgICBhdXRvIGRlc3RCbG9jayA9IGNhc3Q8UHJvamVjdEJsb2NrU3RvcmFnZUluc3Q+KGRlc3QpOwotICAgIFNJTFR5cGUgZGVzdFR5cGUgPSBkZXN0QmxvY2stPmdldFR5cGUoKTsKLSAgICBhdXRvIHNyYyA9IGluc3RyLT5nZXRTcmMoKTsKLSAgICBTSUxUeXBlIHNyY1R5cGUgPSBzcmMtPmdldFR5cGUoKTsKLSAgICBpZiAoZGVzdFR5cGUuZ2V0T2JqZWN0VHlwZSgpICE9IHNyY1R5cGUpIHsKLSAgICAgIC8vIEFkZCBjYXN0IHRvIGRlc3RUeXBlCi0gICAgICBTSUxCdWlsZGVyV2l0aFNjb3BlIGNhc3RCdWlsZGVyKGluc3RyKTsKLSAgICAgIGF1dG8gKmNhc3RJbnN0ciA9IGNhc3RCdWlsZGVyLmNyZWF0ZVVuY2hlY2tlZEJpdENhc3QoCi0gICAgICAgICAgaW5zdHItPmdldExvYygpLCBzcmMsIGRlc3RUeXBlLmdldE9iamVjdFR5cGUoKSk7Ci0gICAgICBpbnN0ci0+c2V0T3BlcmFuZChTdG9yZUluc3Q6OlNyYywgY2FzdEluc3RyKTsKLSAgICB9Citib29sIExvYWRhYmxlQnlBZGRyZXNzOjpmaXhTdG9yZVRvQmxvY2tTdG9yYWdlSW5zdHIoCisgICAgU0lMSW5zdHJ1Y3Rpb24gJkksIFNtYWxsVmVjdG9ySW1wbDxTSUxJbnN0cnVjdGlvbiAqPiAmRGVsZXRlKSB7CisgIGF1dG8gKmluc3RyID0gZHluX2Nhc3Q8U3RvcmVJbnN0PigmSSk7CisgIGlmICghaW5zdHIgfHwgIXN0b3JlVG9CbG9ja1N0b3JhZ2VJbnN0cnMuY291bnQoaW5zdHIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgYXV0byBkZXN0ID0gaW5zdHItPmdldERlc3QoKTsKKyAgYXV0byBkZXN0QmxvY2sgPSBjYXN0PFByb2plY3RCbG9ja1N0b3JhZ2VJbnN0PihkZXN0KTsKKyAgU0lMVHlwZSBkZXN0VHlwZSA9IGRlc3RCbG9jay0+Z2V0VHlwZSgpOworICBhdXRvIHNyYyA9IGluc3RyLT5nZXRTcmMoKTsKKyAgU0lMVHlwZSBzcmNUeXBlID0gc3JjLT5nZXRUeXBlKCk7CisgIGlmIChkZXN0VHlwZS5nZXRPYmplY3RUeXBlKCkgIT0gc3JjVHlwZSkgeworICAgIC8vIEFkZCBjYXN0IHRvIGRlc3RUeXBlCisgICAgU0lMQnVpbGRlcldpdGhTY29wZSBjYXN0QnVpbGRlcihpbnN0cik7CisgICAgYXV0byAqY2FzdEluc3RyID0gY2FzdEJ1aWxkZXIuY3JlYXRlVW5jaGVja2VkQml0Q2FzdCgKKyAgICAgICAgaW5zdHItPmdldExvYygpLCBzcmMsIGRlc3RUeXBlLmdldE9iamVjdFR5cGUoKSk7CisgICAgaW5zdHItPnNldE9wZXJhbmQoU3RvcmVJbnN0OjpTcmMsIGNhc3RJbnN0cik7CiAgIH0KKyAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgTG9hZGFibGVCeUFkZHJlc3M6OnJlY3JlYXRlQ29udkluc3RycygpIHsKLSAgZm9yIChhdXRvICpjb252SW5zdHIgOiBjb252ZXJzaW9uSW5zdHJzKSB7Ci0gICAgSVJHZW5Nb2R1bGUgKmN1cnJJUk1vZCA9Ci0gICAgICAgIGdldElSR2VuTW9kdWxlKCktPklSR2VuLmdldEdlbk1vZHVsZShjb252SW5zdHItPmdldEZ1bmN0aW9uKCkpOwotICAgIFNJTFR5cGUgY3VyclNJTFR5cGUgPSBjb252SW5zdHItPmdldFR5cGUoKTsKLSAgICBpZiAoYXV0byAqdGhpblRvUG9pbnRlciA9IGR5bl9jYXN0PFRoaW5GdW5jdGlvblRvUG9pbnRlckluc3Q+KGNvbnZJbnN0cikpIHsKLSAgICAgIGN1cnJTSUxUeXBlID0gdGhpblRvUG9pbnRlci0+Z2V0T3BlcmFuZCgpLT5nZXRUeXBlKCk7Ci0gICAgfQotICAgIGF1dG8gY3VyclNJTEZ1bmN0aW9uVHlwZSA9IGN1cnJTSUxUeXBlLmNhc3RUbzxTSUxGdW5jdGlvblR5cGU+KCk7Ci0gICAgR2VuZXJpY0Vudmlyb25tZW50ICpnZW5FbnYgPQotICAgICAgICBjb252SW5zdHItPmdldEZ1bmN0aW9uKCktPmdldEdlbmVyaWNFbnZpcm9ubWVudCgpOwotICAgIENhblNJTEZ1bmN0aW9uVHlwZSBuZXdGblR5cGUgPSBNYXBwZXJDYWNoZS5nZXROZXdTSUxGdW5jdGlvblR5cGUoCi0gICAgICAgIGdlbkVudiwgY3VyclNJTEZ1bmN0aW9uVHlwZSwgKmN1cnJJUk1vZCk7Ci0gICAgU0lMVHlwZSBuZXdUeXBlID0gU0lMVHlwZTo6Z2V0UHJpbWl0aXZlT2JqZWN0VHlwZShuZXdGblR5cGUpOwotICAgIFNJTEJ1aWxkZXJXaXRoU2NvcGUgY29udkJ1aWxkZXIoY29udkluc3RyKTsKLSAgICBTaW5nbGVWYWx1ZUluc3RydWN0aW9uICpuZXdJbnN0ciA9IG51bGxwdHI7Ci0gICAgc3dpdGNoIChjb252SW5zdHItPmdldEtpbmQoKSkgewotICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpUaGluVG9UaGlja0Z1bmN0aW9uSW5zdDogewotICAgICAgYXV0byBpbnN0ciA9IGNhc3Q8VGhpblRvVGhpY2tGdW5jdGlvbkluc3Q+KGNvbnZJbnN0cik7Ci0gICAgICBuZXdJbnN0ciA9IGNvbnZCdWlsZGVyLmNyZWF0ZVRoaW5Ub1RoaWNrRnVuY3Rpb24oCi0gICAgICAgICAgaW5zdHItPmdldExvYygpLCBpbnN0ci0+Z2V0T3BlcmFuZCgpLCBuZXdUeXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6VGhpbkZ1bmN0aW9uVG9Qb2ludGVySW5zdDogewotICAgICAgYXV0byBpbnN0ciA9IGNhc3Q8VGhpbkZ1bmN0aW9uVG9Qb2ludGVySW5zdD4oY29udkluc3RyKTsKLSAgICAgIG5ld1R5cGUgPSBNYXBwZXJDYWNoZS5nZXROZXdTSUxUeXBlKGdlbkVudiwgaW5zdHItPmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpnZXRJUkdlbk1vZHVsZSgpKTsKLSAgICAgIG5ld0luc3RyID0gY29udkJ1aWxkZXIuY3JlYXRlVGhpbkZ1bmN0aW9uVG9Qb2ludGVyKAotICAgICAgICAgIGluc3RyLT5nZXRMb2MoKSwgaW5zdHItPmdldE9wZXJhbmQoKSwgbmV3VHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OkNvbnZlcnRGdW5jdGlvbkluc3Q6IHsKLSAgICAgIGF1dG8gaW5zdHIgPSBjYXN0PENvbnZlcnRGdW5jdGlvbkluc3Q+KGNvbnZJbnN0cik7Ci0gICAgICBuZXdJbnN0ciA9IGNvbnZCdWlsZGVyLmNyZWF0ZUNvbnZlcnRGdW5jdGlvbigKLSAgICAgICAgICBpbnN0ci0+Z2V0TG9jKCksIGluc3RyLT5nZXRPcGVyYW5kKCksIG5ld1R5cGUsCi0gICAgICAgICAgaW5zdHItPndpdGhvdXRBY3R1YWxseUVzY2FwaW5nKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpDb252ZXJ0RXNjYXBlVG9Ob0VzY2FwZUluc3Q6IHsKLSAgICAgIGF1dG8gaW5zdHIgPSBjYXN0PENvbnZlcnRFc2NhcGVUb05vRXNjYXBlSW5zdD4oY29udkluc3RyKTsKLSAgICAgIG5ld0luc3RyID0gY29udkJ1aWxkZXIuY3JlYXRlQ29udmVydEVzY2FwZVRvTm9Fc2NhcGUoCi0gICAgICAgICAgaW5zdHItPmdldExvYygpLCBpbnN0ci0+Z2V0T3BlcmFuZCgpLCBuZXdUeXBlLAotICAgICAgICAgIGluc3RyLT5pc0xpZmV0aW1lR3VhcmFudGVlZCgpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6TWFya0RlcGVuZGVuY2VJbnN0OiB7Ci0gICAgICBhdXRvIGluc3RyID0gY2FzdDxNYXJrRGVwZW5kZW5jZUluc3Q+KGNvbnZJbnN0cik7Ci0gICAgICBuZXdJbnN0ciA9IGNvbnZCdWlsZGVyLmNyZWF0ZU1hcmtEZXBlbmRlbmNlKAotICAgICAgICAgIGluc3RyLT5nZXRMb2MoKSwgaW5zdHItPmdldFZhbHVlKCksIGluc3RyLT5nZXRCYXNlKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICBkZWZhdWx0OgotICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBjb252ZXJzaW9uIGluc3RydWN0aW9uIik7Ci0gICAgfQotICAgIGNvbnZJbnN0ci0+cmVwbGFjZUFsbFVzZXNXaXRoKG5ld0luc3RyKTsKLSAgICBjb252SW5zdHItPmdldFBhcmVudCgpLT5lcmFzZShjb252SW5zdHIpOworYm9vbCBMb2FkYWJsZUJ5QWRkcmVzczo6cmVjcmVhdGVDb252SW5zdHIoU0lMSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZEZWxldGUpIHsKKyAgYXV0byAqY29udkluc3RyID0gZHluX2Nhc3Q8U2luZ2xlVmFsdWVJbnN0cnVjdGlvbj4oJkkpOworICBpZiAoIWNvbnZJbnN0ciB8fCAhY29udmVyc2lvbkluc3Rycy5jb3VudChjb252SW5zdHIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgSVJHZW5Nb2R1bGUgKmN1cnJJUk1vZCA9CisgICAgICBnZXRJUkdlbk1vZHVsZSgpLT5JUkdlbi5nZXRHZW5Nb2R1bGUoY29udkluc3RyLT5nZXRGdW5jdGlvbigpKTsKKyAgU0lMVHlwZSBjdXJyU0lMVHlwZSA9IGNvbnZJbnN0ci0+Z2V0VHlwZSgpOworICBpZiAoYXV0byAqdGhpblRvUG9pbnRlciA9IGR5bl9jYXN0PFRoaW5GdW5jdGlvblRvUG9pbnRlckluc3Q+KGNvbnZJbnN0cikpIHsKKyAgICBjdXJyU0lMVHlwZSA9IHRoaW5Ub1BvaW50ZXItPmdldE9wZXJhbmQoKS0+Z2V0VHlwZSgpOwogICB9CisgIGF1dG8gY3VyclNJTEZ1bmN0aW9uVHlwZSA9IGN1cnJTSUxUeXBlLmNhc3RUbzxTSUxGdW5jdGlvblR5cGU+KCk7CisgIEdlbmVyaWNFbnZpcm9ubWVudCAqZ2VuRW52ID0KKyAgICAgIGNvbnZJbnN0ci0+Z2V0RnVuY3Rpb24oKS0+Z2V0R2VuZXJpY0Vudmlyb25tZW50KCk7CisgIENhblNJTEZ1bmN0aW9uVHlwZSBuZXdGblR5cGUgPSBNYXBwZXJDYWNoZS5nZXROZXdTSUxGdW5jdGlvblR5cGUoCisgICAgICBnZW5FbnYsIGN1cnJTSUxGdW5jdGlvblR5cGUsICpjdXJySVJNb2QpOworICBTSUxUeXBlIG5ld1R5cGUgPSBTSUxUeXBlOjpnZXRQcmltaXRpdmVPYmplY3RUeXBlKG5ld0ZuVHlwZSk7CisgIFNJTEJ1aWxkZXJXaXRoU2NvcGUgY29udkJ1aWxkZXIoY29udkluc3RyKTsKKyAgU2luZ2xlVmFsdWVJbnN0cnVjdGlvbiAqbmV3SW5zdHIgPSBudWxscHRyOworICBzd2l0Y2ggKGNvbnZJbnN0ci0+Z2V0S2luZCgpKSB7CisgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpUaGluVG9UaGlja0Z1bmN0aW9uSW5zdDogeworICAgIGF1dG8gaW5zdHIgPSBjYXN0PFRoaW5Ub1RoaWNrRnVuY3Rpb25JbnN0Pihjb252SW5zdHIpOworICAgIG5ld0luc3RyID0gY29udkJ1aWxkZXIuY3JlYXRlVGhpblRvVGhpY2tGdW5jdGlvbigKKyAgICAgICAgaW5zdHItPmdldExvYygpLCBpbnN0ci0+Z2V0T3BlcmFuZCgpLCBuZXdUeXBlKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6VGhpbkZ1bmN0aW9uVG9Qb2ludGVySW5zdDogeworICAgIGF1dG8gaW5zdHIgPSBjYXN0PFRoaW5GdW5jdGlvblRvUG9pbnRlckluc3Q+KGNvbnZJbnN0cik7CisgICAgbmV3VHlwZSA9CisgICAgICAgIE1hcHBlckNhY2hlLmdldE5ld1NJTFR5cGUoZ2VuRW52LCBpbnN0ci0+Z2V0VHlwZSgpLCAqZ2V0SVJHZW5Nb2R1bGUoKSk7CisgICAgbmV3SW5zdHIgPSBjb252QnVpbGRlci5jcmVhdGVUaGluRnVuY3Rpb25Ub1BvaW50ZXIoCisgICAgICAgIGluc3RyLT5nZXRMb2MoKSwgaW5zdHItPmdldE9wZXJhbmQoKSwgbmV3VHlwZSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OkNvbnZlcnRGdW5jdGlvbkluc3Q6IHsKKyAgICBhdXRvIGluc3RyID0gY2FzdDxDb252ZXJ0RnVuY3Rpb25JbnN0Pihjb252SW5zdHIpOworICAgIG5ld0luc3RyID0gY29udkJ1aWxkZXIuY3JlYXRlQ29udmVydEZ1bmN0aW9uKAorICAgICAgICBpbnN0ci0+Z2V0TG9jKCksIGluc3RyLT5nZXRPcGVyYW5kKCksIG5ld1R5cGUsCisgICAgICAgIGluc3RyLT53aXRob3V0QWN0dWFsbHlFc2NhcGluZygpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6Q29udmVydEVzY2FwZVRvTm9Fc2NhcGVJbnN0OiB7CisgICAgYXV0byBpbnN0ciA9IGNhc3Q8Q29udmVydEVzY2FwZVRvTm9Fc2NhcGVJbnN0Pihjb252SW5zdHIpOworICAgIG5ld0luc3RyID0gY29udkJ1aWxkZXIuY3JlYXRlQ29udmVydEVzY2FwZVRvTm9Fc2NhcGUoCisgICAgICAgIGluc3RyLT5nZXRMb2MoKSwgaW5zdHItPmdldE9wZXJhbmQoKSwgbmV3VHlwZSwKKyAgICAgICAgaW5zdHItPmlzTGlmZXRpbWVHdWFyYW50ZWVkKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpNYXJrRGVwZW5kZW5jZUluc3Q6IHsKKyAgICBhdXRvIGluc3RyID0gY2FzdDxNYXJrRGVwZW5kZW5jZUluc3Q+KGNvbnZJbnN0cik7CisgICAgbmV3SW5zdHIgPSBjb252QnVpbGRlci5jcmVhdGVNYXJrRGVwZW5kZW5jZSgKKyAgICAgICAgaW5zdHItPmdldExvYygpLCBpbnN0ci0+Z2V0VmFsdWUoKSwgaW5zdHItPmdldEJhc2UoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb24iKTsKKyAgfQorICBjb252SW5zdHItPnJlcGxhY2VBbGxVc2VzV2l0aChuZXdJbnN0cik7CisgIERlbGV0ZS5wdXNoX2JhY2soY29udkluc3RyKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgTG9hZGFibGVCeUFkZHJlc3M6OnJlY3JlYXRlQnVpbHRpbkluc3RycygpIHsKLSAgZm9yIChhdXRvICpidWlsdGluSW5zdHIgOiBidWlsdGluSW5zdHJzKSB7Ci0gICAgYXV0byAqY3VycklSTW9kID0KLSAgICAgICAgZ2V0SVJHZW5Nb2R1bGUoKS0+SVJHZW4uZ2V0R2VuTW9kdWxlKGJ1aWx0aW5JbnN0ci0+Z2V0RnVuY3Rpb24oKSk7Ci0gICAgYXV0byAqRiA9IGJ1aWx0aW5JbnN0ci0+Z2V0RnVuY3Rpb24oKTsKLSAgICBHZW5lcmljRW52aXJvbm1lbnQgKmdlbkVudiA9IEYtPmdldEdlbmVyaWNFbnZpcm9ubWVudCgpOwotICAgIGF1dG8gcmVzdWx0VHkgPSBidWlsdGluSW5zdHItPmdldFR5cGUoKTsKLSAgICBhdXRvIG5ld1Jlc3VsdFR5ID0gTWFwcGVyQ2FjaGUuZ2V0TmV3U0lMVHlwZShnZW5FbnYsIHJlc3VsdFR5LCAqY3VycklSTW9kKTsKK2Jvb2wgTG9hZGFibGVCeUFkZHJlc3M6OnJlY3JlYXRlQnVpbHRpbkluc3RyKFNJTEluc3RydWN0aW9uICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTSUxJbnN0cnVjdGlvbiAqPiAmRGVsZXRlKSB7CisJYXV0byBidWlsdGluSW5zdHIgPSBkeW5fY2FzdDxCdWlsdGluSW5zdD4oJkkpOworICBpZiAoIWJ1aWx0aW5JbnN0ciB8fCAhYnVpbHRpbkluc3Rycy5jb3VudChidWlsdGluSW5zdHIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgYXV0byAqY3VycklSTW9kID0KKyAgICAgIGdldElSR2VuTW9kdWxlKCktPklSR2VuLmdldEdlbk1vZHVsZShidWlsdGluSW5zdHItPmdldEZ1bmN0aW9uKCkpOworICBhdXRvICpGID0gYnVpbHRpbkluc3RyLT5nZXRGdW5jdGlvbigpOworICBHZW5lcmljRW52aXJvbm1lbnQgKmdlbkVudiA9IEYtPmdldEdlbmVyaWNFbnZpcm9ubWVudCgpOworICBhdXRvIHJlc3VsdFR5ID0gYnVpbHRpbkluc3RyLT5nZXRUeXBlKCk7CisgIGF1dG8gbmV3UmVzdWx0VHkgPSBNYXBwZXJDYWNoZS5nZXROZXdTSUxUeXBlKGdlbkVudiwgcmVzdWx0VHksICpjdXJySVJNb2QpOwogCi0gICAgbGx2bTo6U21hbGxWZWN0b3I8U0lMVmFsdWUsIDU+IG5ld0FyZ3M7Ci0gICAgZm9yIChhdXRvIG9sZEFyZyA6IGJ1aWx0aW5JbnN0ci0+Z2V0QXJndW1lbnRzKCkpIHsKLSAgICAgIG5ld0FyZ3MucHVzaF9iYWNrKG9sZEFyZyk7Ci0gICAgfQotCi0gICAgU0lMQnVpbGRlcldpdGhTY29wZSBidWlsdGluQnVpbGRlcihidWlsdGluSW5zdHIpOwotICAgIGF1dG8gKm5ld0luc3RyID0gYnVpbHRpbkJ1aWxkZXIuY3JlYXRlQnVpbHRpbigKLSAgICAgICAgYnVpbHRpbkluc3RyLT5nZXRMb2MoKSwgYnVpbHRpbkluc3RyLT5nZXROYW1lKCksIG5ld1Jlc3VsdFR5LAotICAgICAgICBidWlsdGluSW5zdHItPmdldFN1YnN0aXR1dGlvbnMoKSwKLSAgICAgICAgbmV3QXJncyk7Ci0gICAgYnVpbHRpbkluc3RyLT5yZXBsYWNlQWxsVXNlc1dpdGgobmV3SW5zdHIpOwotICAgIGJ1aWx0aW5JbnN0ci0+Z2V0UGFyZW50KCktPmVyYXNlKGJ1aWx0aW5JbnN0cik7CisgIGxsdm06OlNtYWxsVmVjdG9yPFNJTFZhbHVlLCA1PiBuZXdBcmdzOworICBmb3IgKGF1dG8gb2xkQXJnIDogYnVpbHRpbkluc3RyLT5nZXRBcmd1bWVudHMoKSkgeworICAgIG5ld0FyZ3MucHVzaF9iYWNrKG9sZEFyZyk7CiAgIH0KKworICBTSUxCdWlsZGVyV2l0aFNjb3BlIGJ1aWx0aW5CdWlsZGVyKGJ1aWx0aW5JbnN0cik7CisgIGF1dG8gKm5ld0luc3RyID0gYnVpbHRpbkJ1aWxkZXIuY3JlYXRlQnVpbHRpbigKKyAgICAgIGJ1aWx0aW5JbnN0ci0+Z2V0TG9jKCksIGJ1aWx0aW5JbnN0ci0+Z2V0TmFtZSgpLCBuZXdSZXN1bHRUeSwKKyAgICAgIGJ1aWx0aW5JbnN0ci0+Z2V0U3Vic3RpdHV0aW9ucygpLCBuZXdBcmdzKTsKKyAgYnVpbHRpbkluc3RyLT5yZXBsYWNlQWxsVXNlc1dpdGgobmV3SW5zdHIpOworICBEZWxldGUucHVzaF9iYWNrKGJ1aWx0aW5JbnN0cik7CisgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIExvYWRhYmxlQnlBZGRyZXNzOjp1cGRhdGVMb3dlcmVkVHlwZXMoU0lMRnVuY3Rpb24gKkYpIHsKQEAgLTI4MTcsMjYgKzI4NDUsMzEgQEAKICAgICBpbnN0ci0+Z2V0UGFyZW50KCktPmVyYXNlKGluc3RyKTsKICAgfQogCi0gIC8vIFJlLWNyZWF0ZSBhbGwgY29udmVyc2lvbnMgZm9yIHdoaWNoIHdlIG1vZGlmaWVkIHRoZSBGdW5jdGlvblJlZgotICByZWNyZWF0ZUNvbnZJbnN0cnMoKTsKLQotICAvLyBSZS1jcmVhdGUgYWxsIGJ1aWx0aW5zIGZvciB3aGljaCB3ZSBtb2RpZmllZCB0aGUgRnVuY3Rpb25SZWYKLSAgcmVjcmVhdGVCdWlsdGluSW5zdHJzKCk7Ci0KLSAgLy8gUmUtY3JlYXRlIGFsbCB1bmNoZWNrZWQgZW51bSBkYXRhIGluc3RycyBvZiBmdW5jdGlvbiBwb2ludGVycwotICByZWNyZWF0ZVVuY2hlY2tlZEVudW1EYXRhSW5zdHJzKCk7Ci0KLSAgLy8gU2FtZSBmb3IgZGF0YSBhZGRyCi0gIHJlY3JlYXRlVW5jaGVja2VkVGFrZUVudW1EYXRhQWRkckluc3QoKTsKLQotICAvLyBSZS1jcmVhdGUgYWxsIGxvYWQgaW5zdHJzIG9mIGZ1bmN0aW9uIHBvaW50ZXJzCi0gIHJlY3JlYXRlTG9hZEluc3RycygpOwotCi0gIC8vIFJlLWNyZWF0ZSBhbGwgYXBwbGllcyB0aGF0IHdlIG1vZGlmaWVkIGluIHRoZSBtb2R1bGUKLSAgcmVjcmVhdGVBcHBsaWVzKCk7Ci0KLSAgLy8gRml4IGFsbCBpbnN0cnVjdGlvbnMgdGhhdCByZWx5IG9uIGJsb2NrIHN0b3JhZ2UgdHlwZQotICBmaXhTdG9yZVRvQmxvY2tTdG9yYWdlSW5zdHJzKCk7CisgIC8vIFJlY3JlYXRlIHRoZSBpbnN0cnVjdGlvbnMgaW4gdG9wb2xvZ2ljYWwgb3JkZXIuIFNvbWUgaW5zdHJ1Y3Rpb25zIGluaGVyaXQKKyAgLy8gdGhlaXIgcmVzdWx0IHR5cGUgZnJvbSB0aGVpciBvcGVyYW5kLgorICBmb3IgKFNJTEZ1bmN0aW9uICZDdXJyRiA6ICpnZXRNb2R1bGUoKSkgeworICAgIFNtYWxsVmVjdG9yPFNJTEluc3RydWN0aW9uICosIDMyPiBEZWxldGU7CisgICAgZm9yIChTSUxCYXNpY0Jsb2NrICZCQiA6IEN1cnJGKSB7CisgICAgICBmb3IgKFNJTEluc3RydWN0aW9uICZJIDogQkIpIHsKKyAgICAgICAgaWYgKHJlY3JlYXRlQ29udkluc3RyKEksIERlbGV0ZSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgaWYgKHJlY3JlYXRlQnVpbHRpbkluc3RyKEksIERlbGV0ZSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgaWYgKHJlY3JlYXRlVW5jaGVja2VkRW51bURhdGFJbnN0cihJLCBEZWxldGUpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBlbHNlIGlmIChyZWNyZWF0ZVVuY2hlY2tlZFRha2VFbnVtRGF0YUFkZHJJbnN0KEksIERlbGV0ZSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgaWYgKHJlY3JlYXRlTG9hZEluc3RyKEksIERlbGV0ZSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgaWYgKHJlY3JlYXRlQXBwbHkoSSwgRGVsZXRlKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZpeFN0b3JlVG9CbG9ja1N0b3JhZ2VJbnN0cihJLCBEZWxldGUpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8gKkluc3QgOiBEZWxldGUpCisgICAgICBJbnN0LT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgfQogCiAgIC8vIENsZWFuIHVwIHRoZSBkYXRhIHN0cnVjdHM6CiAgIG1vZEZ1bmNzLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9saWIvUGFyc2UvQ01ha2VMaXN0cy50eHQgYi9saWIvUGFyc2UvQ01ha2VMaXN0cy50eHQKaW5kZXggZGNiN2JkYy4uODkxNTc5YyAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9QYXJzZS9DTWFrZUxpc3RzLnR4dApAQCAtMTMsNiArMTMsNyBAQAogICBQYXJzZWRTeW50YXhCdWlsZGVycy5jcHAuZ3liCiAgIFBhcnNlZFN5bnRheE5vZGVzLmNwcC5neWIKICAgUGFyc2VkU3ludGF4UmVjb3JkZXIuY3BwLmd5YgorICBQYXJzZWRUcml2aWEuY3BwCiAgIFBhcnNlRXhwci5jcHAKICAgUGFyc2VHZW5lcmljLmNwcAogICBQYXJzZUlmQ29uZmlnLmNwcApkaWZmIC0tZ2l0IGEvbGliL1BhcnNlL0xleGVyLmNwcCBiL2xpYi9QYXJzZS9MZXhlci5jcHAKaW5kZXggMDk1ZmY2OS4uNTU1NWNhZiAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL0xleGVyLmNwcAorKysgYi9saWIvUGFyc2UvTGV4ZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAic3dpZnQvQVNUL0lkZW50aWZpZXIuaCIKICNpbmNsdWRlICJzd2lmdC9CYXNpYy9MYW5nT3B0aW9ucy5oIgogI2luY2x1ZGUgInN3aWZ0L0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJzd2lmdC9TeW50YXgvVHJpdmlhLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCkBAIC0yODQsMTUgKzI4NSwxNSBAQAogICBpZiAoUmV0YWluQ29tbWVudHMgPT0gQ29tbWVudFJldGVudGlvbk1vZGU6OkF0dGFjaFRvTmV4dFRva2VuKSB7CiAgICAgLy8gJ0NvbW1lbnRMZW5ndGgnIGhlcmUgaXMgdGhlIGxlbmd0aCBmcm9tIHRoZSAqZmlyc3QqIGNvbW1lbnQgdG8gdGhlCiAgICAgLy8gdG9rZW4gdGV4dCAob3IgaXRzIGJhY2t0aWNrIGlmIGV4aXN0KS4KLSAgICBhdXRvIEl0ZXIgPSBsbHZtOjpmaW5kX2lmKExlYWRpbmdUcml2aWEsIFtdKGNvbnN0IFRyaXZpYVBpZWNlICZQaWVjZSkgewotICAgICAgcmV0dXJuIFBpZWNlLmlzQ29tbWVudCgpOworICAgIGF1dG8gSXRlciA9IGxsdm06OmZpbmRfaWYoTGVhZGluZ1RyaXZpYSwgW10oY29uc3QgUGFyc2VkVHJpdmlhUGllY2UgJlBpZWNlKSB7CisgICAgICByZXR1cm4gaXNDb21tZW50VHJpdmlhS2luZChQaWVjZS5nZXRLaW5kKCkpOwogICAgIH0pOwogICAgIGZvciAoYXV0byBFbmQgPSBMZWFkaW5nVHJpdmlhLmVuZCgpOyBJdGVyICE9IEVuZDsgSXRlcisrKSB7CiAgICAgICBpZiAoSXRlci0+Z2V0S2luZCgpID09IFRyaXZpYUtpbmQ6OkJhY2t0aWNrKQogICAgICAgICAvLyBTaW5jZSBUb2tlbjo6Z2V0Q29tbWVudFJhbmdlKCkgZG9lc24ndCB0YWtlIGJhY2t0aWNrIGludG8gYWNjb3VudCwKICAgICAgICAgLy8gd2UgY2Fubm90IGluY2x1ZGUgbGVuZ3RoIG9mIGJhY2t0aWNrLgogICAgICAgICBicmVhazsKLSAgICAgIENvbW1lbnRMZW5ndGggKz0gSXRlci0+Z2V0VGV4dExlbmd0aCgpOworICAgICAgQ29tbWVudExlbmd0aCArPSBJdGVyLT5nZXRMZW5ndGgoKTsKICAgICB9CiAgIH0KIApAQCAtMzEwLDkgKzMxMSw5IEBACiAgIGFzc2VydChUb2tTdGFydFswXSA9PSAnYCcgJiYgImVzY2FwZWQgaWRlbnRpZmllciBzdGFydHMgd2l0aCBiYWNrdGljayIpOwogICBhc3NlcnQoQ3VyUHRyWy0xXSA9PSAnYCcgJiYgImVzY2FwZWQgaWRlbnRpZmllciBlbmRzIHdpdGggYmFja3RpY2siKTsKIAotICBMZWFkaW5nVHJpdmlhLnB1c2hfYmFjayhUcml2aWFQaWVjZTo6YmFja3RpY2soKSk7CisgIExlYWRpbmdUcml2aWEucHVzaF9iYWNrKFRyaXZpYUtpbmQ6OkJhY2t0aWNrLCAxKTsKICAgYXNzZXJ0KFRyYWlsaW5nVHJpdmlhLmVtcHR5KCkgJiYgIlRyYWlsaW5nVHJpdmlhIGlzIGVtcHR5IGhlcmUiKTsKLSAgVHJhaWxpbmdUcml2aWEucHVzaF9iYWNrKFRyaXZpYVBpZWNlOjpiYWNrdGljaygpKTsKKyAgVHJhaWxpbmdUcml2aWEucHVzaF9iYWNrKFRyaXZpYUtpbmQ6OkJhY2t0aWNrLCAxKTsKIAogICBmb3JtVG9rZW4odG9rOjppZGVudGlmaWVyLCBUb2tTdGFydCk7CiAgIC8vIElmIHRoaXMgdG9rZW4gaXMgYXQgQXJ0aWZpY2lhbEVPRiwgaXQncyBmb3JjZWQgdG8gYmUgdG9rOjplb2YuIERvbid0IG1hcmsKQEAgLTIzMzUsOCArMjMzNiw3IEBACiAgICAgICBzaXplX3QgQk9NTGVuID0gQ29udGVudFN0YXJ0IC0gQnVmZmVyU3RhcnQ7CiAgICAgICBhc3NlcnQoQk9NTGVuID09IDMgJiYgIlVURi04IEJPTSBpcyAzIGJ5dGVzIik7CiAgICAgICAvLyBBZGQgVVRGLTggQk9NIHRvIExlYWRpbmdUcml2aWEuCi0gICAgICBhdXRvIFRleHQgPSBPd25lZFN0cmluZzo6bWFrZVJlZkNvdW50ZWQoU3RyaW5nUmVmKEN1clB0ciwgQk9NTGVuKSk7Ci0gICAgICBMZWFkaW5nVHJpdmlhLnB1c2hfYmFjayhUcml2aWFQaWVjZTo6Z2FyYmFnZVRleHQoVGV4dCkpOworICAgICAgTGVhZGluZ1RyaXZpYS5wdXNoX2JhY2soVHJpdmlhS2luZDo6R2FyYmFnZVRleHQsIEJPTUxlbik7CiAgICAgICBDdXJQdHIgKz0gQk9NTGVuOwogICAgIH0KICAgICBOZXh0VG9rZW4uc2V0QXRTdGFydE9mTGluZSh0cnVlKTsKQEAgLTI1MjEsNyArMjUyMSw3IEBACiAgIHJldHVybiBMLnBlZWtOZXh0VG9rZW4oKTsKIH0KIAotdm9pZCBMZXhlcjo6bGV4VHJpdmlhKHN5bnRheDo6VHJpdmlhICZQaWVjZXMsIGJvb2wgSXNGb3JUcmFpbGluZ1RyaXZpYSkgewordm9pZCBMZXhlcjo6bGV4VHJpdmlhKFBhcnNlZFRyaXZpYSAmUGllY2VzLCBib29sIElzRm9yVHJhaWxpbmdUcml2aWEpIHsKIFJlc3RhcnQ6CiAgIGNvbnN0IGNoYXIgKlRyaXZpYVN0YXJ0ID0gQ3VyUHRyOwogCkBAIC0yNTMwLDMwICsyNTMwLDMwIEBACiAgICAgaWYgKElzRm9yVHJhaWxpbmdUcml2aWEpCiAgICAgICBicmVhazsKICAgICBOZXh0VG9rZW4uc2V0QXRTdGFydE9mTGluZSh0cnVlKTsKLSAgICBQaWVjZXMuYXBwZW5kT3JTcXVhc2goVHJpdmlhUGllY2U6Om5ld2xpbmVzKDEpKTsKKyAgICBQaWVjZXMuYXBwZW5kT3JTcXVhc2goVHJpdmlhS2luZDo6TmV3bGluZSwgMSk7CiAgICAgZ290byBSZXN0YXJ0OwogICBjYXNlICdccic6CiAgICAgaWYgKElzRm9yVHJhaWxpbmdUcml2aWEpCiAgICAgICBicmVhazsKICAgICBOZXh0VG9rZW4uc2V0QXRTdGFydE9mTGluZSh0cnVlKTsKICAgICBpZiAoQ3VyUHRyWzBdID09ICdcbicpIHsKLSAgICAgIFBpZWNlcy5hcHBlbmRPclNxdWFzaChUcml2aWFQaWVjZTo6Y2FycmlhZ2VSZXR1cm5MaW5lRmVlZHMoMSkpOworICAgICAgUGllY2VzLmFwcGVuZE9yU3F1YXNoKFRyaXZpYUtpbmQ6OkNhcnJpYWdlUmV0dXJuTGluZUZlZWQsIDIpOwogICAgICAgKytDdXJQdHI7CiAgICAgfSBlbHNlIHsKLSAgICAgIFBpZWNlcy5hcHBlbmRPclNxdWFzaChUcml2aWFQaWVjZTo6Y2FycmlhZ2VSZXR1cm5zKDEpKTsKKyAgICAgIFBpZWNlcy5hcHBlbmRPclNxdWFzaChUcml2aWFLaW5kOjpDYXJyaWFnZVJldHVybiwgMSk7CiAgICAgfQogICAgIGdvdG8gUmVzdGFydDsKICAgY2FzZSAnICc6Ci0gICAgUGllY2VzLmFwcGVuZE9yU3F1YXNoKFRyaXZpYVBpZWNlOjpzcGFjZXMoMSkpOworICAgIFBpZWNlcy5hcHBlbmRPclNxdWFzaChUcml2aWFLaW5kOjpTcGFjZSwgMSk7CiAgICAgZ290byBSZXN0YXJ0OwogICBjYXNlICdcdCc6Ci0gICAgUGllY2VzLmFwcGVuZE9yU3F1YXNoKFRyaXZpYVBpZWNlOjp0YWJzKDEpKTsKKyAgICBQaWVjZXMuYXBwZW5kT3JTcXVhc2goVHJpdmlhS2luZDo6VGFiLCAxKTsKICAgICBnb3RvIFJlc3RhcnQ7CiAgIGNhc2UgJ1x2JzoKLSAgICBQaWVjZXMuYXBwZW5kT3JTcXVhc2goVHJpdmlhUGllY2U6OnZlcnRpY2FsVGFicygxKSk7CisgICAgUGllY2VzLmFwcGVuZE9yU3F1YXNoKFRyaXZpYUtpbmQ6OlZlcnRpY2FsVGFiLCAxKTsKICAgICBnb3RvIFJlc3RhcnQ7CiAgIGNhc2UgJ1xmJzoKLSAgICBQaWVjZXMuYXBwZW5kT3JTcXVhc2goVHJpdmlhUGllY2U6OmZvcm1mZWVkcygxKSk7CisgICAgUGllY2VzLmFwcGVuZE9yU3F1YXNoKFRyaXZpYUtpbmQ6OkZvcm1mZWVkLCAxKTsKICAgICBnb3RvIFJlc3RhcnQ7CiAgIGNhc2UgJy8nOgogICAgIGlmIChJc0ZvclRyYWlsaW5nVHJpdmlhIHx8IGlzS2VlcGluZ0NvbW1lbnRzKCkpIHsKQEAgLTI1NjUsMTggKzI1NjUsMTYgQEAKICAgICAgIGJvb2wgaXNEb2NDb21tZW50ID0gQ3VyUHRyWzFdID09ICcvJzsKICAgICAgIHNraXBTbGFzaFNsYXNoQ29tbWVudCgvKkVhdE5ld2xpbmU9Ki9mYWxzZSk7CiAgICAgICBzaXplX3QgTGVuZ3RoID0gQ3VyUHRyIC0gVHJpdmlhU3RhcnQ7Ci0gICAgICBhdXRvIFRleHQgPSBPd25lZFN0cmluZzo6bWFrZVJlZkNvdW50ZWQoU3RyaW5nUmVmKFRyaXZpYVN0YXJ0LCBMZW5ndGgpKTsKLSAgICAgIFBpZWNlcy5wdXNoX2JhY2soaXNEb2NDb21tZW50ID8gVHJpdmlhUGllY2U6OmRvY0xpbmVDb21tZW50KFRleHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRyaXZpYVBpZWNlOjpsaW5lQ29tbWVudChUZXh0KSk7CisgICAgICBQaWVjZXMucHVzaF9iYWNrKGlzRG9jQ29tbWVudCA/IFRyaXZpYUtpbmQ6OkRvY0xpbmVDb21tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRyaXZpYUtpbmQ6OkxpbmVDb21tZW50LCBMZW5ndGgpOwogICAgICAgZ290byBSZXN0YXJ0OwogICAgIH0gZWxzZSBpZiAoKkN1clB0ciA9PSAnKicpIHsKICAgICAgIC8vICcvKiAuLi4gKi8nIGNvbW1lbnQuCiAgICAgICBib29sIGlzRG9jQ29tbWVudCA9IEN1clB0clsxXSA9PSAnKic7CiAgICAgICBza2lwU2xhc2hTdGFyQ29tbWVudCgpOwogICAgICAgc2l6ZV90IExlbmd0aCA9IEN1clB0ciAtIFRyaXZpYVN0YXJ0OwotICAgICAgYXV0byBUZXh0ID0gT3duZWRTdHJpbmc6Om1ha2VSZWZDb3VudGVkKFN0cmluZ1JlZihUcml2aWFTdGFydCwgTGVuZ3RoKSk7Ci0gICAgICBQaWVjZXMucHVzaF9iYWNrKGlzRG9jQ29tbWVudCA/IFRyaXZpYVBpZWNlOjpkb2NCbG9ja0NvbW1lbnQoVGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVHJpdmlhUGllY2U6OmJsb2NrQ29tbWVudChUZXh0KSk7CisgICAgICBQaWVjZXMucHVzaF9iYWNrKGlzRG9jQ29tbWVudCA/IFRyaXZpYUtpbmQ6OkRvY0Jsb2NrQ29tbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUcml2aWFLaW5kOjpCbG9ja0NvbW1lbnQsIExlbmd0aCk7CiAgICAgICBnb3RvIFJlc3RhcnQ7CiAgICAgfQogICAgIGJyZWFrOwpAQCAtMjU4OCw4ICsyNTg2LDcgQEAKICAgICAgICAgZGlhZ25vc2UoVHJpdmlhU3RhcnQsIGRpYWc6OmxleF9oYXNoYmFuZ19ub3RfYWxsb3dlZCk7CiAgICAgICBza2lwSGFzaGJhbmcoLypFYXROZXdsaW5lPSovZmFsc2UpOwogICAgICAgc2l6ZV90IExlbmd0aCA9IEN1clB0ciAtIFRyaXZpYVN0YXJ0OwotICAgICAgYXV0byBUZXh0ID0gT3duZWRTdHJpbmc6Om1ha2VSZWZDb3VudGVkKFN0cmluZ1JlZihUcml2aWFTdGFydCwgTGVuZ3RoKSk7Ci0gICAgICBQaWVjZXMucHVzaF9iYWNrKFRyaXZpYVBpZWNlOjpnYXJiYWdlVGV4dChUZXh0KSk7CisgICAgICBQaWVjZXMucHVzaF9iYWNrKFRyaXZpYUtpbmQ6OkdhcmJhZ2VUZXh0LCBMZW5ndGgpOwogICAgICAgZ290byBSZXN0YXJ0OwogICAgIH0KICAgICBicmVhazsKQEAgLTI1OTgsOCArMjU5NSw3IEBACiAgICAgaWYgKHRyeUxleENvbmZsaWN0TWFya2VyKC8qRWF0TmV3bGluZT0qL2ZhbHNlKSkgewogICAgICAgLy8gQ29uZmxpY3QgbWFya2VyLgogICAgICAgc2l6ZV90IExlbmd0aCA9IEN1clB0ciAtIFRyaXZpYVN0YXJ0OwotICAgICAgYXV0byBUZXh0ID0gT3duZWRTdHJpbmc6Om1ha2VSZWZDb3VudGVkKFN0cmluZ1JlZihUcml2aWFTdGFydCwgTGVuZ3RoKSk7Ci0gICAgICBQaWVjZXMucHVzaF9iYWNrKFRyaXZpYVBpZWNlOjpnYXJiYWdlVGV4dChUZXh0KSk7CisgICAgICBQaWVjZXMucHVzaF9iYWNrKFRyaXZpYUtpbmQ6OkdhcmJhZ2VUZXh0LCBMZW5ndGgpOwogICAgICAgZ290byBSZXN0YXJ0OwogICAgIH0KICAgICBicmVhazsKQEAgLTI2MDgsOCArMjYwNCw3IEBACiAgICAgY2FzZSBOdWxDaGFyYWN0ZXJLaW5kOjpFbWJlZGRlZDogewogICAgICAgZGlhZ25vc2VFbWJlZGRlZE51bChEaWFncywgQ3VyUHRyIC0gMSk7CiAgICAgICBzaXplX3QgTGVuZ3RoID0gQ3VyUHRyIC0gVHJpdmlhU3RhcnQ7Ci0gICAgICBhdXRvIFRleHQgPSBPd25lZFN0cmluZzo6bWFrZVJlZkNvdW50ZWQoU3RyaW5nUmVmKFRyaXZpYVN0YXJ0LCBMZW5ndGgpKTsKLSAgICAgIFBpZWNlcy5wdXNoX2JhY2soVHJpdmlhUGllY2U6OmdhcmJhZ2VUZXh0KFRleHQpKTsKKyAgICAgIFBpZWNlcy5wdXNoX2JhY2soVHJpdmlhS2luZDo6R2FyYmFnZVRleHQsIExlbmd0aCk7CiAgICAgICBnb3RvIFJlc3RhcnQ7CiAgICAgfQogICAgIGNhc2UgTnVsQ2hhcmFjdGVyS2luZDo6Q29kZUNvbXBsZXRpb246CkBAIC0yNjU1LDggKzI2NTAsNyBAQAogICAgIH0KIAogICAgIHNpemVfdCBMZW5ndGggPSBDdXJQdHIgLSBUcml2aWFTdGFydDsKLSAgICBhdXRvIFRleHQgPSBPd25lZFN0cmluZzo6bWFrZVJlZkNvdW50ZWQoU3RyaW5nUmVmKFRyaXZpYVN0YXJ0LCBMZW5ndGgpKTsKLSAgICBQaWVjZXMucHVzaF9iYWNrKFRyaXZpYVBpZWNlOjpnYXJiYWdlVGV4dChUZXh0KSk7CisgICAgUGllY2VzLnB1c2hfYmFjayhUcml2aWFLaW5kOjpHYXJiYWdlVGV4dCwgTGVuZ3RoKTsKICAgICBnb3RvIFJlc3RhcnQ7CiAgIH0KICAgLy8gUmVzZXQgdGhlIGN1cnNvci4KZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZURlY2wuY3BwIGIvbGliL1BhcnNlL1BhcnNlRGVjbC5jcHAKaW5kZXggMTk1OWQ3OS4uMGIwNjM5MSAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlRGVjbC5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlRGVjbC5jcHAKQEAgLTMwNDUsMjIgKzMwNDUsMTMgQEAKICAgaWYgKGF1dG8gKmV4dCA9IGR5bl9jYXN0PEV4dGVuc2lvbkRlY2w+KEQpKSB7CiAgICAgcGFyc2VEZWNsTGlzdChleHQtPmdldEJyYWNlcygpLlN0YXJ0LCBSQkxvYywgSWQsCiAgICAgICAgICAgICAgICAgICBQYXJzZURlY2xPcHRpb25zKERlbGF5ZWRTdGF0ZS0+RmxhZ3MpLAotICAgICAgICAgICAgICAgICAgWyZdIChEZWNsICpEKSB7IGV4dC0+YWRkTWVtYmVyKEQpOyB9KTsKKyAgICAgICAgICAgICAgICAgIGV4dCk7CiAgICAgZXh0LT5zZXRCcmFjZXMoe0xCTG9jLCBSQkxvY30pOwotICB9IGVsc2UgaWYgKGF1dG8gKmNkID0gZHluX2Nhc3Q8Q2xhc3NEZWNsPihEKSkgewotICAgIGF1dG8gaGFuZGxlciA9IFsmXSAoRGVjbCAqRCkgewotICAgICAgY2QtPmFkZE1lbWJlcihEKTsKLSAgICAgIGlmIChpc2E8RGVzdHJ1Y3RvckRlY2w+KEQpKQotICAgICAgICBjZC0+c2V0SGFzRGVzdHJ1Y3RvcigpOwotICAgIH07Ci0gICAgcGFyc2VEZWNsTGlzdChjZC0+Z2V0QnJhY2VzKCkuU3RhcnQsIFJCTG9jLCBJZCwKLSAgICAgICAgICAgICAgICAgIFBhcnNlRGVjbE9wdGlvbnMoRGVsYXllZFN0YXRlLT5GbGFncyksIGhhbmRsZXIpOwotICAgIGNkLT5zZXRCcmFjZXMoe0xCTG9jLCBSQkxvY30pOwogICB9IGVsc2UgewogICAgIGF1dG8gKm50ZCA9IGNhc3Q8Tm9taW5hbFR5cGVEZWNsPihEKTsKICAgICBwYXJzZURlY2xMaXN0KG50ZC0+Z2V0QnJhY2VzKCkuU3RhcnQsIFJCTG9jLCBJZCwKICAgICAgICAgICAgICAgICAgIFBhcnNlRGVjbE9wdGlvbnMoRGVsYXllZFN0YXRlLT5GbGFncyksCi0gICAgICAgICAgICAgICAgICBbJl0gKERlY2wgKkQpIHsgbnRkLT5hZGRNZW1iZXIoRCk7IH0pOworICAgICAgICAgICAgICAgICAgbnRkKTsKICAgICBudGQtPnNldEJyYWNlcyh7TEJMb2MsIFJCTG9jfSk7CiAgIH0KIH0KQEAgLTM0NzcsMTMgKzM0NjgsMTQgQEAKIC8vLyBcZW5kdmVyYmF0aW0KIGJvb2wgUGFyc2VyOjpwYXJzZURlY2xMaXN0KFNvdXJjZUxvYyBMQkxvYywgU291cmNlTG9jICZSQkxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWc8PiBFcnJvckRpYWcsIFBhcnNlRGVjbE9wdGlvbnMgT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjx2b2lkKERlY2wqKT4gaGFuZGxlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmFibGVEZWNsQ29udGV4dCAqSURDKSB7CiAgIFBhcnNlclN0YXR1cyBTdGF0dXM7CiAgIGJvb2wgUHJldmlvdXNIYWRTZW1pID0gdHJ1ZTsKICAgewogICAgIFN5bnRheFBhcnNpbmdDb250ZXh0IExpc3RDb250ZXh0KFN5bnRheENvbnRleHQsIFN5bnRheEtpbmQ6Ok1lbWJlckRlY2xMaXN0KTsKICAgICB3aGlsZSAoVG9rLmlzTm90KHRvazo6cl9icmFjZSkpIHsKLSAgICAgIFN0YXR1cyB8PSBwYXJzZURlY2xJdGVtKFByZXZpb3VzSGFkU2VtaSwgT3B0aW9ucywgaGFuZGxlcik7CisgICAgICBTdGF0dXMgfD0gcGFyc2VEZWNsSXRlbShQcmV2aW91c0hhZFNlbWksIE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oRGVjbCAqRCkgeyBJREMtPmFkZE1lbWJlcihEKTsgfSk7CiAgICAgICBpZiAoVG9rLmlzQW55KHRvazo6ZW9mLCB0b2s6OnBvdW5kX2VuZGlmLCB0b2s6OnBvdW5kX2Vsc2UsCiAgICAgICAgICAgICAgICAgICAgIHRvazo6cG91bmRfZWxzZWlmKSkgewogICAgICAgICBJc0lucHV0SW5jb21wbGV0ZSA9IHRydWU7CkBAIC0zNTA0LDMwICszNDk2LDE1IEBACiAKIGJvb2wgUGFyc2VyOjpjYW5EZWxheU1lbWJlckRlY2xQYXJzaW5nKCkgewogICAvLyBJZiBleHBsaWNpdGx5IGRpc2FibGVkLCByZXNwZWN0IHRoZSBmbGFnLgotICBpZiAoRGlzYWJsZURlbGF5ZWRQYXJzaW5nKQorICBpZiAoIURlbGF5Qm9keVBhcnNpbmcpCiAgICAgcmV0dXJuIGZhbHNlOwotICAvLyBUaGVyZSdzIG5vIGZ1bmRhbWVudGFsIHJlYXNvbnMgdGhhdCBTSUwgY2Fubm5vdCBiZSBsYXNpbHkgcGFyc2VkLiBXZSBuZWVkCi0gIC8vIHRvIGtlZXAgU0lMUGFyc2VyVFVTdGF0ZUJhc2UgcGVyc2lzdGVudCB0byBtYWtlIGl0IGhhcHBlbi4KLSAgaWYgKGlzSW5TSUxNb2RlKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvLyBDYWxjdWxhdGluZyBpbnRlcmZhY2UgaGFzaCByZXF1aXJlcyB0b2tlbnMgY29uc3VtZWQgaW4gdGhlIG9yaWdpbmFsIG9yZGVyLgotICBpZiAoU0YuaGFzSW50ZXJmYWNlSGFzaCgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKFNGLktpbmQgPT0gU291cmNlRmlsZUtpbmQ6OlJFUEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvLyBXZSBhbHdheXMgY29sbGVjdCB0aGUgZW50aXJlIHN5bnRheCB0cmVlIGZvciBJREUgdXNlcy4KLSAgaWYgKFNGLnNob3VsZENvbGxlY3RUb2tlbigpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKFNGLnNob3VsZEJ1aWxkU3ludGF4VHJlZSgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLy8gUmVjb3ZlcmluZyBwYXJzZXIgc3RhdHVzIGxhdGVyIGZvciAjc291cmNlTG9jYWlvbiBpcyBub3QtdHJpdmlhbCBhbmQKKyAgLy8gUmVjb3ZlcmluZyBwYXJzZXIgc3RhdHVzIGxhdGVyIGZvciAjc291cmNlTG9jYXRpb24gaXMgbm90LXRyaXZpYWwgYW5kCiAgIC8vIGl0IG1heSBub3Qgd29ydGggaXQuCiAgIGlmIChJblBvdW5kTGluZUVudmlyb25tZW50KQogICAgIHJldHVybiBmYWxzZTsKLSAgLy8gVGhlIGZpcnN0IGNvZGUgY29tcGxldGlvbiBwYXNzIGxvb2tzIGZvciBjb2RlIGNvbXBsZXRpb24gdG9rZW5zIGV4dGVuc2l2ZWx5LAotICAvLyBzbyB3ZSBjYW5ub3QgbGF6aWx5IHBhcnNlIG1lbWJlcnMuCi0gIGlmIChpc0NvZGVDb21wbGV0aW9uRmlyc3RQYXNzKCkpCi0gICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFNraXAgdW50aWwgdGhlIG1hdGNoaW5nIHJpZ2h0IGN1cmx5IGJyYWNrZXQ7IGlmIHdlIGZpbmQgYSBwb3VuZCBkaXJlY3RpdmUsCisgIC8vIHdlIGNhbid0IGxhemlseSBwYXJzZS4KICAgQmFja3RyYWNraW5nU2NvcGUgQmFja1RyYWNrKCp0aGlzKTsKICAgYm9vbCBIYXNQb3VuZERpcmVjdGl2ZTsKICAgc2tpcFVudGlsTWF0Y2hpbmdSQnJhY2UoKnRoaXMsIEhhc1BvdW5kRGlyZWN0aXZlLCBTeW50YXhDb250ZXh0KTsKQEAgLTM1MzYsNiArMzUxMywyMyBAQAogICByZXR1cm4gIUJhY2tUcmFjay53aWxsQmFja3RyYWNrKCk7CiB9CiAKK2Jvb2wgUGFyc2VyOjpkZWxheVBhcnNpbmdEZWNsTGlzdChTb3VyY2VMb2MgTEJMb2MsIFNvdXJjZUxvYyAmUkJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jIFBvc0JlZm9yZUxCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRGVjbE9wdGlvbnMgT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYWJsZURlY2xDb250ZXh0ICpJREMpIHsKKyAgYm9vbCBlcnJvciA9IGZhbHNlOworCisgIGlmIChUb2suaXModG9rOjpyX2JyYWNlKSkgeworICAgIFJCTG9jID0gY29uc3VtZVRva2VuKCk7CisgIH0gZWxzZSB7CisgICAgUkJMb2MgPSBUb2suZ2V0TG9jKCk7CisgICAgZXJyb3IgPSB0cnVlOworICB9CisgIFN0YXRlLT5kZWxheURlY2xMaXN0KElEQywgT3B0aW9ucy50b1JhdygpLCBDdXJEZWNsQ29udGV4dCwgeyBMQkxvYywgUkJMb2MgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvc0JlZm9yZUxCKTsKKyAgcmV0dXJuIGVycm9yOworfQorCiAvLy8gUGFyc2UgYW4gJ2V4dGVuc2lvbicgZGVjbGFyYXRpb24uCiAvLy8KIC8vLyBcdmVyYmF0aW0KQEAgLTM2MDAsMTcgKzM1OTQsMTEgQEAKICAgICBTY29wZSBTKHRoaXMsIFNjb3BlS2luZDo6RXh0ZW5zaW9uKTsKICAgICBQYXJzZURlY2xPcHRpb25zIE9wdGlvbnMoUERfSGFzQ29udGFpbmVyVHlwZSB8IFBEX0luRXh0ZW5zaW9uKTsKICAgICBpZiAoY2FuRGVsYXlNZW1iZXJEZWNsUGFyc2luZygpKSB7Ci0gICAgICBpZiAoVG9rLmlzKHRvazo6cl9icmFjZSkpIHsKLSAgICAgICAgUkJMb2MgPSBjb25zdW1lVG9rZW4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFJCTG9jID0gVG9rLmdldExvYygpOworICAgICAgaWYgKGRlbGF5UGFyc2luZ0RlY2xMaXN0KExCTG9jLCBSQkxvYywgUG9zQmVmb3JlTEIsIE9wdGlvbnMsIGV4dCkpCiAgICAgICAgIHN0YXR1cy5zZXRJc1BhcnNlRXJyb3IoKTsKLSAgICAgIH0KLSAgICAgIFN0YXRlLT5kZWxheURlY2xMaXN0KGV4dCwgT3B0aW9ucy50b1JhdygpLCBDdXJEZWNsQ29udGV4dCwgeyBMQkxvYywgUkJMb2MgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc0JlZm9yZUxCKTsKICAgICB9IGVsc2UgewogICAgICAgaWYgKHBhcnNlRGVjbExpc3QoTEJMb2MsIFJCTG9jLCBkaWFnOjpleHBlY3RlZF9yYnJhY2VfZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucywgWyZdIChEZWNsICpEKSB7IGV4dC0+YWRkTWVtYmVyKEQpOyB9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMsIGV4dCkpCiAgICAgICAgIHN0YXR1cy5zZXRJc1BhcnNlRXJyb3IoKTsKICAgICB9CiAKQEAgLTUzOTUsNyArNTM4Myw4IEBACiAKICAgQm9keVJhbmdlLkVuZCA9IFByZXZpb3VzTG9jOwogCi0gIGlmIChEZWxheWVkUGFyc2VDQi0+c2hvdWxkRGVsYXlGdW5jdGlvbkJvZHlQYXJzaW5nKCp0aGlzLCBBRkQsIEF0dHJzLAorICBpZiAoRGVsYXllZFBhcnNlQ0IgJiYKKyAgICAgIERlbGF5ZWRQYXJzZUNCLT5zaG91bGREZWxheUZ1bmN0aW9uQm9keVBhcnNpbmcoKnRoaXMsIEFGRCwgQXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvZHlSYW5nZSkpIHsKICAgICBTdGF0ZS0+ZGVsYXlGdW5jdGlvbkJvZHlQYXJzaW5nKEFGRCwgQm9keVJhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW5QYXJzZXJQb3NpdGlvbi5QcmV2aW91c0xvYyk7CkBAIC01NzM3LDIwICs1NzI2LDE0IEBACiAgICAgUkJMb2MgPSBMQkxvYzsKICAgICBTdGF0dXMuc2V0SXNQYXJzZUVycm9yKCk7CiAgIH0gZWxzZSB7Ci0gICAgU2NvcGUgUyh0aGlzLCBTY29wZUtpbmQ6OkNsYXNzQm9keSk7CisgICAgU2NvcGUgUyh0aGlzLCBTY29wZUtpbmQ6OkVudW1Cb2R5KTsKICAgICBQYXJzZURlY2xPcHRpb25zIE9wdGlvbnMoUERfSGFzQ29udGFpbmVyVHlwZSB8IFBEX0FsbG93RW51bUVsZW1lbnQgfCBQRF9JbkVudW0pOwogICAgIGlmIChjYW5EZWxheU1lbWJlckRlY2xQYXJzaW5nKCkpIHsKLSAgICAgIGlmIChUb2suaXModG9rOjpyX2JyYWNlKSkgewotICAgICAgICBSQkxvYyA9IGNvbnN1bWVUb2tlbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUkJMb2MgPSBUb2suZ2V0TG9jKCk7CisgICAgICBpZiAoZGVsYXlQYXJzaW5nRGVjbExpc3QoTEJMb2MsIFJCTG9jLCBQb3NCZWZvcmVMQiwgT3B0aW9ucywgRUQpKQogICAgICAgICBTdGF0dXMuc2V0SXNQYXJzZUVycm9yKCk7Ci0gICAgICB9Ci0gICAgICBTdGF0ZS0+ZGVsYXlEZWNsTGlzdChFRCwgT3B0aW9ucy50b1JhdygpLCBDdXJEZWNsQ29udGV4dCwgeyBMQkxvYywgUkJMb2MgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc0JlZm9yZUxCKTsKICAgICB9IGVsc2UgewogICAgICAgaWYgKHBhcnNlRGVjbExpc3QoTEJMb2MsIFJCTG9jLCBkaWFnOjpleHBlY3RlZF9yYnJhY2VfZW51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMsIFsmXSAoRGVjbCAqRCkgeyBFRC0+YWRkTWVtYmVyKEQpOyB9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMsIEVEKSkKICAgICAgICAgU3RhdHVzLnNldElzUGFyc2VFcnJvcigpOwogICAgIH0KICAgfQpAQCAtNjAyNSwxNyArNjAwOCwxMSBAQAogICAgIFNjb3BlIFModGhpcywgU2NvcGVLaW5kOjpTdHJ1Y3RCb2R5KTsKICAgICBQYXJzZURlY2xPcHRpb25zIE9wdGlvbnMoUERfSGFzQ29udGFpbmVyVHlwZSB8IFBEX0luU3RydWN0KTsKICAgICBpZiAoY2FuRGVsYXlNZW1iZXJEZWNsUGFyc2luZygpKSB7Ci0gICAgICBpZiAoVG9rLmlzKHRvazo6cl9icmFjZSkpIHsKLSAgICAgICAgUkJMb2MgPSBjb25zdW1lVG9rZW4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFJCTG9jID0gVG9rLmdldExvYygpOworICAgICAgaWYgKGRlbGF5UGFyc2luZ0RlY2xMaXN0KExCTG9jLCBSQkxvYywgUG9zQmVmb3JlTEIsIE9wdGlvbnMsIFNEKSkKICAgICAgICAgU3RhdHVzLnNldElzUGFyc2VFcnJvcigpOwotICAgICAgfQotICAgICAgU3RhdGUtPmRlbGF5RGVjbExpc3QoU0QsIE9wdGlvbnMudG9SYXcoKSwgQ3VyRGVjbENvbnRleHQsIHsgTEJMb2MsIFJCTG9jIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NCZWZvcmVMQik7CiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChwYXJzZURlY2xMaXN0KExCTG9jLCBSQkxvYywgZGlhZzo6ZXhwZWN0ZWRfcmJyYWNlX3N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMsIFsmXShEZWNsICpEKSB7U0QtPmFkZE1lbWJlcihEKTt9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMsU0QpKQogICAgICAgICBTdGF0dXMuc2V0SXNQYXJzZUVycm9yKCk7CiAgICAgfQogICB9CkBAIC02MTQ5LDIyICs2MTI2LDExIEBACiAgICAgUGFyc2VEZWNsT3B0aW9ucyBPcHRpb25zKFBEX0hhc0NvbnRhaW5lclR5cGUgfCBQRF9BbGxvd0Rlc3RydWN0b3IgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9JbkNsYXNzKTsKICAgICBpZiAoY2FuRGVsYXlNZW1iZXJEZWNsUGFyc2luZygpKSB7Ci0gICAgICBpZiAoVG9rLmlzKHRvazo6cl9icmFjZSkpIHsKLSAgICAgICAgUkJMb2MgPSBjb25zdW1lVG9rZW4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFJCTG9jID0gVG9rLmdldExvYygpOworICAgICAgaWYgKGRlbGF5UGFyc2luZ0RlY2xMaXN0KExCTG9jLCBSQkxvYywgUG9zQmVmb3JlTEIsIE9wdGlvbnMsIENEKSkKICAgICAgICAgU3RhdHVzLnNldElzUGFyc2VFcnJvcigpOwotICAgICAgfQotICAgICAgU3RhdGUtPmRlbGF5RGVjbExpc3QoQ0QsIE9wdGlvbnMudG9SYXcoKSwgQ3VyRGVjbENvbnRleHQsIHsgTEJMb2MsIFJCTG9jIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NCZWZvcmVMQik7CiAgICAgfSBlbHNlIHsKLSAgICAgIGF1dG8gSGFuZGxlciA9IFsmXSAoRGVjbCAqRCkgewotICAgICAgICBDRC0+YWRkTWVtYmVyKEQpOwotICAgICAgICBpZiAoaXNhPERlc3RydWN0b3JEZWNsPihEKSkKLSAgICAgICAgICBDRC0+c2V0SGFzRGVzdHJ1Y3RvcigpOwotICAgICAgfTsKICAgICAgIGlmIChwYXJzZURlY2xMaXN0KExCTG9jLCBSQkxvYywgZGlhZzo6ZXhwZWN0ZWRfcmJyYWNlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucywgSGFuZGxlcikpCisgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zLCBDRCkpCiAgICAgICAgIFN0YXR1cy5zZXRJc1BhcnNlRXJyb3IoKTsKICAgICB9CiAgIH0KQEAgLTYyNTksMTggKzYyMjUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9EaXNhbGxvd0luaXQgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEX0luUHJvdG9jb2wpOwogICAgICAgaWYgKGNhbkRlbGF5TWVtYmVyRGVjbFBhcnNpbmcoKSkgewotICAgICAgICBpZiAoVG9rLmlzKHRvazo6cl9icmFjZSkpIHsKLSAgICAgICAgICBSQnJhY2VMb2MgPSBjb25zdW1lVG9rZW4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBSQnJhY2VMb2MgPSBUb2suZ2V0TG9jKCk7CisgICAgICAgIGlmIChkZWxheVBhcnNpbmdEZWNsTGlzdChMQnJhY2VMb2MsIFJCcmFjZUxvYywgUG9zQmVmb3JlTEIsIE9wdGlvbnMsIFByb3RvKSkKICAgICAgICAgICBTdGF0dXMuc2V0SXNQYXJzZUVycm9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RhdGUtPmRlbGF5RGVjbExpc3QoUHJvdG8sIE9wdGlvbnMudG9SYXcoKSwgQ3VyRGVjbENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgTEJyYWNlTG9jLCBSQnJhY2VMb2MgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zQmVmb3JlTEIpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHBhcnNlRGVjbExpc3QoTEJyYWNlTG9jLCBSQnJhY2VMb2MsIGRpYWc6OmV4cGVjdGVkX3JicmFjZV9wcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucywgWyZdKERlY2wgKkQpIHtQcm90by0+YWRkTWVtYmVyKEQpO30pKQorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zLCBQcm90bykpCiAgICAgICAgICAgU3RhdHVzLnNldElzUGFyc2VFcnJvcigpOwogICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZUV4cHIuY3BwIGIvbGliL1BhcnNlL1BhcnNlRXhwci5jcHAKaW5kZXggZmQzMjkzYS4uODEwMjVlMCAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlRXhwci5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlRXhwci5jcHAKQEAgLTExNjUsNyArMTE2NSw3IEBACiAgICAgICAgIFJlc3VsdCA9IG1ha2VQYXJzZXJSZXN1bHQoCiAgICAgICAgICAgICBSZXN1bHQsCiAgICAgICAgICAgICBuZXcgKENvbnRleHQpIERvdFNlbGZFeHByKFJlc3VsdC5nZXQoKSwgVG9rTG9jLCBjb25zdW1lVG9rZW4oKSkpOwotICAgICAgICBTeW50YXhDb250ZXh0LT5jcmVhdGVOb2RlSW5QbGFjZShTeW50YXhLaW5kOjpEb3RTZWxmRXhwcik7CisgICAgICAgIFN5bnRheENvbnRleHQtPmNyZWF0ZU5vZGVJblBsYWNlKFN5bnRheEtpbmQ6Ok1lbWJlckFjY2Vzc0V4cHIpOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIApAQCAtMTU2MCw3ICsxNTYwLDggQEAKICAgICAgICAgICAgIFBhcnNlZFN5bnRheFJlY29yZGVyOjptYWtlSWRlbnRpZmllclBhdHRlcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhDb250ZXh0LT5wb3BUb2tlbigpLCAqU3ludGF4Q29udGV4dCk7CiAgICAgICAgIFBhcnNlZEV4cHJTeW50YXggRXhwck5vZGUgPQotICAgICAgICAgICAgUGFyc2VkU3ludGF4UmVjb3JkZXI6OmRlZmVyVW5yZXNvbHZlZFBhdHRlcm5FeHByKFBhdHRlcm5Ob2RlKTsKKyAgICAgICAgICAgIFBhcnNlZFN5bnRheFJlY29yZGVyOjpkZWZlclVucmVzb2x2ZWRQYXR0ZXJuRXhwcihQYXR0ZXJuTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3ludGF4Q29udGV4dCk7CiAgICAgICAgIFN5bnRheENvbnRleHQtPmFkZFN5bnRheChFeHByTm9kZSk7CiAgICAgICB9CiAgICAgICByZXR1cm4gbWFrZVBhcnNlclJlc3VsdChuZXcgKENvbnRleHQpIFVucmVzb2x2ZWRQYXR0ZXJuRXhwcihwYXR0ZXJuKSk7CkBAIC0xNjM1LDcgKzE2MzYsNyBAQAogICAgIE5hbWUgPSBwYXJzZVVucXVhbGlmaWVkRGVjbE5hbWUoLyphZnRlckRvdD0qL3RydWUsIE5hbWVMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjpleHBlY3RlZF9pZGVudGlmaWVyX2FmdGVyX2RvdF9leHByKTsKICAgICBpZiAoIU5hbWUpIHJldHVybiBudWxscHRyOwotICAgIFN5bnRheENvbnRleHQtPmNyZWF0ZU5vZGVJblBsYWNlKFN5bnRheEtpbmQ6OkltcGxpY2l0TWVtYmVyRXhwcik7CisgICAgU3ludGF4Q29udGV4dC0+Y3JlYXRlTm9kZUluUGxhY2UoU3ludGF4S2luZDo6TWVtYmVyQWNjZXNzRXhwcik7CiAKICAgICAvLyBDaGVjayBmb3IgYSAoKSBzdWZmaXgsIHdoaWNoIGluZGljYXRlcyBhIGNhbGwgd2hlbiBjb25zdHJ1Y3RpbmcKICAgICAvLyB0aGlzIG1lbWJlci4gIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZS4KQEAgLTE4MDEsNyArMTgwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZJbnRlcnBvbGF0aW9uQ291bnQpIHsKICAgU291cmNlTG9jIExvYyA9IEVudGlyZVRvay5nZXRMb2MoKTsKICAgUGFyc2VyU3RhdHVzIFN0YXR1czsKLSAgVHJpdmlhIEVtcHR5VHJpdmlhOworICBQYXJzZWRUcml2aWEgRW1wdHlUcml2aWE7CiAgIGJvb2wgRmlyc3QgPSB0cnVlOwogCiAgIERlY2xOYW1lIGFwcGVuZExpdGVyYWwoQ29udGV4dCwgQ29udGV4dC5JZF9hcHBlbmRMaXRlcmFsLCB7IElkZW50aWZpZXIoKSB9KTsKQEAgLTIwMjcsOCArMjAyOCw4IEBACiAgIC8vIE1ha2UgdW5rbm93biB0b2tlbnMgdG8gcmVwcmVzZW50IHRoZSBvcGVuIGFuZCBjbG9zZSBxdW90ZS4KICAgVG9rZW4gT3BlblF1b3RlKFF1b3RlS2luZCwgT3BlblF1b3RlU3RyKTsKICAgVG9rZW4gQ2xvc2VRdW90ZShRdW90ZUtpbmQsIENsb3NlUXVvdGVTdHIpOwotICBUcml2aWEgRW1wdHlUcml2aWE7Ci0gIFRyaXZpYSBFbnRpcmVUcmFpbGluZ1RyaXZpYSA9IFRyYWlsaW5nVHJpdmlhOworICBQYXJzZWRUcml2aWEgRW1wdHlUcml2aWE7CisgIFBhcnNlZFRyaXZpYSBFbnRpcmVUcmFpbGluZ1RyaXZpYSA9IFRyYWlsaW5nVHJpdmlhOwogCiAgIC8vIEFkZCB0aGUgb3BlbiBxdW90ZSB0byB0aGUgY29udGV4dDsgdGhlIHF1b3RlIHNob3VsZCBoYXZlIHRoZSBsZWFkaW5nIHRyaXZpYQogICAvLyBvZiB0aGUgZW50aXJlIHN0cmluZyB0b2tlbiBhbmQgYSB2b2lkIHRyYWlsaW5nIHRyaXZpYS4KQEAgLTIwNDAsOCArMjA0MSw4IEBACiAgIC8vIFdlIGFyZSBnb2luZyB0byBtZXNzIHdpdGggVG9rIHRvIGRvIHJlcGFyc2luZyBmb3IgaW50ZXJwb2xhdGVkIGxpdGVyYWxzLAogICAvLyBkb24ndCBsb3NlIG91ciAnbmV4dCcgdG9rZW4uCiAgIGxsdm06OlNhdmVBbmRSZXN0b3JlPFRva2VuPiBTYXZlZFRvayhUb2spOwotICBsbHZtOjpTYXZlQW5kUmVzdG9yZTxUcml2aWE+IFNhdmVkTGVhZGluZ1RyaXZpYShMZWFkaW5nVHJpdmlhKTsKLSAgbGx2bTo6U2F2ZUFuZFJlc3RvcmU8VHJpdmlhPiBTYXZlZFRyYWlsaW5nVHJpdmlhKFRyYWlsaW5nVHJpdmlhKTsKKyAgbGx2bTo6U2F2ZUFuZFJlc3RvcmU8UGFyc2VkVHJpdmlhPiBTYXZlZExlYWRpbmdUcml2aWEoTGVhZGluZ1RyaXZpYSk7CisgIGxsdm06OlNhdmVBbmRSZXN0b3JlPFBhcnNlZFRyaXZpYT4gU2F2ZWRUcmFpbGluZ1RyaXZpYShUcmFpbGluZ1RyaXZpYSk7CiAKICAgLy8gV2UncmUgbm90IGluIGEgcGxhY2Ugd2hlcmUgYW4gaW50ZXJwb2xhdGlvbiB3b3VsZCBiZSB2YWxpZC4KICAgaWYgKCFDdXJMb2NhbENvbnRleHQpIHsKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZWRSYXdTeW50YXhOb2RlLmNwcCBiL2xpYi9QYXJzZS9QYXJzZWRSYXdTeW50YXhOb2RlLmNwcAppbmRleCBkYzgxZWM5Li5jMjgxMjYwIDEwMDY0NAotLS0gYS9saWIvUGFyc2UvUGFyc2VkUmF3U3ludGF4Tm9kZS5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlZFJhd1N5bnRheE5vZGUuY3BwCkBAIC0xMSwxOCArMTEsNDMgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJzd2lmdC9QYXJzZS9QYXJzZWRSYXdTeW50YXhOb2RlLmgiCisjaW5jbHVkZSAic3dpZnQvUGFyc2UvU3ludGF4UGFyc2luZ0NvbnRleHQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN3aWZ0OwogdXNpbmcgbmFtZXNwYWNlIHN3aWZ0OjpzeW50YXg7Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKIAogUGFyc2VkUmF3U3ludGF4Tm9kZQotUGFyc2VkUmF3U3ludGF4Tm9kZTo6bWFrZURlZmVycmVkTWlzc2luZyh0b2sga2luZCwgU291cmNlTG9jIGxvYykgewotICAvLyBQYXNzIGFwcHJvcHJpYXRlIHRleHQgZm9yIHRoZSBtaXNzaW5nIHRva2VuIHRvIGhhdmUgdGhlIHByb3ZpZGVkIGxvY2F0aW9uCi0gIC8vIGJ1dCB6ZXJvIGxlbmd0aC4KLSAgU3RyaW5nUmVmIHRva1RleHQgPSBDaGFyU291cmNlUmFuZ2V7bG9jLCAwfS5zdHIoKTsKLSAgYXV0byByYXcgPSBQYXJzZWRSYXdTeW50YXhOb2RlOjptYWtlRGVmZXJyZWQoVG9rZW57a2luZCwgdG9rVGV4dH0sIHt9LCB7fSk7Ci0gIHJhdy5Jc01pc3NpbmcgPSB0cnVlOwotICByZXR1cm4gcmF3OworUGFyc2VkUmF3U3ludGF4Tm9kZTo6bWFrZURlZmVycmVkKFN5bnRheEtpbmQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZWRSYXdTeW50YXhOb2RlPiBkZWZlcnJlZE5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFBhcnNpbmdDb250ZXh0ICZjdHgpIHsKKyAgaWYgKGRlZmVycmVkTm9kZXMuZW1wdHkoKSkgeworICAgIHJldHVybiBQYXJzZWRSYXdTeW50YXhOb2RlKGssIHt9KTsKKyAgfQorICBQYXJzZWRSYXdTeW50YXhOb2RlICpuZXdQdHIgPQorICAgIGN0eC5nZXRTY3JhdGNoQWxsb2MoKS5BbGxvY2F0ZTxQYXJzZWRSYXdTeW50YXhOb2RlPihkZWZlcnJlZE5vZGVzLnNpemUoKSk7CisgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KGRlZmVycmVkTm9kZXMuYmVnaW4oKSwgZGVmZXJyZWROb2Rlcy5lbmQoKSwgbmV3UHRyKTsKKyAgcmV0dXJuIFBhcnNlZFJhd1N5bnRheE5vZGUoaywgbWFrZUFycmF5UmVmKG5ld1B0ciwgZGVmZXJyZWROb2Rlcy5zaXplKCkpKTsKK30KKworUGFyc2VkUmF3U3ludGF4Tm9kZQorUGFyc2VkUmF3U3ludGF4Tm9kZTo6bWFrZURlZmVycmVkKFRva2VuIHRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJzZWRUcml2aWEgJmxlYWRpbmdUcml2aWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyc2VkVHJpdmlhICZ0cmFpbGluZ1RyaXZpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhQYXJzaW5nQ29udGV4dCAmY3R4KSB7CisgIENoYXJTb3VyY2VSYW5nZSB0b2tSYW5nZSA9IHRvay5nZXRSYW5nZVdpdGhvdXRCYWNrdGlja3MoKTsKKyAgc2l6ZV90IHBpZWNlc0NvdW50ID0gbGVhZGluZ1RyaXZpYS5zaXplKCkgKyB0cmFpbGluZ1RyaXZpYS5zaXplKCk7CisgIFBhcnNlZFRyaXZpYVBpZWNlICpwaWVjZXNQdHIgPSBudWxscHRyOworICBpZiAocGllY2VzQ291bnQgPiAwKSB7CisgICAgcGllY2VzUHRyID0gY3R4LmdldFNjcmF0Y2hBbGxvYygpLkFsbG9jYXRlPFBhcnNlZFRyaXZpYVBpZWNlPihwaWVjZXNDb3VudCk7CisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkobGVhZGluZ1RyaXZpYS5iZWdpbigpLCBsZWFkaW5nVHJpdmlhLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZWNlc1B0cik7CisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkodHJhaWxpbmdUcml2aWEuYmVnaW4oKSwgdHJhaWxpbmdUcml2aWEuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGllY2VzUHRyICsgbGVhZGluZ1RyaXZpYS5zaXplKCkpOworICB9CisgIHJldHVybiBQYXJzZWRSYXdTeW50YXhOb2RlKHRvay5nZXRLaW5kKCksIHRva1JhbmdlLmdldFN0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva1JhbmdlLmdldEJ5dGVMZW5ndGgoKSwgcGllY2VzUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkaW5nVHJpdmlhLnNpemUoKSwgdHJhaWxpbmdUcml2aWEuc2l6ZSgpKTsKIH0KIAogdm9pZCBQYXJzZWRSYXdTeW50YXhOb2RlOjpkdW1wKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvbGliL1BhcnNlL1BhcnNlZFJhd1N5bnRheFJlY29yZGVyLmNwcCBiL2xpYi9QYXJzZS9QYXJzZWRSYXdTeW50YXhSZWNvcmRlci5jcHAKaW5kZXggMTg0OTA2Yy4uNDFmM2RiOCAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlZFJhd1N5bnRheFJlY29yZGVyLmNwcAorKysgYi9saWIvUGFyc2UvUGFyc2VkUmF3U3ludGF4UmVjb3JkZXIuY3BwCkBAIC0xOCwzMyArMTgsMzUgQEAKIAogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1BhcnNlZFJhd1N5bnRheFJlY29yZGVyLmgiCiAjaW5jbHVkZSAic3dpZnQvUGFyc2UvUGFyc2VkUmF3U3ludGF4Tm9kZS5oIgorI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1BhcnNlZFRyaXZpYS5oIgogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1N5bnRheFBhcnNlQWN0aW9ucy5oIgogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1Rva2VuLmgiCiAjaW5jbHVkZSAic3dpZnQvU3ludGF4L1N5bnRheEtpbmQuaCIKLSNpbmNsdWRlICJzd2lmdC9TeW50YXgvVHJpdmlhLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzd2lmdDsKIHVzaW5nIG5hbWVzcGFjZSBzd2lmdDo6c3ludGF4OwogCiBQYXJzZWRSYXdTeW50YXhOb2RlCiBQYXJzZWRSYXdTeW50YXhSZWNvcmRlcjo6cmVjb3JkVG9rZW4oY29uc3QgVG9rZW4gJnRvaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcml2aWEgJmxlYWRpbmdUcml2aWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJpdmlhICZ0cmFpbGluZ1RyaXZpYSkgewotICBTb3VyY2VMb2MgdG9rTG9jID0gdG9rLmdldExvYygpOwotICB1bnNpZ25lZCB0b2tMZW5ndGggPSB0b2suZ2V0TGVuZ3RoKCk7Ci0gIGlmICh0b2suaXNFc2NhcGVkSWRlbnRpZmllcigpKSB7Ci0gICAgLy8gQWRqdXN0IHRvIGFjY291bnQgZm9yIHRoZSBiYWNrdGlja3MgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdHJpdmlhLgotICAgIHRva0xvYyA9IHRva0xvYy5nZXRBZHZhbmNlZExvYygxKTsKLSAgICB0b2tMZW5ndGggLT0gMjsKLSAgfQotICB1bnNpZ25lZCBsZWFkaW5nVHJpdmlhTGVuID0gbGVhZGluZ1RyaXZpYS5nZXRUZXh0TGVuZ3RoKCk7Ci0gIHVuc2lnbmVkIHRyYWlsaW5nVHJpdmlhTGVuID0gdHJhaWxpbmdUcml2aWEuZ2V0VGV4dExlbmd0aCgpOwotICBTb3VyY2VMb2Mgb2Zmc2V0ID0gdG9rTG9jLmdldEFkdmFuY2VkTG9jKC1sZWFkaW5nVHJpdmlhTGVuKTsKLSAgdW5zaWduZWQgbGVuZ3RoID0gbGVhZGluZ1RyaXZpYUxlbiArIHRva0xlbmd0aCArIHRyYWlsaW5nVHJpdmlhTGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRyaXZpYSAmbGVhZGluZ1RyaXZpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJzZWRUcml2aWEgJnRyYWlsaW5nVHJpdmlhKSB7CisgIHJldHVybiByZWNvcmRUb2tlbih0b2suZ2V0S2luZCgpLCB0b2suZ2V0UmFuZ2VXaXRob3V0QmFja3RpY2tzKCksCisgICAgICAgICAgICAgICAgICAgICBsZWFkaW5nVHJpdmlhLlBpZWNlcywgdHJhaWxpbmdUcml2aWEuUGllY2VzKTsKK30KKworUGFyc2VkUmF3U3ludGF4Tm9kZQorUGFyc2VkUmF3U3ludGF4UmVjb3JkZXI6OnJlY29yZFRva2VuKHRvayB0b2tLaW5kLCBDaGFyU291cmNlUmFuZ2UgdG9rUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFRyaXZpYVBpZWNlPiBsZWFkaW5nVHJpdmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZWRUcml2aWFQaWVjZT4gdHJhaWxpbmdUcml2aWEpIHsKKyAgc2l6ZV90IGxlYWRpbmdUcml2aWFMZW4gPSBQYXJzZWRUcml2aWFQaWVjZTo6Z2V0VG90YWxMZW5ndGgobGVhZGluZ1RyaXZpYSk7CisgIHNpemVfdCB0cmFpbGluZ1RyaXZpYUxlbiA9IFBhcnNlZFRyaXZpYVBpZWNlOjpnZXRUb3RhbExlbmd0aCh0cmFpbGluZ1RyaXZpYSk7CisgIFNvdXJjZUxvYyBvZmZzZXQgPSB0b2tSYW5nZS5nZXRTdGFydCgpLmdldEFkdmFuY2VkTG9jKC1sZWFkaW5nVHJpdmlhTGVuKTsKKyAgdW5zaWduZWQgbGVuZ3RoID0gbGVhZGluZ1RyaXZpYUxlbiArIHRva1JhbmdlLmdldEJ5dGVMZW5ndGgoKSArCisgICAgICB0cmFpbGluZ1RyaXZpYUxlbjsKICAgQ2hhclNvdXJjZVJhbmdlIHJhbmdle29mZnNldCwgbGVuZ3RofTsKLSAgT3BhcXVlU3ludGF4Tm9kZSBuID0gU1BBY3Rpb25zLT5yZWNvcmRUb2tlbih0b2ssIGxlYWRpbmdUcml2aWEsCisgIE9wYXF1ZVN5bnRheE5vZGUgbiA9IFNQQWN0aW9ucy0+cmVjb3JkVG9rZW4odG9rS2luZCwgbGVhZGluZ1RyaXZpYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1RyaXZpYSwgcmFuZ2UpOwotICByZXR1cm4gUGFyc2VkUmF3U3ludGF4Tm9kZXtTeW50YXhLaW5kOjpUb2tlbiwgdG9rLmdldEtpbmQoKSwgcmFuZ2UsIG59OworICByZXR1cm4gUGFyc2VkUmF3U3ludGF4Tm9kZXtTeW50YXhLaW5kOjpUb2tlbiwgdG9rS2luZCwgcmFuZ2UsIG59OwogfQogCiBQYXJzZWRSYXdTeW50YXhOb2RlCkBAIC02MSwxMSArNjMsMTMgQEAKICAgaWYgKG5vZGUuaXNEZWZlcnJlZExheW91dCgpKQogICAgIHJldHVybiByZWMucmVjb3JkUmF3U3ludGF4KG5vZGUuZ2V0S2luZCgpLCBub2RlLmdldERlZmVycmVkQ2hpbGRyZW4oKSk7CiAgIGFzc2VydChub2RlLmlzRGVmZXJyZWRUb2tlbigpKTsKLSAgY29uc3QgVG9rZW4gJnRvayA9IG5vZGUuZ2V0VG9rZW4oKTsKKyAgQ2hhclNvdXJjZVJhbmdlIHRva1JhbmdlID0gbm9kZS5nZXREZWZlcnJlZFRva2VuUmFuZ2VXaXRob3V0QmFja3RpY2tzKCk7CisgIHRvayB0b2tLaW5kID0gbm9kZS5nZXRUb2tlbktpbmQoKTsKICAgaWYgKG5vZGUuaXNNaXNzaW5nKCkpCi0gICAgcmV0dXJuIHJlYy5yZWNvcmRNaXNzaW5nVG9rZW4odG9rLmdldEtpbmQoKSwgdG9rLmdldExvYygpKTsKLSAgcmV0dXJuIHJlYy5yZWNvcmRUb2tlbih0b2ssIG5vZGUuZ2V0TGVhZGluZ1RyaXZpYSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0VHJhaWxpbmdUcml2aWEoKSk7CisgICAgcmV0dXJuIHJlYy5yZWNvcmRNaXNzaW5nVG9rZW4odG9rS2luZCwgdG9rUmFuZ2UuZ2V0U3RhcnQoKSk7CisgIHJldHVybiByZWMucmVjb3JkVG9rZW4odG9rS2luZCx0b2tSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldERlZmVycmVkTGVhZGluZ1RyaXZpYVBpZWNlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0RGVmZXJyZWRUcmFpbGluZ1RyaXZpYVBpZWNlcygpKTsKIH0KIAogUGFyc2VkUmF3U3ludGF4Tm9kZQpkaWZmIC0tZ2l0IGEvbGliL1BhcnNlL1BhcnNlZFN5bnRheEJ1aWxkZXJzLmNwcC5neWIgYi9saWIvUGFyc2UvUGFyc2VkU3ludGF4QnVpbGRlcnMuY3BwLmd5YgppbmRleCAwMTEzY2JiLi44ZTQwY2JhIDEwMDY0NAotLS0gYS9saWIvUGFyc2UvUGFyc2VkU3ludGF4QnVpbGRlcnMuY3BwLmd5YgorKysgYi9saWIvUGFyc2UvUGFyc2VkU3ludGF4QnVpbGRlcnMuY3BwLmd5YgpAQCAtMjksMjQgKzI5LDI3IEBACiAlIGZvciBub2RlIGluIFNZTlRBWF9OT0RFUzoKICUgICBpZiBub2RlLmlzX2J1aWxkYWJsZSgpOgogJSAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGRyZW46Ci1QYXJzZWQke25vZGUubmFtZX1CdWlsZGVyICYKLVBhcnNlZCR7bm9kZS5uYW1lfUJ1aWxkZXI6OnVzZSR7Y2hpbGQubmFtZX0oUGFyc2VkJHtjaGlsZC50eXBlX25hbWV9ICR7Y2hpbGQubmFtZX0pIHsKLSAgTGF5b3V0W2N1cnNvckluZGV4KCR7bm9kZS5uYW1lfTo6Q3Vyc29yOjoke2NoaWxkLm5hbWV9KV0gPQotICAgICR7Y2hpbGQubmFtZX0uZ2V0UmF3KCk7Ci0gIHJldHVybiAqdGhpczsKLX0KKyUgICAgICAgY2hpbGRfZWx0ID0gTm9uZQorJSAgICAgICBjaGlsZF9lbHRfdHlwZSA9IE5vbmUKICUgICAgICAgY2hpbGRfbm9kZSA9IE5PREVfTUFQLmdldChjaGlsZC5zeW50YXhfa2luZCkKICUgICAgICAgaWYgY2hpbGRfbm9kZSBhbmQgY2hpbGRfbm9kZS5pc19zeW50YXhfY29sbGVjdGlvbigpOgogJSAgICAgICAgIGNoaWxkX2VsdCA9IGNoaWxkX25vZGUuY29sbGVjdGlvbl9lbGVtZW50X25hbWUKICUgICAgICAgICBjaGlsZF9lbHRfdHlwZSA9IGNoaWxkX25vZGUuY29sbGVjdGlvbl9lbGVtZW50X3R5cGUKKyUgICAgICAgZW5kCitQYXJzZWQke25vZGUubmFtZX1CdWlsZGVyICYKK1BhcnNlZCR7bm9kZS5uYW1lfUJ1aWxkZXI6OnVzZSR7Y2hpbGQubmFtZX0oUGFyc2VkJHtjaGlsZC50eXBlX25hbWV9ICR7Y2hpbGQubmFtZX0pIHsKKyUgICAgICAgaWYgY2hpbGRfZWx0OgorICBhc3NlcnQoJHtjaGlsZF9lbHR9Tm9kZXMuZW1wdHkoKSAmJiAidXNlIGVpdGhlciAndXNlJyBmdW5jdGlvbiBvciAnYWRkJywgbm90IGJvdGgiKTsKKyUgICAgICAgZW5kCisgIExheW91dFtjdXJzb3JJbmRleCgke25vZGUubmFtZX06OkN1cnNvcjo6JHtjaGlsZC5uYW1lfSldID0KKyAgICAke2NoaWxkLm5hbWV9LmdldFJhdygpOworICByZXR1cm4gKnRoaXM7Cit9CislICAgICAgIGlmIGNoaWxkX2VsdDoKIFBhcnNlZCR7bm9kZS5uYW1lfUJ1aWxkZXIgJgogUGFyc2VkJHtub2RlLm5hbWV9QnVpbGRlcjo6YWRkJHtjaGlsZF9lbHR9KFBhcnNlZCR7Y2hpbGRfZWx0X3R5cGV9ICR7Y2hpbGRfZWx0fSkgewotICBhdXRvICZyYXcgPSBMYXlvdXRbY3Vyc29ySW5kZXgoJHtub2RlLm5hbWV9OjpDdXJzb3I6OiR7Y2hpbGQubmFtZX0pXTsKLSAgaWYgKHJhdy5pc051bGwoKSkKLSAgICByYXcgPSBQYXJzZWRSYXdTeW50YXhOb2RlOjptYWtlRGVmZXJyZWQoU3ludGF4S2luZDo6JHtjaGlsZF9ub2RlLnN5bnRheF9raW5kfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeyR7Y2hpbGRfZWx0fS5nZXRSYXcoKX0pOwotICBlbHNlCi0gICAgcmF3LmFkZERlZmVycmVkQ2hpbGQoJHtjaGlsZF9lbHR9LmdldFJhdygpKTsKKyAgYXNzZXJ0KExheW91dFtjdXJzb3JJbmRleCgke25vZGUubmFtZX06OkN1cnNvcjo6JHtjaGlsZC5uYW1lfSldLmlzTnVsbCgpICYmICJ1c2UgZWl0aGVyICd1c2UnIGZ1bmN0aW9uIG9yICdhZGQnLCBub3QgYm90aCIpOworICAke2NoaWxkX2VsdH1Ob2Rlcy5wdXNoX2JhY2soc3RkOjptb3ZlKCR7Y2hpbGRfZWx0fS5nZXRSYXcoKSkpOwogICByZXR1cm4gKnRoaXM7CiB9CiAlICAgICAgIGVuZApAQCAtNTQsMzkgKzU3LDYyIEBACiAKIFBhcnNlZCR7bm9kZS5uYW1lfQogUGFyc2VkJHtub2RlLm5hbWV9QnVpbGRlcjo6cmVjb3JkKCkgewotICBmaW5pc2hMYXlvdXQoKTsKKyAgZmluaXNoTGF5b3V0KC8qZGVmZXJyZWQ9Ki9mYWxzZSk7CisgIGF1dG8gJlJlYyA9IFNQQ3R4LmdldFJlY29yZGVyKCk7CiAgIGF1dG8gcmF3ID0gUmVjLnJlY29yZFJhd1N5bnRheChTeW50YXhLaW5kOjoke25vZGUuc3ludGF4X2tpbmR9LCBMYXlvdXQpOwogICByZXR1cm4gUGFyc2VkJHtub2RlLm5hbWV9KHN0ZDo6bW92ZShyYXcpKTsKIH0KIAogUGFyc2VkJHtub2RlLm5hbWV9CiBQYXJzZWQke25vZGUubmFtZX1CdWlsZGVyOjptYWtlRGVmZXJyZWQoKSB7Ci0gIGZpbmlzaExheW91dCgpOworICBmaW5pc2hMYXlvdXQoLypkZWZlcnJlZD0qL3RydWUpOwogICBhdXRvIHJhdyA9IFBhcnNlZFJhd1N5bnRheE5vZGU6Om1ha2VEZWZlcnJlZChTeW50YXhLaW5kOjoke25vZGUuc3ludGF4X2tpbmR9LAotICAgIExheW91dCk7CisgICAgTGF5b3V0LCBTUEN0eCk7CiAgIHJldHVybiBQYXJzZWQke25vZGUubmFtZX0oc3RkOjptb3ZlKHJhdykpOwogfQogCiBQYXJzZWQke25vZGUubmFtZX0KIFBhcnNlZCR7bm9kZS5uYW1lfUJ1aWxkZXI6OmJ1aWxkKCkgewotICBpZiAoSXNCYWNrdHJhY2tpbmcpCisgIGlmIChTUEN0eC5pc0JhY2t0cmFja2luZygpKQogICAgIHJldHVybiBtYWtlRGVmZXJyZWQoKTsKICAgcmV0dXJuIHJlY29yZCgpOwogfQogCi12b2lkIFBhcnNlZCR7bm9kZS5uYW1lfUJ1aWxkZXI6OmZpbmlzaExheW91dCgpIHsKK3ZvaWQgUGFyc2VkJHtub2RlLm5hbWV9QnVpbGRlcjo6ZmluaXNoTGF5b3V0KGJvb2wgZGVmZXJyZWQpIHsKKyAgYXV0byAmUmVjID0gU1BDdHguZ2V0UmVjb3JkZXIoKTsKKyAgKHZvaWQpUmVjOwogJSBpZiBub2RlLmNoaWxkcmVuOgogJSAgIGZvciAoaWR4LCBjaGlsZCkgaW4gZW51bWVyYXRlKG5vZGUuY2hpbGRyZW4pOgorJSAgICAgY2hpbGRfZWx0ID0gTm9uZQorJSAgICAgY2hpbGRfbm9kZSA9IE5PREVfTUFQLmdldChjaGlsZC5zeW50YXhfa2luZCkKKyUgICAgIGlmIGNoaWxkX25vZGUgYW5kIGNoaWxkX25vZGUuaXNfc3ludGF4X2NvbGxlY3Rpb24oKToKKyUgICAgICAgY2hpbGRfZWx0ID0gY2hpbGRfbm9kZS5jb2xsZWN0aW9uX2VsZW1lbnRfbmFtZQorJSAgICAgaWYgY2hpbGRfZWx0OgorICBpZiAoISR7Y2hpbGRfZWx0fU5vZGVzLmVtcHR5KCkpIHsKKyAgICBpZiAoZGVmZXJyZWQpIHsKKyAgICAgIExheW91dFske2lkeH1dID0gUGFyc2VkUmF3U3ludGF4Tm9kZTo6bWFrZURlZmVycmVkKFN5bnRheEtpbmQ6OiR7Y2hpbGRfbm9kZS5zeW50YXhfa2luZH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y2hpbGRfZWx0fU5vZGVzLCBTUEN0eCk7CisgICAgfSBlbHNlIHsKKyAgICAgIExheW91dFske2lkeH1dID0gUmVjLnJlY29yZFJhd1N5bnRheChTeW50YXhLaW5kOjoke2NoaWxkX25vZGUuc3ludGF4X2tpbmR9LCAke2NoaWxkX2VsdH1Ob2Rlcyk7CisgICAgfQorICB9CislICAgICBlbmQKICUgICAgIGlmIG5vdCBjaGlsZC5pc19vcHRpb25hbDoKICAgaWYgKExheW91dFske2lkeH1dLmlzTnVsbCgpKSB7CiAlICAgICAgIGlmIGNoaWxkLmlzX3Rva2VuKCk6CiAlICAgICAgICAgdG9rZW4gPSBjaGlsZC5tYWluX3Rva2VuKCkKICUgICAgICAgICB0b2tfa2luZCA9IHRva2VuLmtpbmQgaWYgdG9rZW4gZWxzZSAidW5rbm93biIKLSAgICBpZiAoSXNCYWNrdHJhY2tpbmcpIHsKKyAgICBpZiAoZGVmZXJyZWQpIHsKICAgICAgIExheW91dFske2lkeH1dID0gUGFyc2VkUmF3U3ludGF4Tm9kZTo6bWFrZURlZmVycmVkTWlzc2luZyh0b2s6OiR7dG9rX2tpbmR9LCBTb3VyY2VMb2MoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIExheW91dFske2lkeH1dID0gUmVjLnJlY29yZE1pc3NpbmdUb2tlbih0b2s6OiR7dG9rX2tpbmR9LCBTb3VyY2VMb2MoKSk7CiAgICAgfQorJSAgICAgICBlbGlmIGNoaWxkX2VsdDoKKyAgICBpZiAoZGVmZXJyZWQpIHsKKyAgICAgIExheW91dFske2lkeH1dID0gUGFyc2VkUmF3U3ludGF4Tm9kZTo6bWFrZURlZmVycmVkKFN5bnRheEtpbmQ6OiR7Y2hpbGRfbm9kZS5zeW50YXhfa2luZH0sIHt9LCBTUEN0eCk7CisgICAgfSBlbHNlIHsKKyAgICAgIExheW91dFske2lkeH1dID0gUmVjLnJlY29yZFJhd1N5bnRheChTeW50YXhLaW5kOjoke2NoaWxkX25vZGUuc3ludGF4X2tpbmR9LCB7fSk7CisgICAgfQogJSAgICAgICBlbHNlOgogICAgIGxsdm1fdW5yZWFjaGFibGUoIm5lZWQgbWlzc2luZyBub24tdG9rZW4gbm9kZXMgPyIpOwogJSAgICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZWRTeW50YXhSZWNvcmRlci5jcHAuZ3liIGIvbGliL1BhcnNlL1BhcnNlZFN5bnRheFJlY29yZGVyLmNwcC5neWIKaW5kZXggZDUwNGVkOS4uMTc3MDBjYyAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlZFN5bnRheFJlY29yZGVyLmNwcC5neWIKKysrIGIvbGliL1BhcnNlL1BhcnNlZFN5bnRheFJlY29yZGVyLmNwcC5neWIKQEAgLTk4LDcgKzk4LDcgQEAKIH0KIAogUGFyc2VkJHtub2RlLm5hbWV9Ci1QYXJzZWRTeW50YXhSZWNvcmRlcjo6ZGVmZXIke25vZGUuc3ludGF4X2tpbmR9KCR7Y2hpbGRfcGFyYW1zfSkgeworUGFyc2VkU3ludGF4UmVjb3JkZXI6OmRlZmVyJHtub2RlLnN5bnRheF9raW5kfSgke2NoaWxkX3BhcmFtc30sIFN5bnRheFBhcnNpbmdDb250ZXh0ICZTUEN0eCkgewogICBhdXRvIHJhdyA9IFBhcnNlZFJhd1N5bnRheE5vZGU6Om1ha2VEZWZlcnJlZChTeW50YXhLaW5kOjoke25vZGUuc3ludGF4X2tpbmR9LCB7CiAlICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZHJlbjoKICUgICAgICAgaWYgY2hpbGQuaXNfb3B0aW9uYWw6CkBAIC0xMDcsNyArMTA3LDcgQEAKICAgICAke2NoaWxkLm5hbWV9LmdldFJhdygpLAogJSAgICAgICBlbmQKICUgICAgIGVuZAotICB9KTsKKyAgfSwgU1BDdHgpOwogICByZXR1cm4gUGFyc2VkJHtub2RlLm5hbWV9KHN0ZDo6bW92ZShyYXcpKTsKIH0KIApAQCAtMTE1LDcgKzExNSw3IEBACiBQYXJzZWRTeW50YXhSZWNvcmRlcjo6bWFrZSR7bm9kZS5zeW50YXhfa2luZH0oJHtjaGlsZF9wYXJhbXN9LAogICAgIFN5bnRheFBhcnNpbmdDb250ZXh0ICZTUEN0eCkgewogICBpZiAoU1BDdHguaXNCYWNrdHJhY2tpbmcoKSkKLSAgICByZXR1cm4gZGVmZXIke25vZGUuc3ludGF4X2tpbmR9KCR7Y2hpbGRfbW92ZV9hcmdzfSk7CisgICAgcmV0dXJuIGRlZmVyJHtub2RlLnN5bnRheF9raW5kfSgke2NoaWxkX21vdmVfYXJnc30sIFNQQ3R4KTsKICAgcmV0dXJuIHJlY29yZCR7bm9kZS5zeW50YXhfa2luZH0oJHtjaGlsZF9tb3ZlX2FyZ3N9LCBTUEN0eC5nZXRSZWNvcmRlcigpKTsKIH0KIApAQCAtMTM1LDE0ICsxMzUsMTUgQEAKIAogUGFyc2VkJHtub2RlLm5hbWV9CiBQYXJzZWRTeW50YXhSZWNvcmRlcjo6ZGVmZXIke25vZGUuc3ludGF4X2tpbmR9KAotICAgIEFycmF5UmVmPFBhcnNlZCR7bm9kZS5jb2xsZWN0aW9uX2VsZW1lbnRfdHlwZX0+IGVsZW1lbnRzKSB7CisgICAgQXJyYXlSZWY8UGFyc2VkJHtub2RlLmNvbGxlY3Rpb25fZWxlbWVudF90eXBlfT4gZWxlbWVudHMsCisgICAgU3ludGF4UGFyc2luZ0NvbnRleHQgJlNQQ3R4KSB7CiAgIFNtYWxsVmVjdG9yPFBhcnNlZFJhd1N5bnRheE5vZGUsIDE2PiBsYXlvdXQ7CiAgIGxheW91dC5yZXNlcnZlKGVsZW1lbnRzLnNpemUoKSk7CiAgIGZvciAoYXV0byAmZWxlbWVudCA6IGVsZW1lbnRzKSB7CiAgICAgbGF5b3V0LnB1c2hfYmFjayhlbGVtZW50LmdldFJhdygpKTsKICAgfQogICBhdXRvIHJhdyA9IFBhcnNlZFJhd1N5bnRheE5vZGU6Om1ha2VEZWZlcnJlZChTeW50YXhLaW5kOjoke25vZGUuc3ludGF4X2tpbmR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQsIFNQQ3R4KTsKICAgcmV0dXJuIFBhcnNlZCR7bm9kZS5uYW1lfShzdGQ6Om1vdmUocmF3KSk7CiB9CiAKQEAgLTE1MSw3ICsxNTIsNyBAQAogICAgIEFycmF5UmVmPFBhcnNlZCR7bm9kZS5jb2xsZWN0aW9uX2VsZW1lbnRfdHlwZX0+IGVsZW1lbnRzLAogICAgIFN5bnRheFBhcnNpbmdDb250ZXh0ICZTUEN0eCkgewogICBpZiAoU1BDdHguaXNCYWNrdHJhY2tpbmcoKSkKLSAgICByZXR1cm4gZGVmZXIke25vZGUuc3ludGF4X2tpbmR9KGVsZW1lbnRzKTsKKyAgICByZXR1cm4gZGVmZXIke25vZGUuc3ludGF4X2tpbmR9KGVsZW1lbnRzLCBTUEN0eCk7CiAgIHJldHVybiByZWNvcmQke25vZGUuc3ludGF4X2tpbmR9KGVsZW1lbnRzLCBTUEN0eC5nZXRSZWNvcmRlcigpKTsKIH0KIApAQCAtMTYxLDcgKzE2Miw3IEBACiAgIFBhcnNlZFJhd1N5bnRheE5vZGUgcmF3OwogICBpZiAoU1BDdHguaXNCYWNrdHJhY2tpbmcoKSkgewogICAgIC8vIEZJWE1FOiAnbG9jJyBpcyBub3QgcHJlc2VydmVkIHdoZW4gY2FwdHVyaW5nIGEgZGVmZXJyZWQgbGF5b3V0LgotICAgIHJhdyA9IFBhcnNlZFJhd1N5bnRheE5vZGU6Om1ha2VEZWZlcnJlZChTeW50YXhLaW5kOjoke25vZGUuc3ludGF4X2tpbmR9LCB7fSk7CisgICAgcmF3ID0gUGFyc2VkUmF3U3ludGF4Tm9kZTo6bWFrZURlZmVycmVkKFN5bnRheEtpbmQ6OiR7bm9kZS5zeW50YXhfa2luZH0sIHt9LCBTUEN0eCk7CiAgIH0gZWxzZSB7CiAgICAgcmF3ID0gU1BDdHguZ2V0UmVjb3JkZXIoKS5yZWNvcmRFbXB0eVJhd1N5bnRheENvbGxlY3Rpb24oU3ludGF4S2luZDo6JHtub2RlLnN5bnRheF9raW5kfSwgbG9jKTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL1BhcnNlL1BhcnNlZFRyaXZpYS5jcHAgYi9saWIvUGFyc2UvUGFyc2VkVHJpdmlhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY0YmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL1BhcnNlL1BhcnNlZFRyaXZpYS5jcHAKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tLS0gUGFyc2VkVHJpdmlhLmNwcCAtIFBhcnNlZFRyaXZpYSBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotPT09Ly8KKy8vCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIHBhcnQgb2YgdGhlIFN3aWZ0Lm9yZyBvcGVuIHNvdXJjZSBwcm9qZWN0CisvLworLy8gQ29weXJpZ2h0IChjKSAyMDE0IC0gMjAxOSBBcHBsZSBJbmMuIGFuZCB0aGUgU3dpZnQgcHJvamVjdCBhdXRob3JzCisvLyBMaWNlbnNlZCB1bmRlciBBcGFjaGUgTGljZW5zZSB2Mi4wIHdpdGggUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbgorLy8KKy8vIFNlZSBodHRwczovL3N3aWZ0Lm9yZy9MSUNFTlNFLnR4dCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbgorLy8gU2VlIGh0dHBzOi8vc3dpZnQub3JnL0NPTlRSSUJVVE9SUy50eHQgZm9yIHRoZSBsaXN0IG9mIFN3aWZ0IHByb2plY3QgYXV0aG9ycworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJzd2lmdC9QYXJzZS9QYXJzZWRUcml2aWEuaCIKKyNpbmNsdWRlICJzd2lmdC9TeW50YXgvVHJpdmlhLmgiCisjaW5jbHVkZSAic3dpZnQvQmFzaWMvU291cmNlTWFuYWdlci5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3dpZnQ7Cit1c2luZyBuYW1lc3BhY2Ugc3dpZnQ6OnN5bnRheDsKKworVHJpdmlhCitQYXJzZWRUcml2aWFQaWVjZTo6Y29udmVydFRvU3ludGF4VHJpdmlhKEFycmF5UmVmPFBhcnNlZFRyaXZpYVBpZWNlPiBwaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvYyBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBidWZmZXJJRCkgeworICBUcml2aWEgdHJpdmlhOworICBTb3VyY2VMb2MgY3VyTG9jID0gbG9jOworICBmb3IgKGNvbnN0IGF1dG8gJnBpZWNlIDogcGllY2VzKSB7CisgICAgQ2hhclNvdXJjZVJhbmdlIHJhbmdle2N1ckxvYywgcGllY2UuZ2V0TGVuZ3RoKCl9OworICAgIFN0cmluZ1JlZiB0ZXh0ID0gU00uZXh0cmFjdFRleHQocmFuZ2UsIGJ1ZmZlcklEKTsKKyAgICB0cml2aWEucHVzaF9iYWNrKFRyaXZpYVBpZWNlOjpmcm9tVGV4dChwaWVjZS5nZXRLaW5kKCksIHRleHQpKTsKKyAgICBjdXJMb2MgPSBjdXJMb2MuZ2V0QWR2YW5jZWRMb2MocGllY2UuZ2V0TGVuZ3RoKCkpOworICB9CisgIHJldHVybiB0cml2aWE7Cit9CisKK1RyaXZpYQorUGFyc2VkVHJpdmlhOjpjb252ZXJ0VG9TeW50YXhUcml2aWEoU291cmNlTG9jIGxvYywgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBidWZmZXJJRCkgY29uc3QgeworICByZXR1cm4gUGFyc2VkVHJpdmlhUGllY2U6OmNvbnZlcnRUb1N5bnRheFRyaXZpYShQaWVjZXMsIGxvYywgU00sIGJ1ZmZlcklEKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZXIuY3BwIGIvbGliL1BhcnNlL1BhcnNlci5jcHAKaW5kZXggYjM5ODhiYi4uYWZiNDc2YyAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlci5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlci5jcHAKQEAgLTczLDcgKzczLDcgQEAKICAgfQogCiAgIFRva2VuIFRvazsKLSAgc3ludGF4OjpUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CisgIFBhcnNlZFRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKICAgZG8gewogICAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogCkBAIC04Myw3ICs4Myw3IEBACiAgICAgaWYgKEYgIT0gUmVzZXRUb2tlbnMuZW5kKCkpIHsKICAgICAgIGFzc2VydChGLT5pc05vdCh0b2s6OnN0cmluZ19saXRlcmFsKSk7CiAKLSAgICAgIERlc3RGdW5jKCpGLCBzeW50YXg6OlRyaXZpYSgpLCBzeW50YXg6OlRyaXZpYSgpKTsKKyAgICAgIERlc3RGdW5jKCpGLCBQYXJzZWRUcml2aWEoKSwgUGFyc2VkVHJpdmlhKCkpOwogCiAgICAgICBhdXRvIE5ld1N0YXRlID0gTC5nZXRTdGF0ZUZvckJlZ2lubmluZ09mVG9rZW5Mb2MoCiAgICAgICAgICAgRi0+Z2V0TG9jKCkuZ2V0QWR2YW5jZWRMb2MoRi0+Z2V0TGVuZ3RoKCkpKTsKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPFRva2VuPiBTdHJUb2tlbnM7CiAgICAgICBnZXRTdHJpbmdQYXJ0VG9rZW5zKFRvaywgTGFuZ09wdHMsIFNNLCBCdWZmZXJJRCwgU3RyVG9rZW5zKTsKICAgICAgIGZvciAoYXV0byAmU3RyVG9rIDogU3RyVG9rZW5zKSB7Ci0gICAgICAgIERlc3RGdW5jKFN0clRvaywgc3ludGF4OjpUcml2aWEoKSwgc3ludGF4OjpUcml2aWEoKSk7CisgICAgICAgIERlc3RGdW5jKFN0clRvaywgUGFyc2VkVHJpdmlhKCksIFBhcnNlZFRyaXZpYSgpKTsKICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgRGVzdEZ1bmMoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CkBAIC0xMzksNyArMTM5LDggQEAKICAgICBTb3VyY2VGaWxlICZTRiA9ICpBRkQtPmdldERlY2xDb250ZXh0KCktPmdldFBhcmVudFNvdXJjZUZpbGUoKTsKICAgICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IgPSBTRi5nZXRBU1RDb250ZXh0KCkuU291cmNlTWdyOwogICAgIHVuc2lnbmVkIEJ1ZmZlcklEID0gU291cmNlTWdyLmZpbmRCdWZmZXJDb250YWluaW5nTG9jKEFGRC0+Z2V0TG9jKCkpOwotICAgIFBhcnNlciBUaGVQYXJzZXIoQnVmZmVySUQsIFNGLCBudWxscHRyLCAmUGFyc2VyU3RhdGUpOworICAgIFBhcnNlciBUaGVQYXJzZXIoQnVmZmVySUQsIFNGLCBudWxscHRyLCAmUGFyc2VyU3RhdGUsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAvKkRlbGF5Qm9keVBhcnNpbmc9Ki9mYWxzZSk7CiAgICAgVGhlUGFyc2VyLlN5bnRheENvbnRleHQtPmRpc2FibGUoKTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29kZUNvbXBsZXRpb25DYWxsYmFja3M+IENvZGVDb21wbGV0aW9uOwogICAgIGlmIChDb2RlQ29tcGxldGlvbkZhY3RvcnkpIHsKQEAgLTE2NSw3ICsxNjYsOCBAQAogICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IgPSBTRi5nZXRBU1RDb250ZXh0KCkuU291cmNlTWdyOwogICB1bnNpZ25lZCBCdWZmZXJJRCA9CiAgICAgU291cmNlTWdyLmZpbmRCdWZmZXJDb250YWluaW5nTG9jKFBhcnNlclN0YXRlLmdldERlbGF5ZWREZWNsTG9jKCkpOwotICBQYXJzZXIgVGhlUGFyc2VyKEJ1ZmZlcklELCBTRiwgbnVsbHB0ciwgJlBhcnNlclN0YXRlKTsKKyAgUGFyc2VyIFRoZVBhcnNlcihCdWZmZXJJRCwgU0YsIG51bGxwdHIsICZQYXJzZXJTdGF0ZSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAvKkRlbGF5Qm9keVBhcnNpbmc9Ki9mYWxzZSk7CiAKICAgLy8gRGlzYWJsZSBsaWJTeW50YXggY3JlYXRpb24gaW4gdGhlIGRlbGF5ZWQgcGFyc2luZy4KICAgVGhlUGFyc2VyLlN5bnRheENvbnRleHQtPmRpc2FibGUoKTsKQEAgLTI5Miw4ICsyOTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgOiBDb21tZW50UmV0ZW50aW9uTW9kZTo6QXR0YWNoVG9OZXh0VG9rZW4sCiAgICAgICAgICAgIFRyaXZpYVJldGVudGlvbk1vZGU6OldpdGhvdXRUcml2aWEsIFRva2VuaXplSW50ZXJwb2xhdGVkU3RyaW5nLAogICAgICAgICAgICBTcGxpdFRva2VucywKLSAgICAgICAgICAgWyZdKGNvbnN0IFRva2VuICZUb2ssIGNvbnN0IFRyaXZpYSAmTGVhZGluZ1RyaXZpYSwKLSAgICAgICAgICAgICAgIGNvbnN0IFRyaXZpYSAmVHJhaWxpbmdUcml2aWEpIHsgVG9rZW5zLnB1c2hfYmFjayhUb2spOyB9KTsKKyAgICAgICAgICAgWyZdKGNvbnN0IFRva2VuICZUb2ssIGNvbnN0IFBhcnNlZFRyaXZpYSAmTGVhZGluZ1RyaXZpYSwKKyAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRyaXZpYSAmVHJhaWxpbmdUcml2aWEpIHsgVG9rZW5zLnB1c2hfYmFjayhUb2spOyB9KTsKIAogICBhc3NlcnQoVG9rZW5zLmJhY2soKS5pcyh0b2s6OmVvZikpOwogICBUb2tlbnMucG9wX2JhY2soKTsgLy8gUmVtb3ZlIEVPRi4KQEAgLTMxNCwxMiArMzE2LDIyIEBACiAgICAgICBDb21tZW50UmV0ZW50aW9uTW9kZTo6QXR0YWNoVG9OZXh0VG9rZW4sIFRyaXZpYVJldGVudGlvbk1vZGU6OldpdGhUcml2aWEsCiAgICAgICAvKlRva2VuaXplSW50ZXJwb2xhdGVkU3RyaW5nPSovZmFsc2UsCiAgICAgICAvKlNwbGl0VG9rZW5zPSovQXJyYXlSZWY8VG9rZW4+KCksCi0gICAgICBbJl0oY29uc3QgVG9rZW4gJlRvaywgY29uc3QgVHJpdmlhICZMZWFkaW5nVHJpdmlhLAotICAgICAgICAgIGNvbnN0IFRyaXZpYSAmVHJhaWxpbmdUcml2aWEpIHsKKyAgICAgIFsmXShjb25zdCBUb2tlbiAmVG9rLCBjb25zdCBQYXJzZWRUcml2aWEgJkxlYWRpbmdUcml2aWEsCisgICAgICAgICAgY29uc3QgUGFyc2VkVHJpdmlhICZUcmFpbGluZ1RyaXZpYSkgeworICAgICAgICBDaGFyU291cmNlUmFuZ2UgVG9rUmFuZ2UgPSBUb2suZ2V0UmFuZ2VXaXRob3V0QmFja3RpY2tzKCk7CisgICAgICAgIFNvdXJjZUxvYyBMZWFkaW5nVHJpdmlhTG9jID0KKyAgICAgICAgICBUb2tSYW5nZS5nZXRTdGFydCgpLmdldEFkdmFuY2VkTG9jKC1MZWFkaW5nVHJpdmlhLmdldExlbmd0aCgpKTsKKyAgICAgICAgU291cmNlTG9jIFRyYWlsaW5nVHJpdmlhTG9jID0KKyAgICAgICAgICBUb2tSYW5nZS5nZXRTdGFydCgpLmdldEFkdmFuY2VkTG9jKFRva1JhbmdlLmdldEJ5dGVMZW5ndGgoKSk7CisgICAgICAgIFRyaXZpYSBzeW50YXhMZWFkaW5nVHJpdmlhID0KKyAgICAgICAgICBMZWFkaW5nVHJpdmlhLmNvbnZlcnRUb1N5bnRheFRyaXZpYShMZWFkaW5nVHJpdmlhTG9jLCBTTSwgQnVmZmVySUQpOworICAgICAgICBUcml2aWEgc3ludGF4VHJhaWxpbmdUcml2aWEgPQorICAgICAgICAgIFRyYWlsaW5nVHJpdmlhLmNvbnZlcnRUb1N5bnRheFRyaXZpYShUcmFpbGluZ1RyaXZpYUxvYywgU00sIEJ1ZmZlcklEKTsKICAgICAgICAgYXV0byBUZXh0ID0gT3duZWRTdHJpbmc6Om1ha2VSZWZDb3VudGVkKFRvay5nZXRUZXh0KCkpOwogICAgICAgICBhdXRvIFRoaXNUb2tlbiA9Ci0gICAgICAgICAgICBSYXdTeW50YXg6Om1ha2UoVG9rLmdldEtpbmQoKSwgVGV4dCwgTGVhZGluZ1RyaXZpYS5QaWVjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdUcml2aWEuUGllY2VzLCBTb3VyY2VQcmVzZW5jZTo6UHJlc2VudCk7CisgICAgICAgICAgICBSYXdTeW50YXg6Om1ha2UoVG9rLmdldEtpbmQoKSwgVGV4dCwgc3ludGF4TGVhZGluZ1RyaXZpYS5QaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4VHJhaWxpbmdUcml2aWEuUGllY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVByZXNlbmNlOjpQcmVzZW50KTsKIAogICAgICAgICBhdXRvIFRoaXNUb2tlblBvcyA9IFRoaXNUb2tlbi0+YWNjdW11bGF0ZUFic29sdXRlUG9zaXRpb24oUnVubmluZ1Bvcyk7CiAgICAgICAgIFRva2Vucy5wdXNoX2JhY2soe1RoaXNUb2tlbiwgVGhpc1Rva2VuUG9zLmdldFZhbHVlKCl9KTsKQEAgLTMzNiwxNSArMzQ4LDE1IEBACiBQYXJzZXI6OlBhcnNlcih1bnNpZ25lZCBCdWZmZXJJRCwgU291cmNlRmlsZSAmU0YsIFNJTFBhcnNlclRVU3RhdGVCYXNlICpTSUwsCiAgICAgICAgICAgICAgICBQZXJzaXN0ZW50UGFyc2VyU3RhdGUgKlBlcnNpc3RlbnRTdGF0ZSwKICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTeW50YXhQYXJzZUFjdGlvbnM+IFNQQWN0aW9ucywKLSAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZURlbGF5ZWRQYXJzaW5nKQorICAgICAgICAgICAgICAgYm9vbCBEZWxheUJvZHlQYXJzaW5nKQogICAgIDogUGFyc2VyKEJ1ZmZlcklELCBTRiwgJlNGLmdldEFTVENvbnRleHQoKS5EaWFncywgU0lMLCBQZXJzaXN0ZW50U3RhdGUsCi0gICAgICAgICAgICAgc3RkOjptb3ZlKFNQQWN0aW9ucyksIERpc2FibGVEZWxheWVkUGFyc2luZykge30KKyAgICAgICAgICAgICBzdGQ6Om1vdmUoU1BBY3Rpb25zKSwgRGVsYXlCb2R5UGFyc2luZykge30KIAogUGFyc2VyOjpQYXJzZXIodW5zaWduZWQgQnVmZmVySUQsIFNvdXJjZUZpbGUgJlNGLCBEaWFnbm9zdGljRW5naW5lKiBMZXhlckRpYWdzLAogICAgICAgICAgICAgICAgU0lMUGFyc2VyVFVTdGF0ZUJhc2UgKlNJTCwKICAgICAgICAgICAgICAgIFBlcnNpc3RlbnRQYXJzZXJTdGF0ZSAqUGVyc2lzdGVudFN0YXRlLAogICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN5bnRheFBhcnNlQWN0aW9ucz4gU1BBY3Rpb25zLAotICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlRGVsYXllZFBhcnNpbmcpCisgICAgICAgICAgICAgICBib29sIERlbGF5Qm9keVBhcnNpbmcpCiAgICAgOiBQYXJzZXIoCiAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPExleGVyPihuZXcgTGV4ZXIoCiAgICAgICAgICAgICAgIFNGLmdldEFTVENvbnRleHQoKS5MYW5nT3B0cywgU0YuZ2V0QVNUQ29udGV4dCgpLlNvdXJjZU1nciwKQEAgLTM1OSw3ICszNzEsNyBAQAogICAgICAgICAgICAgICBTRi5zaG91bGRCdWlsZFN5bnRheFRyZWUoKQogICAgICAgICAgICAgICAgICAgPyBUcml2aWFSZXRlbnRpb25Nb2RlOjpXaXRoVHJpdmlhCiAgICAgICAgICAgICAgICAgICA6IFRyaXZpYVJldGVudGlvbk1vZGU6OldpdGhvdXRUcml2aWEpKSwKLSAgICAgICAgICBTRiwgU0lMLCBQZXJzaXN0ZW50U3RhdGUsIHN0ZDo6bW92ZShTUEFjdGlvbnMpLCBEaXNhYmxlRGVsYXllZFBhcnNpbmcpIHt9CisgICAgICAgICAgU0YsIFNJTCwgUGVyc2lzdGVudFN0YXRlLCBzdGQ6Om1vdmUoU1BBY3Rpb25zKSwgRGVsYXlCb2R5UGFyc2luZykge30KIAogbmFtZXNwYWNlIHsKIApAQCAtNDgwLDcgKzQ5Miw3IEBACiAgICAgICAgICAgICAgICBTSUxQYXJzZXJUVVN0YXRlQmFzZSAqU0lMLAogICAgICAgICAgICAgICAgUGVyc2lzdGVudFBhcnNlclN0YXRlICpQZXJzaXN0ZW50U3RhdGUsCiAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3ludGF4UGFyc2VBY3Rpb25zPiBTUEFjdGlvbnMsCi0gICAgICAgICAgICAgICBib29sIERpc2FibGVEZWxheWVkUGFyc2luZykKKyAgICAgICAgICAgICAgIGJvb2wgRGVsYXlCb2R5UGFyc2luZykKICAgOiBTb3VyY2VNZ3IoU0YuZ2V0QVNUQ29udGV4dCgpLlNvdXJjZU1nciksCiAgICAgRGlhZ3MoU0YuZ2V0QVNUQ29udGV4dCgpLkRpYWdzKSwKICAgICBTRihTRiksCkBAIC00ODgsNyArNTAwLDcgQEAKICAgICBTSUwoU0lMKSwKICAgICBDdXJEZWNsQ29udGV4dCgmU0YpLAogICAgIENvbnRleHQoU0YuZ2V0QVNUQ29udGV4dCgpKSwKLSAgICBEaXNhYmxlRGVsYXllZFBhcnNpbmcoRGlzYWJsZURlbGF5ZWRQYXJzaW5nKSwKKyAgICBEZWxheUJvZHlQYXJzaW5nKERlbGF5Qm9keVBhcnNpbmcpLAogICAgIFRva1JlY2VpdmVyKFNGLnNob3VsZENvbGxlY3RUb2tlbigpID8KICAgICAgICAgICAgICAgICBuZXcgVG9rZW5SZWNvcmRlcihTRikgOgogICAgICAgICAgICAgICAgIG5ldyBDb25zdW1lVG9rZW5SZWNlaXZlcigpKSwKQEAgLTU4MCw3ICs1OTIsNyBAQAogdm9pZCBQYXJzZXI6Om1hcmtTcGxpdFRva2VuKHRvayBLaW5kLCBTdHJpbmdSZWYgVHh0KSB7CiAgIFNwbGl0VG9rZW5zLmVtcGxhY2VfYmFjaygpOwogICBTcGxpdFRva2Vucy5iYWNrKCkuc2V0VG9rZW4oS2luZCwgVHh0KTsKLSAgVHJpdmlhIEVtcHR5VHJpdmlhOworICBQYXJzZWRUcml2aWEgRW1wdHlUcml2aWE7CiAgIFN5bnRheENvbnRleHQtPmFkZFRva2VuKFNwbGl0VG9rZW5zLmJhY2soKSwgTGVhZGluZ1RyaXZpYSwgRW1wdHlUcml2aWEpOwogICBUb2tSZWNlaXZlci0+cmVjZWl2ZShTcGxpdFRva2Vucy5iYWNrKCkpOwogfQpAQCAtNzQ2LDcgKzc1OCw3IEBACiAgIH0KICAgdW5zaWduZWQgTGV4ZXJPZmZzZXQgPQogICAgICAgU291cmNlTWdyLmdldExvY09mZnNldEluQnVmZmVyKFRvay5nZXRMb2MoKSwgTC0+Z2V0QnVmZmVySUQoKSk7Ci0gIHVuc2lnbmVkIExlYWRpbmdUcml2aWFMZW4gPSBMZWFkaW5nVHJpdmlhLmdldFRleHRMZW5ndGgoKTsKKyAgdW5zaWduZWQgTGVhZGluZ1RyaXZpYUxlbiA9IExlYWRpbmdUcml2aWEuZ2V0TGVuZ3RoKCk7CiAgIHVuc2lnbmVkIExlYWRpbmdUcml2aWFPZmZzZXQgPSBMZXhlck9mZnNldCAtIExlYWRpbmdUcml2aWFMZW47CiAgIFNvdXJjZUxvYyBMZWFkaW5nVHJpdmlhTG9jID0gVG9rLmdldExvYygpLmdldEFkdmFuY2VkTG9jKC1MZWFkaW5nVHJpdmlhTGVuKTsKICAgaWYgKGF1dG8gVGV4dExlbmd0aCA9IFN5bnRheENvbnRleHQtPmxvb2t1cE5vZGUoTGVhZGluZ1RyaXZpYU9mZnNldCwKQEAgLTEwOTUsNyArMTEwNyw4IEBACiAKICAgSW1wbC5TRi0+U3ludGF4UGFyc2luZ0NhY2hlID0gU3ludGF4Q2FjaGU7CiAgIEltcGwuVGhlUGFyc2VyLnJlc2V0KG5ldyBQYXJzZXIoQnVmZmVySUQsICpJbXBsLlNGLCAvKlNJTD0qL251bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypQZXJzaXN0ZW50U3RhdGU9Ki9udWxscHRyLCBJbXBsLlNQQWN0aW9ucykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qUGVyc2lzdGVudFN0YXRlPSovbnVsbHB0ciwgSW1wbC5TUEFjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypEZWxheUJvZHlQYXJzaW5nPSovZmFsc2UpKTsKIH0KIAogUGFyc2VyVW5pdDo6UGFyc2VyVW5pdChTb3VyY2VNYW5hZ2VyICZTTSwgU291cmNlRmlsZUtpbmQgU0ZLaW5kLCB1bnNpZ25lZCBCdWZmZXJJRCwKQEAgLTExMTIsNyArMTEyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgVHJpdmlhUmV0ZW50aW9uTW9kZTo6V2l0aG91dFRyaXZpYSwKICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsIEVuZE9mZnNldCkpOwogICBJbXBsLlRoZVBhcnNlci5yZXNldChuZXcgUGFyc2VyKHN0ZDo6bW92ZShMZXgpLCAqSW1wbC5TRiwgLypTSUw9Ki9udWxscHRyLAotICAgIC8qUGVyc2lzdGVudFN0YXRlPSovbnVsbHB0ciwgSW1wbC5TUEFjdGlvbnMpKTsKKyAgICAvKlBlcnNpc3RlbnRTdGF0ZT0qL251bGxwdHIsIEltcGwuU1BBY3Rpb25zLCAvKkRlbGF5Qm9keVBhcnNpbmc9Ki9mYWxzZSkpOwogfQogCiBQYXJzZXJVbml0Ojp+UGFyc2VyVW5pdCgpIHsKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9TeW50YXhQYXJzaW5nQ29udGV4dC5jcHAgYi9saWIvUGFyc2UvU3ludGF4UGFyc2luZ0NvbnRleHQuY3BwCmluZGV4IDlhM2E5MDguLmE3MGMzNjIgMTAwNjQ0Ci0tLSBhL2xpYi9QYXJzZS9TeW50YXhQYXJzaW5nQ29udGV4dC5jcHAKKysrIGIvbGliL1BhcnNlL1N5bnRheFBhcnNpbmdDb250ZXh0LmNwcApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1N5bnRheFBhcnNpbmdDYWNoZS5oIgogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL1Rva2VuLmgiCiAjaW5jbHVkZSAic3dpZnQvU3ludGF4L1N5bnRheEZhY3RvcnkuaCIKLSNpbmNsdWRlICJzd2lmdC9TeW50YXgvVHJpdmlhLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzd2lmdDsKIHVzaW5nIG5hbWVzcGFjZSBzd2lmdDo6c3ludGF4OwpAQCAtNjcsNyArNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFJhd1N5bnRheE5vZGU+IFBhcnRzKSB7CiAgIGFzc2VydChpc1Vua25vd25LaW5kKEtpbmQpKTsKICAgaWYgKElzQmFja3RyYWNraW5nKQotICAgIHJldHVybiBQYXJzZWRSYXdTeW50YXhOb2RlOjptYWtlRGVmZXJyZWQoS2luZCwgUGFydHMpOworICAgIHJldHVybiBQYXJzZWRSYXdTeW50YXhOb2RlOjptYWtlRGVmZXJyZWQoS2luZCwgUGFydHMsICp0aGlzKTsKICAgZWxzZQogICAgIHJldHVybiBnZXRSZWNvcmRlcigpLnJlY29yZFJhd1N5bnRheChLaW5kLCBQYXJ0cyk7CiB9CkBAIC04MSw3ICs4MCw3IEBACiAgIGF1dG8gJnJlYyA9IGdldFJlY29yZGVyKCk7CiAgIGF1dG8gZm9ybU5vZGUgPSBbJl0oU3ludGF4S2luZCBraW5kLCBBcnJheVJlZjxQYXJzZWRSYXdTeW50YXhOb2RlPiBsYXlvdXQpIHsKICAgICBpZiAobm9kZUNyZWF0ZUsgPT0gU3ludGF4Tm9kZUNyZWF0aW9uS2luZDo6RGVmZXJyZWQgfHwgSXNCYWNrdHJhY2tpbmcpIHsKLSAgICAgIHJhd05vZGUgPSBQYXJzZWRSYXdTeW50YXhOb2RlOjptYWtlRGVmZXJyZWQoa2luZCwgbGF5b3V0KTsKKyAgICAgIHJhd05vZGUgPSBQYXJzZWRSYXdTeW50YXhOb2RlOjptYWtlRGVmZXJyZWQoa2luZCwgbGF5b3V0LCAqdGhpcyk7CiAgICAgfSBlbHNlIHsKICAgICAgIHJhd05vZGUgPSByZWMucmVjb3JkUmF3U3ludGF4KGtpbmQsIGxheW91dCk7CiAgICAgfQpAQCAtMTcxLDE0ICsxNzAsMTYgQEAKIH0KIAogLy8vIEFkZCBUb2tlbiB3aXRoIFRyaXZpYSB0byB0aGUgcGFydHMuCi12b2lkIFN5bnRheFBhcnNpbmdDb250ZXh0OjphZGRUb2tlbihUb2tlbiAmVG9rLCBUcml2aWEgJkxlYWRpbmdUcml2aWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcml2aWEgJlRyYWlsaW5nVHJpdmlhKSB7Cit2b2lkIFN5bnRheFBhcnNpbmdDb250ZXh0OjphZGRUb2tlbihUb2tlbiAmVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyc2VkVHJpdmlhICZMZWFkaW5nVHJpdmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyc2VkVHJpdmlhICZUcmFpbGluZ1RyaXZpYSkgewogICBpZiAoIUVuYWJsZWQpCiAgICAgcmV0dXJuOwogCiAgIFBhcnNlZFJhd1N5bnRheE5vZGUgcmF3OwogICBpZiAoSXNCYWNrdHJhY2tpbmcpCi0gICAgcmF3ID0gUGFyc2VkUmF3U3ludGF4Tm9kZTo6bWFrZURlZmVycmVkKFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOworICAgIHJhdyA9IFBhcnNlZFJhd1N5bnRheE5vZGU6Om1ha2VEZWZlcnJlZChUb2ssIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhpcyk7CiAgIGVsc2UKICAgICByYXcgPSBnZXRSZWNvcmRlcigpLnJlY29yZFRva2VuKFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBhZGRSYXdTeW50YXgoc3RkOjptb3ZlKHJhdykpOwpAQCAtMjI5LDggKzIzMCw2IEBACiAgIGNhc2UgU3ludGF4S2luZDo6SWRlbnRpZmllckV4cHI6CiAgIGNhc2UgU3ludGF4S2luZDo6U3BlY2lhbGl6ZUV4cHI6CiAgIGNhc2UgU3ludGF4S2luZDo6TWVtYmVyQWNjZXNzRXhwcjoKLSAgY2FzZSBTeW50YXhLaW5kOjpEb3RTZWxmRXhwcjoKLSAgY2FzZSBTeW50YXhLaW5kOjpJbXBsaWNpdE1lbWJlckV4cHI6CiAgIGNhc2UgU3ludGF4S2luZDo6U2ltcGxlVHlwZUlkZW50aWZpZXI6CiAgIGNhc2UgU3ludGF4S2luZDo6TWVtYmVyVHlwZUlkZW50aWZpZXI6CiAgIGNhc2UgU3ludGF4S2luZDo6RnVuY3Rpb25DYWxsRXhwcjoKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZVNJTC9QYXJzZVNJTC5jcHAgYi9saWIvUGFyc2VTSUwvUGFyc2VTSUwuY3BwCmluZGV4IGUzMWFmYjQuLmE4ZWNiNzcgMTAwNjQ0Ci0tLSBhL2xpYi9QYXJzZVNJTC9QYXJzZVNJTC5jcHAKKysrIGIvbGliL1BhcnNlU0lML1BhcnNlU0lMLmNwcApAQCAtMTE2LDE5ICsxMTYsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVudFBhcnNlclN0YXRlICpQZXJzaXN0ZW50U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpEZWxheWVkUGFyc2VDQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGdWxsUGFyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZURlbGF5ZWRQYXJzaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVsYXlCb2R5UGFyc2luZykgewogICBhc3NlcnQoKCFGdWxsUGFyc2UgfHwgKFNGLmNhbkJlUGFyc2VkSW5GdWxsKCkgJiYgIVNJTCkpICYmCiAgICAgICAgICAiY2Fubm90IHBhcnNlIGluIGZ1bGwgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyEiKTsKIAogICBzdGQ6OnNoYXJlZF9wdHI8U3ludGF4VHJlZUNyZWF0b3I+IFNUcmVlQ3JlYXRvcjsKICAgaWYgKFNGLnNob3VsZEJ1aWxkU3ludGF4VHJlZSgpKSB7CiAgICAgU1RyZWVDcmVhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxTeW50YXhUcmVlQ3JlYXRvcj4oCi0gICAgICAgICAgICAgICAgICAgU0YuU3ludGF4UGFyc2luZ0NhY2hlLCBTRi5nZXRBU1RDb250ZXh0KCkuZ2V0U3ludGF4QXJlbmEoKSk7CisgICAgICAgIFNGLmdldEFTVENvbnRleHQoKS5Tb3VyY2VNZ3IsIEJ1ZmZlcklELAorICAgICAgICBTRi5TeW50YXhQYXJzaW5nQ2FjaGUsIFNGLmdldEFTVENvbnRleHQoKS5nZXRTeW50YXhBcmVuYSgpKTsKICAgfQogCisgIC8vIE5vdCBzdXBwb3J0ZWQgcmlnaHQgbm93LgorICBpZiAoU0YuS2luZCA9PSBTb3VyY2VGaWxlS2luZDo6UkVQTCkKKyAgICBEZWxheUJvZHlQYXJzaW5nID0gZmFsc2U7CisgIGlmIChTRi5oYXNJbnRlcmZhY2VIYXNoKCkpCisgICAgRGVsYXlCb2R5UGFyc2luZyA9IGZhbHNlOworICBpZiAoU0Yuc2hvdWxkQ29sbGVjdFRva2VuKCkpCisgICAgRGVsYXlCb2R5UGFyc2luZyA9IGZhbHNlOworICBpZiAoU0Yuc2hvdWxkQnVpbGRTeW50YXhUcmVlKCkpCisgICAgRGVsYXlCb2R5UGFyc2luZyA9IGZhbHNlOworICBpZiAoU0lMKQorICAgIERlbGF5Qm9keVBhcnNpbmcgPSBmYWxzZTsKKwogICBTaGFyZWRUaW1lciB0aW1lcigiUGFyc2luZyIpOwogICBQYXJzZXIgUChCdWZmZXJJRCwgU0YsIFNJTCA/IFNJTC0+SW1wbC5nZXQoKSA6IG51bGxwdHIsCi0gICAgICAgICAgIFBlcnNpc3RlbnRTdGF0ZSwgU1RyZWVDcmVhdG9yLCBEaXNhYmxlRGVsYXllZFBhcnNpbmcpOworICAgICAgICAgICBQZXJzaXN0ZW50U3RhdGUsIFNUcmVlQ3JlYXRvciwgRGVsYXlCb2R5UGFyc2luZyk7CiAgIFByZXR0eVN0YWNrVHJhY2VQYXJzZXIgU3RhY2tUcmFjZShQKTsKIAogICBsbHZtOjpTYXZlQW5kUmVzdG9yZTxib29sPiBTKFAuSXNQYXJzaW5nSW50ZXJmYWNlVG9rZW5zLApAQCAtMTU3LDIxICsxNzAsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lMUGFyc2VyU3RhdGUgKlNJTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVudFBhcnNlclN0YXRlICpQZXJzaXN0ZW50U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpEZWxheWVkUGFyc2VDQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlRGVsYXllZFBhcnNpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxheUJvZHlQYXJzaW5nKSB7CiAgIHJldHVybiBwYXJzZUludG9Tb3VyY2VGaWxlSW1wbChTRiwgQnVmZmVySUQsIERvbmUsIFNJTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbnRTdGF0ZSwgRGVsYXllZFBhcnNlQ0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZ1bGxQYXJzZT0qL1NGLnNob3VsZEJ1aWxkU3ludGF4VHJlZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZURlbGF5ZWRQYXJzaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5Qm9keVBhcnNpbmcpOwogfQogCiBib29sIHN3aWZ0OjpwYXJzZUludG9Tb3VyY2VGaWxlRnVsbChTb3VyY2VGaWxlICZTRiwgdW5zaWduZWQgQnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW50UGFyc2VyU3RhdGUgKlBlcnNpc3RlbnRTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRQYXJzaW5nQ2FsbGJhY2tzICpEZWxheWVkUGFyc2VDQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZURlbGF5ZWRQYXJzaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlbGF5Qm9keVBhcnNpbmcpIHsKICAgYm9vbCBEb25lID0gZmFsc2U7CiAgIHJldHVybiBwYXJzZUludG9Tb3VyY2VGaWxlSW1wbChTRiwgQnVmZmVySUQsICZEb25lLCAvKlNJTD0qL251bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW50U3RhdGUsIERlbGF5ZWRQYXJzZUNCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGdWxsUGFyc2U9Ki90cnVlLCBEaXNhYmxlRGVsYXllZFBhcnNpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGdWxsUGFyc2U9Ki90cnVlLCBEZWxheUJvZHlQYXJzaW5nKTsKIH0KIAogCkBAIC00OTIxLDEzICs0OTM0LDE2IEBACiAKICAgYXV0byBQYXJ0aWFsQXBwbHlDb252ZW50aW9uID0gUGFyYW1ldGVyQ29udmVudGlvbjo6RGlyZWN0X093bmVkOwogICBib29sIElzTm9uVGhyb3dpbmdBcHBseSA9IGZhbHNlOworICBib29sIElzTm9Fc2NhcGUgPSBmYWxzZTsKICAgU3RyaW5nUmVmIEF0dHJOYW1lOwotICAKLSAgaWYgKHBhcnNlU0lMT3B0aW9uYWwoQXR0ck5hbWUsICp0aGlzKSkgeworCisgIHdoaWxlIChwYXJzZVNJTE9wdGlvbmFsKEF0dHJOYW1lLCAqdGhpcykpIHsKICAgICBpZiAoQXR0ck5hbWUuZXF1YWxzKCJub3Rocm93IikpCiAgICAgICBJc05vblRocm93aW5nQXBwbHkgPSB0cnVlOwogICAgIGVsc2UgaWYgKEF0dHJOYW1lLmVxdWFscygiY2FsbGVlX2d1YXJhbnRlZWQiKSkKICAgICAgIFBhcnRpYWxBcHBseUNvbnZlbnRpb24gPSBQYXJhbWV0ZXJDb252ZW50aW9uOjpEaXJlY3RfR3VhcmFudGVlZDsKKyAgICBlbHNlIGlmIChBdHRyTmFtZS5lcXVhbHMoIm9uX3N0YWNrIikpCisgICAgICBJc05vRXNjYXBlID0gdHJ1ZTsKICAgICBlbHNlCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtNTA1OCw4ICs1MDc0LDEwIEBACiAgICAgfQogCiAgICAgLy8gRklYTUU6IFdoeSB0aGUgYXJiaXRyYXJ5IG9yZGVyIGRpZmZlcmVuY2UgaW4gSVJCdWlsZGVyIHR5cGUgYXJndW1lbnQ/Ci0gICAgUmVzdWx0VmFsID0gQi5jcmVhdGVQYXJ0aWFsQXBwbHkoSW5zdExvYywgRm5WYWwsIHN1YnMsIEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGlhbEFwcGx5Q29udmVudGlvbik7CisgICAgUmVzdWx0VmFsID0gQi5jcmVhdGVQYXJ0aWFsQXBwbHkoCisgICAgICAgIEluc3RMb2MsIEZuVmFsLCBzdWJzLCBBcmdzLCBQYXJ0aWFsQXBwbHlDb252ZW50aW9uLAorICAgICAgICBJc05vRXNjYXBlID8gUGFydGlhbEFwcGx5SW5zdDo6T25TdGFja0tpbmQ6Ok9uU3RhY2sKKyAgICAgICAgICAgICAgICAgICA6IFBhcnRpYWxBcHBseUluc3Q6Ok9uU3RhY2tLaW5kOjpOb3RPblN0YWNrKTsKICAgICBicmVhazsKICAgfQogICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6VHJ5QXBwbHlJbnN0OiB7CmRpZmYgLS1naXQgYS9saWIvU0lML0xvb3BJbmZvLmNwcCBiL2xpYi9TSUwvTG9vcEluZm8uY3BwCmluZGV4IDNjYjhiYzEuLjg0ZjU1ZWYgMTAwNjQ0Ci0tLSBhL2xpYi9TSUwvTG9vcEluZm8uY3BwCisrKyBiL2xpYi9TSUwvTG9vcEluZm8uY3BwCkBAIC0xMDEsNiArMTAxLDkgQEAKICAgaWYgKGlzYTxEeW5hbWljTWV0aG9kQnJhbmNoSW5zdD4oSSkpCiAgICAgcmV0dXJuIGZhbHNlOwogCisgIGlmIChhdXRvICpQQSA9IGR5bl9jYXN0PFBhcnRpYWxBcHBseUluc3Q+KEkpKQorICAgIHJldHVybiAhUEEtPmlzT25TdGFjaygpOworCiAgIGFzc2VydChJLT5pc1RyaXZpYWxseUR1cGxpY2F0YWJsZSgpICYmCiAgICAgIkNvZGUgaGVyZSBtdXN0IG1hdGNoIGlzVHJpdmlhbGx5RHVwbGljYXRhYmxlIGluIFNJTEluc3RydWN0aW9uIik7CiAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbGliL1NJTC9PcGVyYW5kT3duZXJzaGlwLmNwcCBiL2xpYi9TSUwvT3BlcmFuZE93bmVyc2hpcC5jcHAKaW5kZXggZjRjYWJiYy4uYjk2Nzg3MyAxMDA2NDQKLS0tIGEvbGliL1NJTC9PcGVyYW5kT3duZXJzaGlwLmNwcAorKysgYi9saWIvU0lML09wZXJhbmRPd25lcnNoaXAuY3BwCkBAIC03ODQsNiArNzg0LDEwIEBACiAKIE9wZXJhbmRPd25lcnNoaXBLaW5kTWFwCiBPcGVyYW5kT3duZXJzaGlwS2luZENsYXNzaWZpZXI6OnZpc2l0UGFydGlhbEFwcGx5SW5zdChQYXJ0aWFsQXBwbHlJbnN0ICppKSB7CisgIC8vIHBhcnRpYWxfYXBwbHkgW3N0YWNrXSBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiBpdHMgb3BlcmFuZHMuCisgIGlmIChpLT5pc09uU3RhY2soKSkKKyAgICByZXR1cm4gTWFwOjphbGxMaXZlKCk7CisKICAgcmV0dXJuIE1hcDo6Y29tcGF0aWJpbGl0eU1hcCgKICAgICAgICAvLyBBbGwgbm9uLXRyaXZpYWwgdHlwZXMgc2hvdWxkIGJlIGNhcHR1cmVkLgogICAgICAgIFZhbHVlT3duZXJzaGlwS2luZDo6T3duZWQsIFVzZUxpZmV0aW1lQ29uc3RyYWludDo6TXVzdEJlSW52YWxpZGF0ZWQpOwpkaWZmIC0tZ2l0IGEvbGliL1NJTC9TSUxCdWlsZGVyLmNwcCBiL2xpYi9TSUwvU0lMQnVpbGRlci5jcHAKaW5kZXggYTg0ZjczMi4uZTRhNDNiMCAxMDA2NDQKLS0tIGEvbGliL1NJTC9TSUxCdWlsZGVyLmNwcAorKysgYi9saWIvU0lML1NJTEJ1aWxkZXIuY3BwCkBAIC01Miw3ICs1Miw4IEBACiBTSUxUeXBlIFNJTEJ1aWxkZXI6OmdldFBhcnRpYWxBcHBseVJlc3VsdFR5cGUoU0lMVHlwZSBvcmlnVHksIHVuc2lnbmVkIGFyZ0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTE1vZHVsZSAmTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzdGl0dXRpb25NYXAgc3VicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJDb252ZW50aW9uIGNhbGxlZUNvbnZlbnRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJDb252ZW50aW9uIGNhbGxlZUNvbnZlbnRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGlhbEFwcGx5SW5zdDo6T25TdGFja0tpbmQgb25TdGFjaykgewogICBDYW5TSUxGdW5jdGlvblR5cGUgRlRJID0gb3JpZ1R5LmNhc3RUbzxTSUxGdW5jdGlvblR5cGU+KCk7CiAgIGlmICghc3Vicy5lbXB0eSgpKQogICAgIEZUSSA9IEZUSS0+c3Vic3RHZW5lcmljQXJncyhNLCBzdWJzKTsKQEAgLTY1LDYgKzY2LDggQEAKICAgYXV0byBleHRJbmZvID0gRlRJLT5nZXRFeHRJbmZvKCkKICAgICAud2l0aFJlcHJlc2VudGF0aW9uKFNJTEZ1bmN0aW9uVHlwZTo6UmVwcmVzZW50YXRpb246OlRoaWNrKQogICAgIC53aXRoSXNQc2V1ZG9nZW5lcmljKGZhbHNlKTsKKyAgaWYgKG9uU3RhY2spCisgICAgZXh0SW5mbyA9IGV4dEluZm8ud2l0aE5vRXNjYXBlKCk7CiAKICAgLy8gSWYgdGhlIG9yaWdpbmFsIG1ldGhvZCBoYXMgYW4gQHVub3duZWRfaW5uZXJfcG9pbnRlciByZXR1cm4sIHRoZSBwYXJ0aWFsCiAgIC8vIGFwcGxpY2F0aW9uIHRodW5rIHdpbGwgbGlmZXRpbWUtZXh0ZW5kICdzZWxmJyBmb3IgdXMsIGNvbnZlcnRpbmcgdGhlCmRpZmYgLS1naXQgYS9saWIvU0lML1NJTEZ1bmN0aW9uVHlwZS5jcHAgYi9saWIvU0lML1NJTEZ1bmN0aW9uVHlwZS5jcHAKaW5kZXggYzY1MmM5ZS4uNjBjNDFiZiAxMDA2NDQKLS0tIGEvbGliL1NJTC9TSUxGdW5jdGlvblR5cGUuY3BwCisrKyBiL2xpYi9TSUwvU0lMRnVuY3Rpb25UeXBlLmNwcApAQCAtMjY2Myw4ICsyNjYzLDEwIEBACiAgIEFueUZ1bmN0aW9uVHlwZTo6UGFyYW0gc2VsZlBhcmFtID0gZm5UeXBlLmdldFBhcmFtcygpWzBdOwogCiAgIC8vIFRoZSBmb3JtYWwgbWV0aG9kIHBhcmFtZXRlcnMuCisgIC8vIElmIHdlIGFjdHVhbGx5IHBhcnRpYWxseS1hcHBseSB0aGlzLCBhc3N1bWUgd2UnbGwgbmVlZCBhIHRoaWNrIGZ1bmN0aW9uLgogICBmblR5cGUgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oZm5UeXBlLmdldFJlc3VsdCgpKTsKLSAgYXV0byBpbm5lckV4dEluZm8gPSBmblR5cGUtPmdldEV4dEluZm8oKTsKKyAgYXV0byBpbm5lckV4dEluZm8gPQorICAgIGZuVHlwZS0+Z2V0RXh0SW5mbygpLndpdGhSZXByZXNlbnRhdGlvbihGdW5jdGlvblR5cGVSZXByZXNlbnRhdGlvbjo6U3dpZnQpOwogICBhdXRvIG1ldGhvZFBhcmFtcyA9IGZuVHlwZS0+Z2V0UGFyYW1zKCk7CiAKICAgYXV0byByZXN1bHRUeXBlID0gZm5UeXBlLmdldFJlc3VsdCgpOwpkaWZmIC0tZ2l0IGEvbGliL1NJTC9TSUxJbnN0cnVjdGlvbi5jcHAgYi9saWIvU0lML1NJTEluc3RydWN0aW9uLmNwcAppbmRleCBiZmFjMzIzLi5mYzMwNTk0IDEwMDY0NAotLS0gYS9saWIvU0lML1NJTEluc3RydWN0aW9uLmNwcAorKysgYi9saWIvU0lML1NJTEluc3RydWN0aW9uLmNwcApAQCAtMTExNyw2ICsxMTE3LDEwIEBACiAgICAgaWYgKEFSSS0+Y2FuQWxsb2NPblN0YWNrKCkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQorCisgIGlmIChhdXRvICpQQSA9IGR5bl9jYXN0PFBhcnRpYWxBcHBseUluc3Q+KHRoaXMpKQorICAgIHJldHVybiBQQS0+aXNPblN0YWNrKCk7CisKICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xMTg5LDYgKzExOTMsOSBAQAogICBpZiAoaXNhPER5bmFtaWNNZXRob2RCcmFuY2hJbnN0Pih0aGlzKSkKICAgICByZXR1cm4gZmFsc2U7CiAKKyAgaWYgKGF1dG8gKlBBID0gZHluX2Nhc3Q8UGFydGlhbEFwcGx5SW5zdD4odGhpcykpCisgICAgcmV0dXJuICFQQS0+aXNPblN0YWNrKCk7CisKICAgLy8gSWYgeW91IGFkZCBtb3JlIGNhc2VzIGhlcmUsIHlvdSBzaG91bGQgYWxzbyB1cGRhdGUgU0lMTG9vcDpjYW5EdXBsaWNhdGUuCiAKICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9saWIvU0lML1NJTEluc3RydWN0aW9ucy5jcHAgYi9saWIvU0lML1NJTEluc3RydWN0aW9ucy5jcHAKaW5kZXggMjhhYjI5MS4uMGFmZGI5NCAxMDA2NDQKLS0tIGEvbGliL1NJTC9TSUxJbnN0cnVjdGlvbnMuY3BwCisrKyBiL2xpYi9TSUwvU0lMSW5zdHJ1Y3Rpb25zLmNwcApAQCAtNTAzLDE5ICs1MDMsMTkgQEAKICAgICAvLyBQYXJ0aWFsQXBwbHlJbnN0CiAgICAgLy8gc2hvdWxkIGRlcml2ZSB0aGUgdHlwZSBvZiBpdHMgcmVzdWx0IGJ5IHBhcnRpYWxseSBhcHBseWluZyB0aGUgY2FsbGVlJ3MKICAgICAvLyB0eXBlLgotICAgIDogSW5zdHJ1Y3Rpb25CYXNlKExvYywgQ2FsbGVlLCBTdWJzdENhbGxlZVR5LCBTdWJzLAotICAgICAgICAgICAgICAgICAgICAgIEFyZ3MsIFR5cGVEZXBlbmRlbnRPcGVyYW5kcywgU3BlY2lhbGl6YXRpb25JbmZvLAotICAgICAgICAgICAgICAgICAgICAgIENsb3N1cmVUeXBlKSB7fQorICAgIDogSW5zdHJ1Y3Rpb25CYXNlKExvYywgQ2FsbGVlLCBTdWJzdENhbGxlZVR5LCBTdWJzLCBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIFR5cGVEZXBlbmRlbnRPcGVyYW5kcywgU3BlY2lhbGl6YXRpb25JbmZvLCBDbG9zdXJlVHlwZSkge30KIAogUGFydGlhbEFwcGx5SW5zdCAqUGFydGlhbEFwcGx5SW5zdDo6Y3JlYXRlKAogICAgIFNJTERlYnVnTG9jYXRpb24gTG9jLCBTSUxWYWx1ZSBDYWxsZWUsIEFycmF5UmVmPFNJTFZhbHVlPiBBcmdzLAogICAgIFN1YnN0aXR1dGlvbk1hcCBTdWJzLCBQYXJhbWV0ZXJDb252ZW50aW9uIENhbGxlZUNvbnZlbnRpb24sIFNJTEZ1bmN0aW9uICZGLAogICAgIFNJTE9wZW5lZEFyY2hldHlwZXNTdGF0ZSAmT3BlbmVkQXJjaGV0eXBlcywKLSAgICBjb25zdCBHZW5lcmljU3BlY2lhbGl6YXRpb25JbmZvcm1hdGlvbiAqU3BlY2lhbGl6YXRpb25JbmZvKSB7CisgICAgY29uc3QgR2VuZXJpY1NwZWNpYWxpemF0aW9uSW5mb3JtYXRpb24gKlNwZWNpYWxpemF0aW9uSW5mbywKKyAgICBPblN0YWNrS2luZCBvblN0YWNrKSB7CiAgIFNJTFR5cGUgU3Vic3RDYWxsZWVUeSA9CiAgICAgICBDYWxsZWUtPmdldFR5cGUoKS5zdWJzdEdlbmVyaWNBcmdzKEYuZ2V0TW9kdWxlKCksIFN1YnMpOwogICBTSUxUeXBlIENsb3N1cmVUeXBlID0gU0lMQnVpbGRlcjo6Z2V0UGFydGlhbEFwcGx5UmVzdWx0VHlwZSgKLSAgICAgIFN1YnN0Q2FsbGVlVHksIEFyZ3Muc2l6ZSgpLCBGLmdldE1vZHVsZSgpLCB7fSwgQ2FsbGVlQ29udmVudGlvbik7CisgICAgICBTdWJzdENhbGxlZVR5LCBBcmdzLnNpemUoKSwgRi5nZXRNb2R1bGUoKSwge30sIENhbGxlZUNvbnZlbnRpb24sIG9uU3RhY2spOwogCiAgIFNtYWxsVmVjdG9yPFNJTFZhbHVlLCAzMj4gVHlwZURlcGVuZGVudE9wZXJhbmRzOwogICBjb2xsZWN0VHlwZURlcGVuZGVudE9wZXJhbmRzKFR5cGVEZXBlbmRlbnRPcGVyYW5kcywgT3BlbmVkQXJjaGV0eXBlcywgRiwKZGlmZiAtLWdpdCBhL2xpYi9TSUwvU0lMUHJpbnRlci5jcHAgYi9saWIvU0lML1NJTFByaW50ZXIuY3BwCmluZGV4IDU1Mzc5MjMuLjlhYzRhNDEgMTAwNjQ0Ci0tLSBhL2xpYi9TSUwvU0lMUHJpbnRlci5jcHAKKysrIGIvbGliL1NJTC9TSUxQcmludGVyLmNwcApAQCAtMjEyLDYgKzIxMiwxMCBAQAogICAgIC8vIEZJWE1FCiAgICAgQnVmZmVyIDw8ICI8c3Vic2NyaXB0PiI7CiAgICAgcmV0dXJuOworICBjYXNlIERlY2xDb250ZXh0S2luZDo6RW51bUVsZW1lbnREZWNsOgorICAgIC8vIEZJWE1FCisgICAgQnVmZmVyIDw8ICI8ZW51bSBlbGVtZW50PiI7CisgICAgcmV0dXJuOwogICB9CiAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCBkZWNsIGNvbnRleHQiKTsKIH0KQEAgLTExMjMsNiArMTEyNyw4IEBACiAgICAgY2FzZSBQYXJhbWV0ZXJDb252ZW50aW9uOjpJbmRpcmVjdF9Jbm91dEFsaWFzYWJsZToKICAgICAgIGxsdm1fdW5yZWFjaGFibGUoInVuZXhwZWN0ZWQgY2FsbGVlIGNvbnZlbnRpb24hIik7CiAgICAgfQorICAgIGlmIChDSS0+aXNPblN0YWNrKCkpCisgICAgICAqdGhpcyA8PCAiW29uX3N0YWNrXSAiOwogICAgIHZpc2l0QXBwbHlJbnN0QmFzZShDSSk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL1NJTC9TSUxQcm9maWxlci5jcHAgYi9saWIvU0lML1NJTFByb2ZpbGVyLmNwcAppbmRleCA2NGEyZDQxLi4wNTA2ODJkIDEwMDY0NAotLS0gYS9saWIvU0lML1NJTFByb2ZpbGVyLmNwcAorKysgYi9saWIvU0lML1NJTFByb2ZpbGVyLmNwcApAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgYXNzZXJ0KCghU3RhcnRMb2MgfHwgU3RhcnRMb2MtPmlzVmFsaWQoKSkgJiYKICAgICAgICAgICAgIkV4cGVjdGVkIHN0YXJ0IGxvY2F0aW9uIHRvIGJlIHZhbGlkIik7CiAgICAgYXNzZXJ0KCghRW5kTG9jIHx8IEVuZExvYy0+aXNWYWxpZCgpKSAmJgotICAgICAgICAgICAiRXhwZWN0ZWQgc3RhcnQgbG9jYXRpb24gdG8gYmUgdmFsaWQiKTsKKyAgICAgICAgICAgIkV4cGVjdGVkIGVuZCBsb2NhdGlvbiB0byBiZSB2YWxpZCIpOwogICB9CiAKICAgU291cmNlTWFwcGluZ1JlZ2lvbihTb3VyY2VNYXBwaW5nUmVnaW9uICYmUmVnaW9uKSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS9saWIvU0lML1NJTFZlcmlmaWVyLmNwcCBiL2xpYi9TSUwvU0lMVmVyaWZpZXIuY3BwCmluZGV4IGYwYzM2YzIuLmYxZWQyNzkgMTAwNjQ0Ci0tLSBhL2xpYi9TSUwvU0lMVmVyaWZpZXIuY3BwCisrKyBiL2xpYi9TSUwvU0lMVmVyaWZpZXIuY3BwCkBAIC0yMjYwLDggKzIyNjAsMTEgQEAKIAogICB2b2lkIGNoZWNrRGVhbGxvY1N0YWNrSW5zdChEZWFsbG9jU3RhY2tJbnN0ICpESSkgewogICAgIHJlcXVpcmUoaXNhPFNJTFVuZGVmPihESS0+Z2V0T3BlcmFuZCgpKSB8fAotICAgICAgICAgICAgICAgIGlzYTxBbGxvY1N0YWNrSW5zdD4oREktPmdldE9wZXJhbmQoKSksCi0gICAgICAgICAgICAiT3BlcmFuZCBvZiBkZWFsbG9jX3N0YWNrIG11c3QgYmUgYW4gYWxsb2Nfc3RhY2siKTsKKyAgICAgICAgICAgICAgICBpc2E8QWxsb2NTdGFja0luc3Q+KERJLT5nZXRPcGVyYW5kKCkpIHx8CisgICAgICAgICAgICAgICAgKGlzYTxQYXJ0aWFsQXBwbHlJbnN0PihESS0+Z2V0T3BlcmFuZCgpKSAmJgorICAgICAgICAgICAgICAgICBjYXN0PFBhcnRpYWxBcHBseUluc3Q+KERJLT5nZXRPcGVyYW5kKCkpLT5pc09uU3RhY2soKSksCisgICAgICAgICAgICAiT3BlcmFuZCBvZiBkZWFsbG9jX3N0YWNrIG11c3QgYmUgYW4gYWxsb2Nfc3RhY2sgb3IgcGFydGlhbF9hcHBseSAiCisgICAgICAgICAgICAiW3N0YWNrXSIpOwogICB9CiAgIHZvaWQgY2hlY2tEZWFsbG9jUmVmSW5zdChEZWFsbG9jUmVmSW5zdCAqREkpIHsKICAgICByZXF1aXJlKERJLT5nZXRPcGVyYW5kKCktPmdldFR5cGUoKS5pc09iamVjdCgpLApkaWZmIC0tZ2l0IGEvbGliL1NJTC9WYWx1ZU93bmVyc2hpcC5jcHAgYi9saWIvU0lML1ZhbHVlT3duZXJzaGlwLmNwcAppbmRleCBkNDVhNjY4Li5jOWUzYzEwIDEwMDY0NAotLS0gYS9saWIvU0lML1ZhbHVlT3duZXJzaGlwLmNwcAorKysgYi9saWIvU0lML1ZhbHVlT3duZXJzaGlwLmNwcApAQCAtNzQsNyArNzQsNiBAQAogQ09OU1RBTlRfT1dORVJTSElQX0lOU1QoT3duZWQsIENvcHlCbG9ja1dpdGhvdXRFc2NhcGluZykKIENPTlNUQU5UX09XTkVSU0hJUF9JTlNUKE93bmVkLCBDb3B5VmFsdWUpCiBDT05TVEFOVF9PV05FUlNISVBfSU5TVChPd25lZCwgS2V5UGF0aCkKLUNPTlNUQU5UX09XTkVSU0hJUF9JTlNUKE93bmVkLCBQYXJ0aWFsQXBwbHkpCiBDT05TVEFOVF9PV05FUlNISVBfSU5TVChPd25lZCwgSW5pdEV4aXN0ZW50aWFsVmFsdWUpCiBDT05TVEFOVF9PV05FUlNISVBfSU5TVChPd25lZCwgR2xvYmFsVmFsdWUpIC8vIFRPRE86IGlzIHRoaXMgY29ycmVjdD8KIApAQCAtMzMwLDYgKzMyOSwxMyBAQAogICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgTG9hZE93bmVyc2hpcFF1YWxpZmllciBpbiBzd2l0Y2guIik7CiB9CiAKK1ZhbHVlT3duZXJzaGlwS2luZAorVmFsdWVPd25lcnNoaXBLaW5kQ2xhc3NpZmllcjo6dmlzaXRQYXJ0aWFsQXBwbHlJbnN0KFBhcnRpYWxBcHBseUluc3QgKlBBKSB7CisgIGlmIChQQS0+aXNPblN0YWNrKCkpCisgICAgcmV0dXJuIFZhbHVlT3duZXJzaGlwS2luZDo6QW55OworICByZXR1cm4gVmFsdWVPd25lcnNoaXBLaW5kOjpPd25lZDsKK30KKwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIC8vICAgICAgICAgICAgICAgICAgIEJ1aWx0aW4gT3duZXJzaGlwVmFsdWVLaW5kIENvbXB1dGF0aW9uCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpkaWZmIC0tZ2l0IGEvbGliL1NJTEdlbi9TSUxHZW5FeHByLmNwcCBiL2xpYi9TSUxHZW4vU0lMR2VuRXhwci5jcHAKaW5kZXggMmNjMTJkMC4uZmViNDkxNiAxMDA2NDQKLS0tIGEvbGliL1NJTEdlbi9TSUxHZW5FeHByLmNwcAorKysgYi9saWIvU0lMR2VuL1NJTEdlbkV4cHIuY3BwCkBAIC0yMjkyLDkgKzIyOTIsMTMgQEAKICAgLy8gTWFwIG91dGVyIGluaXRpYWxpemF0aW9ucyBpbnRvIGEgdHVwbGUgb2YgaW5uZXIgaW5pdGlhbGl6YXRpb25zOgogICAvLyAgIC0gZmlsbCBvdXQgdGhlIGluaXRpYWxpemF0aW9uIGVsZW1lbnRzIHdpdGggbnVsbAogICBUdXBsZUluaXRpYWxpemF0aW9uIGlubmVyVHVwbGVJbml0OwotICBDYW5UdXBsZVR5cGUgaW5uZXJUdXBsZSA9Ci0gICAgY2FzdDxUdXBsZVR5cGU+KEUtPmdldFN1YkV4cHIoKS0+Z2V0VHlwZSgpLT5nZXRDYW5vbmljYWxUeXBlKCkpOwotICBpbm5lclR1cGxlSW5pdC5TdWJJbml0aWFsaXphdGlvbnMucmVzaXplKGlubmVyVHVwbGUtPmdldE51bUVsZW1lbnRzKCkpOworICBpZiAoRS0+aXNTb3VyY2VTY2FsYXIoKSkgeworICAgIGlubmVyVHVwbGVJbml0LlN1YkluaXRpYWxpemF0aW9ucy5wdXNoX2JhY2sobnVsbHB0cik7CisgIH0gZWxzZSB7CisgICAgQ2FuVHVwbGVUeXBlIGlubmVyVHVwbGUgPQorICAgICAgY2FzdDxUdXBsZVR5cGU+KEUtPmdldFN1YkV4cHIoKS0+Z2V0VHlwZSgpLT5nZXRDYW5vbmljYWxUeXBlKCkpOworICAgIGlubmVyVHVwbGVJbml0LlN1YkluaXRpYWxpemF0aW9ucy5yZXNpemUoaW5uZXJUdXBsZS0+Z2V0TnVtRWxlbWVudHMoKSk7CisgIH0KIAogICAvLyBNYXAgYWxsIHRoZSBvdXRlciBpbml0aWFsaXphdGlvbnMgdG8gdGhlaXIgYXBwcm9wcmlhdGUgdGFyZ2V0cy4KICAgZm9yICh1bnNpZ25lZCBvdXRlckluZGV4ID0gMDsgb3V0ZXJJbmRleCAhPSBvdXRlckluaXRzLnNpemUoKTsgb3V0ZXJJbmRleCsrKSB7CkBAIC0yMzEyLDE0ICsyMzE2LDIwIEBACiAjZW5kaWYKIAogICAvLyBFbWl0IHRoZSBzdWItZXhwcmVzc2lvbiBpbnRvIHRoZSB0dXBsZSBpbml0aWFsaXphdGlvbiB3ZSBqdXN0IGJ1aWx0LgotICBlbWl0dGVyLlNHRi5lbWl0RXhwckludG8oRS0+Z2V0U3ViRXhwcigpLCAmaW5uZXJUdXBsZUluaXQpOworICBpZiAoRS0+aXNTb3VyY2VTY2FsYXIoKSkgeworICAgIGVtaXR0ZXIuU0dGLmVtaXRFeHBySW50byhFLT5nZXRTdWJFeHByKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHVwbGVJbml0LlN1YkluaXRpYWxpemF0aW9uc1swXS5nZXQoKSk7CisgIH0gZWxzZSB7CisgICAgZW1pdHRlci5TR0YuZW1pdEV4cHJJbnRvKEUtPmdldFN1YkV4cHIoKSwgJmlubmVyVHVwbGVJbml0KTsKKyAgfQogCiAgIG91dGVyVHVwbGVJbml0LT5maW5pc2hJbml0aWFsaXphdGlvbihlbWl0dGVyLlNHRik7CiB9CiAKIFJWYWx1ZSBSVmFsdWVFbWl0dGVyOjp2aXNpdFR1cGxlU2h1ZmZsZUV4cHIoVHVwbGVTaHVmZmxlRXhwciAqRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0dGQ29udGV4dCBDKSB7Ci0gIGFzc2VydCghRS0+aXNTb3VyY2VTY2FsYXIoKSk7CisgIC8vIEZJWE1FOiBPbmNlIHdlJ3JlIG5vIGxvbmdlciB1c2luZyB0aGlzIGNvZGUgcGF0aCBmb3IgZW51bSBlbGVtZW50IHBheWxvYWRzLAorICAvLyBhbHNvIGFzc2VydCB0aGF0ICFFLT5pc1NvdXJjZVNjYWxhcigpLgogICBhc3NlcnQoIUUtPmlzUmVzdWx0U2NhbGFyKCkpOwogCiAgIC8vIElmIHdlJ3JlIGVtaXR0aW5nIGludG8gYW4gaW5pdGlhbGl6YXRpb24sIHdlIGNhbiB0cnkgc2h1ZmZsaW5nIHRoZQpAQCAtMjMzMyw3ICsyMzQzLDExIEBACiAKICAgLy8gRW1pdCB0aGUgc3ViLWV4cHJlc3Npb24gdHVwbGUgYW5kIGRlc3RydWN0dXJlIGl0IGludG8gZWxlbWVudHMuCiAgIFNtYWxsVmVjdG9yPFJWYWx1ZSwgND4gZWxlbWVudHM7Ci0gIHZpc2l0KEUtPmdldFN1YkV4cHIoKSkuZXh0cmFjdEVsZW1lbnRzKGVsZW1lbnRzKTsKKyAgaWYgKEUtPmlzU291cmNlU2NhbGFyKCkpIHsKKyAgICBlbGVtZW50cy5wdXNoX2JhY2sodmlzaXQoRS0+Z2V0U3ViRXhwcigpKSk7CisgIH0gZWxzZSB7CisgICAgdmlzaXQoRS0+Z2V0U3ViRXhwcigpKS5leHRyYWN0RWxlbWVudHMoZWxlbWVudHMpOworICB9CiAgIAogICAvLyBQcmVwYXJlIGEgbmV3IHR1cGxlIHRvIGhvbGQgdGhlIHNodWZmbGVkIHJlc3VsdC4KICAgUlZhbHVlIHJlc3VsdChFLT5nZXRUeXBlKCktPmdldENhbm9uaWNhbFR5cGUoKSk7CmRpZmYgLS1naXQgYS9saWIvU0lMR2VuL1NJTEdlbkZ1bmN0aW9uLmggYi9saWIvU0lMR2VuL1NJTEdlbkZ1bmN0aW9uLmgKaW5kZXggZjUyNDA2OS4uYzRjMzJiZCAxMDA2NDQKLS0tIGEvbGliL1NJTEdlbi9TSUxHZW5GdW5jdGlvbi5oCisrKyBiL2xpYi9TSUxHZW4vU0lMR2VuRnVuY3Rpb24uaApAQCAtNjY4LDEyICs2NjgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbkFueUZ1bmN0aW9uVHlwZSBibG9ja1R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblNJTEZ1bmN0aW9uVHlwZSBsb3dlcmVkQmxvY2tUeSk7CiAKLSAgLy8vIEdpdmVuIGEgbm9uLWNhbm9uaWNhbCBmdW5jdGlvbiB0eXBlLCBjcmVhdGUgYSB0aHVuayBmb3IgdGhlIGZ1bmN0aW9uJ3MKLSAgLy8vIGNhbm9uaWNhbCB0eXBlLgotICBNYW5hZ2VkVmFsdWUgZW1pdENhbm9uaWNhbEZ1bmN0aW9uVGh1bmsoU0lMTG9jYXRpb24gbG9jLCBNYW5hZ2VkVmFsdWUgZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5TSUxGdW5jdGlvblR5cGUgbm9uQ2Fub25pY2FsVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5TSUxGdW5jdGlvblR5cGUgY2Fub25pY2FsVHkpOwotCiAgIC8vLyBUaHVuayB3aXRoIHRoZSBzaWduYXR1cmUgb2YgYSBiYXNlIGNsYXNzIG1ldGhvZCBjYWxsaW5nIGEgZGVyaXZlZCBjbGFzcwogICAvLy8gbWV0aG9kLgogICAvLy8KZGlmZiAtLWdpdCBhL2xpYi9TSUxHZW4vU0lMR2VuUG9seS5jcHAgYi9saWIvU0lMR2VuL1NJTEdlblBvbHkuY3BwCmluZGV4IDlkMTMxMTUuLmE4OTkxYWYgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxHZW4vU0lMR2VuUG9seS5jcHAKKysrIGIvbGliL1NJTEdlbi9TSUxHZW5Qb2x5LmNwcApAQCAtMTU5NSw3ICsxNTk1LDcgQEAKICAgICBhdXRvICZhcmcgPSBtYW5hZ2VkQXJnc1tpbmRleF07CiAgICAgYXV0byBhcmdUeSA9IGFyZ1R5cGVzW2luZGV4XTsKICAgICBpZiAoYXJnVHkuaXNDb25zdW1lZCgpKSB7Ci0gICAgICBmb3J3YXJkZWRBcmdzLnB1c2hfYmFjayhhcmcuZm9yd2FyZChTR0YpKTsKKyAgICAgIGZvcndhcmRlZEFyZ3MucHVzaF9iYWNrKGFyZy5lbnN1cmVQbHVzT25lKFNHRiwgbG9jKS5mb3J3YXJkKFNHRikpOwogICAgICAgY29udGludWU7CiAgICAgfQogCkBAIC0zOTA2LDE1MCArMzkwNiwzIEBACiAgIHNjb3BlLnBvcCgpOwogICBCLmNyZWF0ZVJldHVybihsb2MsIHJlcXRSZXN1bHRWYWx1ZSk7CiB9Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyBDb252ZXJzaW9uIHRvIENhbm9uaWNhbCBTSUxGdW5jdGlvblR5cGUgVGh1bmtzCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1zdGF0aWMgdm9pZCB0cmFuc2xhdGVQYXJhbWV0ZXJzRm9yQ2Fub25pY2FsRnVuY3Rpb25UaHVuaygKLSAgICBTSUxHZW5GdW5jdGlvbiAmU0dGLCBTSUxMb2NhdGlvbiBsb2MsCi0gICAgQXJyYXlSZWY8TWFuYWdlZFZhbHVlPiBvcmlnUGFyYW1WYWx1ZXMsCi0gICAgQXJyYXlSZWY8U0lMUGFyYW1ldGVySW5mbz4gbmV3UGFyYW1JbmZvcywKLSAgICBTbWFsbFZlY3RvckltcGw8TWFuYWdlZFZhbHVlPiAmbmV3UGFyYW1zKSB7Ci0gIGFzc2VydChvcmlnUGFyYW1WYWx1ZXMuc2l6ZSgpID09IG5ld1BhcmFtSW5mb3Muc2l6ZSgpKTsKLQotICBmb3IgKGF1dG8gVCA6IGxsdm06OnppcChvcmlnUGFyYW1WYWx1ZXMsIG5ld1BhcmFtSW5mb3MpKSB7Ci0gICAgTWFuYWdlZFZhbHVlIG9yaWdQYXJhbTsKLSAgICBTSUxQYXJhbWV0ZXJJbmZvIG5ld1BhcmFtSW5mbzsKLSAgICBzdGQ6OnRpZShvcmlnUGFyYW0sIG5ld1BhcmFtSW5mbykgPSBUOwotCi0gICAgaWYgKG9yaWdQYXJhbS5nZXRUeXBlKCkuaXNUcml2aWFsKFNHRi5nZXRNb2R1bGUoKSkpIHsKLSAgICAgIG5ld1BhcmFtcy5lbXBsYWNlX2JhY2sob3JpZ1BhcmFtKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmIChvcmlnUGFyYW0uaGFzQ2xlYW51cCgpKSB7Ci0gICAgICAvLyBJZiB3ZSBoYXZlIGEgKzEgdmFsdWUgYW5kIHRoZSBub24tY2Fub25pY2FsIGZ1bmN0aW9uIGV4cGVjdHMgYQotICAgICAgLy8gZ3VhcmFudGVlZCBwYXJhbWV0ZXIsIGJvcnJvdyB0aGUgcGFyYW1ldGVyLiBPdGhlcndpc2UganVzdCBwYXNzIG9mZiB0aGUKLSAgICAgIC8vICsxIHZhbHVlLgotICAgICAgaWYgKG5ld1BhcmFtSW5mby5pc0d1YXJhbnRlZWQoKSkgewotICAgICAgICBvcmlnUGFyYW0gPSBvcmlnUGFyYW0uYm9ycm93KFNHRiwgbG9jKTsKLSAgICAgIH0KLSAgICAgIG5ld1BhcmFtcy5lbXBsYWNlX2JhY2sob3JpZ1BhcmFtKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSwgaWYgd2UgaGF2ZSBhICswIHZhbHVlIGFuZCB3ZSB3YW50IHRvIHBhc3MgaXQgb2ZmIGFzIGEgKzEKLSAgICAvLyB2YWx1ZSwgcGVyZm9ybSB0aGUgY29weS4KLSAgICBpZiAobmV3UGFyYW1JbmZvLmlzQ29uc3VtZWQoKSkgewotICAgICAgb3JpZ1BhcmFtID0gb3JpZ1BhcmFtLmNvcHkoU0dGLCBsb2MpOwotICAgIH0KLSAgICBuZXdQYXJhbXMuZW1wbGFjZV9iYWNrKG9yaWdQYXJhbSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnVpbGRDYW5vbmljYWxGdW5jdGlvblRodW5rQm9keShTSUxHZW5GdW5jdGlvbiAmU0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSUxMb2NhdGlvbiBsb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblNJTEZ1bmN0aW9uVHlwZSBub25DYW5vbmljYWxUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuU0lMRnVuY3Rpb25UeXBlIGNhbm9uaWNhbFR5KSB7Ci0gIFNHRi5GLnNldEJhcmUoSXNCYXJlKTsKLSAgU0dGLkYuc2V0VGh1bmsoSXNUaHVuayk7Ci0KLSAgRnVsbEV4cHIgc2NvcGUoU0dGLkNsZWFudXBzLCBDbGVhbnVwTG9jYXRpb246OmdldChsb2MpKTsKLSAgRm9ybWFsRXZhbHVhdGlvblNjb3BlIGZvcm1hbEV2YWxTY29wZShTR0YpOwotCi0gIC8vIENvbGxlY3QgdGhlIHRodW5rIHBhcmFtcywgY3JlYXRpbmcgYXJndW1lbnRzIGZvciBlYWNoIHBhcmFtZXRlci4KLSAgU21hbGxWZWN0b3I8TWFuYWdlZFZhbHVlLCA4PiBvcmlnUGFyYW1zOwotICBTR0YuY29sbGVjdFRodW5rUGFyYW1zKGxvYywgb3JpZ1BhcmFtcyk7Ci0KLSAgLy8gVGhlbiB0cmFuc2xhdGUgb3VyIHBhcmFtZXRlcnMgaW50byBuZXcgcGFyYW1zLgotICBTbWFsbFZlY3RvcjxNYW5hZ2VkVmFsdWUsIDg+IG5ld1BhcmFtczsKLSAgdHJhbnNsYXRlUGFyYW1ldGVyc0ZvckNhbm9uaWNhbEZ1bmN0aW9uVGh1bmsoCi0gICAgICBTR0YsIGxvYywKLSAgICAgIC8vIFdlIGRyb3AgdGhlIGZyb250IHNvIHdlIGRvbid0IHByb2Nlc3MgdGhlIHRodW5rZWQgZnVuY3Rpb24gaGVyZS4gV2UKLSAgICAgIC8vIGhhbmRsZSB0aGF0IGxhdGVyLgotICAgICAgbGx2bTo6bWFrZUFycmF5UmVmKG9yaWdQYXJhbXMpLmRyb3BfYmFjaygxKSwKLSAgICAgIG5vbkNhbm9uaWNhbFR5LT5nZXRQYXJhbWV0ZXJzKCksIG5ld1BhcmFtcyk7Ci0KLSAgLy8gVGhlbiBncmFiIHRoZSBmdW5jdGlvbiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCBmcm9tIHRoZSBsYXN0IHBhcmFtZXRlci4KLSAgTWFuYWdlZFZhbHVlIGZuID0gb3JpZ1BhcmFtcy5iYWNrKCk7Ci0KLSAgLy8gQ29sbGVjdCB0aGUgYXJndW1lbnRzLgotICBTbWFsbFZlY3RvcjxTSUxWYWx1ZSwgOD4gYXJnczsKLQotICAvLyBBZGQgYWxsIG9mIHRoZSBpbmRpcmVjdCByZXN1bHRzLiBXZSBjYW4ganVzdCBhZGQgdGhlIFNJTFZhbHVlcyBkaXJlY3RseSB0bwotICAvLyB0aGUgYXJncyBhcnJheSBzaW5jZSB3ZSBkbyBub3QgbmVlZCB0byBwZXJmb3JtIGFueSB0cmFuc2Zvcm1hdGlvbnMgdXBvbgotICAvLyB0aGVtIGJlY2F1c2U6Ci0gIC8vCi0gIC8vIDEuIFJlYWJzdHJhY3Rpb24gY2FuIG5vdCBvY2N1ciBhcyBhIHJlc3VsdCBvZiBhIGNhbm9uaWNhbC9ub24tY2Fub25pY2FsCi0gIC8vIG1pc21hdGNoLgotICAvLyAyLiBTSUxHZW5GdW5jdGlvbjo6Y29sbGVjdFRodW5rUGFyYW1zKC4uLikgZG9lcyBub3QgY3JlYXRlIGNsZWFudXBzIHdoZW4gaXQKLSAgLy8gY3JlYXRlcyBhcmd1bWVudHMuCi0gIFNJTEZ1bmN0aW9uQ29udmVudGlvbnMgZm5Db252KGNhbm9uaWNhbFR5LCBTR0YuU0dNLk0pOwotICB0cmFuc2Zvcm0ocmFuZ2UoZm5Db252LmdldE51bUluZGlyZWN0U0lMUmVzdWx0cygpKSwgc3RkOjpiYWNrX2luc2VydGVyKGFyZ3MpLAotICAgICAgICAgICAgWyZdKHVuc2lnbmVkIEluZGV4KSAtPiBTSUxWYWx1ZSB7Ci0gICAgICAgICAgICAgIHJldHVybiBTR0YuRi5iZWdpbigpLT5nZXRBcmd1bWVudChJbmRleCk7Ci0gICAgICAgICAgICB9KTsKLQotICAvLyBhbmQgdGhlbiB0aGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzIGJlc2lkZXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBIZXJlIHdlIGhhdmUKLSAgLy8gdG8gZm9yd2FyZCB0aGUgYXJndW1lbnRzIHNpbmNlIGNvbGxlY3RUaHVua1BhcmFtcyAvZG9lcy8gY3JlYXRlIGNsZWFudXBzCi0gIC8vIGZvciB0aGUgcGFyYW1ldGVycy4KLSAgZm9yd2FyZEZ1bmN0aW9uQXJndW1lbnRzKFNHRiwgbG9jLCBub25DYW5vbmljYWxUeSwgbmV3UGFyYW1zLCBhcmdzKTsKLQotICAvLyBQZXJmb3JtIHRoZSBjYWxsLgotICBTSUxWYWx1ZSByZXN1bHQgPQotICAgICAgU0dGLmVtaXRBcHBseVdpdGhSZXRocm93KGxvYywgZm4uZm9yd2FyZChTR0YpLCBmbi5nZXRUeXBlKCksIHt9LCBhcmdzKTsKLQotICBmb3JtYWxFdmFsU2NvcGUucG9wKCk7Ci0gIHNjb3BlLnBvcCgpOwotICBTR0YuQi5jcmVhdGVSZXR1cm4obG9jLCByZXN1bHQpOwotfQotCi1NYW5hZ2VkVmFsdWUKLVNJTEdlbkZ1bmN0aW9uOjplbWl0Q2Fub25pY2FsRnVuY3Rpb25UaHVuayhTSUxMb2NhdGlvbiBsb2MsIE1hbmFnZWRWYWx1ZSBmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5TSUxGdW5jdGlvblR5cGUgbm9uQ2Fub25pY2FsVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuU0lMRnVuY3Rpb25UeXBlIGNhbm9uaWNhbFR5KSB7Ci0gIGNhbm9uaWNhbFR5ID0gY2Fub25pY2FsVHktPmdldFdpdGhSZXByZXNlbnRhdGlvbigKLSAgICAgIFNJTEZ1bmN0aW9uVHlwZTo6UmVwcmVzZW50YXRpb246OlRoaWNrKTsKLQotICBTdWJzdGl0dXRpb25NYXAgY29udGV4dFN1YnMsIGludGVyZmFjZVN1YnM7Ci0gIEdlbmVyaWNFbnZpcm9ubWVudCAqZ2VuZXJpY0VudiA9IG51bGxwdHI7Ci0KLSAgLy8gVGhlc2UgdHdvIGFyZSBub3QgdXNlZCBoZXJlIC0tIGJ1dCByZWFsbHksIGJyaWRnaW5nIHRodW5rcwotICAvLyBzaG91bGQgYmUgZW1pdHRlZCB1c2luZyB0aGUgZm9ybWFsIEFTVCB0eXBlLCBub3QgdGhlIGxvd2VyZWQKLSAgLy8gdHlwZQotICBDYW5UeXBlIGlucHV0U3Vic3RUeXBlOwotICBDYW5UeXBlIG91dHB1dFN1YnN0VHlwZTsKLSAgQ2FuVHlwZSBkeW5hbWljU2VsZlR5cGU7Ci0gIGF1dG8gdGh1bmtUeSA9IGJ1aWxkVGh1bmtUeXBlKG5vbkNhbm9uaWNhbFR5LCBjYW5vbmljYWxUeSwgaW5wdXRTdWJzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN1YnN0VHlwZSwgZ2VuZXJpY0VudiwgaW50ZXJmYWNlU3VicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NlbGZUeXBlKTsKLSAgYXNzZXJ0KCFkeW5hbWljU2VsZlR5cGUgJiYgIm5vdCBpbXBsZW1lbnRlZCIpOwotICBhdXRvIHRodW5rID0gU0dNLmdldE9yQ3JlYXRlUmVhYnN0cmFjdGlvblRodW5rKHRodW5rVHksIG5vbkNhbm9uaWNhbFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbFR5LCBGLmlzU2VyaWFsaXplZCgpKTsKLSAgaWYgKHRodW5rLT5lbXB0eSgpKSB7Ci0gICAgdGh1bmstPnNldEdlbmVyaWNFbnZpcm9ubWVudChnZW5lcmljRW52KTsKLSAgICBTSUxHZW5GdW5jdGlvbiB0aHVua1NHRihTR00sICp0aHVuaywgRnVuY3Rpb25EQyk7Ci0gICAgYXV0byBsb2MgPSBSZWd1bGFyTG9jYXRpb246OmdldEF1dG9HZW5lcmF0ZWRMb2NhdGlvbigpOwotICAgIGJ1aWxkQ2Fub25pY2FsRnVuY3Rpb25UaHVua0JvZHkodGh1bmtTR0YsIGxvYywgbm9uQ2Fub25pY2FsVHksIGNhbm9uaWNhbFR5KTsKLSAgfQotCi0gIENhblNJTEZ1bmN0aW9uVHlwZSBzdWJzdEZuVHkgPSB0aHVua1R5OwotCi0gIGlmICh0aHVua1R5LT5nZXRHZW5lcmljU2lnbmF0dXJlKCkpIHsKLSAgICBzdWJzdEZuVHkgPSB0aHVua1R5LT5zdWJzdEdlbmVyaWNBcmdzKEYuZ2V0TW9kdWxlKCksIGludGVyZmFjZVN1YnMpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGl0IGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgotICBhdXRvIHRodW5rVmFsdWUgPSBCLmNyZWF0ZUZ1bmN0aW9uUmVmRm9yKGxvYywgdGh1bmspOwotICBNYW5hZ2VkVmFsdWUgdGh1bmtlZEZuID0gQi5jcmVhdGVQYXJ0aWFsQXBwbHkoCi0gICAgICBsb2MsIHRodW5rVmFsdWUsIFNJTFR5cGU6OmdldFByaW1pdGl2ZU9iamVjdFR5cGUoc3Vic3RGblR5KSwKLSAgICAgIGludGVyZmFjZVN1YnMsIHtmbn0sCi0gICAgICBTSUxUeXBlOjpnZXRQcmltaXRpdmVPYmplY3RUeXBlKGNhbm9uaWNhbFR5KSk7Ci0gIGlmIChjYW5vbmljYWxUeS0+aXNOb0VzY2FwZSgpKSB7Ci0gICAgYXV0byAmZnVuY1RMID0gZ2V0VHlwZUxvd2VyaW5nKGNhbm9uaWNhbFR5KTsKLSAgICB0aHVua2VkRm4gPQotICAgICAgICBCLmNyZWF0ZUNvbnZlcnRGdW5jdGlvbihsb2MsIHRodW5rZWRGbiwgZnVuY1RMLmdldExvd2VyZWRUeXBlKCkpOwotICB9Ci0gIHJldHVybiB0aHVua2VkRm47Ci19CmRpZmYgLS1naXQgYS9saWIvU0lMR2VuL1NJTEdlblRodW5rLmNwcCBiL2xpYi9TSUxHZW4vU0lMR2VuVGh1bmsuY3BwCmluZGV4IGJhYWE4NTYuLmEwMDhiMmQgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxHZW4vU0lMR2VuVGh1bmsuY3BwCisrKyBiL2xpYi9TSUxHZW4vU0lMR2VuVGh1bmsuY3BwCkBAIC04NiwzOCArODYsNDEgQEAKICAgcmV0dXJuIE1hbmFnZWRWYWx1ZTo6Zm9yVW5tYW5hZ2VkKEIuY3JlYXRlRnVuY3Rpb25SZWZGb3IobG9jLCBGKSk7CiB9CiAKLXN0YXRpYyBNYW5hZ2VkVmFsdWUgZ2V0TmV4dFVuY3VycnlMZXZlbFJlZihTSUxHZW5GdW5jdGlvbiAmU0dGLCBTSUxMb2NhdGlvbiBsb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lMRGVjbFJlZiB0aHVuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5hZ2VkVmFsdWUgc2VsZkFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzdGl0dXRpb25NYXAgY3VycmllZFN1YnMpIHsKK3N0YXRpYyBzdGQ6OnBhaXI8TWFuYWdlZFZhbHVlLCBTSUxEZWNsUmVmPgorZ2V0TmV4dFVuY3VycnlMZXZlbFJlZihTSUxHZW5GdW5jdGlvbiAmU0dGLCBTSUxMb2NhdGlvbiBsb2MsIFNJTERlY2xSZWYgdGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZWRWYWx1ZSBzZWxmQXJnLCBTdWJzdGl0dXRpb25NYXAgY3VycmllZFN1YnMpIHsKICAgYXV0byAqdmQgPSB0aHVuay5nZXREZWNsKCk7CiAKICAgLy8gUmVmZXJlbmNlIHRoZSBuZXh0IHVuY3VycnlpbmcgbGV2ZWwgb2YgdGhlIGZ1bmN0aW9uLgogICBTSUxEZWNsUmVmIG5leHQgPSBTSUxEZWNsUmVmKHZkLCB0aHVuay5raW5kKTsKICAgYXNzZXJ0KCFuZXh0LmlzQ3VycmllZCk7CiAKKyAgYXV0byBjb25zdGFudEluZm8gPSBTR0YuU0dNLlR5cGVzLmdldENvbnN0YW50SW5mbyhuZXh0KTsKKwogICAvLyBJZiB0aGUgZnVuY3Rpb24gaXMgbmF0aXZlbHkgZm9yZWlnbiwgcmVmZXJlbmNlIGl0cyBmb3JlaWduIGVudHJ5IHBvaW50LgogICBpZiAocmVxdWlyZXNGb3JlaWduVG9OYXRpdmVUaHVuayh2ZCkpCi0gICAgcmV0dXJuIE1hbmFnZWRWYWx1ZTo6Zm9yVW5tYW5hZ2VkKFNHRi5lbWl0R2xvYmFsRnVuY3Rpb25SZWYobG9jLCBuZXh0KSk7CisgICAgcmV0dXJuIHtNYW5hZ2VkVmFsdWU6OmZvclVubWFuYWdlZChTR0YuZW1pdEdsb2JhbEZ1bmN0aW9uUmVmKGxvYywgbmV4dCkpLAorICAgICAgICAgICAgbmV4dH07CiAKICAgLy8gSWYgdGhlIHRodW5rIGlzIGEgY3VycnkgdGh1bmsgZm9yIGEgZGlyZWN0IG1ldGhvZCByZWZlcmVuY2UsIHdlIGFyZQogICAvLyBkb2luZyBhIGRpcmVjdCBkaXNwYXRjaCAoZWcsIGEgZnJhZ2lsZSAnc3VwZXIuZm9vKCknIGNhbGwpLgogICBpZiAodGh1bmsuaXNEaXJlY3RSZWZlcmVuY2UpCi0gICAgcmV0dXJuIE1hbmFnZWRWYWx1ZTo6Zm9yVW5tYW5hZ2VkKFNHRi5lbWl0R2xvYmFsRnVuY3Rpb25SZWYobG9jLCBuZXh0KSk7Ci0KLSAgYXV0byBjb25zdGFudEluZm8gPSBTR0YuU0dNLlR5cGVzLmdldENvbnN0YW50SW5mbyhuZXh0KTsKKyAgICByZXR1cm4ge01hbmFnZWRWYWx1ZTo6Zm9yVW5tYW5hZ2VkKFNHRi5lbWl0R2xvYmFsRnVuY3Rpb25SZWYobG9jLCBuZXh0KSksCisgICAgICAgICAgICBuZXh0fTsKIAogICBpZiAoYXV0byAqZnVuYyA9IGR5bl9jYXN0PEFic3RyYWN0RnVuY3Rpb25EZWNsPih2ZCkpIHsKICAgICBpZiAoZ2V0TWV0aG9kRGlzcGF0Y2goZnVuYykgPT0gTWV0aG9kRGlzcGF0Y2g6OkNsYXNzKSB7CiAgICAgICAvLyBVc2UgdGhlIGR5bmFtaWMgdGh1bmsgaWYgZHluYW1pYy4KICAgICAgIGlmICh2ZC0+aXNPYmpDRHluYW1pYygpKSB7Ci0gICAgICAgIHJldHVybiBTR0YuZW1pdER5bmFtaWNNZXRob2RSZWYobG9jLCBuZXh0LCBjb25zdGFudEluZm8uU0lMRm5UeXBlKTsKKyAgICAgICAgcmV0dXJuIHtTR0YuZW1pdER5bmFtaWNNZXRob2RSZWYobG9jLCBuZXh0LCBjb25zdGFudEluZm8uU0lMRm5UeXBlKSwKKyAgICAgICAgICAgICAgICBuZXh0fTsKICAgICAgIH0KIAogICAgICAgYXV0byBtZXRob2RUeSA9IFNHRi5TR00uVHlwZXMuZ2V0Q29uc3RhbnRPdmVycmlkZVR5cGUobmV4dCk7CiAgICAgICBTSUxWYWx1ZSByZXN1bHQgPQogICAgICAgICAgIFNHRi5lbWl0Q2xhc3NNZXRob2RSZWYobG9jLCBzZWxmQXJnLmdldFZhbHVlKCksIG5leHQsIG1ldGhvZFR5KTsKLSAgICAgIHJldHVybiBNYW5hZ2VkVmFsdWU6OmZvclVubWFuYWdlZChyZXN1bHQpOworICAgICAgcmV0dXJuIHtNYW5hZ2VkVmFsdWU6OmZvclVubWFuYWdlZChyZXN1bHQpLAorICAgICAgICAgICAgICBuZXh0LmdldE92ZXJyaWRkZW5WVGFibGVFbnRyeSgpfTsKICAgICB9CiAKICAgICAvLyBJZiB0aGUgZnVsbHktdW5jdXJyaWVkIHJlZmVyZW5jZSBpcyB0byBhIGdlbmVyaWMgbWV0aG9kLCBsb29rIHVwIHRoZQpAQCAtMTMwLDEyICsxMzMsMTMgQEAKICAgICAgIGF1dG8gY29uZm9ybWFuY2UgPSBjdXJyaWVkU3Vicy5sb29rdXBDb25mb3JtYW5jZShvcmlnU2VsZlR5cGUsIHByb3RvY29sKTsKICAgICAgIGF1dG8gcmVzdWx0ID0gU0dGLkIuY3JlYXRlV2l0bmVzc01ldGhvZChsb2MsIHN1YnN0U2VsZlR5cGUsICpjb25mb3JtYW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LCBjb25zdGFudEluZm8uZ2V0U0lMVHlwZSgpKTsKLSAgICAgIHJldHVybiBNYW5hZ2VkVmFsdWU6OmZvclVubWFuYWdlZChyZXN1bHQpOworICAgICAgcmV0dXJuIHtNYW5hZ2VkVmFsdWU6OmZvclVubWFuYWdlZChyZXN1bHQpLCBuZXh0fTsKICAgICB9CiAgIH0KIAogICAvLyBPdGhlcndpc2UsIGVtaXQgYSBkaXJlY3QgY2FsbC4KLSAgcmV0dXJuIE1hbmFnZWRWYWx1ZTo6Zm9yVW5tYW5hZ2VkKFNHRi5lbWl0R2xvYmFsRnVuY3Rpb25SZWYobG9jLCBuZXh0KSk7CisgIHJldHVybiB7TWFuYWdlZFZhbHVlOjpmb3JVbm1hbmFnZWQoU0dGLmVtaXRHbG9iYWxGdW5jdGlvblJlZihsb2MsIG5leHQpKSwKKyAgICAgICAgICBuZXh0fTsKIH0KIAogdm9pZCBTSUxHZW5GdW5jdGlvbjo6ZW1pdEN1cnJ5VGh1bmsoU0lMRGVjbFJlZiB0aHVuaykgewpAQCAtMTUyLDcgKzE1Niw4IEBACiAgIFNJTExvY2F0aW9uIGxvYyh2ZCk7CiAgIFNjb3BlIFMoKnRoaXMsIHZkKTsKIAotICBhdXRvIHRodW5rRm5UeSA9IFNHTS5UeXBlcy5nZXRDb25zdGFudEluZm8odGh1bmspLlNJTEZuVHlwZTsKKyAgYXV0byB0aHVua0luZm8gPSBTR00uVHlwZXMuZ2V0Q29uc3RhbnRJbmZvKHRodW5rKTsKKyAgYXV0byB0aHVua0ZuVHkgPSB0aHVua0luZm8uU0lMRm5UeXBlOwogICBTSUxGdW5jdGlvbkNvbnZlbnRpb25zIGZyb21Db252KHRodW5rRm5UeSwgU0dNLk0pOwogCiAgIGF1dG8gc2VsZlR5ID0gZnJvbUNvbnYuZ2V0U0lMVHlwZSh0aHVua0ZuVHktPmdldFNlbGZQYXJhbWV0ZXIoKSk7CkBAIC0xNjIsMTEgKzE2NywxMCBAQAogICAvLyBGb3J3YXJkIHN1YnN0aXR1dGlvbnMuCiAgIGF1dG8gc3VicyA9IEYuZ2V0Rm9yd2FyZGluZ1N1YnN0aXR1dGlvbk1hcCgpOwogCi0gIE1hbmFnZWRWYWx1ZSB0b0ZuID0gZ2V0TmV4dFVuY3VycnlMZXZlbFJlZigqdGhpcywgbG9jLCB0aHVuaywgc2VsZkFyZywgc3Vicyk7CisgIGF1dG8gdG9GbkFuZFJlZiA9IGdldE5leHRVbmN1cnJ5TGV2ZWxSZWYoKnRoaXMsIGxvYywgdGh1bmssIHNlbGZBcmcsIHN1YnMpOworICBNYW5hZ2VkVmFsdWUgdG9GbiA9IHRvRm5BbmRSZWYuZmlyc3Q7CisgIFNJTERlY2xSZWYgY2FsbGVlUmVmID0gdG9GbkFuZFJlZi5zZWNvbmQ7CiAKLSAgLy8gRklYTUU6IFVzaW5nIHRoZSB0eXBlIGZyb20gdGhlIENvbnN0YW50SW5mbyBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQKLSAgLy8gZ2V0Q29uc3RhbnRPdmVycmlkZUluZm8oKSBmb3IgbWV0aG9kcyBsb29rcyBzdXNwZWN0IGluIHRoZSBwcmVzZW5jZQotICAvLyBvZiBjb3ZhcmlhbnQgb3ZlcnJpZGVzIGFuZCBtdWx0aXBsZSB2dGFibGUgZW50cmllcy4KICAgU0lMVHlwZSByZXN1bHRUeSA9IGZyb21Db252LmdldFNpbmdsZVNJTFJlc3VsdFR5cGUoKTsKICAgcmVzdWx0VHkgPSBGLm1hcFR5cGVJbnRvQ29udGV4dChyZXN1bHRUeSk7CiAgIGF1dG8gc3Vic3RUeSA9IHRvRm4uZ2V0VHlwZSgpLnN1YnN0R2VuZXJpY0FyZ3MoU0dNLk0sIHN1YnMpOwpAQCAtMTg0LDggKzE4OCwyNyBAQAogICAgIGlmIChyZXN1bHRGblR5LT5pc0FCSUNvbXBhdGlibGVXaXRoKGNsb3N1cmVGblR5KS5pc0NvbXBhdGlibGUoKSkgewogICAgICAgdG9DbG9zdXJlID0gQi5jcmVhdGVDb252ZXJ0RnVuY3Rpb24obG9jLCB0b0Nsb3N1cmUsIHJlc3VsdFR5KTsKICAgICB9IGVsc2UgeworICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFydGlhbGx5LWFwcGxpZWQgYWJzdHJhY3Rpb24gcGF0dGVybiBmb3IgdGhlIGNhbGxlZToKKyAgICAgIC8vIGp1c3QgZ3JhYiB0aGUgcGF0dGVybiBmb3IgdGhlIGN1cnJpZWQgZm4gcmVmIGFuZCAiY2FsbCIgaXQuCisgICAgICBhc3NlcnQoIWNhbGxlZVJlZi5pc0N1cnJpZWQpOworICAgICAgY2FsbGVlUmVmLmlzQ3VycmllZCA9IHRydWU7CisgICAgICBhdXRvIGFwcGxpZWRGblBhdHRlcm4gPSBTR00uVHlwZXMuZ2V0Q29uc3RhbnRJbmZvKGNhbGxlZVJlZikuRm9ybWFsUGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZ1bmN0aW9uUmVzdWx0VHlwZSgpOworCisgICAgICBhdXRvIGFwcGxpZWRUaHVua1BhdHRlcm4gPQorICAgICAgICB0aHVua0luZm8uRm9ybWFsUGF0dGVybi5nZXRGdW5jdGlvblJlc3VsdFR5cGUoKTsKKworICAgICAgLy8gVGhlIGZvcm1hbCB0eXBlIHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgdGhlIGNhbGxlZSBhbmQgdGhlIHRodW5rLgorICAgICAgYXV0byBmb3JtYWxUeXBlID0gdGh1bmtJbmZvLkZvcm1hbFR5cGU7CisgICAgICBpZiAoYXV0byBnZW5lcmljU3Vic3RUeXBlID0gZHluX2Nhc3Q8R2VuZXJpY0Z1bmN0aW9uVHlwZT4oZm9ybWFsVHlwZSkpIHsKKyAgICAgICAgZm9ybWFsVHlwZSA9IGdlbmVyaWNTdWJzdFR5cGUuc3Vic3RHZW5lcmljQXJncyhzdWJzKTsKKyAgICAgIH0KKyAgICAgIGZvcm1hbFR5cGUgPSBjYXN0PEFueUZ1bmN0aW9uVHlwZT4oZm9ybWFsVHlwZS5nZXRSZXN1bHQoKSk7CisKICAgICAgIHRvQ2xvc3VyZSA9Ci0gICAgICAgICAgZW1pdENhbm9uaWNhbEZ1bmN0aW9uVGh1bmsobG9jLCB0b0Nsb3N1cmUsIGNsb3N1cmVGblR5LCByZXN1bHRGblR5KTsKKyAgICAgICAgZW1pdFRyYW5zZm9ybWVkVmFsdWUobG9jLCB0b0Nsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWRGblBhdHRlcm4sIGZvcm1hbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWRUaHVua1BhdHRlcm4sIGZvcm1hbFR5cGUpOwogICAgIH0KICAgfQogICB0b0Nsb3N1cmUgPSBTLnBvcFByZXNlcnZpbmdWYWx1ZSh0b0Nsb3N1cmUpOwpkaWZmIC0tZ2l0IGEvbGliL1NJTE9wdGltaXplci9BbmFseXNpcy9BY2Nlc3NTdW1tYXJ5QW5hbHlzaXMuY3BwIGIvbGliL1NJTE9wdGltaXplci9BbmFseXNpcy9BY2Nlc3NTdW1tYXJ5QW5hbHlzaXMuY3BwCmluZGV4IDY2ZTQzZWMuLjI0MDc1MTEgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxPcHRpbWl6ZXIvQW5hbHlzaXMvQWNjZXNzU3VtbWFyeUFuYWx5c2lzLmNwcAorKysgYi9saWIvU0lMT3B0aW1pemVyL0FuYWx5c2lzL0FjY2Vzc1N1bW1hcnlBbmFseXNpcy5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBGdW5jdGlvblN1bW1hcnkgJmZ1bmN0aW9uU3VtbWFyeSA9IGluZm8tPmdldFN1bW1hcnkoKTsKICAgICBBcmd1bWVudFN1bW1hcnkgJmFyZ1N1bW1hcnkgPQogICAgICAgICBmdW5jdGlvblN1bW1hcnkuZ2V0QWNjZXNzRm9yQXJndW1lbnQoaW5kZXgpOwotICAgIGluZGV4Kys7CisgICAgKytpbmRleDsKIAogICAgIGF1dG8gKmZ1bmN0aW9uQXJnID0gY2FzdDxTSUxGdW5jdGlvbkFyZ3VtZW50PihhcmcpOwogICAgIC8vIE9ubHkgc3VtbWFyaXplIEBpbm91dF9hbGlhc2FibGUgYXJndW1lbnRzLgpAQCAtMTM3LDYgKzEzNyw5IEBACiAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpBcHBseUluc3Q6CiAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpUcnlBcHBseUluc3Q6CiAgICAgcmV0dXJuIHRydWU7CisgIC8vIHBhcnRpYWxfYXBwbHkgW3N0YWNrXSBpcyB0ZXJtaW5hdGVkIGJ5IGEgZGVhbGxvY19zdGFjay4KKyAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OkRlYWxsb2NTdGFja0luc3Q6CisgICAgcmV0dXJuIHRydWU7CiAKICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OkNvbnZlcnRGdW5jdGlvbkluc3Q6CiAgICAgcmV0dXJuIGxsdm06OmFsbF9vZihjYXN0PENvbnZlcnRGdW5jdGlvbkluc3Q+KHVzZXIpLT5nZXRVc2VzKCksCkBAIC00MjMsNyArNDI2LDcgQEAKICAgICAgIG9zIDw8ICIsICI7CiAgICAgfQogICAgIG9zIDw8IHN1YkFjY2Vzcy5nZXREZXNjcmlwdGlvbihCYXNlVHlwZSwgTSk7Ci0gICAgaW5kZXgrKzsKKyAgICArK2luZGV4OwogICB9CiAgIG9zIDw8ICJdIjsKIApAQCAtNTk0LDcgKzU5Nyw3IEBACiAKICAgY29uc3QgSW5kZXhUcmllTm9kZSAqaXRlciA9IHN1YlBhdGg7CiAgIHdoaWxlIChpdGVyKSB7Ci0gICAgbGVuZ3RoKys7CisgICAgKytsZW5ndGg7CiAgICAgaXRlciA9IGl0ZXItPmdldFBhcmVudCgpOwogICB9CiAKQEAgLTYyOCw3ICs2MzEsNyBAQAogICB1bnNpZ25lZCBhcmdDb3VudCA9IGdldEFyZ3VtZW50Q291bnQoKTsKICAgb3MgPDwgIigiOwogCi0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhcmdDb3VudDsgKytpKSB7CiAgICAgaWYgKGkgPiAwKSB7CiAgICAgICBvcyA8PCAiLCAgIjsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvU0lMT3B0aW1pemVyL0lQTy9DYXB0dXJlUHJvbW90aW9uLmNwcCBiL2xpYi9TSUxPcHRpbWl6ZXIvSVBPL0NhcHR1cmVQcm9tb3Rpb24uY3BwCmluZGV4IDJlNjJmZTEuLjdlNjgxZjIgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxPcHRpbWl6ZXIvSVBPL0NhcHR1cmVQcm9tb3Rpb24uY3BwCisrKyBiL2xpYi9TSUxPcHRpbWl6ZXIvSVBPL0NhcHR1cmVQcm9tb3Rpb24uY3BwCkBAIC0xMDM0LDYgKzEwMzQsMTcgQEAKICAgICByZXR1cm4gaXNQYXJ0aWFsQXBwbHlOb25Fc2NhcGluZ1VzZXIoT3AsIFBBSSwgU3RhdGUpOwogICB9CiAKKyAgLy8gQSBtYXJrX2RlcGVuZGVuY2UgdXNlciBvbiBhIHBhcnRpYWxfYXBwbHkgaXMgc2FmZS4KKyAgaWYgKGF1dG8gKk1EID0gZHluX2Nhc3Q8TWFya0RlcGVuZGVuY2VJbnN0PihVc2VyKSkgeworICAgIGlmIChNRC0+Z2V0QmFzZSgpID09IE9wLT5nZXQoKSkgeworICAgICAgYXV0byBwYXJlbnQgPSBNRC0+Z2V0VmFsdWUoKTsKKyAgICAgIHdoaWxlICgoTUQgPSBkeW5fY2FzdDxNYXJrRGVwZW5kZW5jZUluc3Q+KHBhcmVudCkpKSB7CisgICAgICAgIHBhcmVudCA9IE1ELT5nZXRWYWx1ZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIGlzYTxQYXJ0aWFsQXBwbHlJbnN0PihwYXJlbnQpOworICAgIH0KKyAgfQorCiAgIGlmIChhdXRvICpQQkkgPSBkeW5fY2FzdDxQcm9qZWN0Qm94SW5zdD4oVXNlcikpIHsKICAgICAvLyBJdCBpcyBhc3N1bWVkIGluIGxhdGVyIGNvZGUgdGhhdCB3ZSB3aWxsIG9ubHkgaGF2ZSAxIHByb2plY3RfYm94LiBUaGlzCiAgICAgLy8gY2FuIGJlIHNlZW4gc2luY2UgdGhlcmUgaXMgbm8gY29kZSBmb3IgcmVhc29uaW5nIGFib3V0IG11bHRpcGxlCkBAIC0xMTk4LDYgKzEyMDksMjYgQEAKICAgcmV0dXJuIEIuY3JlYXRlUHJvamVjdEJveChCb3gtPmdldExvYygpLCBCb3gsIDApOwogfQogCisvLy8gQ2hhbmdlIHRoZSBiYXNlIGluIG1hcmtfZGVwZW5kZW5jZS4KK3N0YXRpYyB2b2lkCittYXBNYXJrRGVwZW5kZW5jZUFyZ3VtZW50cyhTaW5nbGVWYWx1ZUluc3RydWN0aW9uICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6RGVuc2VNYXA8U0lMVmFsdWUsIFNJTFZhbHVlPiAmbWFwKSB7CisgIGZvciAoYXV0byAqVXNlIDogcm9vdC0+Z2V0VXNlcygpKSB7CisgICAgaWYgKGF1dG8gKk1EID0gZHluX2Nhc3Q8TWFya0RlcGVuZGVuY2VJbnN0PihVc2UtPmdldFVzZXIoKSkpIHsKKyAgICAgIG1hcE1hcmtEZXBlbmRlbmNlQXJndW1lbnRzKE1ELCBtYXApOworICAgICAgYXV0byBpdGVyID0gbWFwLmZpbmQoTUQtPmdldEJhc2UoKSk7CisgICAgICBpZiAoaXRlciAhPSBtYXAuZW5kKCkpIHsKKyAgICAgICAgTUQtPnNldEJhc2UoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0KKyAgICAgIC8vIFJlbW92ZSBtYXJrX2RlcGVuZGVuY2Ugb24gdHJpdmlhbCB2YWx1ZXMuCisgICAgICBpZiAoTUQtPmdldEJhc2UoKS0+Z2V0VHlwZSgpLmlzVHJpdmlhbChNRC0+Z2V0TW9kdWxlKCkpKSB7CisgICAgICAgIE1ELT5yZXBsYWNlQWxsVXNlc1dpdGgoTUQtPmdldFZhbHVlKCkpOworICAgICAgICBNRC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKIC8vLyBHaXZlbiBhIHBhcnRpYWxfYXBwbHkgaW5zdHJ1Y3Rpb24gYW5kIGEgc2V0IG9mIHByb21vdGFibGUgaW5kaWNlcywKIC8vLyBjbG9uZSB0aGUgY2xvc3VyZSB3aXRoIHRoZSBwcm9tb3RlZCBjYXB0dXJlcyBhbmQgcmVwbGFjZSB0aGUgcGFydGlhbF9hcHBseQogLy8vIHdpdGggYSBwYXJ0aWFsX2FwcGx5IG9mIHRoZSBuZXcgY2xvc3VyZSwgZml4aW5nIHVwIHJlZmVyZW5jZSBjb3VudGluZyBhcwpAQCAtMTIzNiw2ICsxMjY3LDggQEAKICAgdW5zaWduZWQgT3BDb3VudCA9IFBBSS0+Z2V0TnVtT3BlcmFuZHMoKSAtIFBBSS0+Z2V0TnVtVHlwZURlcGVuZGVudE9wZXJhbmRzKCk7CiAgIFNtYWxsVmVjdG9yPFNJTFZhbHVlLCAxNj4gQXJnczsKICAgYXV0byBOdW1JbmRpcmVjdFJlc3VsdHMgPSBjYWxsZWVDb252LmdldE51bUluZGlyZWN0U0lMUmVzdWx0cygpOworICBsbHZtOjpEZW5zZU1hcDxTSUxWYWx1ZSwgU0lMVmFsdWU+IGNhcHR1cmVkTWFwOworICBsbHZtOjpTbWFsbFNldDxTSUxWYWx1ZSwgMTY+IG5ld0NhcHR1cmVzOwogICBmb3IgKDsgT3BObyAhPSBPcENvdW50OyArK09wTm8pIHsKICAgICB1bnNpZ25lZCBJbmRleCA9IE9wTm8gLSAxICsgRmlyc3RJbmRleDsKICAgICBpZiAoIVByb21vdGFibGVJbmRpY2VzLmNvdW50KEluZGV4KSkgewpAQCAtMTI1MCw4ICsxMjgzLDE4IEBACiAgICAgU0lMVmFsdWUgQWRkciA9IGdldE9yQ3JlYXRlUHJvamVjdEJveEhlbHBlcihCb3gpOwogCiAgICAgYXV0byAmdHlwZUxvd2VyaW5nID0gTS5nZXRUeXBlTG93ZXJpbmcoQWRkci0+Z2V0VHlwZSgpKTsKLSAgICBBcmdzLnB1c2hfYmFjaygKLSAgICAgICAgdHlwZUxvd2VyaW5nLmVtaXRMb2FkT2ZDb3B5KEIsIFBBSS0+Z2V0TG9jKCksIEFkZHIsIElzTm90VGFrZSkpOworICAgIGF1dG8gbmV3Q2FwdHVyZWQgPQorICAgICAgICB0eXBlTG93ZXJpbmcuZW1pdExvYWRPZkNvcHkoQiwgUEFJLT5nZXRMb2MoKSwgQWRkciwgSXNOb3RUYWtlKTsKKyAgICBBcmdzLnB1c2hfYmFjayhuZXdDYXB0dXJlZCk7CisKKyAgICBjYXB0dXJlZE1hcFtCb3hdID0gbmV3Q2FwdHVyZWQ7CisgICAgbmV3Q2FwdHVyZXMuaW5zZXJ0KG5ld0NhcHR1cmVkKTsKKworICAgIC8vIEEgcGFydGlhbF9hcHBseSBbc3RhY2tdIGRvZXMgbm90IG93biB0aGUgY2FwdHVyZWQgYXJndW1lbnQgYnV0IHdlIG11c3QKKyAgICAvLyBkZXN0cm95IHRoZSBwcm9qZWN0ZWQgb2JqZWN0LiBXZSB3aWxsIGRvIHNvIGFmdGVyIGhhdmluZyBjcmVhdGVkIHRoZSBuZXcKKyAgICAvLyBwYXJ0aWFsX2FwcGx5IGJlbG93LgorICAgIGlmIChQQUktPmlzT25TdGFjaygpKQorICAgICAgY29udGludWU7CiAKICAgICAvLyBDbGVhbnVwIHRoZSBjYXB0dXJlZCBhcmd1bWVudC4KICAgICAvLwpAQCAtMTI2OCw3ICsxMzExLDggQEAKICAgLy8gQ3JlYXRlIGEgbmV3IHBhcnRpYWwgYXBwbHkgd2l0aCB0aGUgbmV3IGFyZ3VtZW50cy4KICAgYXV0byAqTmV3UEFJID0gQi5jcmVhdGVQYXJ0aWFsQXBwbHkoCiAgICAgICBQQUktPmdldExvYygpLCBGblZhbCwgUEFJLT5nZXRTdWJzdGl0dXRpb25NYXAoKSwgQXJncywKLSAgICAgIFBBSS0+Z2V0VHlwZSgpLmdldEFzPFNJTEZ1bmN0aW9uVHlwZT4oKS0+Z2V0Q2FsbGVlQ29udmVudGlvbigpKTsKKyAgICAgIFBBSS0+Z2V0VHlwZSgpLmdldEFzPFNJTEZ1bmN0aW9uVHlwZT4oKS0+Z2V0Q2FsbGVlQ29udmVudGlvbigpLAorICAgICAgUEFJLT5pc09uU3RhY2soKSk7CiAgIFBBSS0+cmVwbGFjZUFsbFVzZXNXaXRoKE5ld1BBSSk7CiAgIFBBSS0+ZXJhc2VGcm9tUGFyZW50KCk7CiAgIGlmIChGUkktPnVzZV9lbXB0eSgpKSB7CkBAIC0xMjc2LDYgKzEzMjAsMjEgQEAKICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBsYXN0IHVzZSBvZiB0aGUgY2xvc3VyZSwgYW5kIGlmIGl0IGhhcyBpbnRlcm5hbAogICAgIC8vIGxpbmthZ2UsIHdlIHNob3VsZCByZW1vdmUgaXQgZnJvbSB0aGUgU0lMTW9kdWxlIG5vdy4KICAgfQorCisgIGlmIChOZXdQQUktPmlzT25TdGFjaygpKSB7CisgICAgLy8gSW5zZXJ0IGRlc3Ryb3kncyBvZiBuZXcgY2FwdHVyZWQgYXJndW1lbnRzLgorICAgIGZvciAoYXV0byAqVXNlIDogTmV3UEFJLT5nZXRVc2VzKCkpIHsKKyAgICAgIGlmIChhdXRvICpEUyA9IGR5bl9jYXN0PERlYWxsb2NTdGFja0luc3Q+KFVzZS0+Z2V0VXNlcigpKSkgeworICAgICAgICBCLnNldEluc2VydGlvblBvaW50KHN0ZDo6bmV4dChTSUxCYXNpY0Jsb2NrOjppdGVyYXRvcihEUykpKTsKKyAgICAgICAgaW5zZXJ0RGVzdHJveU9mQ2FwdHVyZWRBcmd1bWVudHMoTmV3UEFJLCBCLCBbJl0oU0lMVmFsdWUgYXJnKSAtPiBib29sIHsKKyAgICAgICAgICByZXR1cm4gbmV3Q2FwdHVyZXMuY291bnQoYXJnKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICAgIC8vIE1hcCB0aGUgbWFyayBkZXBlbmRlbmNlIGFyZ3VtZW50cy4KKyAgICBtYXBNYXJrRGVwZW5kZW5jZUFyZ3VtZW50cyhOZXdQQUksIGNhcHR1cmVkTWFwKTsKKyAgfQorCiAgIHJldHVybiBDbG9uZWRGbjsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL1NJTE9wdGltaXplci9JUE8vQ2FwdHVyZVByb3BhZ2F0aW9uLmNwcCBiL2xpYi9TSUxPcHRpbWl6ZXIvSVBPL0NhcHR1cmVQcm9wYWdhdGlvbi5jcHAKaW5kZXggNmMxY2RkNi4uMGRjMDlmOCAxMDA2NDQKLS0tIGEvbGliL1NJTE9wdGltaXplci9JUE8vQ2FwdHVyZVByb3BhZ2F0aW9uLmNwcAorKysgYi9saWIvU0lMT3B0aW1pemVyL0lQTy9DYXB0dXJlUHJvcGFnYXRpb24uY3BwCkBAIC0yOTYsNiArMjk2LDExIEBACiAgIGF1dG8gKlQyVEYgPSBCdWlsZGVyLmNyZWF0ZVRoaW5Ub1RoaWNrRnVuY3Rpb24oT3JpZ1BBSS0+Z2V0TG9jKCksIEZ1bmNSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ1BBSS0+Z2V0VHlwZSgpKTsKICAgT3JpZ1BBSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFQyVEYpOworICAvLyBSZW1vdmUgYW55IGRlYWxsb2Nfc3RhY2sgdXNlcnMuCisgIFNtYWxsVmVjdG9yPE9wZXJhbmQqLCAxNj4gVXNlcyhUMlRGLT5nZXRVc2VzKCkpOworICBmb3IgKGF1dG8gKlVzZSA6IFVzZXMpCisgICAgaWYgKGF1dG8gKkRTID0gZHluX2Nhc3Q8RGVhbGxvY1N0YWNrSW5zdD4oVXNlLT5nZXRVc2VyKCkpKQorICAgICAgRFMtPmVyYXNlRnJvbVBhcmVudCgpOwogICByZWN1cnNpdmVseURlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMoT3JpZ1BBSSwgdHJ1ZSk7CiAgIExMVk1fREVCVUcobGx2bTo6ZGJncygpIDw8ICIgIFJld3JvdGUgY2FsbGVyOlxuIiA8PCAqVDJURik7CiB9CmRpZmYgLS1naXQgYS9saWIvU0lMT3B0aW1pemVyL0lQTy9DbG9zdXJlU3BlY2lhbGl6ZXIuY3BwIGIvbGliL1NJTE9wdGltaXplci9JUE8vQ2xvc3VyZVNwZWNpYWxpemVyLmNwcAppbmRleCA2NzhiMjYzLi5lMjVhNTljIDEwMDY0NAotLS0gYS9saWIvU0lMT3B0aW1pemVyL0lQTy9DbG9zdXJlU3BlY2lhbGl6ZXIuY3BwCisrKyBiL2xpYi9TSUxPcHRpbWl6ZXIvSVBPL0Nsb3N1cmVTcGVjaWFsaXplci5jcHAKQEAgLTcyLDcgKzcyLDkgQEAKICNpbmNsdWRlICJzd2lmdC9TSUxPcHRpbWl6ZXIvVXRpbHMvU0lMSW5saW5lci5oIgogI2luY2x1ZGUgInN3aWZ0L1NJTE9wdGltaXplci9VdGlscy9TSUxPcHRGdW5jdGlvbkJ1aWxkZXIuaCIKICNpbmNsdWRlICJzd2lmdC9TSUxPcHRpbWl6ZXIvVXRpbHMvU3BlY2lhbGl6YXRpb25NYW5nbGVyLmgiCisjaW5jbHVkZSAic3dpZnQvU0lMT3B0aW1pemVyL1V0aWxzL1N0YWNrTmVzdGluZy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKQEAgLTEzMCw3ICsxMzIsOCBAQAogICBTSUxWYWx1ZQogICBjbG9uZUNhbGxlZUNvbnZlcnNpb24oU0lMVmFsdWUgY2FsbGVlVmFsdWUsIFNJTFZhbHVlIE5ld0Nsb3N1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBTSUxCdWlsZGVyICZCdWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFBhcnRpYWxBcHBseUluc3QgKj4gJk5lZWRzUmVsZWFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UGFydGlhbEFwcGx5SW5zdCAqPiAmTmVlZHNSZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6RGVuc2VNYXA8U0lMVmFsdWUsIFNJTFZhbHVlPiAmQ2FwdHVyZWRNYXApOwogCiAgIFNJTEZ1bmN0aW9uICpnZXRDbG9uZWQoKSB7IHJldHVybiAmZ2V0QnVpbGRlcigpLmdldEZ1bmN0aW9uKCk7IH0KICAgc3RhdGljIFNJTEZ1bmN0aW9uICpjbG9uZUZ1bmN0aW9uKFNJTE9wdEZ1bmN0aW9uQnVpbGRlciAmRnVuY3Rpb25CdWlsZGVyLApAQCAtMTkyLDcgKzE5NSwxOCBAQAogICB9CiAKICAgYm9vbCBjbG9zdXJlSGFzUmVmU2VtYW50aWNDb250ZXh0KCkgY29uc3QgewotICAgIHJldHVybiBpc2E8UGFydGlhbEFwcGx5SW5zdD4oZ2V0Q2xvc3VyZSgpKTsKKyAgICByZXR1cm4gaXNhPFBhcnRpYWxBcHBseUluc3Q+KGdldENsb3N1cmUoKSkgJiYKKyAgICAgICAgICAgIWNhc3Q8UGFydGlhbEFwcGx5SW5zdD4oZ2V0Q2xvc3VyZSgpKS0+aXNPblN0YWNrKCk7CisgIH0KKworICBib29sIGRlc3Ryb3lJZlBhcnRpYWxBcHBseVN0YWNrKFNJTEJ1aWxkZXIgJkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlVmFsdWVJbnN0cnVjdGlvbiAqbmV3Q2xvc3VyZSkgY29uc3QgeworICAgIGF1dG8gKlBBID0gZHluX2Nhc3Q8UGFydGlhbEFwcGx5SW5zdD4obmV3Q2xvc3VyZSk7CisgICAgaWYgKCFQQSB8fCAhUEEtPmlzT25TdGFjaygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGluc2VydERlc3Ryb3lPZkNhcHR1cmVkQXJndW1lbnRzKFBBLCBCKTsKKyAgICBCLmNyZWF0ZURlYWxsb2NTdGFjayhnZXRDbG9zdXJlKCktPmdldExvYygpLCBQQSk7CisgICAgcmV0dXJuIHRydWU7CiAgIH0KIAogICB1bnNpZ25lZCBnZXRDbG9zdXJlSW5kZXgoKSBjb25zdCB7IHJldHVybiBDbG9zdXJlSW5kZXg7IH0KQEAgLTIwNywxMiArMjIxLDEzIEBACiAgIFNpbmdsZVZhbHVlSW5zdHJ1Y3Rpb24gKgogICBjcmVhdGVOZXdDbG9zdXJlKFNJTEJ1aWxkZXIgJkIsIFNJTFZhbHVlIFYsCiAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPFNJTFZhbHVlPiAmQXJncykgY29uc3QgewotICAgIGlmIChpc2E8UGFydGlhbEFwcGx5SW5zdD4oZ2V0Q2xvc3VyZSgpKSkKKyAgICBpZiAoYXV0byAqUEEgPSBkeW5fY2FzdDxQYXJ0aWFsQXBwbHlJbnN0PihnZXRDbG9zdXJlKCkpKQogICAgICAgcmV0dXJuIEIuY3JlYXRlUGFydGlhbEFwcGx5KGdldENsb3N1cmUoKS0+Z2V0TG9jKCksIFYsIHt9LCBBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsb3N1cmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldFR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXM8U0lMRnVuY3Rpb25UeXBlPigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0Q2FsbGVlQ29udmVudGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRDYWxsZWVDb252ZW50aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEEtPmlzT25TdGFjaygpKTsKIAogICAgIGFzc2VydChpc2E8VGhpblRvVGhpY2tGdW5jdGlvbkluc3Q+KGdldENsb3N1cmUoKSkgJiYKICAgICAgICAgICAgIldlIG9ubHkgc3VwcG9ydCBwYXJ0aWFsX2FwcGx5IGFuZCB0aGluX3RvX3RoaWNrX2Z1bmN0aW9uIik7CkBAIC0yNTYsNiArMjcxLDEzIEBACiAgICAgcmV0dXJuIGdldENsb3N1cmVQYXJhbWV0ZXJJbmZvKCkuaXNDb25zdW1lZCgpOwogICB9CiAKKyAgYm9vbCBpc0Nsb3N1cmVPblN0YWNrKCkgY29uc3QgeworICAgIGF1dG8gKlBBID0gZHluX2Nhc3Q8UGFydGlhbEFwcGx5SW5zdD4oZ2V0Q2xvc3VyZSgpKTsKKyAgICBpZiAoIVBBKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBQQS0+aXNPblN0YWNrKCk7CisgIH0KKwogICBib29sIGlzVHJpdmlhbE5vRXNjYXBlUGFyYW1ldGVyKCkgY29uc3QgewogICAgIGF1dG8gQ2xvc3VyZVBhcm1GblR5ID0KICAgICAgICAgZ2V0Q2xvc3VyZVBhcmFtZXRlckluZm8oKS5nZXRUeXBlKCktPmdldEFzPFNJTEZ1bmN0aW9uVHlwZT4oKTsKQEAgLTY3NSwxNiArNjk3LDI5IEBACiAvLyBDbG9uZSBhIGNoYWluIG9mIENvbnZlcnRGdW5jdGlvbkluc3RzLgogU0lMVmFsdWUgQ2xvc3VyZVNwZWNDbG9uZXI6OmNsb25lQ2FsbGVlQ29udmVyc2lvbigKICAgICBTSUxWYWx1ZSBjYWxsZWVWYWx1ZSwgU0lMVmFsdWUgTmV3Q2xvc3VyZSwgU0lMQnVpbGRlciAmQnVpbGRlciwKLSAgICBTbWFsbFZlY3RvckltcGw8UGFydGlhbEFwcGx5SW5zdCAqPiAmTmVlZHNSZWxlYXNlKSB7CisgICAgU21hbGxWZWN0b3JJbXBsPFBhcnRpYWxBcHBseUluc3QgKj4gJk5lZWRzUmVsZWFzZSwKKyAgICBsbHZtOjpEZW5zZU1hcDxTSUxWYWx1ZSwgU0lMVmFsdWU+ICZDYXB0dXJlZE1hcCkgeworCisgIC8vIFRoZXJlIG1pZ2h0IGJlIGEgbWFyayBkZXBlbmRlbmNlIG9uIGEgcHJldmlvdXMgY2xvc3VyZSB2YWx1ZS4gVGhlcmVmb3JlLCB3ZQorICAvLyBhZGQgYWxsIGNsb3N1cmUgdmFsdWVzIHRvIHRoZSBtYXAuCisgIGF1dG8gYWRkVG9PbGRUb05ld0Nsb3N1cmVNYXAgPSBbJl0oU0lMVmFsdWUgb3JpZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTFZhbHVlIG5ld1ZhbHVlKSAtPiBTSUxWYWx1ZSB7CisgICAgYXNzZXJ0KCFDYXB0dXJlZE1hcC5jb3VudChvcmlnVmFsdWUpKTsKKyAgICBDYXB0dXJlZE1hcFtvcmlnVmFsdWVdID0gbmV3VmFsdWU7CisgICAgcmV0dXJuIG5ld1ZhbHVlOworICB9OworCiAgIGlmIChjYWxsZWVWYWx1ZSA9PSBDYWxsU2l0ZURlc2MuZ2V0Q2xvc3VyZSgpKQotICAgIHJldHVybiBOZXdDbG9zdXJlOworICAgIHJldHVybiBhZGRUb09sZFRvTmV3Q2xvc3VyZU1hcChjYWxsZWVWYWx1ZSwgTmV3Q2xvc3VyZSk7CiAKICAgaWYgKGF1dG8gKkNGSSA9IGR5bl9jYXN0PENvbnZlcnRGdW5jdGlvbkluc3Q+KGNhbGxlZVZhbHVlKSkgeworICAgIFNJTFZhbHVlIG9yaWdDYWxsZWVWYWx1ZSA9IGNhbGxlZVZhbHVlOwogICAgIGNhbGxlZVZhbHVlID0gY2xvbmVDYWxsZWVDb252ZXJzaW9uKENGSS0+Z2V0T3BlcmFuZCgpLCBOZXdDbG9zdXJlLCBCdWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZWRzUmVsZWFzZSk7Ci0gICAgcmV0dXJuIEJ1aWxkZXIuY3JlYXRlQ29udmVydEZ1bmN0aW9uKENhbGxTaXRlRGVzYy5nZXRMb2MoKSwgY2FsbGVlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGSS0+Z2V0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkktPndpdGhvdXRBY3R1YWxseUVzY2FwaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZWRzUmVsZWFzZSwgQ2FwdHVyZWRNYXApOworICAgIHJldHVybiBhZGRUb09sZFRvTmV3Q2xvc3VyZU1hcCgKKyAgICAgICAgb3JpZ0NhbGxlZVZhbHVlLCBCdWlsZGVyLmNyZWF0ZUNvbnZlcnRGdW5jdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbFNpdGVEZXNjLmdldExvYygpLCBjYWxsZWVWYWx1ZSwgQ0ZJLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGSS0+d2l0aG91dEFjdHVhbGx5RXNjYXBpbmcoKSkpOwogICB9CiAKICAgaWYgKGF1dG8gKlBBSSA9IGR5bl9jYXN0PFBhcnRpYWxBcHBseUluc3Q+KGNhbGxlZVZhbHVlKSkgewpAQCAtNjkzLDI3ICs3MjgsNTIgQEAKICAgICAgICAgICAgICAgIC0+Z2V0VHlwZSgpCiAgICAgICAgICAgICAgICAuZ2V0QXM8U0lMRnVuY3Rpb25UeXBlPigpCiAgICAgICAgICAgICAgICAtPmlzVHJpdmlhbE5vRXNjYXBlKCkpOworICAgIFNJTFZhbHVlIG9yaWdDYWxsZWVWYWx1ZSA9IGNhbGxlZVZhbHVlOwogICAgIGNhbGxlZVZhbHVlID0gY2xvbmVDYWxsZWVDb252ZXJzaW9uKFBBSS0+Z2V0QXJndW1lbnQoMCksIE5ld0Nsb3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlciwgTmVlZHNSZWxlYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLCBOZWVkc1JlbGVhc2UsIENhcHR1cmVkTWFwKTsKICAgICBhdXRvIEZ1blJlZiA9IEJ1aWxkZXIuY3JlYXRlRnVuY3Rpb25SZWYoQ2FsbFNpdGVEZXNjLmdldExvYygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUktPmdldFJlZmVyZW5jZWRGdW5jdGlvbigpKTsKICAgICBhdXRvIE5ld1BBID0gQnVpbGRlci5jcmVhdGVQYXJ0aWFsQXBwbHkoCiAgICAgICAgIENhbGxTaXRlRGVzYy5nZXRMb2MoKSwgRnVuUmVmLCB7fSwge2NhbGxlZVZhbHVlfSwKLSAgICAgICAgUEFJLT5nZXRUeXBlKCkuZ2V0QXM8U0lMRnVuY3Rpb25UeXBlPigpLT5nZXRDYWxsZWVDb252ZW50aW9uKCkpOworICAgICAgICBQQUktPmdldFR5cGUoKS5nZXRBczxTSUxGdW5jdGlvblR5cGU+KCktPmdldENhbGxlZUNvbnZlbnRpb24oKSwKKyAgICAgICAgUEFJLT5pc09uU3RhY2soKSk7CisgICAgLy8gSWYgdGhlIHBhcnRpYWxfYXBwbHkgaXMgb24gc3RhY2sgd2Ugd2lsbCBlbWl0IGEgZGVhbGxvY19zdGFjayBpbiB0aGUKKyAgICAvLyBlcGlsb2cuCiAgICAgTmVlZHNSZWxlYXNlLnB1c2hfYmFjayhOZXdQQSk7Ci0gICAgcmV0dXJuIE5ld1BBOworICAgIHJldHVybiBhZGRUb09sZFRvTmV3Q2xvc3VyZU1hcChvcmlnQ2FsbGVlVmFsdWUsIE5ld1BBKTsKICAgfQogCisgIGlmIChhdXRvICpNRCA9IGR5bl9jYXN0PE1hcmtEZXBlbmRlbmNlSW5zdD4oY2FsbGVlVmFsdWUpKSB7CisgICAgU0lMVmFsdWUgb3JpZ0NhbGxlZVZhbHVlID0gY2FsbGVlVmFsdWU7CisgICAgY2FsbGVlVmFsdWUgPSBjbG9uZUNhbGxlZUNvbnZlcnNpb24oTUQtPmdldFZhbHVlKCksIE5ld0Nsb3N1cmUsIEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVlZHNSZWxlYXNlLCBDYXB0dXJlZE1hcCk7CisgICAgaWYgKCFDYXB0dXJlZE1hcC5jb3VudChNRC0+Z2V0QmFzZSgpKSkgeworICAgICAgQ2FsbFNpdGVEZXNjLmdldENsb3N1cmUoKS0+ZHVtcCgpOworICAgICAgTUQtPmR1bXAoKTsKKyAgICAgIE1ELT5nZXRGdW5jdGlvbigpLT5kdW1wKCk7CisgICAgfQorICAgIGFzc2VydChDYXB0dXJlZE1hcC5jb3VudChNRC0+Z2V0QmFzZSgpKSk7CisgICAgcmV0dXJuIGFkZFRvT2xkVG9OZXdDbG9zdXJlTWFwKAorICAgICAgICBvcmlnQ2FsbGVlVmFsdWUsCisgICAgICAgIEJ1aWxkZXIuY3JlYXRlTWFya0RlcGVuZGVuY2UoQ2FsbFNpdGVEZXNjLmdldExvYygpLCBjYWxsZWVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlZE1hcFtNRC0+Z2V0QmFzZSgpXSkpOworICB9CisKKwogICBhdXRvICpDdnQgPSBjYXN0PENvbnZlcnRFc2NhcGVUb05vRXNjYXBlSW5zdD4oY2FsbGVlVmFsdWUpOworICBTSUxWYWx1ZSBvcmlnQ2FsbGVlVmFsdWUgPSBjYWxsZWVWYWx1ZTsKICAgY2FsbGVlVmFsdWUgPSBjbG9uZUNhbGxlZUNvbnZlcnNpb24oQ3Z0LT5nZXRPcGVyYW5kKCksIE5ld0Nsb3N1cmUsIEJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZWRzUmVsZWFzZSk7Ci0gIHJldHVybiBCdWlsZGVyLmNyZWF0ZUNvbnZlcnRFc2NhcGVUb05vRXNjYXBlKAotICAgICAgQ2FsbFNpdGVEZXNjLmdldExvYygpLCBjYWxsZWVWYWx1ZSwgQ3Z0LT5nZXRUeXBlKCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZWVkc1JlbGVhc2UsIENhcHR1cmVkTWFwKTsKKyAgcmV0dXJuIGFkZFRvT2xkVG9OZXdDbG9zdXJlTWFwKAorICAgICAgb3JpZ0NhbGxlZVZhbHVlLAorICAgICAgQnVpbGRlci5jcmVhdGVDb252ZXJ0RXNjYXBlVG9Ob0VzY2FwZShDYWxsU2l0ZURlc2MuZ2V0TG9jKCksIGNhbGxlZVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdnQtPmdldFR5cGUoKSwgdHJ1ZSkpOwogfQogCiAvLy8gUG9wdWxhdGUgdGhlIGJvZHkgb2YgdGhlIGNsb25lZCBjbG9zdXJlLCBtb2RpZnlpbmcgaW5zdHJ1Y3Rpb25zIGFzCi0vLy8gbmVjZXNzYXJ5LiBUaGlzIGlzIHdoZXJlIHdlIGNyZWF0ZSB0aGUgYWN0dWFsIHNwZWNpYWxpemVkIEJCIEFyZ3VtZW50cy4KKy8vLyBuZWNlc3NhcnkuIFRoaXMgaXMgd2hlcmUgd2UgY3JlYXRlIHRoZSBhY3R1YWwgc3BlY2lhbGl6ZWQgQkIgQXJndW1lbnRzCiB2b2lkIENsb3N1cmVTcGVjQ2xvbmVyOjpwb3B1bGF0ZUNsb25lZCgpIHsKKyAgYm9vbCBuZWVkVG9VcGRhdGVTdGFja05lc3RpbmcgPSBmYWxzZTsKICAgU0lMRnVuY3Rpb24gKkNsb25lZCA9IGdldENsb25lZCgpOwogICBTSUxGdW5jdGlvbiAqQ2xvc3VyZVVzZXIgPSBDYWxsU2l0ZURlc2MuZ2V0QXBwbHlDYWxsZWUoKTsKIApAQCAtNzUyLDEwICs4MTIsMTUgQEAKICAgdW5zaWduZWQgTnVtVG90YWxQYXJhbXMgPSBDbG9zZWRPdmVyRnVuQ29udi5nZXROdW1QYXJhbWV0ZXJzKCk7CiAgIHVuc2lnbmVkIE51bU5vdENhcHR1cmVkID0gTnVtVG90YWxQYXJhbXMgLSBDYWxsU2l0ZURlc2MuZ2V0TnVtQXJndW1lbnRzKCk7CiAgIGxsdm06OlNtYWxsVmVjdG9yPFNJTFZhbHVlLCA0PiBOZXdQQUlBcmdzOworICBsbHZtOjpEZW5zZU1hcDxTSUxWYWx1ZSwgU0lMVmFsdWU+IENhcHR1cmVkTWFwOworICB1bnNpZ25lZCBpZHggPSAwOwogICBmb3IgKGF1dG8gJlBJbmZvIDogQ2xvc2VkT3ZlckZ1bkNvbnYuZ2V0UGFyYW1ldGVycygpLnNsaWNlKE51bU5vdENhcHR1cmVkKSkgewogICAgIGF1dG8gcGFyYW1UeSA9IENsb3NlZE92ZXJGdW5Db252LmdldFNJTFR5cGUoUEluZm8pOwogICAgIFNJTFZhbHVlIE1hcHBlZFZhbHVlID0gQ2xvbmVkRW50cnlCQi0+Y3JlYXRlRnVuY3Rpb25Bcmd1bWVudChwYXJhbVR5KTsKICAgICBOZXdQQUlBcmdzLnB1c2hfYmFjayhNYXBwZWRWYWx1ZSk7CisgICAgYXV0byBDYXB0dXJlZFZhbCA9CisgICAgICAgIGNhc3Q8UGFydGlhbEFwcGx5SW5zdD4oQ2FsbFNpdGVEZXNjLmdldENsb3N1cmUoKSktPmdldEFyZ3VtZW50KGlkeCsrKTsKKyAgICBDYXB0dXJlZE1hcFtDYXB0dXJlZFZhbF0gPSBNYXBwZWRWYWx1ZTsKICAgfQogCiAgIFNJTEJ1aWxkZXIgJkJ1aWxkZXIgPSBnZXRCdWlsZGVyKCk7CkBAIC03NzAsOCArODM1LDkgQEAKICAgLy8gQ2xvbmUgYSBjaGFpbiBvZiBDb252ZXJ0RnVuY3Rpb25JbnN0cy4gVGhpcyBjYW4gY3JlYXRlIGZ1cnRoZXIKICAgLy8gcmVhYnN0cmFjdGlvbiBwYXJ0aWFsX2FwcGx5IGluc3RydWN0aW9ucy4KICAgU21hbGxWZWN0b3I8UGFydGlhbEFwcGx5SW5zdCosIDQ+IE5lZWRzUmVsZWFzZTsKLSAgU0lMVmFsdWUgQ29udmVydGVkQ2FsbGVlID0gY2xvbmVDYWxsZWVDb252ZXJzaW9uKAotICAgICAgQ2FsbFNpdGVEZXNjLmdldENsb3N1cmVDYWxsZXJBcmcoKSwgTmV3Q2xvc3VyZSwgQnVpbGRlciwgTmVlZHNSZWxlYXNlKTsKKyAgU0lMVmFsdWUgQ29udmVydGVkQ2FsbGVlID0KKyAgICAgIGNsb25lQ2FsbGVlQ29udmVyc2lvbihDYWxsU2l0ZURlc2MuZ2V0Q2xvc3VyZUNhbGxlckFyZygpLCBOZXdDbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIsIE5lZWRzUmVsZWFzZSwgQ2FwdHVyZWRNYXApOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGFjdHVhbGx5IGVtaXQgdGhlIHJlbGVhc2VzIGZvciByZWFic3RyYWN0aW9uIHRodW5rcy4gV2UKICAgLy8gaGF2ZSBndWFyYW50ZWVkIGVhcmxpZXIgdGhhdCB3ZSBvbmx5IGFsbG93IHJlYWJzdHJhY3Rpb24gdGh1bmtzIGlmIHRoZQpAQCAtNzkwLDcgKzg1Niw4IEBACiAgIGJvb2wgQ2xvc3VyZUhhc1JlZlNlbWFudGljcyA9IENhbGxTaXRlRGVzYy5jbG9zdXJlSGFzUmVmU2VtYW50aWNDb250ZXh0KCk7CiAgIGlmICgoQ2FsbFNpdGVEZXNjLmlzQ2xvc3VyZUd1YXJhbnRlZWQoKSB8fAogICAgICAgIENhbGxTaXRlRGVzYy5pc1RyaXZpYWxOb0VzY2FwZVBhcmFtZXRlcigpKSAmJgotICAgICAgKENsb3N1cmVIYXNSZWZTZW1hbnRpY3MgfHwgIU5lZWRzUmVsZWFzZS5lbXB0eSgpKSkgeworICAgICAgKENsb3N1cmVIYXNSZWZTZW1hbnRpY3MgfHwgIU5lZWRzUmVsZWFzZS5lbXB0eSgpIHx8CisgICAgICAgQ2FsbFNpdGVEZXNjLmlzQ2xvc3VyZU9uU3RhY2soKSkpIHsKICAgICBmb3IgKFNJTEJhc2ljQmxvY2sgKkJCIDogQ2FsbFNpdGVEZXNjLmdldE5vbkZhaWx1cmVFeGl0QkJzKCkpIHsKICAgICAgIFNJTEJhc2ljQmxvY2sgKk9wQkIgPSBnZXRPcEJhc2ljQmxvY2soQkIpOwogCkBAIC04MDQsOSArODcxLDE3IEBACiAgICAgICAgIGlmIChDbG9zdXJlSGFzUmVmU2VtYW50aWNzKQogICAgICAgICAgIEJ1aWxkZXIuY3JlYXRlUmVsZWFzZVZhbHVlKExvYywgU0lMVmFsdWUoTmV3Q2xvc3VyZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5nZXREZWZhdWx0QXRvbWljaXR5KCkpOwotICAgICAgICBmb3IgKGF1dG8gUEFJIDogTmVlZHNSZWxlYXNlKQotICAgICAgICAgIEJ1aWxkZXIuY3JlYXRlUmVsZWFzZVZhbHVlKExvYywgU0lMVmFsdWUoUEFJKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLmdldERlZmF1bHRBdG9taWNpdHkoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBuZWVkVG9VcGRhdGVTdGFja05lc3RpbmcgfD0KKyAgICAgICAgICAgICAgQ2FsbFNpdGVEZXNjLmRlc3Ryb3lJZlBhcnRpYWxBcHBseVN0YWNrKEJ1aWxkZXIsIE5ld0Nsb3N1cmUpOworICAgICAgICBmb3IgKGF1dG8gUEFJIDogTmVlZHNSZWxlYXNlKSB7CisgICAgICAgICAgaWYgKFBBSS0+aXNPblN0YWNrKCkpCisgICAgICAgICAgICBuZWVkVG9VcGRhdGVTdGFja05lc3RpbmcgfD0KKyAgICAgICAgICAgICAgICBDYWxsU2l0ZURlc2MuZGVzdHJveUlmUGFydGlhbEFwcGx5U3RhY2soQnVpbGRlciwgUEFJKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBCdWlsZGVyLmNyZWF0ZVJlbGVhc2VWYWx1ZShMb2MsIFNJTFZhbHVlKFBBSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLmdldERlZmF1bHRBdG9taWNpdHkoKSk7CisgICAgICAgIH0KICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAKQEAgLTgyNSwxMSArOTAwLDIyIEBACiAgICAgICBpZiAoQ2xvc3VyZUhhc1JlZlNlbWFudGljcykKICAgICAgICAgQnVpbGRlci5jcmVhdGVSZWxlYXNlVmFsdWUoTG9jLCBTSUxWYWx1ZShOZXdDbG9zdXJlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5nZXREZWZhdWx0QXRvbWljaXR5KCkpOwotICAgICAgZm9yIChhdXRvIFBBSSA6IE5lZWRzUmVsZWFzZSkKLSAgICAgICAgQnVpbGRlci5jcmVhdGVSZWxlYXNlVmFsdWUoTG9jLCBTSUxWYWx1ZShQQUkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLmdldERlZmF1bHRBdG9taWNpdHkoKSk7CisgICAgICBlbHNlCisgICAgICAgIG5lZWRUb1VwZGF0ZVN0YWNrTmVzdGluZyB8PQorICAgICAgICAgICAgQ2FsbFNpdGVEZXNjLmRlc3Ryb3lJZlBhcnRpYWxBcHBseVN0YWNrKEJ1aWxkZXIsIE5ld0Nsb3N1cmUpOworICAgICAgZm9yIChhdXRvIFBBSSA6IE5lZWRzUmVsZWFzZSkgeworICAgICAgICBpZiAoUEFJLT5pc09uU3RhY2soKSkKKyAgICAgICAgICBuZWVkVG9VcGRhdGVTdGFja05lc3RpbmcgfD0KKyAgICAgICAgICAgICAgQ2FsbFNpdGVEZXNjLmRlc3Ryb3lJZlBhcnRpYWxBcHBseVN0YWNrKEJ1aWxkZXIsIFBBSSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBCdWlsZGVyLmNyZWF0ZVJlbGVhc2VWYWx1ZShMb2MsIFNJTFZhbHVlKFBBSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5nZXREZWZhdWx0QXRvbWljaXR5KCkpOworICAgICAgfQogICAgIH0KICAgfQorICBpZiAobmVlZFRvVXBkYXRlU3RhY2tOZXN0aW5nKSB7CisgICAgU3RhY2tOZXN0aW5nKCkuY29ycmVjdFN0YWNrTmVzdGluZyhDbG9uZWQpOworICB9CiB9CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC05MTMsNiArOTk5LDEwIEBACiAgICAgcmV0dXJuIG1hcmtSZWFic3RyYWN0aW9uUGFydGlhbEFwcGx5QXNVc2VkKEZpcnN0Q2xvc3VyZSwgQ3Z0LT5nZXRPcGVyYW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWRSZWFic3RyYWN0aW9uQ2xvc3VyZSk7CiAgIH0KKyAgaWYgKGF1dG8gTUQgPSBkeW5fY2FzdDxNYXJrRGVwZW5kZW5jZUluc3Q+KEN1cnJlbnQpKSB7CisgICAgcmV0dXJuIG1hcmtSZWFic3RyYWN0aW9uUGFydGlhbEFwcGx5QXNVc2VkKEZpcnN0Q2xvc3VyZSwgTUQtPmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWRSZWFic3RyYWN0aW9uQ2xvc3VyZSk7CisgIH0KICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3QgaW5zdHJ1Y3Rpb24iKTsKIH0KIApAQCAtOTk0LDYgKzEwODQsMTQgQEAKICAgICAgIC8vIExpdmUgcmFuZ2UgZW5kIHBvaW50cy4KICAgICAgIFNtYWxsVmVjdG9yPFNJTEluc3RydWN0aW9uICosIDg+IFVzZVBvaW50czsKIAorICAgICAgLy8gU2V0IG9mIHBvc3NpYmxlIGFyZ3VtZW50cyBmb3IgbWFya19kZXBlbmRlbmNlLiBUaGUgYmFzZSBvZiBhCisgICAgICAvLyBtYXJrX2RlcGVuZGVuY2Ugd2UgY29weSBtdXN0IGJlIGF2YWlsYWJsZSBpbiB0aGUgc3BlY2lhbGl6ZWQgZnVuY3Rpb24uCisgICAgICBsbHZtOjpTbWFsbFNldDxTSUxWYWx1ZSwgMTY+IFBvc3NpYmxlTWFya0RlcGVuZGVuY2VCYXNlczsKKyAgICAgIGlmIChhdXRvICpQQSA9IGR5bl9jYXN0PFBhcnRpYWxBcHBseUluc3Q+KENsb3N1cmVJbnN0KSkgeworICAgICAgICBmb3IgKGF1dG8gT3BkIDogUEEtPmdldEFyZ3VtZW50cygpKQorICAgICAgICAgIFBvc3NpYmxlTWFya0RlcGVuZGVuY2VCYXNlcy5pbnNlcnQoT3BkKTsKKyAgICAgIH0KKwogICAgICAgYm9vbCBIYXZlVXNlZFJlYWJzdHJhY3Rpb24gPSBmYWxzZTsKICAgICAgIC8vIFVzZXMgbWF5IGdyb3cgaW4gdGhpcyBsb29wLgogICAgICAgZm9yIChzaXplX3QgVXNlSW5kZXggPSAwOyBVc2VJbmRleCA8IFVzZXMuc2l6ZSgpOyArK1VzZUluZGV4KSB7CkBAIC0xMDA0LDEwICsxMTAyLDEyIEBACiAgICAgICAgIGlmIChhdXRvICpDRkkgPSBkeW5fY2FzdDxDb252ZXJ0RnVuY3Rpb25JbnN0PihVc2UtPmdldFVzZXIoKSkpIHsKICAgICAgICAgICAvLyBQdXNoIFVzZXMgaW4gcmV2ZXJzZSBvcmRlciBzbyB0aGV5IGFyZSB2aXNpdGVkIGluIGZvcndhcmQgb3JkZXIuCiAgICAgICAgICAgVXNlcy5hcHBlbmQoQ0ZJLT5nZXRVc2VzKCkuYmVnaW4oKSwgQ0ZJLT5nZXRVc2VzKCkuZW5kKCkpOworICAgICAgICAgIFBvc3NpYmxlTWFya0RlcGVuZGVuY2VCYXNlcy5pbnNlcnQoQ0ZJKTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoYXV0byAqQ3Z0ID0gZHluX2Nhc3Q8Q29udmVydEVzY2FwZVRvTm9Fc2NhcGVJbnN0PihVc2UtPmdldFVzZXIoKSkpIHsKICAgICAgICAgICBVc2VzLmFwcGVuZChDdnQtPmdldFVzZXMoKS5iZWdpbigpLCBDdnQtPmdldFVzZXMoKS5lbmQoKSk7CisgICAgICAgICAgUG9zc2libGVNYXJrRGVwZW5kZW5jZUJhc2VzLmluc2VydChDdnQpOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTEwMjUsMTEgKzExMjUsMjkgQEAKICAgICAgICAgICAgICAgICAgIC5nZXRBczxTSUxGdW5jdGlvblR5cGU+KCkKICAgICAgICAgICAgICAgICAgIC0+aXNUcml2aWFsTm9Fc2NhcGUoKSkgewogICAgICAgICAgICAgVXNlcy5hcHBlbmQoUEEtPmdldFVzZXMoKS5iZWdpbigpLCBQQS0+Z2V0VXNlcygpLmVuZCgpKTsKKyAgICAgICAgICAgIFBvc3NpYmxlTWFya0RlcGVuZGVuY2VCYXNlcy5pbnNlcnQoUEEpOwogICAgICAgICAgICAgSGF2ZVVzZWRSZWFic3RyYWN0aW9uID0gdHJ1ZTsKICAgICAgICAgICB9CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBMb29rIHRocm91Z2ggbWFya19kZXBlbmRlbmNlIG9uIHBhcnRpYWxfYXBwbHkgW3N0YWNrXS4KKyAgICAgICAgaWYgKGF1dG8gKk1EID0gZHluX2Nhc3Q8TWFya0RlcGVuZGVuY2VJbnN0PihVc2UtPmdldFVzZXIoKSkpIHsKKyAgICAgICAgICAvLyBXZSBjYW4ndCBjb3B5IGEgY2xvc3VyZSBpZiB0aGUgbWFya19kZXBlbmRlbmNlIGJhc2UgaXMgbm90CisgICAgICAgICAgLy8gYXZhaWxhYmxlIGluIHRoZSBzcGVjaWFsaXplZCBmdW5jdGlvbi4KKyAgICAgICAgICBpZiAoIVBvc3NpYmxlTWFya0RlcGVuZGVuY2VCYXNlcy5jb3VudChNRC0+Z2V0QmFzZSgpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGlmIChNRC0+Z2V0VmFsdWUoKSA9PSBVc2UtPmdldCgpICYmCisgICAgICAgICAgICAgIE1ELT5nZXRWYWx1ZSgpLT5nZXRUeXBlKCkuaXM8U0lMRnVuY3Rpb25UeXBlPigpICYmCisgICAgICAgICAgICAgIE1ELT5nZXRWYWx1ZSgpCisgICAgICAgICAgICAgICAgICAtPmdldFR5cGUoKQorICAgICAgICAgICAgICAgICAgLmNhc3RUbzxTSUxGdW5jdGlvblR5cGU+KCkKKyAgICAgICAgICAgICAgICAgIC0+aXNUcml2aWFsTm9Fc2NhcGUoKSkgeworICAgICAgICAgICAgVXNlcy5hcHBlbmQoTUQtPmdldFVzZXMoKS5iZWdpbigpLCBNRC0+Z2V0VXNlcygpLmVuZCgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIC8vIElmIHRoaXMgdXNlIGlzIG5vdCBhIGZ1bGwgYXBwbHkgc2l0ZSB0aGF0IHdlIGNhbiBwcm9jZXNzIG9yIGFuIGFwcGx5CiAgICAgICAgIC8vIGluc3Qgd2l0aCBzdWJzdGl0dXRpb25zLCB0aGVyZSBpcyBub3RoaW5nIGludGVyZXN0aW5nIGZvciB1cyB0byBkbywKICAgICAgICAgLy8gc28gY29udGludWUuLi4KZGlmZiAtLWdpdCBhL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L0FjY2Vzc0VuZm9yY2VtZW50U2VsZWN0aW9uLmNwcCBiL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L0FjY2Vzc0VuZm9yY2VtZW50U2VsZWN0aW9uLmNwcAppbmRleCBlZmFlM2JhLi45YjM1NmUxIDEwMDY0NAotLS0gYS9saWIvU0lMT3B0aW1pemVyL01hbmRhdG9yeS9BY2Nlc3NFbmZvcmNlbWVudFNlbGVjdGlvbi5jcHAKKysrIGIvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvQWNjZXNzRW5mb3JjZW1lbnRTZWxlY3Rpb24uY3BwCkBAIC01MDgsNiArNTA4LDggQEAKICAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6UmV0YWluVmFsdWVJbnN0OgogICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpSZWxlYXNlVmFsdWVJbnN0OgogICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpFbmRCb3Jyb3dJbnN0OgorICAgIC8vIHBhcnRpYWxfYXBwbHkgW3N0YWNrXSBpcyBtYXRjaGVkIHdpdGggZGVhbGxvY19zdGFjay4KKyAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6RGVhbGxvY1N0YWNrSW5zdDoKICAgICAgIC8vIEJlbmlnbiB1c2UuCiAgICAgICByZXR1cm47CiAgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OlR1cGxlRXh0cmFjdEluc3Q6CmRpZmYgLS1naXQgYS9saWIvU0lMT3B0aW1pemVyL01hbmRhdG9yeS9DbG9zdXJlTGlmZXRpbWVGaXh1cC5jcHAgYi9saWIvU0lMT3B0aW1pemVyL01hbmRhdG9yeS9DbG9zdXJlTGlmZXRpbWVGaXh1cC5jcHAKaW5kZXggZjAwZjhlYy4uYmU0OTY4NSAxMDA2NDQKLS0tIGEvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvQ2xvc3VyZUxpZmV0aW1lRml4dXAuY3BwCisrKyBiL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L0Nsb3N1cmVMaWZldGltZUZpeHVwLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgInN3aWZ0L1NJTE9wdGltaXplci9QYXNzTWFuYWdlci9UcmFuc2Zvcm1zLmgiCiAjaW5jbHVkZSAic3dpZnQvU0lMT3B0aW1pemVyL1V0aWxzL0NGRy5oIgogI2luY2x1ZGUgInN3aWZ0L1NJTE9wdGltaXplci9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgInN3aWZ0L1NJTE9wdGltaXplci9VdGlscy9TdGFja05lc3RpbmcuaCIKIAogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgogCkBAIC0xODYsOSArMTg3LDE0OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlTm9uRGVidWdOb25SZWZDb3VudFVzZXIsIE1lbW9pemVkKSk7CiB9CiAKKy8vLyBJbnNlcnQgYSBtYXJrX2RlcGVuZGVuY2UgZm9yIGFueSBub24tdHJpdmlhbCBhcmd1bWVudCBvZiBhIHBhcnRpYWxfYXBwbHkuCitzdGF0aWMgU0lMVmFsdWUgaW5zZXJ0TWFya0RlcGVuZGVuY2VGb3JDYXB0dXJlZEFyZ3VtZW50cyhQYXJ0aWFsQXBwbHlJbnN0ICpQQUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSUxCdWlsZGVyICZCKSB7CisgIFNJTFZhbHVlIGN1cnIoUEFJKTsKKyAgLy8gTWFyayBkZXBlbmRlbmNlIG9uIGFsbCBub24tdHJpdmlhbCBhcmd1bWVudHMuCisgIGZvciAoYXV0byAmYXJnIDogUEFJLT5nZXRBcmd1bWVudE9wZXJhbmRzKCkpIHsKKyAgICBpZiAoYXJnLmdldCgpLT5nZXRUeXBlKCkuaXNUcml2aWFsKFBBSS0+Z2V0TW9kdWxlKCkpKQorICAgICAgY29udGludWU7CisgICAgY3VyciA9IEIuY3JlYXRlTWFya0RlcGVuZGVuY2UoUEFJLT5nZXRMb2MoKSwgY3VyciwgYXJnLmdldCgpKTsKKyAgfQorCisgIHJldHVybiBjdXJyOworfQorCisvLy8gUmV3cml0ZSBhIHBhcnRpYWxfYXBwbHkgY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgc2VxdWVuY2Ugd2l0aCBhIHNpbmdsZQorLy8vIGFwcGx5L3RyeV9hcHBseSB1c2VyIHRvIGEgcGFydGlhbF9hcHBseSBbc3RhY2tdIHRlcm1pbmF0ZWQgd2l0aCBhCisvLy8gZGVhbGxvY19zdGFjayBwbGFjZWQgYWZ0ZXIgdGhlIGFwcGx5LgorLy8vCisvLy8gICAlcCA9IHBhcnRpYWxfYXBwbHkgJWYoJWEsICViKQorLy8vICAgJW5lID0gY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgJXAKKy8vLyAgIGFwcGx5ICVmMiglcCkKKy8vLyAgIGRlc3Ryb3lfdmFsdWUgJXAKKy8vLworLy8vICAgID0+CisvLy8KKy8vLyAgICVwID0gcGFydGlhbF9hcHBseSBbc3RhY2tdICVmKCVhLCAlYikKKy8vLyAgICVtZCA9IG1hcmtfZGVwZW5kZW5jZSAlcCBvbiAlYQorLy8vICAgJW1kMiA9IG1hcmtfZGVwZW5kZW5jZSAlbWQgb24gJWIKKy8vLyAgIGFwcGx5ICVmMiglbWQyKQorLy8vICAgZGVhbGxvY19zdGFjayAlcAorLy8vICAgZGVzdHJveV92YWx1ZSAlYQorLy8vICAgZGVzdHJveV92YWx1ZSAlYgorLy8vCisvLy8gTm90ZTogSWYgdGhlIHJld3JpdGUgc3VjY2VlZGVkIHdlIGhhdmUgaW5zZXJ0ZWQgYSBkZWFsbG9jX3N0YWNrLiBUaGlzCisvLy8gZGVhbGxvY19zdGFjayBzdGlsbCBuZWVkcyB0byBiZSBiYWxhbmNlZCB3aXRoIG90aGVyIGRlYWxsb2Nfc3RhY2tzIGkuZSB0aGUKKy8vLyBjYWxsZXIgbmVlZHMgdG8gdXNlIHRoZSBTdGFja05lc3RpbmcgdXRpbGl0eSB0byB1cGRhdGUgdGhlIGRlYWxsb2Nfc3RhY2sKKy8vLyBuZXN0aW5nLgorc3RhdGljIGJvb2wgdHJ5UmV3cml0ZVRvUGFydGlhbEFwcGx5U3RhY2soCisgICAgU0lMTG9jYXRpb24gJmxvYywgUGFydGlhbEFwcGx5SW5zdCAqb3JpZ1BBLAorICAgIENvbnZlcnRFc2NhcGVUb05vRXNjYXBlSW5zdCAqY3Z0LCBTSUxJbnN0cnVjdGlvbiAqc2luZ2xlQXBwbHlVc2VyLAorICAgIFNJTEJhc2ljQmxvY2s6Oml0ZXJhdG9yICZhZHZhbmNlSWZEZWxldGUsCisgICAgbGx2bTo6RGVuc2VNYXA8U0lMSW5zdHJ1Y3Rpb24gKiwgU0lMSW5zdHJ1Y3Rpb24gKj4gJk1lbW9pemVkKSB7CisKKyAgYXV0byAqY29udmVydE9yUGFydGlhbEFwcGx5ID0gY2FzdDxTaW5nbGVWYWx1ZUluc3RydWN0aW9uPihvcmlnUEEpOworICBpZiAoY3Z0LT5nZXRPcGVyYW5kKCkgIT0gb3JpZ1BBKQorICAgIGNvbnZlcnRPclBhcnRpYWxBcHBseSA9IGNhc3Q8Q29udmVydEZ1bmN0aW9uSW5zdD4oY3Z0LT5nZXRPcGVyYW5kKCkpOworCisgIC8vIFdoZW5ldmVyIHdlIGRlbGV0ZSBhbiBpbnN0cnVjdGlvbiBhZHZhbmNlIHRoZSBpdGVyYXRvciBhbmQgcmVtb3ZlIHRoZQorICAvLyBpbnN0cnVjdGlvbiBmcm9tIHRoZSBtZW1vaXplZCBtYXAuCisgIGF1dG8gc2F2ZURlbGV0ZUluc3QgPSBbJl0oU0lMSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBpZiAoJiphZHZhbmNlSWZEZWxldGUgPT0gSSkKKyAgICAgIGFkdmFuY2VJZkRlbGV0ZSsrOworICAgIE1lbW9pemVkLmVyYXNlKEkpOworICAgIEktPmVyYXNlRnJvbVBhcmVudCgpOworICB9OworCisgIC8vIExvb2sgZm9yIGEgc2luZ2xlIG5vbiByZWYgY291bnQgdXNlciBvZiB0aGUgcGFydGlhbF9hcHBseS4KKyAgU21hbGxWZWN0b3I8U0lMSW5zdHJ1Y3Rpb24gKiwgOD4gcmVmQ291bnRJbnN0czsKKyAgU0lMSW5zdHJ1Y3Rpb24gKnNpbmdsZU5vbkRlYnVnTm9uUmVmQ291bnRVc2VyID0gbnVsbHB0cjsKKyAgZm9yIChhdXRvICpVc3IgOiBnZXROb25EZWJ1Z1VzZXMoY29udmVydE9yUGFydGlhbEFwcGx5KSkgeworICAgIGF1dG8gKkkgPSBVc3ItPmdldFVzZXIoKTsKKyAgICBpZiAob25seUFmZmVjdHNSZWZDb3VudChJKSkgeworICAgICAgcmVmQ291bnRJbnN0cy5wdXNoX2JhY2soSSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNpbmdsZU5vbkRlYnVnTm9uUmVmQ291bnRVc2VyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHNpbmdsZU5vbkRlYnVnTm9uUmVmQ291bnRVc2VyID0gSTsKKyAgfQorCisgIFNJTEJ1aWxkZXJXaXRoU2NvcGUgQihjdnQpOworCisgIC8vIFRoZSBjb252ZXJ0X2VzY2FwZV90b19ub2VzY2FwZSBpcyB0aGUgb25seSB1c2VyIG9mIHRoZSBwYXJ0aWFsX2FwcGx5LgorICAvLyBDb252ZXJ0IHRvIGEgcGFydGlhbF9hcHBseSBbc3RhY2tdLgorICBTbWFsbFZlY3RvcjxTSUxWYWx1ZSwgOD4gYXJnczsKKyAgZm9yIChhdXRvICZhcmcgOiBvcmlnUEEtPmdldEFyZ3VtZW50T3BlcmFuZHMoKSkKKyAgICBhcmdzLnB1c2hfYmFjayhhcmcuZ2V0KCkpOworICBhdXRvIG5ld1BBID0gQi5jcmVhdGVQYXJ0aWFsQXBwbHkoCisgICAgICBvcmlnUEEtPmdldExvYygpLCBvcmlnUEEtPmdldENhbGxlZSgpLCBvcmlnUEEtPmdldFN1YnN0aXR1dGlvbk1hcCgpLCBhcmdzLAorICAgICAgb3JpZ1BBLT5nZXRUeXBlKCkuZ2V0QXM8U0lMRnVuY3Rpb25UeXBlPigpLT5nZXRDYWxsZWVDb252ZW50aW9uKCksCisgICAgICBQYXJ0aWFsQXBwbHlJbnN0OjpPblN0YWNrS2luZDo6T25TdGFjayk7CisKKyAgLy8gSW5zZXJ0IG1hcmtfZGVwZW5kZW5jZSBmb3IgYW55IG5vbi10cml2aWFsIG9wZXJhbmQgdG8gdGhlIHBhcnRpYWxfYXBwbHkuCisgIGF1dG8gY2xvc3VyZSA9IGluc2VydE1hcmtEZXBlbmRlbmNlRm9yQ2FwdHVyZWRBcmd1bWVudHMobmV3UEEsIEIpOworCisgIC8vIE9wdGlvbmFsbHksIHJlcGxhY2UgdGhlIGNvbnZlcnRfZnVuY3Rpb24gaW5zdHJ1Y3Rpb24uCisgIGlmIChhdXRvICpjb252ZXJ0ID0gZHluX2Nhc3Q8Q29udmVydEZ1bmN0aW9uSW5zdD4oY29udmVydE9yUGFydGlhbEFwcGx5KSkgeworICAgIGF1dG8gb3JpZ1R5ID0gY29udmVydC0+Z2V0VHlwZSgpLmNhc3RUbzxTSUxGdW5jdGlvblR5cGU+KCk7CisgICAgYXV0byBvcmlnV2l0aE5vRXNjYXBlID0gU0lMVHlwZTo6Z2V0UHJpbWl0aXZlT2JqZWN0VHlwZSgKKyAgICAgICAgb3JpZ1R5LT5nZXRXaXRoRXh0SW5mbyhvcmlnVHktPmdldEV4dEluZm8oKS53aXRoTm9Fc2NhcGUoKSkpOworICAgIGNsb3N1cmUgPSBCLmNyZWF0ZUNvbnZlcnRGdW5jdGlvbihjb252ZXJ0LT5nZXRMb2MoKSwgY2xvc3VyZSwgb3JpZ1dpdGhOb0VzY2FwZSwgZmFsc2UpOworICAgIGNvbnZlcnQtPnJlcGxhY2VBbGxVc2VzV2l0aChjbG9zdXJlKTsKKyAgfQorCisgIC8vIFJlcGxhY2UgdGhlIGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIHVzZXMgd2l0aCB0aGUgbmV3CisgIC8vIHBhcnRpYWxfYXBwbHkgW3N0YWNrXS4KKyAgY3Z0LT5yZXBsYWNlQWxsVXNlc1dpdGgoY2xvc3VyZSk7CisgIHNhdmVEZWxldGVJbnN0KGN2dCk7CisKKyAgLy8gRGVsZXRlIHRoZSByZWYgY291bnQgb3BlcmF0aW9ucyBvbiB0aGUgb3JpZ2luYWwgcGFydGlhbF9hcHBseS4KKyAgZm9yIChhdXRvICpyZWZJbnN0IDogcmVmQ291bnRJbnN0cykKKyAgICBzYXZlRGVsZXRlSW5zdChyZWZJbnN0KTsKKyAgY29udmVydE9yUGFydGlhbEFwcGx5LT5yZXBsYWNlQWxsVXNlc1dpdGgobmV3UEEpOworICBpZiAoY29udmVydE9yUGFydGlhbEFwcGx5ICE9IG9yaWdQQSkKKyAgICBzYXZlRGVsZXRlSW5zdChjb252ZXJ0T3JQYXJ0aWFsQXBwbHkpOworICBzYXZlRGVsZXRlSW5zdChvcmlnUEEpOworCisgIC8vIEluc2VydCBkZXN0cm95cyBvZiBhcmd1bWVudHMgYWZ0ZXIgdGhlIGFwcGx5IGFuZCB0aGUgZGVhbGxvY19zdGFjay4KKyAgaWYgKGF1dG8gKkFwcGx5ID0gZHluX2Nhc3Q8QXBwbHlJbnN0PihzaW5nbGVBcHBseVVzZXIpKSB7CisgICAgYXV0byBJbnNlcnRQdCA9IHN0ZDo6bmV4dChTSUxCYXNpY0Jsb2NrOjppdGVyYXRvcihBcHBseSkpOworICAgIC8vIERvbid0IGluc2VydCBkZWFsbG9jX3N0YWNrcyBhdCB1bnJlYWNoYWJsZS4KKyAgICBpZiAoaXNhPFVucmVhY2hhYmxlSW5zdD4oKkluc2VydFB0KSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIFNJTEJ1aWxkZXJXaXRoU2NvcGUgQjMoSW5zZXJ0UHQpOworICAgIEIzLmNyZWF0ZURlYWxsb2NTdGFjayhsb2MsIG5ld1BBKTsKKyAgICBpbnNlcnREZXN0cm95T2ZDYXB0dXJlZEFyZ3VtZW50cyhuZXdQQSwgQjMpOworICB9IGVsc2UgaWYgKGF1dG8gKlRyeSA9IGR5bl9jYXN0PFRyeUFwcGx5SW5zdD4oc2luZ2xlQXBwbHlVc2VyKSkgeworICAgIGZvciAoYXV0byAqU3VjY0JCIDogVHJ5LT5nZXRTdWNjZXNzb3JCbG9ja3MoKSkgeworICAgICAgU0lMQnVpbGRlcldpdGhTY29wZSBCMyhTdWNjQkItPmJlZ2luKCkpOworICAgICAgQjMuY3JlYXRlRGVhbGxvY1N0YWNrKGxvYywgbmV3UEEpOworICAgICAgaW5zZXJ0RGVzdHJveU9mQ2FwdHVyZWRBcmd1bWVudHMobmV3UEEsIEIzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBGdWxsQXBwbHlTaXRlIGluc3RydWN0aW9uIGtpbmQiKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIFNJTFZhbHVlIHNraXBDb252ZXJ0KFNJTFZhbHVlIHYpIHsKKyAgYXV0byBjdnQgPSBkeW5fY2FzdDxDb252ZXJ0RnVuY3Rpb25JbnN0Pih2KTsKKyAgaWYgKCFjdnQpCisgICAgcmV0dXJuIHY7CisgIGF1dG8gKnBhID0gZHluX2Nhc3Q8UGFydGlhbEFwcGx5SW5zdD4oY3Z0LT5nZXRPcGVyYW5kKCkpOworICBpZiAoIXBhIHx8ICFwYS0+aGFzT25lVXNlKCkpCisgICAgcmV0dXJuIHY7CisgIHJldHVybiBwYTsKK30KKwogc3RhdGljIGJvb2wgdHJ5RXh0ZW5kTGlmZXRpbWVUb0xhc3RVc2UoCiAgICAgQ29udmVydEVzY2FwZVRvTm9Fc2NhcGVJbnN0ICpDdnQsCi0gICAgbGx2bTo6RGVuc2VNYXA8U0lMSW5zdHJ1Y3Rpb24gKiwgU0lMSW5zdHJ1Y3Rpb24gKj4gJk1lbW9pemVkKSB7CisgICAgbGx2bTo6RGVuc2VNYXA8U0lMSW5zdHJ1Y3Rpb24gKiwgU0lMSW5zdHJ1Y3Rpb24gKj4gJk1lbW9pemVkLAorICAgIFNJTEJhc2ljQmxvY2s6Oml0ZXJhdG9yICZBZHZhbmNlSWZEZWxldGUpIHsKICAgLy8gSWYgdGhlcmUgaXMgYSBzaW5nbGUgdXNlciB0aGF0IGlzIGFuIGFwcGx5IHRoaXMgaXMgc2ltcGxlOiBleHRlbmQgdGhlCiAgIC8vIGxpZmV0aW1lIG9mIHRoZSBvcGVyYW5kIHVudGlsIGFmdGVyIHRoZSBhcHBseS4KICAgYXV0byBTaW5nbGVVc2VyID0gbG9va1Rocm91Z2hSZWJhc3RyYWN0aW9uVXNlcnMoQ3Z0LCBNZW1vaXplZCk7CkBAIC0yMDMsNiArMzQzLDEyIEBACiAgICAgfQogCiAgICAgYXV0byBsb2MgPSBSZWd1bGFyTG9jYXRpb246OmdldEF1dG9HZW5lcmF0ZWRMb2NhdGlvbigpOworICAgIGF1dG8gb3JpZ1BBID0gZHluX2Nhc3Q8UGFydGlhbEFwcGx5SW5zdD4oc2tpcENvbnZlcnQoQ3Z0LT5nZXRPcGVyYW5kKCkpKTsKKyAgICBpZiAob3JpZ1BBICYmIHRyeVJld3JpdGVUb1BhcnRpYWxBcHBseVN0YWNrKAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgb3JpZ1BBLCBDdnQsIFNpbmdsZUFwcGx5VXNlci5nZXRJbnN0cnVjdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2VJZkRlbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBNZW1vaXplZCkpCisgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIC8vIEluc2VydCBhIGNvcHkgYXQgdGhlIGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtub3RfZ3VhcmFudGVlZF0gYW5kCiAgICAgLy8gY2hhbmdlIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgZ3VhcmFudGVlZCBmb3JtLgpAQCAtNDczLDcgKzYxOSw3IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCBmaXh1cENsb3N1cmVMaWZldGltZXMoU0lMRnVuY3Rpb24gJkZuKSB7CitzdGF0aWMgYm9vbCBmaXh1cENsb3N1cmVMaWZldGltZXMoU0lMRnVuY3Rpb24gJkZuLCBib29sICZjaGVja1N0YWNrTmVzdGluZykgewogICBib29sIENoYW5nZWQgPSBmYWxzZTsKIAogICAvLyB0cnlFeHRlbmRMaWZldGltZVRvTGFzdFVzZSB1c2VzIGEgY2FjaGUgb2YgcmVjdXJzaXZlIGluc3RydWN0aW9uIHVzZQpAQCAtNTA1LDggKzY1MSw5IEBACiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCi0gICAgICBpZiAodHJ5RXh0ZW5kTGlmZXRpbWVUb0xhc3RVc2UoQ3Z0LCBNZW1vaXplZFF1ZXJpZXMpKSB7CisgICAgICBpZiAodHJ5RXh0ZW5kTGlmZXRpbWVUb0xhc3RVc2UoQ3Z0LCBNZW1vaXplZFF1ZXJpZXMsIEkpKSB7CiAgICAgICAgIENoYW5nZWQgfD0gdHJ1ZTsKKyAgICAgICAgY2hlY2tTdGFja05lc3RpbmcgPSB0cnVlOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIApAQCAtNTM3LDggKzY4NCwyMSBAQAogCiAgICAgLy8gRml4dXAgY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgW25vdF9ndWFyYW50ZWVkXSBhbmQKICAgICAvLyBjb3B5X2Jsb2NrX3dpdGhvdXRfZXNjYXBpbmcgaW5zdHJ1Y3Rpb25zLgotICAgIGlmIChmaXh1cENsb3N1cmVMaWZldGltZXMoKmdldEZ1bmN0aW9uKCkpKQotICAgICAgaW52YWxpZGF0ZUFuYWx5c2lzKFNJTEFuYWx5c2lzOjpJbnZhbGlkYXRpb25LaW5kOjpGdW5jdGlvbkJvZHkpOworCisgICAgYm9vbCBjaGVja1N0YWNrTmVzdGluZyA9IGZhbHNlOworICAgIGJvb2wgbW9kaWZpZWRDRkcgPSBmYWxzZTsKKworICAgIGlmIChmaXh1cENsb3N1cmVMaWZldGltZXMoKmdldEZ1bmN0aW9uKCksIGNoZWNrU3RhY2tOZXN0aW5nKSkgeworICAgICAgaWYgKGNoZWNrU3RhY2tOZXN0aW5nKXsKKyAgICAgICAgU3RhY2tOZXN0aW5nIFNOOworICAgICAgICBtb2RpZmllZENGRyA9CisgICAgICAgICAgICBTTi5jb3JyZWN0U3RhY2tOZXN0aW5nKGdldEZ1bmN0aW9uKCkpID09IFN0YWNrTmVzdGluZzo6Q2hhbmdlczo6Q0ZHOworICAgICAgfQorICAgICAgaWYgKG1vZGlmaWVkQ0ZHKQorICAgICAgICBpbnZhbGlkYXRlQW5hbHlzaXMoU0lMQW5hbHlzaXM6OkludmFsaWRhdGlvbktpbmQ6OkZ1bmN0aW9uQm9keSk7CisgICAgICBlbHNlCisgICAgICAgIGludmFsaWRhdGVBbmFseXNpcyhTSUxBbmFseXNpczo6SW52YWxpZGF0aW9uS2luZDo6Q2FsbHNBbmRJbnN0cnVjdGlvbnMpOworICAgIH0KICAgICBMTFZNX0RFQlVHKGdldEZ1bmN0aW9uKCktPnZlcmlmeSgpKTsKIAogICB9CmRpZmYgLS1naXQgYS9saWIvU0lMT3B0aW1pemVyL01hbmRhdG9yeS9EaWFnbm9zZVN0YXRpY0V4Y2x1c2l2aXR5LmNwcCBiL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L0RpYWdub3NlU3RhdGljRXhjbHVzaXZpdHkuY3BwCmluZGV4IDdlZTYwZWMuLmU4YWZjNzEgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L0RpYWdub3NlU3RhdGljRXhjbHVzaXZpdHkuY3BwCisrKyBiL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L0RpYWdub3NlU3RhdGljRXhjbHVzaXZpdHkuY3BwCkBAIC05NTYsOCArOTU2LDEwIEBACiBzdGF0aWMgdm9pZCBjaGVja05vRXNjYXBlUGFydGlhbEFwcGx5VXNlKE9wZXJhbmQgKm9wZXIsIEZvbGxvd1VzZSBmb2xsb3dVc2VzKSB7CiAgIFNJTEluc3RydWN0aW9uICp1c2VyID0gb3Blci0+Z2V0VXNlcigpOwogCi0gIC8vIElnbm9yZSB1c2VzIHRoYXQgYXJlIHRvdGFsbHkgdW5pbnRlcmVzdGluZy4KLSAgaWYgKGlzSW5jaWRlbnRhbFVzZSh1c2VyKSB8fCBvbmx5QWZmZWN0c1JlZkNvdW50KHVzZXIpKQorICAvLyBJZ25vcmUgdXNlcyB0aGF0IGFyZSB0b3RhbGx5IHVuaW50ZXJlc3RpbmcuIHBhcnRpYWxfYXBwbHkgW3N0YWNrXSBpcworICAvLyB0ZXJtaW5hdGVkIGJ5IGEgZGVhbGxvY19zdGFjayBpbnN0cnVjdGlvbi4KKyAgaWYgKGlzSW5jaWRlbnRhbFVzZSh1c2VyKSB8fCBvbmx5QWZmZWN0c1JlZkNvdW50KHVzZXIpIHx8CisgICAgICBpc2E8RGVhbGxvY1N0YWNrSW5zdD4odXNlcikpCiAgICAgcmV0dXJuOwogCiAgIC8vIEJlZm9yZSBjaGVja2luZyBjb252ZXJzaW9ucyBpbiBnZW5lcmFsIGJlbG93IChnZXRTaW5nbGVWYWx1ZUNvcHlPckNhc3QpLApkaWZmIC0tZ2l0IGEvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvTWFuZGF0b3J5SW5saW5pbmcuY3BwIGIvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvTWFuZGF0b3J5SW5saW5pbmcuY3BwCmluZGV4IDM5MWU0OTMuLmE4ODkwYWIgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L01hbmRhdG9yeUlubGluaW5nLmNwcAorKysgYi9saWIvU0lMT3B0aW1pemVyL01hbmRhdG9yeS9NYW5kYXRvcnlJbmxpbmluZy5jcHAKQEAgLTM3Myw2ICszNzMsMTcgQEAKICAgICAgIHJldHVybiBUaGluVG9Ob2VzY2FwZUNhc3QtPmdldE9wZXJhbmQoKTsKICAgICB9CiAKKyAgICAvLyBJZ25vcmUgbWFya19kZXBlbmRlbmNlIHVzZXJzLiBBIHBhcnRpYWxfYXBwbHkgW3N0YWNrXSB1c2VzIHRoZW0gdG8gbWFyaworICAgIC8vIHRoZSBkZXBlbmRlbmNlIG9mIHRoZSB0cml2aWFsIGNsb3N1cmUgY29udGV4dCB2YWx1ZSBvbiB0aGUgY2FwdHVyZWQKKyAgICAvLyBhcmd1bWVudHMuCisgICAgaWYgKGF1dG8gKk1EID0gZHluX2Nhc3Q8TWFya0RlcGVuZGVuY2VJbnN0PihDYWxsZWVWYWx1ZSkpIHsKKyAgICAgIHdoaWxlIChNRCkgeworICAgICAgICBDYWxsZWVWYWx1ZSA9IE1ELT5nZXRWYWx1ZSgpOworICAgICAgICBNRCA9IGR5bl9jYXN0PE1hcmtEZXBlbmRlbmNlSW5zdD4oQ2FsbGVlVmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuIENhbGxlZVZhbHVlOworICAgIH0KKwogICAgIGF1dG8gKkNGSSA9IGR5bl9jYXN0PENvbnZlcnRFc2NhcGVUb05vRXNjYXBlSW5zdD4oQ2FsbGVlVmFsdWUpOwogICAgIGlmICghQ0ZJKQogICAgICAgcmV0dXJuIENhbGxlZVZhbHVlOwpkaWZmIC0tZ2l0IGEvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvUE1PTWVtb3J5VXNlQ29sbGVjdG9yLmNwcCBiL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L1BNT01lbW9yeVVzZUNvbGxlY3Rvci5jcHAKaW5kZXggYmZlZDU4Zi4uZWNmMzgwMSAxMDA2NDQKLS0tIGEvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvUE1PTWVtb3J5VXNlQ29sbGVjdG9yLmNwcAorKysgYi9saWIvU0lMT3B0aW1pemVyL01hbmRhdG9yeS9QTU9NZW1vcnlVc2VDb2xsZWN0b3IuY3BwCkBAIC0yMzgsMTMgKzIzOCw2IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSNkZWZpbmUgTkVWRVJfT1JfU09NRVRJTUVTX0xPQURBQkxFX0NIRUNLRURfUkVGX1NUT1JBR0UoTmFtZSwgLi4uKSAgICAgICAgICAgICBcCi0gIGlmIChpc2E8TG9hZCMjTmFtZSMjSW5zdD4oVXNlcikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVzZXMuZW1wbGFjZV9iYWNrKFVzZXIsIFBNT1VzZUtpbmQ6OkxvYWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNpbmNsdWRlICJzd2lmdC9BU1QvUmVmZXJlbmNlU3RvcmFnZS5kZWYiCi0KICAgICAvLyBTdG9yZXMgKnRvKiB0aGUgYWxsb2NhdGlvbiBhcmUgd3JpdGVzLgogICAgIGlmIChpc2E8U3RvcmVJbnN0PihVc2VyKSAmJiBVSS0+Z2V0T3BlcmFuZE51bWJlcigpID09IDEpIHsKICAgICAgIGlmIChQb2ludGVlVHlwZS5pczxUdXBsZVR5cGU+KCkpIHsKQEAgLTI1NCwzNCArMjQ3LDE1IEBACiAKICAgICAgIC8vIENvbWluZyBvdXQgb2YgU0lMR2VuLCB3ZSBhc3N1bWUgdGhhdCByYXcgc3RvcmVzIGFyZSBpbml0aWFsaXphdGlvbnMsCiAgICAgICAvLyB1bmxlc3MgdGhleSBoYXZlIHRyaXZpYWwgdHlwZSAod2hpY2ggd2UgY2xhc3NpZnkgYXMgSW5pdE9yQXNzaWduKS4KLSAgICAgIFBNT1VzZUtpbmQgS2luZDsKLSAgICAgIGlmIChJblN0cnVjdFN1YkVsZW1lbnQpCi0gICAgICAgIEtpbmQgPSBQTU9Vc2VLaW5kOjpQYXJ0aWFsU3RvcmU7Ci0gICAgICBlbHNlIGlmIChQb2ludGVlVHlwZS5pc1RyaXZpYWwoVXNlci0+Z2V0TW9kdWxlKCkpKQotICAgICAgICBLaW5kID0gUE1PVXNlS2luZDo6SW5pdE9yQXNzaWduOwotICAgICAgZWxzZQotICAgICAgICBLaW5kID0gUE1PVXNlS2luZDo6SW5pdGlhbGl6YXRpb247Ci0KKyAgICAgIGF1dG8gS2luZCA9IChbJl0oKSAtPiBQTU9Vc2VLaW5kIHsKKyAgICAgICAgaWYgKFBvaW50ZWVUeXBlLmlzVHJpdmlhbChVc2VyLT5nZXRNb2R1bGUoKSkpCisgICAgICAgICAgcmV0dXJuIFBNT1VzZUtpbmQ6OkluaXRPckFzc2lnbjsKKyAgICAgICAgcmV0dXJuIFBNT1VzZUtpbmQ6OkluaXRpYWxpemF0aW9uOworICAgICAgfSkoKTsKICAgICAgIFVzZXMuZW1wbGFjZV9iYWNrKFVzZXIsIEtpbmQpOwogICAgICAgY29udGludWU7CiAgICAgfQogCi0jZGVmaW5lIE5FVkVSX09SX1NPTUVUSU1FU19MT0FEQUJMRV9DSEVDS0VEX1JFRl9TVE9SQUdFKE5hbWUsIC4uLikgICAgICAgICAgICAgXAotICBpZiAoYXV0byAqU0kgPSBkeW5fY2FzdDxTdG9yZSMjTmFtZSMjSW5zdD4oVXNlcikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoVUktPmdldE9wZXJhbmROdW1iZXIoKSA9PSAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBQTU9Vc2VLaW5kIEtpbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKEluU3RydWN0U3ViRWxlbWVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgS2luZCA9IFBNT1VzZUtpbmQ6OlBhcnRpYWxTdG9yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBlbHNlIGlmIChTSS0+aXNJbml0aWFsaXphdGlvbk9mRGVzdCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBLaW5kID0gUE1PVXNlS2luZDo6SW5pdGlhbGl6YXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEtpbmQgPSBQTU9Vc2VLaW5kOjpBc3NpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgVXNlcy5lbXBsYWNlX2JhY2soVXNlciwgS2luZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jaW5jbHVkZSAic3dpZnQvQVNUL1JlZmVyZW5jZVN0b3JhZ2UuZGVmIgotCiAgICAgaWYgKGF1dG8gKkNBSSA9IGR5bl9jYXN0PENvcHlBZGRySW5zdD4oVXNlcikpIHsKICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb3B5IG9mIGEgdHVwbGUsIHdlIHNob3VsZCBzY2FsYXJpemUgaXQgc28gdGhhdCB3ZSBkb24ndAogICAgICAgLy8gaGF2ZSBhbiBhY2Nlc3MgdGhhdCBjcm9zc2VzIGVsZW1lbnRzLgpAQCAtMjk0LDE2ICsyNjgsMTcgQEAKICAgICAgIC8vIHRoZSBkZXN0aW5hdGlvbiwgdGhlbiB0aGlzIGlzIGFuIHVua25vd24gYXNzaWdubWVudC4gIE5vdGUgdGhhdCB3ZSdsbAogICAgICAgLy8gcmV2aXNpdCB0aGlzIGluc3RydWN0aW9uIGFuZCBhZGQgaXQgdG8gVXNlcyB0d2ljZSBpZiBpdCBpcyBib3RoIGEgbG9hZAogICAgICAgLy8gYW5kIHN0b3JlIHRvIHRoZSBzYW1lIGFnZ3JlZ2F0ZS4KLSAgICAgIFBNT1VzZUtpbmQgS2luZDsKLSAgICAgIGlmIChVSS0+Z2V0T3BlcmFuZE51bWJlcigpID09IDApCi0gICAgICAgIEtpbmQgPSBQTU9Vc2VLaW5kOjpMb2FkOwotICAgICAgZWxzZSBpZiAoSW5TdHJ1Y3RTdWJFbGVtZW50KQotICAgICAgICBLaW5kID0gUE1PVXNlS2luZDo6UGFydGlhbFN0b3JlOwotICAgICAgZWxzZSBpZiAoQ0FJLT5pc0luaXRpYWxpemF0aW9uT2ZEZXN0KCkpCi0gICAgICAgIEtpbmQgPSBQTU9Vc2VLaW5kOjpJbml0aWFsaXphdGlvbjsKLSAgICAgIGVsc2UKLSAgICAgICAgS2luZCA9IFBNT1VzZUtpbmQ6OkFzc2lnbjsKLQorICAgICAgLy8KKyAgICAgIC8vIElubGluZSBjb25zdHJ1Y3Rvci4KKyAgICAgIGF1dG8gS2luZCA9IChbJl0oKSAtPiBQTU9Vc2VLaW5kIHsKKyAgICAgICAgaWYgKFVJLT5nZXRPcGVyYW5kTnVtYmVyKCkgPT0gQ29weUFkZHJJbnN0OjpTcmMpCisgICAgICAgICAgcmV0dXJuIFBNT1VzZUtpbmQ6OkxvYWQ7CisgICAgICAgIGlmIChQb2ludGVlVHlwZS5pc1RyaXZpYWwoQ0FJLT5nZXRNb2R1bGUoKSkpCisgICAgICAgICAgcmV0dXJuIFBNT1VzZUtpbmQ6OkluaXRPckFzc2lnbjsKKyAgICAgICAgaWYgKENBSS0+aXNJbml0aWFsaXphdGlvbk9mRGVzdCgpKQorICAgICAgICAgIHJldHVybiBQTU9Vc2VLaW5kOjpJbml0aWFsaXphdGlvbjsKKyAgICAgICAgcmV0dXJuIFBNT1VzZUtpbmQ6OkFzc2lnbjsKKyAgICAgIH0pKCk7CiAgICAgICBVc2VzLmVtcGxhY2VfYmFjayhVc2VyLCBLaW5kKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L1BNT01lbW9yeVVzZUNvbGxlY3Rvci5oIGIvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvUE1PTWVtb3J5VXNlQ29sbGVjdG9yLmgKaW5kZXggMzQ4NTkwZC4uOWNlYjRlNCAxMDA2NDQKLS0tIGEvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvUE1PTWVtb3J5VXNlQ29sbGVjdG9yLmgKKysrIGIvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvUE1PTWVtb3J5VXNlQ29sbGVjdG9yLmgKQEAgLTExNiw5ICsxMTYsNiBAQAogICAvLy8gdmFsdWUuCiAgIEFzc2lnbiwKIAotICAvLy8gVGhlIGluc3RydWN0aW9uIGlzIGEgc3RvcmUgdG8gYSBtZW1iZXIgb2YgYSBsYXJnZXIgc3RydWN0IHZhbHVlLgotICBQYXJ0aWFsU3RvcmUsCi0KICAgLy8vIEFuIGluZGlyZWN0ICdpbm91dCcgcGFyYW1ldGVyIG9mIGFuIEFwcGx5IGluc3RydWN0aW9uLgogICBJbk91dFVzZSwKIApkaWZmIC0tZ2l0IGEvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvUHJlZGljdGFibGVNZW1PcHQuY3BwIGIvbGliL1NJTE9wdGltaXplci9NYW5kYXRvcnkvUHJlZGljdGFibGVNZW1PcHQuY3BwCmluZGV4IGE1ZjQxZjYuLjNhMzZjNzMgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxPcHRpbWl6ZXIvTWFuZGF0b3J5L1ByZWRpY3RhYmxlTWVtT3B0LmNwcAorKysgYi9saWIvU0lMT3B0aW1pemVyL01hbmRhdG9yeS9QcmVkaWN0YWJsZU1lbU9wdC5jcHAKQEAgLTkxMSw3ICs5MTEsNyBAQAogICBhc3NlcnQoKExvYWRVc2UuaXNWYWxpZCgpIHx8IFN0b3JlVXNlLmlzVmFsaWQoKSkgJiYKICAgICAgICAgICJ3ZSBzaG91bGQgaGF2ZSBhIGxvYWQgb3IgYSBzdG9yZSwgcG9zc2libHkgYm90aCIpOwogICBhc3NlcnQoU3RvcmVVc2UuaXNJbnZhbGlkKCkgfHwgU3RvcmVVc2UuS2luZCA9PSBBc3NpZ24gfHwKLSAgICAgICAgIFN0b3JlVXNlLktpbmQgPT0gUGFydGlhbFN0b3JlIHx8IFN0b3JlVXNlLktpbmQgPT0gSW5pdGlhbGl6YXRpb24pOworICAgICAgICAgU3RvcmVVc2UuS2luZCA9PSBJbml0aWFsaXphdGlvbiB8fCBTdG9yZVVzZS5LaW5kID09IEluaXRPckFzc2lnbik7CiAKICAgLy8gTm93IHRoYXQgd2UndmUgZW1pdHRlZCBhIGJ1bmNoIG9mIGluc3RydWN0aW9ucywgaW5jbHVkaW5nIGEgbG9hZCBhbmQgc3RvcmUKICAgLy8gYnV0IGFsc28gaW5jbHVkaW5nIG90aGVyIHN0dWZmLCB1cGRhdGUgdGhlIGludGVybmFsIHN0YXRlIG9mCkBAIC05MzAsNiArOTMwLDEyIEBACiAgICAgICAvLyBzb21ldGhpbmcgZWxzZSksIHRyYWNrIGl0IGFzIGFuIGFjY2Vzcy4KICAgICAgIGlmIChTdG9yZVVzZS5pc1ZhbGlkKCkpIHsKICAgICAgICAgU3RvcmVVc2UuSW5zdCA9IE5ld0luc3Q7CisgICAgICAgIC8vIElmIG91ciBzdG9yZSB1c2UgYnkgdGhlIGNvcHlfYWRkciBpcyBhbiBhc3NpZ24sIHRoZW4gd2Uga25vdyB0aGF0CisgICAgICAgIC8vIGJlZm9yZSB3ZSBzdG9yZSB0aGUgbmV3IHZhbHVlLCB3ZSBsb2FkZWQgdGhlIG9sZCB2YWx1ZSBpbXBseWluZyB0aGF0CisgICAgICAgIC8vIG91ciBzdG9yZSBpcyB0ZWNobmljYWxseSBpbml0aWFsaXppbmcgbWVtb3J5IHdoZW4gaXQgb2NjdXJzLiBTbworICAgICAgICAvLyBjaGFuZ2UgdGhlIGtpbmQgdG8gSW5pdGlhbGl6YXRpb24uCisgICAgICAgIGlmIChTdG9yZVVzZS5LaW5kID09IEFzc2lnbikKKyAgICAgICAgICBTdG9yZVVzZS5LaW5kID0gSW5pdGlhbGl6YXRpb247CiAgICAgICAgIE5vbkxvYWRVc2VzW05ld0luc3RdID0gVXNlcy5zaXplKCk7CiAgICAgICAgIFVzZXMucHVzaF9iYWNrKFN0b3JlVXNlKTsKICAgICAgIH0KQEAgLTk0OCwxMSArOTU0LDYgQEAKICAgICAgIH0KICAgICAgIGNvbnRpbnVlOwogCi0jZGVmaW5lIEFMV0FZU19PUl9TT01FVElNRVNfTE9BREFCTEVfQ0hFQ0tFRF9SRUZfU1RPUkFHRShOYW1lLCAuLi4pIFwKLSAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6TmFtZSMjUmV0YWluSW5zdDogXAotICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpOYW1lIyNSZWxlYXNlSW5zdDogXAotICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpTdHJvbmdSZXRhaW4jI05hbWUjI0luc3Q6Ci0jaW5jbHVkZSAic3dpZnQvQVNUL1JlZmVyZW5jZVN0b3JhZ2UuZGVmIgogICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpSZXRhaW5WYWx1ZUluc3Q6CiAgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OlN0cm9uZ1JldGFpbkluc3Q6CiAgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OlN0cm9uZ1JlbGVhc2VJbnN0OgpAQCAtOTgzLDYgKzk4NCwxOCBAQAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gT3B0aW1pemF0aW9uCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCitzdGF0aWMgU0lMVHlwZSBnZXRNZW1vcnlUeXBlKEFsbG9jYXRpb25JbnN0ICptZW1vcnkpIHsKKyAgLy8gQ29tcHV0ZSB0aGUgdHlwZSBvZiB0aGUgbWVtb3J5IG9iamVjdC4KKyAgaWYgKGF1dG8gKmFiaSA9IGR5bl9jYXN0PEFsbG9jQm94SW5zdD4obWVtb3J5KSkgeworICAgIGFzc2VydChhYmktPmdldEJveFR5cGUoKS0+Z2V0TGF5b3V0KCktPmdldEZpZWxkcygpLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICJvcHRpbWl6aW5nIG11bHRpLWZpZWxkIGJveGVzIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIHJldHVybiBhYmktPmdldEJveFR5cGUoKS0+Z2V0RmllbGRUeXBlKGFiaS0+Z2V0TW9kdWxlKCksIDApOworICB9CisKKyAgYXNzZXJ0KGlzYTxBbGxvY1N0YWNrSW5zdD4obWVtb3J5KSk7CisgIHJldHVybiBjYXN0PEFsbG9jU3RhY2tJbnN0PihtZW1vcnkpLT5nZXRFbGVtZW50VHlwZSgpOworfQorCiBuYW1lc3BhY2UgewogCiAvLy8gVGhpcyBwZXJmb3JtcyBsb2FkIHByb21vdGlvbiBhbmQgZGVsZXRlcyBzeW50aGVzaXplZCBhbGxvY2F0aW9ucyBpZiBhbGwKQEAgLTEwMDgsNDQgKzEwMjEsMjcgQEAKICAgQXZhaWxhYmxlVmFsdWVEYXRhZmxvd0NvbnRleHQgRGF0YWZsb3dDb250ZXh0OwogCiBwdWJsaWM6Ci0gIEFsbG9jT3B0aW1pemUoQWxsb2NhdGlvbkluc3QgKlRoZU1lbW9yeSwgU21hbGxWZWN0b3JJbXBsPFBNT01lbW9yeVVzZT4gJlVzZXMsCi0gICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZSZWxlYXNlcyk7CisgIEFsbG9jT3B0aW1pemUoQWxsb2NhdGlvbkluc3QgKm1lbW9yeSwgU21hbGxWZWN0b3JJbXBsPFBNT01lbW9yeVVzZT4gJnVzZXMsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZyZWxlYXNlcykKKyAgICAgIDogTW9kdWxlKG1lbW9yeS0+Z2V0TW9kdWxlKCkpLCBUaGVNZW1vcnkobWVtb3J5KSwKKyAgICAgICAgTWVtb3J5VHlwZShnZXRNZW1vcnlUeXBlKG1lbW9yeSkpLAorICAgICAgICBOdW1NZW1vcnlTdWJFbGVtZW50cyhnZXROdW1TdWJFbGVtZW50cyhNZW1vcnlUeXBlLCBNb2R1bGUpKSwgVXNlcyh1c2VzKSwKKyAgICAgICAgUmVsZWFzZXMocmVsZWFzZXMpLAorICAgICAgICBEYXRhZmxvd0NvbnRleHQoVGhlTWVtb3J5LCBOdW1NZW1vcnlTdWJFbGVtZW50cywgdXNlcykge30KIAotICBib29sIGRvSXQoKTsKKyAgYm9vbCBvcHRpbWl6ZU1lbW9yeUFjY2Vzc2VzKCk7CisgIGJvb2wgdHJ5VG9SZW1vdmVEZWFkQWxsb2NhdGlvbigpOwogCiBwcml2YXRlOgogICBib29sIHByb21vdGVMb2FkKFNJTEluc3RydWN0aW9uICpJbnN0KTsKICAgdm9pZCBwcm9tb3RlRGVzdHJveUFkZHIoRGVzdHJveUFkZHJJbnN0ICpEQUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGFibGVBcnJheVJlZjxBdmFpbGFibGVWYWx1ZT4gVmFsdWVzKTsKLSAgYm9vbAotICBjYW5Qcm9tb3RlRGVzdHJveUFkZHIoRGVzdHJveUFkZHJJbnN0ICpEQUksCi0gICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8QXZhaWxhYmxlVmFsdWU+ICZBdmFpbGFibGVWYWx1ZXMpOwotCi0gIGJvb2wgdHJ5VG9SZW1vdmVEZWFkQWxsb2NhdGlvbigpOworICBib29sIGNhblByb21vdGVEZXN0cm95QWRkcihEZXN0cm95QWRkckluc3QgKkRBSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEF2YWlsYWJsZVZhbHVlPiAmQXZhaWxhYmxlVmFsdWVzKTsKIH07CiAKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIAotc3RhdGljIFNJTFR5cGUgZ2V0TWVtb3J5VHlwZShBbGxvY2F0aW9uSW5zdCAqVGhlTWVtb3J5KSB7Ci0gIC8vIENvbXB1dGUgdGhlIHR5cGUgb2YgdGhlIG1lbW9yeSBvYmplY3QuCi0gIGlmIChhdXRvICpBQkkgPSBkeW5fY2FzdDxBbGxvY0JveEluc3Q+KFRoZU1lbW9yeSkpIHsKLSAgICBhc3NlcnQoQUJJLT5nZXRCb3hUeXBlKCktPmdldExheW91dCgpLT5nZXRGaWVsZHMoKS5zaXplKCkgPT0gMSAmJgotICAgICAgICAgICAib3B0aW1pemluZyBtdWx0aS1maWVsZCBib3hlcyBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gQUJJLT5nZXRCb3hUeXBlKCktPmdldEZpZWxkVHlwZShBQkktPmdldE1vZHVsZSgpLCAwKTsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQoaXNhPEFsbG9jU3RhY2tJbnN0PihUaGVNZW1vcnkpKTsKLSAgICByZXR1cm4gY2FzdDxBbGxvY1N0YWNrSW5zdD4oVGhlTWVtb3J5KS0+Z2V0RWxlbWVudFR5cGUoKTsKLSAgfQotfQotCi1BbGxvY09wdGltaXplOjpBbGxvY09wdGltaXplKEFsbG9jYXRpb25JbnN0ICpJbnB1dE1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFBNT01lbW9yeVVzZT4gJklucHV0VXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZJbnB1dFJlbGVhc2VzKQotICAgIDogTW9kdWxlKElucHV0TWVtb3J5LT5nZXRNb2R1bGUoKSksIFRoZU1lbW9yeShJbnB1dE1lbW9yeSksCi0gICAgICBNZW1vcnlUeXBlKGdldE1lbW9yeVR5cGUoVGhlTWVtb3J5KSksCi0gICAgICBOdW1NZW1vcnlTdWJFbGVtZW50cyhnZXROdW1TdWJFbGVtZW50cyhNZW1vcnlUeXBlLCBNb2R1bGUpKSwKLSAgICAgIFVzZXMoSW5wdXRVc2VzKSwgUmVsZWFzZXMoSW5wdXRSZWxlYXNlcyksCi0gICAgICBEYXRhZmxvd0NvbnRleHQoVGhlTWVtb3J5LCBOdW1NZW1vcnlTdWJFbGVtZW50cywgVXNlcykge30KIAogLy8vIElmIHdlIGFyZSBhYmxlIHRvIG9wdGltaXplIFxwIEluc3QsIHJldHVybiB0aGUgc291cmNlIGFkZHJlc3MgdGhhdAogLy8vIGluc3RydWN0aW9uIGlzIGxvYWRpbmcgZnJvbS4gSWYgd2UgY2FuIG5vdCBvcHRpbWl6ZSBccCBJbnN0LCB0aGVuIGp1c3QKQEAgLTExNDksOCArMTE0NSw3IEBACiAKIC8vLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gcHJvbW90ZSB0aGUgZ2l2ZW4gZGVzdHJveS4KIGJvb2wgQWxsb2NPcHRpbWl6ZTo6Y2FuUHJvbW90ZURlc3Ryb3lBZGRyKAotICAgIERlc3Ryb3lBZGRySW5zdCAqREFJLAotICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxBdmFpbGFibGVWYWx1ZT4gJkF2YWlsYWJsZVZhbHVlcykgeworICAgIERlc3Ryb3lBZGRySW5zdCAqREFJLCBTbWFsbFZlY3RvckltcGw8QXZhaWxhYmxlVmFsdWU+ICZBdmFpbGFibGVWYWx1ZXMpIHsKICAgU0lMVmFsdWUgQWRkcmVzcyA9IERBSS0+Z2V0T3BlcmFuZCgpOwogCiAgIC8vIFdlIGNhbm5vdCBwcm9tb3RlIGRlc3Ryb3lzIG9mIGFkZHJlc3Mtb25seSB0eXBlcywgYmVjYXVzZSB3ZSBjYW4ndCBleHBvc2UKQEAgLTEyMjQsOCArMTIxOSw0OSBAQAogICBEQUktPmVyYXNlRnJvbVBhcmVudCgpOwogfQogCi0vLy8gdHJ5VG9SZW1vdmVEZWFkQWxsb2NhdGlvbiAtIElmIHRoZSBhbGxvY2F0aW9uIGlzIGFuIGF1dG9nZW5lcmF0ZWQgYWxsb2NhdGlvbgotLy8vIHRoYXQgaXMgb25seSBzdG9yZWQgdG8gKGFmdGVyIGxvYWQgcHJvbW90aW9uKSB0aGVuIHJlbW92ZSBpdCBjb21wbGV0ZWx5LgorbmFtZXNwYWNlIHsKKworc3RydWN0IERlc3Ryb3lBZGRyUHJvbW90aW9uU3RhdGUgeworICBBcnJheVJlZjxTSUxJbnN0cnVjdGlvbiAqPiBkZXN0cm95czsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IGRlc3Ryb3lBZGRySW5kaWNlczsKKyAgU21hbGxWZWN0b3I8QXZhaWxhYmxlVmFsdWUsIDMyPiBhdmFpbGFibGVWYWx1ZUxpc3Q7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiBhdmFpbGFibGVWYWx1ZVN0YXJ0T2Zmc2V0czsKKworICBEZXN0cm95QWRkclByb21vdGlvblN0YXRlKEFycmF5UmVmPFNJTEluc3RydWN0aW9uICo+IGRlc3Ryb3lzKQorICAgICAgOiBkZXN0cm95cyhkZXN0cm95cykge30KKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBkZXN0cm95QWRkckluZGljZXMuc2l6ZSgpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplRm9yRGVzdHJveUFkZHIodW5zaWduZWQgZGVzdHJveUFkZHJJbmRleCkgeworICAgIGF2YWlsYWJsZVZhbHVlU3RhcnRPZmZzZXRzLnB1c2hfYmFjayhhdmFpbGFibGVWYWx1ZUxpc3Quc2l6ZSgpKTsKKyAgICBkZXN0cm95QWRkckluZGljZXMucHVzaF9iYWNrKGRlc3Ryb3lBZGRySW5kZXgpOworICB9CisKKyAgc3RkOjpwYWlyPERlc3Ryb3lBZGRySW5zdCAqLCBNdXRhYmxlQXJyYXlSZWY8QXZhaWxhYmxlVmFsdWU+PgorICBnZXREYXRhKHVuc2lnbmVkIGluZGV4KSB7CisgICAgdW5zaWduZWQgZGVzdHJveUFkZHJJbmRleCA9IGRlc3Ryb3lBZGRySW5kaWNlc1tpbmRleF07CisgICAgdW5zaWduZWQgc3RhcnRPZmZzZXQgPSBhdmFpbGFibGVWYWx1ZVN0YXJ0T2Zmc2V0c1tpbmRleF07CisgICAgdW5zaWduZWQgY291bnQ7CisKKyAgICBpZiAoKGF2YWlsYWJsZVZhbHVlU3RhcnRPZmZzZXRzLnNpemUoKSAtIDEpICE9IGluZGV4KSB7CisgICAgICBjb3VudCA9IGF2YWlsYWJsZVZhbHVlU3RhcnRPZmZzZXRzW2luZGV4ICsgMV0gLSBzdGFydE9mZnNldDsKKyAgICB9IGVsc2UgeworICAgICAgY291bnQgPSBhdmFpbGFibGVWYWx1ZUxpc3Quc2l6ZSgpIC0gc3RhcnRPZmZzZXQ7CisgICAgfQorCisgICAgTXV0YWJsZUFycmF5UmVmPEF2YWlsYWJsZVZhbHVlPiB2YWx1ZXMoJmF2YWlsYWJsZVZhbHVlTGlzdFtzdGFydE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworICAgIGF1dG8gKmRhaSA9IGNhc3Q8RGVzdHJveUFkZHJJbnN0PihkZXN0cm95c1tkZXN0cm95QWRkckluZGV4XSk7CisgICAgcmV0dXJuIHtkYWksIHZhbHVlc307CisgIH0KK307CisKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworLy8vIElmIHRoZSBhbGxvY2F0aW9uIGlzIGFuIGF1dG9nZW5lcmF0ZWQgYWxsb2NhdGlvbiB0aGF0IGlzIG9ubHkgc3RvcmVkIHRvCisvLy8gKGFmdGVyIGxvYWQgcHJvbW90aW9uKSB0aGVuIHJlbW92ZSBpdCBjb21wbGV0ZWx5LgogYm9vbCBBbGxvY09wdGltaXplOjp0cnlUb1JlbW92ZURlYWRBbGxvY2F0aW9uKCkgewogICBhc3NlcnQoKGlzYTxBbGxvY0JveEluc3Q+KFRoZU1lbW9yeSkgfHwgaXNhPEFsbG9jU3RhY2tJbnN0PihUaGVNZW1vcnkpKSAmJgogICAgICAgICAgIlVuaGFuZGxlZCBhbGxvY2F0aW9uIGNhc2UiKTsKQEAgLTEyMzYsMjkgKzEyNzIsMzIgQEAKICAgLy8gMS4gVGhleSBhcmUgaW4gYSB0cmFuc3BhcmVudCBmdW5jdGlvbi4KICAgLy8gMi4gVGhleSBhcmUgaW4gYSBub3JtYWwgZnVuY3Rpb24sIGJ1dCBkaWRuJ3QgY29tZSBmcm9tIGEgVmFyRGVjbCwgb3IgY2FtZQogICAvLyAgICBmcm9tIG9uZSB0aGF0IHdhcyBhdXRvZ2VuZXJhdGVkIG9yIGlubGluZWQgZnJvbSBhIHRyYW5zcGFyZW50IGZ1bmN0aW9uLgotICBTSUxMb2NhdGlvbiBMb2MgPSBUaGVNZW1vcnktPmdldExvYygpOworICBTSUxMb2NhdGlvbiBsb2MgPSBUaGVNZW1vcnktPmdldExvYygpOwogICBpZiAoIVRoZU1lbW9yeS0+Z2V0RnVuY3Rpb24oKS0+aXNUcmFuc3BhcmVudCgpICYmCi0gICAgICBMb2MuZ2V0QXNBU1ROb2RlPFZhckRlY2w+KCkgJiYgIUxvYy5pc0F1dG9HZW5lcmF0ZWQoKSAmJgotICAgICAgIUxvYy5pczxNYW5kYXRvcnlJbmxpbmVkTG9jYXRpb24+KCkpCisgICAgICBsb2MuZ2V0QXNBU1ROb2RlPFZhckRlY2w+KCkgJiYgIWxvYy5pc0F1dG9HZW5lcmF0ZWQoKSAmJgorICAgICAgIWxvYy5pczxNYW5kYXRvcnlJbmxpbmVkTG9jYXRpb24+KCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIC8vIENoZWNrIHRoZSB1c2VzIGxpc3QgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgbm9uLXN0b3JlIHVzZXMgbGVmdCBvdmVyIGFmdGVyCiAgIC8vIGxvYWQgcHJvbW90aW9uIGFuZCBvdGhlciB0aGluZ3MgUE1PIGRvZXMuCi0gIGZvciAoYXV0byAmVSA6IFVzZXMpIHsKKyAgZm9yIChhdXRvICZ1IDogVXNlcykgewogICAgIC8vIElnbm9yZSByZW1vdmVkIGluc3RydWN0aW9ucy4KLSAgICBpZiAoVS5JbnN0ID09IG51bGxwdHIpIGNvbnRpbnVlOworICAgIGlmICh1Lkluc3QgPT0gbnVsbHB0cikKKyAgICAgIGNvbnRpbnVlOwogCi0gICAgc3dpdGNoIChVLktpbmQpIHsKKyAgICBzd2l0Y2ggKHUuS2luZCkgewogICAgIGNhc2UgUE1PVXNlS2luZDo6QXNzaWduOgotICAgIGNhc2UgUE1PVXNlS2luZDo6UGFydGlhbFN0b3JlOgorICAgICAgLy8gVW50aWwgd2UgY2FuIHByb21vdGUgdGhlIHZhbHVlIGJlaW5nIGRlc3Ryb3llZCBieSB0aGUgYXNzaWduLCB3ZSBjYW4KKyAgICAgIC8vIG5vdCByZW1vdmUgZGVhbGxvY2F0aW9ucyB3aXRoIHN1Y2ggYXNzaWducy4KKyAgICAgIHJldHVybiBmYWxzZTsKICAgICBjYXNlIFBNT1VzZUtpbmQ6OkluaXRPckFzc2lnbjoKICAgICAgIGJyZWFrOyAgICAvLyBUaGVzZSBkb24ndCBwcmV2ZW50IHJlbW92YWwuCiAgICAgY2FzZSBQTU9Vc2VLaW5kOjpJbml0aWFsaXphdGlvbjoKLSAgICAgIGlmICghaXNhPEFwcGx5SW5zdD4oVS5JbnN0KSAmJgorICAgICAgaWYgKCFpc2E8QXBwbHlJbnN0Pih1Lkluc3QpICYmCiAgICAgICAgICAgLy8gQSBjb3B5X2FkZHIgdGhhdCBpcyBub3QgYSB0YWtlIGFmZmVjdHMgdGhlIHJldGFpbiBjb3VudAogICAgICAgICAgIC8vIG9mIHRoZSBzb3VyY2UuCi0gICAgICAgICAgKCFpc2E8Q29weUFkZHJJbnN0PihVLkluc3QpIHx8Ci0gICAgICAgICAgIGNhc3Q8Q29weUFkZHJJbnN0PihVLkluc3QpLT5pc1Rha2VPZlNyYygpKSkKKyAgICAgICAgICAoIWlzYTxDb3B5QWRkckluc3Q+KHUuSW5zdCkgfHwKKyAgICAgICAgICAgY2FzdDxDb3B5QWRkckluc3Q+KHUuSW5zdCktPmlzVGFrZU9mU3JjKCkpKQogICAgICAgICBicmVhazsKICAgICAgIC8vIEZBTEwgVEhST1VHSC4KICAgICAgTExWTV9GQUxMVEhST1VHSDsKQEAgLTEyNjcsNyArMTMwNiw4IEBACiAgICAgY2FzZSBQTU9Vc2VLaW5kOjpJbk91dFVzZToKICAgICBjYXNlIFBNT1VzZUtpbmQ6OkVzY2FwZToKICAgICAgIExMVk1fREVCVUcobGx2bTo6ZGJncygpIDw8ICIqKiogRmFpbGVkIHRvIHJlbW92ZSBhdXRvZ2VuZXJhdGVkIGFsbG9jOiAiCi0gICAgICAgICAgICAgICAgICJrZXB0IGFsaXZlIGJ5OiAiIDw8ICpVLkluc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtlcHQgYWxpdmUgYnk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICp1Lkluc3QpOwogICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIFRoZXNlIGRvIHByZXZlbnQgcmVtb3ZhbC4KICAgICB9CiAgIH0KQEAgLTEyODksNTMgKzEzMjksMzkgQEAKIAogICAvLyBPdGhlcndpc2UgcmVtb3ZpbmcgdGhlIGRlYWxsb2NhdGlvbiB3aWxsIGRyb3AgYW55IHJlbGVhc2VzLiAgQ2hlY2sgdGhhdAogICAvLyB0aGVyZSBpcyBub3RoaW5nIHByZXZlbnRpbmcgcmVtb3ZhbC4KLSAgbGx2bTo6U21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IERlc3Ryb3lBZGRySW5kaWNlczsKLSAgbGx2bTo6U21hbGxWZWN0b3I8QXZhaWxhYmxlVmFsdWUsIDMyPiBBdmFpbGFibGVWYWx1ZUxpc3Q7Ci0gIGxsdm06OlNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiBBdmFpbGFibGVWYWx1ZVN0YXJ0T2Zmc2V0czsKKyAgRGVzdHJveUFkZHJQcm9tb3Rpb25TdGF0ZSBzdGF0ZShSZWxlYXNlcyk7CiAKLSAgZm9yIChhdXRvIFAgOiBsbHZtOjplbnVtZXJhdGUoUmVsZWFzZXMpKSB7Ci0gICAgYXV0byAqUiA9IFAudmFsdWUoKTsKLSAgICBpZiAoUiA9PSBudWxscHRyKQorICBmb3IgKGF1dG8gcCA6IGxsdm06OmVudW1lcmF0ZShSZWxlYXNlcykpIHsKKyAgICBhdXRvICpyID0gcC52YWx1ZSgpOworICAgIGlmIChyID09IG51bGxwdHIpCiAgICAgICBjb250aW51ZTsKIAogICAgIC8vIFdlIHN0YXNoIGFsbCBvZiB0aGUgZGVzdHJveV9hZGRyIHRoYXQgd2Ugc2VlLgotICAgIGlmIChhdXRvICpEQUkgPSBkeW5fY2FzdDxEZXN0cm95QWRkckluc3Q+KFIpKSB7Ci0gICAgICBBdmFpbGFibGVWYWx1ZVN0YXJ0T2Zmc2V0cy5wdXNoX2JhY2soQXZhaWxhYmxlVmFsdWVMaXN0LnNpemUoKSk7CisgICAgaWYgKGF1dG8gKmRhaSA9IGR5bl9jYXN0PERlc3Ryb3lBZGRySW5zdD4ocikpIHsKKyAgICAgIHN0YXRlLmluaXRpYWxpemVGb3JEZXN0cm95QWRkcihwLmluZGV4KCkgLypkZXN0cm95QWRkckluZGV4Ki8pOwogICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBhY3R1YWxseSBwcm9tb3RlIHRoaXMgZGVzdHJveSBhZGRyLiBJZiB3ZSBjYW4gbm90LAogICAgICAgLy8gdGhlbiB3ZSBtdXN0IGJhaWwuIEluIG9yZGVyIHRvIG5vdCBnYXRoZXIgYXZhaWxhYmxlIHZhbHVlcyB0d2ljZSwgd2UKICAgICAgIC8vIGdhdGhlciB0aGUgYXZhaWxhYmxlIHZhbHVlcyBoZXJlIHRoYXQgd2Ugd2lsbCB1c2UgdG8gcHJvbW90ZSB0aGUKICAgICAgIC8vIHZhbHVlcy4KLSAgICAgIGlmICghY2FuUHJvbW90ZURlc3Ryb3lBZGRyKERBSSwgQXZhaWxhYmxlVmFsdWVMaXN0KSkKKyAgICAgIGlmICghY2FuUHJvbW90ZURlc3Ryb3lBZGRyKGRhaSwgc3RhdGUuYXZhaWxhYmxlVmFsdWVMaXN0KSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgRGVzdHJveUFkZHJJbmRpY2VzLnB1c2hfYmFjayhQLmluZGV4KCkpOwogICAgICAgY29udGludWU7CiAgICAgfQogCiAgICAgTExWTV9ERUJVRyhsbHZtOjpkYmdzKCkKICAgICAgICAgICAgICAgIDw8ICIqKiogRmFpbGVkIHRvIHJlbW92ZSBhdXRvZ2VuZXJhdGVkIG5vbi10cml2aWFsIGFsbG9jOiAiCiAgICAgICAgICAgICAgICAgICAia2VwdCBhbGl2ZSBieSByZWxlYXNlOiAiCi0gICAgICAgICAgICAgICA8PCAqUik7CisgICAgICAgICAgICAgICA8PCAqcik7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKICAgLy8gSWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50LCB3ZSBjYW4gcHJvbW90ZSBhbGwgb2Ygb3VyIGRlc3Ryb3lfYWRkci4KLSAgZm9yIChhdXRvIFAgOiBsbHZtOjplbnVtZXJhdGUoRGVzdHJveUFkZHJJbmRpY2VzKSkgewotICAgIHVuc2lnbmVkIERlc3Ryb3lBZGRySW5kZXggPSBQLnZhbHVlKCk7Ci0gICAgdW5zaWduZWQgQXZhaWxhYmxlVmFsdWVJbmRleCA9IFAuaW5kZXgoKTsKLSAgICB1bnNpZ25lZCBTdGFydE9mZnNldCA9IEF2YWlsYWJsZVZhbHVlU3RhcnRPZmZzZXRzW0F2YWlsYWJsZVZhbHVlSW5kZXhdOwotICAgIHVuc2lnbmVkIENvdW50OwotCi0gICAgaWYgKChBdmFpbGFibGVWYWx1ZVN0YXJ0T2Zmc2V0cy5zaXplKCkgLSAxKSAhPSBBdmFpbGFibGVWYWx1ZUluZGV4KSB7Ci0gICAgICBDb3VudCA9IEF2YWlsYWJsZVZhbHVlU3RhcnRPZmZzZXRzW0F2YWlsYWJsZVZhbHVlSW5kZXggKyAxXSAtIFN0YXJ0T2Zmc2V0OwotICAgIH0gZWxzZSB7Ci0gICAgICBDb3VudCA9IEF2YWlsYWJsZVZhbHVlTGlzdC5zaXplKCkgLSBTdGFydE9mZnNldDsKLSAgICB9Ci0KLSAgICBNdXRhYmxlQXJyYXlSZWY8QXZhaWxhYmxlVmFsdWU+IFZhbHVlcygmQXZhaWxhYmxlVmFsdWVMaXN0W1N0YXJ0T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCk7Ci0gICAgYXV0byAqREFJID0gY2FzdDxEZXN0cm95QWRkckluc3Q+KFJlbGVhc2VzW0Rlc3Ryb3lBZGRySW5kZXhdKTsKLSAgICBwcm9tb3RlRGVzdHJveUFkZHIoREFJLCBWYWx1ZXMpOwotICAgIFJlbGVhc2VzW0Rlc3Ryb3lBZGRySW5kZXhdID0gbnVsbHB0cjsKKyAgZm9yICh1bnNpZ25lZCBpIDogcmFuZ2Uoc3RhdGUuc2l6ZSgpKSkgeworICAgIERlc3Ryb3lBZGRySW5zdCAqZGFpOworICAgIE11dGFibGVBcnJheVJlZjxBdmFpbGFibGVWYWx1ZT4gdmFsdWVzOworICAgIHN0ZDo6dGllKGRhaSwgdmFsdWVzKSA9IHN0YXRlLmdldERhdGEoaSk7CisgICAgcHJvbW90ZURlc3Ryb3lBZGRyKGRhaSwgdmFsdWVzKTsKKyAgICAvLyBXZSBkbyBub3QgbmVlZCB0byB1bnNldCByZWxlYXNlcywgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIGV4aXQgaGVyZS4KICAgfQogCiAgIExMVk1fREVCVUcobGx2bTo6ZGJncygpIDw8ICIqKiogUmVtb3ZpbmcgYXV0b2dlbmVyYXRlZCBub24tdHJpdmlhbCBhbGxvYzogIgpAQCAtMTM0OSw3OSArMTM3NSwxMzUgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLS8vLyBkb0l0IC0gcmV0dXJucyB0cnVlIG9uIGVycm9yLgotYm9vbCBBbGxvY09wdGltaXplOjpkb0l0KCkgewotICBib29sIENoYW5nZWQgPSBmYWxzZTsKLQotICAvLyBEb24ndCB0cnkgdG8gb3B0aW1pemUgaW5jb21wbGV0ZSBhZ2dyZWdhdGVzLgotICBpZiAoTWVtb3J5VHlwZS5hZ2dyZWdhdGVIYXNVbnJlZmVyZW5jZWFibGVTdG9yYWdlKCkpCi0gICAgcmV0dXJuIGZhbHNlOworYm9vbCBBbGxvY09wdGltaXplOjpvcHRpbWl6ZU1lbW9yeUFjY2Vzc2VzKCkgeworICBib29sIGNoYW5nZWQgPSBmYWxzZTsKIAogICAvLyBJZiB3ZSd2ZSBzdWNjZXNzZnVsbHkgY2hlY2tlZCBhbGwgb2YgdGhlIGRlZmluaXRpdmUgaW5pdGlhbGl6YXRpb24KICAgLy8gcmVxdWlyZW1lbnRzLCB0cnkgdG8gcHJvbW90ZSBsb2Fkcy4gIFRoaXMgY2FuIGV4cGxvZGUgY29weV9hZGRycywgc28gdGhlCiAgIC8vIHVzZSBsaXN0IG1heSBjaGFuZ2Ugc2l6ZS4KICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBVc2VzLnNpemUoKTsgKytpKSB7Ci0gICAgYXV0byAmVXNlID0gVXNlc1tpXTsKKyAgICBhdXRvICZ1c2UgPSBVc2VzW2ldOwogICAgIC8vIElnbm9yZSBlbnRyaWVzIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBnb3QgZXhwYW5kZWQgYWxvbmcgdGhlIHdheS4KLSAgICBpZiAoVXNlLkluc3QgJiYgVXNlLktpbmQgPT0gUE1PVXNlS2luZDo6TG9hZCkgewotICAgICAgaWYgKHByb21vdGVMb2FkKFVzZS5JbnN0KSkgeworICAgIGlmICh1c2UuSW5zdCAmJiB1c2UuS2luZCA9PSBQTU9Vc2VLaW5kOjpMb2FkKSB7CisgICAgICBpZiAocHJvbW90ZUxvYWQodXNlLkluc3QpKSB7CiAgICAgICAgIFVzZXNbaV0uSW5zdCA9IG51bGxwdHI7ICAvLyByZW1vdmUgZW50cnkgaWYgbG9hZCBnb3QgZGVsZXRlZC4KLSAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgfQogICAgIH0KICAgfQotICAKLSAgLy8gSWYgdGhpcyBpcyBhbiBhbGxvY2F0aW9uLCB0cnkgdG8gcmVtb3ZlIGl0IGNvbXBsZXRlbHkuCi0gIENoYW5nZWQgfD0gdHJ5VG9SZW1vdmVEZWFkQWxsb2NhdGlvbigpOwogCi0gIHJldHVybiBDaGFuZ2VkOworICByZXR1cm4gY2hhbmdlZDsKIH0KIAotc3RhdGljIGJvb2wgb3B0aW1pemVNZW1vcnlBbGxvY2F0aW9ucyhTSUxGdW5jdGlvbiAmRm4pIHsKLSAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7Ci0gIGZvciAoYXV0byAmQkIgOiBGbikgewotICAgIGF1dG8gSSA9IEJCLmJlZ2luKCksIEUgPSBCQi5lbmQoKTsKLSAgICB3aGlsZSAoSSAhPSBFKSB7Ci0gICAgICBTSUxJbnN0cnVjdGlvbiAqSW5zdCA9ICYqSTsKLSAgICAgIGlmICghaXNhPEFsbG9jQm94SW5zdD4oSW5zdCkgJiYgIWlzYTxBbGxvY1N0YWNrSW5zdD4oSW5zdCkpIHsKLSAgICAgICAgKytJOworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9wIExldmVsIEVudHJ5cG9pbnRzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitzdGF0aWMgQWxsb2NhdGlvbkluc3QgKmdldE9wdGltaXphYmxlQWxsb2NhdGlvbihTSUxJbnN0cnVjdGlvbiAqaSkgeworICBpZiAoIWlzYTxBbGxvY0JveEluc3Q+KGkpICYmICFpc2E8QWxsb2NTdGFja0luc3Q+KGkpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBhdXRvICphbGxvYyA9IGNhc3Q8QWxsb2NhdGlvbkluc3Q+KGkpOworCisgIC8vIElmIG91ciBhZ2dyZWdhdGUgaGFzIHVucmVmZXJlbmNhYmxlIHN0b3JhZ2UsIHdlIGNhbid0IG9wdGltaXplLiBSZXR1cm4KKyAgLy8gbnVsbHB0ci4KKyAgaWYgKGdldE1lbW9yeVR5cGUoYWxsb2MpLmFnZ3JlZ2F0ZUhhc1VucmVmZXJlbmNlYWJsZVN0b3JhZ2UoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICAvLyBPdGhlcndpc2Ugd2UgYXJlIGdvb2QgdG8gZ28uIExldHMgdHJ5IHRvIG9wdGltaXplIHRoaXMgbWVtb3J5IQorICByZXR1cm4gYWxsb2M7Cit9CisKK3N0YXRpYyBib29sIG9wdGltaXplTWVtb3J5QWNjZXNzZXMoU0lMRnVuY3Rpb24gJmZuKSB7CisgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICBmb3IgKGF1dG8gJmJiIDogZm4pIHsKKyAgICBhdXRvIGkgPSBiYi5iZWdpbigpLCBlID0gYmIuZW5kKCk7CisgICAgd2hpbGUgKGkgIT0gZSkgeworICAgICAgLy8gRmlyc3Qgc2VlIGlmIGkgaXMgYW4gYWxsb2NhdGlvbiB0aGF0IHdlIGNhbiBvcHRpbWl6ZS4gSWYgbm90LCBza2lwIGl0LgorICAgICAgQWxsb2NhdGlvbkluc3QgKmFsbG9jID0gZ2V0T3B0aW1pemFibGVBbGxvY2F0aW9uKCYqaSk7CisgICAgICBpZiAoIWFsbG9jKSB7CisgICAgICAgICsraTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9Ci0gICAgICBhdXRvIEFsbG9jID0gY2FzdDxBbGxvY2F0aW9uSW5zdD4oSW5zdCk7CiAKLSAgICAgIExMVk1fREVCVUcobGx2bTo6ZGJncygpIDw8ICIqKiogUE1PIE9wdGltaXplIGxvb2tpbmcgYXQ6ICIgPDwgKkFsbG9jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iKTsKLSAgICAgIFBNT01lbW9yeU9iamVjdEluZm8gTWVtSW5mbyhBbGxvYyk7CisgICAgICBMTFZNX0RFQlVHKGxsdm06OmRiZ3MoKSA8PCAiKioqIFBNTyBPcHRpbWl6ZSBNZW1vcnkgQWNjZXNzZXMgbG9va2luZyBhdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKmFsbG9jIDw8ICJcbiIpOworICAgICAgUE1PTWVtb3J5T2JqZWN0SW5mbyBtZW1JbmZvKGFsbG9jKTsKIAogICAgICAgLy8gU2V0IHVwIHRoZSBkYXRhc3RydWN0dXJlIHVzZWQgdG8gY29sbGVjdCB0aGUgdXNlcyBvZiB0aGUgYWxsb2NhdGlvbi4KLSAgICAgIFNtYWxsVmVjdG9yPFBNT01lbW9yeVVzZSwgMTY+IFVzZXM7Ci0gICAgICBTbWFsbFZlY3RvcjxTSUxJbnN0cnVjdGlvbiosIDQ+IFJlbGVhc2VzOworICAgICAgU21hbGxWZWN0b3I8UE1PTWVtb3J5VXNlLCAxNj4gdXNlczsKKyAgICAgIFNtYWxsVmVjdG9yPFNJTEluc3RydWN0aW9uICosIDQ+IGRlc3Ryb3lzOwogCiAgICAgICAvLyBXYWxrIHRoZSB1c2UgbGlzdCBvZiB0aGUgcG9pbnRlciwgY29sbGVjdGluZyB0aGVtLiBJZiB3ZSBhcmUgbm90IGFibGUKICAgICAgIC8vIHRvIG9wdGltaXplLCBza2lwIHRoaXMgdmFsdWUuICpOT1RFKiBXZSBtYXkgc3RpbGwgc2NhbGFyaXplIHZhbHVlcwogICAgICAgLy8gaW5zaWRlIHRoZSB2YWx1ZS4KLSAgICAgIGlmICghY29sbGVjdFBNT0VsZW1lbnRVc2VzRnJvbShNZW1JbmZvLCBVc2VzLCBSZWxlYXNlcykpIHsKLSAgICAgICAgKytJOworICAgICAgaWYgKCFjb2xsZWN0UE1PRWxlbWVudFVzZXNGcm9tKG1lbUluZm8sIHVzZXMsIGRlc3Ryb3lzKSkgeworICAgICAgICArK2k7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCi0gICAgICBDaGFuZ2VkIHw9IEFsbG9jT3B0aW1pemUoQWxsb2MsIFVzZXMsIFJlbGVhc2VzKS5kb0l0KCk7Ci0gICAgICAKLSAgICAgIC8vIENhcmVmdWxseSBtb3ZlIGl0ZXJhdG9yIHRvIGF2b2lkIGludmFsaWRhdGlvbiBwcm9ibGVtcy4KLSAgICAgICsrSTsKLSAgICAgIGlmIChBbGxvYy0+dXNlX2VtcHR5KCkpIHsKLSAgICAgICAgQWxsb2MtPmVyYXNlRnJvbVBhcmVudCgpOworICAgICAgQWxsb2NPcHRpbWl6ZSBhbGxvY09wdGltaXplKGFsbG9jLCB1c2VzLCBkZXN0cm95cyk7CisgICAgICBjaGFuZ2VkIHw9IGFsbG9jT3B0aW1pemUub3B0aW1pemVNZW1vcnlBY2Nlc3NlcygpOworCisgICAgICAvLyBNb3ZlIG9udG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24uIFdlIGtub3cgdGhpcyBpcyBzYWZlIHNpbmNlIHdlIGRvIG5vdAorICAgICAgLy8gZWxpbWluYXRlIGFsbG9jYXRpb25zIGhlcmUuCisgICAgICArK2k7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyBib29sIGVsaW1pbmF0ZURlYWRBbGxvY2F0aW9ucyhTSUxGdW5jdGlvbiAmZm4pIHsKKyAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgIGZvciAoYXV0byAmYmIgOiBmbikgeworICAgIGF1dG8gaSA9IGJiLmJlZ2luKCksIGUgPSBiYi5lbmQoKTsKKyAgICB3aGlsZSAoaSAhPSBlKSB7CisgICAgICAvLyBGaXJzdCBzZWUgaWYgaSBpcyBhbiBhbGxvY2F0aW9uIHRoYXQgd2UgY2FuIG9wdGltaXplLiBJZiBub3QsIHNraXAgaXQuCisgICAgICBBbGxvY2F0aW9uSW5zdCAqYWxsb2MgPSBnZXRPcHRpbWl6YWJsZUFsbG9jYXRpb24oJippKTsKKyAgICAgIGlmICghYWxsb2MpIHsKKyAgICAgICAgKytpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgTExWTV9ERUJVRyhsbHZtOjpkYmdzKCkKKyAgICAgICAgICAgICAgICAgPDwgIioqKiBQTU8gRGVhZCBBbGxvY2F0aW9uIEVsaW1pbmF0aW9uIGxvb2tpbmcgYXQ6ICIgPDwgKmFsbG9jCisgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgICAgUE1PTWVtb3J5T2JqZWN0SW5mbyBtZW1JbmZvKGFsbG9jKTsKKworICAgICAgLy8gU2V0IHVwIHRoZSBkYXRhc3RydWN0dXJlIHVzZWQgdG8gY29sbGVjdCB0aGUgdXNlcyBvZiB0aGUgYWxsb2NhdGlvbi4KKyAgICAgIFNtYWxsVmVjdG9yPFBNT01lbW9yeVVzZSwgMTY+IHVzZXM7CisgICAgICBTbWFsbFZlY3RvcjxTSUxJbnN0cnVjdGlvbiAqLCA0PiBkZXN0cm95czsKKworICAgICAgLy8gV2FsayB0aGUgdXNlIGxpc3Qgb2YgdGhlIHBvaW50ZXIsIGNvbGxlY3RpbmcgdGhlbS4gSWYgd2UgYXJlIG5vdCBhYmxlCisgICAgICAvLyB0byBvcHRpbWl6ZSwgc2tpcCB0aGlzIHZhbHVlLiAqTk9URSogV2UgbWF5IHN0aWxsIHNjYWxhcml6ZSB2YWx1ZXMKKyAgICAgIC8vIGluc2lkZSB0aGUgdmFsdWUuCisgICAgICBpZiAoIWNvbGxlY3RQTU9FbGVtZW50VXNlc0Zyb20obWVtSW5mbywgdXNlcywgZGVzdHJveXMpKSB7CisgICAgICAgICsraTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIEFsbG9jT3B0aW1pemUgYWxsb2NPcHRpbWl6ZShhbGxvYywgdXNlcywgZGVzdHJveXMpOworICAgICAgY2hhbmdlZCB8PSBhbGxvY09wdGltaXplLnRyeVRvUmVtb3ZlRGVhZEFsbG9jYXRpb24oKTsKKworICAgICAgLy8gTW92ZSBvbnRvIHRoZSBuZXh0IGluc3RydWN0aW9uLiBXZSBrbm93IHRoaXMgaXMgc2FmZSBzaW5jZSB3ZSBkbyBub3QKKyAgICAgIC8vIGVsaW1pbmF0ZSBhbGxvY2F0aW9ucyBoZXJlLgorICAgICAgKytpOworICAgICAgaWYgKGFsbG9jLT51c2VfZW1wdHkoKSkgeworICAgICAgICBhbGxvYy0+ZXJhc2VGcm9tUGFyZW50KCk7CiAgICAgICAgICsrTnVtQWxsb2NSZW1vdmVkOwotICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICB9CiAgICAgfQogICB9Ci0gIHJldHVybiBDaGFuZ2VkOworCisgIHJldHVybiBjaGFuZ2VkOwogfQogCiBuYW1lc3BhY2UgewogCi1jbGFzcyBQcmVkaWN0YWJsZU1lbW9yeU9wdGltaXphdGlvbnMgOiBwdWJsaWMgU0lMRnVuY3Rpb25UcmFuc2Zvcm0geworY2xhc3MgUHJlZGljdGFibGVNZW1vcnlBY2Nlc3NPcHRpbWl6YXRpb25zIDogcHVibGljIFNJTEZ1bmN0aW9uVHJhbnNmb3JtIHsKICAgLy8vIFRoZSBlbnRyeSBwb2ludCB0byB0aGUgdHJhbnNmb3JtYXRpb24uCiAgIC8vLwogICAvLy8gRklYTUU6IFRoaXMgcGFzcyBzaG91bGQgbm90IG5lZWQgdG8gcmVydW4gb24gZGVzZXJpYWxpemVkCkBAIC0xNDMwLDE0ICsxNTEyLDI1IEBACiAgIC8vLyBlaXRoZXIgaW5kaWNhdGVzIHRoYXQgdGhpcyBwYXNzIG1pc3Npbmcgc29tZSBvcHBvcnR1bml0aWVzIHRoZSBmaXJzdCB0aW1lLAogICAvLy8gb3IgaGFzIGEgcGFzcyBvcmRlciBkZXBlbmRlbmN5IG9uIG90aGVyIGVhcmx5IHBhc3Nlcy4KICAgdm9pZCBydW4oKSBvdmVycmlkZSB7Ci0gICAgaWYgKG9wdGltaXplTWVtb3J5QWxsb2NhdGlvbnMoKmdldEZ1bmN0aW9uKCkpKQorICAgIC8vIFRPRE86IENhbiB3ZSBpbnZhbGlkYXRlIGhlcmUganVzdCBpbnN0cnVjdGlvbnM/CisgICAgaWYgKG9wdGltaXplTWVtb3J5QWNjZXNzZXMoKmdldEZ1bmN0aW9uKCkpKQorICAgICAgaW52YWxpZGF0ZUFuYWx5c2lzKFNJTEFuYWx5c2lzOjpJbnZhbGlkYXRpb25LaW5kOjpGdW5jdGlvbkJvZHkpOworICB9Cit9OworCitjbGFzcyBQcmVkaWN0YWJsZURlYWRBbGxvY2F0aW9uRWxpbWluYXRpb24gOiBwdWJsaWMgU0lMRnVuY3Rpb25UcmFuc2Zvcm0geworICB2b2lkIHJ1bigpIG92ZXJyaWRlIHsKKyAgICBpZiAoZWxpbWluYXRlRGVhZEFsbG9jYXRpb25zKCpnZXRGdW5jdGlvbigpKSkKICAgICAgIGludmFsaWRhdGVBbmFseXNpcyhTSUxBbmFseXNpczo6SW52YWxpZGF0aW9uS2luZDo6RnVuY3Rpb25Cb2R5KTsKICAgfQogfTsKIAogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQogCitTSUxUcmFuc2Zvcm0gKnN3aWZ0OjpjcmVhdGVQcmVkaWN0YWJsZU1lbW9yeUFjY2Vzc09wdGltaXphdGlvbnMoKSB7CisgIHJldHVybiBuZXcgUHJlZGljdGFibGVNZW1vcnlBY2Nlc3NPcHRpbWl6YXRpb25zKCk7Cit9CiAKLVNJTFRyYW5zZm9ybSAqc3dpZnQ6OmNyZWF0ZVByZWRpY3RhYmxlTWVtb3J5T3B0aW1pemF0aW9ucygpIHsKLSAgcmV0dXJuIG5ldyBQcmVkaWN0YWJsZU1lbW9yeU9wdGltaXphdGlvbnMoKTsKK1NJTFRyYW5zZm9ybSAqc3dpZnQ6OmNyZWF0ZVByZWRpY3RhYmxlRGVhZEFsbG9jYXRpb25FbGltaW5hdGlvbigpIHsKKyAgcmV0dXJuIG5ldyBQcmVkaWN0YWJsZURlYWRBbGxvY2F0aW9uRWxpbWluYXRpb24oKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9TSUxPcHRpbWl6ZXIvUGFzc01hbmFnZXIvUGFzc1BpcGVsaW5lLmNwcCBiL2xpYi9TSUxPcHRpbWl6ZXIvUGFzc01hbmFnZXIvUGFzc1BpcGVsaW5lLmNwcAppbmRleCAyOTRjZTQyLi5kMzUxYjdmIDEwMDY0NAotLS0gYS9saWIvU0lMT3B0aW1pemVyL1Bhc3NNYW5hZ2VyL1Bhc3NQaXBlbGluZS5jcHAKKysrIGIvbGliL1NJTE9wdGltaXplci9QYXNzTWFuYWdlci9QYXNzUGlwZWxpbmUuY3BwCkBAIC0xMDYsMTIgKzEwNiwyMCBAQAogICBQLmFkZE93bmVyc2hpcE1vZGVsRWxpbWluYXRvcigpOwogICBQLmFkZE1hbmRhdG9yeUlubGluaW5nKCk7CiAgIFAuYWRkTWFuZGF0b3J5U0lMTGlua2VyKCk7Ci0gIFAuYWRkUHJlZGljdGFibGVNZW1vcnlPcHRpbWl6YXRpb25zKCk7CisKKyAgLy8gUHJvbW90ZSBsb2FkcyBhcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHdlIGhhdmUgZW5vdWdoIFNTQSBmb3JtYXRpb24gdG8gZW1pdAorICAvLyBTU0EgYmFzZWQgZGlhZ25vc3RpY3MuCisgIFAuYWRkUHJlZGljdGFibGVNZW1vcnlBY2Nlc3NPcHRpbWl6YXRpb25zKCk7CiAKICAgLy8gRGlhZ25vc3RpYyBDb25zdGFudFByb3BhZ2F0aW9uIG11c3QgYmUgcmVydW4gb24gZGVzZXJpYWxpemVkIGZ1bmN0aW9ucwogICAvLyBiZWNhdXNlIGl0IGlzIHNlbnNpdGl2ZSB0byB0aGUgYXNzZXJ0IGNvbmZpZ3VyYXRpb24uCiAgIC8vIENvbnNlcXVlbnRseSwgY2VydGFpbiBvcHRpbWl6YXRpb24gcGFzc2VzIGJleW9uZCB0aGlzIHBvaW50IHdpbGwgYWxzbyByZXJ1bi4KICAgUC5hZGREaWFnbm9zdGljQ29uc3RhbnRQcm9wYWdhdGlvbigpOworCisgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZW1pdHRlZCBjb25zdGFudCBwcm9wYWdhdGlvbiBkaWFnbm9zdGljcywgdHJ5IHRvIGVsaW1pbmF0ZQorICAvLyBkZWFkIGFsbG9jYXRpb25zLgorICBQLmFkZFByZWRpY3RhYmxlRGVhZEFsbG9jYXRpb25FbGltaW5hdGlvbigpOworCiAgIFAuYWRkR3VhcmFudGVlZEFSQ09wdHMoKTsKICAgUC5hZGREaWFnbm9zZVVucmVhY2hhYmxlKCk7CiAgIFAuYWRkRGlhZ25vc2VJbmZpbml0ZVJlY3Vyc2lvbigpOwpkaWZmIC0tZ2l0IGEvbGliL1NJTE9wdGltaXplci9TSUxDb21iaW5lci9TSUxDb21iaW5lckFwcGx5VmlzaXRvcnMuY3BwIGIvbGliL1NJTE9wdGltaXplci9TSUxDb21iaW5lci9TSUxDb21iaW5lckFwcGx5VmlzaXRvcnMuY3BwCmluZGV4IDBmZGZkNGIuLjAzMTM4Y2MgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxPcHRpbWl6ZXIvU0lMQ29tYmluZXIvU0lMQ29tYmluZXJBcHBseVZpc2l0b3JzLmNwcAorKysgYi9saWIvU0lMT3B0aW1pemVyL1NJTENvbWJpbmVyL1NJTENvbWJpbmVyQXBwbHlWaXNpdG9ycy5jcHAKQEAgLTc0LDkgKzc0LDI0IEBACiBTSUxJbnN0cnVjdGlvbiAqU0lMQ29tYmluZXI6OnZpc2l0UGFydGlhbEFwcGx5SW5zdChQYXJ0aWFsQXBwbHlJbnN0ICpQQUkpIHsKICAgLy8gcGFydGlhbF9hcHBseSB3aXRob3V0IGFueSBzdWJzdGl0dXRpb25zIG9yIGFyZ3VtZW50cyBpcyBqdXN0IGEKICAgLy8gdGhpbl90b190aGlja19mdW5jdGlvbi4KLSAgaWYgKCFQQUktPmhhc1N1YnN0aXR1dGlvbnMoKSAmJiAoUEFJLT5nZXROdW1Bcmd1bWVudHMoKSA9PSAwKSkKLSAgICByZXR1cm4gQnVpbGRlci5jcmVhdGVUaGluVG9UaGlja0Z1bmN0aW9uKFBBSS0+Z2V0TG9jKCksIFBBSS0+Z2V0Q2FsbGVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUktPmdldFR5cGUoKSk7CisgIGlmICghUEFJLT5oYXNTdWJzdGl0dXRpb25zKCkgJiYgKFBBSS0+Z2V0TnVtQXJndW1lbnRzKCkgPT0gMCkpIHsKKyAgICBpZiAoIVBBSS0+aXNPblN0YWNrKCkpCisgICAgICByZXR1cm4gQnVpbGRlci5jcmVhdGVUaGluVG9UaGlja0Z1bmN0aW9uKFBBSS0+Z2V0TG9jKCksIFBBSS0+Z2V0Q2FsbGVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBSS0+Z2V0VHlwZSgpKTsKKworICAgIC8vIFJlbW92ZSBkZWFsbG9jX3N0YWNrIG9mIHBhcnRpYWxfYXBwbHkgW3N0YWNrXS4KKyAgICAvLyBJdGVyYXRpbmcgd2hpbGUgZGVsZXRlIHVzZSBhIGNvcHkuCisgICAgU21hbGxWZWN0b3I8T3BlcmFuZCAqLCA4PiBVc2VzKFBBSS0+Z2V0VXNlcygpKTsKKyAgICBmb3IgKGF1dG8gKlVzZSA6IFVzZXMpCisgICAgICBpZiAoYXV0byAqZGVhbGxvYyA9IGR5bl9jYXN0PERlYWxsb2NTdGFja0luc3Q+KFVzZS0+Z2V0VXNlcigpKSkKKyAgICAgICAgZXJhc2VJbnN0RnJvbUZ1bmN0aW9uKCpkZWFsbG9jKTsKKyAgICBhdXRvICp0aGluVG9UaGljayA9IEJ1aWxkZXIuY3JlYXRlVGhpblRvVGhpY2tGdW5jdGlvbigKKyAgICAgICAgUEFJLT5nZXRMb2MoKSwgUEFJLT5nZXRDYWxsZWUoKSwgUEFJLT5nZXRUeXBlKCkpOworICAgIHJlcGxhY2VJbnN0VXNlc1dpdGgoKlBBSSwgdGhpblRvVGhpY2spOworICAgIGVyYXNlSW5zdEZyb21GdW5jdGlvbigqUEFJKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCiAKICAgLy8gcGFydGlhbF9hcHBseSAlcmVhYnN0cmFjdGlvbl90aHVua190eXBlQXRvQigKICAgLy8gICAgcGFydGlhbF9hcHBseSAlcmVhYnN0cmFjdGlvbl90aHVua190eXBlQnRvQSAlY2xvc3VyZV90eXBlQikpCkBAIC0xMzgsNiArMTUzLDEyIEBACiAKIC8vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KIGJvb2wgUGFydGlhbEFwcGx5Q29tYmluZXI6OmFsbG9jYXRlVGVtcG9yYXJpZXMoKSB7CisgIC8vIEEgcGFydGlhbF9hcHBseSBbc3RhY2tdJ3MgYXJndW1lbnQgYXJlIG5vdCBvd25lZCBieSB0aGUgcGFydGlhbF9hcHBseSBhbmQKKyAgLy8gdGhlcmVmb3JlIHRoZWlyIGxpZmV0aW1lIG11c3Qgb3V0bGl2ZSBhbnkgdXNlcy4KKyAgaWYgKFBBSS0+aXNPblN0YWNrKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCiAgIC8vIENvcHkgdGhlIG9yaWdpbmFsIGFyZ3VtZW50cyBvZiB0aGUgcGFydGlhbF9hcHBseSBpbnRvIG5ld2x5IGNyZWF0ZWQKICAgLy8gdGVtcG9yYXJpZXMgYW5kIHVzZSB0aGVzZSB0ZW1wb3JhcmllcyBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBhcmd1bWVudHMKICAgLy8gYWZ0ZXJ3YXJkcy4KQEAgLTM5Nyw2ICs0MTgsMTUgQEAKICAgICAgIFVzZXMuYXBwZW5kKENGSS0+Z2V0VXNlcygpLmJlZ2luKCksIENGSS0+Z2V0VXNlcygpLmVuZCgpKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KKyAgICAvLyBMb29rIHRocm91Z2ggbWFya19kZXBlbmRlbmNlIHVzZXJzIG9mIHBhcnRpYWxfYXBwbHkgW3N0YWNrXS4KKyAgICBpZiAoYXV0byAqTUQgPSBkeW5fY2FzdDxNYXJrRGVwZW5kZW5jZUluc3Q+KFVzZXIpKSB7CisgICAgICBpZiAoTUQtPmdldFZhbHVlKCkgPT0gVXNlLT5nZXQoKSAmJgorICAgICAgICAgIE1ELT5nZXRWYWx1ZSgpLT5nZXRUeXBlKCkuaXM8U0lMRnVuY3Rpb25UeXBlPigpICYmCisgICAgICAgICAgTUQtPmdldFZhbHVlKCktPmdldFR5cGUoKS5jYXN0VG88U0lMRnVuY3Rpb25UeXBlPigpLT5pc05vRXNjYXBlKCkpIHsKKyAgICAgICAgVXNlcy5hcHBlbmQoTUQtPmdldFVzZXMoKS5iZWdpbigpLCBNRC0+Z2V0VXNlcygpLmVuZCgpKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KICAgICAvLyBJZiB0aGlzIHVzZSBvZiBhIHBhcnRpYWxfYXBwbHkgaXMgbm90CiAgICAgLy8gYW4gYXBwbHkgd2hpY2ggdXNlcyBpdCBhcyBhIGNhbGxlZSwgYmFpbC4KICAgICBhdXRvIEFJID0gRnVsbEFwcGx5U2l0ZTo6aXNhKFVzZXIpOwpkaWZmIC0tZ2l0IGEvbGliL1NJTE9wdGltaXplci9UcmFuc2Zvcm1zL1NpbXBsaWZ5Q0ZHLmNwcCBiL2xpYi9TSUxPcHRpbWl6ZXIvVHJhbnNmb3Jtcy9TaW1wbGlmeUNGRy5jcHAKaW5kZXggMGIxOTk3OS4uYzAxYTEzZCAxMDA2NDQKLS0tIGEvbGliL1NJTE9wdGltaXplci9UcmFuc2Zvcm1zL1NpbXBsaWZ5Q0ZHLmNwcAorKysgYi9saWIvU0lMT3B0aW1pemVyL1RyYW5zZm9ybXMvU2ltcGxpZnlDRkcuY3BwCkBAIC0xODQzLDYgKzE4NDMsMjYgQEAKICAgcmV0dXJuIHNpbXBsaWZ5VGVybVdpdGhJZGVudGljYWxEZXN0QmxvY2tzKFRoaXNCQik7CiB9CiAKK2Jvb2wgb25seUNvbnRhaW5zUmVmY291bnRBbmREZWFsbG9jU3RhY2tJbnN0KAorICAgIFNJTEJhc2ljQmxvY2s6OnJldmVyc2VfaXRlcmF0b3IgSSwgU0lMQmFzaWNCbG9jazo6cmV2ZXJzZV9pdGVyYXRvciBFbmQpIHsKKyAgd2hpbGUgKEkgIT0gRW5kKSB7CisgICAgYXV0byBNYXliZURlYWQgPSBJKys7CisgICAgc3dpdGNoIChNYXliZURlYWQtPmdldEtpbmQoKSkgeworICAgICAgLy8gVGhlc2UgdGVjaG5pY2FsbHkgaGF2ZSBzaWRlIGVmZmVjdHMsIGJ1dCBub3Qgb25lcyB0aGF0IG1hdHRlcgorICAgICAgLy8gaW4gYSBibG9jayB0aGF0IHdlIHNob3VsZG4ndCByZWFsbHkgcmVhY2guLi4KKyAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6U3Ryb25nUmV0YWluSW5zdDoKKyAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6U3Ryb25nUmVsZWFzZUluc3Q6CisgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OlJldGFpblZhbHVlSW5zdDoKKyAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6UmVsZWFzZVZhbHVlSW5zdDoKKyAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6RGVhbGxvY1N0YWNrSW5zdDoKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CiAvLy8gc2ltcGxpZnlVbnJlYWNoYWJsZUJsb2NrIC0gU2ltcGxpZnkgYmxvY2tzIGVuZGluZyB3aXRoIHVucmVhY2hhYmxlIGJ5CiAvLy8gcmVtb3ZpbmcgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHNhZmUgdG8gZGVsZXRlIGJhY2t3YXJkcyB1bnRpbCB3ZQogLy8vIGhpdCBhbiBpbnN0cnVjdGlvbiB3ZSBjYW5ub3QgZGVsZXRlLgpAQCAtMTg1Myw2ICsxODczLDggQEAKICAgYXV0byBFbmQgPSBCQi0+cmVuZCgpOwogICBTbWFsbFZlY3RvcjxTSUxJbnN0cnVjdGlvbiAqLCA4PiBEZWFkSW5zdHJzOwogCisgIGJvb2wgY2FuSWdub3JlUmVzdE9mQmxvY2sgPSBmYWxzZTsKKwogICAvLyBXYWxrIGJhY2t3YXJkcyBkZWxldGluZyBpbnN0cnVjdGlvbnMgdGhhdCBzaG91bGQgYmUgc2FmZSB0byBkZWxldGUKICAgLy8gaW4gYSBibG9jayB0aGF0IGVuZHMgd2l0aCB1bnJlYWNoYWJsZS4KICAgd2hpbGUgKEkgIT0gRW5kKSB7CkBAIC0xODY2LDEwICsxODg4LDE5IEBACiAgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OlJldGFpblZhbHVlSW5zdDoKICAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6UmVsZWFzZVZhbHVlSW5zdDoKICAgICAgIGJyZWFrOwotCisgICAgLy8gV2UgY2FuIG9ubHkgaWdub3JlIGEgZGVhbGxvY19zdGFjayBpbnN0cnVjdGlvbiBpZiB3ZSBjYW4gaWdub3JlIGFsbAorICAgIC8vIGluc3RydWN0aW9ucyBpbiB0aGUgYmxvY2suCisgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OkRlYWxsb2NTdGFja0luc3Q6IHsKKyAgICAgIGlmIChjYW5JZ25vcmVSZXN0T2ZCbG9jayB8fAorICAgICAgICAgIG9ubHlDb250YWluc1JlZmNvdW50QW5kRGVhbGxvY1N0YWNrSW5zdChNYXliZURlYWQsIEVuZCkpIHsKKyAgICAgICAgY2FuSWdub3JlUmVzdE9mQmxvY2sgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIExMVk1fRkFMTFRIUk9VR0g7CisgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICBpZiAoTWF5YmVEZWFkLT5tYXlIYXZlU2lkZUVmZmVjdHMoKSkgewotICAgICAgICBpZiAoQ2hhbmdlZCkKKyAgICAgICAgIGlmIChDaGFuZ2VkKQogICAgICAgICAgIGZvciAoYXV0byBEZWFkIDogRGVhZEluc3RycykKICAgICAgICAgICAgIERlYWQtPmVyYXNlRnJvbVBhcmVudCgpOwogICAgICAgICByZXR1cm4gQ2hhbmdlZDsKZGlmZiAtLWdpdCBhL2xpYi9TSUxPcHRpbWl6ZXIvVXRpbHMvR2VuZXJpY3MuY3BwIGIvbGliL1NJTE9wdGltaXplci9VdGlscy9HZW5lcmljcy5jcHAKaW5kZXggYTk0ZmM4Zi4uMWM5Yjg3MiAxMDA2NDQKLS0tIGEvbGliL1NJTE9wdGltaXplci9VdGlscy9HZW5lcmljcy5jcHAKKysrIGIvbGliL1NJTE9wdGltaXplci9VdGlscy9HZW5lcmljcy5jcHAKQEAgLTIwMzMsNyArMjAzMyw4IEBACiAgIGlmIChhdXRvICpQQUkgPSBkeW5fY2FzdDxQYXJ0aWFsQXBwbHlJbnN0PihBSSkpIHsKICAgICBhdXRvICpOZXdQQUkgPSBCdWlsZGVyLmNyZWF0ZVBhcnRpYWxBcHBseSgKICAgICAgICAgTG9jLCBDYWxsZWUsIFN1YnMsIEFyZ3VtZW50cywKLSAgICAgICAgUEFJLT5nZXRUeXBlKCkuZ2V0QXM8U0lMRnVuY3Rpb25UeXBlPigpLT5nZXRDYWxsZWVDb252ZW50aW9uKCkpOworICAgICAgICBQQUktPmdldFR5cGUoKS5nZXRBczxTSUxGdW5jdGlvblR5cGU+KCktPmdldENhbGxlZUNvbnZlbnRpb24oKSwKKyAgICAgICAgUEFJLT5pc09uU3RhY2soKSk7CiAgICAgUEFJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3UEFJKTsKICAgICByZXR1cm4gTmV3UEFJOwogICB9CkBAIC0yNDA0LDcgKzI0MDUsOCBAQAogICAgIGF1dG8gU3VicyA9IFJlSW5mby5nZXRDYWxsZXJQYXJhbVN1YnN0aXR1dGlvbk1hcCgpOwogICAgIGF1dG8gKk5ld1BBSSA9IEJ1aWxkZXIuY3JlYXRlUGFydGlhbEFwcGx5KAogICAgICAgICBQQUktPmdldExvYygpLCBGUkksIFN1YnMsIEFyZ3VtZW50cywKLSAgICAgICAgUEFJLT5nZXRUeXBlKCkuZ2V0QXM8U0lMRnVuY3Rpb25UeXBlPigpLT5nZXRDYWxsZWVDb252ZW50aW9uKCkpOworICAgICAgICBQQUktPmdldFR5cGUoKS5nZXRBczxTSUxGdW5jdGlvblR5cGU+KCktPmdldENhbGxlZUNvbnZlbnRpb24oKSwKKyAgICAgICAgUEFJLT5pc09uU3RhY2soKSk7CiAgICAgUEFJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3UEFJKTsKICAgICBEZWFkQXBwbGllcy5pbnNlcnQoUEFJKTsKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9saWIvU0lMT3B0aW1pemVyL1V0aWxzL0xvY2FsLmNwcCBiL2xpYi9TSUxPcHRpbWl6ZXIvVXRpbHMvTG9jYWwuY3BwCmluZGV4IDMxZTE5ZjMuLmIxOGY3NDUgMTAwNjQ0Ci0tLSBhL2xpYi9TSUxPcHRpbWl6ZXIvVXRpbHMvTG9jYWwuY3BwCisrKyBiL2xpYi9TSUxPcHRpbWl6ZXIvVXRpbHMvTG9jYWwuY3BwCkBAIC0xMTM4LDE0ICsxMTM4LDUwIEBACiAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbAorZGVhZE1hcmtEZXBlbmRlbmNlVXNlcihTSUxJbnN0cnVjdGlvbiAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNJTEluc3RydWN0aW9uICo+ICZEZWxldGVJbnN0cykgeworICBpZiAoIWlzYTxNYXJrRGVwZW5kZW5jZUluc3Q+KEluc3QpKQorICAgIHJldHVybiBmYWxzZTsKKyAgRGVsZXRlSW5zdHMucHVzaF9iYWNrKEluc3QpOworICBmb3IgKGF1dG8gKlVzZSA6IGNhc3Q8U2luZ2xlVmFsdWVJbnN0cnVjdGlvbj4oSW5zdCktPmdldFVzZXMoKSkgeworICAgIGlmICghZGVhZE1hcmtEZXBlbmRlbmNlVXNlcihVc2UtPmdldFVzZXIoKSwgRGVsZXRlSW5zdHMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCiAvLy8gVE9ETzogR2VuZXJhbGl6ZSB0aGlzIHRvIGdlbmVyYWwgb2JqZWN0cy4KIGJvb2wgc3dpZnQ6OnRyeURlbGV0ZURlYWRDbG9zdXJlKFNpbmdsZVZhbHVlSW5zdHJ1Y3Rpb24gKkNsb3N1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0TW9kQ2FsbGJhY2tzIENhbGxiYWNrcykgeworICBhdXRvICpQQSA9IGR5bl9jYXN0PFBhcnRpYWxBcHBseUluc3Q+KENsb3N1cmUpOworCiAgIC8vIFdlIGN1cnJlbnRseSBvbmx5IGhhbmRsZSBsb2NhbGx5IGlkZW50aWZpZWQgdmFsdWVzIHRoYXQgZG8gbm90IGVzY2FwZS4gV2UKICAgLy8gYWxzbyBhc3N1bWUgdGhhdCB0aGUgcGFydGlhbCBhcHBseSBkb2VzIG5vdCBjYXB0dXJlIGFueSBhZGRyZXNzZXMuCi0gIGlmICghaXNhPFBhcnRpYWxBcHBseUluc3Q+KENsb3N1cmUpICYmICFpc2E8VGhpblRvVGhpY2tGdW5jdGlvbkluc3Q+KENsb3N1cmUpKQorICBpZiAoIVBBICYmICFpc2E8VGhpblRvVGhpY2tGdW5jdGlvbkluc3Q+KENsb3N1cmUpKQogICAgIHJldHVybiBmYWxzZTsKIAorICAvLyBBIHN0YWNrIGFsbG9jYXRlZCBwYXJ0aWFsIGFwcGx5IGRvZXMgbm90IGhhdmUgYW55IHJlbGVhc2UgdXNlcnMuIERlbGV0ZSBpdAorICAvLyBpZiB0aGUgb25seSB1c2VycyBhcmUgdGhlIGRlYWxsb2Nfc3RhY2sgYW5kIG1hcmtfZGVwZW5kZW5jZSBpbnN0cnVjdGlvbnMuCisgIGlmIChQQSAmJiBQQS0+aXNPblN0YWNrKCkpIHsKKyAgICBTbWFsbFZlY3RvcjxTSUxJbnN0cnVjdGlvbiosIDg+IERlbGV0ZUluc3RzOworICAgIGZvciAoYXV0byAqVXNlIDogUEEtPmdldFVzZXMoKSkgeworICAgICAgaWYgKGlzYTxEZWFsbG9jU3RhY2tJbnN0PihVc2UtPmdldFVzZXIoKSkgfHwKKyAgICAgICAgICBpc2E8RGVidWdWYWx1ZUluc3Q+KFVzZS0+Z2V0VXNlcigpKSkKKyAgICAgICAgRGVsZXRlSW5zdHMucHVzaF9iYWNrKFVzZS0+Z2V0VXNlcigpKTsKKyAgICAgIGVsc2UgaWYgKCFkZWFkTWFya0RlcGVuZGVuY2VVc2VyKFVzZS0+Z2V0VXNlcigpLCBEZWxldGVJbnN0cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChhdXRvICpJbnN0IDogcmV2ZXJzZShEZWxldGVJbnN0cykpCisgICAgICBDYWxsYmFja3MuRGVsZXRlSW5zdChJbnN0KTsKKyAgICBDYWxsYmFja3MuRGVsZXRlSW5zdChQQSk7CisKKyAgICAvLyBOb3RlOiB0aGUgbGlmZXRpbWUgb2YgdGhlIGNhcHR1cmVkIGFyZ3VtZW50cyBpcyBtYW5hZ2VkIG91dHNpZGUgb2YgdGhlCisgICAgLy8gdHJpdmlhbCBjbG9zdXJlIHZhbHVlIGkuZTogdGhlcmUgd2lsbCBhbHJlYWR5IGJlIHJlbGVhc2VzIGZvciB0aGUKKyAgICAvLyBjYXB0dXJlZCBhcmd1bWVudHMuIFJlbGVhc2luZyBjYXB0dXJlZCBhcmd1bWVudHMgaXMgbm90IG5lY2Vzc2FyeS4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCiAgIC8vIFdlIG9ubHkgYWNjZXB0IGEgdXNlciBpZiBpdCBpcyBhbiBBUkMgb2JqZWN0IHRoYXQgY2FuIGJlIHJlbW92ZWQgaWYgdGhlCiAgIC8vIG9iamVjdCBpcyBkZWFkLiBUaGlzIHNob3VsZCBiZSBleHBhbmRlZCBpbiB0aGUgZnV0dXJlLiBUaGlzIGFsc28gZW5zdXJlcwogICAvLyB0aGF0IHdlIGFyZSBsb2NhbGx5IGlkZW50aWZpZWQgYW5kIG5vbi1lc2NhcGluZyBzaW5jZSB3ZSBvbmx5IGFsbG93IGZvcgpAQCAtMTc2OCw2ICsxODA0LDEzIEBACiAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih3b3JrbGlzdCkpOwogICAgICAgY29udGludWU7CiAKKyAgICAvLyBBIHBhcnRpYWxfYXBwbHkgW3N0YWNrXSBtYXJrcyBpdHMgY2FwdHVyZWQgYXJndW1lbnRzIHdpdGgKKyAgICAvLyBtYXJrX2RlcGVuZGVuY2UuCisgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6Ok1hcmtEZXBlbmRlbmNlSW5zdDoKKyAgICAgIGNvcHkoY2FzdDxTaW5nbGVWYWx1ZUluc3RydWN0aW9uPih1c2VyKS0+Z2V0VXNlcygpLAorICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIod29ya2xpc3QpKTsKKyAgICAgIGNvbnRpbnVlOworCiAgICAgLy8gTG9vayB0aHJvdWdoIGFueSByZWZlcmVuY2UgY291bnQgaW5zdHJ1Y3Rpb25zIHNpbmNlIHRoZXNlIGFyZSBub3QKICAgICAvLyBlc2NhcGVzOgogICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpDb3B5VmFsdWVJbnN0OgpAQCAtMTc3OCw2ICsxODIxLDggQEAKICAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6UmV0YWluVmFsdWVJbnN0OgogICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpSZWxlYXNlVmFsdWVJbnN0OgogICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpEZXN0cm95VmFsdWVJbnN0OgorICAgIC8vIEEgcGFydGlhbF9hcHBseSBbc3RhY2tdIGlzIGRlYWxsb2NhdGVkIHdpdGggYSBkZWFsbG9jX3N0YWNrLgorICAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpEZWFsbG9jU3RhY2tJbnN0OgogICAgICAgY29udGludWU7CiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwpAQCAtMTc5MywzICsxODM4LDIyIEBACiAgICAgcmV0dXJuIE5vbmU7CiAgIHJldHVybiBmOwogfQorCisvLy8gSW5zZXJ0IGRlc3Ryb3lzIG9mIGNhcHR1cmVkIGFyZ3VtZW50cyBvZiBwYXJ0aWFsX2FwcGx5IFtzdGFja10uCit2b2lkIHN3aWZ0OjppbnNlcnREZXN0cm95T2ZDYXB0dXJlZEFyZ3VtZW50cygKKyAgICBQYXJ0aWFsQXBwbHlJbnN0ICpQQUksIFNJTEJ1aWxkZXIgJkIsCisgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woU0lMVmFsdWUpPiBzaG91bGRJbnNlcnREZXN0cm95KSB7CisgIGFzc2VydChQQUktPmlzT25TdGFjaygpKTsKKworICBBcHBseVNpdGUgc2l0ZShQQUkpOworICBTSUxGdW5jdGlvbkNvbnZlbnRpb25zIGNhbGxlZUNvbnYoc2l0ZS5nZXRTdWJzdENhbGxlZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBSS0+Z2V0TW9kdWxlKCkpOworICBhdXRvIGxvYyA9IFJlZ3VsYXJMb2NhdGlvbjo6Z2V0QXV0b0dlbmVyYXRlZExvY2F0aW9uKCk7CisgIGZvciAoYXV0byAmYXJnIDogUEFJLT5nZXRBcmd1bWVudE9wZXJhbmRzKCkpIHsKKyAgICBpZiAoIXNob3VsZEluc2VydERlc3Ryb3koYXJnLmdldCgpKSkgY29udGludWU7CisgICAgdW5zaWduZWQgY2FsbGVlQXJndW1lbnRJbmRleCA9IHNpdGUuZ2V0Q2FsbGVlQXJnSW5kZXgoYXJnKTsKKyAgICBhc3NlcnQoY2FsbGVlQXJndW1lbnRJbmRleCA+PSBjYWxsZWVDb252LmdldFNJTEFyZ0luZGV4T2ZGaXJzdFBhcmFtKCkpOworICAgIGF1dG8gcGFyYW1JbmZvID0gY2FsbGVlQ29udi5nZXRQYXJhbUluZm9Gb3JTSUxBcmcoY2FsbGVlQXJndW1lbnRJbmRleCk7CisgICAgcmVsZWFzZVBhcnRpYWxBcHBseUNhcHR1cmVkQXJnKEIsIGxvYywgYXJnLmdldCgpLCBwYXJhbUluZm8pOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvU0lMT3B0aW1pemVyL1V0aWxzL1N0YWNrTmVzdGluZy5jcHAgYi9saWIvU0lMT3B0aW1pemVyL1V0aWxzL1N0YWNrTmVzdGluZy5jcHAKaW5kZXggY2ViMGVhMS4uNzRlNTE4YSAxMDA2NDQKLS0tIGEvbGliL1NJTE9wdGltaXplci9VdGlscy9TdGFja05lc3RpbmcuY3BwCisrKyBiL2xpYi9TSUxPcHRpbWl6ZXIvVXRpbHMvU3RhY2tOZXN0aW5nLmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgQmxvY2tJbmZvICpCSSA9IFdvcmtMaXN0LnBvcF9iYWNrX3ZhbCgpOwogICAgIGZvciAoU0lMSW5zdHJ1Y3Rpb24gJkkgOiAqQkktPkJsb2NrKSB7CiAgICAgICBpZiAoSS5pc0FsbG9jYXRpbmdTdGFjaygpKSB7Ci0gICAgICAgIGF1dG8gQWxsb2MgPSBjYXN0PEFsbG9jYXRpb25JbnN0PigmSSk7CisgICAgICAgIGF1dG8gQWxsb2MgPSBjYXN0PFNpbmdsZVZhbHVlSW5zdHJ1Y3Rpb24+KCZJKTsKICAgICAgICAgLy8gUmVnaXN0ZXIgdGhpcyBzdGFjayBsb2NhdGlvbi4KICAgICAgICAgdW5zaWduZWQgQ3VycmVudEJpdE51bWJlciA9IFN0YWNrTG9jcy5zaXplKCk7CiAgICAgICAgIFN0YWNrTG9jMkJpdE51bWJlcnNbQWxsb2NdID0gQ3VycmVudEJpdE51bWJlcjsKQEAgLTIxOSwxMiArMjE5LDE2IEBACiAgIHJldHVybiBpc05lc3RlZDsKIH0KIAotc3RhdGljIFNJTEluc3RydWN0aW9uICpjcmVhdGVEZWFsbG9jKEFsbG9jYXRpb25JbnN0ICpBbGxvYywKK3N0YXRpYyBTSUxJbnN0cnVjdGlvbiAqY3JlYXRlRGVhbGxvYyhTaW5nbGVWYWx1ZUluc3RydWN0aW9uICpBbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSUxJbnN0cnVjdGlvbiAqSW5zZXJ0aW9uUG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lMTG9jYXRpb24gTG9jYXRpb24pIHsKICAgU0lMQnVpbGRlcldpdGhTY29wZSBCKEluc2VydGlvblBvaW50KTsKICAgc3dpdGNoIChBbGxvYy0+Z2V0S2luZCgpKSB7CisgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OlBhcnRpYWxBcHBseUluc3Q6CiAgICAgY2FzZSBTSUxJbnN0cnVjdGlvbktpbmQ6OkFsbG9jU3RhY2tJbnN0OgorICAgICAgYXNzZXJ0KChpc2E8QWxsb2NTdGFja0luc3Q+KEFsbG9jKSB8fAorICAgICAgICAgICAgICBjYXN0PFBhcnRpYWxBcHBseUluc3Q+KEFsbG9jKS0+aXNPblN0YWNrKCkpICYmCisgICAgICAgICAgICAgIndyb25nIGluc3RydWN0aW9uIik7CiAgICAgICByZXR1cm4gQi5jcmVhdGVEZWFsbG9jU3RhY2soTG9jYXRpb24sIEFsbG9jKTsKICAgICBjYXNlIFNJTEluc3RydWN0aW9uS2luZDo6QWxsb2NSZWZJbnN0OgogICAgICAgYXNzZXJ0KGNhc3Q8QWxsb2NSZWZJbnN0PihBbGxvYyktPmNhbkFsbG9jT25TdGFjaygpKTsKQEAgLTI0OCw3ICsyNTIsNyBAQAogICBmb3IgKGludCBMb2NOciA9IEFsaXZlQmVmb3JlLmZpbmRfZmlyc3QoKTsgTG9jTnIgPj0gMDsKICAgICAgICBMb2NOciA9IEFsaXZlQmVmb3JlLmZpbmRfbmV4dChMb2NOcikpIHsKICAgICBpZiAoIUFsaXZlQWZ0ZXIudGVzdChMb2NOcikpIHsKLSAgICAgIEFsbG9jYXRpb25JbnN0ICpBbGxvYyA9IFN0YWNrTG9jc1tMb2NOcl0uQWxsb2M7CisgICAgICBhdXRvICpBbGxvYyA9IFN0YWNrTG9jc1tMb2NOcl0uQWxsb2M7CiAgICAgICBJbnNlcnRpb25Qb2ludCA9IGNyZWF0ZURlYWxsb2MoQWxsb2MsIEluc2VydGlvblBvaW50LAogICAgICAgICAgICAgICAgICAgIExvY2F0aW9uLmhhc1ZhbHVlKCkgPyBMb2NhdGlvbi5nZXRWYWx1ZSgpIDogQWxsb2MtPmdldExvYygpKTsKICAgICAgIGNoYW5nZXNNYWRlID0gdHJ1ZTsKQEAgLTM3NCwxMyArMzc4LDEzIEBACiAgICAgZHVtcEJpdHMoQkkuQWxpdmVTdGFja0xvY3NBdEVudHJ5KTsKICAgICBmb3IgKFNJTEluc3RydWN0aW9uICpTdGFja0luc3QgOiBCSS5TdGFja0luc3RzKSB7CiAgICAgICBpZiAoU3RhY2tJbnN0LT5pc0FsbG9jYXRpbmdTdGFjaygpKSB7Ci0gICAgICAgIGF1dG8gQWxsb2NJbnN0ID0gY2FzdDxBbGxvY2F0aW9uSW5zdD4oU3RhY2tJbnN0KTsKKyAgICAgICAgYXV0byBBbGxvY0luc3QgPSBjYXN0PFNpbmdsZVZhbHVlSW5zdHJ1Y3Rpb24+KFN0YWNrSW5zdCk7CiAgICAgICAgIGludCBCaXROciA9IFN0YWNrTG9jMkJpdE51bWJlcnMubG9va3VwKEFsbG9jSW5zdCk7CiAgICAgICAgIGxsdm06OmRiZ3MoKSA8PCAiICBhbGxvYyAjIiA8PCBCaXROciA8PCAiOiBhbGl2ZT0iOwogICAgICAgICBkdW1wQml0cyhTdGFja0xvY3NbQml0TnJdLkFsaXZlTG9jcyk7CiAgICAgICAgIGxsdm06OmRiZ3MoKSA8PCAiICAgICIgPDwgKlN0YWNrSW5zdDsKICAgICAgIH0gZWxzZSBpZiAoU3RhY2tJbnN0LT5pc0RlYWxsb2NhdGluZ1N0YWNrKCkpIHsKLSAgICAgICAgYXV0byAqQWxsb2NJbnN0ID0gY2FzdDxBbGxvY2F0aW9uSW5zdD4oU3RhY2tJbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgICAgICAgYXV0byAqQWxsb2NJbnN0ID0gY2FzdDxTaW5nbGVWYWx1ZUluc3RydWN0aW9uPihTdGFja0luc3QtPmdldE9wZXJhbmQoMCkpOwogICAgICAgICBpbnQgQml0TnIgPSBTdGFja0xvYzJCaXROdW1iZXJzLmxvb2t1cChBbGxvY0luc3QpOwogICAgICAgICBsbHZtOjpkYmdzKCkgPDwgIiAgZGVhbGxvYyBmb3IgIyIgPDwgQml0TnIgPDwgIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAiIDw8ICpTdGFja0luc3Q7CmRpZmYgLS1naXQgYS9saWIvU2VtYS9DU0FwcGx5LmNwcCBiL2xpYi9TZW1hL0NTQXBwbHkuY3BwCmluZGV4IDVmMWMzYTEuLmY1YjQ1OTQgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL0NTQXBwbHkuY3BwCisrKyBiL2xpYi9TZW1hL0NTQXBwbHkuY3BwCkBAIC03ODA4LDIzICs3ODA4LDMxIEBACiAgICAgaWYgKGZpeGVzID09IGZpeGVzUGVyRXhwci5lbmQoKSkKICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGJvb2wgZGlhZ25vc2VkID0gZmFsc2U7Ci0gICAgZm9yIChjb25zdCBhdXRvICpmaXggOiBmaXhlcy0+c2Vjb25kKQotICAgICAgZGlhZ25vc2VkIHw9IGZpeC0+ZGlhZ25vc2UoRSk7Ci0gICAgcmV0dXJuIGRpYWdub3NlZDsKKyAgICBib29sIGRpYWdub3NlZEVycm9yID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICpmaXggOiBmaXhlcy0+c2Vjb25kKSB7CisgICAgICBhdXRvIGRpYWdub3NlZCA9IGZpeC0+ZGlhZ25vc2UoRSk7CisKKyAgICAgIGlmIChmaXgtPmlzV2FybmluZygpKSB7CisgICAgICAgIGFzc2VydChkaWFnbm9zZWQgJiYgIndhcm5pbmdzIHNob3VsZCBhbHdheXMgYmUgZGlhZ25vc2VkIik7CisgICAgICAgICh2b2lkKWRpYWdub3NlZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpYWdub3NlZEVycm9yIHw9IGRpYWdub3NlZDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRpYWdub3NlZEVycm9yOwogICB9OwogCi0gIGJvb2wgZGlhZ25vc2VkID0gZmFsc2U7CisgIGJvb2wgZGlhZ25vc2VkRXJyb3IgPSBmYWxzZTsKICAgRS0+Zm9yRWFjaENoaWxkRXhwcihbJl0oRXhwciAqc3ViRXhwcikgLT4gRXhwciAqIHsKICAgICAvLyBEaWFnbm9zZSByb290IGV4cHJlc3Npb24gYXQgdGhlIGVuZCB0bwogICAgIC8vIHByZXNlcnZlIG9yZGVyaW5nLgogICAgIGlmIChzdWJFeHByICE9IEUpCi0gICAgICBkaWFnbm9zZWQgfD0gZGlhZ25vc2VFeHByRmFpbHVyZXMoc3ViRXhwcik7CisgICAgICBkaWFnbm9zZWRFcnJvciB8PSBkaWFnbm9zZUV4cHJGYWlsdXJlcyhzdWJFeHByKTsKICAgICByZXR1cm4gc3ViRXhwcjsKICAgfSk7CiAKLSAgZGlhZ25vc2VkIHw9IGRpYWdub3NlRXhwckZhaWx1cmVzKEUpOwotICByZXR1cm4gZGlhZ25vc2VkOworICBkaWFnbm9zZWRFcnJvciB8PSBkaWFnbm9zZUV4cHJGYWlsdXJlcyhFKTsKKyAgcmV0dXJuIGRpYWdub3NlZEVycm9yOwogfQogCiAvLy8gQXBwbHkgYSBnaXZlbiBzb2x1dGlvbiB0byB0aGUgZXhwcmVzc2lvbiwgcHJvZHVjaW5nIGEgZnVsbHkKQEAgLTc4MzksMTUgKzc4NDcsMjEgQEAKICAgICBpZiAoc2hvdWxkU3VwcHJlc3NEaWFnbm9zdGljcygpKQogICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICAvLyBJZiB3ZSBjYW4gZGlhZ25vc2UgdGhlIHByb2JsZW0gd2l0aCB0aGUgZml4aXRzIHRoYXQgd2UndmUgcHJlLWFzc3VtZWQsCi0gICAgLy8gZG8gc28gbm93LgotICAgIGlmIChhcHBseVNvbHV0aW9uRml4ZXMoZXhwciwgc29sdXRpb24pKQotICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgYm9vbCBkaWFnbm9zZWRFcnJvcnNWaWFGaXhlcyA9IGFwcGx5U29sdXRpb25GaXhlcyhleHByLCBzb2x1dGlvbik7CisgICAgLy8gSWYgYWxsIG9mIHRoZSBhdmFpbGFibGUgZml4ZXMgd291bGQgcmVzdWx0IGluIGEgd2FybmluZywKKyAgICAvLyB3ZSBjYW4gZ28gYWhlYWQgYW5kIGFwcGx5IHRoaXMgc29sdXRpb24gdG8gQVNULgorICAgIGlmICghbGx2bTo6YWxsX29mKHNvbHV0aW9uLkZpeGVzLCBbXShjb25zdCBDb25zdHJhaW50Rml4ICpmaXgpIHsKKyAgICAgICAgICByZXR1cm4gZml4LT5pc1dhcm5pbmcoKTsKKyAgICAgICAgfSkpIHsKKyAgICAgIC8vIElmIHdlIGFscmVhZHkgZGlhZ25vc2VkIGFueSBlcnJvcnMgdmlhIGZpeGVzLCB0aGF0J3MgaXQuCisgICAgICBpZiAoZGlhZ25vc2VkRXJyb3JzVmlhRml4ZXMpCisgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgLy8gSWYgd2UgZGlkbid0IG1hbmFnZSB0byBkaWFnbm9zZSBhbnl0aGluZyB3ZWxsLCBzbyBmYWxsIGJhY2sgdG8KLSAgICAvLyBkaWFnbm9zaW5nIG1pbmluZyB0aGUgc3lzdGVtIHRvIGNvbnN0cnVjdCBhIHJlYXNvbmFibGUgZXJyb3IgbWVzc2FnZS4KLSAgICBkaWFnbm9zZUZhaWx1cmVGb3JFeHByKGV4cHIpOwotICAgIHJldHVybiBudWxscHRyOworICAgICAgLy8gSWYgd2UgZGlkbid0IG1hbmFnZSB0byBkaWFnbm9zZSBhbnl0aGluZyB3ZWxsLCBzbyBmYWxsIGJhY2sgdG8KKyAgICAgIC8vIGRpYWdub3NpbmcgbWluaW5nIHRoZSBzeXN0ZW0gdG8gY29uc3RydWN0IGEgcmVhc29uYWJsZSBlcnJvciBtZXNzYWdlLgorICAgICAgZGlhZ25vc2VGYWlsdXJlRm9yRXhwcihleHByKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KICAgfQogCiAgIC8vIE1hcmsgYW55IG5vcm1hbCBjb25mb3JtYW5jZXMgdXNlZCBpbiB0aGlzIHNvbHV0aW9uIGFzICJ1c2VkIi4KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL0NTRml4LmggYi9saWIvU2VtYS9DU0ZpeC5oCmluZGV4IGVhNThlMDkuLmRhMWUzYTIgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL0NTRml4LmgKKysrIGIvbGliL1NlbWEvQ1NGaXguaApAQCAtMTExLDE0ICsxMTEsMjEgQEAKICAgRml4S2luZCBLaW5kOwogICBDb25zdHJhaW50TG9jYXRvciAqTG9jYXRvcjsKIAorICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZml4IGlzIHNpbXBsaWZ5IGEgd2FybmluZyB3aGljaCBkb2Vzbid0CisgIC8vLyByZXF1aXJlIGltbWVkaWF0ZSBzb3VyY2UgY2hhbmdlcy4KKyAgYm9vbCBJc1dhcm5pbmc7CisKIHB1YmxpYzoKLSAgQ29uc3RyYWludEZpeChDb25zdHJhaW50U3lzdGVtICZjcywgRml4S2luZCBraW5kLCBDb25zdHJhaW50TG9jYXRvciAqbG9jYXRvcikKLSAgICAgIDogQ1MoY3MpLCBLaW5kKGtpbmQpLCBMb2NhdG9yKGxvY2F0b3IpIHt9CisgIENvbnN0cmFpbnRGaXgoQ29uc3RyYWludFN5c3RlbSAmY3MsIEZpeEtpbmQga2luZCwgQ29uc3RyYWludExvY2F0b3IgKmxvY2F0b3IsCisgICAgICAgICAgICAgICAgYm9vbCB3YXJuaW5nID0gZmFsc2UpCisgICAgICA6IENTKGNzKSwgS2luZChraW5kKSwgTG9jYXRvcihsb2NhdG9yKSwgSXNXYXJuaW5nKHdhcm5pbmcpIHt9CiAKICAgdmlydHVhbCB+Q29uc3RyYWludEZpeCgpOwogCiAgIEZpeEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KIAorICBib29sIGlzV2FybmluZygpIGNvbnN0IHsgcmV0dXJuIElzV2FybmluZzsgfQorCiAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKIAogICAvLy8gRGlhZ25vc2UgYSBmYWlsdXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpeCBnaXZlbgpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvQ1NTb2x2ZXIuY3BwIGIvbGliL1NlbWEvQ1NTb2x2ZXIuY3BwCmluZGV4IGEyNmJkOGIuLjkyNzU5OGMgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL0NTU29sdmVyLmNwcAorKysgYi9saWIvU2VtYS9DU1NvbHZlci5jcHAKQEAgLTE1MDQsMTcgKzE1MDQsMzMgQEAKICAgaWYgKExpdGVyYWxQcm90b2NvbHMuc2l6ZSgpIDw9IDEpCiAgICAgcmV0dXJuOwogCi0gIGxsdm06OlNtYWxsVmVjdG9yPFR5cGUsIDI+IGRlZmF1bHRUeXBlczsKLSAgZm9yIChhdXRvICpwcm90b2NvbCA6IExpdGVyYWxQcm90b2NvbHMpCi0gICAgZGVmYXVsdFR5cGVzLnB1c2hfYmFjayhDUy5UQy5nZXREZWZhdWx0VHlwZShwcm90b2NvbCwgQ1MuREMpKTsKKyAgbGx2bTo6U21hbGxWZWN0b3I8c3RkOjpwYWlyPFByb3RvY29sRGVjbCAqLCBUeXBlPiwgMj4gY2FuZGlkYXRlczsKKyAgbGx2bTo6U21hbGxWZWN0b3I8UHJvdG9jb2xEZWNsICosIDI+IHNraXBwZWRQcm90b2NvbHM7CiAKLSAgYXV0byByZXN1bHQgPSAwOwotICBmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IDE7IGkgPCBMaXRlcmFsUHJvdG9jb2xzLnNpemUoKTsgKytpKSB7CisgIGZvciAoYXV0byAqcHJvdG9jb2wgOiBMaXRlcmFsUHJvdG9jb2xzKSB7CisgICAgaWYgKGF1dG8gZGVmYXVsdFR5cGUgPSBDUy5UQy5nZXREZWZhdWx0VHlwZShwcm90b2NvbCwgQ1MuREMpKSB7CisgICAgICBjYW5kaWRhdGVzLnB1c2hfYmFjayh7cHJvdG9jb2wsIGRlZmF1bHRUeXBlfSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBMb29rcyBsaWtlIGFyZ3VtZW50IGV4cGVjdGVkIHRvIGNvbmZvcm0gdG8gc29tZXRoaW5nIGxpa2UKKyAgICAvLyBgRXhwcmVzc2libGVCeU5pbExpdGVyYWxgIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQKKyAgICAvLyB0eXBlIGFuZCBhcyBhIHJlc3VsdCBjYW4ndCBwYXJ0aWNpcGF0ZSBpbiBtaW5pbWFsaXphdGlvbi4KKyAgICBza2lwcGVkUHJvdG9jb2xzLnB1c2hfYmFjayhwcm90b2NvbCk7CisgIH0KKworICBpZiAoY2FuZGlkYXRlcy5zaXplKCkgPD0gMSkKKyAgICByZXR1cm47CisKKyAgdW5zaWduZWQgcmVzdWx0ID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMSwgbiA9IGNhbmRpZGF0ZXMuc2l6ZSgpOyBpICE9IG47ICsraSkgeworICAgIGNvbnN0IGF1dG8gJmNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXNbaV07CisKICAgICBhdXRvIGZpcnN0ID0KLSAgICAgICAgQ1MuVEMuY29uZm9ybXNUb1Byb3RvY29sKGRlZmF1bHRUeXBlc1tpXSwgTGl0ZXJhbFByb3RvY29sc1tyZXN1bHRdLAorICAgICAgICBDUy5UQy5jb25mb3Jtc1RvUHJvdG9jb2woY2FuZGlkYXRlLnNlY29uZCwgY2FuZGlkYXRlc1tyZXN1bHRdLmZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MuREMsIENvbmZvcm1hbmNlQ2hlY2tGbGFnczo6SW5FeHByZXNzaW9uKTsKICAgICBhdXRvIHNlY29uZCA9Ci0gICAgICAgIENTLlRDLmNvbmZvcm1zVG9Qcm90b2NvbChkZWZhdWx0VHlwZXNbcmVzdWx0XSwgTGl0ZXJhbFByb3RvY29sc1tpXSwKKyAgICAgICAgQ1MuVEMuY29uZm9ybXNUb1Byb3RvY29sKGNhbmRpZGF0ZXNbcmVzdWx0XS5zZWNvbmQsIGNhbmRpZGF0ZS5maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTLkRDLCBDb25mb3JtYW5jZUNoZWNrRmxhZ3M6OkluRXhwcmVzc2lvbik7CiAgICAgaWYgKChmaXJzdCAmJiBzZWNvbmQpIHx8ICghZmlyc3QgJiYgIXNlY29uZCkpCiAgICAgICByZXR1cm47CkBAIC0xNTIzLDkgKzE1MzksOSBAQAogICAgICAgcmVzdWx0ID0gaTsKICAgfQogCi0gIGF1dG8gKnByb3RvY29sID0gTGl0ZXJhbFByb3RvY29sc1tyZXN1bHRdOwogICBMaXRlcmFsUHJvdG9jb2xzLmNsZWFyKCk7Ci0gIExpdGVyYWxQcm90b2NvbHMuaW5zZXJ0KHByb3RvY29sKTsKKyAgTGl0ZXJhbFByb3RvY29scy5pbnNlcnQoY2FuZGlkYXRlc1tyZXN1bHRdLmZpcnN0KTsKKyAgTGl0ZXJhbFByb3RvY29scy5pbnNlcnQoc2tpcHBlZFByb3RvY29scy5iZWdpbigpLCBza2lwcGVkUHJvdG9jb2xzLmVuZCgpKTsKIH0KIAogdm9pZCBDb25zdHJhaW50U3lzdGVtOjpBcmd1bWVudEluZm9Db2xsZWN0b3I6OmR1bXAoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9saWIvU2VtYS9Db25zdHJhaW50U3lzdGVtLmggYi9saWIvU2VtYS9Db25zdHJhaW50U3lzdGVtLmgKaW5kZXggNWQ0NzhjOS4uNTE0ODRjMiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvQ29uc3RyYWludFN5c3RlbS5oCisrKyBiL2xpYi9TZW1hL0NvbnN0cmFpbnRTeXN0ZW0uaApAQCAtMjg3MSw3ICsyODcxLDggQEAKICAgICAvLy8gQSBzZXQgb2YgYWxsIGNvbnN0cmFpbnRzIHdoaWNoIGNvbnRyaWJ1dGUgdG8gcG9udGVudGlhbCBiaW5kaW5ncy4KICAgICBsbHZtOjpTbWFsbFB0clNldDxDb25zdHJhaW50ICosIDg+IFNvdXJjZXM7CiAKLSAgICBQb3RlbnRpYWxCaW5kaW5ncyhUeXBlVmFyaWFibGVUeXBlICp0eXBlVmFyKSA6IFR5cGVWYXIodHlwZVZhcikge30KKyAgICBQb3RlbnRpYWxCaW5kaW5ncyhUeXBlVmFyaWFibGVUeXBlICp0eXBlVmFyKQorICAgICAgICA6IFR5cGVWYXIodHlwZVZhciksIFBvdGVudGlhbGx5SW5jb21wbGV0ZShpc0dlbmVyaWNQYXJhbWV0ZXIoKSkge30KIAogICAgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2V0IG9mIGJpbmRpbmdzIGlzIG5vbi1lbXB0eS4KICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIUJpbmRpbmdzLmVtcHR5KCk7IH0KQEAgLTI5MzcsNiArMjkzOCwxNiBAQAogICAgIC8vLyBDaGVjayBpZiB0aGlzIGJpbmRpbmcgaXMgdmlhYmxlIGZvciBpbmNsdXNpb24gaW4gdGhlIHNldC4KICAgICBib29sIGlzVmlhYmxlKFBvdGVudGlhbEJpbmRpbmcgJmJpbmRpbmcpIGNvbnN0OwogCisgICAgYm9vbCBpc0dlbmVyaWNQYXJhbWV0ZXIoKSBjb25zdCB7CisgICAgICBpZiAoYXV0byAqbG9jYXRvciA9IFR5cGVWYXItPmdldEltcGwoKS5nZXRMb2NhdG9yKCkpIHsKKyAgICAgICAgYXV0byBwYXRoID0gbG9jYXRvci0+Z2V0UGF0aCgpOworICAgICAgICByZXR1cm4gcGF0aC5lbXB0eSgpID8gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBhdGguYmFjaygpLmdldEtpbmQoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRMb2NhdG9yOjpHZW5lcmljUGFyYW1ldGVyOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHZvaWQgZHVtcChsbHZtOjpyYXdfb3N0cmVhbSAmb3V0LAogICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRlbnQgPSAwKSBjb25zdCBMTFZNX0FUVFJJQlVURV9VU0VEIHsKICAgICAgIG91dC5pbmRlbnQoaW5kZW50KTsKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL0xvb2t1cFZpc2libGVEZWNscy5jcHAgYi9saWIvU2VtYS9Mb29rdXBWaXNpYmxlRGVjbHMuY3BwCmluZGV4IDc0YmQ1MTMuLjFlZDJkMTggMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL0xvb2t1cFZpc2libGVEZWNscy5jcHAKKysrIGIvbGliL1NlbWEvTG9va3VwVmlzaWJsZURlY2xzLmNwcApAQCAtMjk0LDkgKzI5NCw5IEBACiAKICAgICAgIC8vIFRoZXNlIGNhc2VzIGFyZSBwcm9iYWJseSBpbXBvc3NpYmxlIGhlcmUgYnV0IGNhbiBhbHNvIGp1c3QKICAgICAgIC8vIGJlIHNhZmVseSBpZ25vcmVkLgotICAgICAgY2FzZSBEZWNsS2luZDo6RW51bUVsZW1lbnQ6CiAgICAgICBjYXNlIERlY2xLaW5kOjpQYXJhbToKICAgICAgIGNhc2UgRGVjbEtpbmQ6Ok1vZHVsZToKKyAgICAgIGNhc2UgRGVjbEtpbmQ6OkVudW1FbGVtZW50OgogICAgICAgICByZXR1cm47CiAKICAgICAgIC8vIEZvciBvdGhlciBraW5kcyBvZiB2YWx1ZXMsIGNoZWNrIGlmIHdlIGFscmVhZHkgcmVwb3J0ZWQgYSBkZWNsCmRpZmYgLS1naXQgYS9saWIvU2VtYS9UeXBlQ2hlY2tFcnJvci5jcHAgYi9saWIvU2VtYS9UeXBlQ2hlY2tFcnJvci5jcHAKaW5kZXggYTk2NzgyOC4uMjBlYWQ3NyAxMDA2NDQKLS0tIGEvbGliL1NlbWEvVHlwZUNoZWNrRXJyb3IuY3BwCisrKyBiL2xpYi9TZW1hL1R5cGVDaGVja0Vycm9yLmNwcApAQCAtMTU1LDYgKzE1NSwxMSBAQAogICAgICAgfQogICAgIH0KICAgICAKKyAgICAvLyBDb25zdHJ1Y3RvciBkZWxlZ2F0aW9uLgorICAgIGlmIChhdXRvIG90aGVyQ3RvckRlY2xSZWYgPSBkeW5fY2FzdDxPdGhlckNvbnN0cnVjdG9yRGVjbFJlZkV4cHI+KGZuKSkgeworICAgICAgcmV0dXJuIEFic3RyYWN0RnVuY3Rpb24ob3RoZXJDdG9yRGVjbFJlZi0+Z2V0RGVjbCgpKTsKKyAgICB9CisKICAgICAvLyBOb3JtYWwgZnVuY3Rpb24gcmVmZXJlbmNlcy4KICAgICBpZiAoYXV0byBkZWNsUmVmID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KGZuKSkgewogICAgICAgVmFsdWVEZWNsICpkZWNsID0gZGVjbFJlZi0+Z2V0RGVjbCgpOwpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvVHlwZUNoZWNrTmFtZUxvb2t1cC5jcHAgYi9saWIvU2VtYS9UeXBlQ2hlY2tOYW1lTG9va3VwLmNwcAppbmRleCBlY2I5YTQ5Li45Yjg3ZWVlIDEwMDY0NAotLS0gYS9saWIvU2VtYS9UeXBlQ2hlY2tOYW1lTG9va3VwLmNwcAorKysgYi9saWIvU2VtYS9UeXBlQ2hlY2tOYW1lTG9va3VwLmNwcApAQCAtNTc0LDE4ICs1NzQsOSBAQAogICByZXR1cm4gbG9va3VwTWVtYmVyKGRjLCB0eXBlLCBEZWNsQmFzZU5hbWU6OmNyZWF0ZUNvbnN0cnVjdG9yKCksIG9wdGlvbnMpOwogfQogCi1lbnVtIDogdW5zaWduZWQgewotICAvLy8gTmV2ZXIgY29uc2lkZXIgYSBjYW5kaWRhdGUgdGhhdCdzIHRoaXMgZGlzdGFuY2UgYXdheSBvciB3b3JzZS4KLSAgVW5yZWFzb25hYmxlQ2FsbEVkaXREaXN0YW5jZSA9IDgsCi0KLSAgLy8vIERvbid0IGNvbnNpZGVyIGNhbmRpZGF0ZXMgdGhhdCBzY29yZSB3b3JzZSB0aGFuIHRoZSBnaXZlbiBkaXN0YW5jZQotICAvLy8gZnJvbSB0aGUgYmVzdCBjYW5kaWRhdGUuCi0gIE1heENhbGxFZGl0RGlzdGFuY2VGcm9tQmVzdENhbmRpZGF0ZSA9IDEKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBnZXRDYWxsRWRpdERpc3RhbmNlKERlY2xOYW1lIHdyaXR0ZW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbE5hbWUgY29ycmVjdGVkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1heEVkaXREaXN0YW5jZSkgewordW5zaWduZWQgVHlwZUNoZWNrZXI6OmdldENhbGxFZGl0RGlzdGFuY2UoRGVjbE5hbWUgd3JpdHRlbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsTmFtZSBjb3JyZWN0ZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWF4RWRpdERpc3RhbmNlKSB7CiAgIC8vIFRPRE86IGNvbnNpZGVyIGFyZ3VtZW50cy4KICAgLy8gVE9ETzogbWF5YmUgaWdub3JlIGNlcnRhaW4ga2luZHMgb2YgbWlzc2luZyAvIHByZXNlbnQgbGFiZWxzIGZvciB0aGUKICAgLy8gICBmaXJzdCBhcmd1bWVudCBsYWJlbD8KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1R5cGVDaGVja1N0bXQuY3BwIGIvbGliL1NlbWEvVHlwZUNoZWNrU3RtdC5jcHAKaW5kZXggYzYyYmEzMy4uNmU1NDM4NiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvVHlwZUNoZWNrU3RtdC5jcHAKKysrIGIvbGliL1NlbWEvVHlwZUNoZWNrU3RtdC5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJzd2lmdC9CYXNpYy9TVExFeHRyYXMuaCIKICNpbmNsdWRlICJzd2lmdC9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCiAjaW5jbHVkZSAic3dpZnQvQmFzaWMvU3RhdGlzdGljLmgiCisjaW5jbHVkZSAic3dpZnQvQmFzaWMvVG9wQ29sbGVjdGlvbi5oIgogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL0xleGVyLmgiCiAjaW5jbHVkZSAic3dpZnQvUGFyc2UvTG9jYWxDb250ZXh0LmgiCiAjaW5jbHVkZSAic3dpZnQvU3ludGF4L1Rva2VuS2luZHMuaCIKQEAgLTc4Nyw2ICs3ODgsNyBAQAogCiAgIFN0bXQgKnZpc2l0QnJlYWtTdG10KEJyZWFrU3RtdCAqUykgewogICAgIExhYmVsZWRTdG10ICpUYXJnZXQgPSBudWxscHRyOworICAgIFRvcENvbGxlY3Rpb248dW5zaWduZWQsIExhYmVsZWRTdG10ICo+IGxhYmVsQ29ycmVjdGlvbnMoMyk7CiAgICAgLy8gUGljayB0aGUgbmVhcmVzdCBicmVhayB0YXJnZXQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbmFtZS4KICAgICBpZiAoUy0+Z2V0VGFyZ2V0TmFtZSgpLmVtcHR5KCkpIHsKICAgICAgIGZvciAoYXV0byBJID0gQWN0aXZlTGFiZWxlZFN0bXRzLnJiZWdpbigpLCBFID0gQWN0aXZlTGFiZWxlZFN0bXRzLnJlbmQoKTsKQEAgLTgwNiwzMSArODA4LDM5IEBACiAgICAgICAgIGlmIChTLT5nZXRUYXJnZXROYW1lKCkgPT0gKCpJKS0+Z2V0TGFiZWxJbmZvKCkuTmFtZSkgewogICAgICAgICAgIFRhcmdldCA9ICpJOwogICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVuc2lnbmVkIGRpc3RhbmNlID0KKyAgICAgICAgICAgIFRDLmdldENhbGxFZGl0RGlzdGFuY2UoUy0+Z2V0VGFyZ2V0TmFtZSgpLCAoKkkpLT5nZXRMYWJlbEluZm8oKS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ2hlY2tlcjo6VW5yZWFzb25hYmxlQ2FsbEVkaXREaXN0YW5jZSk7CisgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgVHlwZUNoZWNrZXI6OlVucmVhc29uYWJsZUNhbGxFZGl0RGlzdGFuY2UpCisgICAgICAgICAgICBsYWJlbENvcnJlY3Rpb25zLmluc2VydChkaXN0YW5jZSwgc3RkOjptb3ZlKCpJKSk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGxhYmVsQ29ycmVjdGlvbnMuZmlsdGVyTWF4U2NvcmVSYW5nZSgKKyAgICAgICAgVHlwZUNoZWNrZXI6Ok1heENhbGxFZGl0RGlzdGFuY2VGcm9tQmVzdENhbmRpZGF0ZSk7CiAgICAgfQogICAgIAogICAgIGlmICghVGFyZ2V0KSB7CiAgICAgICAvLyBJZiB3ZSdyZSBpbiBhIGRlZmVyLCBwcm9kdWNlIGEgdGFpbG9yZWQgZGlhZ25vc3RpYy4KICAgICAgIGlmIChpc0luRGVmZXIoKSkgewogICAgICAgICBUQy5kaWFnbm9zZShTLT5nZXRMb2MoKSwgZGlhZzo6anVtcF9vdXRfb2ZfZGVmZXIsICJicmVhayIpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0gZWxzZSBpZiAoUy0+Z2V0VGFyZ2V0TmFtZSgpLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGFuIHVubGFiZWxlZCBicmVhayBpbnNpZGUgb2YgYW4gJ2lmJyBvciAnZG8nCisgICAgICAgIC8vIHN0YXRlbWVudCwgcHJvZHVjZSBhIG1vcmUgc3BlY2lmaWMgZXJyb3IuCisgICAgICAgIGlmIChzdGQ6OmFueV9vZihBY3RpdmVMYWJlbGVkU3RtdHMucmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmVMYWJlbGVkU3RtdHMucmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFN0bXQgKlMpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNhPElmU3RtdD4oUykgfHwgaXNhPERvU3RtdD4oUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSkgeworICAgICAgICAgIFRDLmRpYWdub3NlKFMtPmdldExvYygpLCBkaWFnOjp1bmxhYmVsZWRfYnJlYWtfb3V0c2lkZV9sb29wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBPdGhlcndpc2UgcHJvZHVjZSBhIGdlbmVyaWMgZXJyb3IuCisgICAgICAgICAgVEMuZGlhZ25vc2UoUy0+Z2V0TG9jKCksIGRpYWc6OmJyZWFrX291dHNpZGVfbG9vcCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVtaXRVbnJlc29sdmVkTGFiZWxEaWFnbm9zdGljcyhUQywgUy0+Z2V0VGFyZ2V0TG9jKCksIFMtPmdldFRhcmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ29ycmVjdGlvbnMpOwogICAgICAgfQotICAgICAgCi0gICAgICBhdXRvIGRpYWdpZCA9IGRpYWc6OmJyZWFrX291dHNpZGVfbG9vcDsKLQotICAgICAgLy8gSWYgc29tZW9uZSBpcyB1c2luZyBhbiB1bmxhYmVsZWQgYnJlYWsgaW5zaWRlIG9mIGFuICdpZicgb3IgJ2RvJwotICAgICAgLy8gc3RhdGVtZW50LCBwcm9kdWNlIGEgbW9yZSBzcGVjaWZpYyBlcnJvci4KLSAgICAgIGlmIChTLT5nZXRUYXJnZXROYW1lKCkuZW1wdHkoKSAmJgotICAgICAgICAgIHN0ZDo6YW55X29mKEFjdGl2ZUxhYmVsZWRTdG10cy5yYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICBBY3RpdmVMYWJlbGVkU3RtdHMucmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgIFsmXShTdG10ICpTKSAtPiBib29sIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc2E8SWZTdG10PihTKSB8fCBpc2E8RG9TdG10PihTKTsKLSAgICAgICAgICAgICAgICAgICAgICB9KSkgewotICAgICAgICBkaWFnaWQgPSBkaWFnOjp1bmxhYmVsZWRfYnJlYWtfb3V0c2lkZV9sb29wOwotICAgICAgfQotCi0gICAgICBUQy5kaWFnbm9zZShTLT5nZXRMb2MoKSwgZGlhZ2lkKTsKICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICBTLT5zZXRUYXJnZXQoVGFyZ2V0KTsKQEAgLTgzOSw2ICs4NDksNyBAQAogCiAgIFN0bXQgKnZpc2l0Q29udGludWVTdG10KENvbnRpbnVlU3RtdCAqUykgewogICAgIExhYmVsZWRTdG10ICpUYXJnZXQgPSBudWxscHRyOworICAgIFRvcENvbGxlY3Rpb248dW5zaWduZWQsIExhYmVsZWRTdG10ICo+IGxhYmVsQ29ycmVjdGlvbnMoMyk7CiAgICAgLy8gU2NhbiB0byBzZWUgaWYgd2UgYXJlIGluIGFueSBub24tc3dpdGNoIGxhYmVsZWQgc3RhdGVtZW50cyAobG9vcHMpLiAgU2NhbgogICAgIC8vIGluc2lkZSBvdXQuCiAgICAgaWYgKFMtPmdldFRhcmdldE5hbWUoKS5lbXB0eSgpKSB7CkBAIC04NTgsMzEgKzg2OSw2OCBAQAogICAgICAgICBpZiAoUy0+Z2V0VGFyZ2V0TmFtZSgpID09ICgqSSktPmdldExhYmVsSW5mbygpLk5hbWUpIHsKICAgICAgICAgICBUYXJnZXQgPSAqSTsKICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1bnNpZ25lZCBkaXN0YW5jZSA9CisgICAgICAgICAgICBUQy5nZXRDYWxsRWRpdERpc3RhbmNlKFMtPmdldFRhcmdldE5hbWUoKSwgKCpJKS0+Z2V0TGFiZWxJbmZvKCkuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNoZWNrZXI6OlVucmVhc29uYWJsZUNhbGxFZGl0RGlzdGFuY2UpOworICAgICAgICAgIGlmIChkaXN0YW5jZSA8IFR5cGVDaGVja2VyOjpVbnJlYXNvbmFibGVDYWxsRWRpdERpc3RhbmNlKQorICAgICAgICAgICAgbGFiZWxDb3JyZWN0aW9ucy5pbnNlcnQoZGlzdGFuY2UsIHN0ZDo6bW92ZSgqSSkpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBsYWJlbENvcnJlY3Rpb25zLmZpbHRlck1heFNjb3JlUmFuZ2UoCisgICAgICAgIFR5cGVDaGVja2VyOjpNYXhDYWxsRWRpdERpc3RhbmNlRnJvbUJlc3RDYW5kaWRhdGUpOwogICAgIH0KIAotICAgIGlmICghVGFyZ2V0KSB7CisgICAgaWYgKFRhcmdldCkgeworICAgICAgLy8gQ29udGludWUgY2Fubm90IGJlIHVzZWQgdG8gcmVwZWF0IHN3aXRjaGVzLCB1c2UgZmFsbHRocm91Z2ggaW5zdGVhZC4KKyAgICAgIGlmICghVGFyZ2V0LT5pc1Bvc3NpYmxlQ29udGludWVUYXJnZXQoKSkgeworICAgICAgICBUQy5kaWFnbm9zZShTLT5nZXRMb2MoKSwgZGlhZzo6Y29udGludWVfbm90X2luX3RoaXNfc3RtdCwKKyAgICAgICAgICAgICAgICAgICAgaXNhPFN3aXRjaFN0bXQ+KFRhcmdldCkgPyAic3dpdGNoIiA6ICJpZiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICB9IGVsc2UgewogICAgICAgLy8gSWYgd2UncmUgaW4gYSBkZWZlciwgcHJvZHVjZSBhIHRhaWxvcmVkIGRpYWdub3N0aWMuCiAgICAgICBpZiAoaXNJbkRlZmVyKCkpIHsKICAgICAgICAgVEMuZGlhZ25vc2UoUy0+Z2V0TG9jKCksIGRpYWc6Omp1bXBfb3V0X29mX2RlZmVyLCAiYnJlYWsiKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9IGVsc2UgaWYgKFMtPmdldFRhcmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgICAgIC8vIElmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiB1bmxhYmVsZWQgY29udGludWUsIHByb2R1Y2UgYSBnZW5lcmljIGVycm9yLgorICAgICAgICBUQy5kaWFnbm9zZShTLT5nZXRMb2MoKSwgZGlhZzo6Y29udGludWVfb3V0c2lkZV9sb29wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVtaXRVbnJlc29sdmVkTGFiZWxEaWFnbm9zdGljcyhUQywgUy0+Z2V0VGFyZ2V0TG9jKCksIFMtPmdldFRhcmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ29ycmVjdGlvbnMpOwogICAgICAgfQotCi0gICAgICBUQy5kaWFnbm9zZShTLT5nZXRMb2MoKSwgZGlhZzo6Y29udGludWVfb3V0c2lkZV9sb29wKTsKICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLQotICAgIC8vIENvbnRpbnVlIGNhbm5vdCBiZSB1c2VkIHRvIHJlcGVhdCBzd2l0Y2hlcywgdXNlIGZhbGx0aHJvdWdoIGluc3RlYWQuCi0gICAgaWYgKCFUYXJnZXQtPmlzUG9zc2libGVDb250aW51ZVRhcmdldCgpKSB7Ci0gICAgICBUQy5kaWFnbm9zZShTLT5nZXRMb2MoKSwgZGlhZzo6Y29udGludWVfbm90X2luX3RoaXNfc3RtdCwKLSAgICAgICAgICAgICAgICAgIGlzYTxTd2l0Y2hTdG10PihUYXJnZXQpID8gInN3aXRjaCIgOiAiaWYiKTsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQogICAgIFMtPnNldFRhcmdldChUYXJnZXQpOwogICAgIHJldHVybiBTOwogICB9CisKKyAgc3RhdGljIHZvaWQKKyAgZW1pdFVucmVzb2x2ZWRMYWJlbERpYWdub3N0aWNzKFR5cGVDaGVja2VyICZ0YywgU291cmNlTG9jIHRhcmdldExvYywgSWRlbnRpZmllciB0YXJnZXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9wQ29sbGVjdGlvbjx1bnNpZ25lZCwgTGFiZWxlZFN0bXQgKj4gY29ycmVjdGlvbnMpIHsKKyAgICAvLyBJZiBhbiB1bnJlc29sdmVkIGxhYmVsIHdhcyB1c2VkLCBidXQgd2UgaGF2ZSBhIHNpbmdsZSBjb3JyZWN0aW9uLAorICAgIC8vIHByb2R1Y2UgdGhlIHNwZWNpZmljIGRpYWdub3N0aWMgYW5kIGZpeGl0LgorICAgIGlmIChjb3JyZWN0aW9ucy5zaXplKCkgPT0gMSkgeworICAgICAgdGMuZGlhZ25vc2UodGFyZ2V0TG9jLCBkaWFnOjp1bnJlc29sdmVkX2xhYmVsX2NvcnJlY3RlZCwKKyAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWUsIGNvcnJlY3Rpb25zLmJlZ2luKCktPlZhbHVlLT5nZXRMYWJlbEluZm8oKS5OYW1lKQorICAgICAgICAuaGlnaGxpZ2h0KFNvdXJjZVJhbmdlKHRhcmdldExvYykpCisgICAgICAgIC5maXhJdFJlcGxhY2UoU291cmNlUmFuZ2UodGFyZ2V0TG9jKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9ucy5iZWdpbigpLT5WYWx1ZS0+Z2V0TGFiZWxJbmZvKCkuTmFtZS5zdHIoKSk7CisgICAgICB0Yy5kaWFnbm9zZShjb3JyZWN0aW9ucy5iZWdpbigpLT5WYWx1ZS0+Z2V0TGFiZWxJbmZvKCkuTG9jLAorICAgICAgICAgICAgICAgICAgZGlhZzo6aWRlbnRpZmllcl9kZWNsYXJlZF9oZXJlLAorICAgICAgICAgICAgICAgICAgY29ycmVjdGlvbnMuYmVnaW4oKS0+VmFsdWUtPmdldExhYmVsSW5mbygpLk5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBJZiB3ZSBoYXZlIG11bHRpcGxlIGNvcnJlY3Rpb25zIG9yIG5vbmUsIHByb2R1Y2UgYSBnZW5lcmljIGRpYWdub3N0aWMKKyAgICAgIC8vIGFuZCBhbGwgY29ycmVjdGlvbnMgYXZhaWxhYmxlLgorICAgICAgdGMuZGlhZ25vc2UodGFyZ2V0TG9jLCBkaWFnOjp1bnJlc29sdmVkX2xhYmVsLCB0YXJnZXROYW1lKQorICAgICAgICAuaGlnaGxpZ2h0KFNvdXJjZVJhbmdlKHRhcmdldExvYykpOworICAgICAgZm9yIChhdXRvICZlbnRyeSA6IGNvcnJlY3Rpb25zKQorICAgICAgICB0Yy5kaWFnbm9zZShlbnRyeS5WYWx1ZS0+Z2V0TGFiZWxJbmZvKCkuTG9jLCBkaWFnOjpub3RlX3R5cG9fY2FuZGlkYXRlLAorICAgICAgICAgICAgICAgICAgICBlbnRyeS5WYWx1ZS0+Z2V0TGFiZWxJbmZvKCkuTmFtZS5zdHIoKSkKKyAgICAgICAgICAuZml4SXRSZXBsYWNlKFNvdXJjZVJhbmdlKHRhcmdldExvYyksCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5WYWx1ZS0+Z2V0TGFiZWxJbmZvKCkuTmFtZS5zdHIoKSk7CisgICAgfQorICB9CiAgIAogICBTdG10ICp2aXNpdEZhbGx0aHJvdWdoU3RtdChGYWxsdGhyb3VnaFN0bXQgKlMpIHsKICAgICBpZiAoIVN3aXRjaExldmVsKSB7CmRpZmYgLS1naXQgYS9saWIvU2VtYS9UeXBlQ2hlY2tlci5oIGIvbGliL1NlbWEvVHlwZUNoZWNrZXIuaAppbmRleCBkZTc3ODI2Li42OTM4ZTM1IDEwMDY0NAotLS0gYS9saWIvU2VtYS9UeXBlQ2hlY2tlci5oCisrKyBiL2xpYi9TZW1hL1R5cGVDaGVja2VyLmgKQEAgLTIxMjgsNiArMjEyOCwyMCBAQAogICAvLy8gQXR0ZW1wdCB0byBvbWl0IG5lZWRsZXNzIHdvcmRzIGZyb20gdGhlIG5hbWUgb2YgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLgogICBPcHRpb25hbDxJZGVudGlmaWVyPiBvbWl0TmVlZGxlc3NXb3JkcyhWYXJEZWNsICp2YXIpOwogCisgIC8vLyBDYWxjdWxhdGUgZWRpdCBkaXN0YW5jZSBiZXR3ZWVuIGRlY2xhcmF0aW9uIG5hbWVzLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0Q2FsbEVkaXREaXN0YW5jZShEZWNsTmFtZSB3cml0dGVuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbE5hbWUgY29ycmVjdGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWF4RWRpdERpc3RhbmNlKTsKKworICBlbnVtIDogdW5zaWduZWQgeworICAgIC8vLyBOZXZlciBjb25zaWRlciBhIGNhbmRpZGF0ZSB0aGF0J3MgdGhpcyBkaXN0YW5jZSBhd2F5IG9yIHdvcnNlLgorICAgIFVucmVhc29uYWJsZUNhbGxFZGl0RGlzdGFuY2UgPSA4LAorCisgICAgLy8vIERvbid0IGNvbnNpZGVyIGNhbmRpZGF0ZXMgdGhhdCBzY29yZSB3b3JzZSB0aGFuIHRoZSBnaXZlbiBkaXN0YW5jZQorICAgIC8vLyBmcm9tIHRoZSBiZXN0IGNhbmRpZGF0ZS4KKyAgICBNYXhDYWxsRWRpdERpc3RhbmNlRnJvbUJlc3RDYW5kaWRhdGUgPSAxCisgIH07CisKICAgLy8vIENoZWNrIGZvciBhIHR5cG8gY29ycmVjdGlvbi4KICAgdm9pZCBwZXJmb3JtVHlwb0NvcnJlY3Rpb24oRGVjbENvbnRleHQgKkRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsUmVmS2luZCByZWZLaW5kLApkaWZmIC0tZ2l0IGEvbGliL1NlcmlhbGl6YXRpb24vRGVzZXJpYWxpemVTSUwuY3BwIGIvbGliL1NlcmlhbGl6YXRpb24vRGVzZXJpYWxpemVTSUwuY3BwCmluZGV4IDVkZmRkNTYuLjBhZGI1OTIgMTAwNjQ0Ci0tLSBhL2xpYi9TZXJpYWxpemF0aW9uL0Rlc2VyaWFsaXplU0lMLmNwcAorKysgYi9saWIvU2VyaWFsaXphdGlvbi9EZXNlcmlhbGl6ZVNJTC5jcHAKQEAgLTEwMjMsOCArMTAyMyw4IEBACiAgICAgYnJlYWs7CiAgIGNhc2UgU0lMX0lOU1RfQVBQTFk6IHsKICAgICB1bnNpZ25lZCBJc1BhcnRpYWw7Ci0gICAgU0lMSW5zdEFwcGx5TGF5b3V0OjpyZWFkUmVjb3JkKHNjcmF0Y2gsIElzUGFydGlhbCwgTnVtU3VicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlJRCwgVHlJRDIsIFZhbElELCBMaXN0T2ZWYWx1ZXMpOworICAgIFNJTEluc3RBcHBseUxheW91dDo6cmVhZFJlY29yZChzY3JhdGNoLCBJc1BhcnRpYWwsIE51bVN1YnMsIFR5SUQsIFR5SUQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxJRCwgTGlzdE9mVmFsdWVzKTsKICAgICBzd2l0Y2ggKElzUGFydGlhbCkgewogICAgIGNhc2UgU0lMX0FQUExZOgogICAgICAgUmF3T3BDb2RlID0gKHVuc2lnbmVkKVNJTEluc3RydWN0aW9uS2luZDo6QXBwbHlJbnN0OwpAQCAtMTQxNiwxMSArMTQxNiwxMyBAQAogICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBMaXN0T2ZWYWx1ZXMuc2l6ZSgpOyBJIDwgRTsgSSsrKQogICAgICAgQXJncy5wdXNoX2JhY2soZ2V0TG9jYWxWYWx1ZSgKICAgICAgICAgICBMaXN0T2ZWYWx1ZXNbSV0sIGZuQ29udi5nZXRTSUxBcmd1bWVudFR5cGUoSSArIHVuYXBwbGllZEFyZ3MpKSk7Ci0KKyAgICBhdXRvIG9uU3RhY2sgPSBjbG9zdXJlVHkuY2FzdFRvPFNJTEZ1bmN0aW9uVHlwZT4oKS0+aXNOb0VzY2FwZSgpCisgICAgICAgICAgICAgICAgICAgICAgID8gUGFydGlhbEFwcGx5SW5zdDo6T25TdGFja0tpbmQ6Ok9uU3RhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgOiBQYXJ0aWFsQXBwbHlJbnN0OjpPblN0YWNrS2luZDo6Tm90T25TdGFjazsKICAgICAvLyBGSVhNRTogV2h5IHRoZSBhcmJpdHJhcnkgb3JkZXIgZGlmZmVyZW5jZSBpbiBJUkJ1aWxkZXIgdHlwZSBhcmd1bWVudD8KICAgICBSZXN1bHRWYWwgPSBCdWlsZGVyLmNyZWF0ZVBhcnRpYWxBcHBseSgKICAgICAgICAgTG9jLCBGblZhbCwgU3Vic3RpdHV0aW9ucywgQXJncywKLSAgICAgICAgY2xvc3VyZVR5LmNhc3RUbzxTSUxGdW5jdGlvblR5cGU+KCktPmdldENhbGxlZUNvbnZlbnRpb24oKSk7CisgICAgICAgIGNsb3N1cmVUeS5jYXN0VG88U0lMRnVuY3Rpb25UeXBlPigpLT5nZXRDYWxsZWVDb252ZW50aW9uKCksIG9uU3RhY2spOwogICAgIGJyZWFrOwogICB9CiAgIGNhc2UgU0lMSW5zdHJ1Y3Rpb25LaW5kOjpCdWlsdGluSW5zdDogewpkaWZmIC0tZ2l0IGEvbGliL1NlcmlhbGl6YXRpb24vU0lMRm9ybWF0LmggYi9saWIvU2VyaWFsaXphdGlvbi9TSUxGb3JtYXQuaAppbmRleCAyY2YwZjc5Li4wZjQxNTYzIDEwMDY0NAotLS0gYS9saWIvU2VyaWFsaXphdGlvbi9TSUxGb3JtYXQuaAorKysgYi9saWIvU2VyaWFsaXphdGlvbi9TSUxGb3JtYXQuaApAQCAtMzc5LDcgKzM3OSw3IEBACiAgICAgU0lMX0JFR0lOX0FQUExZLAogICAgIFNJTF9OT05fVEhST1dJTkdfQkVHSU5fQVBQTFkKICAgfTsKLSAgCisKICAgdXNpbmcgU0lMSW5zdEFwcGx5TGF5b3V0ID0gQkNSZWNvcmRMYXlvdXQ8CiAgICAgU0lMX0lOU1RfQVBQTFksCiAgICAgQkNGaXhlZDwzPiwgICAgICAgICAgIC8vIEFwcGx5S2luZApkaWZmIC0tZ2l0IGEvbGliL1NlcmlhbGl6YXRpb24vU2VyaWFsaXphdGlvbi5jcHAgYi9saWIvU2VyaWFsaXphdGlvbi9TZXJpYWxpemF0aW9uLmNwcAppbmRleCA2ZTdkOTVlLi5mNmQzNGI2IDEwMDY0NAotLS0gYS9saWIvU2VyaWFsaXphdGlvbi9TZXJpYWxpemF0aW9uLmNwcAorKysgYi9saWIvU2VyaWFsaXphdGlvbi9TZXJpYWxpemF0aW9uLmNwcApAQCAtNDc1LDYgKzQ3NSw4IEBACiAgICAgcmV0dXJuIGNhc3Q8QWJzdHJhY3RGdW5jdGlvbkRlY2w+KERDKTsKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlN1YnNjcmlwdERlY2w6CiAgICAgcmV0dXJuIGNhc3Q8U3Vic2NyaXB0RGVjbD4oREMpOworICBjYXNlIERlY2xDb250ZXh0S2luZDo6RW51bUVsZW1lbnREZWNsOgorICAgIHJldHVybiBjYXN0PEVudW1FbGVtZW50RGVjbD4oREMpOwogICB9CiAKICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIERlY2xDb250ZXh0S2luZCBpbiBzd2l0Y2guIik7CkBAIC0xODcwLDYgKzE4NzIsNyBAQAogICBjYXNlIERlY2xDb250ZXh0S2luZDo6SW5pdGlhbGl6ZXI6CiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpUb3BMZXZlbENvZGVEZWNsOgogICBjYXNlIERlY2xDb250ZXh0S2luZDo6U2VyaWFsaXplZExvY2FsOgorICBjYXNlIERlY2xDb250ZXh0S2luZDo6RW51bUVsZW1lbnREZWNsOgogICAgIGxsdm1fdW5yZWFjaGFibGUoImNhbm5vdCBjcm9zcy1yZWZlcmVuY2UgdGhpcyBjb250ZXh0Iik7CiAKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkZpbGVVbml0OgpAQCAtMjQwNSw2ICsyNDA4LDcgQEAKICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlN1YnNjcmlwdERlY2w6CiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpHZW5lcmljVHlwZURlY2w6CiAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFeHRlbnNpb25EZWNsOgorICBjYXNlIERlY2xDb250ZXh0S2luZDo6RW51bUVsZW1lbnREZWNsOgogICAgIGRlY2xPckRlY2xDb250ZXh0SUQgPSBhZGREZWNsUmVmKGdldERlY2xGb3JDb250ZXh0KERDKSk7CiAgICAgaXNEZWNsID0gdHJ1ZTsKICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2xpYi9TeW50YXgvVHJpdmlhLmNwcC5neWIgYi9saWIvU3ludGF4L1RyaXZpYS5jcHAuZ3liCmluZGV4IDBlNjY4MzcuLjM4OWJiMGY2IDEwMDY0NAotLS0gYS9saWIvU3ludGF4L1RyaXZpYS5jcHAuZ3liCisrKyBiL2xpYi9TeW50YXgvVHJpdmlhLmNwcC5neWIKQEAgLTI0LDYgKzI0LDIwIEBACiB1c2luZyBuYW1lc3BhY2Ugc3dpZnQ7CiB1c2luZyBuYW1lc3BhY2Ugc3dpZnQ6OnN5bnRheDsKIAorVHJpdmlhUGllY2UgVHJpdmlhUGllY2U6OmZyb21UZXh0KFRyaXZpYUtpbmQga2luZCwgU3RyaW5nUmVmIHRleHQpIHsKKyAgc3dpdGNoIChraW5kKSB7CislIGZvciB0cml2aWEgaW4gVFJJVklBUzoKKyAgY2FzZSBUcml2aWFLaW5kOjoke3RyaXZpYS5uYW1lfToKKyUgaWYgdHJpdmlhLmlzX2NvbGxlY3Rpb24oKToKKyAgICBhc3NlcnQodGV4dC5zaXplKCkgJSAke3RyaXZpYS5jaGFyYWN0ZXJzX2xlbigpfSA9PSAwKTsKKyAgICByZXR1cm4gVHJpdmlhUGllY2Uoa2luZCwgdGV4dC5zaXplKCkvJHt0cml2aWEuY2hhcmFjdGVyc19sZW4oKX0pOworJSBlbHNlOgorICAgIHJldHVybiBUcml2aWFQaWVjZShraW5kLCBPd25lZFN0cmluZzo6bWFrZVJlZkNvdW50ZWQodGV4dCkpOworJSBlbmQKKyUgZW5kCisgIH0KK30KKwogdm9pZCBUcml2aWFQaWVjZTo6ZHVtcChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIEluZGVudCkgY29uc3QgewogICBmb3IgKGRlY2x0eXBlKENvdW50KSBpID0gMDsgaSA8IEluZGVudDsgKytpKQogICAgIE9TIDw8ICcgJzsKQEAgLTQ0LDcgKzU4LDcgQEAKICAgT1MgPDwgJyknOwogfQogCi1ib29sIFRyaXZpYVBpZWNlOjppc0NvbW1lbnQoKSBjb25zdCB7Citib29sIHN5bnRheDo6aXNDb21tZW50VHJpdmlhS2luZChUcml2aWFLaW5kIEtpbmQpIHsKICAgc3dpdGNoIChLaW5kKSB7CiAlIGZvciB0cml2aWEgaW4gVFJJVklBUzoKICAgY2FzZSBUcml2aWFLaW5kOjoke3RyaXZpYS5uYW1lfToKZGlmZiAtLWdpdCBhL2xpYi9TeW50YXhQYXJzZS9TeW50YXhUcmVlQ3JlYXRvci5jcHAgYi9saWIvU3ludGF4UGFyc2UvU3ludGF4VHJlZUNyZWF0b3IuY3BwCmluZGV4IDk1NzEzMjguLmEyMGJmMzkgMTAwNjQ0Ci0tLSBhL2xpYi9TeW50YXhQYXJzZS9TeW50YXhUcmVlQ3JlYXRvci5jcHAKKysrIGIvbGliL1N5bnRheFBhcnNlL1N5bnRheFRyZWVDcmVhdG9yLmNwcApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgInN3aWZ0L1N5bnRheC9SYXdTeW50YXguaCIKICNpbmNsdWRlICJzd2lmdC9TeW50YXgvU3ludGF4VmlzaXRvci5oIgogI2luY2x1ZGUgInN3aWZ0L1N5bnRheC9Ucml2aWEuaCIKKyNpbmNsdWRlICJzd2lmdC9QYXJzZS9QYXJzZWRUcml2aWEuaCIKICNpbmNsdWRlICJzd2lmdC9QYXJzZS9TeW50YXhQYXJzaW5nQ2FjaGUuaCIKICNpbmNsdWRlICJzd2lmdC9QYXJzZS9Ub2tlbi5oIgogI2luY2x1ZGUgInN3aWZ0L0FTVC9BU1RDb250ZXh0LmgiCkBAIC0zMyw5ICszNCwxMSBAQAogICByZXR1cm4gcmF3OwogfQogCi1TeW50YXhUcmVlQ3JlYXRvcjo6U3ludGF4VHJlZUNyZWF0b3IoU3ludGF4UGFyc2luZ0NhY2hlICpzeW50YXhDYWNoZSwKK1N5bnRheFRyZWVDcmVhdG9yOjpTeW50YXhUcmVlQ3JlYXRvcihTb3VyY2VNYW5hZ2VyICZTTSwgdW5zaWduZWQgYnVmZmVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4UGFyc2luZ0NhY2hlICpzeW50YXhDYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQzxzeW50YXg6OlN5bnRheEFyZW5hPiBhcmVuYSkKLSAgICA6IEFyZW5hKHN0ZDo6bW92ZShhcmVuYSkpLAorICAgIDogU00oU00pLCBCdWZmZXJJRChidWZmZXJJRCksCisgICAgICBBcmVuYShzdGQ6Om1vdmUoYXJlbmEpKSwKICAgICAgIFN5bnRheENhY2hlKHN5bnRheENhY2hlKSwKICAgICAgIFRva2VuQ2FjaGUobmV3IFJhd1N5bnRheFRva2VuQ2FjaGUoKSkgewogfQpAQCAtMTA0LDEzICsxMDcsMzAgQEAKIH0KIAogT3BhcXVlU3ludGF4Tm9kZQotU3ludGF4VHJlZUNyZWF0b3I6OnJlY29yZFRva2VuKGNvbnN0IFRva2VuICZ0b2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ludGF4OjpUcml2aWEgJmxlYWRpbmdUcml2aWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ludGF4OjpUcml2aWEgJnRyYWlsaW5nVHJpdmlhLAorU3ludGF4VHJlZUNyZWF0b3I6OnJlY29yZFRva2VuKHRvayB0b2tlbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHJpdmlhUGllY2U+IGxlYWRpbmdUcml2aWFQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHJpdmlhUGllY2U+IHRyYWlsaW5nVHJpdmlhUGllY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTb3VyY2VSYW5nZSByYW5nZSkgewotICBhdXRvIG93bmVkVGV4dCA9IE93bmVkU3RyaW5nOjptYWtlUmVmQ291bnRlZCh0b2suZ2V0VGV4dCgpKTsKLSAgYXV0byByYXcgPSBUb2tlbkNhY2hlLT5nZXRUb2tlbihBcmVuYSwgdG9rLmdldEtpbmQoKSwgb3duZWRUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRpbmdUcml2aWEuUGllY2VzLCB0cmFpbGluZ1RyaXZpYS5QaWVjZXMpOworICBzaXplX3QgbGVhZGluZ1RyaXZpYUxlbiA9CisgICAgUGFyc2VkVHJpdmlhUGllY2U6OmdldFRvdGFsTGVuZ3RoKGxlYWRpbmdUcml2aWFQaWVjZXMpOworICBzaXplX3QgdHJhaWxpbmdUcml2aWFMZW4gPQorICAgIFBhcnNlZFRyaXZpYVBpZWNlOjpnZXRUb3RhbExlbmd0aCh0cmFpbGluZ1RyaXZpYVBpZWNlcyk7CisgIFNvdXJjZUxvYyB0b2tMb2MgPSByYW5nZS5nZXRTdGFydCgpLmdldEFkdmFuY2VkTG9jKGxlYWRpbmdUcml2aWFMZW4pOworICB1bnNpZ25lZCB0b2tMZW5ndGggPSByYW5nZS5nZXRCeXRlTGVuZ3RoKCkgLQorICAgICAgbGVhZGluZ1RyaXZpYUxlbiAtIHRyYWlsaW5nVHJpdmlhTGVuOworICBDaGFyU291cmNlUmFuZ2UgdG9rUmFuZ2UgPSBDaGFyU291cmNlUmFuZ2V7dG9rTG9jLCB0b2tMZW5ndGh9OworICBTb3VyY2VMb2MgbGVhZGluZ1RyaXZpYUxvYyA9IHJhbmdlLmdldFN0YXJ0KCk7CisgIFNvdXJjZUxvYyB0cmFpbGluZ1RyaXZpYUxvYyA9IHRva0xvYy5nZXRBZHZhbmNlZExvYyh0b2tMZW5ndGgpOworICBUcml2aWEgc3ludGF4TGVhZGluZ1RyaXZpYSA9CisgICAgUGFyc2VkVHJpdmlhUGllY2U6OmNvbnZlcnRUb1N5bnRheFRyaXZpYShsZWFkaW5nVHJpdmlhUGllY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGluZ1RyaXZpYUxvYywgU00sIEJ1ZmZlcklEKTsKKyAgVHJpdmlhIHN5bnRheFRyYWlsaW5nVHJpdmlhID0KKyAgICBQYXJzZWRUcml2aWFQaWVjZTo6Y29udmVydFRvU3ludGF4VHJpdmlhKHRyYWlsaW5nVHJpdmlhUGllY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdUcml2aWFMb2MsIFNNLCBCdWZmZXJJRCk7CisgIFN0cmluZ1JlZiB0b2tlblRleHQgPSBTTS5leHRyYWN0VGV4dCh0b2tSYW5nZSwgQnVmZmVySUQpOworICBhdXRvIG93bmVkVGV4dCA9IE93bmVkU3RyaW5nOjptYWtlUmVmQ291bnRlZCh0b2tlblRleHQpOworICBhdXRvIHJhdyA9IFRva2VuQ2FjaGUtPmdldFRva2VuKEFyZW5hLCB0b2tlbktpbmQsIG93bmVkVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgc3ludGF4TGVhZGluZ1RyaXZpYS5QaWVjZXMsIHN5bnRheFRyYWlsaW5nVHJpdmlhLlBpZWNlcyk7CiAgIE9wYXF1ZVN5bnRheE5vZGUgb3BhcXVlTiA9IHJhdy5nZXQoKTsKICAgcmF3LnJlc2V0V2l0aG91dFJlbGVhc2UoKTsKICAgcmV0dXJuIG9wYXF1ZU47CmRpZmYgLS1naXQgYS9zdGRsaWIvcHVibGljL0Rhcndpbi9DTWFrZUxpc3RzLnR4dCBiL3N0ZGxpYi9wdWJsaWMvRGFyd2luL0NNYWtlTGlzdHMudHh0CmluZGV4IDI0NzFlZjkuLjkwZTUzZDEgMTAwNjQ0Ci0tLSBhL3N0ZGxpYi9wdWJsaWMvRGFyd2luL0NNYWtlTGlzdHMudHh0CisrKyBiL3N0ZGxpYi9wdWJsaWMvRGFyd2luL0NNYWtlTGlzdHMudHh0CkBAIC04LDcgKzgsNyBAQAogICBsaXN0KEFQUEVORCBTV0lGVF9TREtfT1ZFUkxBWV9MSUJSQVJZX0JVSUxEX1RZUEVTIFNUQVRJQykKIGVuZGlmKCkKIAotc2V0KGFsbF9vdmVybGF5cyAiQWNjZWxlcmF0ZTtBcHBLaXQ7QVJLaXQ7QXNzZXRzTGlicmFyeTtBVkZvdW5kYXRpb247Q2FsbEtpdDtDbG91ZEtpdDtDb250YWN0cztDb3JlQXVkaW87Q29yZURhdGE7Q29yZUZvdW5kYXRpb247Q29yZUdyYXBoaWNzO0NvcmVJbWFnZTtDb3JlTG9jYXRpb247Q29yZU1lZGlhO0NyeXB0b1Rva2VuS2l0O0Rpc3BhdGNoO0ZvdW5kYXRpb247R2FtZXBsYXlLaXQ7R0xLaXQ7SG9tZUtpdDtJT0tpdDtJbnRlbnRzO01hcEtpdDtNZWRpYVBsYXllcjtNZXRhbDtNZXRhbEtpdDtNb2RlbElPO05hdHVyYWxMYW5ndWFnZTtOZXR3b3JrO09iamVjdGl2ZUM7T3BlbkNMO29zO1Bob3RvcztRdWFydHpDb3JlO1NhZmFyaVNlcnZpY2VzO1NjZW5lS2l0O3NpbWQ7U3ByaXRlS2l0O1VJS2l0O1Zpc2lvbjtXYXRjaEtpdDtYQ1Rlc3Q7WFBDIikKK3NldChhbGxfb3ZlcmxheXMgIkFjY2VsZXJhdGU7QXBwS2l0O0FSS2l0O0Fzc2V0c0xpYnJhcnk7QVZGb3VuZGF0aW9uO0NhbGxLaXQ7Q2xvdWRLaXQ7Q29tcHJlc3Npb247Q29udGFjdHM7Q29yZUF1ZGlvO0NvcmVEYXRhO0NvcmVGb3VuZGF0aW9uO0NvcmVHcmFwaGljcztDb3JlSW1hZ2U7Q29yZUxvY2F0aW9uO0NvcmVNZWRpYTtDcnlwdG9Ub2tlbktpdDtEaXNwYXRjaDtGb3VuZGF0aW9uO0dhbWVwbGF5S2l0O0dMS2l0O0hvbWVLaXQ7SU9LaXQ7SW50ZW50cztNYXBLaXQ7TWVkaWFQbGF5ZXI7TWV0YWw7TWV0YWxLaXQ7TW9kZWxJTztOYXR1cmFsTGFuZ3VhZ2U7TmV0d29yaztPYmplY3RpdmVDO09wZW5DTDtvcztQaG90b3M7UXVhcnR6Q29yZTtTYWZhcmlTZXJ2aWNlcztTY2VuZUtpdDtzaW1kO1Nwcml0ZUtpdDtVSUtpdDtWaXNpb247V2F0Y2hLaXQ7WENUZXN0O1hQQyIpCiAKIGlmKERFRklORUQgU1dJRlRfT1ZFUkxBWV9UQVJHRVRTKQogICBzZXQob3ZlcmxheXNfdG9fYnVpbGQgJHtTV0lGVF9PVkVSTEFZX1RBUkdFVFN9KQpkaWZmIC0tZ2l0IGEvc3RkbGliL3B1YmxpYy9EYXJ3aW4vQ29tcHJlc3Npb24vQ01ha2VMaXN0cy50eHQgYi9zdGRsaWIvcHVibGljL0Rhcndpbi9Db21wcmVzc2lvbi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjE2N2U1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkbGliL3B1YmxpYy9EYXJ3aW4vQ29tcHJlc3Npb24vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxOCBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuNC4zKQoraW5jbHVkZSgiLi4vLi4vLi4vLi4vY21ha2UvbW9kdWxlcy9TdGFuZGFsb25lT3ZlcmxheS5jbWFrZSIpCisKK2FkZF9zd2lmdF90YXJnZXRfbGlicmFyeShzd2lmdENvbXByZXNzaW9uICR7U1dJRlRfU0RLX09WRVJMQVlfTElCUkFSWV9CVUlMRF9UWVBFU30gSVNfU0RLX09WRVJMQVkKKyAgQ29tcHJlc3Npb24uc3dpZnQKKworICBTV0lGVF9DT01QSUxFX0ZMQUdTICIke1NXSUZUX1JVTlRJTUVfU1dJRlRfQ09NUElMRV9GTEFHU30iCisgIExJTktfRkxBR1MgIiR7U1dJRlRfUlVOVElNRV9TV0lGVF9MSU5LX0ZMQUdTfSIgIi1sY29tcHJlc3Npb24iCisgIFNXSUZUX01PRFVMRV9ERVBFTkRTX09TWCBEYXJ3aW4gRm91bmRhdGlvbgorICBTV0lGVF9NT0RVTEVfREVQRU5EU19JT1MgRGFyd2luIEZvdW5kYXRpb24KKyAgU1dJRlRfTU9EVUxFX0RFUEVORFNfVFZPUyBEYXJ3aW4gRm91bmRhdGlvbgorICBTV0lGVF9NT0RVTEVfREVQRU5EU19XQVRDSE9TIERhcndpbiBGb3VuZGF0aW9uCisKKyAgREVQTE9ZTUVOVF9WRVJTSU9OX09TWCAke1NXSUZUTElCX0RFUExPWU1FTlRfVkVSU0lPTl9DT01QUkVTU0lPTl9PU1h9CisgIERFUExPWU1FTlRfVkVSU0lPTl9JT1MgJHtTV0lGVExJQl9ERVBMT1lNRU5UX1ZFUlNJT05fQ09NUFJFU1NJT05fSU9TfQorICBERVBMT1lNRU5UX1ZFUlNJT05fVFZPUyAke1NXSUZUTElCX0RFUExPWU1FTlRfVkVSU0lPTl9DT01QUkVTU0lPTl9UVk9TfQorICBERVBMT1lNRU5UX1ZFUlNJT05fV0FUQ0hPUyAke1NXSUZUTElCX0RFUExPWU1FTlRfVkVSU0lPTl9DT01QUkVTU0lPTl9XQVRDSE9TfQorKQpkaWZmIC0tZ2l0IGEvc3RkbGliL3B1YmxpYy9EYXJ3aW4vQ29tcHJlc3Npb24vQ29tcHJlc3Npb24uc3dpZnQgYi9zdGRsaWIvcHVibGljL0Rhcndpbi9Db21wcmVzc2lvbi9Db21wcmVzc2lvbi5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjViMThkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkbGliL3B1YmxpYy9EYXJ3aW4vQ29tcHJlc3Npb24vQ29tcHJlc3Npb24uc3dpZnQKQEAgLTAsMCArMSwzMDUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTd2lmdC5vcmcgb3BlbiBzb3VyY2UgcHJvamVjdAorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxNCAtIDIwMTkgQXBwbGUgSW5jLiBhbmQgdGhlIFN3aWZ0IHByb2plY3QgYXV0aG9ycworLy8gTGljZW5zZWQgdW5kZXIgQXBhY2hlIExpY2Vuc2UgdjIuMCB3aXRoIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24KKy8vCisvLyBTZWUgaHR0cHM6Ly9zd2lmdC5vcmcvTElDRU5TRS50eHQgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24KKy8vIFNlZSBodHRwczovL3N3aWZ0Lm9yZy9DT05UUklCVVRPUlMudHh0IGZvciB0aGUgbGlzdCBvZiBTd2lmdCBwcm9qZWN0IGF1dGhvcnMKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbXBvcnQgRGFyd2luCitpbXBvcnQgRm91bmRhdGlvbgorQF9leHBvcnRlZCBpbXBvcnQgQ29tcHJlc3Npb24KKworLy8vIENvbXByZXNzaW9uIGFsZ29yaXRobXMsIHdyYXBzIHRoZSBDIEFQSSBjb25zdGFudHMuCitwdWJsaWMgZW51bSBBbGdvcml0aG06IENhc2VJdGVyYWJsZSB7CisKKyAgLy8vIExaRlNFCisgIGNhc2UgbHpmc2UKKworICAvLy8gRGVmbGF0ZSAoY29uZm9ybWluZyB0byBSRkMgMTk1MSkKKyAgY2FzZSB6bGliCisKKyAgLy8vIExaNCB3aXRoIHNpbXBsZSBmcmFtZSBlbmNhcHN1bGF0aW9uCisgIGNhc2UgbHo0CisKKyAgLy8vIExaTUEgaW4gYSBYWiBjb250YWluZXIKKyAgY2FzZSBsem1hCisKKyAgcHVibGljIHZhciByYXdWYWx1ZTogY29tcHJlc3Npb25fYWxnb3JpdGhtIHsKKyAgICBzd2l0Y2ggc2VsZiB7CisgICAgY2FzZSAubHpmc2U6IHJldHVybiBDT01QUkVTU0lPTl9MWkZTRQorICAgIGNhc2UgLnpsaWI6IHJldHVybiBDT01QUkVTU0lPTl9aTElCCisgICAgY2FzZSAubHo0OiByZXR1cm4gQ09NUFJFU1NJT05fTFo0CisgICAgY2FzZSAubHptYTogcmV0dXJuIENPTVBSRVNTSU9OX0xaTUEKKyAgICB9CisgIH0KK30KKworLy8vIENvbXByZXNzaW9uIGVycm9ycworcHVibGljIGVudW0gRmlsdGVyRXJyb3I6IEVycm9yIHsKKyAgLy8vIEZpbHRlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorICBjYXNlIGZpbHRlckluaXRFcnJvcgorCisgIC8vLyBJbnZhbGlkIGRhdGEgaW4gYSBjYWxsIHRvIGNvbXByZXNzaW9uX3N0cmVhbV9wcm9jZXNzCisgIGNhc2UgZmlsdGVyUHJvY2Vzc0Vycm9yCisKKyAgLy8vIE5vbi1lbXB0eSB3cml0ZSBhZnRlciBhbiBvdXRwdXQgZmlsdGVyIGhhcyBiZWVuIGZpbmFsaXplZAorICBjYXNlIHdyaXRlVG9GaW5hbGl6ZWRGaWx0ZXIKK30KKworLy8vIENvbXByZXNzaW9uIGZpbHRlciBkaXJlY3Rpb24gb2Ygb3BlcmF0aW9uLCBjb21wcmVzcy9kZWNvbXByZXNzCitwdWJsaWMgZW51bSBGaWx0ZXJPcGVyYXRpb24geworICAvLy8gQ29tcHJlc3MgcmF3IGRhdGEgdG8gYSBjb21wcmVzc2VkIHBheWxvYWQKKyAgY2FzZSBjb21wcmVzcworCisgIC8vLyBEZWNvbXByZXNzIGEgY29tcHJlc3NlZCBwYXlsb2FkIHRvIHJhdyBkYXRhCisgIGNhc2UgZGVjb21wcmVzcworCisgIHB1YmxpYyB2YXIgcmF3VmFsdWU6IGNvbXByZXNzaW9uX3N0cmVhbV9vcGVyYXRpb24geworICAgIHN3aXRjaCBzZWxmIHsKKyAgICBjYXNlIC5jb21wcmVzczogcmV0dXJuIENPTVBSRVNTSU9OX1NUUkVBTV9FTkNPREUKKyAgICBjYXNlIC5kZWNvbXByZXNzOiByZXR1cm4gQ09NUFJFU1NJT05fU1RSRUFNX0RFQ09ERQorICAgIH0KKyAgfQorfQorCitAYXZhaWxhYmxlKG1hY09TIDEwLjEyLCBpT1MgMTAuMCwgd2F0Y2hPUyAzLjAsIHR2T1MgMTAuMCwgKikKK2V4dGVuc2lvbiBjb21wcmVzc2lvbl9zdHJlYW0geworCisgIC8vLyBJbml0aWFsaXplIGEgY29tcHJlc3Npb25fc3RyZWFtIHN0cnVjdAorICAvLy8KKyAgLy8vIC0gUGFyYW1ldGVyIG9wZXJhdGlvbjogZGlyZWN0aW9uIG9mIG9wZXJhdGlvbgorICAvLy8gLSBQYXJhbWV0ZXIgYWxnb3JpdGhtOiBjb21wcmVzc2lvbiBhbGdvcml0aG0KKyAgLy8vCisgIC8vLyAtIFRocm93czogYEZpbHRlckVycm9yLmZpbHRlckluaXRFcnJvcmAgaWYgYGFsZ29yaXRobWAgaXMgbm90IHN1cHBvcnRlZAorICAvLy8gICAgICAgICAgIGJ5IHRoZSBDb21wcmVzc2lvbiBzdHJlYW0gQVBJCisgIC8vLworICBpbnRlcm5hbCBpbml0KG9wZXJhdGlvbjogRmlsdGVyT3BlcmF0aW9uLCBhbGdvcml0aG06IEFsZ29yaXRobSkgdGhyb3dzIHsKKyAgICBzZWxmLmluaXQoZHN0X3B0cjogVW5zYWZlTXV0YWJsZVBvaW50ZXI8VUludDg+LmFsbG9jYXRlKGNhcGFjaXR5OjApLAorICAgICAgICAgICAgICBkc3Rfc2l6ZTogMCwKKyAgICAgICAgICAgICAgc3JjX3B0cjogVW5zYWZlTXV0YWJsZVBvaW50ZXI8VUludDg+LmFsbG9jYXRlKGNhcGFjaXR5OjApLAorICAgICAgICAgICAgICBzcmNfc2l6ZTogMCwKKyAgICAgICAgICAgICAgc3RhdGU6IG5pbCkKKyAgICBsZXQgc3RhdHVzID0gY29tcHJlc3Npb25fc3RyZWFtX2luaXQoJnNlbGYsIG9wZXJhdGlvbi5yYXdWYWx1ZSwgYWxnb3JpdGhtLnJhd1ZhbHVlKQorICAgIGd1YXJkIHN0YXR1cyA9PSBDT01QUkVTU0lPTl9TVEFUVVNfT0sgZWxzZSB7IHRocm93IEZpbHRlckVycm9yLmZpbHRlckluaXRFcnJvciB9CisgIH0KK30KKworQGF2YWlsYWJsZShtYWNPUyAxMC4xMiwgaU9TIDEwLjAsIHdhdGNoT1MgMy4wLCB0dk9TIDEwLjAsICopCitwdWJsaWMgY2xhc3MgT3V0cHV0RmlsdGVyIHsKKyAgcHJpdmF0ZSB2YXIgX3N0cmVhbTogY29tcHJlc3Npb25fc3RyZWFtCisgIHByaXZhdGUgdmFyIF9idWY6IFVuc2FmZU11dGFibGVQb2ludGVyPFVJbnQ4PgorICBwcml2YXRlIGxldCBfYnVmQ2FwYWNpdHk6IEludAorICBwcml2YXRlIGxldCBfd3JpdGVGdW5jOiAoRGF0YT8pIHRocm93cyAtPiAoKQorICBwcml2YXRlIHZhciBfZmluYWxpemVkOiBCb29sID0gZmFsc2UKKworICAvLy8gSW5pdGlhbGl6ZSBhbiBvdXRwdXQgZmlsdGVyCisgIC8vLworICAvLy8gLSBQYXJhbWV0ZXJzOgorICAvLy8gLSBvcGVyYXRpb246IGRpcmVjdGlvbiBvZiBvcGVyYXRpb24KKyAgLy8vIC0gYWxnb3JpdGhtOiBjb21wcmVzc2lvbiBhbGdvcml0aG0KKyAgLy8vIC0gYnVmZmVyQ2FwYWNpdHk6IGNhcGFjaXR5IG9mIHRoZSBpbnRlcm5hbCBkYXRhIGJ1ZmZlcgorICAvLy8gLSB3cml0ZUZ1bmM6IGNhbGxlZCB0byB3cml0ZSB0aGUgcHJvY2Vzc2VkIGRhdGEKKyAgLy8vCisgIC8vLyAtIFRocm93czogYEZpbHRlckVycm9yLlN0cmVhbUluaXRFcnJvcmAgaWYgc3RyZWFtIGluaXRpYWxpemF0aW9uIGZhaWxlZAorICBwdWJsaWMgaW5pdCgKKyAgICBfIG9wZXJhdGlvbjogRmlsdGVyT3BlcmF0aW9uLAorICAgIHVzaW5nIGFsZ29yaXRobTogQWxnb3JpdGhtLAorICAgIGJ1ZmZlckNhcGFjaXR5OiBJbnQgPSA2NTUzNiwKKyAgICB3cml0aW5nVG8gd3JpdGVGdW5jOiBAZXNjYXBpbmcgKERhdGE/KSB0aHJvd3MgLT4gKCkKKyAgKSB0aHJvd3MgeworICAgIF9zdHJlYW0gPSB0cnkgY29tcHJlc3Npb25fc3RyZWFtKG9wZXJhdGlvbjogb3BlcmF0aW9uLCBhbGdvcml0aG06IGFsZ29yaXRobSkKKyAgICBfYnVmID0gVW5zYWZlTXV0YWJsZVBvaW50ZXI8VUludDg+LmFsbG9jYXRlKGNhcGFjaXR5OiBidWZmZXJDYXBhY2l0eSkKKyAgICBfYnVmQ2FwYWNpdHkgPSBidWZmZXJDYXBhY2l0eQorICAgIF93cml0ZUZ1bmMgPSB3cml0ZUZ1bmMKKyAgfQorCisgIC8vLyBTZW5kIGRhdGEgdG8gb3V0cHV0IGZpbHRlcgorICAvLy8KKyAgLy8vIFByb2Nlc3NlZCBvdXRwdXQgd2lsbCBiZSBzZW50IHRvIHRoZSBvdXRwdXQgY2xvc3VyZS4KKyAgLy8vIEEgY2FsbCB3aXRoIGVtcHR5L25pbCBkYXRhIGlzIGludGVycHJldGVkIGFzIGZpbmFsaXplKCkuCisgIC8vLyBXcml0aW5nIG5vbiBlbXB0eS9uaWwgZGF0YSB0byBhIGZpbmFsaXplZCBzdHJlYW0gaXMgYW4gZXJyb3IuCisgIC8vLworICAvLy8gLSBQYXJhbWV0ZXIgZGF0YTogZGF0YSB0byBwcm9jZXNzCisgIC8vLworICAvLy8gLSBUaHJvd3M6CisgIC8vLyBgRmlsdGVyRXJyb3IuZmlsdGVyUHJvY2Vzc0Vycm9yYCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcKKyAgLy8vIGBGaWx0ZXJFcnJvci53cml0ZVRvRmluYWxpemVkRmlsdGVyYCBpZiBgZGF0YWAgaXMgbm90IGVtcHR5L25pbCwgYW5kIHRoZQorICAvLy8gZmlsdGVyIGlzIHRoZSBmaW5hbGl6ZWQgc3RhdGUKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhPykgdGhyb3dzIHsKKyAgICAvLyBGaW5hbGl6ZSBpZiBkYXRhIGlzIGVtcHR5L25pbAorICAgIGlmIGRhdGEgPT0gbmlsIHx8IGRhdGEhLmlzRW1wdHkgeyB0cnkgZmluYWxpemUoKSA7IHJldHVybiB9CisKKyAgICAvLyBGYWlsIGlmIGFscmVhZHkgZmluYWxpemVkCisgICAgaWYgX2ZpbmFsaXplZCB7IHRocm93IEZpbHRlckVycm9yLndyaXRlVG9GaW5hbGl6ZWRGaWx0ZXIgfQorCisgICAgLy8gUHJvY2VzcyBhbGwgaW5jb21pbmcgZGF0YQorICAgIHRyeSBkYXRhIS53aXRoVW5zYWZlQnl0ZXMgeyAoc3JjX3B0cjogVW5zYWZlUG9pbnRlcjxVSW50OD4pIGluCisgICAgICBfc3RyZWFtLnNyY19zaXplID0gZGF0YSEuY291bnQKKyAgICAgIF9zdHJlYW0uc3JjX3B0ciA9IHNyY19wdHIKKyAgICAgIHdoaWxlIChfc3RyZWFtLnNyY19zaXplID4gMCkgeyBfID0gdHJ5IHByb2Nlc3MoZmluYWxpemluZzogZmFsc2UpIH0KKyAgICB9CisgIH0KKworICAvLy8gRmluYWxpemUgdGhlIHN0cmVhbSwgaS5lLiBmbHVzaCBhbGwgZGF0YSByZW1haW5pbmcgaW4gdGhlIHN0cmVhbQorICAvLy8KKyAgLy8vIFByb2Nlc3NlZCBvdXRwdXQgd2lsbCBiZSBzZW50IHRvIHRoZSBvdXRwdXQgY2xvc3VyZS4KKyAgLy8vIFdoZW4gYWxsIG91dHB1dCBoYXMgYmVlbiBzZW50LCB0aGUgd3JpdGluZ1RvIGNsb3N1cmUgaXMgY2FsbGVkIG9uZSBsYXN0IHRpbWUgd2l0aCBuaWwgZGF0YS4KKyAgLy8vIE9uY2UgdGhlIHN0cmVhbSBpcyBmaW5hbGl6ZWQsIHdyaXRpbmcgbm9uIGVtcHR5L25pbCBkYXRhIHRvIHRoZSBzdHJlYW0gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCisgIC8vLworICAvLy8gLSBUaHJvd3M6IGBGaWx0ZXJFcnJvci5TdHJlYW1Qcm9jZXNzRXJyb3JgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZworICBwdWJsaWMgZnVuYyBmaW5hbGl6ZSgpIHRocm93cyB7CisgICAgLy8gRG8gbm90aGluZyBpZiBhbHJlYWR5IGZpbmFsaXplZAorICAgIGlmIF9maW5hbGl6ZWQgeyByZXR1cm4gfQorCisgICAgLy8gRmluYWxpemUgc3RyZWFtCisgICAgX3N0cmVhbS5zcmNfc2l6ZSA9IDAKKyAgICB2YXIgc3RhdHVzID0gQ09NUFJFU1NJT05fU1RBVFVTX09LCisgICAgd2hpbGUgKHN0YXR1cyAhPSBDT01QUkVTU0lPTl9TVEFUVVNfRU5EKSB7IHN0YXR1cyA9IHRyeSBwcm9jZXNzKGZpbmFsaXppbmc6IHRydWUpIH0KKworICAgIC8vIFVwZGF0ZSBzdGF0ZQorICAgIF9maW5hbGl6ZWQgPSB0cnVlCisKKyAgICAvLyBOb3RpZnkgZW5kIG9mIHN0cmVhbQorICAgIHRyeSBfd3JpdGVGdW5jKG5pbCkKKyAgfQorCisgIC8vIENsZWFudXAgcmVzb3VyY2VzLiAgVGhlIGZpbHRlciBpcyBmaW5hbGl6ZWQgbm93IGlmIGl0IHdhcyBub3QgZmluYWxpemVkIHlldC4KKyAgZGVpbml0IHsKKyAgICAvLyBGaW5hbGl6ZSBub3cgaWYgbm90IGRvbmUgZWFybGllcgorICAgIHRyeT8gZmluYWxpemUoKQorCisgICAgLy8gQ2xlYW51cAorICAgIF9idWYuZGVhbGxvY2F0ZSgpCisgICAgY29tcHJlc3Npb25fc3RyZWFtX2Rlc3Ryb3koJl9zdHJlYW0pCisgIH0KKworICAvLyBDYWxsIGNvbXByZXNzaW9uX3N0cmVhbV9wcm9jZXNzIHdpdGggY3VycmVudCBzcmMsIGFuZCBkc3Qgc2V0IHRvIF9idWYsIHRoZW4gd3JpdGUgb3V0cHV0IHRvIHRoZSBjbG9zdXJlCisgIC8vIFJldHVybiBzdGF0dXMKKyAgcHJpdmF0ZSBmdW5jIHByb2Nlc3MoZmluYWxpemluZyBmaW5hbGl6ZTogQm9vbCkgdGhyb3dzIC0+IGNvbXByZXNzaW9uX3N0YXR1cyB7CisgICAgLy8gUHJvY2VzcyBjdXJyZW50IGlucHV0LCBhbmQgd3JpdGUgdG8gYnVmCisgICAgX3N0cmVhbS5kc3RfcHRyID0gX2J1ZgorICAgIF9zdHJlYW0uZHN0X3NpemUgPSBfYnVmQ2FwYWNpdHkKKworICAgIGxldCBzdGF0dXMgPSBjb21wcmVzc2lvbl9zdHJlYW1fcHJvY2VzcygmX3N0cmVhbSwgKGZpbmFsaXplID8gSW50MzIoQ09NUFJFU1NJT05fU1RSRUFNX0ZJTkFMSVpFLnJhd1ZhbHVlKSA6IDApKQorICAgIGd1YXJkIHN0YXR1cyAhPSBDT01QUkVTU0lPTl9TVEFUVVNfRVJST1IgZWxzZSB7IHRocm93IEZpbHRlckVycm9yLmZpbHRlclByb2Nlc3NFcnJvciB9CisKKyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBidWYKKyAgICBsZXQgd3JpdHRlbkJ5dGVzID0gX2J1ZkNhcGFjaXR5IC0gX3N0cmVhbS5kc3Rfc2l6ZQorCisgICAgLy8gV3JpdGUgb3V0cHV0CisgICAgaWYgd3JpdHRlbkJ5dGVzID4gMCB7CisgICAgICBsZXQgb3V0RGF0YSA9IERhdGEoYnl0ZXNOb0NvcHk6IF9idWYsIGNvdW50OiB3cml0dGVuQnl0ZXMsIGRlYWxsb2NhdG9yOiAubm9uZSkKKyAgICAgIHRyeSBfd3JpdGVGdW5jKG91dERhdGEpCisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1cworICB9CisKK30KKworQGF2YWlsYWJsZShtYWNPUyAxMC4xMiwgaU9TIDEwLjAsIHdhdGNoT1MgMy4wLCB0dk9TIDEwLjAsICopCitwdWJsaWMgY2xhc3MgSW5wdXRGaWx0ZXIgeworICBwcml2YXRlIHZhciBfc3RyZWFtOiBjb21wcmVzc2lvbl9zdHJlYW0KKyAgcHJpdmF0ZSB2YXIgX2J1ZjogRGF0YT8gPSBuaWwgLy8gY3VycmVudCBpbnB1dCBkYXRhCisgIHByaXZhdGUgbGV0IF9idWZDYXBhY2l0eTogSW50IC8vIHNpemUgdG8gcmVhZCB3aGVuIHJlZmlsbGluZyBfYnVmCisgIHByaXZhdGUgbGV0IF9yZWFkRnVuYzogKEludCkgdGhyb3dzIC0+IERhdGE/CisgIHByaXZhdGUgdmFyIF9lb2ZSZWFjaGVkOiBCb29sID0gZmFsc2UgLy8gZGlkIHdlIHJlYWQgZW5kLW9mLWZpbGUgZnJvbSB0aGUgaW5wdXQ/CisgIHByaXZhdGUgdmFyIF9lbmRSZWFjaGVkOiBCb29sID0gZmFsc2UgLy8gZGlkIHdlIHJlYWNoIGVuZC1vZi1maWxlIGZyb20gdGhlIGRlY29kZXIgc3RyZWFtPworCisgIC8vLyBJbml0aWFsaXplIGFuIGlucHV0IGZpbHRlcgorICAvLy8KKyAgLy8vIC0gUGFyYW1ldGVyczoKKyAgLy8vIC0gb3BlcmF0aW9uOiBkaXJlY3Rpb24gb2Ygb3BlcmF0aW9uCisgIC8vLyAtIGFsZ29yaXRobTogY29tcHJlc3Npb24gYWxnb3JpdGhtCisgIC8vLyAtIGJ1ZmZlckNhcGFjaXR5OiBjYXBhY2l0eSBvZiB0aGUgaW50ZXJuYWwgZGF0YSBidWZmZXIKKyAgLy8vIC0gcmVhZEZ1bmM6IGNhbGxlZCB0byByZWFkIHRoZSBpbnB1dCBkYXRhCisgIC8vLworICAvLy8gLSBUaHJvd3M6IGBGaWx0ZXJFcnJvci5maWx0ZXJJbml0RXJyb3JgIGlmIGZpbHRlciBpbml0aWFsaXphdGlvbiBmYWlsZWQKKyAgcHVibGljIGluaXQoCisgICAgXyBvcGVyYXRpb246IEZpbHRlck9wZXJhdGlvbiwKKyAgICB1c2luZyBhbGdvcml0aG06IEFsZ29yaXRobSwKKyAgICBidWZmZXJDYXBhY2l0eTogSW50ID0gNjU1MzYsCisgICAgcmVhZGluZ0Zyb20gcmVhZEZ1bmM6IEBlc2NhcGluZyAoSW50KSB0aHJvd3MgLT4gRGF0YT8KKyAgKSB0aHJvd3MgeworICAgIF9zdHJlYW0gPSB0cnkgY29tcHJlc3Npb25fc3RyZWFtKG9wZXJhdGlvbjogb3BlcmF0aW9uLCBhbGdvcml0aG06IGFsZ29yaXRobSkKKyAgICBfYnVmQ2FwYWNpdHkgPSBidWZmZXJDYXBhY2l0eQorICAgIF9yZWFkRnVuYyA9IHJlYWRGdW5jCisgIH0KKworICAvLy8gUmVhZCBwcm9jZXNzZWQgZGF0YSBmcm9tIHRoZSBmaWx0ZXIKKyAgLy8vCisgIC8vLyBJbnB1dCBkYXRhLCB3aGVuIG5lZWRlZCwgaXMgb2J0YWluZWQgZnJvbSB0aGUgaW5wdXQgY2xvc3VyZQorICAvLy8gV2hlbiB0aGUgaW5wdXQgY2xvc3VyZSByZXR1cm5zIGEgbmlsIG9yIGVtcHR5IERhdGEgb2JqZWN0LCB0aGUgZmlsdGVyIHdpbGwgYmUKKyAgLy8vIGZpbmFsaXplZCwgYW5kIGFmdGVyIGFsbCBwcm9jZXNzZWQgZGF0YSBoYXMgYmVlbiByZWFkLCByZWFkRGF0YSB3aWxsIHJldHVybiBuaWwKKyAgLy8vIHRvIHNpZ25hbCBlbmQgb2YgaW5wdXQKKyAgLy8vCisgIC8vLyAtIFBhcmFtZXRlciBjb3VudDogbWF4IG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIGZpbHRlcgorICAvLy8KKyAgLy8vIC0gUmV0dXJuczogYSBuZXcgRGF0YSBvYmplY3QgY29udGFpbmluZyBhdCBtb3N0IGBjb3VudGAgb3V0cHV0IGJ5dGVzLCBvciBuaWwgaWYgbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZQorICAvLy8KKyAgLy8vIC0gVGhyb3dzOgorICAvLy8gYEZpbHRlckVycm9yLmZpbHRlclByb2Nlc3NFcnJvcmAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nCisgIHB1YmxpYyBmdW5jIHJlYWREYXRhKG9mTGVuZ3RoIGNvdW50OiBJbnQpIHRocm93cyAtPiBEYXRhPyB7CisgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgcHJlY29uZGl0aW9uKGNvdW50ID4gMCwgIm51bWJlciBvZiBieXRlcyB0byByZWFkIGNhbid0IGJlIDAiKQorCisgICAgLy8gRW5kIHJlYWNoZWQsIHJldHVybiBlYXJseSwgbm90aGluZyB0byBkbworICAgIGlmIF9lbmRSZWFjaGVkIHsgcmV0dXJuIG5pbCB9CisKKyAgICAvLyBBbGxvY2F0ZSByZXN1bHQKKyAgICB2YXIgcmVzdWx0ID0gRGF0YShjb3VudDogY291bnQpCisKKyAgICB0cnkgcmVzdWx0LndpdGhVbnNhZmVNdXRhYmxlQnl0ZXMgeyAoZHN0X3B0cjogVW5zYWZlTXV0YWJsZVBvaW50ZXI8VUludDg+KSBpbgorCisgICAgICAvLyBXcml0ZSB0byByZXN1bHQgdW50aWwgZnVsbCwgb3IgZW5kIHJlYWNoZWQKKyAgICAgIF9zdHJlYW0uZHN0X3NpemUgPSBjb3VudAorICAgICAgX3N0cmVhbS5kc3RfcHRyID0gZHN0X3B0cgorCisgICAgICB3aGlsZSBfc3RyZWFtLmRzdF9zaXplID4gMCAmJiAhX2VuZFJlYWNoZWQgeworCisgICAgICAgIC8vIFJlZmlsbCBfYnVmIGlmIG5lZWRlZCwgYW5kIEVPRiB3YXMgbm90IHlldCByZWFkCisgICAgICAgIGlmIF9zdHJlYW0uc3JjX3NpemUgPT0gMCAmJiAhX2VvZlJlYWNoZWQgeworICAgICAgICAgIF9idWYgPSB0cnkgX3JlYWRGdW5jKF9idWZDYXBhY2l0eSkgLy8gbWF5IGJlIG5pbAorICAgICAgICAgIC8vIFJlc2V0IHNyY19zaXplIHRvIGZ1bGwgX2J1ZiBzaXplCisgICAgICAgICAgaWYgX2J1Zj8uY291bnQgPz8gMCA9PSAwIHsgX2VvZlJlYWNoZWQgPSB0cnVlIH0KKyAgICAgICAgICBfc3RyZWFtLnNyY19zaXplID0gX2J1Zj8uY291bnQgPz8gMAorICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyBzb21lIGRhdGEKKyAgICAgICAgaWYgbGV0IGJ1ZiA9IF9idWYgeworICAgICAgICAgIHRyeSBidWYud2l0aFVuc2FmZUJ5dGVzIHsgKHNyY19wdHI6IFVuc2FmZVBvaW50ZXI8VUludDg+KSBpbgorCisgICAgICAgICAgICAvLyBOZXh0IGJ5dGUgdG8gcmVhZAorICAgICAgICAgICAgX3N0cmVhbS5zcmNfcHRyID0gc3JjX3B0ciArIGJ1Zi5jb3VudCAtIF9zdHJlYW0uc3JjX3NpemUKKworICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGNvbXByZXNzaW9uX3N0cmVhbV9wcm9jZXNzKCZfc3RyZWFtLCAoX2VvZlJlYWNoZWQgPyBJbnQzMihDT01QUkVTU0lPTl9TVFJFQU1fRklOQUxJWkUucmF3VmFsdWUpIDogMCkpCisgICAgICAgICAgICBndWFyZCBzdGF0dXMgIT0gQ09NUFJFU1NJT05fU1RBVFVTX0VSUk9SIGVsc2UgeyB0aHJvdyBGaWx0ZXJFcnJvci5maWx0ZXJQcm9jZXNzRXJyb3IgfQorICAgICAgICAgICAgaWYgc3RhdHVzID09IENPTVBSRVNTSU9OX1NUQVRVU19FTkQgeyBfZW5kUmVhY2hlZCA9IHRydWUgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBsZXQgc3RhdHVzID0gY29tcHJlc3Npb25fc3RyZWFtX3Byb2Nlc3MoJl9zdHJlYW0sIChfZW9mUmVhY2hlZCA/IEludDMyKENPTVBSRVNTSU9OX1NUUkVBTV9GSU5BTElaRS5yYXdWYWx1ZSkgOiAwKSkKKyAgICAgICAgICBndWFyZCBzdGF0dXMgIT0gQ09NUFJFU1NJT05fU1RBVFVTX0VSUk9SIGVsc2UgeyB0aHJvdyBGaWx0ZXJFcnJvci5maWx0ZXJQcm9jZXNzRXJyb3IgfQorICAgICAgICAgIGlmIHN0YXR1cyA9PSBDT01QUkVTU0lPTl9TVEFUVVNfRU5EIHsgX2VuZFJlYWNoZWQgPSB0cnVlIH0KKworICAgICAgICB9CisgICAgICB9CisKKyAgICB9IC8vIHJlc3VsdC53aXRoVW5zYWZlTXV0YWJsZUJ5dGVzCisKKyAgICAvLyBVcGRhdGUgYWN0dWFsIHNpemUKKyAgICByZXN1bHQuY291bnQgPSBjb3VudCAtIF9zdHJlYW0uZHN0X3NpemUKKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKworICAvLyBDbGVhbnVwIHJlc291cmNlcworICBkZWluaXQgeworICAgIGNvbXByZXNzaW9uX3N0cmVhbV9kZXN0cm95KCZfc3RyZWFtKQorICB9CisKK30KZGlmZiAtLWdpdCBhL3N0ZGxpYi9wdWJsaWMvRGFyd2luL0ZvdW5kYXRpb24vSlNPTkVuY29kZXIuc3dpZnQgYi9zdGRsaWIvcHVibGljL0Rhcndpbi9Gb3VuZGF0aW9uL0pTT05FbmNvZGVyLnN3aWZ0CmluZGV4IGU1ODExYTAuLmQ4NzExNjAgMTAwNjQ0Ci0tLSBhL3N0ZGxpYi9wdWJsaWMvRGFyd2luL0ZvdW5kYXRpb24vSlNPTkVuY29kZXIuc3dpZnQKKysrIGIvc3RkbGliL3B1YmxpYy9EYXJ3aW4vRm91bmRhdGlvbi9KU09ORW5jb2Rlci5zd2lmdApAQCAtNTMsOSArNTMsOSBAQAogLy8vIGBKU09ORW5jb2RlcmAgZmFjaWxpdGF0ZXMgdGhlIGVuY29kaW5nIG9mIGBFbmNvZGFibGVgIHZhbHVlcyBpbnRvIEpTT04uCiAvLyBOT1RFOiBvbGRlciBvdmVybGF5cyBoYWQgRm91bmRhdGlvbi5KU09ORW5jb2RlciBhcyB0aGUgT2JqQyBuYW1lLgogLy8gVGhlIHR3byBtdXN0IGNvZXhpc3QsIHNvIGl0IHdhcyByZW5hbWVkLiBUaGUgb2xkIG5hbWUgbXVzdCBub3QgYmUKLS8vIHVzZWQgaW4gdGhlIG5ldyBydW50aW1lLiBfVHRDMTBGb3VuZGF0aW9uMTJfSlNPTkVuY29kZXIgaXMgdGhlCi0vLyBtYW5nbGVkIG5hbWUgZm9yIEZvdW5kYXRpb24uX0pTT05FbmNvZGVyLgotQF9vYmpjUnVudGltZU5hbWUoX1R0QzEwRm91bmRhdGlvbjEyX0pTT05FbmNvZGVyKQorLy8gdXNlZCBpbiB0aGUgbmV3IHJ1bnRpbWUuIF9UdEMxMEZvdW5kYXRpb24xM19fSlNPTkVuY29kZXIgaXMgdGhlCisvLyBtYW5nbGVkIG5hbWUgZm9yIEZvdW5kYXRpb24uX19KU09ORW5jb2Rlci4KK0Bfb2JqY1J1bnRpbWVOYW1lKF9UdEMxMEZvdW5kYXRpb24xM19fSlNPTkVuY29kZXIpCiBvcGVuIGNsYXNzIEpTT05FbmNvZGVyIHsKICAgICAvLyBNQVJLOiBPcHRpb25zCiAKQEAgLTEwMTcsOSArMTAxNyw5IEBACiAvLy8gYEpTT05EZWNvZGVyYCBmYWNpbGl0YXRlcyB0aGUgZGVjb2Rpbmcgb2YgSlNPTiBpbnRvIHNlbWFudGljIGBEZWNvZGFibGVgIHR5cGVzLgogLy8gTk9URTogb2xkZXIgb3ZlcmxheXMgaGFkIEZvdW5kYXRpb24uSlNPTkRlY29kZXIgYXMgdGhlIE9iakMgbmFtZS4KIC8vIFRoZSB0d28gbXVzdCBjb2V4aXN0LCBzbyBpdCB3YXMgcmVuYW1lZC4gVGhlIG9sZCBuYW1lIG11c3Qgbm90IGJlCi0vLyB1c2VkIGluIHRoZSBuZXcgcnVudGltZS4gX1R0QzEwRm91bmRhdGlvbjEyX0pTT05EZWNvZGVyIGlzIHRoZQotLy8gbWFuZ2xlZCBuYW1lIGZvciBGb3VuZGF0aW9uLl9KU09ORGVjb2Rlci4KLUBfb2JqY1J1bnRpbWVOYW1lKF9UdEMxMEZvdW5kYXRpb24xMl9KU09ORGVjb2RlcikKKy8vIHVzZWQgaW4gdGhlIG5ldyBydW50aW1lLiBfVHRDMTBGb3VuZGF0aW9uMTNfX0pTT05EZWNvZGVyIGlzIHRoZQorLy8gbWFuZ2xlZCBuYW1lIGZvciBGb3VuZGF0aW9uLl9fSlNPTkRlY29kZXIuCitAX29iamNSdW50aW1lTmFtZShfVHRDMTBGb3VuZGF0aW9uMTNfX0pTT05EZWNvZGVyKQogb3BlbiBjbGFzcyBKU09ORGVjb2RlciB7CiAgICAgLy8gTUFSSzogT3B0aW9ucwogCkBAIC0xMTkwLDcgKzExOTAsNyBAQAogICAgICAgICAgICAgdGhyb3cgRGVjb2RpbmdFcnJvci5kYXRhQ29ycnVwdGVkKERlY29kaW5nRXJyb3IuQ29udGV4dChjb2RpbmdQYXRoOiBbXSwgZGVidWdEZXNjcmlwdGlvbjogIlRoZSBnaXZlbiBkYXRhIHdhcyBub3QgdmFsaWQgSlNPTi4iLCB1bmRlcmx5aW5nRXJyb3I6IGVycm9yKSkKICAgICAgICAgfQogCi0gICAgICAgIGxldCBkZWNvZGVyID0gX0pTT05EZWNvZGVyKHJlZmVyZW5jaW5nOiB0b3BMZXZlbCwgb3B0aW9uczogc2VsZi5vcHRpb25zKQorICAgICAgICBsZXQgZGVjb2RlciA9IF9fSlNPTkRlY29kZXIocmVmZXJlbmNpbmc6IHRvcExldmVsLCBvcHRpb25zOiBzZWxmLm9wdGlvbnMpCiAgICAgICAgIGd1YXJkIGxldCB2YWx1ZSA9IHRyeSBkZWNvZGVyLnVuYm94KHRvcExldmVsLCBhczogdHlwZSkgZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBEZWNvZGluZ0Vycm9yLnZhbHVlTm90Rm91bmQodHlwZSwgRGVjb2RpbmdFcnJvci5Db250ZXh0KGNvZGluZ1BhdGg6IFtdLCBkZWJ1Z0Rlc2NyaXB0aW9uOiAiVGhlIGdpdmVuIGRhdGEgZGlkIG5vdCBjb250YWluIGEgdG9wLWxldmVsIHZhbHVlLiIpKQogICAgICAgICB9CkBAIC0xMTk5LDkgKzExOTksMTIgQEAKICAgICB9CiB9CiAKLS8vIE1BUks6IC0gX0pTT05EZWNvZGVyCisvLyBNQVJLOiAtIF9fSlNPTkRlY29kZXIKIAotZmlsZXByaXZhdGUgY2xhc3MgX0pTT05EZWNvZGVyIDogRGVjb2RlciB7CisvLyBOT1RFOiBvbGRlciBvdmVybGF5cyBjYWxsZWQgdGhpcyBjbGFzcyBfSlNPTkRlY29kZXIuIFRoZSB0d28gbXVzdAorLy8gY29leGlzdCB3aXRob3V0IGEgY29uZmxpY3RpbmcgT2JqQyBjbGFzcyBuYW1lLCBzbyBpdCB3YXMgcmVuYW1lZC4KKy8vIFRoZSBvbGQgbmFtZSBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBuZXcgcnVudGltZS4KK2ZpbGVwcml2YXRlIGNsYXNzIF9fSlNPTkRlY29kZXIgOiBEZWNvZGVyIHsKICAgICAvLyBNQVJLOiBQcm9wZXJ0aWVzCiAKICAgICAvLy8gVGhlIGRlY29kZXIncyBzdG9yYWdlLgpAQCAtMTMwNyw3ICsxMzEwLDcgQEAKICAgICAvLyBNQVJLOiBQcm9wZXJ0aWVzCiAKICAgICAvLy8gQSByZWZlcmVuY2UgdG8gdGhlIGRlY29kZXIgd2UncmUgcmVhZGluZyBmcm9tLgotICAgIHByaXZhdGUgbGV0IGRlY29kZXI6IF9KU09ORGVjb2RlcgorICAgIHByaXZhdGUgbGV0IGRlY29kZXI6IF9fSlNPTkRlY29kZXIKIAogICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgY29udGFpbmVyIHdlJ3JlIHJlYWRpbmcgZnJvbS4KICAgICBwcml2YXRlIGxldCBjb250YWluZXI6IFtTdHJpbmcgOiBBbnldCkBAIC0xMzE4LDcgKzEzMjEsNyBAQAogICAgIC8vIE1BUks6IC0gSW5pdGlhbGl6YXRpb24KIAogICAgIC8vLyBJbml0aWFsaXplcyBgc2VsZmAgYnkgcmVmZXJlbmNpbmcgdGhlIGdpdmVuIGRlY29kZXIgYW5kIGNvbnRhaW5lci4KLSAgICBmaWxlcHJpdmF0ZSBpbml0KHJlZmVyZW5jaW5nIGRlY29kZXI6IF9KU09ORGVjb2Rlciwgd3JhcHBpbmcgY29udGFpbmVyOiBbU3RyaW5nIDogQW55XSkgeworICAgIGZpbGVwcml2YXRlIGluaXQocmVmZXJlbmNpbmcgZGVjb2RlcjogX19KU09ORGVjb2Rlciwgd3JhcHBpbmcgY29udGFpbmVyOiBbU3RyaW5nIDogQW55XSkgewogICAgICAgICBzZWxmLmRlY29kZXIgPSBkZWNvZGVyCiAgICAgICAgIHN3aXRjaCBkZWNvZGVyLm9wdGlvbnMua2V5RGVjb2RpbmdTdHJhdGVneSB7CiAgICAgICAgIGNhc2UgLnVzZURlZmF1bHRLZXlzOgpAQCAtMTYzNyw3ICsxNjQwLDcgQEAKICAgICAgICAgZGVmZXIgeyBzZWxmLmRlY29kZXIuY29kaW5nUGF0aC5yZW1vdmVMYXN0KCkgfQogCiAgICAgICAgIGxldCB2YWx1ZTogQW55ID0gc2VsZi5jb250YWluZXJba2V5LnN0cmluZ1ZhbHVlXSA/PyBOU051bGwoKQotICAgICAgICByZXR1cm4gX0pTT05EZWNvZGVyKHJlZmVyZW5jaW5nOiB2YWx1ZSwgYXQ6IHNlbGYuZGVjb2Rlci5jb2RpbmdQYXRoLCBvcHRpb25zOiBzZWxmLmRlY29kZXIub3B0aW9ucykKKyAgICAgICAgcmV0dXJuIF9fSlNPTkRlY29kZXIocmVmZXJlbmNpbmc6IHZhbHVlLCBhdDogc2VsZi5kZWNvZGVyLmNvZGluZ1BhdGgsIG9wdGlvbnM6IHNlbGYuZGVjb2Rlci5vcHRpb25zKQogICAgIH0KIAogICAgIHB1YmxpYyBmdW5jIHN1cGVyRGVjb2RlcigpIHRocm93cyAtPiBEZWNvZGVyIHsKQEAgLTE2NTMsNyArMTY1Niw3IEBACiAgICAgLy8gTUFSSzogUHJvcGVydGllcwogCiAgICAgLy8vIEEgcmVmZXJlbmNlIHRvIHRoZSBkZWNvZGVyIHdlJ3JlIHJlYWRpbmcgZnJvbS4KLSAgICBwcml2YXRlIGxldCBkZWNvZGVyOiBfSlNPTkRlY29kZXIKKyAgICBwcml2YXRlIGxldCBkZWNvZGVyOiBfX0pTT05EZWNvZGVyCiAKICAgICAvLy8gQSByZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5lciB3ZSdyZSByZWFkaW5nIGZyb20uCiAgICAgcHJpdmF0ZSBsZXQgY29udGFpbmVyOiBbQW55XQpAQCAtMTY2Nyw3ICsxNjcwLDcgQEAKICAgICAvLyBNQVJLOiAtIEluaXRpYWxpemF0aW9uCiAKICAgICAvLy8gSW5pdGlhbGl6ZXMgYHNlbGZgIGJ5IHJlZmVyZW5jaW5nIHRoZSBnaXZlbiBkZWNvZGVyIGFuZCBjb250YWluZXIuCi0gICAgZmlsZXByaXZhdGUgaW5pdChyZWZlcmVuY2luZyBkZWNvZGVyOiBfSlNPTkRlY29kZXIsIHdyYXBwaW5nIGNvbnRhaW5lcjogW0FueV0pIHsKKyAgICBmaWxlcHJpdmF0ZSBpbml0KHJlZmVyZW5jaW5nIGRlY29kZXI6IF9fSlNPTkRlY29kZXIsIHdyYXBwaW5nIGNvbnRhaW5lcjogW0FueV0pIHsKICAgICAgICAgc2VsZi5kZWNvZGVyID0gZGVjb2RlcgogICAgICAgICBzZWxmLmNvbnRhaW5lciA9IGNvbnRhaW5lcgogICAgICAgICBzZWxmLmNvZGluZ1BhdGggPSBkZWNvZGVyLmNvZGluZ1BhdGgKQEAgLTIwMDAsMTEgKzIwMDMsMTEgQEAKIAogICAgICAgICBsZXQgdmFsdWUgPSBzZWxmLmNvbnRhaW5lcltzZWxmLmN1cnJlbnRJbmRleF0KICAgICAgICAgc2VsZi5jdXJyZW50SW5kZXggKz0gMQotICAgICAgICByZXR1cm4gX0pTT05EZWNvZGVyKHJlZmVyZW5jaW5nOiB2YWx1ZSwgYXQ6IHNlbGYuZGVjb2Rlci5jb2RpbmdQYXRoLCBvcHRpb25zOiBzZWxmLmRlY29kZXIub3B0aW9ucykKKyAgICAgICAgcmV0dXJuIF9fSlNPTkRlY29kZXIocmVmZXJlbmNpbmc6IHZhbHVlLCBhdDogc2VsZi5kZWNvZGVyLmNvZGluZ1BhdGgsIG9wdGlvbnM6IHNlbGYuZGVjb2Rlci5vcHRpb25zKQogICAgIH0KIH0KIAotZXh0ZW5zaW9uIF9KU09ORGVjb2RlciA6IFNpbmdsZVZhbHVlRGVjb2RpbmdDb250YWluZXIgeworZXh0ZW5zaW9uIF9fSlNPTkRlY29kZXIgOiBTaW5nbGVWYWx1ZURlY29kaW5nQ29udGFpbmVyIHsKICAgICAvLyBNQVJLOiBTaW5nbGVWYWx1ZURlY29kaW5nQ29udGFpbmVyIE1ldGhvZHMKIAogICAgIHByaXZhdGUgZnVuYyBleHBlY3ROb25OdWxsPFQ+KF8gdHlwZTogVC5UeXBlKSB0aHJvd3MgewpAQCAtMjA5NSw3ICsyMDk4LDcgQEAKIAogLy8gTUFSSzogLSBDb25jcmV0ZSBWYWx1ZSBSZXByZXNlbnRhdGlvbnMKIAotZXh0ZW5zaW9uIF9KU09ORGVjb2RlciB7CitleHRlbnNpb24gX19KU09ORGVjb2RlciB7CiAgICAgLy8vIFJldHVybnMgdGhlIGdpdmVuIHZhbHVlIHVuYm94ZWQgZnJvbSBhIGNvbnRhaW5lci4KICAgICBmaWxlcHJpdmF0ZSBmdW5jIHVuYm94KF8gdmFsdWU6IEFueSwgYXMgdHlwZTogQm9vbC5UeXBlKSB0aHJvd3MgLT4gQm9vbD8gewogICAgICAgICBndWFyZCAhKHZhbHVlIGlzIE5TTnVsbCkgZWxzZSB7IHJldHVybiBuaWwgfQpkaWZmIC0tZ2l0IGEvc3RkbGliL3B1YmxpYy9Td2lmdFNoaW1zL1N3aWZ0U3RkZGVmLmggYi9zdGRsaWIvcHVibGljL1N3aWZ0U2hpbXMvU3dpZnRTdGRkZWYuaAppbmRleCBlYjdkZjU0Li5hYjZmOWRjIDEwMDY0NAotLS0gYS9zdGRsaWIvcHVibGljL1N3aWZ0U2hpbXMvU3dpZnRTdGRkZWYuaAorKysgYi9zdGRsaWIvcHVibGljL1N3aWZ0U2hpbXMvU3dpZnRTdGRkZWYuaApAQCAtMjksMTEgKzI5LDE4IEBACiAjZW5kaWYKIAogLy8gVGhpcyBzZWxlY3RzIHRoZSBzaWduZWQgZXF1aXZhbGVudCBvZiB0aGUgdW5zaWduZWQgdHlwZSBjaG9zZW4gZm9yIHNpemVfdC4KKyNpZiBfX1NURENfVkVSU0lPTl9fLTAgPj0gMjAxMTEybAogdHlwZWRlZiBfX3R5cGVvZl9fKF9HZW5lcmljKChfX3N3aWZ0X3NpemVfdCkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IDogKGxvbmcgbG9uZyBpbnQpMCwgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgOiAobG9uZyBpbnQpMCwgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCA6IChpbnQpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCA6IChzaG9ydCkwLCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciA6IChzaWduZWQgY2hhcikwKSkgX19zd2lmdF9zc2l6ZV90OworI2VsaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KK3VzaW5nIF9fc3dpZnRfc3NpemVfdCA9IHN0ZDo6bWFrZV9zaWduZWQ8X19zd2lmdF9zaXplX3Q+Ojp0eXBlOworI2Vsc2UKKyNlcnJvciAiZG8gbm90IGhhdmUgX19zd2lmdF9zc2l6ZV90IGRlZmluZWQiCisjZW5kaWYKIAogI2VuZGlmIC8vIFNXSUZUX1NURExJQl9TSElNU19TV0lGVF9TVERERUZfSApkaWZmIC0tZ2l0IGEvc3RkbGliL3B1YmxpYy9jb3JlL0F0b21pY0ludC5zd2lmdC5neWIgYi9zdGRsaWIvcHVibGljL2NvcmUvQXRvbWljSW50LnN3aWZ0Lmd5YgppbmRleCAxN2QzNDg0Li42MjIxN2YyIDEwMDY0NAotLS0gYS9zdGRsaWIvcHVibGljL2NvcmUvQXRvbWljSW50LnN3aWZ0Lmd5YgorKysgYi9zdGRsaWIvcHVibGljL2NvcmUvQXRvbWljSW50LnN3aWZ0Lmd5YgpAQCAtMTAsNyArMTAsMTIgQEAKIC8vCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCisvLyBOT1RFOiBvbGRlciBydW50aW1lcyBoYWQgU3dpZnQuX3N0ZGxpYl9BdG9taWNJbnQgYXMgdGhlIE9iakMgbmFtZS4KKy8vIFRoZSB0d28gbXVzdCBjb2V4aXN0LCBzbyBpdCB3YXMgcmVuYW1lZC4gVGhlIG9sZCBuYW1lIG11c3Qgbm90IGJlCisvLyB1c2VkIGluIHRoZSBuZXcgcnVudGltZS4gX1R0Q3MxOF9fc3RkbGliX0F0b21pY0ludCBpcyB0aGUgbWFuZ2xlZAorLy8gbmFtZSBmb3IgU3dpZnQuX19zdGRsaWJfQXRvbWljSW50CiBAYXZhaWxhYmxlKHN3aWZ0LCBkZXByZWNhdGVkOiA0LjIsIG9ic29sZXRlZDogNS4wKQorQF9vYmpjUnVudGltZU5hbWUoX1R0Q3MxOF9fc3RkbGliX0F0b21pY0ludCkKIHB1YmxpYyBmaW5hbCBjbGFzcyBfc3RkbGliX0F0b21pY0ludCB7CiAgIGludGVybmFsIHZhciBfdmFsdWU6IEludAogCmRpZmYgLS1naXQgYS9zdGRsaWIvcHVibGljL2NvcmUvQnVpbHRpbi5zd2lmdCBiL3N0ZGxpYi9wdWJsaWMvY29yZS9CdWlsdGluLnN3aWZ0CmluZGV4IDc2MWRmMTcuLjAxYjllODkgMTAwNjQ0Ci0tLSBhL3N0ZGxpYi9wdWJsaWMvY29yZS9CdWlsdGluLnN3aWZ0CisrKyBiL3N0ZGxpYi9wdWJsaWMvY29yZS9CdWlsdGluLnN3aWZ0CkBAIC02NjgsOSArNjY4LDYgQEAKICAgcmV0dXJuIEJvb2woQnVpbHRpbi5pc1VuaXF1ZSgmb2JqZWN0KSkKIH0KIAotQF9zaWxnZW5fbmFtZSgiX3N3aWZ0X3JlYWxsb2NPYmplY3QiKQotaW50ZXJuYWwgZnVuYyBfcmVhbGxvY09iamVjdChfIG9iamVjdDogVW5zYWZlTXV0YWJsZVJhd1BvaW50ZXIsIF8gbmV3U2l6ZUluQnl0ZXM6IEludCkgLT4gVW5zYWZlTXV0YWJsZVJhd1BvaW50ZXI/Ci0KIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyB1bmlxdWVseSByZWZlcmVuY2VkLgogLy8vIFRoaXMgcHJvdmlkZXMgc2FuaXR5IGNoZWNrcyBvbiB0b3Agb2YgdGhlIEJ1aWx0aW4uCiBAX3RyYW5zcGFyZW50CmRpZmYgLS1naXQgYS9zdGRsaWIvcHVibGljL2NvcmUvQ2xvc2VkUmFuZ2Uuc3dpZnQgYi9zdGRsaWIvcHVibGljL2NvcmUvQ2xvc2VkUmFuZ2Uuc3dpZnQKaW5kZXggMTQ2OGFiOC4uZGIxYjFmZiAxMDA2NDQKLS0tIGEvc3RkbGliL3B1YmxpYy9jb3JlL0Nsb3NlZFJhbmdlLnN3aWZ0CisrKyBiL3N0ZGxpYi9wdWJsaWMvY29yZS9DbG9zZWRSYW5nZS5zd2lmdApAQCAtNDMzLDYgKzQzMyw3IEBACiAgIC8vLyBBbiBlcXVpdmFsZW50IHJhbmdlIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyBhIGNsb3NlZCByYW5nZS4KICAgLy8vIEZvciBleGFtcGxlLCBwYXNzaW5nIGFuIGVtcHR5IHJhbmdlIGFzIGBvdGhlcmAgdHJpZ2dlcnMgYSBydW50aW1lIGVycm9yLAogICAvLy8gYmVjYXVzZSBhbiBlbXB0eSByYW5nZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYnkgYSBjbG9zZWQgcmFuZ2UgaW5zdGFuY2UuCisgIEBpbmxpbmFibGUKICAgcHVibGljIGluaXQoXyBvdGhlcjogUmFuZ2U8Qm91bmQ+KSB7CiAgICAgX3ByZWNvbmRpdGlvbighb3RoZXIuaXNFbXB0eSwgIkNhbid0IGZvcm0gYW4gZW1wdHkgY2xvc2VkIHJhbmdlIikKICAgICBsZXQgdXBwZXJCb3VuZCA9IG90aGVyLnVwcGVyQm91bmQuYWR2YW5jZWQoYnk6IC0xKQpkaWZmIC0tZ2l0IGEvc3RkbGliL3B1YmxpYy9jb3JlL01hbmFnZWRCdWZmZXIuc3dpZnQgYi9zdGRsaWIvcHVibGljL2NvcmUvTWFuYWdlZEJ1ZmZlci5zd2lmdAppbmRleCBhYjViNzRjLi42N2MwYThkIDEwMDY0NAotLS0gYS9zdGRsaWIvcHVibGljL2NvcmUvTWFuYWdlZEJ1ZmZlci5zd2lmdAorKysgYi9zdGRsaWIvcHVibGljL2NvcmUvTWFuYWdlZEJ1ZmZlci5zd2lmdApAQCAtMTM2LDMwICsxMzYsNiBAQAogICB9CiB9CiAKLUBpbmxpbmUobmV2ZXIpCi1wdWJsaWMgZnVuYyB0cnlSZWFsbG9jYXRlVW5pcXVlbHlSZWZlcmVuY2VkPEhlYWRlciwgRWxlbWVudCwgQnVmZmVyOiBNYW5hZ2VkQnVmZmVyPEhlYWRlciwgRWxlbWVudD4+KAotICBidWZmZXI6IGlub3V0IEJ1ZmZlciwKLSAgbmV3TWluaW11bUNhcGFjaXR5OiBJbnQKLSkgLT4gQm9vbCB7Ci0gIHByZWNvbmRpdGlvbihfaXNCaXR3aXNlVGFrYWJsZShIZWFkZXIuc2VsZikpCi0gIHByZWNvbmRpdGlvbihfaXNCaXR3aXNlVGFrYWJsZShFbGVtZW50LnNlbGYpKQotICBwcmVjb25kaXRpb24oaXNLbm93blVuaXF1ZWx5UmVmZXJlbmNlZCgmYnVmZmVyKSkKLQotICBsZXQgbmV3U2l6ZUluQnl0ZXMgPSBNZW1vcnlMYXlvdXQ8SGVhZGVyPi5zdHJpZGUKLSAgICArIG5ld01pbmltdW1DYXBhY2l0eSAqIE1lbW9yeUxheW91dDxFbGVtZW50Pi5zdHJpZGUKLQotICByZXR1cm4gd2l0aFVuc2FmZU11dGFibGVQb2ludGVyKHRvOiAmYnVmZmVyKSB7Ci0gICAgJDAud2l0aE1lbW9yeVJlYm91bmQodG86IFVuc2FmZU11dGFibGVSYXdQb2ludGVyLnNlbGYsIGNhcGFjaXR5OiAxKSB7Ci0gICAgICBpZiBsZXQgcmVhbGxvY2RPYmplY3QgPSBfcmVhbGxvY09iamVjdCgkMC5wb2ludGVlLCBuZXdTaXplSW5CeXRlcykgewotICAgICAgICAkMC5wb2ludGVlID0gcmVhbGxvY2RPYmplY3QKLSAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZQotICAgICAgfQotICAgIH0KLSAgfQotfQotCiAvLy8gQ29udGFpbnMgYSBidWZmZXIgb2JqZWN0LCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIGFuIGluc3RhbmNlIG9mCiAvLy8gYEhlYWRlcmAgYW5kIGNvbnRpZ3VvdXMgc3RvcmFnZSBmb3IgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgogLy8vIGBFbGVtZW50YCBpbnN0YW5jZXMgc3RvcmVkIGluIHRoYXQgYnVmZmVyLgpkaWZmIC0tZ2l0IGEvc3RkbGliL3B1YmxpYy9jb3JlL1N0cmluZ1N0b3JhZ2Uuc3dpZnQgYi9zdGRsaWIvcHVibGljL2NvcmUvU3RyaW5nU3RvcmFnZS5zd2lmdAppbmRleCBkNmYyNjk0Li5hODQ4MGFjIDEwMDY0NAotLS0gYS9zdGRsaWIvcHVibGljL2NvcmUvU3RyaW5nU3RvcmFnZS5zd2lmdAorKysgYi9zdGRsaWIvcHVibGljL2NvcmUvU3RyaW5nU3RvcmFnZS5zd2lmdApAQCAtNzYsOSArNzYsOCBAQAogICAgICAgZmFsbHRocm91Z2gKICAgICBjYXNlIChfY29jb2FVVEY4RW5jb2RpbmcsIF8pOgogICAgICAgZ3VhcmQgbWF4TGVuZ3RoID49IGNvdW50ICsgMSBlbHNlIHsgcmV0dXJuIDAgfQotICAgICAgbGV0IGJ1ZmZlciA9IFVuc2FmZU11dGFibGVCdWZmZXJQb2ludGVyKHN0YXJ0OiBvdXRwdXRQdHIsIGNvdW50OiBtYXhMZW5ndGgpCi0gICAgICBfID0gYnVmZmVyLmluaXRpYWxpemUoZnJvbTogVW5zYWZlQnVmZmVyUG9pbnRlcihzdGFydDogc3RhcnQsIGNvdW50OiBjb3VudCkpCi0gICAgICBidWZmZXJbY291bnRdID0gMAorICAgICAgb3V0cHV0UHRyLmluaXRpYWxpemUoZnJvbTogc3RhcnQsIGNvdW50OiBjb3VudCkKKyAgICAgIG91dHB1dFB0cltjb3VudF0gPSAwCiAgICAgICByZXR1cm4gMQogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gIF9jb2NvYUdldENTdHJpbmdUcmFtcG9saW5lKHNlbGYsIG91dHB1dFB0ciwgbWF4TGVuZ3RoLCBlbmNvZGluZykKZGlmZiAtLWdpdCBhL3N0ZGxpYi9wdWJsaWMvcnVudGltZS9Td2lmdE9iamVjdC5oIGIvc3RkbGliL3B1YmxpYy9ydW50aW1lL1N3aWZ0T2JqZWN0LmgKaW5kZXggMTBlNmQ2OC4uYTczMGQ1MSAxMDA2NDQKLS0tIGEvc3RkbGliL3B1YmxpYy9ydW50aW1lL1N3aWZ0T2JqZWN0LmgKKysrIGIvc3RkbGliL3B1YmxpYy9ydW50aW1lL1N3aWZ0T2JqZWN0LmgKQEAgLTg4LDExICs4OCw0IEBACiAKICNlbmRpZgogCi1uYW1lc3BhY2Ugc3dpZnQgewotCi1TV0lGVF9DQyhzd2lmdCkgU1dJRlRfUlVOVElNRV9TVERMSUJfU1BJCi1IZWFwT2JqZWN0ICpfc3dpZnRfcmVhbGxvY09iamVjdChIZWFwT2JqZWN0ICpvYmosIHNpemVfdCBzaXplKTsKLQotfQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3N0ZGxpYi9wdWJsaWMvcnVudGltZS9Td2lmdE9iamVjdC5tbSBiL3N0ZGxpYi9wdWJsaWMvcnVudGltZS9Td2lmdE9iamVjdC5tbQppbmRleCA1ZWQ4NzRjLi45YzZkZmJlIDEwMDY0NAotLS0gYS9zdGRsaWIvcHVibGljL3J1bnRpbWUvU3dpZnRPYmplY3QubW0KKysrIGIvc3RkbGliL3B1YmxpYy9ydW50aW1lL1N3aWZ0T2JqZWN0Lm1tCkBAIC04MiwyNCArODIsNiBAQAogI2VuZGlmCiB9CiAKLWJvb2wgaXNPYmpDUGlubmVkKEhlYXBPYmplY3QgKm9iaikgewotICAjaWYgU1dJRlRfT0JKQ19JTlRFUk9QCi0gICAgLyogZnV0dXJlOiBpbXBsZW1lbnQgY2hlY2tpbmcgdGhlIHJlbGV2YW50IG9iamMgcnVudGltZSBiaXRzICovCi0gICAgcmV0dXJuIHRydWU7Ci0gICNlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICAjZW5kaWYKLX0KLQotLy8gcmV0dXJucyBub24tbnVsbCBpZiByZWFsbG9jIHdhcyBzdWNjZXNzZnVsCi1TV0lGVF9DQyhzd2lmdCkgU1dJRlRfUlVOVElNRV9TVERMSUJfU1BJCi1IZWFwT2JqZWN0ICpzd2lmdDo6X3N3aWZ0X3JlYWxsb2NPYmplY3QoSGVhcE9iamVjdCAqb2JqLCBzaXplX3Qgc2l6ZSkgewotIGlmIChpc09iakNQaW5uZWQob2JqKSB8fCBvYmotPnJlZkNvdW50cy5oYXNTaWRlVGFibGUoKSkgewotICAgcmV0dXJuIG51bGxwdHI7Ci0gfQotIHJldHVybiAoSGVhcE9iamVjdCAqKXJlYWxsb2Mob2JqLCBzaXplKTsKLX0KLQogI2lmIFNXSUZUX09CSkNfSU5URVJPUAogCiAvLy8gUmVwbGFjZW1lbnQgZm9yIE9iakMgb2JqZWN0X2lzQ2xhc3MoKSwgd2hpY2ggaXMgdW5hdmFpbGFibGUgb24KZGlmZiAtLWdpdCBhL3Rlc3QvQVBJTm90ZXMvSW5wdXRzL3JvdW5kdHJpcC5hcGlub3RlcyBiL3Rlc3QvQVBJTm90ZXMvSW5wdXRzL3JvdW5kdHJpcC5hcGlub3RlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzNWFjZi4uMDAwMDAwMAotLS0gYS90ZXN0L0FQSU5vdGVzL0lucHV0cy9yb3VuZHRyaXAuYXBpbm90ZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0tLS0KLU5hbWU6ICAgICAgICAgICAgQXBwS2l0Ci1BdmFpbGFiaWxpdHk6ICAgIGF2YWlsYWJsZQotQXZhaWxhYmlsaXR5TXNnOiAnJwotQ2xhc3NlczoKLSAgLSBOYW1lOiAgICAgICAgICAgIE5TQ2VsbAotICAgIEF2YWlsYWJpbGl0eTogICAgYXZhaWxhYmxlCi0gICAgQXZhaWxhYmlsaXR5TXNnOiAnJwotICAgIE1ldGhvZHM6Ci0gICAgICAtIFNlbGVjdG9yOiAgICAgICAgaW5pdAotICAgICAgICBNZXRob2RLaW5kOiAgICAgIEluc3RhbmNlCi0gICAgICAgIE51bGxhYmlsaXR5T2ZSZXQ6IFUKLSAgICAgICAgQXZhaWxhYmlsaXR5OiAgICBhdmFpbGFibGUKLSAgICAgICAgQXZhaWxhYmlsaXR5TXNnOiAnJwotICAgICAgICBEZXNpZ25hdGVkSW5pdDogIHRydWUKLSAgICAgIC0gU2VsZWN0b3I6ICAgICAgICAnaW5pdEltYWdlQ2VsbDonCi0gICAgICAgIE1ldGhvZEtpbmQ6ICAgICAgSW5zdGFuY2UKLSAgICAgICAgTnVsbGFiaWxpdHk6ICAgICBbIE4gXQotICAgICAgICBOdWxsYWJpbGl0eU9mUmV0OiBVCi0gICAgICAgIEF2YWlsYWJpbGl0eTogICAgYXZhaWxhYmxlCi0gICAgICAgIEF2YWlsYWJpbGl0eU1zZzogJycKLSAgICAgICAgRGVzaWduYXRlZEluaXQ6ICB0cnVlCi0gICAgICAtIFNlbGVjdG9yOiAgICAgICAgJ2luaXRUZXh0Q2VsbDonCi0gICAgICAgIE1ldGhvZEtpbmQ6ICAgICAgSW5zdGFuY2UKLSAgICAgICAgTnVsbGFiaWxpdHk6ICAgICBbIE4gXQotICAgICAgICBOdWxsYWJpbGl0eU9mUmV0OiBVCi0gICAgICAgIEF2YWlsYWJpbGl0eTogICAgYXZhaWxhYmxlCi0gICAgICAgIEF2YWlsYWJpbGl0eU1zZzogJycKLSAgICAgICAgRGVzaWduYXRlZEluaXQ6ICB0cnVlCi0gICAgICAtIFNlbGVjdG9yOiAgICAgICAgJ2luaXRXaXRoQ29kZXI6JwotICAgICAgICBNZXRob2RLaW5kOiAgICAgIEluc3RhbmNlCi0gICAgICAgIE51bGxhYmlsaXR5OiAgICAgWyBOIF0KLSAgICAgICAgTnVsbGFiaWxpdHlPZlJldDogVQotICAgICAgICBBdmFpbGFiaWxpdHk6ICAgIGF2YWlsYWJsZQotICAgICAgICBBdmFpbGFiaWxpdHlNc2c6ICcnCi0gICAgICAgIERlc2lnbmF0ZWRJbml0OiAgdHJ1ZQotICAgICAgICBSZXF1aXJlZDogICAgICAgIHRydWUKLSAgLSBOYW1lOiAgICAgICAgICAgIE5TVmlldwotICAgIEF1ZGl0ZWRGb3JOdWxsYWJpbGl0eTogdHJ1ZQotICAgIEF2YWlsYWJpbGl0eTogICAgYXZhaWxhYmxlCi0gICAgQXZhaWxhYmlsaXR5TXNnOiAnJwotICAgIE1ldGhvZHM6Ci0gICAgICAtIFNlbGVjdG9yOiAgICAgICAgJ2FkZFN1YnZpZXc6JwotICAgICAgICBNZXRob2RLaW5kOiAgICAgIEluc3RhbmNlCi0gICAgICAgIE51bGxhYmlsaXR5OiAgICAgWyBOIF0KLSAgICAgICAgTnVsbGFiaWxpdHlPZlJldDogTgotICAgICAgICBBdmFpbGFiaWxpdHk6ICAgIGF2YWlsYWJsZQotICAgICAgICBBdmFpbGFiaWxpdHlNc2c6ICcnCi0gICAgICAtIFNlbGVjdG9yOiAgICAgICAgJ2FkZFN1YnZpZXc6cG9zaXRpb25lZDpyZWxhdGl2ZVRvOicKLSAgICAgICAgTWV0aG9kS2luZDogICAgICBJbnN0YW5jZQotICAgICAgICBOdWxsYWJpbGl0eTogICAgIFsgTiwgTiwgTyBdCi0gICAgICAgIE51bGxhYmlsaXR5T2ZSZXQ6IE4KLSAgICAgICAgQXZhaWxhYmlsaXR5OiAgICBhdmFpbGFibGUKLSAgICAgICAgQXZhaWxhYmlsaXR5TXNnOiAnJwotICAgICAgLSBTZWxlY3RvcjogICAgICAgICdiZWdpbkRyYWdnaW5nU2Vzc2lvbldpdGhJdGVtczpldmVudDpzb3VyY2U6JwotICAgICAgICBNZXRob2RLaW5kOiAgICAgIEluc3RhbmNlCi0gICAgICAgIE51bGxhYmlsaXR5OiAgICAgWyBVLCBVLCBOIF0KLSAgICAgICAgTnVsbGFiaWxpdHlPZlJldDogTgotICAgICAgICBBdmFpbGFiaWxpdHk6ICAgIGF2YWlsYWJsZQotICAgICAgICBBdmFpbGFiaWxpdHlNc2c6ICcnCi0gICAgUHJvcGVydGllczoKLSAgICAgIC0gTmFtZTogICAgICAgICAgICBlbmNsb3NpbmdTY3JvbGxWaWV3Ci0gICAgICAgIE51bGxhYmlsaXR5OiAgICAgTwotICAgICAgICBBdmFpbGFiaWxpdHk6ICAgIGF2YWlsYWJsZQotICAgICAgICBBdmFpbGFiaWxpdHlNc2c6ICcnCi0gICAgICAtIE5hbWU6ICAgICAgICAgICAgbWFrZUJhY2tpbmdMYXllcgotICAgICAgICBOdWxsYWJpbGl0eTogICAgIE4KLSAgICAgICAgQXZhaWxhYmlsaXR5OiAgICBhdmFpbGFibGUKLSAgICAgICAgQXZhaWxhYmlsaXR5TXNnOiAnJwotRnVuY3Rpb25zOgotICAtIE5hbWU6ICAgICAgICAgICAgTlNBdmFpbGFibGVXaW5kb3dEZXB0aHMKLSAgICBOdWxsYWJpbGl0eU9mUmV0OiBOCi0gICAgQXZhaWxhYmlsaXR5OiAgICBhdmFpbGFibGUKLSAgICBBdmFpbGFiaWxpdHlNc2c6ICcnCi1HbG9iYWxzOgotICAtIE5hbWU6ICAgICAgICAgICAgTlNDYWxpYnJhdGVkV2hpdGVDb2xvclNwYWNlCi0gICAgTnVsbGFiaWxpdHk6ICAgICBOCi0gICAgQXZhaWxhYmlsaXR5OiAgICBhdmFpbGFibGUKLSAgICBBdmFpbGFiaWxpdHlNc2c6ICcnCmRpZmYgLS1naXQgYS90ZXN0L0FQSU5vdGVzL3lhbWwtcm91bmR0cmlwLnN3aWZ0IGIvdGVzdC9BUElOb3Rlcy95YW1sLXJvdW5kdHJpcC5zd2lmdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhM2FkYS4uMDAwMDAwMAotLS0gYS90ZXN0L0FQSU5vdGVzL3lhbWwtcm91bmR0cmlwLnN3aWZ0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIFJVTjogJXN3aWZ0X2RyaXZlcl9wbGFpbiAtYXBpbm90ZXMgLXlhbWwtdG8tYmluYXJ5IC1vICV0LmFwaW5vdGVzYyAlUy9JbnB1dHMvcm91bmR0cmlwLmFwaW5vdGVzCi0jIFJVTjogJXN3aWZ0X2RyaXZlcl9wbGFpbiAtYXBpbm90ZXMgLWJpbmFyeS10by15YW1sIC1vICV0LmFwaW5vdGVzICV0LmFwaW5vdGVzYwotCi0jIE5vdGU6IFdlIGRvbid0IGRpZmYgdGhlIHJlc3VsdHMgYmVjYXVzZSB0aGV5IHdpbGwgY2hhbmdlIGFzIENsYW5nJ3MKLSMgQVBJIG5vdGVzIHN1cHBvcnQgZXZvbHZlcywgYW5kIHdlIGRvbid0IHdhbnQgdG8gdGllIHRoYXQgY2xvc2VseSB0bwotIyBhIHNwZWNpZmljIENsYW5nLgotCmRpZmYgLS1naXQgYS90ZXN0L0NpcmN1bGFyUmVmZXJlbmNlcy9wcm90b2NvbHMuc3dpZnQgYi90ZXN0L0NpcmN1bGFyUmVmZXJlbmNlcy9wcm90b2NvbHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3MTkwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ2lyY3VsYXJSZWZlcmVuY2VzL3Byb3RvY29scy5zd2lmdApAQCAtMCwwICsxLDEyIEBACisvLyBSVU46ICV0YXJnZXQtdHlwZWNoZWNrLXZlcmlmeS1zd2lmdCAtZGVidWctY3ljbGVzIDI+JjEgfCAlRmlsZUNoZWNrIC0tYWxsb3ctZW1wdHkgJXMKKworLy8gVmVyaWZ5IHRoYXQgcHJvdG9jb2wgd2hlcmUgY2xhdXNlIGxvb2t1cHMgZG9uJ3QgY2F1c2UgY3ljbGljIGRlcGVuZGVuY2llcy4KKworLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKKworY2xhc3MgQyB7IH0KK3Byb3RvY29sIFEgeyB9Citwcm90b2NvbCBQIHdoZXJlIFNlbGYgOiBRLCBTZWxmIDogQyB7IH0KKworLy8gQ0hFQ0stTk9UOiBDWUNMRSBERVRFQ1RFRAorCmRpZmYgLS1naXQgYS90ZXN0L0NsYW5nSW1wb3J0ZXIvSW5wdXRzL2FwcC1icmlkZ2luZy1oZWFkZXItdG8tcGNoLmggYi90ZXN0L0NsYW5nSW1wb3J0ZXIvSW5wdXRzL2FwcC1icmlkZ2luZy1oZWFkZXItdG8tcGNoLmgKaW5kZXggZjhkNTZiNy4uYzZmYjI4ZCAxMDA2NDQKLS0tIGEvdGVzdC9DbGFuZ0ltcG9ydGVyL0lucHV0cy9hcHAtYnJpZGdpbmctaGVhZGVyLXRvLXBjaC5oCisrKyBiL3Rlc3QvQ2xhbmdJbXBvcnRlci9JbnB1dHMvYXBwLWJyaWRnaW5nLWhlYWRlci10by1wY2guaApAQCAtMSwzICsxLDEwIEBACisKKyNpZm5kZWYgYXBwX2JyaWRnaW5nX2hlYWRlcl90b19wY2hfaAorI2RlZmluZSBhcHBfYnJpZGdpbmdfaGVhZGVyX3RvX3BjaF9oCisKIHN0YXRpYyBpbmxpbmUgaW50IGFwcF9mdW5jdGlvbihpbnQgeCkgewogICByZXR1cm4geCArIDI3OwogfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdGVzdC9DbGFuZ0ltcG9ydGVyL0lucHV0cy9jaGFpbmVkLXVuaXQtdGVzdC1icmlkZ2luZy1oZWFkZXItdG8tcGNoLmggYi90ZXN0L0NsYW5nSW1wb3J0ZXIvSW5wdXRzL2NoYWluZWQtdW5pdC10ZXN0LWJyaWRnaW5nLWhlYWRlci10by1wY2guaAppbmRleCBjMDI3MzQyLi44MTA3MzZiIDEwMDY0NAotLS0gYS90ZXN0L0NsYW5nSW1wb3J0ZXIvSW5wdXRzL2NoYWluZWQtdW5pdC10ZXN0LWJyaWRnaW5nLWhlYWRlci10by1wY2guaAorKysgYi90ZXN0L0NsYW5nSW1wb3J0ZXIvSW5wdXRzL2NoYWluZWQtdW5pdC10ZXN0LWJyaWRnaW5nLWhlYWRlci10by1wY2guaApAQCAtMSw1ICsxLDEyIEBACisKKyNpZm5kZWYgY2hhaW5lZF91bml0X3Rlc3RfYnJpZGdpbmdfaGVhZGVyX3RvX3BjaF9oCisjZGVmaW5lIGNoYWluZWRfdW5pdF90ZXN0X2JyaWRnaW5nX2hlYWRlcl90b19wY2hfaAorCiAjaW5jbHVkZSAiYXBwLWJyaWRnaW5nLWhlYWRlci10by1wY2guaCIKIAogc3RhdGljIGlubGluZSBpbnQgdW5pdF90ZXN0X2Z1bmN0aW9uKGludCB4KSB7CiAgIHJldHVybiB4ICsgMjg7CiB9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS90ZXN0L0NsYW5nSW1wb3J0ZXIvY2Z1bmNzX3BhcnNlLnN3aWZ0IGIvdGVzdC9DbGFuZ0ltcG9ydGVyL2NmdW5jc19wYXJzZS5zd2lmdAppbmRleCBlNWUyY2IxLi5iYTkxYzU5IDEwMDY0NAotLS0gYS90ZXN0L0NsYW5nSW1wb3J0ZXIvY2Z1bmNzX3BhcnNlLnN3aWZ0CisrKyBiL3Rlc3QvQ2xhbmdJbXBvcnRlci9jZnVuY3NfcGFyc2Uuc3dpZnQKQEAgLTEsMyArMSw0IEBACisvLyBYRkFJTDogQ1BVPXBvd2VycGM2NGxlCiAvLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQobW9jay1zZGs6ICVjbGFuZy1pbXBvcnRlci1zZGspIC10eXBlY2hlY2sgLXZlcmlmeSAtSSAlUy9JbnB1dHMgJXMKIAogaW1wb3J0IGNmdW5jcwpkaWZmIC0tZ2l0IGEvdGVzdC9DbGFuZ0ltcG9ydGVyL2lubGluYWJsZV9iaXRmaWVsZHMuc3dpZnQgYi90ZXN0L0NsYW5nSW1wb3J0ZXIvaW5saW5hYmxlX2JpdGZpZWxkcy5zd2lmdAppbmRleCBlYTQxN2I2Li5iZTZlZGUyIDEwMDY0NAotLS0gYS90ZXN0L0NsYW5nSW1wb3J0ZXIvaW5saW5hYmxlX2JpdGZpZWxkcy5zd2lmdAorKysgYi90ZXN0L0NsYW5nSW1wb3J0ZXIvaW5saW5hYmxlX2JpdGZpZWxkcy5zd2lmdApAQCAtMTAsNCArMTAsNCBAQAogCiAvLyBKdXN0IG1ha2Ugc3VyZSB0aGlzIGlzIGEgZGVmaW5pdGlvbiBhbmQgbm90IGEgZGVjbGFyYXRpb24uLi4KIAotLy8gQ0hFQ0s6IGRlZmluZSBpbnRlcm5hbCBpMzIgQCIkTW9kUk0kcm0kZ2V0dGVyIgorLy8gQ0hFQ0s6IGRlZmluZSBpbnRlcm5hbHt7KCB6ZXJvZXh0KT99fSBpMzIgQCIkTW9kUk0kcm0kZ2V0dGVyIgpkaWZmIC0tZ2l0IGEvdGVzdC9Db25zdHJhaW50cy9kaWFnbm9zdGljcy5zd2lmdCBiL3Rlc3QvQ29uc3RyYWludHMvZGlhZ25vc3RpY3Muc3dpZnQKaW5kZXggNGExMDA1MC4uOTcxZDcyMSAxMDA2NDQKLS0tIGEvdGVzdC9Db25zdHJhaW50cy9kaWFnbm9zdGljcy5zd2lmdAorKysgYi90ZXN0L0NvbnN0cmFpbnRzL2RpYWdub3N0aWNzLnN3aWZ0CkBAIC02NTksNyArNjU5LDcgQEAKIHN0cnVjdCBVbmFyeU9wIHt9CiAKIF8gPSAtVW5hcnlPcCgpIC8vIGV4cGVjdGVkLWVycm9yIHt7dW5hcnkgb3BlcmF0b3IgJy0nIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGFuIG9wZXJhbmQgb2YgdHlwZSAnVW5hcnlPcCd9fQotLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e292ZXJsb2FkcyBmb3IgJy0nIGV4aXN0IHdpdGggdGhlc2UgcGFydGlhbGx5IG1hdGNoaW5nIHBhcmFtZXRlciBsaXN0czogKERvdWJsZSksIChGbG9hdCksIChGbG9hdDgwKX19CisvLyBleHBlY3RlZC1ub3RlQC0xIHt7b3ZlcmxvYWRzIGZvciAnLScgZXhpc3Qgd2l0aCB0aGVzZSBwYXJ0aWFsbHkgbWF0Y2hpbmcgcGFyYW1ldGVyIGxpc3RzOiAoRG91YmxlKSwgKEZsb2F0KX19CiAKIAogLy8gPHJkYXI6Ly9wcm9ibGVtLzIzNDMzMjcxPiBTd2lmdCBjb21waWxlciBzZWdmYXVsdCBpbiBmYWlsdXJlIGRpYWdub3NpcwpkaWZmIC0tZ2l0IGEvdGVzdC9Db25zdHJhaW50cy9zcjk2MjYuc3dpZnQgYi90ZXN0L0NvbnN0cmFpbnRzL3NyOTYyNi5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk5NTFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db25zdHJhaW50cy9zcjk2MjYuc3dpZnQKQEAgLTAsMCArMSwyMiBAQAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kIC1lbWl0LXNpbCAtdmVyaWZ5ICVzIHwgJUZpbGVDaGVjayAlcworCitjbGFzcyBCYXNlQ2xhc3Mge30KK2NsYXNzIFN1YkNsYXNzOiBCYXNlQ2xhc3Mge30KK3N0cnVjdCBCb3g8VD4geyBpbml0KF86IFQuVHlwZSkge30gfQorCisKK2Z1bmMgdGVzdDE8VD4oYm94OiBCb3g8VD4pIC0+IFQuVHlwZSB7CisgIHJldHVybiBULnNlbGYKK30KKworZnVuYyB0ZXN0MjxUOiBCYXNlQ2xhc3M+KGJveDogQm94PFQ+KSAtPiBULlR5cGUgeworICByZXR1cm4gVC5zZWxmCit9CisKKy8vIENIRUNLOiBbW0YxOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkczZzcjk2MjYzQm94VnlBQ3l4R3htY2ZDCisvLyBDSEVDSy1ORVhUOiBhcHBseSBbW0YxXV08U3ViQ2xhc3M+KHt7Lip9fSwge3suKn19KQorXyA9IHRlc3QxKGJveDogLmluaXQoU3ViQ2xhc3Muc2VsZikpCisKKy8vIENIRUNLOiBbW0YyOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkczZzcjk2MjY1dGVzdDIzYm94eG1BQTNCb3hWeXhHX3RBQTlCYXNlQ2xhc3NDUmJ6bEYKKy8vIENIRUNLLU5FWFQ6IGFwcGx5IFtbRjJdXTxTdWJDbGFzcz4oe3suKn19KQorXyA9IHRlc3QyKGJveDogLmluaXQoU3ViQ2xhc3Muc2VsZikpCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9mdXp6ZXIuc3dpZnQgYi90ZXN0L0RyaXZlci9mdXp6ZXIuc3dpZnQKaW5kZXggMzkwMzg5Mi4uZDgzZmFkMiAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvZnV6emVyLnN3aWZ0CisrKyBiL3Rlc3QvRHJpdmVyL2Z1enplci5zd2lmdApAQCAtMSw0ICsxLDUgQEAKIC8vIFVOU1VQUE9SVEVEOiB3aW4zMgorLy8gVU5TVVBQT1JURUQ6IENQVT1wb3dlcnBjNjRsZQogLy8gUlVOOiAlc3dpZnRjX2RyaXZlciAtZHJpdmVyLXByaW50LWpvYnMgLXNhbml0aXplPWZ1enplcixhZGRyZXNzIC1yZXNvdXJjZS1kaXIgJVMvSW5wdXRzL2Zha2UtcmVzb3VyY2UtZGlyL2xpYi9zd2lmdC8gJXMgfCAlRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TElCRlVaWkVSICVzCiAKIC8vIExJQkZVWlpFUjogbGliY2xhbmdfcnQuZnV6emVyCmRpZmYgLS1naXQgYS90ZXN0L0lERS9jbGFuZy1pbXBvcnRpbmcvSW5wdXRzL2JyaWRnZS5oIGIvdGVzdC9JREUvY2xhbmctaW1wb3J0aW5nL0lucHV0cy9icmlkZ2UuaAppbmRleCA5MjBlN2FhLi43N2EwOGE5IDEwMDY0NAotLS0gYS90ZXN0L0lERS9jbGFuZy1pbXBvcnRpbmcvSW5wdXRzL2JyaWRnZS5oCisrKyBiL3Rlc3QvSURFL2NsYW5nLWltcG9ydGluZy9JbnB1dHMvYnJpZGdlLmgKQEAgLTEgKzEsNCBAQAorQGltcG9ydCBGb3VuZGF0aW9uOwogQGltcG9ydCBzb21lbW9kMTsKKwordm9pZCBmdW5jX2luX2JyaWRnZSh2b2lkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvSURFL2NsYW5nLWltcG9ydGluZy9jb21wbGV0ZV93aXRoX2NsYW5nX2NvbW1lbnRzLnN3aWZ0IGIvdGVzdC9JREUvY2xhbmctaW1wb3J0aW5nL2NvbXBsZXRlX3dpdGhfY2xhbmdfY29tbWVudHMuc3dpZnQKaW5kZXggZGZhMTdmYS4uYjM4MTZjMCAxMDA2NDQKLS0tIGEvdGVzdC9JREUvY2xhbmctaW1wb3J0aW5nL2NvbXBsZXRlX3dpdGhfY2xhbmdfY29tbWVudHMuc3dpZnQKKysrIGIvdGVzdC9JREUvY2xhbmctaW1wb3J0aW5nL2NvbXBsZXRlX3dpdGhfY2xhbmdfY29tbWVudHMuc3dpZnQKQEAgLTEsNSArMSw3IEBACi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QgLWNvZGUtY29tcGxldGlvbiAtc291cmNlLWZpbGVuYW1lICVzIC1jb2RlLWNvbXBsZXRpb24tdG9rZW49VE9QIC1jb2RlLWNvbXBsZXRpb24tY29tbWVudHM9dHJ1ZSBcCisvLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6ICVjbGFuZy1pbXBvcnRlci1zZGspIC1jb2RlLWNvbXBsZXRpb24gLXNvdXJjZS1maWxlbmFtZSAlcyAtY29kZS1jb21wbGV0aW9uLXRva2VuPVRPUCAtY29kZS1jb21wbGV0aW9uLWNvbW1lbnRzPXRydWUgXAogLy8gUlVOOiAgICAtaW1wb3J0LW9iamMtaGVhZGVyICVTL0lucHV0cy9icmlkZ2UuaCAtSSAlUy9JbnB1dHMvc29tZW1vZDEgLUkgJVMvSW5wdXRzL3NvbWVtb2QyIHwgJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PUNIRUNLLVRPUAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAlY2xhbmctaW1wb3J0ZXItc2RrKSAtY29kZS1jb21wbGV0aW9uIC1zb3VyY2UtZmlsZW5hbWUgJXMgLWNvZGUtY29tcGxldGlvbi10b2tlbj1UT1AgLWNvZGUtY29tcGxldGlvbi1jb21tZW50cz10cnVlIFwKKy8vIFJVTjogICAgLWltcG9ydC1vYmpjLWhlYWRlciAlUy9JbnB1dHMvYnJpZGdlLmggLXBjaC1vdXRwdXQtZGlyICV0LnBjaCAtSSAlUy9JbnB1dHMvc29tZW1vZDEgLUkgJVMvSW5wdXRzL3NvbWVtb2QyIHwgJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PUNIRUNLLVRPUAogCiAvLyBSRVFVSVJFUzogb2JqY19pbnRlcm9wCiAKZGlmZiAtLWdpdCBhL3Rlc3QvSURFL3ByaW50X2FzdF9vdmVybGF5LnN3aWZ0IGIvdGVzdC9JREUvcHJpbnRfYXN0X292ZXJsYXkuc3dpZnQKaW5kZXggN2E2MGI2Yy4uNTMyMzNjNCAxMDA2NDQKLS0tIGEvdGVzdC9JREUvcHJpbnRfYXN0X292ZXJsYXkuc3dpZnQKKysrIGIvdGVzdC9JREUvcHJpbnRfYXN0X292ZXJsYXkuc3dpZnQKQEAgLTEsMTcgKzEsMTYgQEAKIC8vIFJVTjogJWVtcHR5LWRpcmVjdG9yeSgldCkKLS8vIFJVTjogJXRhcmdldC1idWlsZC1zd2lmdCAtZW1pdC1tb2R1bGUgLW1vZHVsZS1uYW1lIEZvbyAtbyAldCAtRiAlUy9JbnB1dHMvbW9jay1zZGsgJXMKKy8vIFJVTjogJXRhcmdldC1idWlsZC1zd2lmdCAtZW1pdC1tb2R1bGUgLW1vZHVsZS1uYW1lIEZvbyAtbyAldCAtRiAlUy9JbnB1dHMvbW9jay1zZGsgJXMgLVhmcm9udGVuZCAtZW5hYmxlLW9iamMtaW50ZXJvcCAtWGZyb250ZW5kIC1kaXNhYmxlLW9iamMtYXR0ci1yZXF1aXJlcy1mb3VuZGF0aW9uLW1vZHVsZQogLy8KLS8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdCAtcHJpbnQtbW9kdWxlIC1zb3VyY2UtZmlsZW5hbWUgJXMgLUkgJXQgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1tb2R1bGUtdG8tcHJpbnQ9Rm9vIC1hY2Nlc3MtZmlsdGVyLXB1YmxpYyA+ICV0LnByaW50ZWQudHh0CisvLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QgLXByaW50LW1vZHVsZSAtc291cmNlLWZpbGVuYW1lICVzIC1JICV0IC1GICVTL0lucHV0cy9tb2NrLXNkayAtbW9kdWxlLXRvLXByaW50PUZvbyAtYWNjZXNzLWZpbHRlci1wdWJsaWMgLWVuYWJsZS1vYmpjLWludGVyb3AgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlID4gJXQucHJpbnRlZC50eHQKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfV0lUSF9PVkVSTEFZIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LnByaW50ZWQudHh0CiAvLyBSVU46ICVGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1QQVNTX05PX0lOVEVSTkFMIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LnByaW50ZWQudHh0CiAvLwotLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0IC1wcmludC1tb2R1bGUgLXNvdXJjZS1maWxlbmFtZSAlcyAtSSAldCAtRiAlUy9JbnB1dHMvbW9jay1zZGsgLW1vZHVsZS10by1wcmludD1Gb28uRm9vU3ViID4gJXQucHJpbnRlZC50eHQKKy8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdCAtcHJpbnQtbW9kdWxlIC1zb3VyY2UtZmlsZW5hbWUgJXMgLUkgJXQgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1tb2R1bGUtdG8tcHJpbnQ9Rm9vLkZvb1N1YiAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgPiAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19XSVRIT1VUX09WRVJMQVkgLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIAotLy8gWEZBSUw6IGxpbnV4LCBmcmVlYnNkCi0KLS8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdCAtcHJpbnQtbW9kdWxlIC1zb3VyY2UtZmlsZW5hbWUgJXMgLUkgJXQgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1tb2R1bGUtdG8tcHJpbnQ9Rm9vIC1hY2Nlc3MtZmlsdGVyLXB1YmxpYyAtYW5ub3RhdGUtcHJpbnQgPiAldC5hbm5vdGF0ZWQudHh0CisvLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QgLXByaW50LW1vZHVsZSAtc291cmNlLWZpbGVuYW1lICVzIC1JICV0IC1GICVTL0lucHV0cy9tb2NrLXNkayAtbW9kdWxlLXRvLXByaW50PUZvbyAtYWNjZXNzLWZpbHRlci1wdWJsaWMgLWFubm90YXRlLXByaW50IC1lbmFibGUtb2JqYy1pbnRlcm9wIC1kaXNhYmxlLW9iamMtYXR0ci1yZXF1aXJlcy1mb3VuZGF0aW9uLW1vZHVsZSA+ICV0LmFubm90YXRlZC50eHQKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfQU5OT1RBVEVEIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LmFubm90YXRlZC50eHQKKwogLy8gUkVRVUlSRVM6IGV4ZWN1dGFibGVfdGVzdAogCiBAX2V4cG9ydGVkIGltcG9ydCBGb28KZGlmZiAtLWdpdCBhL3Rlc3QvSURFL3ByaW50X2FzdF90Y19kZWNscy5zd2lmdCBiL3Rlc3QvSURFL3ByaW50X2FzdF90Y19kZWNscy5zd2lmdAppbmRleCAxNDdmYmM1Li42ZmM0NTg5IDEwMDY0NAotLS0gYS90ZXN0L0lERS9wcmludF9hc3RfdGNfZGVjbHMuc3dpZnQKKysrIGIvdGVzdC9JREUvcHJpbnRfYXN0X3RjX2RlY2xzLnN3aWZ0CkBAIC0xLDE2ICsxLDE2IEBACiAvLyBSVU46ICVlbXB0eS1kaXJlY3RvcnkoJXQpCiAvLwogLy8gQnVpbGQgc3dpZnQgbW9kdWxlcyB0aGlzIHRlc3QgZGVwZW5kcyBvbi4KLS8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZCAtZW1pdC1tb2R1bGUgLW8gJXQgJVMvSW5wdXRzL2Zvb19zd2lmdF9tb2R1bGUuc3dpZnQKKy8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZCAtZW1pdC1tb2R1bGUgLW8gJXQgJVMvSW5wdXRzL2Zvb19zd2lmdF9tb2R1bGUuc3dpZnQgLWVuYWJsZS1vYmpjLWludGVyb3AgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlCiAvLwogLy8gRklYTUU6IEJFR0lOIC1lbmFibGUtc291cmNlLWltcG9ydCBoYWNrYXJvdW5kCi0vLyBSVU46ICAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kKG1vY2stc2RrOiAtc2RrICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1lbWl0LW1vZHVsZSAtbyAldCAgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkay9zd2lmdC1tb2R1bGVzL09iamVjdGl2ZUMuc3dpZnQgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlCisvLyBSVU46ICAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kKG1vY2stc2RrOiAtc2RrICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1lbWl0LW1vZHVsZSAtbyAldCAgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkay9zd2lmdC1tb2R1bGVzL09iamVjdGl2ZUMuc3dpZnQgLWVuYWJsZS1vYmpjLWludGVyb3AgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlCiAvLyBGSVhNRTogRU5EIC1lbmFibGUtc291cmNlLWltcG9ydCBoYWNrYXJvdW5kCiAvLwogLy8gVGhpcyBmaWxlIHNob3VsZCBub3QgaGF2ZSBhbnkgc3ludGF4IG9yIHR5cGUgY2hlY2tlciBlcnJvcnMuCi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQobW9jay1zZGs6IC1zZGsgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLXN3aWZ0LXZlcnNpb24gNCAtdHlwZWNoZWNrIC12ZXJpZnkgJXMgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1kaXNhYmxlLW9iamMtYXR0ci1yZXF1aXJlcy1mb3VuZGF0aW9uLW1vZHVsZQorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kKG1vY2stc2RrOiAtc2RrICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1zd2lmdC12ZXJzaW9uIDQgLXR5cGVjaGVjayAtdmVyaWZ5ICVzIC1GICVTL0lucHV0cy9tb2NrLXNkayAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUKIC8vCi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6IC1zZGsgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLXN3aWZ0LXZlcnNpb24gNCAtc2tpcC1kZWluaXQ9ZmFsc2UgLXByaW50LWFzdC10eXBlY2hlY2tlZCAtc291cmNlLWZpbGVuYW1lICVzIC1GICVTL0lucHV0cy9tb2NrLXNkayAtZnVuY3Rpb24tZGVmaW5pdGlvbnM9ZmFsc2UgLXByZWZlci10eXBlLXJlcHI9ZmFsc2UgLXByaW50LWltcGxpY2l0LWF0dHJzPXRydWUgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlID4gJXQucHJpbnRlZC50eHQKKy8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdChtb2NrLXNkazogLXNkayAlUy8uLi9JbnB1dHMvY2xhbmctaW1wb3J0ZXItc2RrIC1JICV0KSAtc3dpZnQtdmVyc2lvbiA0IC1za2lwLWRlaW5pdD1mYWxzZSAtcHJpbnQtYXN0LXR5cGVjaGVja2VkIC1zb3VyY2UtZmlsZW5hbWUgJXMgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1mdW5jdGlvbi1kZWZpbml0aW9ucz1mYWxzZSAtcHJlZmVyLXR5cGUtcmVwcj1mYWxzZSAtcHJpbnQtaW1wbGljaXQtYXR0cnM9dHJ1ZSAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgPiAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19DT01NT04gLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfUFJJTlRfQVNUIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LnByaW50ZWQudHh0CiAvLyBSVU46ICVGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1QQVNTX1JXX1BST1BfR0VUX1NFVCAtc3RyaWN0LXdoaXRlc3BhY2UgPCAldC5wcmludGVkLnR4dApAQCAtMjEsNyArMjEsNyBAQAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UFJFRkVSX1RZUEVfUFJJTlRJTkcgLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfUVVBTF9VTlFVQUwgLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIC8vCi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6IC1zZGsgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLXN3aWZ0LXZlcnNpb24gNCAtc2tpcC1kZWluaXQ9ZmFsc2UgLXByaW50LWFzdC10eXBlY2hlY2tlZCAtc291cmNlLWZpbGVuYW1lICVzIC1GICVTL0lucHV0cy9tb2NrLXNkayAtZnVuY3Rpb24tZGVmaW5pdGlvbnM9ZmFsc2UgLXByZWZlci10eXBlLXJlcHI9dHJ1ZSAtcHJpbnQtaW1wbGljaXQtYXR0cnM9dHJ1ZSAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgPiAldC5wcmludGVkLnR4dAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAtc2RrICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1zd2lmdC12ZXJzaW9uIDQgLXNraXAtZGVpbml0PWZhbHNlIC1wcmludC1hc3QtdHlwZWNoZWNrZWQgLXNvdXJjZS1maWxlbmFtZSAlcyAtRiAlUy9JbnB1dHMvbW9jay1zZGsgLWZ1bmN0aW9uLWRlZmluaXRpb25zPWZhbHNlIC1wcmVmZXItdHlwZS1yZXByPXRydWUgLXByaW50LWltcGxpY2l0LWF0dHJzPXRydWUgLWVuYWJsZS1vYmpjLWludGVyb3AgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlID4gJXQucHJpbnRlZC50eHQKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfQ09NTU9OIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LnByaW50ZWQudHh0CiAvLyBSVU46ICVGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1QQVNTX1BSSU5UX0FTVCAtc3RyaWN0LXdoaXRlc3BhY2UgPCAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19SV19QUk9QX0dFVF9TRVQgLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKQEAgLTMyLDggKzMyLDggQEAKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBSRUZFUl9UWVBFX1JFUFJfUFJJTlRJTkcgLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfUVVBTF9VTlFVQUwgLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIC8vCi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQobW9jay1zZGs6IC1zZGsgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLXN3aWZ0LXZlcnNpb24gNCAtZW1pdC1tb2R1bGUgLW8gJXQgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1kaXNhYmxlLW9iamMtYXR0ci1yZXF1aXJlcy1mb3VuZGF0aW9uLW1vZHVsZSAlcwotLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAtc2RrICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1zd2lmdC12ZXJzaW9uIDQgLXNraXAtZGVpbml0PWZhbHNlIC1wcmludC1tb2R1bGUgLXNvdXJjZS1maWxlbmFtZSAlcyAtRiAlUy9JbnB1dHMvbW9jay1zZGsgLW1vZHVsZS10by1wcmludD1wcmludF9hc3RfdGNfZGVjbHMgLXByaW50LWltcGxpY2l0LWF0dHJzPXRydWUgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlID4gJXQucHJpbnRlZC50eHQKKy8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZChtb2NrLXNkazogLXNkayAlUy8uLi9JbnB1dHMvY2xhbmctaW1wb3J0ZXItc2RrIC1JICV0KSAtc3dpZnQtdmVyc2lvbiA0IC1lbWl0LW1vZHVsZSAtbyAldCAtRiAlUy9JbnB1dHMvbW9jay1zZGsgLWVuYWJsZS1vYmpjLWludGVyb3AgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlICVzCisvLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6IC1zZGsgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLXN3aWZ0LXZlcnNpb24gNCAtc2tpcC1kZWluaXQ9ZmFsc2UgLXByaW50LW1vZHVsZSAtc291cmNlLWZpbGVuYW1lICVzIC1GICVTL0lucHV0cy9tb2NrLXNkayAtbW9kdWxlLXRvLXByaW50PXByaW50X2FzdF90Y19kZWNscyAtcHJpbnQtaW1wbGljaXQtYXR0cnM9dHJ1ZSAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgPiAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19DT01NT04gLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfUFJJTlRfTU9EVUxFX0lOVEVSRkFDRSAtc3RyaWN0LXdoaXRlc3BhY2UgPCAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19SV19QUk9QX05PX0dFVF9TRVQgLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKQEAgLTQ1LDIwICs0NSwyMCBAQAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19RVUFMX1VOUVVBTCAtc3RyaWN0LXdoaXRlc3BhY2UgPCAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19FWFBMT0RFX1BBVFRFUk4gLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIC8vCi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6IC1zZGsgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLXNraXAtZGVpbml0PWZhbHNlIC1wcmludC1tb2R1bGUgLXNvdXJjZS1maWxlbmFtZSAlcyAtRiAlUy9JbnB1dHMvbW9jay1zZGsgLUkgJXQgLW1vZHVsZS10by1wcmludD1wcmludF9hc3RfdGNfZGVjbHMgLXN5bnRoZXNpemUtc3VnYXItb24tdHlwZXM9dHJ1ZSAtcHJpbnQtaW1wbGljaXQtYXR0cnM9dHJ1ZSAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgPiAldC5wcmludGVkLnR4dAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAtc2RrICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1za2lwLWRlaW5pdD1mYWxzZSAtcHJpbnQtbW9kdWxlIC1zb3VyY2UtZmlsZW5hbWUgJXMgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1JICV0IC1tb2R1bGUtdG8tcHJpbnQ9cHJpbnRfYXN0X3RjX2RlY2xzIC1zeW50aGVzaXplLXN1Z2FyLW9uLXR5cGVzPXRydWUgLXByaW50LWltcGxpY2l0LWF0dHJzPXRydWUgLWVuYWJsZS1vYmpjLWludGVyb3AgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlID4gJXQucHJpbnRlZC50eHQKIC8vIFJVTjogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfUFJJTlRfTU9EVUxFX0lOVEVSRkFDRSAtc3RyaWN0LXdoaXRlc3BhY2UgPCAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19RVUFMX1VOUVVBTCAtc3RyaWN0LXdoaXRlc3BhY2UgPCAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9U1lOVEhFU0laRV9TVUdBUl9PTl9UWVBFUyAtc3RyaWN0LXdoaXRlc3BhY2UgPCAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19FWFBMT0RFX1BBVFRFUk4gLXN0cmljdC13aGl0ZXNwYWNlIDwgJXQucHJpbnRlZC50eHQKIAotLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAtc2RrICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1za2lwLWRlaW5pdD1mYWxzZSAtcHJpbnQtbW9kdWxlIC1zb3VyY2UtZmlsZW5hbWUgJXMgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1JICV0IC1tb2R1bGUtdG8tcHJpbnQ9cHJpbnRfYXN0X3RjX2RlY2xzIC1zeW50aGVzaXplLXN1Z2FyLW9uLXR5cGVzPXRydWUgLWZ1bGx5LXF1YWxpZmllZC10eXBlcy1pZi1hbWJpZ3VvdXM9dHJ1ZSAtcHJpbnQtaW1wbGljaXQtYXR0cnM9dHJ1ZSAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgPiAldC5wcmludGVkLnR4dAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAtc2RrICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1za2lwLWRlaW5pdD1mYWxzZSAtcHJpbnQtbW9kdWxlIC1zb3VyY2UtZmlsZW5hbWUgJXMgLUYgJVMvSW5wdXRzL21vY2stc2RrIC1JICV0IC1tb2R1bGUtdG8tcHJpbnQ9cHJpbnRfYXN0X3RjX2RlY2xzIC1zeW50aGVzaXplLXN1Z2FyLW9uLXR5cGVzPXRydWUgLWZ1bGx5LXF1YWxpZmllZC10eXBlcy1pZi1hbWJpZ3VvdXM9dHJ1ZSAtcHJpbnQtaW1wbGljaXQtYXR0cnM9dHJ1ZSAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgPiAldC5wcmludGVkLnR4dAogLy8gUlVOOiAlRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UEFTU19QUklOVF9NT0RVTEVfSU5URVJGQUNFIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LnByaW50ZWQudHh0CiAvLyBSVU46ICVGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1QQVNTX1FVQUxfSUZfQU1CSUdVT1VTIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LnByaW50ZWQudHh0CiAvLyBSVU46ICVGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1TWU5USEVTSVpFX1NVR0FSX09OX1RZUEVTIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LnByaW50ZWQudHh0CiAvLyBGSVhNRTogJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVBBU1NfRVhQTE9ERV9QQVRURVJOIC1zdHJpY3Qtd2hpdGVzcGFjZSA8ICV0LnByaW50ZWQudHh0CiAKIC8vIEZJWE1FOiByZGFyOi8vcHJvYmxlbS8xOTY0ODExNyBOZWVkcyBzcGxpdHRpbmcgb2JqYyBwYXJ0cyBvdXQKLS8vIFhGQUlMOiBsaW51eCwgZnJlZWJzZAorLy8gUkVRVUlSRVM6IG9iamNfaW50ZXJvcAogCiBpbXBvcnQgQmFyCiBpbXBvcnQgT2JqZWN0aXZlQwpkaWZmIC0tZ2l0IGEvdGVzdC9JREUvcHJpbnRfYXN0X3R5cGVjaGVja2VkLnN3aWZ0IGIvdGVzdC9JREUvcHJpbnRfYXN0X3R5cGVjaGVja2VkLnN3aWZ0CmluZGV4IDNiMjBlNWQuLmU1MjAwZjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvSURFL3ByaW50X2FzdF90eXBlY2hlY2tlZC5zd2lmdAorKysgYi90ZXN0L0lERS9wcmludF9hc3RfdHlwZWNoZWNrZWQuc3dpZnQKQEAgLTE1LDMgKzE1LDYgQEAKIC8vIENIRUNLMToge3tefX0gIHZhciBJbnRlcm5hbFZhcjE6IEludCwgSW50ZXJuYWxWYXIyOiBJbnR7eyR9fQogLy8gQ0hFQ0sxLU5PVDogcHJpdmF0ZQogLy8gQ0hFQ0sxOiB7e159fSAgdmFyIChJbnRlcm5hbFR1cGxlMSwgSW50ZXJuYWxUdXBsZTIpOiAoSW50LCBJbnQpe3skfX0KKworLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0IC1mdWxseS1xdWFsaWZpZWQtdHlwZXMgLXByaW50LWFzdC10eXBlY2hlY2tlZCAtYWNjZXNzLWZpbHRlci1pbnRlcm5hbCAtc291cmNlLWZpbGVuYW1lICVzIHwgJUZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PUZVTExZX1FVQUwKKy8vIEZVTExZX1FVQUw6IHB1YmxpYyB2YXIgUHVibGljVmFyOiBTd2lmdC5JbnQKZGlmZiAtLWdpdCBhL3Rlc3QvSURFL3ByaW50X2NsYW5nX2RlY2xzLnN3aWZ0IGIvdGVzdC9JREUvcHJpbnRfY2xhbmdfZGVjbHMuc3dpZnQKaW5kZXggY2U5ODRlNC4uZWNjNmE4ZiAxMDA2NDQKLS0tIGEvdGVzdC9JREUvcHJpbnRfY2xhbmdfZGVjbHMuc3dpZnQKKysrIGIvdGVzdC9JREUvcHJpbnRfY2xhbmdfZGVjbHMuc3dpZnQKQEAgLTEsMTIgKzEsMTIgQEAKIC8vIFJVTjogJWVtcHR5LWRpcmVjdG9yeSgldCkKIAotLy8gWEZBSUw6IGxpbnV4LCBmcmVlYnNkCisvLyBSRVFVSVJFUzogb2JqY19pbnRlcm9wCiAKIC8vIFRoaXMgZmlsZSBkZWxpYmVyYXRlbHkgZG9lcyBub3QgdXNlICVjbGFuZy1pbXBvcnRlci1zZGsgZm9yIG1vc3QgUlVOIGxpbmVzLgogLy8gSW5zdGVhZCwgaXQgZ2VuZXJhdGVzIGN1c3RvbSBvdmVybGF5IG1vZHVsZXMgaXRzZWxmLCBhbmQgdXNlcyAtSSAldCB3aGVuIGl0CiAvLyB3YW50cyB0byB1c2UgdGhlbS4KIAotLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kKG1vY2stc2RrOiAlY2xhbmctaW1wb3J0ZXItc2RrIC1JICV0KSAtZW1pdC1tb2R1bGUgLW8gJXQgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkay9zd2lmdC1tb2R1bGVzL09iamVjdGl2ZUMuc3dpZnQgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlCisvLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQobW9jay1zZGs6ICVjbGFuZy1pbXBvcnRlci1zZGsgLUkgJXQpIC1lbWl0LW1vZHVsZSAtbyAldCAlUy8uLi9JbnB1dHMvY2xhbmctaW1wb3J0ZXItc2RrL3N3aWZ0LW1vZHVsZXMvT2JqZWN0aXZlQy5zd2lmdCAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUKIC8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZChtb2NrLXNkazogJWNsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLWVtaXQtbW9kdWxlIC1vICV0ICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsvc3dpZnQtbW9kdWxlcy9Db3JlR3JhcGhpY3Muc3dpZnQKIC8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZChtb2NrLXNkazogJWNsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLWVtaXQtbW9kdWxlIC1vICV0ICVTLy4uL0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsvc3dpZnQtbW9kdWxlcy9Gb3VuZGF0aW9uLnN3aWZ0CiAvLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6IC1zZGsgJVMvLi4vSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkayAtSSAldCkgLXByaW50LW1vZHVsZSAtc291cmNlLWZpbGVuYW1lICVzIC1tb2R1bGUtdG8tcHJpbnQ9Y3R5cGVzIC1mdW5jdGlvbi1kZWZpbml0aW9ucz1mYWxzZSAtcHJlZmVyLXR5cGUtcmVwcj10cnVlID4gJXQucHJpbnRlZC50eHQKZGlmZiAtLWdpdCBhL3Rlc3QvSURFL3ByaW50X2NsYW5nX2hlYWRlci5zd2lmdCBiL3Rlc3QvSURFL3ByaW50X2NsYW5nX2hlYWRlci5zd2lmdAppbmRleCAyZmFjY2Y4Li44YWQyY2RmIDEwMDY0NAotLS0gYS90ZXN0L0lERS9wcmludF9jbGFuZ19oZWFkZXIuc3dpZnQKKysrIGIvdGVzdC9JREUvcHJpbnRfY2xhbmdfaGVhZGVyLnN3aWZ0CkBAIC0xLDI1ICsxLDI1IEBACiAvLyBGSVhNRTogcmRhcjovL3Byb2JsZW0vMTk2NDgxMTcgTmVlZHMgc3BsaXR0aW5nIG9iamMgcGFydHMgb3V0Ci0vLyBYRkFJTDogbGludXgsIGZyZWVic2QKKy8vIFJFUVVJUkVTOiBvYmpjX2ludGVyb3AKIAogLy8gUlVOOiBlY2hvICcjaW5jbHVkZSAiaGVhZGVyLXRvLXByaW50LmgiJyA+ICV0Lm0KLS8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdChtb2NrLXNkazogJWNsYW5nLWltcG9ydGVyLXNkaykgLXNvdXJjZS1maWxlbmFtZSAlcyAtcHJpbnQtaGVhZGVyIC1oZWFkZXItdG8tcHJpbnQgJVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlci9oZWFkZXItdG8tcHJpbnQuaCAtcHJpbnQtcmVndWxhci1jb21tZW50cyAtLWNjLWFyZ3MgJXRhcmdldC1jYy1vcHRpb25zIC1pc3lzcm9vdCAlY2xhbmctaW1wb3J0ZXItc2RrLXBhdGggLWZzeW50YXgtb25seSAldC5tIC1JICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIgPiAldC50eHQKKy8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdChtb2NrLXNkazogJWNsYW5nLWltcG9ydGVyLXNkaykgLXNvdXJjZS1maWxlbmFtZSAlcyAtcHJpbnQtaGVhZGVyIC1oZWFkZXItdG8tcHJpbnQgJVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlci9oZWFkZXItdG8tcHJpbnQuaCAtcHJpbnQtcmVndWxhci1jb21tZW50cyAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgLS1jYy1hcmdzICV0YXJnZXQtY2Mtb3B0aW9ucyAtaXN5c3Jvb3QgJWNsYW5nLWltcG9ydGVyLXNkay1wYXRoIC1mc3ludGF4LW9ubHkgJXQubSAtSSAlUy9JbnB1dHMvcHJpbnRfY2xhbmdfaGVhZGVyID4gJXQudHh0CiAvLyBSVU46IGRpZmYgLXUgJVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlci9oZWFkZXItdG8tcHJpbnQuaC5wcmludGVkLnR4dCAldC50eHQKIAogLy8gUlVOOiAlY2xhbmcgJXRhcmdldC1jYy1vcHRpb25zIC1pc3lzcm9vdCAlY2xhbmctaW1wb3J0ZXItc2RrLXBhdGggLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jLWhlYWRlciAlUy9JbnB1dHMvcHJpbnRfY2xhbmdfaGVhZGVyL2hlYWRlci10by1wcmludC5oIC1vICV0LmgucGNoCiAvLyBSVU46IHRvdWNoICV0LmVtcHR5Lm0KLS8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdChtb2NrLXNkazogJWNsYW5nLWltcG9ydGVyLXNkaykgLXNvdXJjZS1maWxlbmFtZSAlcyAtcHJpbnQtaGVhZGVyIC1oZWFkZXItdG8tcHJpbnQgJVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlci9oZWFkZXItdG8tcHJpbnQuaCAtcHJpbnQtcmVndWxhci1jb21tZW50cyAtLWNjLWFyZ3MgJXRhcmdldC1jYy1vcHRpb25zIC1pc3lzcm9vdCAlY2xhbmctaW1wb3J0ZXItc2RrLXBhdGggLWZzeW50YXgtb25seSAldC5lbXB0eS5tIC1JICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIgLWluY2x1ZGUgJXQuaCA+ICV0LndpdGgtcGNoLnR4dAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAlY2xhbmctaW1wb3J0ZXItc2RrKSAtc291cmNlLWZpbGVuYW1lICVzIC1wcmludC1oZWFkZXIgLWhlYWRlci10by1wcmludCAlUy9JbnB1dHMvcHJpbnRfY2xhbmdfaGVhZGVyL2hlYWRlci10by1wcmludC5oIC1wcmludC1yZWd1bGFyLWNvbW1lbnRzIC1lbmFibGUtb2JqYy1pbnRlcm9wIC1kaXNhYmxlLW9iamMtYXR0ci1yZXF1aXJlcy1mb3VuZGF0aW9uLW1vZHVsZSAtLWNjLWFyZ3MgJXRhcmdldC1jYy1vcHRpb25zIC1pc3lzcm9vdCAlY2xhbmctaW1wb3J0ZXItc2RrLXBhdGggLWZzeW50YXgtb25seSAldC5lbXB0eS5tIC1JICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIgLWluY2x1ZGUgJXQuaCA+ICV0LndpdGgtcGNoLnR4dAogLy8gUlVOOiBkaWZmIC11ICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvaGVhZGVyLXRvLXByaW50LmguY29tbWFuZC1saW5lLWluY2x1ZGUucHJpbnRlZC50eHQgJXQud2l0aC1wY2gudHh0Ci0vLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6ICVjbGFuZy1pbXBvcnRlci1zZGspIC1zb3VyY2UtZmlsZW5hbWUgJXMgLXByaW50LWhlYWRlciAtaGVhZGVyLXRvLXByaW50ICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvaGVhZGVyLXRvLXByaW50LmggLXByaW50LXJlZ3VsYXItY29tbWVudHMgLS1jYy1hcmdzICV0YXJnZXQtY2Mtb3B0aW9ucyAtaXN5c3Jvb3QgJWNsYW5nLWltcG9ydGVyLXNkay1wYXRoIC1mc3ludGF4LW9ubHkgJXQuZW1wdHkubSAtSSAlUy9JbnB1dHMvcHJpbnRfY2xhbmdfaGVhZGVyIC1pbmNsdWRlICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvaGVhZGVyLXRvLXByaW50LmggPiAldC53aXRoLWluY2x1ZGUudHh0CisvLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6ICVjbGFuZy1pbXBvcnRlci1zZGspIC1zb3VyY2UtZmlsZW5hbWUgJXMgLXByaW50LWhlYWRlciAtaGVhZGVyLXRvLXByaW50ICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvaGVhZGVyLXRvLXByaW50LmggLXByaW50LXJlZ3VsYXItY29tbWVudHMgLWVuYWJsZS1vYmpjLWludGVyb3AgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlIC0tY2MtYXJncyAldGFyZ2V0LWNjLW9wdGlvbnMgLWlzeXNyb290ICVjbGFuZy1pbXBvcnRlci1zZGstcGF0aCAtZnN5bnRheC1vbmx5ICV0LmVtcHR5Lm0gLUkgJVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlciAtaW5jbHVkZSAlUy9JbnB1dHMvcHJpbnRfY2xhbmdfaGVhZGVyL2hlYWRlci10by1wcmludC5oID4gJXQud2l0aC1pbmNsdWRlLnR4dAogLy8gUlVOOiBkaWZmIC11ICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvaGVhZGVyLXRvLXByaW50LmguY29tbWFuZC1saW5lLWluY2x1ZGUucHJpbnRlZC50eHQgJXQud2l0aC1pbmNsdWRlLnR4dAogCiAvLyBSVU46IGVjaG8gJyNpbmNsdWRlIDxGb28vaGVhZGVyLXRvLXByaW50Lmg+JyA+ICV0LmZyYW1ld29yay5tCiAvLyBSVU46IHNlZCAtZSAiczpJTlBVVF9ESVI6JVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlcjpnIiAtZSAiczpPVVRfRElSOiV0OmciICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvRm9vLXZmc292ZXJsYXkueWFtbCA+ICV0LnlhbWwKLS8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdChtb2NrLXNkazogJWNsYW5nLWltcG9ydGVyLXNkaykgLXNvdXJjZS1maWxlbmFtZSAlcyAtcHJpbnQtaGVhZGVyIC1oZWFkZXItdG8tcHJpbnQgJVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlci9oZWFkZXItdG8tcHJpbnQuaCAtcHJpbnQtcmVndWxhci1jb21tZW50cyAtLWNjLWFyZ3MgJXRhcmdldC1jYy1vcHRpb25zIC1pc3lzcm9vdCAlY2xhbmctaW1wb3J0ZXItc2RrLXBhdGggLWZzeW50YXgtb25seSAldC5mcmFtZXdvcmsubSAtRiAldCAtaXZmc292ZXJsYXkgJXQueWFtbCAtWGNsYW5nIC1mbW9kdWxlLW5hbWU9Rm9vID4gJXQuZnJhbWV3b3JrLnR4dAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAlY2xhbmctaW1wb3J0ZXItc2RrKSAtc291cmNlLWZpbGVuYW1lICVzIC1wcmludC1oZWFkZXIgLWhlYWRlci10by1wcmludCAlUy9JbnB1dHMvcHJpbnRfY2xhbmdfaGVhZGVyL2hlYWRlci10by1wcmludC5oIC1wcmludC1yZWd1bGFyLWNvbW1lbnRzIC1lbmFibGUtb2JqYy1pbnRlcm9wIC1kaXNhYmxlLW9iamMtYXR0ci1yZXF1aXJlcy1mb3VuZGF0aW9uLW1vZHVsZSAtLWNjLWFyZ3MgJXRhcmdldC1jYy1vcHRpb25zIC1pc3lzcm9vdCAlY2xhbmctaW1wb3J0ZXItc2RrLXBhdGggLWZzeW50YXgtb25seSAldC5mcmFtZXdvcmsubSAtRiAldCAtaXZmc292ZXJsYXkgJXQueWFtbCAtWGNsYW5nIC1mbW9kdWxlLW5hbWU9Rm9vID4gJXQuZnJhbWV3b3JrLnR4dAogLy8gUlVOOiBkaWZmIC11ICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvaGVhZGVyLXRvLXByaW50LmgucHJpbnRlZC50eHQgJXQuZnJhbWV3b3JrLnR4dAogCiAvLyBUZXN0IGhlYWRlciBpbnRlcmZhY2UgcHJpbnRpbmcgZnJvbSBhIGNsYW5nIG1vZHVsZSwgd2l0aCB0aGUgcHJlcHJvY2Vzc2luZyByZWNvcmQgZW5hYmxlZCBiZWZvcmUgdGhlIENDIGFyZ3MuCi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6ICVjbGFuZy1pbXBvcnRlci1zZGspIC1zb3VyY2UtZmlsZW5hbWUgJXMgLXByaW50LWhlYWRlciAtaGVhZGVyLXRvLXByaW50ICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvaGVhZGVyLXRvLXByaW50LmggLXByaW50LXJlZ3VsYXItY29tbWVudHMgLVhjYyAtWGNsYW5nIC1YY2MgLWRldGFpbGVkLXByZXByb2Nlc3NpbmctcmVjb3JkIC0tY2MtYXJncyAldGFyZ2V0LWNjLW9wdGlvbnMgLWlzeXNyb290ICVjbGFuZy1pbXBvcnRlci1zZGstcGF0aCAtZnN5bnRheC1vbmx5ICV0LmZyYW1ld29yay5tIC1GICV0IC1pdmZzb3ZlcmxheSAldC55YW1sID4gJXQubW9kdWxlLnR4dAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAlY2xhbmctaW1wb3J0ZXItc2RrKSAtc291cmNlLWZpbGVuYW1lICVzIC1wcmludC1oZWFkZXIgLWhlYWRlci10by1wcmludCAlUy9JbnB1dHMvcHJpbnRfY2xhbmdfaGVhZGVyL2hlYWRlci10by1wcmludC5oIC1wcmludC1yZWd1bGFyLWNvbW1lbnRzIC1YY2MgLVhjbGFuZyAtWGNjIC1kZXRhaWxlZC1wcmVwcm9jZXNzaW5nLXJlY29yZCAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgLS1jYy1hcmdzICV0YXJnZXQtY2Mtb3B0aW9ucyAtaXN5c3Jvb3QgJWNsYW5nLWltcG9ydGVyLXNkay1wYXRoIC1mc3ludGF4LW9ubHkgJXQuZnJhbWV3b3JrLm0gLUYgJXQgLWl2ZnNvdmVybGF5ICV0LnlhbWwgPiAldC5tb2R1bGUudHh0CiAvLyBSVU46IGRpZmYgLXUgJVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlci9oZWFkZXItdG8tcHJpbnQuaC5tb2R1bGUucHJpbnRlZC50eHQgJXQubW9kdWxlLnR4dAogLy8gVGVzdCBoZWFkZXIgaW50ZXJmYWNlIHByaW50aW5nIGZyb20gYSBjbGFuZyBtb2R1bGUsIHdpdGggdGhlIHByZXByb2Nlc3NpbmcgcmVjb3JkIGVuYWJsZWQgYnkgdGhlIENDIGFyZ3MuCi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtaWRlLXRlc3QobW9jay1zZGs6ICVjbGFuZy1pbXBvcnRlci1zZGspIC1zb3VyY2UtZmlsZW5hbWUgJXMgLXByaW50LWhlYWRlciAtaGVhZGVyLXRvLXByaW50ICVTL0lucHV0cy9wcmludF9jbGFuZ19oZWFkZXIvaGVhZGVyLXRvLXByaW50LmggLXByaW50LXJlZ3VsYXItY29tbWVudHMgLS1jYy1hcmdzICV0YXJnZXQtY2Mtb3B0aW9ucyAtaXN5c3Jvb3QgJWNsYW5nLWltcG9ydGVyLXNkay1wYXRoIC1mc3ludGF4LW9ubHkgJXQuZnJhbWV3b3JrLm0gLUYgJXQgLWl2ZnNvdmVybGF5ICV0LnlhbWwgLVhjbGFuZyAtZGV0YWlsZWQtcHJlcHJvY2Vzc2luZy1yZWNvcmQgPiAldC5tb2R1bGUyLnR4dAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWlkZS10ZXN0KG1vY2stc2RrOiAlY2xhbmctaW1wb3J0ZXItc2RrKSAtc291cmNlLWZpbGVuYW1lICVzIC1wcmludC1oZWFkZXIgLWhlYWRlci10by1wcmludCAlUy9JbnB1dHMvcHJpbnRfY2xhbmdfaGVhZGVyL2hlYWRlci10by1wcmludC5oIC1wcmludC1yZWd1bGFyLWNvbW1lbnRzIC1lbmFibGUtb2JqYy1pbnRlcm9wIC1kaXNhYmxlLW9iamMtYXR0ci1yZXF1aXJlcy1mb3VuZGF0aW9uLW1vZHVsZSAtLWNjLWFyZ3MgJXRhcmdldC1jYy1vcHRpb25zIC1pc3lzcm9vdCAlY2xhbmctaW1wb3J0ZXItc2RrLXBhdGggLWZzeW50YXgtb25seSAldC5mcmFtZXdvcmsubSAtRiAldCAtaXZmc292ZXJsYXkgJXQueWFtbCAtWGNsYW5nIC1kZXRhaWxlZC1wcmVwcm9jZXNzaW5nLXJlY29yZCA+ICV0Lm1vZHVsZTIudHh0CiAvLyBSVU46IGRpZmYgLXUgJVMvSW5wdXRzL3ByaW50X2NsYW5nX2hlYWRlci9oZWFkZXItdG8tcHJpbnQuaC5tb2R1bGUucHJpbnRlZC50eHQgJXQubW9kdWxlMi50eHQKZGlmZiAtLWdpdCBhL3Rlc3QvSURFL3ByaW50X3VzcnMuc3dpZnQgYi90ZXN0L0lERS9wcmludF91c3JzLnN3aWZ0CmluZGV4IDEwYWYzMjEuLjUwYzRkOTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvSURFL3ByaW50X3VzcnMuc3dpZnQKKysrIGIvdGVzdC9JREUvcHJpbnRfdXNycy5zd2lmdApAQCAtMSw2ICsxLDEyIEBACiAvLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQobW9jay1zZGs6ICVjbGFuZy1pbXBvcnRlci1zZGspIC10eXBlY2hlY2sgLXZlcmlmeSAtZGlzYWJsZS1vYmpjLWF0dHItcmVxdWlyZXMtZm91bmRhdGlvbi1tb2R1bGUgLWVuYWJsZS1vYmpjLWludGVyb3AgJXMKIC8vIFJVTjogJXRhcmdldC1zd2lmdC1pZGUtdGVzdChtb2NrLXNkazogJWNsYW5nLWltcG9ydGVyLXNkaykgLWRpc2FibGUtb2JqYy1hdHRyLXJlcXVpcmVzLWZvdW5kYXRpb24tbW9kdWxlIC1lbmFibGUtb2JqYy1pbnRlcm9wIC1wcmludC11c3JzIC1zb3VyY2UtZmlsZW5hbWUgJXMgfCAlRmlsZUNoZWNrICVzIC1zdHJpY3Qtd2hpdGVzcGFjZQogCisjaWYgb3MoV2luZG93cykgJiYgKGFyY2goYXJtNjQpIHx8IGFyY2goeDg2XzY0KSkKK3R5cGVhbGlhcyBPYmpDRW51bVR5cGUgPSBJbnQzMgorI2Vsc2UKK3R5cGVhbGlhcyBPYmpDRW51bVR5cGUgPSBJbnQKKyNlbmRpZgorCiBpbXBvcnQgbWFjcm9zCiAKIC8vIENIRUNLOiBbW0BMSU5FKzFdXTo4IHM6MTRzd2lmdF9pZGVfdGVzdDFTVnt7JH19CkBAIC0xOTcsNyArMjAzLDcgQEAKICAgZnVuYyBpbnN0YW5jZUZ1bmMxKF8gYTogSW50KSB7CiAKICAgICAvLyBDSEVDSzogW1tATElORSsxXV06MTYgczoxNHN3aWZ0X2lkZV90ZXN0MTBPYmpDQ2xhc3MxQzEzaW5zdGFuY2VGdW5jMXl5U2lGOUxvY2FsRW51bUxfTwotICAgIEBvYmpjIGVudW0gTG9jYWxFbnVtIDogSW50IHsKKyAgICBAb2JqYyBlbnVtIExvY2FsRW51bSA6IE9iakNFbnVtVHlwZSB7CiAgICAgICAvLyBDSEVDSzogW1tATElORSsxXV06MTIgczoxNHN3aWZ0X2lkZV90ZXN0MTBPYmpDQ2xhc3MxQzEzaW5zdGFuY2VGdW5jMXl5U2lGOUxvY2FsRW51bUxfTzhzb21lQ2FzZXlBMkZtRgogICAgICAgY2FzZSBzb21lQ2FzZQogICAgIH0KQEAgLTI0MCw3ICsyNDYsNyBAQAogfQogCiAvLyBDSEVDSzogW1tATElORSsxXV06MTIgYzpATUBzd2lmdF9pZGVfdGVzdEBFQE9iakNFbnVte3skfX0KLUBvYmpjIGVudW0gT2JqQ0VudW0gOiBJbnQgeworQG9iamMgZW51bSBPYmpDRW51bSA6IE9iakNFbnVtVHlwZSB7CiAKICAgLy8gQ0hFQ0s6IFtbQExJTkUrMV1dOjggYzpATUBzd2lmdF9pZGVfdGVzdEBFQE9iakNFbnVtQE9iakNFbnVtQW1hemluZ0Nhc2V7eyR9fQogICBjYXNlIGFtYXppbmdDYXNlCmRpZmYgLS1naXQgYS90ZXN0L0lSR2VuL0lucHV0cy9tdWx0aXRocmVhZF9yZXNpbGllbmNlX290aGVyLnN3aWZ0IGIvdGVzdC9JUkdlbi9JbnB1dHMvbXVsdGl0aHJlYWRfcmVzaWxpZW5jZV9vdGhlci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzZlMDQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9JUkdlbi9JbnB1dHMvbXVsdGl0aHJlYWRfcmVzaWxpZW5jZV9vdGhlci5zd2lmdApAQCAtMCwwICsxLDMgQEAKK2V4dGVuc2lvbiBEZWZhdWx0YWJsZSB7CisgIHB1YmxpYyBmdW5jIGRlZmF1bHRlZCgpIHt9Cit9CmRpZmYgLS1naXQgYS90ZXN0L0lSR2VuL2JpZ190eXBlc19jb3JuZXJfY2FzZXMuc3dpZnQgYi90ZXN0L0lSR2VuL2JpZ190eXBlc19jb3JuZXJfY2FzZXMuc3dpZnQKaW5kZXggNzU5NTczZi4uZWY0OWY2YyAxMDA2NDQKLS0tIGEvdGVzdC9JUkdlbi9iaWdfdHlwZXNfY29ybmVyX2Nhc2VzLnN3aWZ0CisrKyBiL3Rlc3QvSVJHZW4vYmlnX3R5cGVzX2Nvcm5lcl9jYXNlcy5zd2lmdApAQCAtMSw0ICsxLDQgQEAKLQorLy8gWEZBSUw6IENQVT1wb3dlcnBjNjRsZQogLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kIC1lbmFibGUtbGFyZ2UtbG9hZGFibGUtdHlwZXMgJXMgLWVtaXQtaXIgfCAlRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIC0tY2hlY2stcHJlZml4PUNIRUNLLSV0YXJnZXQtcHRyc2l6ZQogLy8gUkVRVUlSRVM6IG9wdGltaXplZF9zdGRsaWIKIApkaWZmIC0tZ2l0IGEvdGVzdC9JUkdlbi9iaWdfdHlwZXNfdGVzdHMuc2lsIGIvdGVzdC9JUkdlbi9iaWdfdHlwZXNfdGVzdHMuc2lsCmluZGV4IDE5MjU2MDEuLmY5NTZlMDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvSVJHZW4vYmlnX3R5cGVzX3Rlc3RzLnNpbAorKysgYi90ZXN0L0lSR2VuL2JpZ190eXBlc190ZXN0cy5zaWwKQEAgLTEsOSArMSw5IEBACi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQgLUkgJVMvSW5wdXRzL2FiaSAlcyAtZW1pdC1pciAtZW5hYmxlLWxhcmdlLWxvYWRhYmxlLXR5cGVzIHwgJUZpbGVDaGVjayAlcworLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kIC1JICVTL0lucHV0cy9hYmkgJXMgLWVtaXQtaXIgLWVuYWJsZS1sYXJnZS1sb2FkYWJsZS10eXBlcyAtc2lsLXZlcmlmeS1hbGwgfCAlRmlsZUNoZWNrICVzCiAKIC8vIFJFUVVJUkVTOiBDUFU9eDg2XzY0CiAvLyBSRVFVSVJFUzogT1M9bWFjb3N4CiAKLXNpbF9zdGFnZSBjYW5vbmljYWwKK3NpbF9zdGFnZSBsb3dlcmVkCiBpbXBvcnQgQnVpbHRpbgogaW1wb3J0IFN3aWZ0CiAKQEAgLTI5LDMgKzI5LDE2IEBACiAgICVyZXQgPSB0dXBsZSAoKQogICByZXR1cm4gJXJldCA6ICQoKQogfQorCitzaWwgQGNhcHR1cmUgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIEJpZ1N0cnVjdCwgQnVpbHRpbi5JbnQxKSAtPiAoKQorCitzaWwgQHRlc3RfcGFydGlhbF9hcHBseV9zdGFjayA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJpZ1N0cnVjdCwgQnVpbHRpbi5JbnQxKSAtPiAoKSB7CitlbnRyeSgleCA6ICRCaWdTdHJ1Y3QsICVpIDogJEJ1aWx0aW4uSW50MSk6CisgICVmID0gZnVuY3Rpb25fcmVmIEBjYXB0dXJlIDogJEBjb252ZW50aW9uKHRoaW4pIChAZ3VhcmFudGVlZCBCaWdTdHJ1Y3QsIEJ1aWx0aW4uSW50MSkgLT4gKCkKKyAgJXAgPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXSAlZiglaSkgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIEJpZ1N0cnVjdCwgQnVpbHRpbi5JbnQxKSAtPiAoKQorICAlbSA9IG1hcmtfZGVwZW5kZW5jZSAlcCA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkIChAZ3VhcmFudGVlZCBCaWdTdHJ1Y3QpIC0+ICgpIG9uICV4IDogJEJpZ1N0cnVjdAorICAlYyA9IGNvbnZlcnRfZnVuY3Rpb24gJW0gOiAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoQGd1YXJhbnRlZWQgQmlnU3RydWN0KSAtPiAoKSB0byAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoQGd1YXJhbnRlZWQgQmlnU3RydWN0KSAtPiAoQGVycm9yIEVycm9yKQorICBkZWFsbG9jX3N0YWNrICVwIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKEBndWFyYW50ZWVkIEJpZ1N0cnVjdCkgLT4gKCkKKyAgJXJldCA9IHR1cGxlICgpCisgIHJldHVybiAlcmV0IDogJCgpCit9CmRpZmYgLS1naXQgYS90ZXN0L0lSR2VuL2NsYW5nX2lubGluZV9vcHQuc3dpZnQgYi90ZXN0L0lSR2VuL2NsYW5nX2lubGluZV9vcHQuc3dpZnQKaW5kZXggZGI3OTg4MC4uNGJkZTBmMSAxMDA2NDQKLS0tIGEvdGVzdC9JUkdlbi9jbGFuZ19pbmxpbmVfb3B0LnN3aWZ0CisrKyBiL3Rlc3QvSVJHZW4vY2xhbmdfaW5saW5lX29wdC5zd2lmdApAQCAtNyw3ICs3LDcgQEAKIC8vIFNhbml0eSBjaGVjayB0aGF0IHdlIHRlbGwgQ2xhbmcgdG8gZ2VuZXJhdGUgb3B0aW1pemFibGUgY29kZSB3aGVuCiAvLyB3ZSdyZSBvcHRpbWl6aW5nLgogCi0vLyBDSEVDSzogZGVmaW5lIGludGVybmFsIGkzMiBAcmV0dXJuNygpIFtbQ0xBTkdfQVRUUlM6I1swLTldK11dIHsKKy8vIENIRUNLOiBkZWZpbmUgaW50ZXJuYWx7eyggemVyb2V4dCk/fX0gaTMyIEByZXR1cm43KCkgW1tDTEFOR19BVFRSUzojWzAtOV0rXV0gewogCiAvLyBDSEVDSzogYXR0cmlidXRlcyBbW0NMQU5HX0FUVFJTXV0gPSB7CiAvLyBDSEVDSy1OT1Q6IG5vaW5saW5lCmRpZmYgLS1naXQgYS90ZXN0L0lSR2VuL2NsYXNzX3Jlc2lsaWVuY2Vfb2JqYy5zd2lmdCBiL3Rlc3QvSVJHZW4vY2xhc3NfcmVzaWxpZW5jZV9vYmpjLnN3aWZ0CmluZGV4IDIzNmVjYmMuLmE2YTVjZTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvSVJHZW4vY2xhc3NfcmVzaWxpZW5jZV9vYmpjLnN3aWZ0CisrKyBiL3Rlc3QvSVJHZW4vY2xhc3NfcmVzaWxpZW5jZV9vYmpjLnN3aWZ0CkBAIC0xLDYgKzEsNyBAQAogLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kKG1vY2stc2RrOiAlY2xhbmctaW1wb3J0ZXItc2RrKSAtZW5hYmxlLW9iamMtaW50ZXJvcCAtZW1pdC1pciAtbyAtIC1wcmltYXJ5LWZpbGUgJXMgfCAlRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIC0tY2hlY2stcHJlZml4PUNIRUNLLSV0YXJnZXQtcHRyc2l6ZQogCiAvLyBYRkFJTDogQ1BVPWFybXY3aworLy8gWEZBSUw6IENQVT1wb3dlcnBjNjRsZQogCiAvLyBDSEVDSzogJXN3aWZ0LnR5cGUgPSB0eXBlIHsgW1tJTlQ6aTMyfGk2NF1dIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9JUkdlbi9lbnVtX3Jlc2lsaWVuY2Uuc3dpZnQgYi90ZXN0L0lSR2VuL2VudW1fcmVzaWxpZW5jZS5zd2lmdAppbmRleCAyOTc1ZDc3Li4yYjU3NmVlOCAxMDA2NDQKLS0tIGEvdGVzdC9JUkdlbi9lbnVtX3Jlc2lsaWVuY2Uuc3dpZnQKKysrIGIvdGVzdC9JUkdlbi9lbnVtX3Jlc2lsaWVuY2Uuc3dpZnQKQEAgLTI1Miw3ICsyNTIsOCBAQAogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZXt7KCBkbGxleHBvcnQpP319e3soIHByb3RlY3RlZCk/fX0gc3dpZnRjYyB2b2lkIEAiJHMxNWVudW1fcmVzaWxpZW5jZTI1cmVzaWxpZW50RW51bVBhcnRpYWxBcHBseXl5U2kwYzFfQTA2TWVkaXVtT1hFRiIoaTgqLCAlc3dpZnQub3BhcXVlKikKIHB1YmxpYyBmdW5jIHJlc2lsaWVudEVudW1QYXJ0aWFsQXBwbHkoXyBmOiAoTWVkaXVtKSAtPiBJbnQpIHsKIAotLy8gQ0hFQ0s6ICAgICBbW0NPTlRFWFQ6JS4qXV0gPSBjYWxsIG5vYWxpYXMgJXN3aWZ0LnJlZmNvdW50ZWQqIEBzd2lmdF9hbGxvY09iamVjdAorLy8gQ0hFQ0s6ICAgICBbW1NUQUNLQUxMT0M6JS4qXV0gPSBhbGxvY2EgaTgKKy8vIENIRUNLOiAgICAgW1tDT05URVhUOiUuKl1dID0gYml0Y2FzdCBpOCogW1tTVEFDS0FMTE9DXV0gdG8gJXN3aWZ0Lm9wYXF1ZSoKIC8vIENIRUNLOiAgICAgY2FsbCBzd2lmdGNjIHZvaWQgQCIkczE1ZW51bV9yZXNpbGllbmNlMTNyZWFic3RyYWN0aW9ueXl4MDEwcmVzaWxpZW50X0EwNk1lZGl1bU9YRWxGIihpOCogYml0Y2FzdCAodm9pZCAoJVRTaSosICVzd2lmdC5vcGFxdWUqLCAlc3dpZnQucmVmY291bnRlZCopKiBAIiRzMTRyZXNpbGllbnRfZW51bTZNZWRpdW1PU2lJZ25kX0FDU2lJZWducl9UUlRBIiB0byBpOCopLCAlc3dpZnQub3BhcXVlKiBbW0NPTlRFWFQ6JS4qXV0sICVzd2lmdC50eXBlKiBAIiRzU2lOIikKICAgcmVhYnN0cmFjdGlvbihmKQogCmRpZmYgLS1naXQgYS90ZXN0L0lSR2VuL2Vycm9ycy5zaWwgYi90ZXN0L0lSR2VuL2Vycm9ycy5zaWwKaW5kZXggYTJiMjFjNi4uZjM5M2IwYSAxMDA2NDQKLS0tIGEvdGVzdC9JUkdlbi9lcnJvcnMuc2lsCisrKyBiL3Rlc3QvSVJHZW4vZXJyb3JzLnNpbApAQCAtMSwzICsxLDQgQEAKKy8vIFhGQUlMOiBDUFU9cG93ZXJwYzY0bGUKIC8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZCAtcHJpbWFyeS1maWxlICVzIC1lbWl0LWlyIHwgJUZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSyAtLWNoZWNrLXByZWZpeD1DSEVDSy0ldGFyZ2V0LXJ1bnRpbWUgLS1jaGVjay1wcmVmaXg9Q0hFQ0stJXRhcmdldC1jcHUKIAogc2lsX3N0YWdlIGNhbm9uaWNhbApkaWZmIC0tZ2l0IGEvdGVzdC9JUkdlbi9tdWx0aXRocmVhZF9yZXNpbGllbmNlLnN3aWZ0IGIvdGVzdC9JUkdlbi9tdWx0aXRocmVhZF9yZXNpbGllbmNlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzZiNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0lSR2VuL211bHRpdGhyZWFkX3Jlc2lsaWVuY2Uuc3dpZnQKQEAgLTAsMCArMSw5IEBACisvLyBSVU46ICVlbXB0eS1kaXJlY3RvcnkoJXQpCisvLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQgLWMgJVMvSW5wdXRzL211bHRpdGhyZWFkX3Jlc2lsaWVuY2Vfb3RoZXIuc3dpZnQgJXMgLW51bS10aHJlYWRzIDIgLW8gJXQvMS5vIC1vICV0LzIubyAtbW9kdWxlLW5hbWUgbXVsdGl0aHJlYWRfcmVzaWxpZW5jZQorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kIC1jICVTL0lucHV0cy9tdWx0aXRocmVhZF9yZXNpbGllbmNlX290aGVyLnN3aWZ0ICVzIC1udW0tdGhyZWFkcyAyIC1vICV0LzEubyAtbyAldC8yLm8gLW1vZHVsZS1uYW1lIG11bHRpdGhyZWFkX3Jlc2lsaWVuY2UgLWVuYWJsZS10ZXN0aW5nCisvLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQgLWMgJVMvSW5wdXRzL211bHRpdGhyZWFkX3Jlc2lsaWVuY2Vfb3RoZXIuc3dpZnQgJXMgLW51bS10aHJlYWRzIDIgLW8gJXQvMS5vIC1vICV0LzIubyAtbW9kdWxlLW5hbWUgbXVsdGl0aHJlYWRfcmVzaWxpZW5jZSAtZW5hYmxlLXJlc2lsaWVuY2UKKy8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZCAtYyAlUy9JbnB1dHMvbXVsdGl0aHJlYWRfcmVzaWxpZW5jZV9vdGhlci5zd2lmdCAlcyAtbnVtLXRocmVhZHMgMiAtbyAldC8xLm8gLW8gJXQvMi5vIC1tb2R1bGUtbmFtZSBtdWx0aXRocmVhZF9yZXNpbGllbmNlIC1lbmFibGUtdGVzdGluZyAtZW5hYmxlLXJlc2lsaWVuY2UKKworcHVibGljIHByb3RvY29sIERlZmF1bHRhYmxlIHsKKyAgZnVuYyBkZWZhdWx0ZWQoKQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9JUkdlbi9vYmpjX2JyaWRnZS5zd2lmdCBiL3Rlc3QvSVJHZW4vb2JqY19icmlkZ2Uuc3dpZnQKaW5kZXggMTJmYjJlOC4uNjQyNWYzMSAxMDA2NDQKLS0tIGEvdGVzdC9JUkdlbi9vYmpjX2JyaWRnZS5zd2lmdAorKysgYi90ZXN0L0lSR2VuL29iamNfYnJpZGdlLnN3aWZ0CkBAIC0xMDAsNyArMTAwLDcgQEAKIAogLy8gQ0hFQ0s6IEBfUFJPUEVSVElFU19fVHRDMTFvYmpjX2JyaWRnZTNCYXMgPSBwcml2YXRlIGNvbnN0YW50IHsgaTMyLCBpMzIsIFs1IHggeyBpOCosIGk4KiB9XSB9IHsKIAotLy8gQ0hFQ0s6IFtbT0JKQ19CTE9DS19QUk9QRVJUWTpALipdXSA9IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFsxMSB4IGk4XSBjIlRAPyxOLEMsVnhcMDAiCisvLyBDSEVDSzogW1tPQkpDX0JMT0NLX1BST1BFUlRZOkAuKl1dID0gcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzggeCBpOF0gYyJUQD8sTixDXDAwIgogLy8gQ0hFQ0s6IEBfUFJPUEVSVElFU19fVHRDMTFvYmpjX2JyaWRnZTIxT3B0aW9uYWxCbG9ja1Byb3BlcnR5ID0gcHJpdmF0ZSBjb25zdGFudCB7ey4qfX0gW1tPQkpDX0JMT0NLX1BST1BFUlRZXV0KIAogZnVuYyBnZXREZXNjcmlwdGlvbihfIG86IE5TT2JqZWN0KSAtPiBTdHJpbmcgewpkaWZmIC0tZ2l0IGEvdGVzdC9JUkdlbi9vYmpjX3Byb3BlcnR5X2F0dHJzLnN3aWZ0IGIvdGVzdC9JUkdlbi9vYmpjX3Byb3BlcnR5X2F0dHJzLnN3aWZ0CmluZGV4IGMzOTgyNGIuLmM5OTM0Y2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvSVJHZW4vb2JqY19wcm9wZXJ0eV9hdHRycy5zd2lmdAorKysgYi90ZXN0L0lSR2VuL29iamNfcHJvcGVydHlfYXR0cnMuc3dpZnQKQEAgLTUwLDExICs1MCwxMSBAQAogCiAgIC8vIC0tIEJyaWRnZWQgdmFsdWUgdHlwZXMKIAotICAvLyBub25hdG9taWMsIGNvcHksIGl2YXIgawotICAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQge3suKn19IGMiVEBcMjJOU1N0cmluZ1wyMixOLEMsVmtcMDAiCisgIC8vIG5vbmF0b21pYywgY29weQorICAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQge3suKn19IGMiVEBcMjJOU1N0cmluZ1wyMixOLENcMDAiCiAgIEBvYmpjIHZhciBrOiBTdHJpbmcgPSAiIgotICAvLyBub25hdG9taWMsIHJlYWRvbmx5LCBpdmFyIGwKLSAgLy8gQ0hFQ0s6IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IHt7Lip9fSBjIlRAXDIyTlNTdHJpbmdcMjIsTixSLFZsXDAwIgorICAvLyBub25hdG9taWMsIHJlYWRvbmx5CisgIC8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCB7ey4qfX0gYyJUQFwyMk5TU3RyaW5nXDIyLE4sUlwwMCIKICAgQG9iamMgbGV0IGw6IFN0cmluZz8gPSBuaWwKIAogICAvLyAtLSBQcm90b2NvbCB0eXBlczoKZGlmZiAtLWdpdCBhL3Rlc3QvSVJHZW4vb2JqY19zaW1kLnNpbCBiL3Rlc3QvSVJHZW4vb2JqY19zaW1kLnNpbAppbmRleCBkMjU3YzRmLi5iMDM3ZjU0IDEwMDY0NAotLS0gYS90ZXN0L0lSR2VuL29iamNfc2ltZC5zaWwKKysrIGIvdGVzdC9JUkdlbi9vYmpjX3NpbWQuc2lsCkBAIC01Nyw3ICs1Nyw3IEBACiAvLyBhcm12N3MtTEFCRUw6IGRlZmluZXt7KCBkbGxleHBvcnQpP319e3soIHByb3RlY3RlZCk/fX0gc3dpZnRjYyB7IGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0IH0gQHNpbWRfbmF0aXZlX2FyZ3MoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpCiAvLyBhcm12N2stTEFCRUw6IGRlZmluZXt7KCBkbGxleHBvcnQpP319e3soIHByb3RlY3RlZCk/fX0gc3dpZnRjYyB7IGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0IH0gQHNpbWRfbmF0aXZlX2FyZ3MoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpCiAvLyBwb3dlcnBjNjQtTEFCRUw6IGRlZmluZXt7KCBkbGxleHBvcnQpP319e3soIHByb3RlY3RlZCk/fX0gdm9pZCBAc2ltZF9uYXRpdmVfYXJncyglVDRzaW1kNmZsb2F0NFYqIG5vYWxpYXMgbm9jYXB0dXJlIHNyZXQsICVUNHNpbWQ2ZmxvYXQ0Viogbm9hbGlhcyBub2NhcHR1cmUgZGVyZWZlcmVuY2VhYmxlKHt7Lip9fSkpCi0vLyBwb3dlcnBjNjRsZS1MQUJFTDogZGVmaW5le3soIGRsbGV4cG9ydCk/fX17eyggcHJvdGVjdGVkKT99fSB2b2lkIEBzaW1kX25hdGl2ZV9hcmdzKCVUNHNpbWQ2ZmxvYXQ0Viogbm9hbGlhcyBub2NhcHR1cmUgc3JldCwgJVQ0c2ltZDZmbG9hdDRWKiBub2FsaWFzIG5vY2FwdHVyZSBkZXJlZmVyZW5jZWFibGUoe3suKn19KSkKKy8vIHBvd2VycGM2NGxlLUxBQkVMOiBkZWZpbmV7eyggZGxsZXhwb3J0KT99fXt7KCBwcm90ZWN0ZWQpP319IHN3aWZ0Y2MgeyBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCB9IEBzaW1kX25hdGl2ZV9hcmdzKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KQogLy8gczM5MHgtTEFCRUw6IGRlZmluZXt7KCBkbGxleHBvcnQpP319e3soIHByb3RlY3RlZCk/fX0gdm9pZCBAc2ltZF9uYXRpdmVfYXJncyglVDRzaW1kNmZsb2F0NFYqIG5vYWxpYXMgbm9jYXB0dXJlIHNyZXQsICVUNHNpbWQ2ZmxvYXQ0Viogbm9hbGlhcyBub2NhcHR1cmUgZGVyZWZlcmVuY2VhYmxlKHt7Lip9fSkpCiBzaWwgQHNpbWRfbmF0aXZlX2FyZ3MgOiAkQGNvbnZlbnRpb24odGhpbikgKGZsb2F0NCkgLT4gZmxvYXQ0IHsKIGVudHJ5KCV4IDogJGZsb2F0NCk6CmRpZmYgLS1naXQgYS90ZXN0L0lSR2VuL3BhcnRpYWxfYXBwbHkuc2lsIGIvdGVzdC9JUkdlbi9wYXJ0aWFsX2FwcGx5LnNpbAppbmRleCA3ZTQ0M2MyLi44Nzk3NGUzIDEwMDY0NAotLS0gYS90ZXN0L0lSR2VuL3BhcnRpYWxfYXBwbHkuc2lsCisrKyBiL3Rlc3QvSVJHZW4vcGFydGlhbF9hcHBseS5zaWwKQEAgLTEwLDYgKzEwLDkgQEAKIHNpbCBAJHMxM3BhcnRpYWxfYXBwbHkxMFN3aWZ0Q2xhc3NDZkQgOiAkQGNvbnZlbnRpb24obWV0aG9kKSAoU3dpZnRDbGFzcykgLT4gKCkKIAogc2lsIEBwYXJ0aWFsbHlfYXBwbHlhYmxlX3RvX2NsYXNzIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgU3dpZnRDbGFzcykgLT4gKCkKK3NpbCBAcGFydGlhbGx5X2FwcGx5YWJsZV90b190d29fY2xhc3NlcyA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIFN3aWZ0Q2xhc3MsIEBvd25lZCBTd2lmdENsYXNzKSAtPiAoKQorCitzaWwgQHVzZV9jbG9zdXJlIDogJEBjb252ZW50aW9uKHRoaW4pIChAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpKSAtPiAoKQogCiAvLyBDSEVDSzogZGVmaW5le3soIGRsbGV4cG9ydCk/fX17eyggcHJvdGVjdGVkKT99fSBzd2lmdGNjIHsgaTgqLCAlc3dpZnQucmVmY291bnRlZCogfSBAcGFydGlhbF9hcHBseV9jbGFzcyglVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqKSB7ey4qfX0gewogLy8gQ0hFQ0s6IGVudHJ5OgpAQCAtMjQsNiArMjcsNTMgQEAKICAgcmV0dXJuICVnIDogJEBjYWxsZWVfb3duZWQgKCkgLT4gKCkKIH0KIAorLy8gQ0hFQ0s6IGRlZmluZXt7Lip9fSBzd2lmdGNjIHZvaWQgQHBhcnRpYWxfYXBwbHlfY2xhc3Nfb25fc3RhY2soJVQxM3BhcnRpYWxfYXBwbHkxMFN3aWZ0Q2xhc3NDKikKKy8vIENIRUNLOiBlbnRyeToKKy8vIENIRUNLOiAgIFtbQ1RYOiUuKl1dID0gYml0Y2FzdCAlVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqICUwIHRvICVzd2lmdC5vcGFxdWUqCisvLyBDSEVDSzogICBjYWxsIHN3aWZ0Y2Mgdm9pZCBAdXNlX2Nsb3N1cmUoaTgqIGJpdGNhc3QgKHZvaWQgKCVzd2lmdC5yZWZjb3VudGVkKikqIEAiJHMyOHBhcnRpYWxseV9hcHBseWFibGVfdG9fY2xhc3NUQS4xIiB0byBpOCopLCAlc3dpZnQub3BhcXVlKiBbW0NUWF1dKQorLy8gQ0hFQ0s6ICAgY2FsbCB2b2lkIGJpdGNhc3QgKHZvaWQgKCVzd2lmdC5yZWZjb3VudGVkKikqIEBzd2lmdF9yZWxlYXNlIHRvIHZvaWQgKCVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyopKikoJVQxM3BhcnRpYWxfYXBwbHkxMFN3aWZ0Q2xhc3NDKiAlMCkKKy8vIENIRUNLOiAgIHJldCB2b2lkCisvLyBDSEVDSzogfQorCitzaWwgQHBhcnRpYWxfYXBwbHlfY2xhc3Nfb25fc3RhY2sgOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBTd2lmdENsYXNzKSAtPiAoKSB7CitlbnRyeSglYSA6ICRTd2lmdENsYXNzKToKKyAgJWYgPSBmdW5jdGlvbl9yZWYgQHBhcnRpYWxseV9hcHBseWFibGVfdG9fY2xhc3MgOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBTd2lmdENsYXNzKSAtPiAoKQorICAlYyA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdICVmKCVhKSA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIFN3aWZ0Q2xhc3MpIC0+ICgpCisgICV1c2UgPSBmdW5jdGlvbl9yZWYgQHVzZV9jbG9zdXJlIDogJEBjb252ZW50aW9uKHRoaW4pIChAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpKSAtPiAoKQorICBhcHBseSAldXNlKCVjKSA6ICRAY29udmVudGlvbih0aGluKSAoQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSkgLT4gKCkKKyAgZGVhbGxvY19zdGFjayAlYyA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+KCkKKyAgc3Ryb25nX3JlbGVhc2UgJWEgOiAkU3dpZnRDbGFzcworICAldCA9IHR1cGxlKCkKKyAgcmV0dXJuICV0IDogJCgpCit9CisKKy8vIENIRUNLOiBkZWZpbmV7ey4qfX0gc3dpZnRjYyB2b2lkIEBwYXJ0aWFsX2FwcGx5X3R3b19jbGFzc2VzX29uX3N0YWNrKCVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyosICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyopCisvLyBDSEVDSzogZW50cnk6CisvLyBDSEVDSzogICBbW0NUWDolLipdXSA9IGFsbG9jYSBpOCwgaTY0IDMyLCBhbGlnbiAxNgorLy8gQ0hFQ0s6ICAgW1tDVFgyOiUuKl1dID0gYml0Y2FzdCBpOCogW1tDVFhdXSB0byAlc3dpZnQub3BhcXVlKgorLy8gQ0hFQ0s6ICAgW1tMQVlPVVQ6JS4qXV0gPSBiaXRjYXN0ICVzd2lmdC5vcGFxdWUqIFtbQ1RYMl1dIHRvIDx7ICVzd2lmdC5yZWZjb3VudGVkLCAlVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqLCAlVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqIH0+KgorLy8gQ0hFQ0s6ICAgW1tDQVBUVVJFMTolLipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgPHsgJXN3aWZ0LnJlZmNvdW50ZWQsICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyosICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyogfT4sIDx7ICVzd2lmdC5yZWZjb3VudGVkLCAlVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqLCAlVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqIH0+KiBbW0xBWU9VVF1dLCBpMzIgMCwgaTMyIDEKKy8vIENIRUNLOiAgIHN0b3JlICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyogJTAsICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyoqIFtbQ0FQVFVSRTFdXSwgYWxpZ24gOAorLy8gQ0hFQ0s6ICAgW1tDQVBUVVJFMjolLipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgPHsgJXN3aWZ0LnJlZmNvdW50ZWQsICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyosICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyogfT4sIDx7ICVzd2lmdC5yZWZjb3VudGVkLCAlVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqLCAlVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqIH0+KiBbW0xBWU9VVF1dLCBpMzIgMCwgaTMyIDIKKy8vIENIRUNLOiAgIHN0b3JlICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyogJTEsICVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyoqIFtbQ0FQVFVSRTJdXSwgYWxpZ24gOAorLy8gQ0hFQ0s6ICAgY2FsbCBzd2lmdGNjIHZvaWQgQHVzZV9jbG9zdXJlKGk4KiBiaXRjYXN0ICh2b2lkICglc3dpZnQucmVmY291bnRlZCopKiBAIiRzMzRwYXJ0aWFsbHlfYXBwbHlhYmxlX3RvX3R3b19jbGFzc2VzVEEiIHRvIGk4KiksICVzd2lmdC5vcGFxdWUqIFtbQ1RYMl1dKQorLy8gQ0hFQ0s6ICAgY2FsbCB2b2lkIGJpdGNhc3QgKHZvaWQgKCVzd2lmdC5yZWZjb3VudGVkKikqIEBzd2lmdF9yZWxlYXNlIHRvIHZvaWQgKCVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyopKikoJVQxM3BhcnRpYWxfYXBwbHkxMFN3aWZ0Q2xhc3NDKiAlMCkKKy8vIENIRUNLOiAgIGNhbGwgdm9pZCBiaXRjYXN0ICh2b2lkICglc3dpZnQucmVmY291bnRlZCopKiBAc3dpZnRfcmVsZWFzZSB0byB2b2lkICglVDEzcGFydGlhbF9hcHBseTEwU3dpZnRDbGFzc0MqKSopKCVUMTNwYXJ0aWFsX2FwcGx5MTBTd2lmdENsYXNzQyogJTEpCisvLyBDSEVDSzogICByZXQgdm9pZAorLy8gQ0hFQ0s6IH0KKworc2lsIEBwYXJ0aWFsX2FwcGx5X3R3b19jbGFzc2VzX29uX3N0YWNrIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgU3dpZnRDbGFzcywgQG93bmVkIFN3aWZ0Q2xhc3MpIC0+ICgpIHsKK2VudHJ5KCVhIDogJFN3aWZ0Q2xhc3MsICViOiAkU3dpZnRDbGFzcyk6CisgICVmID0gZnVuY3Rpb25fcmVmIEBwYXJ0aWFsbHlfYXBwbHlhYmxlX3RvX3R3b19jbGFzc2VzIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgU3dpZnRDbGFzcywgQG93bmVkIFN3aWZ0Q2xhc3MpIC0+ICgpCisgICVjID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10gJWYoJWEsICViKSA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIFN3aWZ0Q2xhc3MsIEBvd25lZCBTd2lmdENsYXNzKSAtPiAoKQorICAldXNlID0gZnVuY3Rpb25fcmVmIEB1c2VfY2xvc3VyZSA6ICRAY29udmVudGlvbih0aGluKSAoQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSkgLT4gKCkKKyAgYXBwbHkgJXVzZSglYykgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkpIC0+ICgpCisgIGRlYWxsb2Nfc3RhY2sgJWMgOiAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPigpCisgIHN0cm9uZ19yZWxlYXNlICVhIDogJFN3aWZ0Q2xhc3MKKyAgc3Ryb25nX3JlbGVhc2UgJWIgOiAkU3dpZnRDbGFzcworICAldCA9IHR1cGxlKCkKKyAgcmV0dXJuICV0IDogJCgpCit9CiAvLwogLy8gQ2hlY2sgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBnZW5lcmljIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RseSBzdWJzdGl0dXRlZAogLy8gaW4gdGhlIGZvcndhcmRlci4KQEAgLTU1Miw0ICs2MDIsMjcgQEAKICAgcmV0dXJuICU1IDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoQG93bmVkIEExLCBAZXJyb3IgRXJyb3IpCiB9CiAKK3NpbCBAY2FwdHVyZV9jbGFzcyA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgQTMpIC0+ICgpCisKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmV7ey4qfX0gc3dpZnRjYyBpOCogQHBhcnRpYWxfYXBwbHlfc3RhY2tfaW5fY29yb3V0aW5lKGk4KiB7ey4qfX0sICVUMTNwYXJ0aWFsX2FwcGx5MkEzQyopCisvLyBDSEVDSzogZW50cnk6CisvLyBDSEVDSzogICBbW0NMT1NVUkVfQ09OVEVYVDolLipdXSA9IGJpdGNhc3QgJVQxM3BhcnRpYWxfYXBwbHkyQTNDKiAlMSB0byAlc3dpZnQub3BhcXVlKgorLy8gQ0hFQ0s6ICAgW1tDT05URVhUOiUuKl1dID0gYml0Y2FzdCAlc3dpZnQub3BhcXVlKiBbW0NMT1NVUkVfQ09OVEVYVF1dIHRvICVzd2lmdC5yZWZjb3VudGVkKgorLy8gQ0hFQ0s6ICAgY2FsbCBzd2lmdGNjIHZvaWQgQCIkczEzY2FwdHVyZV9jbGFzc1RBIiglc3dpZnQucmVmY291bnRlZCogc3dpZnRzZWxmIFtbQ09OVEVYVF1dKQorc2lsIEBwYXJ0aWFsX2FwcGx5X3N0YWNrX2luX2Nvcm91dGluZSA6ICRAeWllbGRfb25jZSAoQG93bmVkIEEzKSAtPiAoKSB7CitlbnRyeSglMDogJEEzKToKKyAgJWYgPSBmdW5jdGlvbl9yZWYgQGNhcHR1cmVfY2xhc3MgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIEEzKSAtPiAoKQorICAlcCA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdICVmKCUwKSA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgQTMpIC0+ICgpCisgIGFwcGx5ICVwKCkgOiAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQorICBkZWFsbG9jX3N0YWNrICVwIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkKKyAgJTEwMDAgPSBpbnRlZ2VyX2xpdGVyYWwgJEJ1aWx0aW4uSW50MzIsIDEwMDAKKyAgeWllbGQgKCksIHJlc3VtZSByZXN1bWUsIHVud2luZCB1bndpbmQKKworcmVzdW1lOgorICAlcmV0ID0gdHVwbGUgKCkKKyAgcmV0dXJuICVyZXQgOiAkKCkKKwordW53aW5kOgorICB1bndpbmQKK30KIHNpbF92dGFibGUgQTMge30KZGlmZiAtLWdpdCBhL3Rlc3QvSVJHZW4vcGljLnN3aWZ0IGIvdGVzdC9JUkdlbi9waWMuc3dpZnQKaW5kZXggYjQ1OGI2Zi4uYTEwYjA2ZiAxMDA2NDQKLS0tIGEvdGVzdC9JUkdlbi9waWMuc3dpZnQKKysrIGIvdGVzdC9JUkdlbi9waWMuc3dpZnQKQEAgLTYwLDMgKzYwLDcgQEAKIC8vIGFhcmNoNjQ6ICAgICAgICBzdHIgW1tSRUcyXV0sIFtzcF0KIC8vIGFhcmNoNjQ6ICAgICAgICBibCBzd2lmdF9lbmRBY2Nlc3MKIC8vIGFhcmNoNjQ6ICAgICAgICBsZHIgeDAsIFtzcF0KKworLy8gcG93ZXJwYzY0bGUtTEFCRUw6IHt7Xz99fSRzNG1haW4xMHVzZV9nbG9iYWxTaXlGOgorLy8gcG93ZXJwYzY0bGU6ICAgICAgICBibCBzd2lmdF9iZWdpbkFjY2VzcworLy8gcG93ZXJwYzY0bGU6ICAgICAgIGFkZGkgMywgMywgKCRzNG1haW42Z2xvYmFsU2l2cClAdG9jQGwKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvU3RvcmUvb3V0cHV0LWZhaWx1cmUuc3dpZnQgYi90ZXN0L0luZGV4L1N0b3JlL291dHB1dC1mYWlsdXJlLnN3aWZ0CmluZGV4IDFjZmExNDYuLjI4NTQ0M2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW5kZXgvU3RvcmUvb3V0cHV0LWZhaWx1cmUuc3dpZnQKKysrIGIvdGVzdC9JbmRleC9TdG9yZS9vdXRwdXQtZmFpbHVyZS5zd2lmdApAQCAtMSwzICsxLDQgQEAKKy8vIFhGQUlMOiBDUFU9cG93ZXJwYzY0bGUKIC8vIFJVTjogJWVtcHR5LWRpcmVjdG9yeSgldCkKIC8vIFJVTjogbWtkaXIgJXQvaWR4CiAKZGlmZiAtLWdpdCBhL3Rlc3QvSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkay9zd2lmdC1tb2R1bGVzL0NvcmVHcmFwaGljcy5zd2lmdCBiL3Rlc3QvSW5wdXRzL2NsYW5nLWltcG9ydGVyLXNkay9zd2lmdC1tb2R1bGVzL0NvcmVHcmFwaGljcy5zd2lmdAppbmRleCBjNTdjZWQ2Li4yMjc0ZDFjIDEwMDY0NAotLS0gYS90ZXN0L0lucHV0cy9jbGFuZy1pbXBvcnRlci1zZGsvc3dpZnQtbW9kdWxlcy9Db3JlR3JhcGhpY3Muc3dpZnQKKysrIGIvdGVzdC9JbnB1dHMvY2xhbmctaW1wb3J0ZXItc2RrL3N3aWZ0LW1vZHVsZXMvQ29yZUdyYXBoaWNzLnN3aWZ0CkBAIC04LDcgKzgsNyBAQAogcHVibGljIHN0cnVjdCBDR0Zsb2F0IHsKICNpZiBhcmNoKGkzODYpIHx8IGFyY2goYXJtKQogICBwdWJsaWMgdHlwZWFsaWFzIFVuZGVybHlpbmdUeXBlID0gRmxvYXQKLSNlbHNlaWYgYXJjaCh4ODZfNjQpIHx8IGFyY2goYXJtNjQpCisjZWxzZWlmIGFyY2goeDg2XzY0KSB8fCBhcmNoKGFybTY0KSB8fCBhcmNoKHBvd2VycGM2NGxlKQogICBwdWJsaWMgdHlwZWFsaWFzIFVuZGVybHlpbmdUeXBlID0gRG91YmxlCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdGVzdC9JbnRlcnByZXRlci9nZW5lcmljX2Nhc3RzLnN3aWZ0IGIvdGVzdC9JbnRlcnByZXRlci9nZW5lcmljX2Nhc3RzLnN3aWZ0CmluZGV4IGJmODdmZWIuLmFlNjMxNTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW50ZXJwcmV0ZXIvZ2VuZXJpY19jYXN0cy5zd2lmdAorKysgYi90ZXN0L0ludGVycHJldGVyL2dlbmVyaWNfY2FzdHMuc3dpZnQKQEAgLTMsNiArMyw3IEBACiAvLyBSVU46ICV0YXJnZXQtY29kZXNpZ24gJXQvYS5vdXQub3B0aW1pemVkCiAvLyBSVU46ICV0YXJnZXQtcnVuICV0L2Eub3V0Lm9wdGltaXplZCB8ICVGaWxlQ2hlY2sgJXMKIC8vIFJFUVVJUkVTOiBleGVjdXRhYmxlX3Rlc3QKKy8vIFhGQUlMOiBDUFU9cG93ZXJwYzY0bGUKIAogLy8gRklYTUU6IHJkYXI6Ly9wcm9ibGVtLzE5NjQ4MTE3IE5lZWRzIHNwbGl0dGluZyBvYmpjIHBhcnRzIG91dAogCmRpZmYgLS1naXQgYS90ZXN0L01pc2Mvc3RhdHNfZGlyX3RyYWNlci5zd2lmdCBiL3Rlc3QvTWlzYy9zdGF0c19kaXJfdHJhY2VyLnN3aWZ0CmluZGV4IDEyNzk1ZDguLjkwYmU2MzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvTWlzYy9zdGF0c19kaXJfdHJhY2VyLnN3aWZ0CisrKyBiL3Rlc3QvTWlzYy9zdGF0c19kaXJfdHJhY2VyLnN3aWZ0CkBAIC0yLDkgKzIsOSBAQAogLy8gUlVOOiAldGFyZ2V0LXN3aWZ0Y19kcml2ZXIgLW8gJXQvbWFpbiAtbW9kdWxlLW5hbWUgbWFpbiAtc3RhdHMtb3V0cHV0LWRpciAldCAlcyAtdHJhY2Utc3RhdHMtZXZlbnRzCiAvLyBSVU46ICVGaWxlQ2hlY2sgLWlucHV0LWZpbGUgJXQvKi5jc3YgJXMKIAotLy8gQ0hFQ0s6IHt7WzAtOV0rLFswLTldKywiZXhpdCIsInR5cGVjaGVjay1leHByIiwiU2VtYS5OdW1UeXBlc0Rlc2VyaWFsaXplZCIsWzAtOV0rLFswLTldKywiQ2FsbCIsIlxbLipzdGF0c19kaXJfdHJhY2VyLnN3aWZ0LipcXSJ9fQotLy8gQ0hFQ0s6IHt7WzAtOV0rLFswLTldKywiZXhpdCIsInR5cGVjaGVjay1leHByIiwiU2VtYS5OdW1Db25zdHJhaW50U2NvcGVzIixbMC05XSssWzAtOV0rLCJTZXF1ZW5jZSIsIlxbLipzdGF0c19kaXJfdHJhY2VyLnN3aWZ0LipcXSJ9fQotLy8gQ0hFQ0s6IHt7WzAtOV0rLFswLTldKywiZXhpdCIsIlN1cGVyY2xhc3NEZWNsUmVxdWVzdCIsIlNlbWEuU3VwZXJjbGFzc0RlY2xSZXF1ZXN0IixbMC05XSssWzAtOV0rLCJCYXIiLCJcWy4qc3RhdHNfZGlyX3RyYWNlci5zd2lmdC4qXF0ifX0KKy8vIENIRUNLLURBRzoge3tbMC05XSssWzAtOV0rLCJleGl0IiwidHlwZWNoZWNrLWV4cHIiLCJTZW1hLk51bVR5cGVzRGVzZXJpYWxpemVkIixbMC05XSssWzAtOV0rLCJDYWxsIiwiXFsuKnN0YXRzX2Rpcl90cmFjZXIuc3dpZnQuKlxdIn19CisvLyBDSEVDSy1EQUc6IHt7WzAtOV0rLFswLTldKywiZXhpdCIsInR5cGVjaGVjay1leHByIiwiU2VtYS5OdW1Db25zdHJhaW50U2NvcGVzIixbMC05XSssWzAtOV0rLCJTZXF1ZW5jZSIsIlxbLipzdGF0c19kaXJfdHJhY2VyLnN3aWZ0LipcXSJ9fQorLy8gQ0hFQ0stREFHOiB7e1swLTldKyxbMC05XSssImV4aXQiLCJTdXBlcmNsYXNzRGVjbFJlcXVlc3QiLCJTZW1hLlN1cGVyY2xhc3NEZWNsUmVxdWVzdCIsWzAtOV0rLFswLTldKywiQmFyIiwiXFsuKnN0YXRzX2Rpcl90cmFjZXIuc3dpZnQuKlxdIn19CiAKIHB1YmxpYyBmdW5jIGZvbygpIHsKICAgICBwcmludCgiaGVsbG8iKQpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZWFibGVJbnRlcmZhY2UvTW9kdWxlQ2FjaGUvZm9yY2UtbW9kdWxlLWxvYWRpbmctbW9kZS1hcmNocy5zd2lmdCBiL3Rlc3QvUGFyc2VhYmxlSW50ZXJmYWNlL01vZHVsZUNhY2hlL2ZvcmNlLW1vZHVsZS1sb2FkaW5nLW1vZGUtYXJjaHMuc3dpZnQKaW5kZXggMTk1YjRjMS4uYTc2NGJhZiAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZWFibGVJbnRlcmZhY2UvTW9kdWxlQ2FjaGUvZm9yY2UtbW9kdWxlLWxvYWRpbmctbW9kZS1hcmNocy5zd2lmdAorKysgYi90ZXN0L1BhcnNlYWJsZUludGVyZmFjZS9Nb2R1bGVDYWNoZS9mb3JjZS1tb2R1bGUtbG9hZGluZy1tb2RlLWFyY2hzLnN3aWZ0CkBAIC0xLDQgKzEsNSBAQAogLy8gUlVOOiAlZW1wdHktZGlyZWN0b3J5KCV0KQorLy8gWEZBSUw6IENQVT1wb3dlcnBjNjRsZQogCiAvLyAxLiBOb3QgZmluZGluZyB0aGluZ3MgaXMgb2theS4KIC8vIFJVTjogbm90IGVudiBTV0lGVF9GT1JDRV9NT0RVTEVfTE9BRElORz1wcmVmZXItcGFyc2VhYmxlICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQgLXR5cGVjaGVjayAtcGFyc2Utc3RkbGliIC1tb2R1bGUtY2FjaGUtcGF0aCAldC9NQ1AgJXMgMj4mMSB8ICVGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1OTy1TVUNILU1PRFVMRSAlcwpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZWFibGVJbnRlcmZhY2UvTW9kdWxlQ2FjaGUvZm9yY2UtbW9kdWxlLWxvYWRpbmctbW9kZS1mcmFtZXdvcmsuc3dpZnQgYi90ZXN0L1BhcnNlYWJsZUludGVyZmFjZS9Nb2R1bGVDYWNoZS9mb3JjZS1tb2R1bGUtbG9hZGluZy1tb2RlLWZyYW1ld29yay5zd2lmdAppbmRleCBiMWYwZDVjLi5iMmY3MDViIDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlYWJsZUludGVyZmFjZS9Nb2R1bGVDYWNoZS9mb3JjZS1tb2R1bGUtbG9hZGluZy1tb2RlLWZyYW1ld29yay5zd2lmdAorKysgYi90ZXN0L1BhcnNlYWJsZUludGVyZmFjZS9Nb2R1bGVDYWNoZS9mb3JjZS1tb2R1bGUtbG9hZGluZy1tb2RlLWZyYW1ld29yay5zd2lmdApAQCAtMSw0ICsxLDUgQEAKIC8vIFJVTjogJWVtcHR5LWRpcmVjdG9yeSgldCkKKy8vIFhGQUlMOiBDUFU9cG93ZXJwYzY0bGUKIAogLy8gMS4gTm90IGZpbmRpbmcgdGhpbmdzIGlzIG9rYXkuCiAvLyBSVU46IG5vdCBlbnYgU1dJRlRfRk9SQ0VfTU9EVUxFX0xPQURJTkc9cHJlZmVyLXBhcnNlYWJsZSAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kIC10eXBlY2hlY2sgLXBhcnNlLXN0ZGxpYiAtbW9kdWxlLWNhY2hlLXBhdGggJXQvTUNQICVzIDI+JjEgfCAlRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Tk8tU1VDSC1NT0RVTEUgJXMKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VhYmxlSW50ZXJmYWNlL01vZHVsZUNhY2hlL2ZvcmNlLW1vZHVsZS1sb2FkaW5nLW1vZGUuc3dpZnQgYi90ZXN0L1BhcnNlYWJsZUludGVyZmFjZS9Nb2R1bGVDYWNoZS9mb3JjZS1tb2R1bGUtbG9hZGluZy1tb2RlLnN3aWZ0CmluZGV4IDJmOTM0YmMuLjdkNjExZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VhYmxlSW50ZXJmYWNlL01vZHVsZUNhY2hlL2ZvcmNlLW1vZHVsZS1sb2FkaW5nLW1vZGUuc3dpZnQKKysrIGIvdGVzdC9QYXJzZWFibGVJbnRlcmZhY2UvTW9kdWxlQ2FjaGUvZm9yY2UtbW9kdWxlLWxvYWRpbmctbW9kZS5zd2lmdApAQCAtMSw0ICsxLDUgQEAKIC8vIFJVTjogJWVtcHR5LWRpcmVjdG9yeSgldCkKKy8vIFhGQUlMOiBDUFU9cG93ZXJwYzY0bGUKIAogLy8gMS4gTm90IGZpbmRpbmcgdGhpbmdzIGlzIG9rYXkuCiAvLyBSVU46IG5vdCBlbnYgU1dJRlRfRk9SQ0VfTU9EVUxFX0xPQURJTkc9cHJlZmVyLXBhcnNlYWJsZSAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kIC10eXBlY2hlY2sgLXBhcnNlLXN0ZGxpYiAtbW9kdWxlLWNhY2hlLXBhdGggJXQvTUNQICVzIDI+JjEgfCAlRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Tk8tU1VDSC1NT0RVTEUgJXMKZGlmZiAtLWdpdCBhL3Rlc3QvUnVudGltZS9saW51eC1mYXRhbC1iYWNrdHJhY2Uuc3dpZnQgYi90ZXN0L1J1bnRpbWUvbGludXgtZmF0YWwtYmFja3RyYWNlLnN3aWZ0CmluZGV4IDZkZjVlYzMuLjQwYjZhYmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvUnVudGltZS9saW51eC1mYXRhbC1iYWNrdHJhY2Uuc3dpZnQKKysrIGIvdGVzdC9SdW50aW1lL2xpbnV4LWZhdGFsLWJhY2t0cmFjZS5zd2lmdApAQCAtNCw2ICs0LDcgQEAKIC8vIFJFUVVJUkVTOiBleGVjdXRhYmxlX3Rlc3QKIC8vIFJFUVVJUkVTOiBPUz1saW51eC1nbnUKIC8vIFJFUVVJUkVTOiBsbGRiCisvLyBYRkFJTDogQ1BVPXBvd2VycGM2NGxlCiAKIC8vIEJhY2t0cmFjZXMgYXJlIG5vdCBlbWl0dGVkIHdoZW4gb3B0aW1pemF0aW9ucyBhcmUgZW5hYmxlZC4gVGhpcyB0ZXN0IGNhbiBub3QKIC8vIHJ1biB3aGVuIG9wdGltaXphdGlvbnMgYXJlIGVuYWJsZWQuCmRpZmYgLS1naXQgYS90ZXN0L1NJTC9TZXJpYWxpemF0aW9uL29wYXF1ZV92YWx1ZXNfc2VyaWFsaXplLnNpbCBiL3Rlc3QvU0lML1NlcmlhbGl6YXRpb24vb3BhcXVlX3ZhbHVlc19zZXJpYWxpemUuc2lsCmluZGV4IGE2MzQzNjguLjQzOTllZmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU0lML1NlcmlhbGl6YXRpb24vb3BhcXVlX3ZhbHVlc19zZXJpYWxpemUuc2lsCisrKyBiL3Rlc3QvU0lML1NlcmlhbGl6YXRpb24vb3BhcXVlX3ZhbHVlc19zZXJpYWxpemUuc2lsCkBAIC0xLDMgKzEsNCBAQAorLy8gWEZBSUw6IENQVT1wb3dlcnBjNjRsZQogLy8gRmlyc3QgcGFyc2UgdGhpcyBhbmQgdGhlbiBlbWl0IGEgKi5zaWIuIFRoZW4gcmVhZCBpbiB0aGUgKi5zaWIsIHRoZW4gcmVjcmVhdGUKIC8vIFJVTjogJWVtcHR5LWRpcmVjdG9yeSgldCkKIC8vIEZJWE1FOiA8cmRhcjovL3Byb2JsZW0vMjkyODEzNjQ+IHNpbC1vcHQgLXZlcmlmeSBpcyBicm9rZW4KZGlmZiAtLWdpdCBhL3Rlc3QvU0lMR2VuL2VudW0uc3dpZnQgYi90ZXN0L1NJTEdlbi9lbnVtLnN3aWZ0CmluZGV4IDA0YjBkY2YuLmI0NGUwMDUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU0lMR2VuL2VudW0uc3dpZnQKKysrIGIvdGVzdC9TSUxHZW4vZW51bS5zd2lmdApAQCAtMSwxOSArMSwxMiBAQAogCi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtZW1pdC1zaWxnZW4gLXBhcnNlLXN0ZGxpYiAtcGFyc2UtYXMtbGlicmFyeSAtbW9kdWxlLW5hbWUgU3dpZnQgJXMgfCAlRmlsZUNoZWNrICVzCi0KLXByZWNlZGVuY2Vncm91cCBBc3NpZ25tZW50UHJlY2VkZW5jZSB7IGFzc2lnbm1lbnQ6IHRydWUgfQotCi1lbnVtIE9wdGlvbmFsPFdyYXBwZWQ+IHsKLSAgY2FzZSBub25lCi0gIGNhc2Ugc29tZShXcmFwcGVkKQotfQorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWVtaXQtc2lsZ2VuIC1wYXJzZS1hcy1saWJyYXJ5ICVzIHwgJUZpbGVDaGVjayAlcwogCiBlbnVtIEJvb2xpc2ggewogICBjYXNlIGZhbHN5CiAgIGNhc2UgdHJ1dGh5CiB9CiAKLS8vIENIRUNLLUxBQkVMOiBzaWwgaGlkZGVuIFtvc3NhXSBAJHNzMTNCb29saXNoX2Nhc2VzeXlGCisvLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBbb3NzYV0gQCRzNGVudW0xM0Jvb2xpc2hfY2FzZXN5eUYKIGZ1bmMgQm9vbGlzaF9jYXNlcygpIHsKICAgLy8gQ0hFQ0s6ICAgICAgIFtbQk9PTElTSDolWzAtOV0rXV0gPSBtZXRhdHlwZSAkQHRoaW4gQm9vbGlzaC5UeXBlCiAgIC8vIENIRUNLLU5FWFQ6ICBbW0ZBTFNZOiVbMC05XStdXSA9IGVudW0gJEJvb2xpc2gsICNCb29saXNoLmZhbHN5IWVudW1lbHQKQEAgLTI0LDE4ICsxNywxNiBAQAogICBfID0gQm9vbGlzaC50cnV0aHkKIH0KIAotc3RydWN0IEludCB7fQotCiBlbnVtIE9wdGlvbmFibGUgewogICBjYXNlIG5vdWdodAogICBjYXNlIG1lcmUoSW50KQogfQogCi0vLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBbb3NzYV0gQCRzczE2T3B0aW9uYWJsZV9jYXNlc3l5U2lGCisvLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBbb3NzYV0gQCRzNGVudW0xNk9wdGlvbmFibGVfY2FzZXN5eVNpRgogZnVuYyBPcHRpb25hYmxlX2Nhc2VzKF8geDogSW50KSB7CiAKICAgLy8gQ0hFQ0s6ICAgICAgIFtbTUVUQVRZUEU6JS4qXV0gPSBtZXRhdHlwZSAkQHRoaW4gT3B0aW9uYWJsZS5UeXBlCi0gIC8vIENIRUNLOiAgICAgICBbW0ZOOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkc3MxME9wdGlvbmFibGVPNG1lcmV5QUJTaWNBQm1GCisgIC8vIENIRUNLOiAgICAgICBbW0ZOOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkczRlbnVtMTBPcHRpb25hYmxlTzRtZXJleUFDU2ljQUNtRlRjCiAgIC8vIENIRUNLLU5FWFQ6ICBbW0NUT1I6JS4qXV0gPSBhcHBseSBbW0ZOXV0oW1tNRVRBVFlQRV1dKQogICAvLyBDSEVDSy1ORVhUOiAgZGVzdHJveV92YWx1ZSBbW0NUT1JdXQogICBfID0gT3B0aW9uYWJsZS5tZXJlCkBAIC00NSwxMyArMzYsMTMgQEAKICAgXyA9IE9wdGlvbmFibGUubWVyZSh4KQogfQogCi0vLyBDSEVDSy1MQUJFTDogc2lsIHNoYXJlZCBbdHJhbnNwYXJlbnRdIFt0aHVua10gW29zc2FdIEAkc3MxME9wdGlvbmFibGVPNG1lcmV5QUJTaWNBQm1GCi0vLyBDSEVDSzogICAgICAgIFtbRk46JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzczEwT3B0aW9uYWJsZU80bWVyZXlBQlNpY0FCbUYKKy8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW3RodW5rXSBbb3NzYV0gQCRzNGVudW0xME9wdGlvbmFibGVPNG1lcmV5QUNTaWNBQ21GCisvLyBDSEVDSzogICAgICAgIFtbRk46JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzNGVudW0xME9wdGlvbmFibGVPNG1lcmV5QUNTaWNBQ21GCiAvLyBDSEVDSy1ORVhUOiAgIFtbTUVUSE9EOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtbRk5dXSglMCkKIC8vIENIRUNLLU5FWFQ6ICAgcmV0dXJuIFtbTUVUSE9EXV0KIC8vIENIRUNLLU5FWFQ6IH0KIAotLy8gQ0hFQ0stTEFCRUw6IHNpbCBzaGFyZWQgW3RyYW5zcGFyZW50XSBbb3NzYV0gQCRzczEwT3B0aW9uYWJsZU80bWVyZXlBQlNpY0FCbUYKKy8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW29zc2FdIEAkczRlbnVtMTBPcHRpb25hYmxlTzRtZXJleUFDU2ljQUNtRgogLy8gQ0hFQ0s6ICAgICAgICBbW1JFUzolLipdXSA9IGVudW0gJE9wdGlvbmFibGUsICNPcHRpb25hYmxlLm1lcmUhZW51bWVsdC4xLCAlMCA6ICRJbnQKIC8vIENIRUNLLU5FWFQ6ICAgcmV0dXJuIFtbUkVTXV0gOiAkT3B0aW9uYWJsZQogLy8gQ0hFQ0stTkVYVDogfQpAQCAtNjUsMTEgKzU2LDExIEBACiAgIGNhc2UgcGhhbnRvbShTKQogfQogCi0vLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBbb3NzYV0gQCRzczE3QWRkcmVzc09ubHlfY2FzZXN5eXMxU1ZGCisvLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBbb3NzYV0gQCRzNGVudW0xN0FkZHJlc3NPbmx5X2Nhc2VzeXlBQTFTVkYKIGZ1bmMgQWRkcmVzc09ubHlfY2FzZXMoXyBzOiBTKSB7CiAKICAgLy8gQ0hFQ0s6ICAgICAgIFtbTUVUQVRZUEU6JS4qXV0gPSBtZXRhdHlwZSAkQHRoaW4gQWRkcmVzc09ubHkuVHlwZQotICAvLyBDSEVDSzogICAgICAgW1tGTjolLipdXSA9IGZ1bmN0aW9uX3JlZiBAJHNzMTFBZGRyZXNzT25seU80bWVyZXlBQnMxUF9wY0FCbUYKKyAgLy8gQ0hFQ0s6ICAgICAgIFtbRk46JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzNGVudW0xMUFkZHJlc3NPbmx5TzRtZXJleUFjQTFQX3BjQUNtRlRjCiAgIC8vIENIRUNLLU5FWFQ6ICBbW0NUT1I6JS4qXV0gPSBhcHBseSBbW0ZOXV0oW1tNRVRBVFlQRV1dKQogICAvLyBDSEVDSy1ORVhUOiAgZGVzdHJveV92YWx1ZSBbW0NUT1JdXQogICBfID0gQWRkcmVzc09ubHkubWVyZQpAQCAtMTA1LDI5ICs5NiwyOSBAQAogICAvLyBDSEVDSzogICAgICAgcmV0dXJuCiB9CiAKLS8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW3RodW5rXSBbb3NzYV0gQCRzczExQWRkcmVzc09ubHlPNG1lcmV5QUJzMVBfcGNBQm1GCi0vLyBDSEVDSzogICAgICAgW1tGTjolLipdXSA9IGZ1bmN0aW9uX3JlZiBAJHNzMTFBZGRyZXNzT25seU80bWVyZXlBQnMxUF9wY0FCbUYKKy8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW3RodW5rXSBbb3NzYV0gQCRzNGVudW0xMUFkZHJlc3NPbmx5TzRtZXJleUFjQTFQX3BjQUNtRlRjCisvLyBDSEVDSzogICAgICAgW1tGTjolLipdXSA9IGZ1bmN0aW9uX3JlZiBAJHM0ZW51bTExQWRkcmVzc09ubHlPNG1lcmV5QWNBMVBfcGNBQ21GCiAvLyBDSEVDSy1ORVhUOiAgW1tNRVRIT0Q6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW1tGTl1dKCUwKQogLy8gQ0hFQ0stTkVYVDogIC8vIGZ1bmN0aW9uX3JlZgotLy8gQ0hFQ0stTkVYVDogIFtbQ0FOT05JQ0FMX1RIVU5LX0ZOOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkc3MxUF9wczExQWRkcmVzc09ubHlPSWVnaXJfc0FBX3BBQ0llZ25yX1RSIDogJEBjb252ZW50aW9uKHRoaW4pIChAaW5fZ3VhcmFudGVlZCBQLCBAZ3VhcmFudGVlZCBAY2FsbGVlX2d1YXJhbnRlZWQgKEBpbiBQKSAtPiBAb3V0IEFkZHJlc3NPbmx5KSAtPiBAb3V0IEFkZHJlc3NPbmx5CisvLyBDSEVDSy1ORVhUOiAgW1tDQU5PTklDQUxfVEhVTktfRk46JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzNGVudW0xUF9wQUExMUFkZHJlc3NPbmx5T0llZ2lyX0FhQl9wQURJZWducl9UUiA6ICRAY29udmVudGlvbih0aGluKSAoQGluX2d1YXJhbnRlZWQgUCwgQGd1YXJhbnRlZWQgQGNhbGxlZV9ndWFyYW50ZWVkIChAaW4gUCkgLT4gQG91dCBBZGRyZXNzT25seSkgLT4gQG91dCBBZGRyZXNzT25seQogLy8gQ0hFQ0stTkVYVDogIFtbQ0FOT05JQ0FMX1RIVU5LOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtbQ0FOT05JQ0FMX1RIVU5LX0ZOXV0oW1tNRVRIT0RdXSkKIC8vIENIRUNLLU5FWFQ6ICByZXR1cm4gW1tDQU5PTklDQUxfVEhVTktdXSA6ICRAY2FsbGVlX2d1YXJhbnRlZWQgKEBpbl9ndWFyYW50ZWVkIFApIC0+IEBvdXQgQWRkcmVzc09ubHkKIC8vIENIRUNLLU5FWFQ6IH0KIAotLy8gQ0hFQ0stTEFCRUw6IHNpbCBzaGFyZWQgW3RyYW5zcGFyZW50XSBbb3NzYV0gQCRzczExQWRkcmVzc09ubHlPNG1lcmV5QUJzMVBfcGNBQm1GIDogJEBjb252ZW50aW9uCisvLyBDSEVDSy1MQUJFTDogc2lsIHNoYXJlZCBbdHJhbnNwYXJlbnRdIFtvc3NhXSBAJHM0ZW51bTExQWRkcmVzc09ubHlPNG1lcmV5QWNBMVBfcGNBQ21GIDogJEBjb252ZW50aW9uCiAvLyBDSEVDSzogYmIwKFtbQVJHMDolLipdXSA6ICQqQWRkcmVzc09ubHksIFtbQVJHMTolLipdXSA6ICQqUCwgW1tBUkcyOiUuKl1dIDogJEB0aGluIEFkZHJlc3NPbmx5LlR5cGUpOgogLy8gQ0hFQ0s6ICAgICAgICBbW1JFVF9EQVRBOiUuKl1dID0gaW5pdF9lbnVtX2RhdGFfYWRkciBbW0FSRzBdXSA6ICQqQWRkcmVzc09ubHksICNBZGRyZXNzT25seS5tZXJlIWVudW1lbHQuMQogLy8gQ0hFQ0stTkVYVDogICBjb3B5X2FkZHIgW3Rha2VdIFtbQVJHMV1dIHRvIFtpbml0aWFsaXphdGlvbl0gW1tSRVRfREFUQV1dIDogJCpQCiAvLyBDSEVDSy1ORVhUOiAgIGluamVjdF9lbnVtX2FkZHIgW1tBUkcwXV0gOiAkKkFkZHJlc3NPbmx5LCAjQWRkcmVzc09ubHkubWVyZSFlbnVtZWx0LjEKIC8vIENIRUNLOiAgICAgICAgcmV0dXJuCi0vLyBDSEVDSy1ORVhUOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzczExQWRkcmVzc09ubHlPNG1lcmV5QUJzMVBfcGNBQm1GJworLy8gQ0hFQ0stTkVYVDogfSAvLyBlbmQgc2lsIGZ1bmN0aW9uICckczRlbnVtMTFBZGRyZXNzT25seU80bWVyZXlBY0ExUF9wY0FDbUYnCiAKIGVudW0gUG9seU9wdGlvbmFibGU8VD4gewogICBjYXNlIG5vdWdodAogICBjYXNlIG1lcmUoVCkKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHNpbCBoaWRkZW4gW29zc2FdIEAkc3MyMFBvbHlPcHRpb25hYmxlX2Nhc2VzeXl4bEYKKy8vIENIRUNLLUxBQkVMOiBzaWwgaGlkZGVuIFtvc3NhXSBAJHM0ZW51bTIwUG9seU9wdGlvbmFibGVfY2FzZXN5eXhsRgogZnVuYyBQb2x5T3B0aW9uYWJsZV9jYXNlczxUPihfIHQ6IFQpIHsKIAogLy8gQ0hFQ0s6ICAgICAgICAgW1tNRVRBVFlQRTolLipdXSA9IG1ldGF0eXBlICRAdGhpbiBQb2x5T3B0aW9uYWJsZTxUPi5UeXBlCkBAIC0xNTQsNyArMTQ1LDcgQEAKIAogLy8gVGhlIHN1YnN0aXR1dGVkIHR5cGUgaXMgbG9hZGFibGUgYW5kIHRyaXZpYWwgaGVyZQogCi0vLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBbb3NzYV0gQCRzczMyUG9seU9wdGlvbmFibGVfc3BlY2lhbGl6ZWRfY2FzZXN5eVNpRgorLy8gQ0hFQ0stTEFCRUw6IHNpbCBoaWRkZW4gW29zc2FdIEAkczRlbnVtMzJQb2x5T3B0aW9uYWJsZV9zcGVjaWFsaXplZF9jYXNlc3l5U2lGCiBmdW5jIFBvbHlPcHRpb25hYmxlX3NwZWNpYWxpemVkX2Nhc2VzKF8gdDogSW50KSB7CiAKIC8vIENIRUNLOiAgICAgICAgIFtbTUVUQVRZUEU6JS4qXV0gPSBtZXRhdHlwZSAkQHRoaW4gUG9seU9wdGlvbmFibGU8SW50Pi5UeXBlCkBAIC0xNzIsMjMgKzE2MywyMyBAQAogCiAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGEgYnVnIHdoZXJlIHRlbXBvcmFyeSBhbGxvY2F0aW9ucyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mCiAvLyB0dXBsZSBpbXBsb3Npb24gd2VyZSBub3QgZGVhbGxvY2F0ZWQgaW4gZW51bSBjb25zdHJ1Y3RvcnMuCi1zdHJ1Y3QgU3RyaW5nIHsgdmFyIHB0cjogQnVpbHRpbi5OYXRpdmVPYmplY3QgfQorc3RydWN0IFN0cmluZyB7IHZhciBwdHI6IEFueU9iamVjdCB9CiAKIGVudW0gRm9vIHsgY2FzZSBhKFAsIFN0cmluZykgfQogCiAvLyBDdXJyeSBUaHVuayBmb3IgRm9vLmEoXzopCiAvLwotLy8gQ0hFQ0stTEFCRUw6IHNpbCBzaGFyZWQgW3RyYW5zcGFyZW50XSBbdGh1bmtdIFtvc3NhXSBAJHNzM0Zvb08xYXlBQnMxUF9wX1NTdGNBQm1GCi0vLyBDSEVDSzogICAgICAgICBbW0ZOOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkc3MzRm9vTzFheUFCczFQX3BfU1N0Y0FCbUYKKy8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW3RodW5rXSBbb3NzYV0gQCRzNGVudW0zRm9vTzFheUFjQTFQX3BfQUE2U3RyaW5nVnRjQUNtRlRjCisvLyBDSEVDSzogICAgICAgICBbW0ZOOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkczRlbnVtM0Zvb08xYXlBY0ExUF9wX0FBNlN0cmluZ1Z0Y0FDbUYKIC8vIENIRUNLLU5FWFQ6ICAgIFtbTUVUSE9EOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtbRk5dXSglMCkKIC8vIENIRUNLLU5FWFQ6ICAgIC8vIGZ1bmN0aW9uX3JlZgotLy8gQ0hFQ0stTkVYVDogICAgW1tDQU5PTklDQUxfVEhVTktfRk46JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzczFQX3BTU3MzRm9vT0llZ2l4cl9zQUFfcFNTQUNJZWduZ3JfVFIgOiAkQGNvbnZlbnRpb24odGhpbikgKEBpbl9ndWFyYW50ZWVkIFAsIEBndWFyYW50ZWVkIFN0cmluZywgQGd1YXJhbnRlZWQgQGNhbGxlZV9ndWFyYW50ZWVkIChAaW4gUCwgQG93bmVkIFN0cmluZykgLT4gQG91dCBGb28pIC0+IEBvdXQgRm9vCisvLyBDSEVDSy1ORVhUOiAgICBbW0NBTk9OSUNBTF9USFVOS19GTjolLipdXSA9IGZ1bmN0aW9uX3JlZiBAJHM0ZW51bTFQX3BBQTZTdHJpbmdWQUEzRm9vT0llZ2l4cl9BYUJfcEFkRkllZ25ncl9UUiA6ICRAY29udmVudGlvbih0aGluKSAoQGluX2d1YXJhbnRlZWQgUCwgQGd1YXJhbnRlZWQgU3RyaW5nLCBAZ3VhcmFudGVlZCBAY2FsbGVlX2d1YXJhbnRlZWQgKEBpbiBQLCBAb3duZWQgU3RyaW5nKSAtPiBAb3V0IEZvbykgLT4gQG91dCBGb28KIC8vIENIRUNLLU5FWFQ6ICAgIFtbQ0FOT05JQ0FMX1RIVU5LOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtbQ0FOT05JQ0FMX1RIVU5LX0ZOXV0oW1tNRVRIT0RdXSkKIC8vIENIRUNLLU5FWFQ6ICAgIHJldHVybiBbW0NBTk9OSUNBTF9USFVOS11dCiAvLyBDSEVDSy1ORVhUOiAgfQogCiAvLyBGb28uYShfOikKLS8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW29zc2FdIEAkc3MzRm9vTzFheUFCczFQX3BfU1N0Y0FCbUYKKy8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW29zc2FdIEAkczRlbnVtM0Zvb08xYXlBY0ExUF9wX0FBNlN0cmluZ1Z0Y0FDbUYKIC8vIENIRUNLOiBiYjAoW1tBUkcwOiUuKl1dIDogJCpGb28sIFtbQVJHMTolLipdXSA6ICQqUCwgW1tBUkcyOiUuKl1dIDogQG93bmVkICRTdHJpbmcsIFtbQVJHMzolLipdXSA6ICRAdGhpbiBGb28uVHlwZSk6CiAvLyBDSEVDSzogICAgICAgICBbW1BBWUxPQUQ6JS4qXV0gPSBpbml0X2VudW1fZGF0YV9hZGRyIFtbQVJHMF1dIDogJCpGb28sICNGb28uYSFlbnVtZWx0LjEKIC8vIENIRUNLLU5FWFQ6ICAgIFtbTEVGVDolLipdXSA9IHR1cGxlX2VsZW1lbnRfYWRkciBbW1BBWUxPQURdXSA6ICQqKFAsIFN0cmluZyksIDAKQEAgLTE5Nyw3ICsxODgsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgc3RvcmUgW1tBUkcyXV0gdG8gW2luaXRdIFtbUklHSFRdXQogLy8gQ0hFQ0stTkVYVDogICAgaW5qZWN0X2VudW1fYWRkciBbW0FSRzBdXSA6ICQqRm9vLCAjRm9vLmEhZW51bWVsdC4xCiAvLyBDSEVDSzogICAgICAgICByZXR1cm4KLS8vIENIRUNLLU5FWFQ6ICB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzczNGb29PMWF5QUJzMVBfcF9TU3RjQUJtRicKKy8vIENIRUNLLU5FWFQ6ICB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzNGVudW0zRm9vTzFheUFjQTFQX3BfQUE2U3RyaW5nVnRjQUNtRicKIAogZnVuYyBGb29fY2FzZXMoKSB7CiAgIF8gPSBGb28uYQpAQCAtMjEzLDMgKzIwNCwzMyBAQAogZnVuYyBtYWtlSW5kaXJlY3RFbnVtPFQ+KF8gcGF5bG9hZDogVCkgLT4gSW5kaXJlY3Q8VD4gewogICByZXR1cm4gSW5kaXJlY3QucGF5bG9hZCgocGF5bG9hZCwgb3RoZXI6IHBheWxvYWQpKQogfQorCisvLyBodHRwczovL2J1Z3Muc3dpZnQub3JnL2Jyb3dzZS9TUi05Njc1CisKK2VudW0gVHJhaWxpbmdDbG9zdXJlQ29uY3JldGUgeworICBjYXNlIGxhYmVsKGZuOiAoKSAtPiBJbnQpCisgIGNhc2Ugbm9MYWJlbCgoKSAtPiBJbnQpCisgIGNhc2UgdHdvRWxlbWVudHNMYWJlbCh4OiBJbnQsIGZuOiAoKSAtPiBJbnQpCisgIGNhc2UgdHdvRWxlbWVudHNOb0xhYmVsKF8geDogSW50LCBfIGZuOiAoKSAtPiBJbnQpCit9CisKK2Z1bmMgdXNlVHJhaWxpbmdDbG9zdXJlQ29uY3JldGUoKSB7CisgIF8gPSBUcmFpbGluZ0Nsb3N1cmVDb25jcmV0ZS5sYWJlbCB7IDAgfQorICBfID0gVHJhaWxpbmdDbG9zdXJlQ29uY3JldGUubm9MYWJlbCB7IDAgfQorICBfID0gVHJhaWxpbmdDbG9zdXJlQ29uY3JldGUudHdvRWxlbWVudHNMYWJlbCh4OiAwKSB7IDAgfQorICBfID0gVHJhaWxpbmdDbG9zdXJlQ29uY3JldGUudHdvRWxlbWVudHNOb0xhYmVsKDApIHsgMCB9Cit9CisKK2VudW0gVHJhaWxpbmdDbG9zdXJlR2VuZXJpYzxUPiB7CisgIGNhc2UgbGFiZWwoZm46ICgpIC0+IFQpCisgIGNhc2Ugbm9MYWJlbCgoKSAtPiBUKQorICBjYXNlIHR3b0VsZW1lbnRzTGFiZWwoeDogVCwgZm46ICgpIC0+IFQpCisgIGNhc2UgdHdvRWxlbWVudHNOb0xhYmVsKF8geDogVCwgXyBmbjogKCkgLT4gVCkKK30KKworZnVuYyB1c2VUcmFpbGluZ0Nsb3N1cmVHZW5lcmljPFQ+KHQ6IFQpIHsKKyAgXyA9IFRyYWlsaW5nQ2xvc3VyZUdlbmVyaWM8VD4ubGFiZWwgeyB0IH0KKyAgXyA9IFRyYWlsaW5nQ2xvc3VyZUdlbmVyaWM8VD4ubm9MYWJlbCB7IHQgfQorICBfID0gVHJhaWxpbmdDbG9zdXJlR2VuZXJpYzxUPi50d29FbGVtZW50c0xhYmVsKHg6IHQpIHsgdCB9CisgIF8gPSBUcmFpbGluZ0Nsb3N1cmVHZW5lcmljPFQ+LnR3b0VsZW1lbnRzTm9MYWJlbCh0KSB7IHQgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvU0lMR2VuL2d1YXJhbnRlZWRfbm9ybWFsX2FyZ3NfY3VycnlfdGh1bmtzLnN3aWZ0IGIvdGVzdC9TSUxHZW4vZ3VhcmFudGVlZF9ub3JtYWxfYXJnc19jdXJyeV90aHVua3Muc3dpZnQKaW5kZXggNTA4ZmNkMC4uOTA5NDJmNSAxMDA2NDQKLS0tIGEvdGVzdC9TSUxHZW4vZ3VhcmFudGVlZF9ub3JtYWxfYXJnc19jdXJyeV90aHVua3Muc3dpZnQKKysrIGIvdGVzdC9TSUxHZW4vZ3VhcmFudGVlZF9ub3JtYWxfYXJnc19jdXJyeV90aHVua3Muc3dpZnQKQEAgLTExOSw5ICsxMTksOSBAQAogLy8gQ0hFQ0s6ICAgcmV0dXJuIFtbVEhVTktfUEFdXQogLy8gQ0hFQ0s6IH0gLy8gZW5kIHNpbCBmdW5jdGlvbiAnJHNzMDE3TG9hZGFibGVDbGFzc0luaXRBMEN5QUJzNUtsYXNzQ2NmQ1RjVGQnCiAKLS8vIENhbm9uaWNhbCBUaHVuay4KKy8vIFJlYWJzdHJhY3Rpb24gdGh1bmsuCiAvLwotLy8gQ0hFQ0stTEFCRUw6IHNpbCBzaGFyZWQgW3RyYW5zcGFyZW50XSBbc2VyaWFsaXphYmxlXSBbdGh1bmtdIFtvc3NhXSBAJHNzNUtsYXNzQ3MwMTdMb2FkYWJsZUNsYXNzSW5pdEIwQ0llZ3hvX0FiREllZ2dvX1RSIDogJEBjb252ZW50aW9uKHRoaW4pIChAZ3VhcmFudGVlZCBLbGFzcywgQGd1YXJhbnRlZWQgQGNhbGxlZV9ndWFyYW50ZWVkIChAb3duZWQgS2xhc3MpIC0+IEBvd25lZCBMb2FkYWJsZUNsYXNzSW5pdExvYWRhYmxlKSAtPiBAb3duZWQgTG9hZGFibGVDbGFzc0luaXRMb2FkYWJsZSB7CisvLyBDSEVDSy1MQUJFTDogc2lsIHNoYXJlZCBbdHJhbnNwYXJlbnRdIFtzZXJpYWxpemFibGVdIFtyZWFic3RyYWN0aW9uX3RodW5rXSBbb3NzYV0gQCRzczVLbGFzc0NzMDE3TG9hZGFibGVDbGFzc0luaXRCMENJZWd4b19BYkRJZWdnb19UUiA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgS2xhc3MsIEBndWFyYW50ZWVkIEBjYWxsZWVfZ3VhcmFudGVlZCAoQG93bmVkIEtsYXNzKSAtPiBAb3duZWQgTG9hZGFibGVDbGFzc0luaXRMb2FkYWJsZSkgLT4gQG93bmVkIExvYWRhYmxlQ2xhc3NJbml0TG9hZGFibGUgewogLy8gQ0hFQ0s6IGJiMChbW0NMQVNTOiUuKl1dIDogQGd1YXJhbnRlZWQgJEtsYXNzLCBbW1BBOiUuKl1dIDogQGd1YXJhbnRlZWQgJEBjYWxsZWVfZ3VhcmFudGVlZCAoQG93bmVkIEtsYXNzKSAtPiBAb3duZWQgTG9hZGFibGVDbGFzc0luaXRMb2FkYWJsZSk6CiAvLyBDSEVDSzogICBbW0NMQVNTX0NPUFk6JS4qXV0gPSBjb3B5X3ZhbHVlIFtbQ0xBU1NdXQogLy8gQ0hFQ0s6ICAgW1tSRVNVTFQ6JS4qXV0gPSBhcHBseSBbW1BBXV0oW1tDTEFTU19DT1BZXV0pCkBAIC0xNTMsOSArMTUzLDkgQEAKIC8vIENIRUNLOiAgIHJldHVybiBbW1RIVU5LX1BBXV0KIC8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzczAxOExvYWRhYmxlU3RydWN0SW5pdEEwVnlBQnM1S2xhc3NDY2ZDVGMnCiAKLS8vIENhbm9uaWNhbCBUaHVuay4KKy8vIFJlYWJzdHJhY3Rpb24gdGh1bmsuCiAvLwotLy8gQ0hFQ0stTEFCRUw6IHNpbCBzaGFyZWQgW3RyYW5zcGFyZW50XSBbc2VyaWFsaXphYmxlXSBbdGh1bmtdIFtvc3NhXSBAJHNzNUtsYXNzQ3MwMThMb2FkYWJsZVN0cnVjdEluaXRCMFZJZWd4b19BYkRJZWdnb19UUiA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgS2xhc3MsIEBndWFyYW50ZWVkIEBjYWxsZWVfZ3VhcmFudGVlZCAoQG93bmVkIEtsYXNzKSAtPiBAb3duZWQgTG9hZGFibGVTdHJ1Y3RJbml0TG9hZGFibGUpIC0+IEBvd25lZCBMb2FkYWJsZVN0cnVjdEluaXRMb2FkYWJsZSB7CisvLyBDSEVDSy1MQUJFTDogc2lsIHNoYXJlZCBbdHJhbnNwYXJlbnRdIFtzZXJpYWxpemFibGVdIFtyZWFic3RyYWN0aW9uX3RodW5rXSBbb3NzYV0gQCRzczVLbGFzc0NzMDE4TG9hZGFibGVTdHJ1Y3RJbml0QjBWSWVneG9fQWJESWVnZ29fVFIgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIEtsYXNzLCBAZ3VhcmFudGVlZCBAY2FsbGVlX2d1YXJhbnRlZWQgKEBvd25lZCBLbGFzcykgLT4gQG93bmVkIExvYWRhYmxlU3RydWN0SW5pdExvYWRhYmxlKSAtPiBAb3duZWQgTG9hZGFibGVTdHJ1Y3RJbml0TG9hZGFibGUgewogLy8gQ0hFQ0s6IGJiMChbW0NMQVNTOiUuKl1dIDogQGd1YXJhbnRlZWQgJEtsYXNzLCBbW1BBOiUuKl1dIDogQGd1YXJhbnRlZWQgJEBjYWxsZWVfZ3VhcmFudGVlZCAoQG93bmVkIEtsYXNzKSAtPiBAb3duZWQgTG9hZGFibGVTdHJ1Y3RJbml0TG9hZGFibGUpOgogLy8gQ0hFQ0s6ICAgW1tDTEFTU19DT1BZOiUuKl1dID0gY29weV92YWx1ZSBbW0NMQVNTXV0KIC8vIENIRUNLOiAgIFtbUkVTVUxUOiUuKl1dID0gYXBwbHkgW1tQQV1dKFtbQ0xBU1NfQ09QWV1dKQpAQCAtMTkxLDE0ICsxOTEsMTQgQEAKIC8vIENIRUNLOiAgIHJldHVybiBbW1RIVU5LXV0KIC8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzczI1QWRkck9ubHlTdHJ1Y3RJbml0R2VuZXJpY1Z5QUJ5eEd4Y2ZDVGMnCiAKLS8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW3NlcmlhbGl6YWJsZV0gW3RodW5rXSBbb3NzYV0gQCRzeHMyNUFkZHJPbmx5U3RydWN0SW5pdEdlbmVyaWNWeXhHSWVnaXJfeEFDSWVnbnJfbFRSIDogJEBjb252ZW50aW9uKHRoaW4pIDxUPiAoQGluX2d1YXJhbnRlZWQgVCwgQGd1YXJhbnRlZWQgQGNhbGxlZV9ndWFyYW50ZWVkIChAaW4gVCkgLT4gQG91dCBBZGRyT25seVN0cnVjdEluaXRHZW5lcmljPFQ+KSAtPiBAb3V0IEFkZHJPbmx5U3RydWN0SW5pdEdlbmVyaWM8VD4geworLy8gQ0hFQ0stTEFCRUw6IHNpbCBzaGFyZWQgW3RyYW5zcGFyZW50XSBbc2VyaWFsaXphYmxlXSBbcmVhYnN0cmFjdGlvbl90aHVua10gW29zc2FdIEAkc3hzMjVBZGRyT25seVN0cnVjdEluaXRHZW5lcmljVnl4R0llZ2lyX3hBQ0llZ25yX2xUUiA6ICRAY29udmVudGlvbih0aGluKSA8VD4gKEBpbl9ndWFyYW50ZWVkIFQsIEBndWFyYW50ZWVkIEBjYWxsZWVfZ3VhcmFudGVlZCAoQGluIFQpIC0+IEBvdXQgQWRkck9ubHlTdHJ1Y3RJbml0R2VuZXJpYzxUPikgLT4gQG91dCBBZGRyT25seVN0cnVjdEluaXRHZW5lcmljPFQ+IHsKIC8vIENIRUNLOiBiYjAoW1tBUkcwOiUuKl1dIDogJCpBZGRyT25seVN0cnVjdEluaXRHZW5lcmljPFQ+LCBbW0FSRzE6JS4qXV0gOiAkKlQsIFtbQVJHMjolLipdXSA6IEBndWFyYW50ZWVkICRAY2FsbGVlX2d1YXJhbnRlZWQgKEBpbiBUKSAtPiBAb3V0IEFkZHJPbmx5U3RydWN0SW5pdEdlbmVyaWM8VD4pOgogLy8gQ0hFQ0s6ICAgW1tTVEFDSzolLipdXSA9IGFsbG9jX3N0YWNrICRUCiAvLyBDSEVDSzogICBjb3B5X2FkZHIgW1tBUkcxXV0gdG8gW2luaXRpYWxpemF0aW9uXSBbW1NUQUNLXV0gOiAkKlQKIC8vIENIRUNLOiAgIGFwcGx5IFtbQVJHMl1dKFtbQVJHMF1dLCBbW1NUQUNLXV0pIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoQGluIFQpIC0+IEBvdXQgQWRkck9ubHlTdHJ1Y3RJbml0R2VuZXJpYzxUPgogLy8gQ0hFQ0s6IH0gLy8gZW5kIHNpbCBmdW5jdGlvbiAnJHN4czI1QWRkck9ubHlTdHJ1Y3RJbml0R2VuZXJpY1Z5eEdJZWdpcl94QUNJZWducl9sVFInCiAKLS8vIENIRUNLX0xBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW3NlcmlhbGl6YWJsZV0gW3JlYWJzdHJhY3Rpb25fdGh1bmtdIFtvc3NhXSBAJHNzNUtsYXNzQ3MyNUFkZHJPbmx5U3RydWN0SW5pdEdlbmVyaWNWeUFCR0llZ25yX0FiRUllZ2dvX1RSIDogJEBjb252ZW50aW9uKHRoaW4pIChAZ3VhcmFudGVlZCBLbGFzcywgQGd1YXJhbnRlZWQgQGNhbGxlZV9ndWFyYW50ZWVkIChAaW5fZ3VhcmFudGVlZCBLbGFzcykgLT4gQG91dCBBZGRyT25seVN0cnVjdEluaXRHZW5lcmljPEtsYXNzPikgLT4gQG93bmVkIEFkZHJPbmx5U3RydWN0SW5pdEdlbmVyaWM8S2xhc3M+IHsKKy8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIFt0cmFuc3BhcmVudF0gW3NlcmlhbGl6YWJsZV0gW3JlYWJzdHJhY3Rpb25fdGh1bmtdIFtvc3NhXSBAJHNzNUtsYXNzQ3MyNUFkZHJPbmx5U3RydWN0SW5pdEdlbmVyaWNWeUFCR0llZ25yX0FiRUllZ2dvX1RSIDogJEBjb252ZW50aW9uKHRoaW4pIChAZ3VhcmFudGVlZCBLbGFzcywgQGd1YXJhbnRlZWQgQGNhbGxlZV9ndWFyYW50ZWVkIChAaW5fZ3VhcmFudGVlZCBLbGFzcykgLT4gQG91dCBBZGRyT25seVN0cnVjdEluaXRHZW5lcmljPEtsYXNzPikgLT4gQG93bmVkIEFkZHJPbmx5U3RydWN0SW5pdEdlbmVyaWM8S2xhc3M+IHsKIC8vIENIRUNLOiBiYjAoW1tBUkcwOiUuKl1dIDogQGd1YXJhbnRlZWQgJEtsYXNzLCBbW0FSRzE6JS4qXV0gOiBAZ3VhcmFudGVlZCAkQGNhbGxlZV9ndWFyYW50ZWVkIChAaW5fZ3VhcmFudGVlZCBLbGFzcykgLT4gQG91dCBBZGRyT25seVN0cnVjdEluaXRHZW5lcmljPEtsYXNzPik6CiAvLyBDSEVDSzogICBbW1NUQUNLOiUuKl1dID0gYWxsb2Nfc3RhY2sgJEtsYXNzCiAvLyBDSEVDSzogICBbW0FSRzBfQ09QWTolLipdXSA9IGNvcHlfdmFsdWUgW1tBUkcwXV0KQEAgLTI1Myw5ICsyNTMsOSBAQAogLy8gQ0hFQ0s6ICAgcmV0dXJuIFtbQ0FOT05JQ0FMX1RIVU5LXV0KIC8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzczIwUHJvdG9jb2xJbml0TG9hZGFibGVQMXR4czVLbGFzc0NfdGNmQ1RjJwogCi0vLyBDYW5vbmljYWwgdGh1bmsKKy8vIFJlYWJzdHJhY3Rpb24gdGh1bmsuCiAvLwotLy8gQ0hFQ0stTEFCRUw6IHNpbCBzaGFyZWQgW3RyYW5zcGFyZW50XSBbc2VyaWFsaXphYmxlXSBbdGh1bmtdIFtvc3NhXSBAJHNzNUtsYXNzQ3hJZWd4cl9BQnhJZWdncl9zMjBQcm90b2NvbEluaXRMb2FkYWJsZVJ6bFRSIDogJEBjb252ZW50aW9uKHRoaW4pIDxTZWxmIHdoZXJlIFNlbGYgOiBQcm90b2NvbEluaXRMb2FkYWJsZT4gKEBndWFyYW50ZWVkIEtsYXNzLCBAZ3VhcmFudGVlZCBAY2FsbGVlX2d1YXJhbnRlZWQgKEBvd25lZCBLbGFzcykgLT4gQG91dCBTZWxmKSAtPiBAb3V0IFNlbGYgeworLy8gQ0hFQ0stTEFCRUw6IHNpbCBzaGFyZWQgW3RyYW5zcGFyZW50XSBbc2VyaWFsaXphYmxlXSBbcmVhYnN0cmFjdGlvbl90aHVua10gW29zc2FdIEAkc3M1S2xhc3NDeEllZ3hyX0FCeEllZ2dyX3MyMFByb3RvY29sSW5pdExvYWRhYmxlUnpsVFIgOiAkQGNvbnZlbnRpb24odGhpbikgPFNlbGYgd2hlcmUgU2VsZiA6IFByb3RvY29sSW5pdExvYWRhYmxlPiAoQGd1YXJhbnRlZWQgS2xhc3MsIEBndWFyYW50ZWVkIEBjYWxsZWVfZ3VhcmFudGVlZCAoQG93bmVkIEtsYXNzKSAtPiBAb3V0IFNlbGYpIC0+IEBvdXQgU2VsZiB7CiAvLyBDSEVDSzogYmIwKFtbQVJHMDolLipdXSA6ICQqU2VsZiwgW1tBUkcxOiUuKl1dIDogQGd1YXJhbnRlZWQgJEtsYXNzLCBbW0FSRzI6JS4qXV0gOiBAZ3VhcmFudGVlZCAkQGNhbGxlZV9ndWFyYW50ZWVkIChAb3duZWQgS2xhc3MpIC0+IEBvdXQgU2VsZik6CiAvLyBDSEVDSzogICBbW0FSRzFfQ09QWTolLipdXSA9IGNvcHlfdmFsdWUgW1tBUkcxXV0KIC8vIENIRUNLOiAgIGFwcGx5IFtbQVJHMl1dKFtbQVJHMF1dLCBbW0FSRzFfQ09QWV1dKQpkaWZmIC0tZ2l0IGEvdGVzdC9TSUxHZW4vcGFydGlhbF9hcHBseV9vdmVycmlkZS5zd2lmdCBiL3Rlc3QvU0lMR2VuL3BhcnRpYWxfYXBwbHlfb3ZlcnJpZGUuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmZGVhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU0lMR2VuL3BhcnRpYWxfYXBwbHlfb3ZlcnJpZGUuc3dpZnQKQEAgLTAsMCArMSwzOSBAQAorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWVtaXQtc2lsZ2VuICVzIHwgJUZpbGVDaGVjayAlcworCisvLyByZGFyOi8vNDU2NzE1MzcKKworY2xhc3MgQ29udmVydGVyPElucHV0LCBPdXRwdXQ+IHsKKyAgZnVuYyBjb252ZXJ0KGlucHV0OiBJbnB1dCkgLT4gT3V0cHV0IHsKKyAgICBmYXRhbEVycm9yKCJIYXMgdG8gYmUgb3ZlcnJpZGVuIikKKyAgfQorfQorCitjbGFzcyBTdHJpbmdJbnRDb252ZXJ0ZXI6IENvbnZlcnRlcjxTdHJpbmcsIEludD4geworICBvdmVycmlkZSBmdW5jIGNvbnZlcnQoaW5wdXQ6IFN0cmluZykgLT4gSW50IHsKKyAgICByZXR1cm4gMAorICB9Cit9CisKK3B1YmxpYyBmdW5jIGNvbnZlcnQoc3RyaW5nczogW1N0cmluZ10pIC0+IFtJbnRdIHsKKyAgcmV0dXJuIHN0cmluZ3MubWFwKFN0cmluZ0ludENvbnZlcnRlcigpLmNvbnZlcnQpCit9CisKKy8vIENIRUNLLUxBQkVMOiBzaWwgW29zc2FdIEAkczIycGFydGlhbF9hcHBseV9vdmVycmlkZTdjb252ZXJ0N3N0cmluZ3NTYXlTaUdTYXlTU0dfdEYgOgorLy8gQ0hFQ0s6ICAgICAgW1tDT05WRVJURVJfVFlQRTolLipdXSA9IG1ldGF0eXBlICRAdGhpY2sgU3RyaW5nSW50Q29udmVydGVyLlR5cGUKKy8vIENIRUNLLU5FWFQ6IC8vIGZ1bmN0aW9uX3JlZgorLy8gQ0hFQ0stTkVYVDogW1tBTExPQ19DT05WRVJURVI6JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzMjJwYXJ0aWFsX2FwcGx5X292ZXJyaWRlMThTdHJpbmdJbnRDb252ZXJ0ZXJDQUN5Y2ZDIDoKKy8vIENIRUNLLU5FWFQ6IFtbQ09OVkVSVEVSOiUuKl1dID0gYXBwbHkgW1tBTExPQ19DT05WRVJURVJdXShbW0NPTlZFUlRFUl9UWVBFXV0pCisvLyBDSEVDSy1ORVhUOiAvLyBmdW5jdGlvbl9yZWYKKy8vIENIRUNLLU5FWFQ6IFtbQ1VSUllfVEhVTks6JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzMjJwYXJ0aWFsX2FwcGx5X292ZXJyaWRlMThTdHJpbmdJbnRDb252ZXJ0ZXJDN2NvbnZlcnQ1aW5wdXRTaVNTX3RGVGMgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIFN0cmluZ0ludENvbnZlcnRlcikgLT4gQG93bmVkIEBjYWxsZWVfZ3VhcmFudGVlZCAoQGd1YXJhbnRlZWQgU3RyaW5nKSAtPiBJbnQKKy8vIENIRUNLLU5FWFQ6IFtbQ1VSUllfUkVTVUxUOiUuKl1dID0gYXBwbHkgW1tDVVJSWV9USFVOS11dKFtbQ09OVkVSVEVSXV0pCisvLyBDSEVDSy1ORVhUOiBkZXN0cm95X3ZhbHVlIFtbQ09OVkVSVEVSXV0gOgorCisvLyBDSEVDSy1MQUJFTDogc2lsIHNoYXJlZCBbdGh1bmtdIFtvc3NhXSBAJHMyMnBhcnRpYWxfYXBwbHlfb3ZlcnJpZGUxOFN0cmluZ0ludENvbnZlcnRlckM3Y29udmVydDVpbnB1dFNpU1NfdEZUYyA6IAorLy8gQ0hFQ0stU0FNRTogJEBjb252ZW50aW9uKHRoaW4pIChAZ3VhcmFudGVlZCBTdHJpbmdJbnRDb252ZXJ0ZXIpIC0+IEBvd25lZCBAY2FsbGVlX2d1YXJhbnRlZWQgKEBndWFyYW50ZWVkIFN0cmluZykgLT4gSW50CisvLyBDSEVDSzogICAgICBbW01FVEhPRDolLipdXSA9IGNsYXNzX21ldGhvZCAlMCA6ICRTdHJpbmdJbnRDb252ZXJ0ZXIsICNTdHJpbmdJbnRDb252ZXJ0ZXIuY29udmVydCExIDogKFN0cmluZ0ludENvbnZlcnRlcikgLT4gKFN0cmluZykgLT4gSW50LCAkQGNvbnZlbnRpb24obWV0aG9kKSAoQGluX2d1YXJhbnRlZWQgU3RyaW5nLCBAZ3VhcmFudGVlZCBTdHJpbmdJbnRDb252ZXJ0ZXIpIC0+IEBvdXQgSW50CisvLyBDSEVDSy1ORVhUOiBbW1NFTEZfQ09QWTolLipdXSA9IGNvcHlfdmFsdWUgJTAgOgorLy8gQ0hFQ0stTkVYVDogW1tCT1VORF9NRVRIT0Q6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW1tNRVRIT0RdXShbW1NFTEZfQ09QWV1dKQorLy8gQ0hFQ0stTkVYVDogLy8gZnVuY3Rpb25fcmVmCisvLyBDSEVDSy1ORVhUOiBbW1RIVU5LOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkc1NTU2lJZWducl9TU1NpSWVnZ2RfVFIgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIFN0cmluZywgQGd1YXJhbnRlZWQgQGNhbGxlZV9ndWFyYW50ZWVkIChAaW5fZ3VhcmFudGVlZCBTdHJpbmcpIC0+IEBvdXQgSW50KSAtPiBJbnQgCisvLyBDSEVDSy1ORVhUOiBbW1JFQUJTVFJBQ1RFRDolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbW1RIVU5LXV0oW1tCT1VORF9NRVRIT0RdXSkKKy8vIENIRUNLLU5FWFQ6IHJldHVybiBbW1JFQUJTVFJBQ1RFRF1dCmRpZmYgLS1naXQgYS90ZXN0L1NJTEdlbi9yZWFic3RyYWN0LnN3aWZ0IGIvdGVzdC9TSUxHZW4vcmVhYnN0cmFjdC5zd2lmdAppbmRleCBkMWUwOWQzLi45Y2E1NmFhIDEwMDY0NAotLS0gYS90ZXN0L1NJTEdlbi9yZWFic3RyYWN0LnN3aWZ0CisrKyBiL3Rlc3QvU0lMR2VuL3JlYWJzdHJhY3Quc3dpZnQKQEAgLTM3LDEzICszNywxMiBAQAogLy8gTUFOREFUT1JZLU5FWFQ6IFtbQ1ZUOiUuKl1dID0gY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgW1tUMl1dCiAvLyBNQU5EQVRPUlktTkVYVDogLy97ey4qfX1yZWFic3RyYWN0aW9uIHRodW5rCiAvLyBNQU5EQVRPUlktTkVYVDogW1tUMzolLipdXSA9IGZ1bmN0aW9uX3JlZiBbW1RIVU5LOkAuKl1dIDoKLS8vIE1BTkRBVE9SWS1ORVhUOiBbW1Q0OiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtbVDNdXShbW0NWVF1dKQotLy8gTUFOREFUT1JZLU5FWFQ6IFtbQ1ZUOiUuKl1dID0gY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgW1tUNF1dCisvLyBNQU5EQVRPUlktTkVYVDogW1tUNDolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdIFtbVDNdXShbW0NWVF1dKQogLy8gTUFOREFUT1JZLU5FWFQ6IHN0cm9uZ19yZWxlYXNlIFtbVDJdXQogLy8gTUFOREFUT1JZLU5FWFQ6IC8vIGZ1bmN0aW9uX3JlZgogLy8gTUFOREFUT1JZLU5FWFQ6IFtbVDA6JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzMTByZWFic3RyYWN0NnRha2VGbnt7W18wLTlhLXpBLVpdKn19RgotLy8gTUFOREFUT1JZLU5FWFQ6IGFwcGx5IFtbVDBdXTxJbnQ+KFtbQ1ZUXV0pCi0vLyBNQU5EQVRPUlktTkVYVDogc3Ryb25nX3JlbGVhc2UgW1tUNF1dCisvLyBNQU5EQVRPUlktTkVYVDogYXBwbHkgW1tUMF1dPEludD4oW1tUNF1dKQorLy8gTUFOREFUT1JZLU5FWFQ6IGRlYWxsb2Nfc3RhY2sgW1tUNF1dIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKEBpbl9ndWFyYW50ZWVkIEludCkgLT4gQG91dCBPcHRpb25hbDxJbnQ+CiAvLyBNQU5EQVRPUlktTkVYVDogc3Ryb25nX3JlbGVhc2UgW1tUMl1dCiAvLyBNQU5EQVRPUlktTkVYVDogdHVwbGUgKCkKIC8vIE1BTkRBVE9SWS1ORVhUOiByZXR1cm4KZGlmZiAtLWdpdCBhL3Rlc3QvU0lMT3B0aW1pemVyL2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZS5zd2lmdCBiL3Rlc3QvU0lMT3B0aW1pemVyL2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZS5zd2lmdAppbmRleCAyMTJiZTQ2Li4wMDJjNjc1IDEwMDY0NAotLS0gYS90ZXN0L1NJTE9wdGltaXplci9hY2Nlc3NfZW5mb3JjZW1lbnRfbm9lc2NhcGUuc3dpZnQKKysrIGIvdGVzdC9TSUxPcHRpbWl6ZXIvYWNjZXNzX2VuZm9yY2VtZW50X25vZXNjYXBlLnN3aWZ0CkBAIC04NSwxMiArODUsMTAgQEAKICAgZG9Ud28oeyBfID0geCB9LCB7IF8gPSB4IH0pCiB9CiAvLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBAJHMyN2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZTA5aW5vdXRSZWFkRTAxeHlTaXpfdEYgOiAkQGNvbnZlbnRpb24odGhpbikgKEBpbm91dCBJbnQpIC0+ICgpIHsKLS8vIENIRUNLOiBbW1BBMTolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXQotLy8gQ0hFQ0s6IFtbQ1ZUMTolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEExXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCi0vLyBDSEVDSzogW1tQQTI6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0KLS8vIENIRUNLOiBbW0NWVDI6JS4qXV0gPSBjb252ZXJ0X2VzY2FwZV90b19ub2VzY2FwZSBbW1BBMl1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSB0byAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQorLy8gQ0hFQ0s6IFtbUEExOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBbW1BBMjolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCiAvLyBDSEVDSy1OT1Q6IGJlZ2luX2FjY2VzcwotLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tDVlQxXV0sIFtbQ1ZUMl1dKQorLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tQQTFdXSwgW1tQQTJdXSkKIC8vIENIRUNLLUxBQkVMOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzMjdhY2Nlc3NfZW5mb3JjZW1lbnRfbm9lc2NhcGUwOWlub3V0UmVhZEUwMXh5U2l6X3RGJwogCiAvLyBjbG9zdXJlICMxIGluIGlub3V0UmVhZFJlYWQoeDopCkBAIC0xMTksMTAgKzExNyw5IEBACiAvLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBAJHMyN2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZTExcmVhZEJveFJlYWR5eUYgOiAkQGNvbnZlbnRpb24odGhpbikgKCkgLT4gKCkgewogLy8gQ0hFQ0s6IFtbUEExOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdCiAvLyBDSEVDSzogW1tDVlQxOiUuKl1dID0gY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgW1tQQTFdXSA6ICRAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkgdG8gJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkKLS8vIENIRUNLOiBbW1BBMjolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXQotLy8gQ0hFQ0s6IFtbQ1ZUMjolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEEyXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisvLyBDSEVDSzogW1tQQTI6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQogLy8gQ0hFQ0stTk9UOiBiZWdpbl9hY2Nlc3MKLS8vIENIRUNLOiBhcHBseSAle3suKn19KFtbQ1ZUMV1dLCBbW0NWVDJdXSkKKy8vIENIRUNLOiBhcHBseSAle3suKn19KFtbQ1ZUMV1dLCBbW1BBMl1dKQogLy8gQ0hFQ0stTEFCRUw6IH0gLy8gZW5kIHNpbCBmdW5jdGlvbiAnJHMyN2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZTExcmVhZEJveFJlYWR5eUYnCiAKIC8vIGNsb3N1cmUgIzEgaW4gcmVhZEJveFJlYWQoKQpAQCAtMTUzLDEyICsxNTAsMTAgQEAKICAgZG9Ud28oeyBfID0geCB9LCB7IHggPSA0MiB9KQogfQogLy8gQ0hFQ0stTEFCRUw6IHNpbCBoaWRkZW4gQCRzMjdhY2Nlc3NfZW5mb3JjZW1lbnRfbm9lc2NhcGU5cmVhZFdyaXRleXlGIDogJEBjb252ZW50aW9uKHRoaW4pICgpIC0+ICgpIHsKLS8vIENIRUNLOiBbW1BBMTolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXQotLy8gQ0hFQ0s6IFtbQ1ZUMTolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEExXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCi0vLyBDSEVDSzogW1tQQTI6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0KLS8vIENIRUNLOiBbW0NWVDI6JS4qXV0gPSBjb252ZXJ0X2VzY2FwZV90b19ub2VzY2FwZSBbW1BBMl1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSB0byAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQorLy8gQ0hFQ0s6IFtbUEExOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBbW1BBMjolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCiAvLyBDSEVDSy1OT1Q6IGJlZ2luX2FjY2VzcwotLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tDVlQxXV0sIFtbQ1ZUMl1dKQorLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tQQTFdXSwgW1tQQTJdXSkKIC8vIENIRUNLLUxBQkVMOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzMjdhY2Nlc3NfZW5mb3JjZW1lbnRfbm9lc2NhcGU5cmVhZFdyaXRleXlGJwogCiAvLyBjbG9zdXJlICMxIGluIHJlYWRXcml0ZSgpCkBAIC0xOTUsMTAgKzE5MCw5IEBACiAvLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBAJHMyN2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZTEycmVhZEJveFdyaXRleXlGIDogJEBjb252ZW50aW9uKHRoaW4pICgpIC0+ICgpIHsKIC8vIENIRUNLOiBbW1BBMTolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXQogLy8gQ0hFQ0s6IFtbQ1ZUMTolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEExXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCi0vLyBDSEVDSzogW1tQQTI6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0KLS8vIENIRUNLOiBbW0NWVDI6JS4qXV0gPSBjb252ZXJ0X2VzY2FwZV90b19ub2VzY2FwZSBbW1BBMl1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSB0byAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQorLy8gQ0hFQ0s6IFtbUEEyOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KIC8vIENIRUNLLU5PVDogYmVnaW5fYWNjZXNzCi0vLyBDSEVDSzogYXBwbHkgJXt7Lip9fShbW0NWVDFdXSwgW1tDVlQyXV0pCisvLyBDSEVDSzogYXBwbHkgJXt7Lip9fShbW0NWVDFdXSwgW1tQQTJdXSkKIC8vIENIRUNLLUxBQkVMOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzMjdhY2Nlc3NfZW5mb3JjZW1lbnRfbm9lc2NhcGUxMnJlYWRCb3hXcml0ZXl5RicKIAogLy8gY2xvc3VyZSAjMSBpbiByZWFkQm94V3JpdGUoKQpAQCAtMjMwLDExICsyMjQsMTAgQEAKIAogLy8gQ0hFQ0stTEFCRUw6IHNpbCBoaWRkZW4gQCRzMjdhY2Nlc3NfZW5mb3JjZW1lbnRfbm9lc2NhcGUxMnJlYWRXcml0ZUJveHl5RiA6ICRAY29udmVudGlvbih0aGluKSAoKSAtPiAoKSB7CiAvLyBDSEVDSzogW1tQQTE6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0KLS8vIENIRUNLOiBbW1BBMjolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXQotLy8gQ0hFQ0s6IFtbQ1ZUMjolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEEyXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisvLyBDSEVDSzogW1tQQTI6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQogLy8gQ0hFQ0s6IFtbQ1ZUMTolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEExXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCiAvLyBDSEVDSy1OT1Q6IGJlZ2luX2FjY2VzcwotLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tDVlQyXV0sIFtbQ1ZUMV1dKQorLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tQQTJdXSwgW1tDVlQxXV0pCiAvLyBDSEVDSy1MQUJFTDogfSAvLyBlbmQgc2lsIGZ1bmN0aW9uICckczI3YWNjZXNzX2VuZm9yY2VtZW50X25vZXNjYXBlMTJyZWFkV3JpdGVCb3h5eUYnCiAKIC8vIGNsb3N1cmUgIzEgaW4gcmVhZFdyaXRlQm94KCkKQEAgLTMxOSwxMiArMzEyLDEwIEBACiB9CiAKIC8vIENIRUNLLUxBQkVMOiBzaWwgaGlkZGVuIEAkczI3YWNjZXNzX2VuZm9yY2VtZW50X25vZXNjYXBlMTB3cml0ZVdyaXRleXlGIDogJEBjb252ZW50aW9uKHRoaW4pICgpIC0+ICgpIHsKLS8vIENIRUNLOiBbW1BBMTolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXQotLy8gQ0hFQ0s6IFtbQ1ZUMTolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEExXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCi0vLyBDSEVDSzogW1tQQTI6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0KLS8vIENIRUNLOiBbW0NWVDI6JS4qXV0gPSBjb252ZXJ0X2VzY2FwZV90b19ub2VzY2FwZSBbW1BBMl1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSB0byAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQorLy8gQ0hFQ0s6IFtbUEExOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBbW1BBMjolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCiAvLyBDSEVDSy1OT1Q6IGJlZ2luX2FjY2VzcwotLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tDVlQxXV0sIFtbQ1ZUMl1dKQorLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tQQTFdXSwgW1tQQTJdXSkKIC8vIENIRUNLLUxBQkVMOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJyRzMjdhY2Nlc3NfZW5mb3JjZW1lbnRfbm9lc2NhcGUxMHdyaXRlV3JpdGV5eUYnCiAKIC8vIGNsb3N1cmUgIzEgaW4gd3JpdGVXcml0ZSgpCkBAIC0zNDgsMTIgKzMzOSwxMCBAQAogfQogCiAvLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBAJHMyN2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZTAxMGlub3V0V3JpdGVFMDF4eVNpel90RiA6ICRAY29udmVudGlvbih0aGluKSAoQGlub3V0IEludCkgLT4gKCkgewotLy8gQ0hFQ0s6IFtbUEExOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdCi0vLyBDSEVDSzogW1tDVlQxOiUuKl1dID0gY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgW1tQQTFdXSA6ICRAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkgdG8gJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkKLS8vIENIRUNLOiBbW1BBMjolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXQotLy8gQ0hFQ0s6IFtbQ1ZUMjolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEEyXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisvLyBDSEVDSzogW1tQQTE6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IFtbUEEyOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KIC8vIENIRUNLLU5PVDogYmVnaW5fYWNjZXNzCi0vLyBDSEVDSzogYXBwbHkgJXt7Lip9fShbW0NWVDFdXSwgW1tDVlQyXV0pCisvLyBDSEVDSzogYXBwbHkgJXt7Lip9fShbW1BBMV1dLCBbW1BBMl1dKQogLy8gQ0hFQ0stTEFCRUw6IH0gLy8gZW5kIHNpbCBmdW5jdGlvbiAnJHMyN2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZTAxMGlub3V0V3JpdGVFMDF4eVNpel90RicKIAogLy8gY2xvc3VyZSAjMSBpbiBpbm91dFdyaXRlV3JpdGUoeDopCkBAIC0zODEsMTEgKzM3MCwxMCBAQAogCiAvLyBDSEVDSy1MQUJFTDogc2lsIGhpZGRlbiBAJHMyN2FjY2Vzc19lbmZvcmNlbWVudF9ub2VzY2FwZTEzd3JpdGVXcml0ZUJveHl5RiA6ICRAY29udmVudGlvbih0aGluKSAoKSAtPiAoKSB7CiAvLyBDSEVDSzogW1tQQTE6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0KLS8vIENIRUNLOiBbW1BBMjolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXQotLy8gQ0hFQ0s6IFtbQ1ZUMjolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEEyXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisvLyBDSEVDSzogW1tQQTI6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQogLy8gQ0hFQ0s6IFtbQ1ZUMTolLipdXSA9IGNvbnZlcnRfZXNjYXBlX3RvX25vZXNjYXBlIFtbUEExXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCiAvLyBDSEVDSy1OT1Q6IGJlZ2luX2FjY2VzcwotLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tDVlQyXV0sIFtbQ1ZUMV1dKQorLy8gQ0hFQ0s6IGFwcGx5ICV7ey4qfX0oW1tQQTJdXSwgW1tDVlQxXV0pCiAvLyBDSEVDSy1MQUJFTDogfSAvLyBlbmQgc2lsIGZ1bmN0aW9uICckczI3YWNjZXNzX2VuZm9yY2VtZW50X25vZXNjYXBlMTN3cml0ZVdyaXRlQm94eXlGJwogCiAvLyBjbG9zdXJlICMxIGluIHdyaXRlV3JpdGVCb3goKQpkaWZmIC0tZ2l0IGEvdGVzdC9TSUxPcHRpbWl6ZXIvY2FwdHVyZV9wcm9tb3Rpb24uc2lsIGIvdGVzdC9TSUxPcHRpbWl6ZXIvY2FwdHVyZV9wcm9tb3Rpb24uc2lsCmluZGV4IDhkZDNkODYuLjgzOWQ3OTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU0lMT3B0aW1pemVyL2NhcHR1cmVfcHJvbW90aW9uLnNpbAorKysgYi90ZXN0L1NJTE9wdGltaXplci9jYXB0dXJlX3Byb21vdGlvbi5zaWwKQEAgLTQwNywzICs0MDcsNzAgQEAKIAogICByZXR1cm4gJTIxIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBJbnQKIH0KKworLy8gQ0hFQ0stTEFCRUw6IHNpbCBAdGVzdF9jYXB0dXJlX3Byb21vdGlvbl9vbl9zdGFjaworc2lsIEB0ZXN0X2NhcHR1cmVfcHJvbW90aW9uX29uX3N0YWNrIDogJEBjb252ZW50aW9uKHRoaW4pICgpIC0+ICgpIHsKK2JiMDoKKyAgJTAgPSB0dXBsZSAoKQorICAlMSA9IGFsbG9jX2JveCAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEZvbz4KKyAgJTFhID0gcHJvamVjdF9ib3ggJTEgOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEZvbz4sIDAKKyAgJTIgPSBmdW5jdGlvbl9yZWYgQGZvb19hbGxvY2F0aW5nX2luaXQgOiAkQGNvbnZlbnRpb24odGhpbikgKEB0aGljayBGb28uVHlwZSkgLT4gQG93bmVkIEZvbworICAlMyA9IG1ldGF0eXBlICRAdGhpY2sgRm9vLlR5cGUKKyAgJTQgPSBhcHBseSAlMiglMykgOiAkQGNvbnZlbnRpb24odGhpbikgKEB0aGljayBGb28uVHlwZSkgLT4gQG93bmVkIEZvbworICBzdG9yZSAlNCB0byAlMWEgOiAkKkZvbworICAlNiA9IGFsbG9jX2JveCAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEJhej4KKyAgJTZhID0gcHJvamVjdF9ib3ggJTYgOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEJhej4sIDAKKyAgJTcgPSBmdW5jdGlvbl9yZWYgQGJhel9pbml0IDogJEBjb252ZW50aW9uKHRoaW4pIChAdGhpbiBCYXouVHlwZSkgLT4gQG93bmVkIEJhegorICAlOCA9IG1ldGF0eXBlICRAdGhpbiBCYXouVHlwZQorICAlOSA9IGFwcGx5ICU3KCU4KSA6ICRAY29udmVudGlvbih0aGluKSAoQHRoaW4gQmF6LlR5cGUpIC0+IEBvd25lZCBCYXoKKyAgc3RvcmUgJTkgdG8gJTZhIDogJCpCYXoKKyAgJTExID0gYWxsb2NfYm94ICQ8z4RfMF8wPiB7IHZhciDPhF8wXzAgfSA8SW50PgorICAlMTFhID0gcHJvamVjdF9ib3ggJTExIDogJDzPhF8wXzA+IHsgdmFyIM+EXzBfMCB9IDxJbnQ+LCAwCisgICUxMiA9IGZ1bmN0aW9uX3JlZiBAY29udmVydF9mcm9tX2ludGVnZXJfbGl0ZXJhbCA6ICRAY29udmVudGlvbih0aGluKSAoQnVpbHRpbi5Xb3JkLCBAdGhpbiBJbnQuVHlwZSkgLT4gSW50CisgICUxMyA9IG1ldGF0eXBlICRAdGhpbiBJbnQuVHlwZQorICAlMTQgPSBpbnRlZ2VyX2xpdGVyYWwgJEJ1aWx0aW4uV29yZCwgMworICAlMTUgPSBhcHBseSAlMTIoJTE0LCAlMTMpIDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLldvcmQsIEB0aGluIEludC5UeXBlKSAtPiBJbnQKKyAgc3RvcmUgJTE1IHRvICUxMWEgOiAkKkludAorCisvLyBDSEVDSy1OT1Q6IGZ1bmN0aW9uX3JlZiBAY2xvc3VyZTBfZ3VhcmFudGVlZAorLy8gQ0hFQ0s6IFtbQ0xPU1VSRV9QUk9NT1RFOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkczE5Y2xvc3VyZTBfZ3VhcmFudGVlZFRmMmlpaV9uCisvLyBDSEVDSy1OT1Q6IGZ1bmN0aW9uX3JlZiBAY2xvc3VyZTBfZ3VhcmFudGVlZAorCisvLyBUaGUgRm9vIHZhcmlhYmxlIGlzIGxvYWRlZCBmcm9tIGFuZCByZXRhaW5lZCwgYmVjYXVzZSBpdCBpcyBhIHJlZmVyZW5jZSB0eXBlCisvLyBDSEVDSy1ORVhUOiBbW0xPQURGT086JS4qXV0gPSBsb2FkIHt7Lip9fSA6ICQqRm9vCisvLyBDSEVDSy1ORVhUOiBzdHJvbmdfcmV0YWluIFtbTE9BREZPT11dIDogJEZvbworCisvLyBUaGUgQmF6IHZhcmlhYmxlIGlzIGxvYWRlZCBhbmQgcmV0YWluX3ZhbHVlJ2QsIGJlY2F1c2UgaXQgaXMgYSBub24tdHJpdmlhbAorLy8gYWdncmVnYXRlIHR5cGUKKy8vIENIRUNLLU5FWFQ6IFtbTE9BREJBWjolLipdXSA9IGxvYWQge3suKn19IDogJCpCYXoKKy8vIENIRUNLLU5FWFQ6IHJldGFpbl92YWx1ZSBbW0xPQURCQVo6JS4qXV0gOiAkQmF6CisKKy8vIFRoZSBJbnQgdmFyaWFibGUgaXMgbG9hZGVkIG9ubHksIGJlY2F1c2UgaXQgaXMgdHJpdmlhbAorLy8gQ0hFQ0stTkVYVDogW1tMT0FESU5UOiUuKl1dID0gbG9hZCB7ey4qfX0gOiAkKkludAorCisvLyBUaGUgcGFydGlhbCBhcHBseSBoYXMgb25lIHZhbHVlIGFyZ3VtZW50IGZvciBlYWNoIHBhaXIgb2YgYXJndW1lbnRzIHRoYXQgd2FzCisvLyBwcmV2aW91c2x5IHVzZWQgdG8gY2FwdHVyZSBhbmQgcGFzcyB0aGUgdmFyaWFibGUgYnkgcmVmZXJlbmNlCisvLyBDSEVDSy1ORVhUOiBbW1BBOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10gW1tDTE9TVVJFX1BST01PVEVdXShbW0xPQURGT09dXSwgW1tMT0FEQkFaXV0sIFtbTE9BRElOVF1dKQorLy8gQ0hFQ0stTkVYVDogW1tNRDE6JS4qXV0gPSBtYXJrX2RlcGVuZGVuY2UgW1tQQV1dIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gSW50IG9uIFtbTE9BREZPT11dIDogJEZvbworLy8gQ0hFQ0stTkVYVDogW1tNRDI6JS4qXV0gPSBtYXJrX2RlcGVuZGVuY2UgW1tNRDFdXSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludCBvbiBbW0xPQURCQVpdXSA6ICRCYXoKKy8vIENIRUNLLU5FWFQ6IGFwcGx5IFtbTUQyXV0oKSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludAorLy8gQ0hFQ0stTkVYVDogIGRlYWxsb2Nfc3RhY2sgW1tQQV1dIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gSW50CisvLyBDSEVDSy1ORVhUOiAgc3Ryb25nX3JlbGVhc2UgW1tMT0FERk9PXV0gOiAkRm9vCisvLyBDSEVDSy1ORVhUOiAgcmVsZWFzZV92YWx1ZSBbW0xPQURCQVpdXSA6ICRCYXoKKy8vIENIRUNLLU5FWFQ6ICBzdHJvbmdfcmVsZWFzZSB7ey4qfX0gOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEludD4KKy8vIENIRUNLLU5FWFQ6ICBzdHJvbmdfcmVsZWFzZSB7ey4qfX0gOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEJhej4KKy8vIENIRUNLLU5FWFQ6ICBzdHJvbmdfcmVsZWFzZSB7ey4qfX0gOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEZvbz4KKworICAlMTcgPSBmdW5jdGlvbl9yZWYgQGNsb3N1cmUwX2d1YXJhbnRlZWQgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIDzPhF8wXzA+IHsgdmFyIM+EXzBfMCB9IDxGb28+LCBAZ3VhcmFudGVlZCA8z4RfMF8wPiB7IHZhciDPhF8wXzAgfSA8QmF6PiwgQGd1YXJhbnRlZWQgPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEludD4pIC0+IEludAorICAlMjEgPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXSAlMTcoJTEsICU2LCAlMTEpIDogJEBjb252ZW50aW9uKHRoaW4pIChAZ3VhcmFudGVlZCA8z4RfMF8wPiB7IHZhciDPhF8wXzAgfSA8Rm9vPiwgQGd1YXJhbnRlZWQgPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEJhej4sIEBndWFyYW50ZWVkIDzPhF8wXzA+IHsgdmFyIM+EXzBfMCB9IDxJbnQ+KSAtPiBJbnQKKyAgJW1kID0gbWFya19kZXBlbmRlbmNlICUyMSA6JEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gSW50IG9uICUxIDogJDzPhF8wXzA+IHsgdmFyIM+EXzBfMCB9IDxGb28+CisgICVtZDIgPSBtYXJrX2RlcGVuZGVuY2UgJW1kIDokQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBJbnQgb24gJTYgOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEJhej4KKyAgJW1kMyA9IG1hcmtfZGVwZW5kZW5jZSAlbWQyIDokQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBJbnQgb24gJTExIDogJDzPhF8wXzA+IHsgdmFyIM+EXzBfMCB9IDxJbnQ+CisgIGFwcGx5ICVtZDMoKSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludAorICBkZWFsbG9jX3N0YWNrICUyMSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludAorICBzdHJvbmdfcmVsZWFzZSAlMTEgOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEludD4KKyAgc3Ryb25nX3JlbGVhc2UgJTYgOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEJhej4KKyAgc3Ryb25nX3JlbGVhc2UgJTEgOiAkPM+EXzBfMD4geyB2YXIgz4RfMF8wIH0gPEZvbz4KKyAgJXR1cGxlID0gdHVwbGUoKQorICByZXR1cm4gJXR1cGxlIDogJCgpCit9CmRpZmYgLS1naXQgYS90ZXN0L1NJTE9wdGltaXplci9jYXB0dXJlX3Byb3BhZ2F0aW9uLnNpbCBiL3Rlc3QvU0lMT3B0aW1pemVyL2NhcHR1cmVfcHJvcGFnYXRpb24uc2lsCmluZGV4IDMxMWMwNzguLjQyMmExNDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU0lMT3B0aW1pemVyL2NhcHR1cmVfcHJvcGFnYXRpb24uc2lsCisrKyBiL3Rlc3QvU0lMT3B0aW1pemVyL2NhcHR1cmVfcHJvcGFnYXRpb24uc2lsCkBAIC00NzAsMyArNDcwLDQwIEBACiAgICUyID0gcGFydGlhbF9hcHBseSAlMSglMCkgOiAkQGNvbnZlbnRpb24obWV0aG9kKSAoSW50MzIsIEludDMyLCBAdGhpbiBJbnQzMi5UeXBlKSAtPiBCb29sCiAgIHJldHVybiAlMiA6ICRAY2FsbGVlX293bmVkIChJbnQzMiwgSW50MzIpIC0+IEJvb2wKIH0KKworc2lsIHNoYXJlZCBAdGVzdF9jYXB0dXJlX3Byb3BhZ2F0aW9uMl9jYWxsZWVfb25fc3RhY2sgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkpIC0+ICgpIHsKK2JiMCglMCA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpKToKKyAgYXBwbHkgJTAoKSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisgICU5OTk5ID0gdHVwbGUoKQorICByZXR1cm4gJTk5OTkgOiAkKCkKK30KKworc2lsIHNoYXJlZCBAdGVzdF9jYXB0dXJlX3Byb3BhZ2F0aW9uMl90aHVua19vbl9zdGFjayA6ICRAY29udmVudGlvbih0aGluKSAoQnVpbHRpbi5JbnQzMiwgQnVpbHRpbi5GUElFRUUzMiwgQnVpbHRpbi5SYXdQb2ludGVyLCBAaW4gQnVpbHRpbi5Xb3JkLCBAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkIChCdWlsdGluLkludDMyLCBCdWlsdGluLkZQSUVFRTMyLCBCdWlsdGluLlJhd1BvaW50ZXIsIEBpbiBCdWlsdGluLldvcmQpIC0+ICgpKSAtPiAoKSB7CitiYjAoJTAgOiAkQnVpbHRpbi5JbnQzMiwgJTEgOiAkQnVpbHRpbi5GUElFRUUzMiwgJTIgOiAkQnVpbHRpbi5SYXdQb2ludGVyLCAlMyA6ICQqQnVpbHRpbi5Xb3JkLCAlNCA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkIChCdWlsdGluLkludDMyLCBCdWlsdGluLkZQSUVFRTMyLCBCdWlsdGluLlJhd1BvaW50ZXIsIEBpbiBCdWlsdGluLldvcmQpIC0+ICgpKToKKyAgYXBwbHkgJTQoJTAsICUxLCAlMiwgJTMpIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKEJ1aWx0aW4uSW50MzIsIEJ1aWx0aW4uRlBJRUVFMzIsIEJ1aWx0aW4uUmF3UG9pbnRlciwgQGluIEJ1aWx0aW4uV29yZCkgLT4gKCkKKyAgJTk5OTkgPSB0dXBsZSgpCisgIHJldHVybiAlOTk5OSA6ICQoKQorfQorCisvLyBDSEVDSzogc2lsIEB0ZXN0X2NhcHR1cmVfcHJvcGFnYXRpb24yX2NhbGxlcl9vbl9zdGFjaworLy8gQ0hFQ0s6ICBbW0Y6JS4qXV0gPSBmdW5jdGlvbl9yZWYgQHRlc3RfY2FwdHVyZV9wcm9wYWdhdGlvbjJfY2FsbGVlX29uX3N0YWNrIDogJEBjb252ZW50aW9uKHRoaW4pIChAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpKSAtPiAoKQorLy8gQ0hFQ0s6ICBbW0YyOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkczQwdGVzdF9jYXB0dXJlX3Byb3BhZ2F0aW9uMl90aHVua19vbl9zdGFjazRfMTIzNTNnbG9iYWxpbml0XzMzXzA2RTdGMUQ5MDY0OTJBRTA3MDkzNkE5QjU4Q0JBRTFDX3Rva2VuODA4X1RGdGVzdF9iMV9DOF9jbG9zdXJlVGYzcGkwcGQwcHNicGdwZl9uIDogJEBjb252ZW50aW9uKHRoaW4pIEBub2VzY2FwZSAoKSAtPiAoKQorLy8gQ0hFQ0s6ICBbW0NMOiUuKl1dID0gdGhpbl90b190aGlja19mdW5jdGlvbiBbW0YyXV0gOiAkQGNvbnZlbnRpb24odGhpbikgQG5vZXNjYXBlICgpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisvLyBDSEVDSzogIGFwcGx5IFtbRl1dKFtbQ0xdXSkgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkpIC0+ICgpCisvLyBDSEVDSzogIHJldHVybgorCitzaWwgQHRlc3RfY2FwdHVyZV9wcm9wYWdhdGlvbjJfY2FsbGVyX29uX3N0YWNrIDogJEBjb252ZW50aW9uKHRoaW4pICgpIC0+ICgpIHsKKyAgJTAgPSBpbnRlZ2VyX2xpdGVyYWwgJEJ1aWx0aW4uSW50MzIsIDAKKyAgJTEgPSBmbG9hdF9saXRlcmFsICRCdWlsdGluLkZQSUVFRTMyLCAwCisgICUyID0gc3RyaW5nX2xpdGVyYWwgdXRmOCAiMTIzIgorICAlMyA9IGdsb2JhbF9hZGRyIEBnbG9iYWxpbml0XzMzXzA2RTdGMUQ5MDY0OTJBRTA3MDkzNkE5QjU4Q0JBRTFDX3Rva2VuOCA6ICQqQnVpbHRpbi5Xb3JkCisgICU0ID0gZnVuY3Rpb25fcmVmIEBfVEZ0ZXN0X2NhcHR1cmVfcHJvcGFnYXRpb24yX2Nsb3N1cmUgOiAkQGNvbnZlbnRpb24odGhpbikgKEJ1aWx0aW4uSW50MzIsIEJ1aWx0aW4uRlBJRUVFMzIsIEJ1aWx0aW4uUmF3UG9pbnRlciwgQGluIEJ1aWx0aW4uV29yZCkgLT4gKCkKKyAgJTUgPSB0aGluX3RvX3RoaWNrX2Z1bmN0aW9uICU0IDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyLCBCdWlsdGluLkZQSUVFRTMyLCBCdWlsdGluLlJhd1BvaW50ZXIsIEBpbiBCdWlsdGluLldvcmQpIC0+ICgpIHRvICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkIChCdWlsdGluLkludDMyLCBCdWlsdGluLkZQSUVFRTMyLCBCdWlsdGluLlJhd1BvaW50ZXIsIEBpbiBCdWlsdGluLldvcmQpIC0+ICgpCisgICU2ID0gZnVuY3Rpb25fcmVmIEB0ZXN0X2NhcHR1cmVfcHJvcGFnYXRpb24yX2NhbGxlZV9vbl9zdGFjayA6ICRAY29udmVudGlvbih0aGluKSAoQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSkgLT4gKCkKKyAgJTcgPSBmdW5jdGlvbl9yZWYgQHRlc3RfY2FwdHVyZV9wcm9wYWdhdGlvbjJfdGh1bmtfb25fc3RhY2sgOiAkQGNvbnZlbnRpb24odGhpbikgKEJ1aWx0aW4uSW50MzIsIEJ1aWx0aW4uRlBJRUVFMzIsIEJ1aWx0aW4uUmF3UG9pbnRlciwgQGluIEJ1aWx0aW4uV29yZCwgQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoQnVpbHRpbi5JbnQzMiwgQnVpbHRpbi5GUElFRUUzMiwgQnVpbHRpbi5SYXdQb2ludGVyLCBAaW4gQnVpbHRpbi5Xb3JkKSAtPiAoKSkgLT4gKCkKKyAgJTggPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXSAlNyglMCwgJTEsICUyLCAlMywgJTUpIDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyLCBCdWlsdGluLkZQSUVFRTMyLCBCdWlsdGluLlJhd1BvaW50ZXIsIEBpbiBCdWlsdGluLldvcmQsIEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKEJ1aWx0aW4uSW50MzIsIEJ1aWx0aW4uRlBJRUVFMzIsIEJ1aWx0aW4uUmF3UG9pbnRlciwgQGluIEJ1aWx0aW4uV29yZCkgLT4gKCkpIC0+ICgpCisgIGFwcGx5ICU2KCU4KSA6ICRAY29udmVudGlvbih0aGluKSAoQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSkgLT4gKCkKKyAgZGVhbGxvY19zdGFjayAlOCA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisgICU5OTk5ID0gdHVwbGUoKQorICByZXR1cm4gJTk5OTkgOiAkKCkKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU0lMT3B0aW1pemVyL2Nsb3N1cmVfbGlmZXRpbWVfZml4dXAuc3dpZnQgYi90ZXN0L1NJTE9wdGltaXplci9jbG9zdXJlX2xpZmV0aW1lX2ZpeHVwLnN3aWZ0CmluZGV4IDAyYjA3MDYuLjc2MGJiMmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvU0lMT3B0aW1pemVyL2Nsb3N1cmVfbGlmZXRpbWVfZml4dXAuc3dpZnQKKysrIGIvdGVzdC9TSUxPcHRpbWl6ZXIvY2xvc3VyZV9saWZldGltZV9maXh1cC5zd2lmdApAQCAtMSw0ICsxLDEwIEBACi0vLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQgJXMgLXNpbC12ZXJpZnktYWxsIC1lbmFibGUtc2lsLW93bmVyc2hpcCAtZW1pdC1zaWwgLW8gLSB8ICVGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWVtcHR5LWRpcmVjdG9yeSgldCkKKy8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZCAlUy8uLi9JbnB1dHMvcmVzaWxpZW50X3N0cnVjdC5zd2lmdCAtZW5hYmxlLXJlc2lsaWVuY2UgLWVtaXQtbW9kdWxlIC1lbWl0LW1vZHVsZS1wYXRoICV0L3Jlc2lsaWVudF9zdHJ1Y3Quc3dpZnRtb2R1bGUKKy8vIFJVTjogJXRhcmdldC1zd2lmdC1mcm9udGVuZCAlUy8uLi9JbnB1dHMvcmVzaWxpZW50X2VudW0uc3dpZnQgLUkgJXQgLWVuYWJsZS1yZXNpbGllbmNlIC1lbWl0LW1vZHVsZSAtZW1pdC1tb2R1bGUtcGF0aCAldC9yZXNpbGllbnRfZW51bS5zd2lmdG1vZHVsZQorLy8gUlVOOiAldGFyZ2V0LXN3aWZ0LWZyb250ZW5kICVzIC1zaWwtdmVyaWZ5LWFsbCAtZW5hYmxlLXNpbC1vd25lcnNoaXAgLWVtaXQtc2lsIC1JICV0IC1vIC0gfCAlRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIC0tY2hlY2stcHJlZml4PSV0YXJnZXQtb3MKKworaW1wb3J0IHJlc2lsaWVudF9zdHJ1Y3QKK2ltcG9ydCByZXNpbGllbnRfZW51bQogCiBmdW5jIHVzZV9jbG9zdXJlKF8gYyA6ICgpIC0+ICgpICkgewogICBjKCkKQEAgLTE3LDE0ICsyMywxMyBAQAogLy8gQ0hFQ0s6IGJiMChbW0FSRzolLipdXSA6ICRDKToKIC8vIENIRUNLOiBbW0Y6JS4qXV0gID0gZnVuY3Rpb25fcmVmIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDEwdGVzdFNpbXBsZTFjeUFBMUNDX3RGeXlYRWZVXwogLy8gQ0hFQ0stTkVYVDogIHN0cm9uZ19yZXRhaW4gW1tBUkddXSA6ICRDCi0vLyBDSEVDSy1ORVhUOiAgW1tQQTolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbW0ZdXShbW0FSR11dKSA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgQykgLT4gKCkKLS8vIENIRUNLLU5FWFQ6IHN0cm9uZ19yZXRhaW4gW1tQQV1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQotLy8gQ0hFQ0stTkVYVDogIFtbQ1ZUOiUuKl1dID0gY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgW1tQQV1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSB0byAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQorLy8gQ0hFQ0stTkVYVDogIFtbUEE6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXSBbW0ZdXShbW0FSR11dKSA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgQykgLT4gKCkKKy8vIENIRUNLLU5FWFQ6ICBbW0NMOiUuKl1dID0gbWFya19kZXBlbmRlbmNlIFtbUEFdXSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpIG9uIFtbQVJHXV0gOiAkQwogLy8gQ0hFQ0stTkVYVDogIC8vIGZ1bmN0aW9uX3JlZiB1c2VfY2xvc3VyZShfOikKIC8vIENIRUNLLU5FWFQ6ICBbW0YyOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDA0dXNlX0EweXl5eVhFRiA6ICRAY29udmVudGlvbih0aGluKSAoQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSkgLT4gKCkKLS8vIENIRUNLLU5FWFQ6ICBhcHBseSBbW0YyXV0oW1tDVlRdXSkgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkpIC0+ICgpCi0vLyBDSEVDSy1ORVhUOiAgc3Ryb25nX3JlbGVhc2UgW1tQQV1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQotLy8gQ0hFQ0stTkVYVDogIHN0cm9uZ19yZWxlYXNlIFtbUEFdXSA6ICRAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkKKy8vIENIRUNLLU5FWFQ6ICBhcHBseSBbW0YyXV0oW1tDTF1dKSA6ICRAY29udmVudGlvbih0aGluKSAoQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKSkgLT4gKCkKKy8vIENIRUNLLU5FWFQ6ICBkZWFsbG9jX3N0YWNrIFtbUEFdXSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisvLyBDSEVDSy1ORVhUOiAgc3Ryb25nX3JlbGVhc2UgW1tBUkddXSA6ICRDCiAvLyBDSEVDSy1ORVhUOiAgdHVwbGUgKCkKIC8vIENIRUNLLU5FWFQ6ICByZXR1cm4ge3suKn19IDogJCgpCiBwdWJsaWMgZnVuYyB0ZXN0U2ltcGxlKGM6IEMpIHsKQEAgLTM1LDE5ICs0MCwxNyBAQAogLy8gQ0hFQ0s6YmIwKFtbQVJHOiUuKl1dIDogJEMpOgogLy8gQ0hFQ0s6ICBbW0Y6JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzMjJjbG9zdXJlX2xpZmV0aW1lX2ZpeHVwMTF0ZXN0R2VuZXJpYzFjeUFBMUNDX3RGU2l5WEVmVV8gOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIEMpIC0+IEludAogLy8gQ0hFQ0stTkVYVDogIHN0cm9uZ19yZXRhaW4gW1tBUkddXSA6ICRDCi0vLyBDSEVDSy1ORVhUOiAgW1tQQTolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbW0ZdXShbW0FSR11dKSA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgQykgLT4gSW50Ci0vLyBDSEVDSy1ORVhUOiAgc3Ryb25nX3JldGFpbiBbW1BBXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludAotLy8gQ0hFQ0stTkVYVDogIFtbQ1ZUOiUuKl1dID0gY29udmVydF9lc2NhcGVfdG9fbm9lc2NhcGUgW1tQQV1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBJbnQgdG8gJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gSW50CisvLyBDSEVDSy1ORVhUOiAgW1tQQTolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdIFtbRl1dKFtbQVJHXV0pIDogJEBjb252ZW50aW9uKHRoaW4pIChAZ3VhcmFudGVlZCBDKSAtPiBJbnQKKy8vIENIRUNLLU5FWFQ6ICBbW01EOiUuKl1dID0gbWFya19kZXBlbmRlbmNlIFtbUEFdXSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludCBvbiBbW0FSR11dIDogJEMKIC8vIENIRUNLLU5FWFQ6ICAvLyBmdW5jdGlvbl9yZWYgdGh1bmsgZm9yIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoQHVub3duZWQgSW50KQogLy8gQ0hFQ0stTkVYVDogIFtbRjolLipdXSA9IGZ1bmN0aW9uX3JlZiBAJHNTaUlnZF9TaUllZ3JfVFIgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gSW50KSAtPiBAb3V0IEludAotLy8gQ0hFQ0stTkVYVDogIFtbUEEyOiUuKl1dID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtbRl1dKFtbQ1ZUXV0pIDogJEBjb252ZW50aW9uKHRoaW4pIChAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludCkgLT4gQG91dCBJbnQKLS8vIENIRUNLLU5FWFQ6ICBbW0NWVDI6JS4qXV0gPSBjb252ZXJ0X2VzY2FwZV90b19ub2VzY2FwZSBbW1BBMl1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBAb3V0IEludCB0byAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBAb3V0IEludAotLy8gQ0hFQ0stTkVYVDogIHN0cm9uZ19yZWxlYXNlIFtbUEFdXSA6ICRAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gSW50CisvLyBDSEVDSy1ORVhUOiAgW1tQQTI6JS4qXV0gPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXSBbW0ZdXShbW01EXV0pIDogJEBjb252ZW50aW9uKHRoaW4pIChAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludCkgLT4gQG91dCBJbnQKIC8vIENIRUNLLU5FWFQ6ICAvLyBmdW5jdGlvbl9yZWYgdXNlX2Nsb3N1cmVHZW5lcmljPEE+KF86KQogLy8gQ0hFQ0stTkVYVDogIFtbRjI6JS4qXV0gPSBmdW5jdGlvbl9yZWYgQCRzMjJjbG9zdXJlX2xpZmV0aW1lX2ZpeHVwMDR1c2VfQTdHZW5lcmljeXl4eVhFbEYgOiAkQGNvbnZlbnRpb24odGhpbikgPM+EXzBfMD4gKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gQG91dCDPhF8wXzApIC0+ICgpCi0vLyBDSEVDSy1ORVhUOiAgJTEyID0gYXBwbHkgW1tGMl1dPEludD4oW1tDVlQyXV0pIDogJEBjb252ZW50aW9uKHRoaW4pIDzPhF8wXzA+IChAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEBvdXQgz4RfMF8wKSAtPiAoKQotLy8gQ0hFQ0stTkVYVDogIHN0cm9uZ19yZWxlYXNlIFtbUEEyXV0gOiAkQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEBvdXQgSW50Ci0vLyBDSEVDSy1ORVhUOiAgc3Ryb25nX3JlbGVhc2UgW1tQQV1dIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBJbnQKKy8vIENIRUNLLU5FWFQ6ICBhcHBseSBbW0YyXV08SW50PihbW1BBMl1dKSA6ICRAY29udmVudGlvbih0aGluKSA8z4RfMF8wPiAoQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBAb3V0IM+EXzBfMCkgLT4gKCkKKy8vIENIRUNLLU5FWFQ6ICBkZWFsbG9jX3N0YWNrIFtbUEEyXV0KKy8vIENIRUNLLU5FWFQ6ICBkZWFsbG9jX3N0YWNrIFtbUEFdXQorLy8gQ0hFQ0stTkVYVDogIHN0cm9uZ19yZWxlYXNlIFtbQVJHXV0KIC8vIENIRUNLLU5FWFQ6ICB0dXBsZSAoKQogLy8gQ0hFQ0stTkVYVDogIHJldHVybiB7ey4qfX0gOiAkKCkKIApAQCAtOTAsMyArOTMsMzYwIEBACiAgIH0KICAgcmV0dXJuIHJlc3VsdAogfQorCisvLyBDSEVDSy1MQUJFTDogc2lsIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDI4dG9fc3RhY2tfb2ZfY29udmVydF9mdW5jdGlvbjFweVN2U2dfdEYKKy8vIENIRUNLOiAgW1tQQTolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogIFtbTUQ6JS4qXV0gPSBtYXJrX2RlcGVuZGVuY2UgW1tQQV1dCisvLyBDSEVDSzogIFtbQ1ZUOiUuKl1dID0gY29udmVydF9mdW5jdGlvbiBbW01EXV0KKy8vIENIRUNLOiAgW1tSRUFCU1RSQUNUOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkc1N2U1NzNUVycm9yX3BJZ3lvem9fU3ZTU3NBQV9wSWVnbnJ6b19UUgorLy8gQ0hFQ0s6ICBbW1BBMjolLipdXSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdIFtbUkVBQlNUUkFDVF1dKFtbQ1ZUXV0pCisvLyBDSEVDSzogIFtbTUFQOiUuKl1dID0gZnVuY3Rpb25fcmVmIEAkc1NxM21hcHlxZF9fU2dxZF9feEtYRUtsRgorLy8gQ0hFQ0s6ICB0cnlfYXBwbHkgW1tNQVBdXTxVbnNhZmVNdXRhYmxlUmF3UG9pbnRlciwgU3RyaW5nPih7ey4qfX0sIFtbUEEyXV0sIHt7Lip9fSkKK3B1YmxpYyBmdW5jIHRvX3N0YWNrX29mX2NvbnZlcnRfZnVuY3Rpb24ocDogVW5zYWZlTXV0YWJsZVJhd1BvaW50ZXI/KSB7CisgIF8gPSBwLm1hcChTdHJpbmcuaW5pdChkZXNjcmliaW5nOikpCit9CisKKworcHVibGljIGZ1bmMgbm9fZGVhbGxvY19zdGFja19iZWZvcmVfdW5yZWFjaGFibGUoXyBtZXNzYWdlOiBTdHJpbmcsIGZpbGVOYW1lOiBTdGF0aWNTdHJpbmcgPSAjZmlsZSwgbGluZU51bWJlcjogSW50ID0gI2xpbmUpIC0+IE5ldmVyICB7CisgIFN3aWZ0LmZhdGFsRXJyb3IobWVzc2FnZSwgZmlsZTogZmlsZU5hbWUsIGxpbmU6IFVJbnQobGluZU51bWJlcikpCit9CisKKy8vIE1ha2Ugc3VyZSBjbG9zdXJlcyBhcmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KK2Z1bmMgdXNlQ2xvc3VyZShfIGM6ICgpIC0+ICgpKSB7Cit9CitmdW5jIHVzZUNsb3N1cmVUaHJvd2luZyhfIGM6ICgpIHRocm93cyAtPiAoKSkgdGhyb3dzIHsKK30KK2Z1bmMgdXNlR2VuZXJpY0Nsb3N1cmU8VCwgVj4oXyBjIDogKFQpIC0+IFYpIHsKK30KK2Z1bmMgdXNlR2VuZXJpY0Nsb3N1cmVUaHJvd2luZzxULCBWPihfIGM6IChUKSB0aHJvd3MgLT4gVikgdGhyb3dzIHsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHNpbCBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAxMmNhcHR1cmVDbGFzczFjMWR5QUExQ0NfQUZ0S0YKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IGZ1bmN0aW9uX3JlZiBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAxMHVzZUNsb3N1cmV5eXl5WEVGCisKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IGZ1bmN0aW9uX3JlZiBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAxOHVzZUNsb3N1cmVUaHJvd2luZ3l5eXlLWEVLRgorCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBmdW5jdGlvbl9yZWYgQCRzSWdfeXR5dEllZ25yX1RSCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBmdW5jdGlvbl9yZWYgQCRzMjJjbG9zdXJlX2xpZmV0aW1lX2ZpeHVwMTd1c2VHZW5lcmljQ2xvc3VyZXl5cV94WEVyMF9sRgorCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBmdW5jdGlvbl9yZWYgQCRzczVFcnJvcl9wSWd6b195dHl0c0FBX3BJZWducnpvX1RSCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBmdW5jdGlvbl9yZWYgQCRzMjJjbG9zdXJlX2xpZmV0aW1lX2ZpeHVwMjV1c2VHZW5lcmljQ2xvc3VyZVRocm93aW5neXlxX3hLWEVLcjBfbAorcHVibGljIGZ1bmMgY2FwdHVyZUNsYXNzKGM6IEMsIGQ6IEMpIHRocm93cyB7CisgIHVzZUNsb3N1cmUgeworICAgIGMuZG9JdCgpCisgICAgZC5kb0l0KCkKKyAgfQorCisgIHRyeSB1c2VDbG9zdXJlVGhyb3dpbmcgeworICAgIGMuZG9JdCgpCisgICAgZC5kb0l0KCkKKyAgfQorCisgIHVzZUdlbmVyaWNDbG9zdXJlIHsKKyAgICBjLmRvSXQoKQorICAgIGQuZG9JdCgpCisgIH0KKworICB0cnkgdXNlR2VuZXJpY0Nsb3N1cmVUaHJvd2luZyB7CisgICAgYy5kb0l0KCkKKyAgICBkLmRvSXQoKQorICB9Cit9CisKK3B1YmxpYyBwcm90b2NvbCBEb0l0IHsKKyAgZnVuYyBkb0l0KCkKK30KKy8vIENIRUNLLUxBQkVMOiBzaWwgQCRzMjJjbG9zdXJlX2xpZmV0aW1lX2ZpeHVwMTRjYXB0dXJlR2VuZXJpYzFjMWR5eF9xX3RLQUE0RG9JdFJ6QWFFUl9yMF9sRgorLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogZnVuY3Rpb25fcmVmIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDEwdXNlQ2xvc3VyZXl5eXlYRUYKKworLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogZnVuY3Rpb25fcmVmIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDE4dXNlQ2xvc3VyZVRocm93aW5neXl5eUtYRUtGCisKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IGZ1bmN0aW9uX3JlZiBAJHNJZ195dHl0SWVnbnJfVFIKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IGZ1bmN0aW9uX3JlZiBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAxN3VzZUdlbmVyaWNDbG9zdXJleXlxX3hYRXIwX2xGCisKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IGZ1bmN0aW9uX3JlZiBAJHNzNUVycm9yX3BJZ3pvX3l0eXRzQUFfcEllZ25yem9fVFIKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IGZ1bmN0aW9uX3JlZiBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAyNXVzZUdlbmVyaWNDbG9zdXJlVGhyb3dpbmd5eXFfeEtYRUtyMF9sRgorcHVibGljIGZ1bmMgY2FwdHVyZUdlbmVyaWM8QyA6RG9JdCxEOiBEb0l0PihjOiBDLCBkOiBEKSB0aHJvd3MgeworICB1c2VDbG9zdXJlIHsKKyAgICBjLmRvSXQoKQorICAgIGQuZG9JdCgpCisgIH0KKworICB0cnkgdXNlQ2xvc3VyZVRocm93aW5nIHsKKyAgICBjLmRvSXQoKQorICAgIGQuZG9JdCgpCisgIH0KKworICB1c2VHZW5lcmljQ2xvc3VyZSB7CisgICAgYy5kb0l0KCkKKyAgICBkLmRvSXQoKQorICB9CisKKyAgdHJ5IHVzZUdlbmVyaWNDbG9zdXJlVGhyb3dpbmcgeworICAgIGMuZG9JdCgpCisgICAgZC5kb0l0KCkKKyAgfQorfQorCisvLyBDSEVDSy1MQUJFTDogc2lsIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDE0Y2FwdHVyZUNsb3N1cmUxYzFkMXR5cV94WEVfcV94WEV4dEtyMF9sRgorLy8gQ0hFQ0s6ICBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6ICBmdW5jdGlvbl9yZWYgQCRzMjJjbG9zdXJlX2xpZmV0aW1lX2ZpeHVwMTB1c2VDbG9zdXJleXl5eVhFRgorCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogIGZ1bmN0aW9uX3JlZiBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAxOHVzZUNsb3N1cmVUaHJvd2luZ3l5eXlLWEVLRgorCisKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IGZ1bmN0aW9uX3JlZiBAJHNJZ195dHl0SWVnbnJfVFIKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IGZ1bmN0aW9uX3JlZiBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAxN3VzZUdlbmVyaWNDbG9zdXJleXlxX3hYRXIwX2xGCisKKy8vIENIRUNLOiAgcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiAgZnVuY3Rpb25fcmVmIEAkc3M1RXJyb3JfcElnem9feXR5dHNBQV9wSWVnbnJ6b19UUgorLy8gQ0hFQ0s6ICBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6ICBmdW5jdGlvbl9yZWYgQCRzMjJjbG9zdXJlX2xpZmV0aW1lX2ZpeHVwMjV1c2VHZW5lcmljQ2xvc3VyZVRocm93aW5neXlxX3hLWEVLcjBfbEYKK3B1YmxpYyBmdW5jIGNhcHR1cmVDbG9zdXJlPFQsIFY+KGMgOiAoVCkgLT5WLCBkOiAoVCkgLT4gViwgdDogVCkgdGhyb3dzIHsKKyAgdXNlQ2xvc3VyZSB7CisgICAgYyh0KQorICAgIGQodCkKKyAgfQorCisgIHRyeSB1c2VDbG9zdXJlVGhyb3dpbmcgeworICAgIGModCkKKyAgICBkKHQpCisgIH0KKworICB1c2VHZW5lcmljQ2xvc3VyZSB7CisgICAgYyh0KQorICAgIGQodCkKKyAgfQorCisgIHRyeSB1c2VHZW5lcmljQ2xvc3VyZVRocm93aW5nIHsKKyAgICBjKHQpCisgICAgZCh0KQorICB9Cit9CisKKy8vIENIRUNLLUxBQkVMOiBzaWwgQCRzMjJjbG9zdXJlX2xpZmV0aW1lX2ZpeHVwMTZjYXB0dXJlUmVzaWxpZW50CisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBhcHBseQorCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiB0cnlfYXBwbHkKKworLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBhcHBseQorCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogdHJ5X2FwcGx5CisKK3B1YmxpYyBmdW5jIGNhcHR1cmVSZXNpbGllbnQoYzogU2l6ZSkgdGhyb3dzIHsKKyAgdXNlQ2xvc3VyZSB7CisgICAgYy5tZXRob2QoKQorICB9CisKKyAgdHJ5IHVzZUNsb3N1cmVUaHJvd2luZyB7CisgICAgYy5tZXRob2QoKQorICB9CisKKyAgdXNlR2VuZXJpY0Nsb3N1cmUgeworICAgIGMubWV0aG9kKCkKKyAgfQorCisgIHRyeSB1c2VHZW5lcmljQ2xvc3VyZVRocm93aW5nIHsKKyAgICBjLm1ldGhvZCgpCisgIH0KK30KKworLy8gQ0hFQ0stTEFCRUw6IHNpbCBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAxMGNhcHR1cmVQT0QxY3kxNnJlc2lsaWVudF9zdHJ1Y3Q1UG9pbnRWX3RLRgorLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogYXBwbHkKKworLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogdHJ5X2FwcGx5CisKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogYXBwbHkKKworLy8gQ0hFQ0s6ICBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6ICBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IHRyeV9hcHBseQorcHVibGljIGZ1bmMgY2FwdHVyZVBPRChjOiBQb2ludCkgdGhyb3dzIHsKKyAgdXNlQ2xvc3VyZSB7CisgICAgYy5tZXRob2QoKQorICB9CisKKyAgdHJ5IHVzZUNsb3N1cmVUaHJvd2luZyB7CisgICAgYy5tZXRob2QoKQorICB9CisKKyAgdXNlR2VuZXJpY0Nsb3N1cmUgeworICAgIGMubWV0aG9kKCkKKyAgfQorCisgIHRyeSB1c2VHZW5lcmljQ2xvc3VyZVRocm93aW5nIHsKKyAgICBjLm1ldGhvZCgpCisgIH0KK30KKworLy8gQ0hFQ0stTEFCRUw6IHNpbCBAJHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAxMWNhcHR1cmVFbnVtCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBhcHBseQorCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiB0cnlfYXBwbHkKKworLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBhcHBseQorCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogdHJ5X2FwcGx5CitwdWJsaWMgZnVuYyBjYXB0dXJlRW51bShjOiBGdWxseUZpeGVkTGF5b3V0LCBkOiBDdXN0b21Db2xvcikgdGhyb3dzIHsKKyAgdXNlQ2xvc3VyZSB7CisgICAgIF8gPSBjCisgICAgIF8gPSBkCisgIH0KKworICB0cnkgdXNlQ2xvc3VyZVRocm93aW5nIHsKKyAgICAgXyA9IGMKKyAgICAgXyA9IGQKKyAgfQorCisgIHVzZUdlbmVyaWNDbG9zdXJlIHsKKyAgICAgXyA9IGMKKyAgICAgXyA9IGQKKyAgfQorCisgIHRyeSB1c2VHZW5lcmljQ2xvc3VyZVRocm93aW5nIHsKKyAgICAgXyA9IGMKKyAgICAgXyA9IGQKKyAgfQorfQorCitwdWJsaWMgcHJvdG9jb2wgRW1wdHlQIHt9CisKK3B1YmxpYyBzdHJ1Y3QgQWRkcmVzc09ubHlTdHJ1Y3QgOiBFbXB0eVAge30KKworcHVibGljIGVudW0gQWRkcmVzc09ubHlFbnVtIHsKKyAgY2FzZSBub3VnaHQKKyAgY2FzZSBtZXJlKEVtcHR5UCkKKyAgY2FzZSBwaGFudG9tKEFkZHJlc3NPbmx5U3RydWN0KQorfQorCisvLyBDSEVDSy1MQUJFTDogc2lsIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDIyY2FwdHVyZUFkZHJlc3NPbmx5RW51bQorLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogYXBwbHkKKworLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogdHJ5X2FwcGx5CisKKy8vIENIRUNLOiBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogYXBwbHkKKworLy8gQ0hFQ0s6ICBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6ICBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXQorLy8gQ0hFQ0s6IHRyeV9hcHBseQorcHVibGljIGZ1bmMgY2FwdHVyZUFkZHJlc3NPbmx5RW51bShjOiBBZGRyZXNzT25seUVudW0sIGQ6IEFkZHJlc3NPbmx5RW51bSkgdGhyb3dzIHsKKyAgdXNlQ2xvc3VyZSB7CisgICAgIF8gPSBjCisgICAgIF8gPSBkCisgIH0KKworICB0cnkgdXNlQ2xvc3VyZVRocm93aW5nIHsKKyAgICAgXyA9IGMKKyAgICAgXyA9IGQKKyAgfQorCisgIHVzZUdlbmVyaWNDbG9zdXJlIHsKKyAgICAgXyA9IGMKKyAgICAgXyA9IGQKKyAgfQorCisgIHRyeSB1c2VHZW5lcmljQ2xvc3VyZVRocm93aW5nIHsKKyAgICAgXyA9IGMKKyAgICAgXyA9IGQKKyAgfQorfQorCisvLyBDSEVDSy1MQUJFTDogc2lsIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDE1Y2FwdHVyZVByb3RvY29sCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBhcHBseQorCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiB0cnlfYXBwbHkKKworLy8gQ0hFQ0s6IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiBhcHBseQorCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogdHJ5X2FwcGx5CitwdWJsaWMgZnVuYyBjYXB0dXJlUHJvdG9jb2woYzogRW1wdHlQLCBkOiBFbXB0eVApIHRocm93cyB7CisgIHVzZUNsb3N1cmUgeworICAgICBfID0gYworICAgICBfID0gZAorICB9CisKKyAgdHJ5IHVzZUNsb3N1cmVUaHJvd2luZyB7CisgICAgIF8gPSBjCisgICAgIF8gPSBkCisgIH0KKworICB1c2VHZW5lcmljQ2xvc3VyZSB7ICgpIC0+IEludCBpbgorICAgICBfID0gYworICAgICBfID0gZAorICAgICByZXR1cm4gMAorICB9CisKKyAgdHJ5IHVzZUdlbmVyaWNDbG9zdXJlVGhyb3dpbmcgeyAoKSAtPiBJbnQgaW4KKyAgICAgXyA9IGMKKyAgICAgXyA9IGQKKyAgICAgcmV0dXJuIDAKKyAgfQorfQorCitwdWJsaWMgcHJvdG9jb2wgUSB7CisgIGFzc29jaWF0ZWR0eXBlIEVsZW1lbnQKKyAgZnVuYyB0ZXN0PFU+KF8gYzogKEVsZW1lbnQpIC0+IFUpIHRocm93cworfQorCisvLyBDSEVDSy1MQUJFTDogc2lsIEAkczIyY2xvc3VyZV9saWZldGltZV9maXh1cDBBMThXaXRoQXNzb2NpYXRlZFR5cGUxYzFleXhfN0VsZW1lbnRRenRLQUExUVJ6bEYKKy8vIENIRUNLOiAgcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiAgcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10KKy8vIENIRUNLOiB0cnlfYXBwbHkKK3B1YmxpYyBmdW5jIGNsb3N1cmVXaXRoQXNzb2NpYXRlZFR5cGU8QyA6IFE+IChjOiBDLCBlOiBDLkVsZW1lbnQpIHRocm93cyB7CisgIHRyeSBjLnRlc3QoIHsgXyBpbiBfID0gZSB9KQorfQorCisKK3B1YmxpYyBjbGFzcyBGPFQ+IHsKKyAgIGZ1bmMgdGVzdDxWPihfIGM6IChWKSB0aHJvd3MgLT4gVCkge30KKyAgIGxldCB0IDogVD8gPSBuaWwKK30KKworLy8gQ0hFQ0stTEFCRUw6IHMyMmNsb3N1cmVfbGlmZXRpbWVfZml4dXAyMnRlc3RDbG9zdXJlTWV0aG9kUGFyYW0xZnlBQTFGQ3l4R190S2xGCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdCisvLyBDSEVDSzogYXBwbHkKK3B1YmxpYyBmdW5jIHRlc3RDbG9zdXJlTWV0aG9kUGFyYW08VD4oZjogRjxUPikgdGhyb3dzIHsKKyAgdHJ5IGYudGVzdCB7IHJldHVybiBmLnQhIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU0lMT3B0aW1pemVyL2Nsb3N1cmVfc3BlY2lhbGl6ZS5zaWwgYi90ZXN0L1NJTE9wdGltaXplci9jbG9zdXJlX3NwZWNpYWxpemUuc2lsCmluZGV4IDViYzhlN2QuLjZhYmNhYmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvU0lMT3B0aW1pemVyL2Nsb3N1cmVfc3BlY2lhbGl6ZS5zaWwKKysrIGIvdGVzdC9TSUxPcHRpbWl6ZXIvY2xvc3VyZV9zcGVjaWFsaXplLnNpbApAQCAtODA4LDMgKzgwOCwyMyBAQAogICByZWxlYXNlX3ZhbHVlICUyIDogJEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBJbnQKICAgcmV0dXJuICV2YWx1ZSA6ICRJbnQKIH0KKy8vIENIRUNLLUxBQkVMOiBzaWwgQHJlYWJzdHJhY3Rpb25UZXN0X29uX3N0YWNrCisvLyBDSEVDSzogYmIwKFtbQTolLipdXSA6ICRJbnQpOgorLy8gQ0hFQ0s6ICBbW1I6JS4qXV0gPSBhbGxvY19zdGFjayAkSW50CisvLyBDSEVDSzogIFtbRjolLipdXSA9IGZ1bmN0aW9uX3JlZiBAJHMyNXRlc3RDbG9zdXJlVGh1bmtOb0VzY2FwZTIwYUIxNENvbnZlcnRIZWxwZXIyU2lUZjFuY19uCisvLyBDSEVDSzogYXBwbHkgW1tGXV0oW1tSXV0sIFtbQV1dKQorc2lsIEByZWFic3RyYWN0aW9uVGVzdF9vbl9zdGFjayA6ICQoSW50KSAtPiAoKSB7CitiYjAoJTAgOiAkSW50KToKKyAgJTQ4ID0gYWxsb2Nfc3RhY2sgJEludAorICAlNDkgPSBmdW5jdGlvbl9yZWYgQHRlc3RDbG9zdXJlQ29udmVydEhlbHBlcjIgOiAkQGNvbnZlbnRpb24odGhpbikgKEludCkgLT4gSW50CisgICU1MCA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdICU0OSglMCkgOiAkQGNvbnZlbnRpb24odGhpbikgKEludCkgLT4gSW50CisgICU1MiA9IGZ1bmN0aW9uX3JlZiBAcmVhYnN0cmFjdGlvblRodW5rIDogJEBjb252ZW50aW9uKHRoaW4pIChAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+IEludCkgLT4gQG91dCBJbnQKKyAgJTUzID0gcGFydGlhbF9hcHBseSBbY2FsbGVlX2d1YXJhbnRlZWRdIFtvbl9zdGFja10gJTUyKCU1MCkgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gSW50KSAtPiBAb3V0IEludAorICAlNTUgPSBmdW5jdGlvbl9yZWYgQHRlc3RDbG9zdXJlVGh1bmtOb0VzY2FwZTIgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gQG91dCBJbnQpIC0+IEBvdXQgSW50CisgIGFwcGx5ICU1NSglNDgsICU1MykgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gQG91dCBJbnQpIC0+IEBvdXQgSW50CisgIGRlYWxsb2Nfc3RhY2sgJTUzIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gQG91dCBJbnQKKyAgZGVhbGxvY19zdGFjayAlNTAgOiAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiBJbnQKKyAgZGVhbGxvY19zdGFjayAlNDggOiAkKkludAorICAlZW1wdHkgPSB0dXBsZSAoKQorICByZXR1cm4gJWVtcHR5IDogJCgpCit9CmRpZmYgLS1naXQgYS90ZXN0L1NJTE9wdGltaXplci9pbm91dF9kZXNoYWRvd19pbnRlZ3JhdGlvbi5zd2lmdCBiL3Rlc3QvU0lMT3B0aW1pemVyL2lub3V0X2Rlc2hhZG93X2ludGVncmF0aW9uLnN3aWZ0CmluZGV4IGNiMjYzNzguLjYxNTkzMGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU0lMT3B0aW1pemVyL2lub3V0X2Rlc2hhZG93X2ludGVncmF0aW9uLnN3aWZ0CisrKyBiL3Rlc3QvU0lMT3B0aW1pemVyL2lub3V0X2Rlc2hhZG93X2ludGVncmF0aW9uLnN3aWZ0CkBAIC05NCw3ICs5NCw3IEBACiAKIC8vIENIRUNLLUxBQkVMOiBzaWwgaGlkZGVuIEAkczI2aW5vdXRfZGVzaGFkb3dfaW50ZWdyYXRpb24yNFN0cnVjdFdpdGhNdXRhdGluZ01ldGhvZFYwOG11dGF0aW5nRzB7e1tfMC05YS16QS1aXSp9fUYgOiAkQGNvbnZlbnRpb24obWV0aG9kKSAoQGlub3V0IFN0cnVjdFdpdGhNdXRhdGluZ01ldGhvZCkgLT4gKCkgewogLy8gQ0hFQ0stTk9UOiBhbGxvY19ib3gKLS8vIENIRUNLLU5PVDogYWxsb2Nfc3RhY2sKKy8vIENIRUNLLU5PVDogYWxsb2Nfc3RhY2sgJAogLy8gQ0hFQ0s6IH0KIAogLy8gQ0hFQ0stTEFCRUw6IHNpbCBoaWRkZW4gQCRzMjZpbm91dF9kZXNoYWRvd19pbnRlZ3JhdGlvbjI0U3RydWN0V2l0aE11dGF0aW5nTWV0aG9kVjI4dGVzdFN0YW5kYXJkTGlicmFyeU9wZXJhdG9yc3t7W18wLTlhLXpBLVpdKn19RiA6ICRAY29udmVudGlvbihtZXRob2QpIChAaW5vdXQgU3RydWN0V2l0aE11dGF0aW5nTWV0aG9kKSAtPiAoKSB7CmRpZmYgLS1naXQgYS90ZXN0L1NJTE9wdGltaXplci9tYW5kYXRvcnlfaW5saW5pbmcuc2lsIGIvdGVzdC9TSUxPcHRpbWl6ZXIvbWFuZGF0b3J5X2lubGluaW5nLnNpbAppbmRleCBkYjk5ZDY3Li42YWVlNmEwIDEwMDY0NAotLS0gYS90ZXN0L1NJTE9wdGltaXplci9tYW5kYXRvcnlfaW5saW5pbmcuc2lsCisrKyBiL3Rlc3QvU0lMT3B0aW1pemVyL21hbmRhdG9yeV9pbmxpbmluZy5zaWwKQEAgLTExODQsMyArMTE4NCwyMyBAQAogICAlMyA9IGFwcGx5ICUyKCkgOiAkQG5vZXNjYXBlICgpIC0+IEJ1aWx0aW4uSW50MzIKICAgcmV0dXJuICUzIDogJEJ1aWx0aW4uSW50MzIKIH0KKworLy8gQ0hFQ0stTEFCRUw6IHNpbCBAdGVzdF9ndWFyYW50ZWVkX29uX3N0YWNrX2Nsb3N1cmUKKy8vIENIRUNLOiAgc3Ryb25nX3JldGFpbiAlMCA6ICRDCisvLyBDSEVDSzogIFtbRjolLipdXSA9IGZ1bmN0aW9uX3JlZiBAdXNlX2MgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIEMpIC0+ICgpCisvLyBDSEVDSzogIGFwcGx5IFtbRl1dKCUwKSA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgQykgLT4gKCkKKy8vIENIRUNLOiAgc3Ryb25nX3JlbGVhc2UgJTAgOiAkQworLy8gQ0hFQ0stTk9UOiAgc3Ryb25nX3JlbGVhc2UKKy8vIENIRUNLOiByZXR1cm4KK3NpbCBAdGVzdF9ndWFyYW50ZWVkX29uX3N0YWNrX2Nsb3N1cmUgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIEMpIC0+ICAoKSB7CitiYjAoJTA6ICRDKToKKyAgc3Ryb25nX3JldGFpbiAlMCA6ICRDCisgICVjbG9zdXJlX2Z1biA9IGZ1bmN0aW9uX3JlZiBAZ3VhcmFudGVlZF9jbG9zdXJlX2Z1bmMgOiAkQGNvbnZlbnRpb24odGhpbikgKEBndWFyYW50ZWVkIEMpIC0+ICgpCisgICVjbG9zdXJlID0gcGFydGlhbF9hcHBseSBbb25fc3RhY2tdIFtjYWxsZWVfZ3VhcmFudGVlZF0gJWNsb3N1cmVfZnVuKCUwKSA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgQykgLT4gKCkKKyAgJWNsb3N1cmUyID0gbWFya19kZXBlbmRlbmNlICVjbG9zdXJlIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkgb24gJTAgOiAkQworICBhcHBseSAlY2xvc3VyZTIoKSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkICgpIC0+ICgpCisgIHN0cm9uZ19yZWxlYXNlICUwOiAkQworICBkZWFsbG9jX3N0YWNrICVjbG9zdXJlIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkKKyAgJXR1cGxlID0gdHVwbGUoKQorICByZXR1cm4gJXR1cGxlIDogJCgpCit9CmRpZmYgLS1naXQgYS90ZXN0L1NJTE9wdGltaXplci9wcmVkaWN0YWJsZV9kZWFkYWxsb2NfZWxpbS5zaWwgYi90ZXN0L1NJTE9wdGltaXplci9wcmVkaWN0YWJsZV9kZWFkYWxsb2NfZWxpbS5zaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0MGQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU0lMT3B0aW1pemVyL3ByZWRpY3RhYmxlX2RlYWRhbGxvY19lbGltLnNpbApAQCAtMCwwICsxLDI2NyBAQAorLy8gUlVOOiAldGFyZ2V0LXNpbC1vcHQgLWVuYWJsZS1zaWwtdmVyaWZ5LWFsbCAlcyAtcHJlZGljdGFibGUtZGVhZGFsbG9jLWVsaW0gfCAlRmlsZUNoZWNrICVzCisKK3NpbF9zdGFnZSBjYW5vbmljYWwKKworaW1wb3J0IFN3aWZ0CitpbXBvcnQgQnVpbHRpbgorCisvLyBDSEVDSy1MQUJFTDogc2lsIEBzaW1wbGVfdHJpdmlhbF9zdGFjayA6ICRAY29udmVudGlvbih0aGluKSAoQnVpbHRpbi5JbnQzMikgLT4gKCkgeworLy8gQ0hFQ0stTk9UOiBhbGxvY19zdGFjaworLy8gQ0hFQ0s6IH0gLy8gZW5kIHNpbCBmdW5jdGlvbiAnc2ltcGxlX3RyaXZpYWxfc3RhY2snCitzaWwgQHNpbXBsZV90cml2aWFsX3N0YWNrIDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyKSAtPiAoKSB7CitiYjAoJTAgOiAkQnVpbHRpbi5JbnQzMik6CisgICUxID0gYWxsb2Nfc3RhY2sgJEJ1aWx0aW4uSW50MzIKKyAgc3RvcmUgJTAgdG8gJTEgOiAkKkJ1aWx0aW4uSW50MzIKKyAgZGVhbGxvY19zdGFjayAlMSA6ICQqQnVpbHRpbi5JbnQzMgorICAlOTk5OSA9IHR1cGxlKCkKKyAgcmV0dXJuICU5OTk5IDogJCgpCit9CisKKy8vIENIRUNLLUxBQkVMOiBzaWwgQHNpbXBsZV90cml2aWFsX2luaXRfYm94IDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyKSAtPiAoKSB7CisvLyBDSEVDSy1OT1Q6IGFsbG9jX2JveAorLy8gQ0hFQ0s6IH0gLy8gZW5kIHNpbCBmdW5jdGlvbiAnc2ltcGxlX3RyaXZpYWxfaW5pdF9ib3gnCitzaWwgQHNpbXBsZV90cml2aWFsX2luaXRfYm94IDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyKSAtPiAoKSB7CitiYjAoJTAgOiAkQnVpbHRpbi5JbnQzMik6CisgICUxID0gYWxsb2NfYm94ICR7IHZhciBCdWlsdGluLkludDMyIH0KKyAgJTIgPSBwcm9qZWN0X2JveCAlMSA6ICR7IHZhciBCdWlsdGluLkludDMyIH0sIDAKKyAgc3RvcmUgJTAgdG8gJTIgOiAkKkJ1aWx0aW4uSW50MzIKKyAgc3Ryb25nX3JlbGVhc2UgJTEgOiAkeyB2YXIgQnVpbHRpbi5JbnQzMiB9CisgICU5OTk5ID0gdHVwbGUoKQorICByZXR1cm4gJTk5OTkgOiAkKCkKK30KKworLy8gQ0hFQ0stTEFCRUw6IHNpbCBAc2ltcGxlX3RyaXZpYWxfdW5pbml0X2JveCA6ICRAY29udmVudGlvbih0aGluKSAoQnVpbHRpbi5JbnQzMikgLT4gKCkgeworLy8gQ0hFQ0stTk9UOiBhbGxvY19ib3gKKy8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJ3NpbXBsZV90cml2aWFsX3VuaW5pdF9ib3gnCitzaWwgQHNpbXBsZV90cml2aWFsX3VuaW5pdF9ib3ggOiAkQGNvbnZlbnRpb24odGhpbikgKEJ1aWx0aW4uSW50MzIpIC0+ICgpIHsKK2JiMCglMCA6ICRCdWlsdGluLkludDMyKToKKyAgJTEgPSBhbGxvY19ib3ggJHsgdmFyIEJ1aWx0aW4uSW50MzIgfQorICAlMiA9IHByb2plY3RfYm94ICUxIDogJHsgdmFyIEJ1aWx0aW4uSW50MzIgfSwgMAorICBzdG9yZSAlMCB0byAlMiA6ICQqQnVpbHRpbi5JbnQzMgorICBkZWFsbG9jX2JveCAlMSA6ICR7IHZhciBCdWlsdGluLkludDMyIH0KKyAgJTk5OTkgPSB0dXBsZSgpCisgIHJldHVybiAlOTk5OSA6ICQoKQorfQorCisvLyBDSEVDSy1MQUJFTDogc2lsIEBzaW1wbGVfbm9udHJpdmlhbF9zdGFjayA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CisvLyBDSEVDSzogYmIwKFtbQVJHOiUuKl1dIDoKKy8vIENIRUNLLU5FWFQ6IHN0cm9uZ19yZWxlYXNlIFtbQVJHXV0KKy8vIENIRUNLLU5FWFQ6IHR1cGxlCisvLyBDSEVDSy1ORVhUOiByZXR1cm4KKy8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJ3NpbXBsZV9ub250cml2aWFsX3N0YWNrJworc2lsIEBzaW1wbGVfbm9udHJpdmlhbF9zdGFjayA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CitiYjAoJTAgOiAkQnVpbHRpbi5OYXRpdmVPYmplY3QpOgorICAlMSA9IGFsbG9jX3N0YWNrICRCdWlsdGluLk5hdGl2ZU9iamVjdAorICBzdG9yZSAlMCB0byAlMSA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgZGVzdHJveV9hZGRyICUxIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZWFsbG9jX3N0YWNrICUxIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICAlOTk5OSA9IHR1cGxlKCkKKyAgcmV0dXJuICU5OTk5IDogJCgpCit9CisKKy8vIFdlIGRvIG5vdCBoYW5kbGUgdGhpcyB0b2RheSwgc2luY2Ugd2UgZG8gbm90IHVuZGVyc3RhbmQgdGhhdCB3ZSBuZWVkIHRvIHRyZWF0CisvLyB0aGUgc3Ryb25nX3JlbGVhc2Ugb2YgdGhlIGFsbG9jX2JveCBhcyBhIGRlc3Ryb3lfYWRkciBvZiB0aGUgZW50aXJlIHZhbHVlLgorLy8KKy8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgdGhpcy4KKy8vCisvLyBDSEVDSy1MQUJFTDogc2lsIEBzaW1wbGVfbm9udHJpdmlhbF9pbml0X2JveCA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CisvLyBDSEVDSzogYWxsb2NfYm94CisvLyBDSEVDSzogfSAvLyBlbmQgc2lsIGZ1bmN0aW9uICdzaW1wbGVfbm9udHJpdmlhbF9pbml0X2JveCcKK3NpbCBAc2ltcGxlX25vbnRyaXZpYWxfaW5pdF9ib3ggOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBCdWlsdGluLk5hdGl2ZU9iamVjdCkgLT4gKCkgeworYmIwKCUwIDogJEJ1aWx0aW4uTmF0aXZlT2JqZWN0KToKKyAgJTEgPSBhbGxvY19ib3ggJHsgdmFyIEJ1aWx0aW4uTmF0aXZlT2JqZWN0IH0KKyAgJTIgPSBwcm9qZWN0X2JveCAlMSA6ICR7IHZhciBCdWlsdGluLk5hdGl2ZU9iamVjdCB9LCAwCisgIHN0b3JlICUwIHRvICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBzdHJvbmdfcmVsZWFzZSAlMSA6ICR7IHZhciBCdWlsdGluLk5hdGl2ZU9iamVjdCB9CisgICU5OTk5ID0gdHVwbGUoKQorICByZXR1cm4gJTk5OTkgOiAkKCkKK30KKworLy8gQ0hFQ0stTEFCRUw6IHNpbCBAc2ltcGxlX25vbnRyaXZpYWxfdW5pbml0X2JveCA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CisvLyBDSEVDSzogYmIwKFtbQVJHOiUuKl1dIDoKKy8vIENIRUNLLU5FWFQ6IHN0cm9uZ19yZWxlYXNlIFtbQVJHXV0KKy8vIENIRUNLLU5FWFQ6IHR1cGxlCisvLyBDSEVDSy1ORVhUOiByZXR1cm4KKy8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJ3NpbXBsZV9ub250cml2aWFsX3VuaW5pdF9ib3gnCitzaWwgQHNpbXBsZV9ub250cml2aWFsX3VuaW5pdF9ib3ggOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBCdWlsdGluLk5hdGl2ZU9iamVjdCkgLT4gKCkgeworYmIwKCUwIDogJEJ1aWx0aW4uTmF0aXZlT2JqZWN0KToKKyAgJTEgPSBhbGxvY19ib3ggJHsgdmFyIEJ1aWx0aW4uTmF0aXZlT2JqZWN0IH0KKyAgJTIgPSBwcm9qZWN0X2JveCAlMSA6ICR7IHZhciBCdWlsdGluLk5hdGl2ZU9iamVjdCB9LCAwCisgIHN0b3JlICUwIHRvICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZXN0cm95X2FkZHIgJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIGRlYWxsb2NfYm94ICUxIDogJHsgdmFyIEJ1aWx0aW4uTmF0aXZlT2JqZWN0IH0KKyAgJTk5OTkgPSB0dXBsZSgpCisgIHJldHVybiAlOTk5OSA6ICQoKQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFzc2lnbiBUZXN0cyAvLworLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIE1ha2Ugc3VyZSB0aGF0IHdlIGRvIGVsaW1pbmF0ZSB0aGlzIGFsbG9jYXRpb24KKy8vIENIRUNLLUxBQkVMOiBzaWwgQHNpbXBsZV9hc3NpZ25fdGFrZV90cml2aWFsIDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyLCBAaW4gQnVpbHRpbi5JbnQzMikgLT4gKCkgeworLy8gQ0hFQ0stTk9UOiBhbGxvY19zdGFjaworLy8gQ0hFQ0s6IH0gLy8gZW5kIHNpbCBmdW5jdGlvbiAnc2ltcGxlX2Fzc2lnbl90YWtlX3RyaXZpYWwnCitzaWwgQHNpbXBsZV9hc3NpZ25fdGFrZV90cml2aWFsIDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyLCBAaW4gQnVpbHRpbi5JbnQzMikgLT4gKCkgeworYmIwKCUwIDogJEJ1aWx0aW4uSW50MzIsICUxIDogJCpCdWlsdGluLkludDMyKToKKyAgJTIgPSBhbGxvY19zdGFjayAkQnVpbHRpbi5JbnQzMgorICBzdG9yZSAlMCB0byAlMiA6ICQqQnVpbHRpbi5JbnQzMgorICBjb3B5X2FkZHIgW3Rha2VdICUxIHRvICUyIDogJCpCdWlsdGluLkludDMyCisgIGRlYWxsb2Nfc3RhY2sgJTIgOiAkKkJ1aWx0aW4uSW50MzIKKyAgJTk5OTkgPSB0dXBsZSgpCisgIHJldHVybiAlOTk5OSA6ICQoKQorfQorCisvLyBJbiB0aGlzIGNhc2UsIHdlIHBlcmZvcm0gYW4gaW5pdCwgY29weS4gU2luY2Ugd2UgZG8gbm90IHdhbnQgdG8gbG9zZSB0aGUgKzEKKy8vIG9uIHRoZSBhcmd1bWVudCwgd2UgZG8gbm90IGVsaW1pbmF0ZSB0aGlzIChldmVuIHRob3VnaCB3aXRoIHRpbWUgcGVyaGFwcyB3ZQorLy8gY291bGQpLgorLy8gQ0hFQ0stTEFCRUw6IHNpbCBAc2ltcGxlX2luaXRfY29weSA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0LCBAaW5fZ3VhcmFudGVlZCBCdWlsdGluLk5hdGl2ZU9iamVjdCkgLT4gKCkgeworLy8gQ0hFQ0s6IGFsbG9jX3N0YWNrCisvLyBDSEVDSzogY29weV9hZGRyCisvLyBDSEVDSzogfSAvLyBlbmQgc2lsIGZ1bmN0aW9uICdzaW1wbGVfaW5pdF9jb3B5Jworc2lsIEBzaW1wbGVfaW5pdF9jb3B5IDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgQnVpbHRpbi5OYXRpdmVPYmplY3QsIEBpbl9ndWFyYW50ZWVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CitiYjAoJTAgOiAkQnVpbHRpbi5OYXRpdmVPYmplY3QsICUxIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdCk6CisgICUyID0gYWxsb2Nfc3RhY2sgJEJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIHN0b3JlICUwIHRvICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZXN0cm95X2FkZHIgJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIGNvcHlfYWRkciAlMSB0byBbaW5pdGlhbGl6YXRpb25dICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZXN0cm95X2FkZHIgJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIGRlYWxsb2Nfc3RhY2sgJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgICU5OTk5ID0gdHVwbGUoKQorICByZXR1cm4gJTk5OTkgOiAkKCkKK30KKworLy8gVGhpcyB3ZSBjYW4gcHJvbW90ZSBzdWNjZXNzZnVsbHkuCisvLyBDSEVDSy1MQUJFTDogc2lsIEBzaW1wbGVfaW5pdF90YWtlIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgQnVpbHRpbi5OYXRpdmVPYmplY3QsIEBpbiBCdWlsdGluLk5hdGl2ZU9iamVjdCkgLT4gKCkgeworLy8gQ0hFQ0s6IGJiMChbW0FSRzA6JS4qXV0gOiAkQnVpbHRpbi5OYXRpdmVPYmplY3QsIFtbQVJHMTolLipdXSA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QpOgorLy8gQ0hFQ0stTk9UOiBhbGxvY19zdGFjaworLy8gQ0hFQ0s6ICBzdHJvbmdfcmVsZWFzZSBbW0FSRzBdXQorLy8gQ0hFQ0s6ICBbW0FSRzFfTE9BREVEOiUuKl1dID0gbG9hZCBbW0FSRzFdXQorLy8gQ0hFQ0s6ICBzdHJvbmdfcmVsZWFzZSBbW0FSRzFfTE9BREVEXV0KKy8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJ3NpbXBsZV9pbml0X3Rha2UnCitzaWwgQHNpbXBsZV9pbml0X3Rha2UgOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBCdWlsdGluLk5hdGl2ZU9iamVjdCwgQGluIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CitiYjAoJTAgOiAkQnVpbHRpbi5OYXRpdmVPYmplY3QsICUxIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdCk6CisgICUyID0gYWxsb2Nfc3RhY2sgJEJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIHN0b3JlICUwIHRvICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZXN0cm95X2FkZHIgJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIGNvcHlfYWRkciBbdGFrZV0gJTEgdG8gW2luaXRpYWxpemF0aW9uXSAlMiA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgZGVzdHJveV9hZGRyICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZWFsbG9jX3N0YWNrICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICAlOTk5OSA9IHR1cGxlKCkKKyAgcmV0dXJuICU5OTk5IDogJCgpCit9CisKKy8vIFNpbmNlIHdlIGFyZSBjb3B5aW5nIHRoZSBpbnB1dCBhcmd1bWVudCwgd2UgY2FuIG5vdCBnZXQgcmlkIG9mIHRoZSBjb3B5X2FkZHIsCisvLyBtZWFuaW5nIHdlIHNob3VsZG4ndCBlbGltaW5hdGUgdGhlIGFsbG9jYXRpb24gaGVyZS4KKy8vIENIRUNLLUxBQkVMOiBzaWwgQHNpbXBsZV9hc3NpZ25fbm9fdGFrZSA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0LCBAaW5fZ3VhcmFudGVlZCBCdWlsdGluLk5hdGl2ZU9iamVjdCkgLT4gKCkgeworLy8gQ0hFQ0s6IGFsbG9jX3N0YWNrCisvLyBDSEVDSzogY29weV9hZGRyCisvLyBDSEVDSzogfSAvLyBlbmQgc2lsIGZ1bmN0aW9uICdzaW1wbGVfYXNzaWduX25vX3Rha2UnCitzaWwgQHNpbXBsZV9hc3NpZ25fbm9fdGFrZSA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0LCBAaW5fZ3VhcmFudGVlZCBCdWlsdGluLk5hdGl2ZU9iamVjdCkgLT4gKCkgeworYmIwKCUwIDogJEJ1aWx0aW4uTmF0aXZlT2JqZWN0LCAlMSA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QpOgorICAlMiA9IGFsbG9jX3N0YWNrICRCdWlsdGluLk5hdGl2ZU9iamVjdAorICBzdG9yZSAlMCB0byAlMiA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgY29weV9hZGRyICUxIHRvICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZXN0cm95X2FkZHIgJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIGRlYWxsb2Nfc3RhY2sgJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgICU5OTk5ID0gdHVwbGUoKQorICByZXR1cm4gJTk5OTkgOiAkKCkKK30KKworLy8gSWYgUE1PIHVuZGVyc3Rvb2QgaG93IHRvIHByb21vdGUgYXNzaWducywgd2Ugc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIHRoaXMKKy8vIGNhc2UuCisvLyBDSEVDSy1MQUJFTDogc2lsIEBzaW1wbGVfYXNzaWduX3Rha2UgOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBCdWlsdGluLk5hdGl2ZU9iamVjdCwgQGluIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CisvLyBDSEVDSzogYWxsb2Nfc3RhY2sKKy8vIENIRUNLOiBjb3B5X2FkZHIKKy8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJ3NpbXBsZV9hc3NpZ25fdGFrZScKK3NpbCBAc2ltcGxlX2Fzc2lnbl90YWtlIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgQnVpbHRpbi5OYXRpdmVPYmplY3QsIEBpbiBCdWlsdGluLk5hdGl2ZU9iamVjdCkgLT4gKCkgeworYmIwKCUwIDogJEJ1aWx0aW4uTmF0aXZlT2JqZWN0LCAlMSA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QpOgorICAlMiA9IGFsbG9jX3N0YWNrICRCdWlsdGluLk5hdGl2ZU9iamVjdAorICBzdG9yZSAlMCB0byAlMiA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgY29weV9hZGRyIFt0YWtlXSAlMSB0byAlMiA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgZGVzdHJveV9hZGRyICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZWFsbG9jX3N0YWNrICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICAlOTk5OSA9IHR1cGxlKCkKKyAgcmV0dXJuICU5OTk5IDogJCgpCit9CisKKy8vIENIRUNLLUxBQkVMOiBzaWwgQHNpbXBsZV9kaWFtb25kX3dpdGhvdXRfYXNzaWduIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgQnVpbHRpbi5OYXRpdmVPYmplY3QpIC0+ICgpIHsKKy8vIENIRUNLOiBiYjAoW1tBUkc6JS4qXV0gOgorLy8gQ0hFQ0stTk9UOiBhbGxvY19zdGFjaworLy8gQ0hFQ0stTk9UOiBzdG9yZQorLy8gQ0hFQ0s6IGJiMzoKKy8vIENIRUNLLU5FWFQ6IHN0cm9uZ19yZWxlYXNlIFtbQVJHXV0KKy8vIENIRUNLOiB9IC8vIGVuZCBzaWwgZnVuY3Rpb24gJ3NpbXBsZV9kaWFtb25kX3dpdGhvdXRfYXNzaWduJworc2lsIEBzaW1wbGVfZGlhbW9uZF93aXRob3V0X2Fzc2lnbiA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CitiYjAoJTAgOiAkQnVpbHRpbi5OYXRpdmVPYmplY3QpOgorICAlMSA9IGFsbG9jX3N0YWNrICRCdWlsdGluLk5hdGl2ZU9iamVjdAorICBzdG9yZSAlMCB0byAlMSA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgY29uZF9iciB1bmRlZiwgYmIxLCBiYjIKKworYmIxOgorICBiciBiYjMKKworYmIyOgorICBiciBiYjMKKworYmIzOgorICBkZXN0cm95X2FkZHIgJTEgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIGRlYWxsb2Nfc3RhY2sgJTEgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgICU5OTk5ID0gdHVwbGUoKQorICByZXR1cm4gJTk5OTkgOiAkKCkKK30KKworLy8gV2Ugc2hvdWxkIG5vdCBwcm9tb3RlIHRoaXMgZHVlIHRvIHRoaXMgYmVpbmcgYW4gYXNzaWduIHRvICUyLgorLy8gQ0hFQ0stTEFCRUw6IHNpbCBAc2ltcGxlX2RpYW1vbmRfd2l0aF9hc3NpZ24gOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBCdWlsdGluLk5hdGl2ZU9iamVjdCwgQGluX2d1YXJhbnRlZWQgQnVpbHRpbi5OYXRpdmVPYmplY3QpIC0+ICgpIHsKKy8vIENIRUNLOiBhbGxvY19zdGFjaworLy8gQ0hFQ0s6IGNvcHlfYWRkcgorLy8gQ0hFQ0s6IH0gLy8gZW5kIHNpbCBmdW5jdGlvbiAnc2ltcGxlX2RpYW1vbmRfd2l0aF9hc3NpZ24nCitzaWwgQHNpbXBsZV9kaWFtb25kX3dpdGhfYXNzaWduIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgQnVpbHRpbi5OYXRpdmVPYmplY3QsIEBpbl9ndWFyYW50ZWVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CitiYjAoJTAgOiAkQnVpbHRpbi5OYXRpdmVPYmplY3QsICUxIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdCk6CisgICUyID0gYWxsb2Nfc3RhY2sgJEJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIHN0b3JlICUwIHRvICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBjb25kX2JyIHVuZGVmLCBiYjEsIGJiMgorCitiYjE6CisgIGNvcHlfYWRkciBbdGFrZV0gJTEgdG8gJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIGJyIGJiMworCitiYjI6CisgIGJyIGJiMworCitiYjM6CisgIGRlc3Ryb3lfYWRkciAlMiA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgZGVhbGxvY19zdGFjayAlMiA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgJTk5OTkgPSB0dXBsZSgpCisgIHJldHVybiAlOTk5OSA6ICQoKQorfQorCisvLyBUb2RheSBQTU8gY2FuIG5vdCBoYW5kbGUgZGlmZmVyZW50IGF2YWlsYWJsZSB2YWx1ZXMgY29taW5nIGZyb20gZGlmZmVyZW50CisvLyBCQnMuIFdpdGggdGltZSBpdCBjYW4gYmUgdGF1Z2h0IHRvIGRvIHRoYXQgaWYgbmVjZXNzYXJ5LiBUaGF0IGJlaW5nIHNhaWQsCisvLyB0aGlzIHRlc3Qgc2hvd3MgdGhhdCB3ZSAvdHJpZWQvIGFuZCBmYWlsZWQgd2l0aCB0aGUgYXZhaWxhYmxlIHZhbHVlIHRlc3QKKy8vIGluc3RlYWQgb2YgZmFpbGluZyBlYXJsaWVyIGR1ZSB0byB0aGUgY29weV9hZGRyIGJlaW5nIGFuIGFzc2lnbiBzaW5jZSB3ZQorLy8gZXhwbG9kZSB0aGUgY29weV9hZGRyLgorLy8gQ0hFQ0stTEFCRUw6IHNpbCBAc2ltcGxlX2RpYW1vbmRfd2l0aF9hc3NpZ25fcmVtb3ZlIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgQnVpbHRpbi5OYXRpdmVPYmplY3QsIEBpbl9ndWFyYW50ZWVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0KSAtPiAoKSB7CisvLyBDSEVDSzogYWxsb2Nfc3RhY2sKKy8vIENIRUNLLU5PVDogY29weV9hZGRyCisvLyBDSEVDSzogfSAvLyBlbmQgc2lsIGZ1bmN0aW9uICdzaW1wbGVfZGlhbW9uZF93aXRoX2Fzc2lnbl9yZW1vdmUnCitzaWwgQHNpbXBsZV9kaWFtb25kX3dpdGhfYXNzaWduX3JlbW92ZSA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEJ1aWx0aW4uTmF0aXZlT2JqZWN0LCBAaW5fZ3VhcmFudGVlZCBCdWlsdGluLk5hdGl2ZU9iamVjdCkgLT4gKCkgeworYmIwKCUwIDogJEJ1aWx0aW4uTmF0aXZlT2JqZWN0LCAlMSA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QpOgorICAlMiA9IGFsbG9jX3N0YWNrICRCdWlsdGluLk5hdGl2ZU9iamVjdAorICBzdG9yZSAlMCB0byAlMiA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgY29uZF9iciB1bmRlZiwgYmIxLCBiYjIKKworYmIxOgorICBkZXN0cm95X2FkZHIgJTIgOiAkKkJ1aWx0aW4uTmF0aXZlT2JqZWN0CisgIGNvcHlfYWRkciBbdGFrZV0gJTEgdG8gW2luaXRpYWxpemF0aW9uXSAlMiA6ICQqQnVpbHRpbi5OYXRpdmVPYmplY3QKKyAgYnIgYmIzCisKK2JiMjoKKyAgYnIgYmIzCisKK2JiMzoKKyAgZGVzdHJveV9hZGRyICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICBkZWFsbG9jX3N0YWNrICUyIDogJCpCdWlsdGluLk5hdGl2ZU9iamVjdAorICAlOTk5OSA9IHR1cGxlKCkKKyAgcmV0dXJuICU5OTk5IDogJCgpCit9CmRpZmYgLS1naXQgYS90ZXN0L1NJTE9wdGltaXplci9wcmVkaWN0YWJsZV9tZW1vcHQuc2lsIGIvdGVzdC9TSUxPcHRpbWl6ZXIvcHJlZGljdGFibGVfbWVtb3B0LnNpbAppbmRleCA0MDdiZWFjLi42M2Y2MTU0IDEwMDY0NAotLS0gYS90ZXN0L1NJTE9wdGltaXplci9wcmVkaWN0YWJsZV9tZW1vcHQuc2lsCisrKyBiL3Rlc3QvU0lMT3B0aW1pemVyL3ByZWRpY3RhYmxlX21lbW9wdC5zaWwKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICV0YXJnZXQtc2lsLW9wdCAtZW5hYmxlLXNpbC12ZXJpZnktYWxsICVzIC1wcmVkaWN0YWJsZS1tZW1vcHQgIHwgJUZpbGVDaGVjayAlcworLy8gUlVOOiAldGFyZ2V0LXNpbC1vcHQgLWVuYWJsZS1zaWwtdmVyaWZ5LWFsbCAlcyAtcHJlZGljdGFibGUtbWVtYWNjZXNzLW9wdHMgLXByZWRpY3RhYmxlLWRlYWRhbGxvYy1lbGltICB8ICVGaWxlQ2hlY2sgJXMKIAogaW1wb3J0IEJ1aWx0aW4KIGltcG9ydCBTd2lmdApkaWZmIC0tZ2l0IGEvdGVzdC9TSUxPcHRpbWl6ZXIvc2lsX2NvbWJpbmVfYXBwbHkuc2lsIGIvdGVzdC9TSUxPcHRpbWl6ZXIvc2lsX2NvbWJpbmVfYXBwbHkuc2lsCmluZGV4IGVkM2MyNWMuLjRjOWE1NGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvU0lMT3B0aW1pemVyL3NpbF9jb21iaW5lX2FwcGx5LnNpbAorKysgYi90ZXN0L1NJTE9wdGltaXplci9zaWxfY29tYmluZV9hcHBseS5zaWwKQEAgLTU3MSwzICs1NzEsNjggQEAKICAgJTk5OSA9IHR1cGxlICgpCiAgIHJldHVybiAlOTk5IDogJCgpCiB9CisKKy8vIENIRUNLLUxBQkVMOiBzaWwgc2hhcmVkIEBhcHBsaWVkX29uX3N0YWNrIDogJEBjb252ZW50aW9uKHRoaW4pICgpIC0+ICgpIHsKKy8vIENIRUNLOiBiYjA6CisvLyBDSEVDSzogICBbW0Y6JS4qXV0gPSBmdW5jdGlvbl9yZWYgQGluZGlyZWN0Q2xvc3VyZSA6ICRAY29udmVudGlvbih0aGluKSAoQGluIEJ1aWx0aW4uSW50NjQpIC0+IEBvdXQgQnVpbHRpbi5JbnQ2NAorLy8gQ0hFQ0s6ICAgW1tTVEs6JS4qXV0gPSBhbGxvY19zdGFjayAkQnVpbHRpbi5JbnQ2NAorLy8gQ0hFQ0s6ICAgW1tTVEsyOiUuKl1dID0gYWxsb2Nfc3RhY2sgJEJ1aWx0aW4uSW50NjQKKy8vIENIRUNLOiAgIFtbSTolLipdXSA9IGludGVnZXJfbGl0ZXJhbCAkQnVpbHRpbi5JbnQ2NCwgMworLy8gQ0hFQ0s6ICAgc3RvcmUgW1tJXV0gdG8gW1tTVEsyXV0gOiAkKkJ1aWx0aW4uSW50NjQKKy8vIENIRUNLOiAgIGFwcGx5IFtbRl1dKFtbU1RLXV0sIFtbU1RLMl1dKSA6ICRAY29udmVudGlvbih0aGluKSAoQGluIEJ1aWx0aW4uSW50NjQpIC0+IEBvdXQgQnVpbHRpbi5JbnQ2NAorLy8gQ0hFQ0s6ICAgZGVhbGxvY19zdGFjayBbW1NUSzJdXSA6ICQqQnVpbHRpbi5JbnQ2NAorLy8gQ0hFQ0s6ICAgZGVhbGxvY19zdGFjayBbW1NUS11dIDogJCpCdWlsdGluLkludDY0CisvLyBDSEVDSzogICByZXR1cm4gJTggOiAkKCkKKworc2lsIHNoYXJlZCBAYXBwbGllZF9vbl9zdGFjayA6ICRAY29udmVudGlvbih0aGluKSAoKSAtPiAoKSB7CitiYjA6CisgICVmbiA9IGZ1bmN0aW9uX3JlZiBAaW5kaXJlY3RDbG9zdXJlIDogJEBjb252ZW50aW9uKHRoaW4pIChAaW4gQnVpbHRpbi5JbnQ2NCkgLT4gQG91dCBCdWlsdGluLkludDY0CisgICVwYSA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdICVmbigpIDogJEBjb252ZW50aW9uKHRoaW4pIChAaW4gQnVpbHRpbi5JbnQ2NCkgLT4gQG91dCBCdWlsdGluLkludDY0CisgICVvdXQgPSBhbGxvY19zdGFjayAkQnVpbHRpbi5JbnQ2NAorICAlaW4gPSBhbGxvY19zdGFjayAkQnVpbHRpbi5JbnQ2NAorICAlYzMgPSBpbnRlZ2VyX2xpdGVyYWwgJEJ1aWx0aW4uSW50NjQsIDMKKyAgc3RvcmUgJWMzIHRvICVpbiA6ICQqQnVpbHRpbi5JbnQ2NAorICAlY2FsbCA9IGFwcGx5ICVwYSglb3V0LCAlaW4pIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKEBpbiBCdWlsdGluLkludDY0KSAtPiBAb3V0IEJ1aWx0aW4uSW50NjQKKyAgZGVhbGxvY19zdGFjayAlaW4gOiAkKkJ1aWx0aW4uSW50NjQKKyAgZGVhbGxvY19zdGFjayAlb3V0IDogJCpCdWlsdGluLkludDY0CisgIGRlYWxsb2Nfc3RhY2sgJXBhIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKEBpbiBCdWlsdGluLkludDY0KSAtPiBAb3V0IEJ1aWx0aW4uSW50NjQKKyAgJTk5OSA9IHR1cGxlICgpCisgIHJldHVybiAlOTk5IDogJCgpCit9CisKK3NpbCBAZ3VhcmFudGVlZF9jbG9zdXJlX3Rocm93czIgOiAkQGNvbnZlbnRpb24odGhpbikgKEJ1aWx0aW4uSW50MzIsIEBndWFyYW50ZWVkIEMpIC0+IEBlcnJvciBFcnJvcgorCisvLyBDSEVDSy1MQUJFTDogc2lsIEB0ZXN0X2d1YXJhbnRlZWRfY2xvc3VyZV90cnlfYXBwbHlfb25fc3RhY2sKKy8vIENIRUNLOiBiYjAKKy8vIENIRUNLOiBzdHJvbmdfcmV0YWluCisvLyBDSEVDSzogc3Ryb25nX3JldGFpbgorLy8gQ0hFQ0s6IHRyeV9hcHBseQorLy8gQ0hFQ0s6IGJiMQorLy8gQ0hFQ0s6IHN0cm9uZ19yZWxlYXNlCisvLyBDSEVDSzogc3Ryb25nX3JlbGVhc2UKKy8vIENIRUNLOiBiciBiYjMKKy8vIENIRUNLOiBiYjIKKy8vIENIRUNLOiBzdHJvbmdfcmVsZWFzZQorLy8gQ0hFQ0s6IHN0cm9uZ19yZWxlYXNlCisvLyBDSEVDSzogYnIgYmIzCitzaWwgQHRlc3RfZ3VhcmFudGVlZF9jbG9zdXJlX3RyeV9hcHBseV9vbl9zdGFjayA6ICRAY29udmVudGlvbih0aGluKSAoQGd1YXJhbnRlZWQgQywgQnVpbHRpbi5JbnQzMikgLT4gICgpIHsKK2JiMCglMDogJEMsICUxOiAkQnVpbHRpbi5JbnQzMik6CisgIHN0cm9uZ19yZXRhaW4gJTAgOiAkQworICAlY2xvc3VyZV9mdW4gPSBmdW5jdGlvbl9yZWYgQGd1YXJhbnRlZWRfY2xvc3VyZV90aHJvd3MyIDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyLCBAZ3VhcmFudGVlZCBDKSAtPiBAZXJyb3IgRXJyb3IKKyAgJWNsb3N1cmUgPSBwYXJ0aWFsX2FwcGx5IFtjYWxsZWVfZ3VhcmFudGVlZF0gW29uX3N0YWNrXSAlY2xvc3VyZV9mdW4oJTApIDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDMyLCBAZ3VhcmFudGVlZCBDKSAtPiBAZXJyb3IgRXJyb3IKKyAgdHJ5X2FwcGx5ICVjbG9zdXJlKCUxKSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkIChCdWlsdGluLkludDMyKSAtPiBAZXJyb3IgRXJyb3IsIG5vcm1hbCBiYjcsIGVycm9yIGJiMTEKKworYmI3KCVjYWxscmV0IDogJCgpKToKKwlkZWFsbG9jX3N0YWNrICVjbG9zdXJlIDogJEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKEJ1aWx0aW4uSW50MzIpIC0+IEBlcnJvciBFcnJvcgorCXN0cm9uZ19yZWxlYXNlICUwOiAkQworICBiciBiYjk5CisKK2JiMTEoJTEyOCA6ICRFcnJvcik6CisJZGVhbGxvY19zdGFjayAlY2xvc3VyZSA6ICRAbm9lc2NhcGUgQGNhbGxlZV9ndWFyYW50ZWVkIChCdWlsdGluLkludDMyKSAtPiBAZXJyb3IgRXJyb3IKKwlzdHJvbmdfcmVsZWFzZSAlMDogJEMKKyAgYnIgYmI5OQorCitiYjk5OgorICAldCA9IHR1cGxlKCkKKyAgcmV0dXJuICV0IDogJCgpCit9CmRpZmYgLS1naXQgYS90ZXN0L1NJTE9wdGltaXplci9zaW1wbGlmeV9jZmcuc2lsIGIvdGVzdC9TSUxPcHRpbWl6ZXIvc2ltcGxpZnlfY2ZnLnNpbAppbmRleCBiYTZjYmU4Li5mNDU4YTM0IDEwMDY0NAotLS0gYS90ZXN0L1NJTE9wdGltaXplci9zaW1wbGlmeV9jZmcuc2lsCisrKyBiL3Rlc3QvU0lMT3B0aW1pemVyL3NpbXBsaWZ5X2NmZy5zaWwKQEAgLTI0ODMsMTAgKzI0ODMsMTIgQEAKIHNpbCBAbm9uX3Rocm93aW5nX2Nsb3N1cmUgOiAkQGNvbnZlbnRpb24odGhpbikgKEludCkgLT4gSW50CiAKIC8vIENIRUNLLUxBQkVMOiBzaWwgQHJlcGxhY2VfdHJ5X2FwcGx5X3dpdGhfYXBwbHkKLS8vIENIRUNLOiBbW1I6JVswLTldK11dID0gYXBwbHkgW25vdGhyb3ddICUwKCV7e1swLTldK319KSA6ICRAY29udmVudGlvbih0aGluKSAoQG93bmVkIEBjYWxsZWVfb3duZWQgKEludCkgLT4gKEludCwgQGVycm9yIEVycm9yKSkgLT4gKEludCwgQGVycm9yIEVycm9yKQorLy8gQ0hFQ0s6IFtbUjolWzAtOV0rXV0gPSBhcHBseSBbbm90aHJvd10gJTEoJXt7WzAtOV0rfX0pIDogJEBjb252ZW50aW9uKHRoaW4pIChAb3duZWQgQGNhbGxlZV9vd25lZCAoSW50KSAtPiAoSW50LCBAZXJyb3IgRXJyb3IpKSAtPiAoSW50LCBAZXJyb3IgRXJyb3IpCisvLyBDSEVDSy1ORVhUOiBkZWFsbG9jX3N0YWNrCiAvLyBDSEVDSy1ORVhUOiByZXR1cm4gW1tSXV0gOiAkSW50CiBzaWwgQHJlcGxhY2VfdHJ5X2FwcGx5X3dpdGhfYXBwbHkgOiAkQGNvbnZlbnRpb24odGhpbikgKCkgLT4gSW50IHsKIGJiMDoKKyAgJWFzID0gYWxsb2Nfc3RhY2sgJEJ1aWx0aW4uSW50MzIKICAgJTAgPSBmdW5jdGlvbl9yZWYgQHJldGhyb3dfZnVuY3Rpb24gOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBAY2FsbGVlX293bmVkIChJbnQpIC0+IChJbnQsIEBlcnJvciBFcnJvcikpIC0+IChJbnQsIEBlcnJvciBFcnJvcikKICAgJTEgPSBmdW5jdGlvbl9yZWYgQG5vbl90aHJvd2luZ19jbG9zdXJlIDogJEBjb252ZW50aW9uKHRoaW4pIChJbnQpIC0+IEludAogICAlMiA9IHRoaW5fdG9fdGhpY2tfZnVuY3Rpb24gJTEgOiAkQGNvbnZlbnRpb24odGhpbikgKEludCkgLT4gSW50IHRvICRAY2FsbGVlX293bmVkIChJbnQpIC0+IEludApAQCAtMjQ5NCw5ICsyNDk2LDExIEBACiAgIHRyeV9hcHBseSAlMCglMykgOiAkQGNvbnZlbnRpb24odGhpbikgKEBvd25lZCBAY2FsbGVlX293bmVkIChJbnQpIC0+IChJbnQsIEBlcnJvciBFcnJvcikpIC0+IChJbnQsIEBlcnJvciBFcnJvciksIG5vcm1hbCBiYjEsIGVycm9yIGJiMgogCiBiYjEoJTUgOiAkSW50KToKKyAgZGVhbGxvY19zdGFjayAlYXM6ICQqQnVpbHRpbi5JbnQzMgogICByZXR1cm4gJTUgOiAkSW50CiAKIGJiMiglOCA6ICRFcnJvcik6CisgIGRlYWxsb2Nfc3RhY2sgJWFzOiAkKkJ1aWx0aW4uSW50MzIKICAgdW5yZWFjaGFibGUKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TYW5pdGl6ZXJzL2FzYW4uc3dpZnQgYi90ZXN0L1Nhbml0aXplcnMvYXNhbi5zd2lmdAppbmRleCA5NzY4ZmE3Li42ODMzNGY2IDEwMDY0NAotLS0gYS90ZXN0L1Nhbml0aXplcnMvYXNhbi5zd2lmdAorKysgYi90ZXN0L1Nhbml0aXplcnMvYXNhbi5zd2lmdApAQCAtNCw2ICs0LDkgQEAKIC8vIFJFUVVJUkVTOiBleGVjdXRhYmxlX3Rlc3QKIC8vIFJFUVVJUkVTOiBhc2FuX3J1bnRpbWUKIAorLy8gcmRhcjovL3Byb2JsZW0vNDczNjc2OTQgdHJhY2tzIHJlLWVuYWJsaW5nIHRoaXMgdGVzdCBmb3IgYmFja3dhcmQgZGVwbG95bWVudC4KKy8vIFVOU1VQUE9SVEVEOiByZW1vdGVfcnVuCisKIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gaGFuZGxlIHN3aWZ0ZXJyb3IuIExMVk0ncyBhZGRyZXNzIHNhbml0aXplciBwYXNzIG5lZWRzIHRvCiAvLyBpZ25vcmUgc3dpZnRlcnJvciBhZGRyZXNzZXMuCiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2FuaXRpemVycy90c2FuLnN3aWZ0IGIvdGVzdC9TYW5pdGl6ZXJzL3RzYW4uc3dpZnQKaW5kZXggYTljZmU5Zi4uNTEyYmVmMiAxMDA2NDQKLS0tIGEvdGVzdC9TYW5pdGl6ZXJzL3RzYW4uc3dpZnQKKysrIGIvdGVzdC9TYW5pdGl6ZXJzL3RzYW4uc3dpZnQKQEAgLTQsNiArNCw3IEBACiAvLyBSRVFVSVJFUzogZXhlY3V0YWJsZV90ZXN0CiAvLyBSRVFVSVJFUzogdHNhbl9ydW50aW1lCiAvLyBVTlNVUFBPUlRFRDogT1M9dHZvcworLy8gVU5TVVBQT1JURUQ6IENQVT1wb3dlcnBjNjRsZQogCiAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgY292ZXJlZCBieSAidHNhbl9ydW50aW1lIjsgb2xkZXIgdmVyc2lvbnMgb2YgQXBwbGUgT1NzCiAvLyBkb24ndCBzdXBwb3J0IFRTYW4uCmRpZmYgLS1naXQgYS90ZXN0L1NlcmlhbGl6YXRpb24vc2lsX3BhcnRpYWxfYXBwbHlfb3duZXJzaGlwLnNpbCBiL3Rlc3QvU2VyaWFsaXphdGlvbi9zaWxfcGFydGlhbF9hcHBseV9vd25lcnNoaXAuc2lsCmluZGV4IDIyMWQyYWUuLmFjNmVmMzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VyaWFsaXphdGlvbi9zaWxfcGFydGlhbF9hcHBseV9vd25lcnNoaXAuc2lsCisrKyBiL3Rlc3QvU2VyaWFsaXphdGlvbi9zaWxfcGFydGlhbF9hcHBseV9vd25lcnNoaXAuc2lsCkBAIC02MiwzICs2MiwxNyBAQAogICAldCA9IHR1cGxlICgpCiAgIHJldHVybiAldCA6ICQoKQogfQorCisvLyBDSEVDSy1MQUJFTDogc2lsIEBwYXJ0aWFsX2FwcGx5X29uX3N0YWNrCisvLyBDSEVDSzogIHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdICV7ey4qfX0gOiAkQGNvbnZlbnRpb24odGhpbikgKEJ1aWx0aW4uSW50NjQpIC0+ICgpCitzaWwgQHBhcnRpYWxfYXBwbHlfb25fc3RhY2sgOiAkQGNvbnZlbnRpb24odGhpbikgKCkgLT4gKCkgeworZW50cnk6CisgICVmID0gZnVuY3Rpb25fcmVmIEBzdWJqZWN0IDogJEBjb252ZW50aW9uKHRoaW4pIChCdWlsdGluLkludDY0KSAtPiAoKQorICAleiA9IGludGVnZXJfbGl0ZXJhbCAkQnVpbHRpbi5JbnQ2NCwgMAorICAlYyA9IHBhcnRpYWxfYXBwbHkgW2NhbGxlZV9ndWFyYW50ZWVkXSBbb25fc3RhY2tdICVmKCV6KSA6ICRAY29udmVudGlvbih0aGluKSAoQnVpbHRpbi5JbnQ2NCkgLT4gKCkKKyAgJWYyID0gZnVuY3Rpb25fcmVmIEB1c2UgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkpIC0+ICgpCisgIGFwcGx5ICVmMiglYykgOiAkQGNvbnZlbnRpb24odGhpbikgKEBub2VzY2FwZSBAY2FsbGVlX2d1YXJhbnRlZWQgKCkgLT4gKCkpIC0+ICgpCisgIGRlYWxsb2Nfc3RhY2sgJWMgOiAkQG5vZXNjYXBlIEBjYWxsZWVfZ3VhcmFudGVlZCAoKSAtPiAoKQorICAldCA9IHR1cGxlICgpCisgIHJldHVybiAldCA6ICQoKQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TeW50YXgvSW5wdXRzL2ludmFsaWQuc2VkIGIvdGVzdC9TeW50YXgvSW5wdXRzL2ludmFsaWQuc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxODk0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1N5bnRheC9JbnB1dHMvaW52YWxpZC5zZWQKQEAgLTAsMCArMSwzMiBAQAorCisjIFsweEMyXSBpcyB1dGY4IDIgYnl0ZSBjaGFyYWN0ZXIgc3RhcnQgYnl0ZS4KKyMgMHhDMiB3aXRob3V0IHNlY29uZCBieXRlIGlzIGludmFsaWQgVVRGLTggc2VxdWVuY2UuCisjIEl0IGJlY29tZXMgZ2FyYmFnZSB0ZXh0IHRyaXZpYS4KKyMgTWFya2VyKDEpIGlzIHJlcGxhY2VkIHRvIHRoaXMgc2VxdWVuY2UuCitzL1oxL8IvZworCisjIFsweENDLCAweDgyXSBpbiBVVEYtOCBpcyBVKzAzMDIuCisjIFRoaXMgY2hhcmFjdGVyIGlzIGludmFsaWQgZm9yIGlkZW50aWZpZXIgc3RhcnQsIGJ1dCB2YWxpZCBmb3IgaWRlbnRpZmllciBib2R5LgorIyBJdCBiZWNvbWVzIHVua25vd24gdG9rZW4uCisjIElmIHRoaXMgdHlwZSBjaGFyYWN0ZXJzIGFyZSBjb25pdGd1b3VzLCB0aGV5IGFyZSBjb25jYXRlbmF0ZWQgdG8gb25lIGxvbmcgdW5rbm93biB0b2tlbi4KKyMgTWFya2VyKDIpIGlzIHJlcGxhY2VkIHRvIHRoaXMgc2VxdWVuY2UuCitzL1oyL8yCL2cKKworIyBbMHhFMiwgMHg4MCwgMHg5Q10gaW4gVVRGLTggaXMgVSsyMDFDLCBsZWZ0IHF1b3RlLgorIyBJdCBiZWNvbWVzIHNpbmdsZSBjaGFyYWN0ZXIgdW5rbm93biB0b2tlbi4KKyMgSWYgdGhpcyBsZWZ0IHF1b3RlIGFuZCByaWdodCBxdW90ZSBlbmNsb3N1cmUgdGV4dCwKKyMgdGhleSBiZWNvbWUgb25lIGxvbmcgdW5rbm93biB0b2tlbi4KKyMgTWFya2VyKDMpIGlzIHJlcGxhY2VkIHRvIHRoaXMgc2VxdWVuY2UuCitzL1ozL+KAnC9nCisKKyMgWzB4RTIsIDB4ODAsIDB4OURdIGluIFVURi04IGlzIFUrMjAxRCwgcmlnaHQgcXVvdGUuCisjIEl0IGJlY29tZXMgc2luZ2xlIGNoYXJhY3RlciB1bmtub3duIHRva2VuLgorIyBNYXJrZXIoNCkgaXMgcmVwbGFjZWQgdG8gdGhpcyBzZXF1ZW5jZS4KK3MvWjQv4oCdL2cKKworIyBbMHhFMSwgMHg5QSwgMHg4MF0gaW4gVVRGLTggaXMgVSsxNjgwLgorIyBUaGlzIGNoYXJhY3RlciBpcyBpbnZhbGlkIGZvciBzd2lmdCBzb3VyY2UuCisjIEl0IGJlY29tZXMgZ2FyYmFnZSB0cml2aWEuCisjIE1hcmtlcig1KSBpcyByZXBsYWNlZCB0byB0aGlzIHNlcXVlbmNlLgorcy9aNS/hmoAvZworCmRpZmYgLS1naXQgYS90ZXN0L1N5bnRheC9JbnB1dHMvbmJzcC5zZWQgYi90ZXN0L1N5bnRheC9JbnB1dHMvbmJzcC5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YWRmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU3ludGF4L0lucHV0cy9uYnNwLnNlZApAQCAtMCwwICsxIEBACitzL1ovwqAvZwpkaWZmIC0tZ2l0IGEvdGVzdC9TeW50YXgvT3V0cHV0cy9yb3VuZF90cmlwX3BhcnNlX2dlbi5zd2lmdC53aXRoa2luZHMgYi90ZXN0L1N5bnRheC9PdXRwdXRzL3JvdW5kX3RyaXBfcGFyc2VfZ2VuLnN3aWZ0LndpdGhraW5kcwppbmRleCAyYzFhZjhiLi41MTJjYTczIDEwMDY0NAotLS0gYS90ZXN0L1N5bnRheC9PdXRwdXRzL3JvdW5kX3RyaXBfcGFyc2VfZ2VuLnN3aWZ0LndpdGhraW5kcworKysgYi90ZXN0L1N5bnRheC9PdXRwdXRzL3JvdW5kX3RyaXBfcGFyc2VfZ2VuLnN3aWZ0LndpdGhraW5kcwpAQCAtNTEsNyArNTEsOCBAQAogICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48QXJyYXlFeHByPls8QXJyYXlFbGVtZW50PjxGdW5jdGlvbkNhbGxFeHByPjxJZGVudGlmaWVyRXhwcj5iYXIzPC9JZGVudGlmaWVyRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PmE6PEludGVnZXJMaXRlcmFsRXhwcj4xPC9JbnRlZ2VyTGl0ZXJhbEV4cHI+PC9GdW5jdGlvbkNhbGxBcmd1bWVudD4pPC9GdW5jdGlvbkNhbGxFeHByPiwgPC9BcnJheUVsZW1lbnQ+PEFycmF5RWxlbWVudD48RnVuY3Rpb25DYWxsRXhwcj48SWRlbnRpZmllckV4cHI+YmFyMzwvSWRlbnRpZmllckV4cHI+KDxGdW5jdGlvbkNhbGxBcmd1bWVudD5hOjxJbnRlZ2VyTGl0ZXJhbEV4cHI+MTwvSW50ZWdlckxpdGVyYWxFeHByPjwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+KTwvRnVuY3Rpb25DYWxsRXhwcj4sIDwvQXJyYXlFbGVtZW50PjxBcnJheUVsZW1lbnQ+PEZ1bmN0aW9uQ2FsbEV4cHI+PElkZW50aWZpZXJFeHByPmJhcjM8L0lkZW50aWZpZXJFeHByPig8RnVuY3Rpb25DYWxsQXJndW1lbnQ+YTo8SW50ZWdlckxpdGVyYWxFeHByPjE8L0ludGVnZXJMaXRlcmFsRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+LCA8L0FycmF5RWxlbWVudD48QXJyYXlFbGVtZW50PjxGdW5jdGlvbkNhbGxFeHByPjxJZGVudGlmaWVyRXhwcj5iYXIzPC9JZGVudGlmaWVyRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PmE6PEludGVnZXJMaXRlcmFsRXhwcj4xPC9JbnRlZ2VyTGl0ZXJhbEV4cHI+PC9GdW5jdGlvbkNhbGxBcmd1bWVudD4pPC9GdW5jdGlvbkNhbGxFeHByPjwvQXJyYXlFbGVtZW50Pl08L0FycmF5RXhwcj48L1NlcXVlbmNlRXhwcj48U2VxdWVuY2VFeHByPjxEaXNjYXJkQXNzaWdubWVudEV4cHI+CiAgICAgXyA8L0Rpc2NhcmRBc3NpZ25tZW50RXhwcj48QXNzaWdubWVudEV4cHI+PSA8L0Fzc2lnbm1lbnRFeHByPjxEaWN0aW9uYXJ5RXhwcj5bPERpY3Rpb25hcnlFbGVtZW50PjxTdHJpbmdMaXRlcmFsRXhwcj4iYSI8L1N0cmluZ0xpdGVyYWxFeHByPjogPEZ1bmN0aW9uQ2FsbEV4cHI+PElkZW50aWZpZXJFeHByPmJhcjM8L0lkZW50aWZpZXJFeHByPig8RnVuY3Rpb25DYWxsQXJndW1lbnQ+YTo8SW50ZWdlckxpdGVyYWxFeHByPjE8L0ludGVnZXJMaXRlcmFsRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+LCA8L0RpY3Rpb25hcnlFbGVtZW50PjxEaWN0aW9uYXJ5RWxlbWVudD48U3RyaW5nTGl0ZXJhbEV4cHI+ImIiPC9TdHJpbmdMaXRlcmFsRXhwcj46IDxGdW5jdGlvbkNhbGxFeHByPjxJZGVudGlmaWVyRXhwcj5iYXIzPC9JZGVudGlmaWVyRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PmE6PEludGVnZXJMaXRlcmFsRXhwcj4xPC9JbnRlZ2VyTGl0ZXJhbEV4cHI+PC9GdW5jdGlvbkNhbGxBcmd1bWVudD4pPC9GdW5jdGlvbkNhbGxFeHByPiwgPC9EaWN0aW9uYXJ5RWxlbWVudD48RGljdGlvbmFyeUVsZW1lbnQ+PFN0cmluZ0xpdGVyYWxFeHByPiJjIjwvU3RyaW5nTGl0ZXJhbEV4cHI+OiA8RnVuY3Rpb25DYWxsRXhwcj48SWRlbnRpZmllckV4cHI+YmFyMzwvSWRlbnRpZmllckV4cHI+KDxGdW5jdGlvbkNhbGxBcmd1bWVudD5hOjxJbnRlZ2VyTGl0ZXJhbEV4cHI+MTwvSW50ZWdlckxpdGVyYWxFeHByPjwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+KTwvRnVuY3Rpb25DYWxsRXhwcj4sIDwvRGljdGlvbmFyeUVsZW1lbnQ+PERpY3Rpb25hcnlFbGVtZW50PjxTdHJpbmdMaXRlcmFsRXhwcj4iZCI8L1N0cmluZ0xpdGVyYWxFeHByPjogPEZ1bmN0aW9uQ2FsbEV4cHI+PElkZW50aWZpZXJFeHByPmJhcjM8L0lkZW50aWZpZXJFeHByPig8RnVuY3Rpb25DYWxsQXJndW1lbnQ+YTo8SW50ZWdlckxpdGVyYWxFeHByPjE8L0ludGVnZXJMaXRlcmFsRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+PC9EaWN0aW9uYXJ5RWxlbWVudD5dPC9EaWN0aW9uYXJ5RXhwcj48L1NlcXVlbmNlRXhwcj48RnVuY3Rpb25DYWxsRXhwcj48SWRlbnRpZmllckV4cHI+CiAgICAgZm9vPC9JZGVudGlmaWVyRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PjxOaWxMaXRlcmFsRXhwcj5uaWw8L05pbExpdGVyYWxFeHByPiwgPC9GdW5jdGlvbkNhbGxBcmd1bWVudD48RnVuY3Rpb25DYWxsQXJndW1lbnQ+PE5pbExpdGVyYWxFeHByPm5pbDwvTmlsTGl0ZXJhbEV4cHI+LCA8L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50PjxGdW5jdGlvbkNhbGxBcmd1bWVudD48TmlsTGl0ZXJhbEV4cHI+bmlsPC9OaWxMaXRlcmFsRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgotICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48RG90U2VsZkV4cHI+PEZ1bmN0aW9uQ2FsbEV4cHI+PElkZW50aWZpZXJFeHByPnR5cGU8L0lkZW50aWZpZXJFeHByPig8RnVuY3Rpb25DYWxsQXJndW1lbnQ+b2Y6IDxJZGVudGlmaWVyRXhwcj5hPC9JZGVudGlmaWVyRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+LnNlbGY8L0RvdFNlbGZFeHByPjwvU2VxdWVuY2VFeHByPjxTZXF1ZW5jZUV4cHI+PERpc2NhcmRBc3NpZ25tZW50RXhwcj4KKyAgICBfIDwvRGlzY2FyZEFzc2lnbm1lbnRFeHByPjxBc3NpZ25tZW50RXhwcj49IDwvQXNzaWdubWVudEV4cHI+PE1lbWJlckFjY2Vzc0V4cHI+PEZ1bmN0aW9uQ2FsbEV4cHI+PElkZW50aWZpZXJFeHByPnR5cGU8L0lkZW50aWZpZXJFeHByPig8RnVuY3Rpb25DYWxsQXJndW1lbnQ+b2Y6IDxJZGVudGlmaWVyRXhwcj5hPC9JZGVudGlmaWVyRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+LnNlbGY8L01lbWJlckFjY2Vzc0V4cHI+PC9TZXF1ZW5jZUV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgorICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48TWVtYmVyQWNjZXNzRXhwcj48SWRlbnRpZmllckV4cHI+YTwvSWRlbnRpZmllckV4cHI+LmBzZWxmYDwvTWVtYmVyQWNjZXNzRXhwcj48L1NlcXVlbmNlRXhwcj48U2VxdWVuY2VFeHByPjxEaXNjYXJkQXNzaWdubWVudEV4cHI+CiAgICAgXyA8L0Rpc2NhcmRBc3NpZ25tZW50RXhwcj48QXNzaWdubWVudEV4cHI+PSA8L0Fzc2lnbm1lbnRFeHByPjxJZGVudGlmaWVyRXhwcj5BIDwvSWRlbnRpZmllckV4cHI+PEFycm93RXhwcj4tPiA8L0Fycm93RXhwcj48TWVtYmVyQWNjZXNzRXhwcj48SWRlbnRpZmllckV4cHI+QjwvSWRlbnRpZmllckV4cHI+LkM8L01lbWJlckFjY2Vzc0V4cHI+PEJpbmFyeU9wZXJhdG9yRXhwcj48PC9CaW5hcnlPcGVyYXRvckV4cHI+PFBvc3RmaXhVbmFyeUV4cHI+PElkZW50aWZpZXJFeHByPkludDwvSWRlbnRpZmllckV4cHI+PjwvUG9zdGZpeFVuYXJ5RXhwcj48L1NlcXVlbmNlRXhwcj48U2VxdWVuY2VFeHByPjxEaXNjYXJkQXNzaWdubWVudEV4cHI+CiAgICAgXyA8L0Rpc2NhcmRBc3NpZ25tZW50RXhwcj48QXNzaWdubWVudEV4cHI+PSA8L0Fzc2lnbm1lbnRFeHByPjxGdW5jdGlvbkNhbGxFeHByPjxBcnJheUV4cHI+WzxBcnJheUVsZW1lbnQ+PFNlcXVlbmNlRXhwcj48VHVwbGVFeHByPig8VHVwbGVFbGVtZW50PjxJZGVudGlmaWVyRXhwcj5BPC9JZGVudGlmaWVyRXhwcj48L1R1cGxlRWxlbWVudD4pIDwvVHVwbGVFeHByPjxBcnJvd0V4cHI+dGhyb3dzIC0+IDwvQXJyb3dFeHByPjxJZGVudGlmaWVyRXhwcj5CPC9JZGVudGlmaWVyRXhwcj48L1NlcXVlbmNlRXhwcj48L0FycmF5RWxlbWVudD5dPC9BcnJheUV4cHI+KCk8L0Z1bmN0aW9uQ2FsbEV4cHI+PC9TZXF1ZW5jZUV4cHI+CiAgIH08L0NvZGVCbG9jaz48L0Z1bmN0aW9uRGVjbD48L01lbWJlckRlY2xMaXN0SXRlbT48TWVtYmVyRGVjbExpc3RJdGVtPjxGdW5jdGlvbkRlY2w+CkBAIC05MCwxMSArOTEsMTEgQEAKICAgfTwvQ29kZUJsb2NrPjwvRnVuY3Rpb25EZWNsPjwvTWVtYmVyRGVjbExpc3RJdGVtPjxNZW1iZXJEZWNsTGlzdEl0ZW0+PEZ1bmN0aW9uRGVjbD4KIAogICBmdW5jIGltcGxpY3RNZW1iZXI8RnVuY3Rpb25TaWduYXR1cmU+PFBhcmFtZXRlckNsYXVzZT4oKSA8L1BhcmFtZXRlckNsYXVzZT48L0Z1bmN0aW9uU2lnbmF0dXJlPjxDb2RlQmxvY2s+ezxTZXF1ZW5jZUV4cHI+PERpc2NhcmRBc3NpZ25tZW50RXhwcj4KLSAgICBfIDwvRGlzY2FyZEFzc2lnbm1lbnRFeHByPjxBc3NpZ25tZW50RXhwcj49IDwvQXNzaWdubWVudEV4cHI+PEltcGxpY2l0TWVtYmVyRXhwcj4uZm9vPC9JbXBsaWNpdE1lbWJlckV4cHI+PC9TZXF1ZW5jZUV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgotICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48RnVuY3Rpb25DYWxsRXhwcj48SW1wbGljaXRNZW1iZXJFeHByPi5mb288L0ltcGxpY2l0TWVtYmVyRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50Png6IDxJbnRlZ2VyTGl0ZXJhbEV4cHI+MTI8L0ludGVnZXJMaXRlcmFsRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+PC9TZXF1ZW5jZUV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgotICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48RnVuY3Rpb25DYWxsRXhwcj48SW1wbGljaXRNZW1iZXJFeHByPi5mb28gPC9JbXBsaWNpdE1lbWJlckV4cHI+PENsb3N1cmVFeHByPnsgPEludGVnZXJMaXRlcmFsRXhwcj4xMiA8L0ludGVnZXJMaXRlcmFsRXhwcj59PC9DbG9zdXJlRXhwcj48L0Z1bmN0aW9uQ2FsbEV4cHI+PC9TZXF1ZW5jZUV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgotICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48U3Vic2NyaXB0RXhwcj48SW1wbGljaXRNZW1iZXJFeHByPi5mb288L0ltcGxpY2l0TWVtYmVyRXhwcj5bPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PjxJbnRlZ2VyTGl0ZXJhbEV4cHI+MTI8L0ludGVnZXJMaXRlcmFsRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pl08L1N1YnNjcmlwdEV4cHI+PC9TZXF1ZW5jZUV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgotICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48TWVtYmVyQWNjZXNzRXhwcj48SW1wbGljaXRNZW1iZXJFeHByPi5mb288L0ltcGxpY2l0TWVtYmVyRXhwcj4uYmFyPC9NZW1iZXJBY2Nlc3NFeHByPjwvU2VxdWVuY2VFeHByPgorICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48TWVtYmVyQWNjZXNzRXhwcj4uZm9vPC9NZW1iZXJBY2Nlc3NFeHByPjwvU2VxdWVuY2VFeHByPjxTZXF1ZW5jZUV4cHI+PERpc2NhcmRBc3NpZ25tZW50RXhwcj4KKyAgICBfIDwvRGlzY2FyZEFzc2lnbm1lbnRFeHByPjxBc3NpZ25tZW50RXhwcj49IDwvQXNzaWdubWVudEV4cHI+PEZ1bmN0aW9uQ2FsbEV4cHI+PE1lbWJlckFjY2Vzc0V4cHI+LmZvbzwvTWVtYmVyQWNjZXNzRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50Png6IDxJbnRlZ2VyTGl0ZXJhbEV4cHI+MTI8L0ludGVnZXJMaXRlcmFsRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+PC9TZXF1ZW5jZUV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgorICAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48RnVuY3Rpb25DYWxsRXhwcj48TWVtYmVyQWNjZXNzRXhwcj4uZm9vIDwvTWVtYmVyQWNjZXNzRXhwcj48Q2xvc3VyZUV4cHI+eyA8SW50ZWdlckxpdGVyYWxFeHByPjEyIDwvSW50ZWdlckxpdGVyYWxFeHByPn08L0Nsb3N1cmVFeHByPjwvRnVuY3Rpb25DYWxsRXhwcj48L1NlcXVlbmNlRXhwcj48U2VxdWVuY2VFeHByPjxEaXNjYXJkQXNzaWdubWVudEV4cHI+CisgICAgXyA8L0Rpc2NhcmRBc3NpZ25tZW50RXhwcj48QXNzaWdubWVudEV4cHI+PSA8L0Fzc2lnbm1lbnRFeHByPjxTdWJzY3JpcHRFeHByPjxNZW1iZXJBY2Nlc3NFeHByPi5mb288L01lbWJlckFjY2Vzc0V4cHI+WzxGdW5jdGlvbkNhbGxBcmd1bWVudD48SW50ZWdlckxpdGVyYWxFeHByPjEyPC9JbnRlZ2VyTGl0ZXJhbEV4cHI+PC9GdW5jdGlvbkNhbGxBcmd1bWVudD5dPC9TdWJzY3JpcHRFeHByPjwvU2VxdWVuY2VFeHByPjxTZXF1ZW5jZUV4cHI+PERpc2NhcmRBc3NpZ25tZW50RXhwcj4KKyAgICBfIDwvRGlzY2FyZEFzc2lnbm1lbnRFeHByPjxBc3NpZ25tZW50RXhwcj49IDwvQXNzaWdubWVudEV4cHI+PE1lbWJlckFjY2Vzc0V4cHI+PE1lbWJlckFjY2Vzc0V4cHI+LmZvbzwvTWVtYmVyQWNjZXNzRXhwcj4uYmFyPC9NZW1iZXJBY2Nlc3NFeHByPjwvU2VxdWVuY2VFeHByPgogICB9PC9Db2RlQmxvY2s+PC9GdW5jdGlvbkRlY2w+PC9NZW1iZXJEZWNsTGlzdEl0ZW0+PE1lbWJlckRlY2xMaXN0SXRlbT48SW5pdGlhbGl6ZXJEZWNsPgogCiAgIGluaXQ8UGFyYW1ldGVyQ2xhdXNlPigpIDwvUGFyYW1ldGVyQ2xhdXNlPjxDb2RlQmxvY2s+e308L0NvZGVCbG9jaz48L0luaXRpYWxpemVyRGVjbD48L01lbWJlckRlY2xMaXN0SXRlbT48TWVtYmVyRGVjbExpc3RJdGVtPjxJbml0aWFsaXplckRlY2w+PEF0dHJpYnV0ZT4KQEAgLTI2NCw4ICsyNjUsOCBAQAogICBmb288L0lkZW50aWZpZXJFeHByPls8RnVuY3Rpb25DYWxsQXJndW1lbnQ+PEludGVnZXJMaXRlcmFsRXhwcj4xPC9JbnRlZ2VyTGl0ZXJhbEV4cHI+PC9GdW5jdGlvbkNhbGxBcmd1bWVudD5dPC9TdWJzY3JpcHRFeHByPjxTdWJzY3JpcHRFeHByPjxJZGVudGlmaWVyRXhwcj4KICAgZm9vPC9JZGVudGlmaWVyRXhwcj5bXSA8Q2xvc3VyZUV4cHI+e308L0Nsb3N1cmVFeHByPjwvU3Vic2NyaXB0RXhwcj48U3Vic2NyaXB0RXhwcj48SWRlbnRpZmllckV4cHI+CiAgIGZvbzwvSWRlbnRpZmllckV4cHI+WzxGdW5jdGlvbkNhbGxBcmd1bWVudD48SW50ZWdlckxpdGVyYWxFeHByPjE8L0ludGVnZXJMaXRlcmFsRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pl0gPENsb3N1cmVFeHByPnt9PC9DbG9zdXJlRXhwcj48L1N1YnNjcmlwdEV4cHI+PFN1YnNjcmlwdEV4cHI+PFN1YnNjcmlwdEV4cHI+PElkZW50aWZpZXJFeHByPgotICBmb288L0lkZW50aWZpZXJFeHByPls8RnVuY3Rpb25DYWxsQXJndW1lbnQ+PEludGVnZXJMaXRlcmFsRXhwcj4xPC9JbnRlZ2VyTGl0ZXJhbEV4cHI+PC9GdW5jdGlvbkNhbGxBcmd1bWVudD5dPC9TdWJzY3JpcHRFeHByPls8RnVuY3Rpb25DYWxsQXJndW1lbnQ+PEludGVnZXJMaXRlcmFsRXhwcj4yPC9JbnRlZ2VyTGl0ZXJhbEV4cHI+LDwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+PEZ1bmN0aW9uQ2FsbEFyZ3VtZW50Png6PEludGVnZXJMaXRlcmFsRXhwcj4zPC9JbnRlZ2VyTGl0ZXJhbEV4cHI+PC9GdW5jdGlvbkNhbGxBcmd1bWVudD5dPC9TdWJzY3JpcHRFeHByPjxEb3RTZWxmRXhwcj48RnVuY3Rpb25DYWxsRXhwcj48Rm9yY2VkVmFsdWVFeHByPjxNZW1iZXJBY2Nlc3NFeHByPjxQb3N0Zml4VW5hcnlFeHByPjxPcHRpb25hbENoYWluaW5nRXhwcj48SWRlbnRpZmllckV4cHI+Ci0gIGZvbzwvSWRlbnRpZmllckV4cHI+PzwvT3B0aW9uYWxDaGFpbmluZ0V4cHI+Kys8L1Bvc3RmaXhVbmFyeUV4cHI+LmJhcjwvTWVtYmVyQWNjZXNzRXhwcj4hPC9Gb3JjZWRWYWx1ZUV4cHI+KDxGdW5jdGlvbkNhbGxBcmd1bWVudD48SWRlbnRpZmllckV4cHI+YmF6PC9JZGVudGlmaWVyRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+LnNlbGY8L0RvdFNlbGZFeHByPjxNZW1iZXJBY2Nlc3NFeHByPjxGdW5jdGlvbkNhbGxFeHByPjxJZGVudGlmaWVyRXhwcj4KKyAgZm9vPC9JZGVudGlmaWVyRXhwcj5bPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PjxJbnRlZ2VyTGl0ZXJhbEV4cHI+MTwvSW50ZWdlckxpdGVyYWxFeHByPjwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+XTwvU3Vic2NyaXB0RXhwcj5bPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PjxJbnRlZ2VyTGl0ZXJhbEV4cHI+MjwvSW50ZWdlckxpdGVyYWxFeHByPiw8L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50PjxGdW5jdGlvbkNhbGxBcmd1bWVudD54OjxJbnRlZ2VyTGl0ZXJhbEV4cHI+MzwvSW50ZWdlckxpdGVyYWxFeHByPjwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+XTwvU3Vic2NyaXB0RXhwcj48TWVtYmVyQWNjZXNzRXhwcj48RnVuY3Rpb25DYWxsRXhwcj48Rm9yY2VkVmFsdWVFeHByPjxNZW1iZXJBY2Nlc3NFeHByPjxQb3N0Zml4VW5hcnlFeHByPjxPcHRpb25hbENoYWluaW5nRXhwcj48SWRlbnRpZmllckV4cHI+CisgIGZvbzwvSWRlbnRpZmllckV4cHI+PzwvT3B0aW9uYWxDaGFpbmluZ0V4cHI+Kys8L1Bvc3RmaXhVbmFyeUV4cHI+LmJhcjwvTWVtYmVyQWNjZXNzRXhwcj4hPC9Gb3JjZWRWYWx1ZUV4cHI+KDxGdW5jdGlvbkNhbGxBcmd1bWVudD48SWRlbnRpZmllckV4cHI+YmF6PC9JZGVudGlmaWVyRXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+LnNlbGY8L01lbWJlckFjY2Vzc0V4cHI+PE1lbWJlckFjY2Vzc0V4cHI+PEZ1bmN0aW9uQ2FsbEV4cHI+PElkZW50aWZpZXJFeHByPgogICBmb288L0lkZW50aWZpZXJFeHByPigpPC9GdW5jdGlvbkNhbGxFeHByPi4wPC9NZW1iZXJBY2Nlc3NFeHByPjxNZW1iZXJBY2Nlc3NFeHByPjxTcGVjaWFsaXplRXhwcj48SWRlbnRpZmllckV4cHI+CiAgIGZvbzwvSWRlbnRpZmllckV4cHI+PEdlbmVyaWNBcmd1bWVudENsYXVzZT48PEdlbmVyaWNBcmd1bWVudD48U2ltcGxlVHlwZUlkZW50aWZpZXI+SW50PC9TaW1wbGVUeXBlSWRlbnRpZmllcj48L0dlbmVyaWNBcmd1bWVudD4+PC9HZW5lcmljQXJndW1lbnRDbGF1c2U+PC9TcGVjaWFsaXplRXhwcj4uYmFyPC9NZW1iZXJBY2Nlc3NFeHByPjxGdW5jdGlvbkNhbGxFeHByPjxTcGVjaWFsaXplRXhwcj48SWRlbnRpZmllckV4cHI+CiAgIGZvbzwvSWRlbnRpZmllckV4cHI+PEdlbmVyaWNBcmd1bWVudENsYXVzZT48PEdlbmVyaWNBcmd1bWVudD48U2ltcGxlVHlwZUlkZW50aWZpZXI+SW50PC9TaW1wbGVUeXBlSWRlbnRpZmllcj48L0dlbmVyaWNBcmd1bWVudD4+PC9HZW5lcmljQXJndW1lbnRDbGF1c2U+PC9TcGVjaWFsaXplRXhwcj4oKTwvRnVuY3Rpb25DYWxsRXhwcj48RnVuY3Rpb25DYWxsRXhwcj48U3BlY2lhbGl6ZUV4cHI+PE1lbWJlckFjY2Vzc0V4cHI+PElkZW50aWZpZXJFeHByPgpAQCAtMjczLDcgKzI3NCw3IEBACiAKICAgZm9vPERlY2xOYW1lQXJndW1lbnRzPig8RGVjbE5hbWVBcmd1bWVudD54OjwvRGVjbE5hbWVBcmd1bWVudD48RGVjbE5hbWVBcmd1bWVudD55OjwvRGVjbE5hbWVBcmd1bWVudD4pPC9EZWNsTmFtZUFyZ3VtZW50cz48L0lkZW50aWZpZXJFeHByPigpPC9GdW5jdGlvbkNhbGxFeHByPjxGdW5jdGlvbkNhbGxFeHByPjxTcGVjaWFsaXplRXhwcj48SWRlbnRpZmllckV4cHI+CiAgIGZvbzxEZWNsTmFtZUFyZ3VtZW50cz4oPERlY2xOYW1lQXJndW1lbnQ+eDo8L0RlY2xOYW1lQXJndW1lbnQ+KTwvRGVjbE5hbWVBcmd1bWVudHM+PC9JZGVudGlmaWVyRXhwcj48R2VuZXJpY0FyZ3VtZW50Q2xhdXNlPjw8R2VuZXJpY0FyZ3VtZW50PjxTaW1wbGVUeXBlSWRlbnRpZmllcj5JbnQ8L1NpbXBsZVR5cGVJZGVudGlmaWVyPjwvR2VuZXJpY0FyZ3VtZW50Pj4gPC9HZW5lcmljQXJndW1lbnRDbGF1c2U+PC9TcGVjaWFsaXplRXhwcj48Q2xvc3VyZUV4cHI+eyB9PC9DbG9zdXJlRXhwcj48L0Z1bmN0aW9uQ2FsbEV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgotICBfIDwvRGlzY2FyZEFzc2lnbm1lbnRFeHByPjxBc3NpZ25tZW50RXhwcj49IDwvQXNzaWdubWVudEV4cHI+PEltcGxpY2l0TWVtYmVyRXhwcj4uZm9vPERlY2xOYW1lQXJndW1lbnRzPig8RGVjbE5hbWVBcmd1bWVudD54OjwvRGVjbE5hbWVBcmd1bWVudD48RGVjbE5hbWVBcmd1bWVudD55OjwvRGVjbE5hbWVBcmd1bWVudD4pPC9EZWNsTmFtZUFyZ3VtZW50cz48L0ltcGxpY2l0TWVtYmVyRXhwcj48L1NlcXVlbmNlRXhwcj48U2VxdWVuY2VFeHByPjxEaXNjYXJkQXNzaWdubWVudEV4cHI+CisgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48TWVtYmVyQWNjZXNzRXhwcj4uZm9vPERlY2xOYW1lQXJndW1lbnRzPig8RGVjbE5hbWVBcmd1bWVudD54OjwvRGVjbE5hbWVBcmd1bWVudD48RGVjbE5hbWVBcmd1bWVudD55OjwvRGVjbE5hbWVBcmd1bWVudD4pPC9EZWNsTmFtZUFyZ3VtZW50cz48L01lbWJlckFjY2Vzc0V4cHI+PC9TZXF1ZW5jZUV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgogICBfIDwvRGlzY2FyZEFzc2lnbm1lbnRFeHByPjxBc3NpZ25tZW50RXhwcj49IDwvQXNzaWdubWVudEV4cHI+PE1lbWJlckFjY2Vzc0V4cHI+PElkZW50aWZpZXJFeHByPng8L0lkZW50aWZpZXJFeHByPi5mb288RGVjbE5hbWVBcmd1bWVudHM+KDxEZWNsTmFtZUFyZ3VtZW50Png6PC9EZWNsTmFtZUFyZ3VtZW50PjxEZWNsTmFtZUFyZ3VtZW50Pnk6PC9EZWNsTmFtZUFyZ3VtZW50Pik8L0RlY2xOYW1lQXJndW1lbnRzPjwvTWVtYmVyQWNjZXNzRXhwcj48L1NlcXVlbmNlRXhwcj48U2VxdWVuY2VFeHByPjxEaXNjYXJkQXNzaWdubWVudEV4cHI+CiAgIF8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48RnVuY3Rpb25DYWxsRXhwcj48SWRlbnRpZmllckV4cHI+Zm9vPC9JZGVudGlmaWVyRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PjxJbk91dEV4cHI+JjxJZGVudGlmaWVyRXhwcj5kPC9JZGVudGlmaWVyRXhwcj48L0luT3V0RXhwcj48L0Z1bmN0aW9uQ2FsbEFyZ3VtZW50Pik8L0Z1bmN0aW9uQ2FsbEV4cHI+PC9TZXF1ZW5jZUV4cHI+PFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPgogICBfIDwvRGlzY2FyZEFzc2lnbm1lbnRFeHByPjxBc3NpZ25tZW50RXhwcj49IDwvQXNzaWdubWVudEV4cHI+PEVkaXRvclBsYWNlaG9sZGVyRXhwcj48I1BsYWNlaG9sZGVyIz4gPC9FZGl0b3JQbGFjZWhvbGRlckV4cHI+PEJpbmFyeU9wZXJhdG9yRXhwcj4rIDwvQmluYXJ5T3BlcmF0b3JFeHByPjxFZGl0b3JQbGFjZWhvbGRlckV4cHI+PCNUIyMoSW50KSAtPiBJbnQjPjwvRWRpdG9yUGxhY2Vob2xkZXJFeHByPjwvU2VxdWVuY2VFeHByPgpAQCAtMzE4LDcgKzMxOSw3IEBACiAgICAgY2FzZSA8Q2FzZUl0ZW0+PFZhbHVlQmluZGluZ1BhdHRlcm4+bGV0IDxFeHByZXNzaW9uUGF0dGVybj48VHVwbGVFeHByPig8VHVwbGVFbGVtZW50PjxVbnJlc29sdmVkUGF0dGVybkV4cHI+PElkZW50aWZpZXJQYXR0ZXJuPmE8L0lkZW50aWZpZXJQYXR0ZXJuPjwvVW5yZXNvbHZlZFBhdHRlcm5FeHByPiwgPC9UdXBsZUVsZW1lbnQ+PFR1cGxlRWxlbWVudD48VW5yZXNvbHZlZFBhdHRlcm5FeHByPjxJZGVudGlmaWVyUGF0dGVybj5iPC9JZGVudGlmaWVyUGF0dGVybj48L1VucmVzb2x2ZWRQYXR0ZXJuRXhwcj48L1R1cGxlRWxlbWVudD4pPC9UdXBsZUV4cHI+PC9FeHByZXNzaW9uUGF0dGVybj48L1ZhbHVlQmluZGluZ1BhdHRlcm4+PC9DYXNlSXRlbT46IDwvU3dpdGNoQ2FzZUxhYmVsPjxCcmVha1N0bXQ+YnJlYWs8L0JyZWFrU3RtdD48L1N3aXRjaENhc2U+PFN3aXRjaENhc2U+PFN3aXRjaENhc2VMYWJlbD4KICAgICBjYXNlIDxDYXNlSXRlbT48RXhwcmVzc2lvblBhdHRlcm4+PFR1cGxlRXhwcj4oPFR1cGxlRWxlbWVudD48VW5yZXNvbHZlZFBhdHRlcm5FeHByPjxWYWx1ZUJpbmRpbmdQYXR0ZXJuPmxldCA8SWRlbnRpZmllclBhdHRlcm4+YTwvSWRlbnRpZmllclBhdHRlcm4+PC9WYWx1ZUJpbmRpbmdQYXR0ZXJuPjwvVW5yZXNvbHZlZFBhdHRlcm5FeHByPiwgPC9UdXBsZUVsZW1lbnQ+PFR1cGxlRWxlbWVudD48VW5yZXNvbHZlZFBhdHRlcm5FeHByPjxWYWx1ZUJpbmRpbmdQYXR0ZXJuPnZhciA8SWRlbnRpZmllclBhdHRlcm4+YjwvSWRlbnRpZmllclBhdHRlcm4+PC9WYWx1ZUJpbmRpbmdQYXR0ZXJuPjwvVW5yZXNvbHZlZFBhdHRlcm5FeHByPjwvVHVwbGVFbGVtZW50Pik8L1R1cGxlRXhwcj48L0V4cHJlc3Npb25QYXR0ZXJuPjwvQ2FzZUl0ZW0+OiA8L1N3aXRjaENhc2VMYWJlbD48QnJlYWtTdG10PmJyZWFrPC9CcmVha1N0bXQ+PC9Td2l0Y2hDYXNlPjxTd2l0Y2hDYXNlPjxTd2l0Y2hDYXNlTGFiZWw+CiAgICAgY2FzZSA8Q2FzZUl0ZW0+PElzVHlwZVBhdHRlcm4+aXMgPFNpbXBsZVR5cGVJZGVudGlmaWVyPkludDwvU2ltcGxlVHlwZUlkZW50aWZpZXI+PC9Jc1R5cGVQYXR0ZXJuPjwvQ2FzZUl0ZW0+OiA8L1N3aXRjaENhc2VMYWJlbD48QnJlYWtTdG10PmJyZWFrPC9CcmVha1N0bXQ+PC9Td2l0Y2hDYXNlPjxTd2l0Y2hDYXNlPjxTd2l0Y2hDYXNlTGFiZWw+Ci0gICAgY2FzZSA8Q2FzZUl0ZW0+PFZhbHVlQmluZGluZ1BhdHRlcm4+bGV0IDxFeHByZXNzaW9uUGF0dGVybj48RnVuY3Rpb25DYWxsRXhwcj48SW1wbGljaXRNZW1iZXJFeHByPi5iYXI8L0ltcGxpY2l0TWVtYmVyRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PjxVbnJlc29sdmVkUGF0dGVybkV4cHI+PElkZW50aWZpZXJQYXR0ZXJuPng8L0lkZW50aWZpZXJQYXR0ZXJuPjwvVW5yZXNvbHZlZFBhdHRlcm5FeHByPjwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+KTwvRnVuY3Rpb25DYWxsRXhwcj48L0V4cHJlc3Npb25QYXR0ZXJuPjwvVmFsdWVCaW5kaW5nUGF0dGVybj48L0Nhc2VJdGVtPjogPC9Td2l0Y2hDYXNlTGFiZWw+PEJyZWFrU3RtdD5icmVhazwvQnJlYWtTdG10PjwvU3dpdGNoQ2FzZT48U3dpdGNoQ2FzZT48U3dpdGNoQ2FzZUxhYmVsPgorICAgIGNhc2UgPENhc2VJdGVtPjxWYWx1ZUJpbmRpbmdQYXR0ZXJuPmxldCA8RXhwcmVzc2lvblBhdHRlcm4+PEZ1bmN0aW9uQ2FsbEV4cHI+PE1lbWJlckFjY2Vzc0V4cHI+LmJhcjwvTWVtYmVyQWNjZXNzRXhwcj4oPEZ1bmN0aW9uQ2FsbEFyZ3VtZW50PjxVbnJlc29sdmVkUGF0dGVybkV4cHI+PElkZW50aWZpZXJQYXR0ZXJuPng8L0lkZW50aWZpZXJQYXR0ZXJuPjwvVW5yZXNvbHZlZFBhdHRlcm5FeHByPjwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+KTwvRnVuY3Rpb25DYWxsRXhwcj48L0V4cHJlc3Npb25QYXR0ZXJuPjwvVmFsdWVCaW5kaW5nUGF0dGVybj48L0Nhc2VJdGVtPjogPC9Td2l0Y2hDYXNlTGFiZWw+PEJyZWFrU3RtdD5icmVhazwvQnJlYWtTdG10PjwvU3dpdGNoQ2FzZT48U3dpdGNoQ2FzZT48U3dpdGNoQ2FzZUxhYmVsPgogICAgIGNhc2UgPENhc2VJdGVtPjxFeHByZXNzaW9uUGF0dGVybj48TWVtYmVyQWNjZXNzRXhwcj48SWRlbnRpZmllckV4cHI+TXlFbnVtPC9JZGVudGlmaWVyRXhwcj4uZm9vPC9NZW1iZXJBY2Nlc3NFeHByPjwvRXhwcmVzc2lvblBhdHRlcm4+PC9DYXNlSXRlbT46IDwvU3dpdGNoQ2FzZUxhYmVsPjxCcmVha1N0bXQ+YnJlYWs8L0JyZWFrU3RtdD48L1N3aXRjaENhc2U+PFN3aXRjaENhc2U+PFN3aXRjaENhc2VMYWJlbD4KICAgICBjYXNlIDxDYXNlSXRlbT48VmFsdWVCaW5kaW5nUGF0dGVybj5sZXQgPEV4cHJlc3Npb25QYXR0ZXJuPjxTZXF1ZW5jZUV4cHI+PFVucmVzb2x2ZWRQYXR0ZXJuRXhwcj48SWRlbnRpZmllclBhdHRlcm4+YSA8L0lkZW50aWZpZXJQYXR0ZXJuPjwvVW5yZXNvbHZlZFBhdHRlcm5FeHByPjxBc0V4cHI+YXMgPFNpbXBsZVR5cGVJZGVudGlmaWVyPkludDwvU2ltcGxlVHlwZUlkZW50aWZpZXI+PC9Bc0V4cHI+PC9TZXF1ZW5jZUV4cHI+PC9FeHByZXNzaW9uUGF0dGVybj48L1ZhbHVlQmluZGluZ1BhdHRlcm4+PC9DYXNlSXRlbT46IDwvU3dpdGNoQ2FzZUxhYmVsPjxCcmVha1N0bXQ+YnJlYWs8L0JyZWFrU3RtdD48L1N3aXRjaENhc2U+PFN3aXRjaENhc2U+PFN3aXRjaENhc2VMYWJlbD4KICAgICBjYXNlIDxDYXNlSXRlbT48VmFsdWVCaW5kaW5nUGF0dGVybj5sZXQgPEV4cHJlc3Npb25QYXR0ZXJuPjxPcHRpb25hbENoYWluaW5nRXhwcj48VW5yZXNvbHZlZFBhdHRlcm5FeHByPjxJZGVudGlmaWVyUGF0dGVybj5hPC9JZGVudGlmaWVyUGF0dGVybj48L1VucmVzb2x2ZWRQYXR0ZXJuRXhwcj4/PC9PcHRpb25hbENoYWluaW5nRXhwcj48L0V4cHJlc3Npb25QYXR0ZXJuPjwvVmFsdWVCaW5kaW5nUGF0dGVybj48L0Nhc2VJdGVtPjogPC9Td2l0Y2hDYXNlTGFiZWw+PEJyZWFrU3RtdD5icmVhazwvQnJlYWtTdG10PjwvU3dpdGNoQ2FzZT4KQEAgLTM4NCw3ICszODUsNyBAQAogICAgIGNhc2UgPENhc2VJdGVtPjxWYWx1ZUJpbmRpbmdQYXR0ZXJuPmxldCA8SWRlbnRpZmllclBhdHRlcm4+eTwvSWRlbnRpZmllclBhdHRlcm4+PC9WYWx1ZUJpbmRpbmdQYXR0ZXJuPjwvQ2FzZUl0ZW0+OjwvU3dpdGNoQ2FzZUxhYmVsPjxCcmVha1N0bXQ+CiAgICAgICBicmVhazwvQnJlYWtTdG10PjwvU3dpdGNoQ2FzZT48L0lmQ29uZmlnQ2xhdXNlPjxJZkNvbmZpZ0NsYXVzZT4KICNlbHNlPFN3aXRjaENhc2U+PFN3aXRjaENhc2VMYWJlbD4KLSAgICBjYXNlIDxDYXNlSXRlbT48RXhwcmVzc2lvblBhdHRlcm4+PEZ1bmN0aW9uQ2FsbEV4cHI+PEltcGxpY2l0TWVtYmVyRXhwcj4uZm9vPC9JbXBsaWNpdE1lbWJlckV4cHI+KDxGdW5jdGlvbkNhbGxBcmd1bWVudD48VW5yZXNvbHZlZFBhdHRlcm5FeHByPjxWYWx1ZUJpbmRpbmdQYXR0ZXJuPmxldCA8SWRlbnRpZmllclBhdHRlcm4+eDwvSWRlbnRpZmllclBhdHRlcm4+PC9WYWx1ZUJpbmRpbmdQYXR0ZXJuPjwvVW5yZXNvbHZlZFBhdHRlcm5FeHByPjwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+KTwvRnVuY3Rpb25DYWxsRXhwcj48L0V4cHJlc3Npb25QYXR0ZXJuPjwvQ2FzZUl0ZW0+OjwvU3dpdGNoQ2FzZUxhYmVsPjxCcmVha1N0bXQ+CisgICAgY2FzZSA8Q2FzZUl0ZW0+PEV4cHJlc3Npb25QYXR0ZXJuPjxGdW5jdGlvbkNhbGxFeHByPjxNZW1iZXJBY2Nlc3NFeHByPi5mb288L01lbWJlckFjY2Vzc0V4cHI+KDxGdW5jdGlvbkNhbGxBcmd1bWVudD48VW5yZXNvbHZlZFBhdHRlcm5FeHByPjxWYWx1ZUJpbmRpbmdQYXR0ZXJuPmxldCA8SWRlbnRpZmllclBhdHRlcm4+eDwvSWRlbnRpZmllclBhdHRlcm4+PC9WYWx1ZUJpbmRpbmdQYXR0ZXJuPjwvVW5yZXNvbHZlZFBhdHRlcm5FeHByPjwvRnVuY3Rpb25DYWxsQXJndW1lbnQ+KTwvRnVuY3Rpb25DYWxsRXhwcj48L0V4cHJlc3Npb25QYXR0ZXJuPjwvQ2FzZUl0ZW0+OjwvU3dpdGNoQ2FzZUxhYmVsPjxCcmVha1N0bXQ+CiAgICAgICBicmVhazwvQnJlYWtTdG10PjwvU3dpdGNoQ2FzZT48L0lmQ29uZmlnQ2xhdXNlPgogI2VuZGlmPC9JZkNvbmZpZ0RlY2w+PFN3aXRjaENhc2U+PFN3aXRjaERlZmF1bHRMYWJlbD4KICAgICBkZWZhdWx0OjwvU3dpdGNoRGVmYXVsdExhYmVsPjxCcmVha1N0bXQ+CkBAIC01MzIsNyArNTMzLDcgQEAKICAgQF9pbXBsZW1lbnRzKDxJbXBsZW1lbnRzQXR0cmlidXRlQXJndW1lbnRzPjxTaW1wbGVUeXBlSWRlbnRpZmllcj5QPC9TaW1wbGVUeXBlSWRlbnRpZmllcj4sIHg8L0ltcGxlbWVudHNBdHRyaWJ1dGVBcmd1bWVudHM+KTwvQXR0cmlidXRlPgogICB2YXIgPFBhdHRlcm5CaW5kaW5nPjxJZGVudGlmaWVyUGF0dGVybj55PC9JZGVudGlmaWVyUGF0dGVybj48VHlwZUFubm90YXRpb24+OiA8U2ltcGxlVHlwZUlkZW50aWZpZXI+U3RyaW5nPC9TaW1wbGVUeXBlSWRlbnRpZmllcj48L1R5cGVBbm5vdGF0aW9uPjwvUGF0dGVybkJpbmRpbmc+PC9WYXJpYWJsZURlY2w+PC9NZW1iZXJEZWNsTGlzdEl0ZW0+PE1lbWJlckRlY2xMaXN0SXRlbT48RnVuY3Rpb25EZWNsPjxBdHRyaWJ1dGU+CiAgIEBfaW1wbGVtZW50cyg8SW1wbGVtZW50c0F0dHJpYnV0ZUFyZ3VtZW50cz48U2ltcGxlVHlwZUlkZW50aWZpZXI+UDwvU2ltcGxlVHlwZUlkZW50aWZpZXI+LCBnPERlY2xOYW1lQXJndW1lbnRzPigpPC9EZWNsTmFtZUFyZ3VtZW50cz48L0ltcGxlbWVudHNBdHRyaWJ1dGVBcmd1bWVudHM+KTwvQXR0cmlidXRlPgotICBmdW5jIGg8RnVuY3Rpb25TaWduYXR1cmU+PFBhcmFtZXRlckNsYXVzZT4oKSA8L1BhcmFtZXRlckNsYXVzZT48L0Z1bmN0aW9uU2lnbmF0dXJlPjxDb2RlQmxvY2s+e308L0NvZGVCbG9jaz48L0Z1bmN0aW9uRGVjbD48L01lbWJlckRlY2xMaXN0SXRlbT48TWVtYmVyRGVjbExpc3RJdGVtPjxWYXJpYWJsZURlY2w+PEF0dHJpYnV0ZT4KKyAgZnVuYyBoPEZ1bmN0aW9uU2lnbmF0dXJlPjxQYXJhbWV0ZXJDbGF1c2U+KCkgPC9QYXJhbWV0ZXJDbGF1c2U+PC9GdW5jdGlvblNpZ25hdHVyZT48Q29kZUJsb2NrPnsgPFNlcXVlbmNlRXhwcj48RGlzY2FyZEFzc2lnbm1lbnRFeHByPl8gPC9EaXNjYXJkQXNzaWdubWVudEV4cHI+PEFzc2lnbm1lbnRFeHByPj0gPC9Bc3NpZ25tZW50RXhwcj48S2V5UGF0aEV4cHI+XDxNZW1iZXJBY2Nlc3NFeHByPi5zZWxmIDwvTWVtYmVyQWNjZXNzRXhwcj48L0tleVBhdGhFeHByPjwvU2VxdWVuY2VFeHByPn08L0NvZGVCbG9jaz48L0Z1bmN0aW9uRGVjbD48L01lbWJlckRlY2xMaXN0SXRlbT48TWVtYmVyRGVjbExpc3RJdGVtPjxWYXJpYWJsZURlY2w+PEF0dHJpYnV0ZT4KIAogICBAYXZhaWxhYmxlKDxBdmFpbGFiaWxpdHlBcmd1bWVudD4qLCA8L0F2YWlsYWJpbGl0eUFyZ3VtZW50PjxBdmFpbGFiaWxpdHlBcmd1bWVudD48QXZhaWxhYmlsaXR5TGFiZWxlZEFyZ3VtZW50PmRlcHJlY2F0ZWQ6IDxWZXJzaW9uVHVwbGU+MS4yPC9WZXJzaW9uVHVwbGU+PC9BdmFpbGFiaWxpdHlMYWJlbGVkQXJndW1lbnQ+LCA8L0F2YWlsYWJpbGl0eUFyZ3VtZW50PjxBdmFpbGFiaWxpdHlBcmd1bWVudD48QXZhaWxhYmlsaXR5TGFiZWxlZEFyZ3VtZW50Pm1lc3NhZ2U6ICJBQkMiPC9BdmFpbGFiaWxpdHlMYWJlbGVkQXJndW1lbnQ+PC9BdmFpbGFiaWxpdHlBcmd1bWVudD4pPC9BdHRyaWJ1dGU+PERlY2xNb2RpZmllcj4KICAgZmlsZXByaXZhdGUoc2V0KSA8L0RlY2xNb2RpZmllcj52YXIgPFBhdHRlcm5CaW5kaW5nPjxJZGVudGlmaWVyUGF0dGVybj54PC9JZGVudGlmaWVyUGF0dGVybj48VHlwZUFubm90YXRpb24+OiA8U2ltcGxlVHlwZUlkZW50aWZpZXI+U3RyaW5nPC9TaW1wbGVUeXBlSWRlbnRpZmllcj48L1R5cGVBbm5vdGF0aW9uPjwvUGF0dGVybkJpbmRpbmc+PC9WYXJpYWJsZURlY2w+PC9NZW1iZXJEZWNsTGlzdEl0ZW0+CmRpZmYgLS1naXQgYS90ZXN0L1N5bnRheC9yb3VuZF90cmlwX3BhcnNlX2dlbi5zd2lmdCBiL3Rlc3QvU3ludGF4L3JvdW5kX3RyaXBfcGFyc2VfZ2VuLnN3aWZ0CmluZGV4IGIxN2IwMTcuLjIyY2ZjMGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU3ludGF4L3JvdW5kX3RyaXBfcGFyc2VfZ2VuLnN3aWZ0CisrKyBiL3Rlc3QvU3ludGF4L3JvdW5kX3RyaXBfcGFyc2VfZ2VuLnN3aWZ0CkBAIC01Miw2ICs1Miw3IEBACiAgICAgXyA9IFsiYSI6IGJhcjMoYToxKSwgImIiOiBiYXIzKGE6MSksICJjIjogYmFyMyhhOjEpLCAiZCI6IGJhcjMoYToxKV0KICAgICBmb28obmlsLCBuaWwsIG5pbCkKICAgICBfID0gdHlwZShvZjogYSkuc2VsZgorICAgIF8gPSBhLmBzZWxmYAogICAgIF8gPSBBIC0+IEIuQzxJbnQ+CiAgICAgXyA9IFsoQSkgdGhyb3dzIC0+IEJdKCkKICAgfQpAQCAtNTMyLDcgKzUzMyw3IEBACiAgIEBfaW1wbGVtZW50cyhQLCB4KQogICB2YXIgeTogU3RyaW5nCiAgIEBfaW1wbGVtZW50cyhQLCBnKCkpCi0gIGZ1bmMgaCgpIHt9CisgIGZ1bmMgaCgpIHsgXyA9IFwuc2VsZiB9CiAKICAgQGF2YWlsYWJsZSgqLCBkZXByZWNhdGVkOiAxLjIsIG1lc3NhZ2U6ICJBQkMiKQogICBmaWxlcHJpdmF0ZShzZXQpIHZhciB4OiBTdHJpbmcKZGlmZiAtLWdpdCBhL3Rlc3QvU3ludGF4L3Rva2Vuc19ub25icmVha2luZ19zcGFjZS5zd2lmdCBiL3Rlc3QvU3ludGF4L3Rva2Vuc19ub25icmVha2luZ19zcGFjZS5zd2lmdAppbmRleCA5N2NkMjU4Li5iMGRhNGNlIDEwMDY0NAotLS0gYS90ZXN0L1N5bnRheC90b2tlbnNfbm9uYnJlYWtpbmdfc3BhY2Uuc3dpZnQKKysrIGIvdGVzdC9TeW50YXgvdG9rZW5zX25vbmJyZWFraW5nX3NwYWNlLnN3aWZ0CkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiBjYXQgJXMgfCBzZWQgLWUgJ3MvJyQoZWNobyAtbmUgIlx4NWEiKScvJyQoZWNobyAtbmUgIlx4YzJceGEwIiknL2cnID4gJXQudG1wCisvLyBSVU46IGNhdCAlcyB8IHNlZCAtZiAlUy9JbnB1dHMvbmJzcC5zZWQgPiAldC50bXAKIC8vIFJVTjogY3AgLWYgJXQudG1wICV0CiAvLyBSVU46ICVzd2lmdC1zeW50YXgtdGVzdCAtaW5wdXQtc291cmNlLWZpbGVuYW1lICV0IC1kdW1wLWZ1bGwtdG9rZW5zIDI+JjEgfCAlRmlsZUNoZWNrICV0CiBsZXQgYSA9WjNaIC8vIG5ic3AoWikKZGlmZiAtLWdpdCBhL3Rlc3QvU3ludGF4L3Rva2Vuc191bmtub3duX2FuZF9pbnZhbGlkLnN3aWZ0IGIvdGVzdC9TeW50YXgvdG9rZW5zX3Vua25vd25fYW5kX2ludmFsaWQuc3dpZnQKaW5kZXggOThiZTA5MC4uM2E1Y2IxNiAxMDA2NDQKLS0tIGEvdGVzdC9TeW50YXgvdG9rZW5zX3Vua25vd25fYW5kX2ludmFsaWQuc3dpZnQKKysrIGIvdGVzdC9TeW50YXgvdG9rZW5zX3Vua25vd25fYW5kX2ludmFsaWQuc3dpZnQKQEAgLTUsNDYgKzUsOCBAQAogLy8gVG8gYXZvaWQgcmVwbGFjZSBtYXJrZXIgaW4gc2VkIGNvbW1hbmQgYnkgc2VkIGl0c2VsZiwKIC8vIG1hcmtlciBpcyBhbHNvIHJlcHJlc2VudGVkIGluIGVzY2FwZSBzZXF1ZW5jZS4KIAotLy8gUlVOOiBjYXQgJXMgfCBzZWQgXAotCi0vLyBbMHhDMl0gaXMgdXRmOCAyIGJ5dGUgY2hhcmFjdGVyIHN0YXJ0IGJ5dGUuCi0vLyAweEMyIHdpdGhvdXQgc2Vjb25kIGJ5dGUgaXMgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZS4KLS8vIEl0IGJlY29tZXMgZ2FyYmFnZSB0ZXh0IHRyaXZpYS4KLS8vIE1hcmtlcigxKSBpcyByZXBsYWNlZCB0byB0aGlzIHNlcXVlbmNlLgotCi0vLyBSVU46IC1lICdzLyckKGVjaG8gLW5lICJceDVhMSIpJy8nJChlY2hvIC1uZSAiXHhjMiIpJy9nJyBcCi0KLS8vIFsweENDLCAweDgyXSBpbiBVVEYtOCBpcyBVKzAzMDIuCi0vLyBUaGlzIGNoYXJhY3RlciBpcyBpbnZhbGlkIGZvciBpZGVudGlmaWVyIHN0YXJ0LCBidXQgdmFsaWQgZm9yIGlkZW50aWZpZXIgYm9keS4KLS8vIEl0IGJlY29tZXMgdW5rbm93biB0b2tlbi4KLS8vIElmIHRoaXMgdHlwZSBjaGFyYWN0ZXJzIGFyZSBjb25pdGd1b3VzLCB0aGV5IGFyZSBjb25jYXRlbmF0ZWQgdG8gb25lIGxvbmcgdW5rbm93biB0b2tlbi4KLS8vIE1hcmtlcigyKSBpcyByZXBsYWNlZCB0byB0aGlzIHNlcXVlbmNlLgotCi0vLyBSVU46IC1lICdzLyckKGVjaG8gLW5lICJceDVhMiIpJy8nJChlY2hvIC1uZSAiXHhjY1x4ODIiKScvZycgXAotCi0vLyBbMHhFMiwgMHg4MCwgMHg5Q10gaW4gVVRGLTggaXMgVSsyMDFDLCBsZWZ0IHF1b3RlLgotLy8gSXQgYmVjb21lcyBzaW5nbGUgY2hhcmFjdGVyIHVua25vd24gdG9rZW4uCi0vLyBJZiB0aGlzIGxlZnQgcXVvdGUgYW5kIHJpZ2h0IHF1b3RlIGVuY2xvc3VyZSB0ZXh0LAotLy8gdGhleSBiZWNvbWUgb25lIGxvbmcgdW5rbm93biB0b2tlbi4KLS8vIE1hcmtlcigzKSBpcyByZXBsYWNlZCB0byB0aGlzIHNlcXVlbmNlLgotCi0vLyBSVU46IC1lICdzLyckKGVjaG8gLW5lICJceDVhMyIpJy8nJChlY2hvIC1uZSAiXHhlMlx4ODBceDljIiknL2cnIFwKLQotLy8gWzB4RTIsIDB4ODAsIDB4OURdIGluIFVURi04IGlzIFUrMjAxRCwgcmlnaHQgcXVvdGUuCi0vLyBJdCBiZWNvbWVzIHNpbmdsZSBjaGFyYWN0ZXIgdW5rbm93biB0b2tlbi4KLS8vIE1hcmtlcig0KSBpcyByZXBsYWNlZCB0byB0aGlzIHNlcXVlbmNlLgotCi0vLyBSVU46IC1lICdzLyckKGVjaG8gLW5lICJceDVhNCIpJy8nJChlY2hvIC1uZSAiXHhlMlx4ODBceDlkIiknL2cnIFwKLQotLy8gWzB4RTEsIDB4OUEsIDB4ODBdIGluIFVURi04IGlzIFUrMTY4MC4KLS8vIFRoaXMgY2hhcmFjdGVyIGlzIGludmFsaWQgZm9yIHN3aWZ0IHNvdXJjZS4KLS8vIEl0IGJlY29tZXMgZ2FyYmFnZSB0cml2aWEuCi0vLyBNYXJrZXIoNSkgaXMgcmVwbGFjZWQgdG8gdGhpcyBzZXF1ZW5jZS4KLQotLy8gUlVOOiAtZSAncy8nJChlY2hvIC1uZSAiXHg1YTUiKScvJyQoZWNobyAtbmUgIlx4ZTFceDlhXHg4MCIpJy9nJyBcCi0KLS8vIFJVTjogPiAldAotCisvLyBSVU46IGNhdCAlcyB8IHNlZCAtZiAlUy9JbnB1dHMvaW52YWxpZC5zZWQgPiAldAorLy8gUlVOOiAle3B5dGhvbn0gLWMgImltcG9ydCBzeXM7IHQgPSBvcGVuKHN5cy5hcmd2WzFdLCAncmInKS5yZWFkKCkucmVwbGFjZSgnXHJcbicsICdcbicpOyBvcGVuKHN5cy5hcmd2WzFdLCAnd2InKS53cml0ZSh0KSIgJXQKIC8vIFJVTjogJXN3aWZ0LXN5bnRheC10ZXN0IC1pbnB1dC1zb3VyY2UtZmlsZW5hbWUgJXQgLWR1bXAtZnVsbC10b2tlbnMgMj4mMSB8ICVGaWxlQ2hlY2sgJXQKIC8vIFJVTjogJXJvdW5kLXRyaXAtc3ludGF4LXRlc3QgLS1zd2lmdC1zeW50YXgtdGVzdCAlc3dpZnQtc3ludGF4LXRlc3QgLS1maWxlICV0CiAKQEAgLTY2LDIwICsyOCwyMCBAQAogampqCiAKIC8vIERpYWdub3N0aWNzCi0vLyBDSEVDSzogNTI6MTogZXJyb3I6IGludmFsaWQgVVRGLTggZm91bmQgaW4gc291cmNlIGZpbGUKLS8vIENIRUNLOiA1Mjo3OiBlcnJvcjogaW52YWxpZCBVVEYtOCBmb3VuZCBpbiBzb3VyY2UgZmlsZQotLy8gQ0hFQ0s6IDU0OjU6IGVycm9yOiBhbiBpZGVudGlmaWVyIGNhbm5vdCBiZWdpbiB3aXRoIHRoaXMgY2hhcmFjdGVyCi0vLyBDSEVDSzogNTY6NTogZXJyb3I6IGFuIGlkZW50aWZpZXIgY2Fubm90IGJlZ2luIHdpdGggdGhpcyBjaGFyYWN0ZXIKLS8vIENIRUNLOiA1ODo1OiBlcnJvcjogdW5pY29kZSBjdXJseSBxdW90ZSBmb3VuZAotLy8gQ0hFQ0s6IDU4Ojg6IGVycm9yOiB1bmljb2RlIGN1cmx5IHF1b3RlIGZvdW5kCi0vLyBDSEVDSzogNjA6MTk6IGVycm9yOiB1bmljb2RlIGN1cmx5IHF1b3RlIGZvdW5kCi0vLyBDSEVDSzogNjA6NTogZXJyb3I6IHVuaWNvZGUgY3VybHkgcXVvdGUgZm91bmQKLS8vIENIRUNLOiA2Mjo1OiBlcnJvcjogdW5pY29kZSBjdXJseSBxdW90ZSBmb3VuZAotLy8gQ0hFQ0s6IDY1OjE6IGVycm9yOiBpbnZhbGlkIGNoYXJhY3RlciBpbiBzb3VyY2UgZmlsZQotLy8gQ0hFQ0s6IDY1Ojk6IGVycm9yOiBpbnZhbGlkIGNoYXJhY3RlciBpbiBzb3VyY2UgZmlsZQorLy8gQ0hFQ0s6IDE0OjE6IGVycm9yOiBpbnZhbGlkIFVURi04IGZvdW5kIGluIHNvdXJjZSBmaWxlCisvLyBDSEVDSzogMTQ6NzogZXJyb3I6IGludmFsaWQgVVRGLTggZm91bmQgaW4gc291cmNlIGZpbGUKKy8vIENIRUNLOiAxNjo1OiBlcnJvcjogYW4gaWRlbnRpZmllciBjYW5ub3QgYmVnaW4gd2l0aCB0aGlzIGNoYXJhY3RlcgorLy8gQ0hFQ0s6IDE4OjU6IGVycm9yOiBhbiBpZGVudGlmaWVyIGNhbm5vdCBiZWdpbiB3aXRoIHRoaXMgY2hhcmFjdGVyCisvLyBDSEVDSzogMjA6NTogZXJyb3I6IHVuaWNvZGUgY3VybHkgcXVvdGUgZm91bmQKKy8vIENIRUNLOiAyMDo4OiBlcnJvcjogdW5pY29kZSBjdXJseSBxdW90ZSBmb3VuZAorLy8gQ0hFQ0s6IDIyOjE5OiBlcnJvcjogdW5pY29kZSBjdXJseSBxdW90ZSBmb3VuZAorLy8gQ0hFQ0s6IDIyOjU6IGVycm9yOiB1bmljb2RlIGN1cmx5IHF1b3RlIGZvdW5kCisvLyBDSEVDSzogMjQ6NTogZXJyb3I6IHVuaWNvZGUgY3VybHkgcXVvdGUgZm91bmQKKy8vIENIRUNLOiAyNzoxOiBlcnJvcjogaW52YWxpZCBjaGFyYWN0ZXIgaW4gc291cmNlIGZpbGUKKy8vIENIRUNLOiAyNzo5OiBlcnJvcjogaW52YWxpZCBjaGFyYWN0ZXIgaW4gc291cmNlIGZpbGUKIAogLy8gQ2hlY2tzIGFyb3VuZCBiYmIKLS8vIENIRUNLLUxBQkVMOiA1MjozCisvLyBDSEVDSy1MQUJFTDogMTQ6MwogLy8gQ0hFQ0stTkVYVDogIChUb2tlbiBpZGVudGlmaWVyCiAvLyBDSEVDSy1ORVhUOiAgICh0cml2aWEgbmV3bGluZSAxKQogLy8gQ0hFQ0stTkVYVDogICAodHJpdmlhIGdhcmJhZ2VUZXh0IFwzMDIpCkBAIC04OSwzNSArNTEsMzUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgKHRyaXZpYSBnYXJiYWdlVGV4dCBcMzAyKSkKIAogLy8gQ2hlY2tzIGFyb3VuZCBjY2MKLS8vIENIRUNLLUxBQkVMOiA1NDo1CisvLyBDSEVDSy1MQUJFTDogMTY6NQogLy8gQ0hFQ0stTkVYVDogIChUb2tlbiB1bmtub3duCiAvLyBDSEVDSy1ORVhUOiAgICh0ZXh0PSJceENDXHg4MiIpKQogCiAvLyBDaGVja3MgYXJvdW5kIGRkZAotLy8gQ0hFQ0stTEFCRUw6IDU2OjUKKy8vIENIRUNLLUxBQkVMOiAxODo1CiAvLyBDSEVDSy1ORVhUOiAgKFRva2VuIHVua25vd24KIC8vIENIRUNLLU5FWFQ6ICAgKHRleHQ9Ilx4Q0NceDgyXHhDQ1x4ODJceENDXHg4Mlx4Q0NceDgyIikpCiAKIC8vIENoZWNrcyBhcm91bmQgZWVlCi0vLyBDSEVDSy1MQUJFTDogNTg6NQorLy8gQ0hFQ0stTEFCRUw6IDIwOjUKIC8vIENIRUNLLU5FWFQ6ICAoVG9rZW4gdW5rbm93bgogLy8gQ0hFQ0stTkVYVDogICAodGV4dD0iXHhFMlx4ODBceDlDIikpCi0vLyBDSEVDSy1MQUJFTDogNTg6OAorLy8gQ0hFQ0stTEFCRUw6IDIwOjgKIC8vIENIRUNLLU5FWFQ6ICAoVG9rZW4gdW5rbm93bgogLy8gQ0hFQ0stTkVYVDogICAodGV4dD0iXHhFMlx4ODBceDlDIikpCiAKIC8vIENoZWNrcyBhcm91bmQgZmZmCi0vLyBDSEVDSy1MQUJFTDogNjA6NQorLy8gQ0hFQ0stTEFCRUw6IDIyOjUKIC8vIENIRUNLLU5FWFQ6ICAoVG9rZW4gdW5rbm93bgogLy8gQ0hFQ0stTkVYVDogICAodGV4dD0iXHhFMlx4ODBceDlDaGVsbG8gd29ybGRceEUyXHg4MFx4OUQiKSkKIAogLy8gQ2hlY2tzIGFyb3VuZCBnZ2cKLS8vIENIRUNLLUxBQkVMOiA2Mjo1CisvLyBDSEVDSy1MQUJFTDogMjQ6NQogLy8gQ0hFQ0stTkVYVDogIChUb2tlbiB1bmtub3duCiAvLyBDSEVDSy1ORVhUOiAgICh0ZXh0PSJceEUyXHg4MFx4OUQiKSkKIAogLy8gQ2hlY2tzIGFyb3VuZCBpaWkKLS8vIENIRUNLLUxBQkVMOiA2NTo1CisvLyBDSEVDSy1MQUJFTDogMjc6NQogLy8gQ0hFQ0stTkVYVDogIChUb2tlbiBpZGVudGlmaWVyCiAvLyBDSEVDSy1ORVhUOiAgICh0cml2aWEgbmV3bGluZSAxKQogLy8gQ0hFQ0stTkVYVDogICAodHJpdmlhIGdhcmJhZ2VUZXh0IFwzNDFcMjMyXDIwMCkKZGlmZiAtLWdpdCBhL3Rlc3QvYXBpLWRpZ2VzdGVyL091dHB1dHMvc3RhYmlsaXR5LXN0ZGxpYi1hYmkuc3dpZnQuZXhwZWN0ZWQgYi90ZXN0L2FwaS1kaWdlc3Rlci9PdXRwdXRzL3N0YWJpbGl0eS1zdGRsaWItYWJpLnN3aWZ0LmV4cGVjdGVkCmluZGV4IGY4YTJhYjEuLmQwNjY4M2EgMTAwNjQ0Ci0tLSBhL3Rlc3QvYXBpLWRpZ2VzdGVyL091dHB1dHMvc3RhYmlsaXR5LXN0ZGxpYi1hYmkuc3dpZnQuZXhwZWN0ZWQKKysrIGIvdGVzdC9hcGktZGlnZXN0ZXIvT3V0cHV0cy9zdGFiaWxpdHktc3RkbGliLWFiaS5zd2lmdC5leHBlY3RlZApAQCAtNzEsMyArNzEsNSBAQAogVmFyIF9OYXRpdmVTZXQuX3N0b3JhZ2UgaGFzIGRlY2xhcmVkIHR5cGUgY2hhbmdlIGZyb20gX1Jhd1NldFN0b3JhZ2UgdG8gX19SYXdTZXRTdG9yYWdlCiBWYXIgX1Jhd0RpY3Rpb25hcnlTdG9yYWdlLmVtcHR5IGhhcyBkZWNsYXJlZCB0eXBlIGNoYW5nZSBmcm9tIF9FbXB0eURpY3Rpb25hcnlTaW5nbGV0b24gdG8gX19FbXB0eURpY3Rpb25hcnlTaW5nbGV0b24KIFZhciBfUmF3U2V0U3RvcmFnZS5lbXB0eSBoYXMgZGVjbGFyZWQgdHlwZSBjaGFuZ2UgZnJvbSBfRW1wdHlTZXRTaW5nbGV0b24gdG8gX19FbXB0eVNldFNpbmdsZXRvbgorCitGdW5jIHRyeVJlYWxsb2NhdGVVbmlxdWVseVJlZmVyZW5jZWQoYnVmZmVyOm5ld01pbmltdW1DYXBhY2l0eTopIGhhcyBiZWVuIHJlbW92ZWQKZGlmZiAtLWdpdCBhL3Rlc3QvYXBpLWRpZ2VzdGVyL091dHB1dHMvc3RhYmlsaXR5LXN0ZGxpYi1zb3VyY2Uuc3dpZnQuZXhwZWN0ZWQgYi90ZXN0L2FwaS1kaWdlc3Rlci9PdXRwdXRzL3N0YWJpbGl0eS1zdGRsaWItc291cmNlLnN3aWZ0LmV4cGVjdGVkCmluZGV4IGU2OWRlMjkuLjU2NzhiZGIgMTAwNjQ0Ci0tLSBhL3Rlc3QvYXBpLWRpZ2VzdGVyL091dHB1dHMvc3RhYmlsaXR5LXN0ZGxpYi1zb3VyY2Uuc3dpZnQuZXhwZWN0ZWQKKysrIGIvdGVzdC9hcGktZGlnZXN0ZXIvT3V0cHV0cy9zdGFiaWxpdHktc3RkbGliLXNvdXJjZS5zd2lmdC5leHBlY3RlZApAQCAtMCwwICsxIEBACitGdW5jIHRyeVJlYWxsb2NhdGVVbmlxdWVseVJlZmVyZW5jZWQoYnVmZmVyOm5ld01pbmltdW1DYXBhY2l0eTopIGhhcyBiZWVuIHJlbW92ZWQKZGlmZiAtLWdpdCBhL3Rlc3QvZGVjbC9mdW5jL3JldGhyb3dzLnN3aWZ0IGIvdGVzdC9kZWNsL2Z1bmMvcmV0aHJvd3Muc3dpZnQKaW5kZXggODZjYTc0Ni4uNDZkZTY1OSAxMDA2NDQKLS0tIGEvdGVzdC9kZWNsL2Z1bmMvcmV0aHJvd3Muc3dpZnQKKysrIGIvdGVzdC9kZWNsL2Z1bmMvcmV0aHJvd3Muc3dpZnQKQEAgLTU4NCwzICs1ODQsMjIgQEAKIH0KIAogQm94KHVuYm94OiAxKSB8PiBzdWNoVGhhdCA8fCB7ICQwICsgMSB9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZXN1bHQgb2Ygb3BlcmF0b3IgJzx8JyBpcyB1bnVzZWR9fQorCisvLyBDb25zdHJ1Y3RvciBkZWxlZ2F0aW9uIC12cy0gcmV0aHJvd3MKK2NsYXNzIFJldGhyb3dpbmdDb25zdHJ1Y3RvciB7CisgIGluaXQoXyBibG9jazogKCkgdGhyb3dzIC0+ICgpKSByZXRocm93cyB7CisgICAgdHJ5IGJsb2NrKCkKKyAgfQorCisgIGNvbnZlbmllbmNlIGluaXQoYmFyOiBJbnQpIHsKKyAgICBzZWxmLmluaXQgeworICAgICAgcHJpbnQoIkZvbyEiKQorICAgIH0KKyAgfQorCisgIGNvbnZlbmllbmNlIGluaXQoYmF6OiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHNlbGYuaW5pdCB7CisgICAgICB0cnkgdGhyb3dpbmdGdW5jKCkKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2xpdC5jZmcgYi90ZXN0L2xpdC5jZmcKaW5kZXggZGY4MWJmYy4uNjQwYzkyNiAxMDA2NDQKLS0tIGEvdGVzdC9saXQuY2ZnCisrKyBiL3Rlc3QvbGl0LmNmZwpAQCAtMTI3NSw2ICsxMjc1LDggQEAKIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoJyV0YXJnZXQtbGQnLCBjb25maWcudGFyZ2V0X2xkKSkKIGlmIGhhc2F0dHIoY29uZmlnLCAndGFyZ2V0X2NjX29wdGlvbnMnKToKICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCcldGFyZ2V0LWNjLW9wdGlvbnMnLCBjb25maWcudGFyZ2V0X2NjX29wdGlvbnMpKQorZWxzZToKKyAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCcldGFyZ2V0LWNjLW9wdGlvbnMnLCAnJykpCiAKIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgKICAgICAociclaGFyZGxpbmstb3ItY29weVwoZnJvbTogKiguKiksICp0bzogKiguKilcKScsCkBAIC0xMzI1LDcgKzEzMjcsNyBAQAogY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgnJXRhcmdldC1zd2lmdC1tb2R1bGV3cmFwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRhcmdldF9zd2lmdF9tb2R1bGV3cmFwKSkKIAotcGxhdGZvcm1fbW9kdWxlX2RpciA9IG1ha2VfcGF0aCh0ZXN0X3Jlc291cmNlX2RpciwgJyV0YXJnZXQtc2RrLW5hbWUnLCBydW5fY3B1KQorcGxhdGZvcm1fbW9kdWxlX2RpciA9IG1ha2VfcGF0aCh0ZXN0X3Jlc291cmNlX2RpciwgY29uZmlnLnRhcmdldF9zZGtfbmFtZSwgcnVuX2NwdSkKIGxpdF9jb25maWcubm90ZSgnVXNpbmcgcGxhdGZvcm0gbW9kdWxlIGRpcjogJyArIHBsYXRmb3JtX21vZHVsZV9kaXIpCiBpZiB0ZXN0X3Nka19vdmVybGF5X2RpciBpcyBub3QgTm9uZToKICAgICBwbGF0Zm9ybV9zZGtfb3ZlcmxheV9kaXIgPSBtYWtlX3BhdGgodGVzdF9zZGtfb3ZlcmxheV9kaXIsIHJ1bl9jcHUpCmRpZmYgLS1naXQgYS90ZXN0L3JlbW90ZS1ydW4vdXBsb2FkLXN0ZGVyci50ZXN0LXNoIGIvdGVzdC9yZW1vdGUtcnVuL3VwbG9hZC1zdGRlcnIudGVzdC1zaAppbmRleCBlNmE4ODNkLi4zZWQ2YmQ1IDEwMDY0NAotLS0gYS90ZXN0L3JlbW90ZS1ydW4vdXBsb2FkLXN0ZGVyci50ZXN0LXNoCisrKyBiL3Rlc3QvcmVtb3RlLXJ1bi91cGxvYWQtc3RkZXJyLnRlc3Qtc2gKQEAgLTEsNCArMSw1IEBACiBSRVFVSVJFUzogc2Z0cF9zZXJ2ZXIKKy8vIFhGQUlMOiBDUFU9cG93ZXJwYzY0bGUKIAogUlVOOiAlZW1wdHktZGlyZWN0b3J5KCV0KQogUlVOOiAlZW1wdHktZGlyZWN0b3J5KCV0L1JFTU9URS9pbnB1dCkKZGlmZiAtLWdpdCBhL3Rlc3Qvc3RkbGliL0NvbXByZXNzaW9uLnN3aWZ0IGIvdGVzdC9zdGRsaWIvQ29tcHJlc3Npb24uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2ODc0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RkbGliL0NvbXByZXNzaW9uLnN3aWZ0CkBAIC0wLDAgKzEsMTQ4IEBACisvLyBSVU46ICV0YXJnZXQtcnVuLXNpbXBsZS1zd2lmdAorLy8gUkVRVUlSRVM6IGV4ZWN1dGFibGVfdGVzdAorLy8gUkVRVUlSRVM6IG9iamNfaW50ZXJvcAorCitpbXBvcnQgU3RkbGliVW5pdHRlc3QKK2ltcG9ydCBDb21wcmVzc2lvbgoraW1wb3J0IEZvdW5kYXRpb24KKworLy8gUmVhZCBmcm9tIERhdGEKK2NsYXNzIERhdGFTb3VyY2UgeworCisgIHByaXZhdGUgdmFyIF9idWYgOiBEYXRhCisgIHByaXZhdGUgdmFyIF9idWZTaXplIDogSW50IC8vIHRvdGFsIGJ5dGUgY291bnQKKyAgcHJpdmF0ZSB2YXIgX3BvcyA6IEludCAgLy8gbmV4dCBieXRlIHRvIHJlYWQKKworICBwdWJsaWMgaW5pdChfIGQ6IERhdGEpIHsKKyAgICBfYnVmID0gZAorICAgIF9idWZTaXplID0gZC5jb3VudAorICAgIF9wb3MgPSAwCisgIH0KKworICBwdWJsaWMgZnVuYyByZWFkRGF0YShvZkxlbmd0aCBsZW46IEludCkgLT4gRGF0YT8geworICAgIGxldCBuID0gbWluKGxlbixfYnVmU2l6ZSAtIF9wb3MpCisgICAgaWYgKG4gPT0gMCkgeyByZXR1cm4gbmlsIH0gLy8gRU9GCisgICAgbGV0IGQgPSBfYnVmLnN1YmRhdGEoaW46IF9wb3MgLi48IF9wb3MgKyBuKQorICAgIF9wb3MgKz0gbgorICAgIHJldHVybiBkCisgIH0KKworfQorCitAYXZhaWxhYmxlKG1hY09TIDEwLjEyLCBpT1MgMTAuMCwgd2F0Y2hPUyAzLjAsIHR2T1MgMTAuMCwgKikKK2Z1bmMgb2ZpbHRlcmNvbXByZXNzX2lmaWx0ZXJkZWNvbXByZXNzKAorICBfIGNvbnRlbnRzOiBEYXRhLCB1c2luZyBhbGdvOiBBbGdvcml0aG0KKykgdGhyb3dzIC0+IEJvb2wgeworCisgIHZhciBwYXlsb2FkID0gRGF0YSgpCisgIHZhciBkZWNvbXByZXNzZWQgPSBEYXRhKCkKKworICAvLyBPdXRwdXQgZmlsdGVyIGNvbXByZXNzCisgIGxldCBmID0gRGF0YVNvdXJjZShjb250ZW50cykKKyAgbGV0IG9maWx0ZXIgPSB0cnkgT3V0cHV0RmlsdGVyKC5jb21wcmVzcywgdXNpbmc6IGFsZ28pIHsgKHg6IERhdGE/KSAtPiAoKSBpbgorICAgICAgaWYgbGV0IHggPSB4IHsgcGF5bG9hZC5hcHBlbmQoeCkgfQorICB9CisgIHdoaWxlICh0cnVlKSB7CisgICAgbGV0IGkgPSBmLnJlYWREYXRhKG9mTGVuZ3RoOiA5MDApCisgICAgdHJ5IG9maWx0ZXIud3JpdGUoaSkgLy8gd2lsbCBmaW5hbGl6ZSB3aGVuIGkgaXMgZW1wdHkKKyAgICBpZiBpID09IG5pbCB7IGJyZWFrIH0KKyAgfQorCisgIC8vIElucHV0IGZpbHRlciBkZWNvbXByZXNzCisgIGxldCBnID0gRGF0YVNvdXJjZShwYXlsb2FkKQorICBsZXQgaWZpbHRlciA9IHRyeSBJbnB1dEZpbHRlciguZGVjb21wcmVzcywgdXNpbmc6IGFsZ28pIHsgKHg6IEludCkgLT4gRGF0YT8gaW4KKyAgICByZXR1cm4gZy5yZWFkRGF0YShvZkxlbmd0aDogeCkKKyAgfQorICB3aGlsZSBsZXQgaSA9IHRyeSBpZmlsdGVyLnJlYWREYXRhKG9mTGVuZ3RoOiA0MDApIHsKKyAgICBkZWNvbXByZXNzZWQuYXBwZW5kKGkpCisgIH0KKworICBwcmludCgib2ZpbHRlciB8IGlmaWx0ZXIgXChhbGdvKTogXChjb250ZW50cy5jb3VudCkgLT4gXChwYXlsb2FkLmNvdW50KSAtPiBcKGRlY29tcHJlc3NlZC5jb3VudCkiKQorICByZXR1cm4gY29udGVudHMgPT0gZGVjb21wcmVzc2VkCit9CisKK0BhdmFpbGFibGUobWFjT1MgMTAuMTIsIGlPUyAxMC4wLCB3YXRjaE9TIDMuMCwgdHZPUyAxMC4wLCAqKQorZnVuYyBpZmlsdGVyY29tcHJlc3Nfb2ZpbHRlcmRlY29tcHJlc3MoCisgIF8gY29udGVudHM6IERhdGEsIHVzaW5nIGFsZ286IEFsZ29yaXRobQorKSB0aHJvd3MgLT4gQm9vbCB7CisKKyAgdmFyIHBheWxvYWQgPSBEYXRhKCkKKyAgdmFyIGRlY29tcHJlc3NlZCA9IERhdGEoKQorCisgIC8vIElucHV0IGZpbHRlciBjb21wcmVzcworICBsZXQgZiA9IERhdGFTb3VyY2UoY29udGVudHMpCisgIGxldCBpZmlsdGVyID0gdHJ5IElucHV0RmlsdGVyKC5jb21wcmVzcywgdXNpbmc6IGFsZ28pIHsoeDogSW50KSAtPiBEYXRhPyBpbgorICAgIHJldHVybiBmLnJlYWREYXRhKG9mTGVuZ3RoOngpCisgIH0KKyAgd2hpbGUgbGV0IGkgPSB0cnkgaWZpbHRlci5yZWFkRGF0YShvZkxlbmd0aDogNDAwKSB7CisgICAgcGF5bG9hZC5hcHBlbmQoaSkKKyAgfQorCisgIC8vIE91dHB1dCBmaWx0ZXIgZGVjb21wcmVzcworICBsZXQgZyA9IERhdGFTb3VyY2UocGF5bG9hZCkKKyAgbGV0IG9maWx0ZXIgPSB0cnkgT3V0cHV0RmlsdGVyKC5kZWNvbXByZXNzLCB1c2luZzogYWxnbykgeyh4OiBEYXRhPykgLT4gKCkgaW4KKyAgICBpZiBsZXQgeCA9IHggeworICAgICAgZGVjb21wcmVzc2VkLmFwcGVuZCh4KQorICAgIH0KKyAgfQorICB3aGlsZSAodHJ1ZSkgeworICAgIGxldCBpID0gZy5yZWFkRGF0YShvZkxlbmd0aDogOTAwKQorICAgIHRyeSBvZmlsdGVyLndyaXRlKGkpIC8vIHdpbGwgZmluYWxpemUgd2hlbiBpIGlzIGVtcHR5CisgICAgaWYgaSA9PSBuaWwgeyBicmVhayB9CisgIH0KKworICBwcmludCgiaWZpbHRlciB8IG9maWx0ZXIgXChhbGdvKTogXChjb250ZW50cy5jb3VudCkgLT4gXChwYXlsb2FkLmNvdW50KSAtPiBcKGRlY29tcHJlc3NlZC5jb3VudCkiKQorCisgIHJldHVybiBjb250ZW50cyA9PSBkZWNvbXByZXNzZWQKK30KKworZnVuYyByYW5kb21TdHJpbmcod2l0aEJsb2NrTGVuZ3RoIG46IEludCkgLT4gU3RyaW5nIHsKKyAgdmFyIHN0cmluZ3MgPSBbU3RyaW5nXSgpCisgIGZvciBfIGluIDAgLi48IG4geworICAgIHZhciBzID0gIkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiAiCisgICAgICAvLyBDaGFuZ2Ugc29tZSByYW5kb20gY2hhcnMKKyAgICAgIGZvciBfIGluIDEuLi4xMCB7CisgICAgICAgIGxldCBwb3MgPSBJbnQucmFuZG9tKGluOiAwIC4uPCBzLmNvdW50KQorICAgICAgICBsZXQgaWR4ID0gcy5pbmRleChzLnN0YXJ0SW5kZXgsIG9mZnNldEJ5OiBwb3MpCisgICAgICAgIHMgPSBTdHJpbmcoc1suLjxpZHhdICsgIiMiICsgc1tpZHguLi5dKQorICAgICAgfQorICAgIHN0cmluZ3MuYXBwZW5kKHMpCisgIH0KKyAgcmV0dXJuIHN0cmluZ3Muam9pbmVkKHNlcGFyYXRvcjogIiIpCit9CisKK2xldCB0ZXN0cyA9IFRlc3RTdWl0ZSgiQ29tcHJlc3Npb24iKQorCitpZiAjYXZhaWxhYmxlKG1hY09TIDEwLjEyLCBpT1MgMTAuMCwgd2F0Y2hPUyAzLjAsIHR2T1MgMTAuMCwgKikgeworCisgIGRvIHsKKyAgICBmb3IgYmxvY2tMZW5ndGggaW4gWzAsIDEsIDIsIDUsIDEwLCAxMDBdIHsKKyAgICAgIGxldCB0ZXN0U3RyaW5nID0gcmFuZG9tU3RyaW5nKHdpdGhCbG9ja0xlbmd0aDogYmxvY2tMZW5ndGgpCisgICAgICBsZXQgY29udGVudHMgPSB0ZXN0U3RyaW5nLmRhdGEodXNpbmc6IC51dGY4KSEKKworICAgICAgZm9yIGFsZ28gaW4gQWxnb3JpdGhtLmFsbENhc2VzIHsKKyAgICAgICAgdGVzdHMudGVzdCgiT3V0cHV0RmlsdGVyL0NvbXByZXNzL0lucHV0RmlsdGVyL0RlY29tcHJlc3MvXChhbGdvKS9cKGJsb2NrTGVuZ3RoKSIpIHsKKyAgICAgICAgICBleHBlY3REb2VzTm90VGhyb3coeworICAgICAgICAgICAgZXhwZWN0VHJ1ZSgKKyAgICAgICAgICAgICAgdHJ5IG9maWx0ZXJjb21wcmVzc19pZmlsdGVyZGVjb21wcmVzcyhjb250ZW50cywgdXNpbmc6IGFsZ28pLAorICAgICAgICAgICAgICAiRmFpbGluZyBpbnB1dDogXCh0ZXN0U3RyaW5nKSIKKyAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgICAgICB9CisKKyAgICAgICAgdGVzdHMudGVzdCgiSW5wdXRGaWx0ZXIvQ29tcHJlc3MvT3V0cHV0RmlsdGVyL0RlY29tcHJlc3MvXChhbGdvKS9cKGJsb2NrTGVuZ3RoKSIpIHsKKyAgICAgICAgICBleHBlY3REb2VzTm90VGhyb3coeworICAgICAgICAgICAgZXhwZWN0VHJ1ZSgKKyAgICAgICAgICAgICAgdHJ5IGlmaWx0ZXJjb21wcmVzc19vZmlsdGVyZGVjb21wcmVzcyhjb250ZW50cywgdXNpbmc6IGFsZ28pLAorICAgICAgICAgICAgICAiRmFpbGluZyBpbnB1dDogXCh0ZXN0U3RyaW5nKSIKKyAgICAgICAgICAgICkKKyAgICAgICAgICB9KQorICAgICAgICB9CisgICAgICB9CisKKyAgICB9IC8vIGJsb2NrTGVuZ3RoCisgIH0KKworfQorCitydW5BbGxUZXN0cygpCmRpZmYgLS1naXQgYS90ZXN0L3N0ZGxpYi9NYW5hZ2VkQnVmZmVyLnN3aWZ0IGIvdGVzdC9zdGRsaWIvTWFuYWdlZEJ1ZmZlci5zd2lmdAppbmRleCA4ZDM5ZDNmLi4yNGQyODhjIDEwMDY0NAotLS0gYS90ZXN0L3N0ZGxpYi9NYW5hZ2VkQnVmZmVyLnN3aWZ0CisrKyBiL3Rlc3Qvc3RkbGliL01hbmFnZWRCdWZmZXIuc3dpZnQKQEAgLTQwLDcgKzQwLDcgQEAKIAogc3RydWN0IENvdW50QW5kQ2FwYWNpdHkgewogICB2YXIgY291bnQ6IExpZmV0aW1lVHJhY2tlZAotICB2YXIgY2FwYWNpdHk6IEludAorICBsZXQgY2FwYWNpdHk6IEludAogfQogCiAvLyBBbiBleGFtcGxlIG9mIE1hbmFnZWRCdWZmZXIsIHZlcnkgc2ltaWxhciB0byB3aGF0IEFycmF5IHdpbGwgdXNlLgpAQCAtOTYsMjMgKzk2LDYgQEAKICAgICB9CiAgICAgc2VsZi5jb3VudCA9IGNvdW50ICsgMgogICB9Ci0KLSAgY2xhc3MgZnVuYyB0cnlHcm93KF8gYnVmZmVyOiBpbm91dCBUZXN0TWFuYWdlZEJ1ZmZlcjxUPiwgbmV3Q2FwYWNpdHk6IEludCkgLT4gQm9vbCB7Ci0gICAgZ3VhcmQgaXNLbm93blVuaXF1ZWx5UmVmZXJlbmNlZCgmYnVmZmVyKSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZQotICAgIH0KLSAgICBndWFyZCBuZXdDYXBhY2l0eSA+IGJ1ZmZlci5jYXBhY2l0eSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZQotICAgIH0KLQotICAgIGlmIHRyeVJlYWxsb2NhdGVVbmlxdWVseVJlZmVyZW5jZWQoYnVmZmVyOiAmYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWluaW11bUNhcGFjaXR5OiBuZXdDYXBhY2l0eSkgewotICAgICAgYnVmZmVyLmhlYWRlci5jYXBhY2l0eSA9IG5ld0NhcGFjaXR5Ci0gICAgICByZXR1cm4gdHJ1ZQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2UKLSAgICB9Ci0gIH0KIH0KIAogY2xhc3MgTXlCdWZmZXI8VD4gewpAQCAtMjU4LDM1ICsyNDEsNCBAQAogICBfZml4TGlmZXRpbWUoczIpCiB9CiAKLXRlc3RzLnRlc3QoImNhbkdyb3dVc2luZ1JlYWxsb2MiKSB7Ci0gICNpZiBvcyhtYWNPUykgfHwgb3MoaU9TKSB8fCBvcyh0dk9TKSB8fCBvcyh3YXRjaE9TKQotICByZXR1cm4gLy8gcmVhbGxvYyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgb24gRGFyd2luCi0gICNlbmRpZgotICBmdW5jIHRlc3RHcm93KF8gYnVmZmVyOiBpbm91dCBUZXN0TWFuYWdlZEJ1ZmZlcjxMaWZldGltZVRyYWNrZWQ+LAotICAgICAgICAgICAgICAgIG5ld0NhcGFjaXR5OiBJbnQsCi0gICAgICAgICAgICAgICAgc2hvdWxkU3VjY2VlZDogQm9vbCA9IHRydWUpIHsKLSAgICBsZXQgcyA9IFRlc3RNYW5hZ2VkQnVmZmVyLnRyeUdyb3coJmJ1ZmZlciwgbmV3Q2FwYWNpdHk6IG5ld0NhcGFjaXR5KQotICAgIGV4cGVjdEVxdWFsKHMsIHNob3VsZFN1Y2NlZWQpCi0gICAgaWYgc2hvdWxkU3VjY2VlZCB7Ci0gICAgICBleHBlY3RMRShuZXdDYXBhY2l0eSwgYnVmZmVyLm15Q2FwYWNpdHkpCi0gICAgICBleHBlY3RHRSgobmV3Q2FwYWNpdHkgKyAxKSAqIDIsIGJ1ZmZlci5teUNhcGFjaXR5KQotICAgIH0KLSAgICByZXBlYXQgewotICAgICAgYnVmZmVyLmFwcGVuZChMaWZldGltZVRyYWNrZWQoYnVmZmVyLmNvdW50KSkKLSAgICB9IHdoaWxlIGJ1ZmZlci5jb3VudCA8IGJ1ZmZlci5teUNhcGFjaXR5IC0gMgotICB9Ci0KLSAgdmFyIGIgPSBUZXN0TWFuYWdlZEJ1ZmZlcjxMaWZldGltZVRyYWNrZWQ+LmNyZWF0ZSgwKQotICAvLyBhbGxvdyBzb21lIG92ZXItYWxsb2NhdGlvbgotICBleHBlY3RMRSgwLCBiLm15Q2FwYWNpdHkpCi0gIGV4cGVjdEdFKDMsIGIubXlDYXBhY2l0eSkKLQotICB0ZXN0R3JvdygmYiwgbmV3Q2FwYWNpdHk6IDUpCi0gIHRlc3RHcm93KCZiLCBuZXdDYXBhY2l0eTogOCkKLSAgdGVzdEdyb3coJmIsIG5ld0NhcGFjaXR5OiAxMDAwKQotICB0ZXN0R3JvdygmYiwgbmV3Q2FwYWNpdHk6IDE2MDAwKQotICB2YXIgYjIgPSBiCi0gIHRlc3RHcm93KCZiLCBuZXdDYXBhY2l0eTogMjAwMCwgc2hvdWxkU3VjY2VlZDogZmFsc2UpCi19Ci0KIHJ1bkFsbFRlc3RzKCkKZGlmZiAtLWdpdCBhL3Rlc3Qvc3RtdC9zdGF0ZW1lbnRzLnN3aWZ0IGIvdGVzdC9zdG10L3N0YXRlbWVudHMuc3dpZnQKaW5kZXggZmQwYWU2Zi4uMDZlMDBiMCAxMDA2NDQKLS0tIGEvdGVzdC9zdG10L3N0YXRlbWVudHMuc3dpZnQKKysrIGIvdGVzdC9zdG10L3N0YXRlbWVudHMuc3dpZnQKQEAgLTUzNSw2ICs1MzUsNzAgQEAKICAgaWYgKHg6IDEpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7Jyh4OiBJbnQpJyBpcyBub3QgY29udmVydGlibGUgdG8gJ0Jvb2wnfX0KIH0KIAorLy8gVHlwbyBjb3JyZWN0aW9uIGZvciBsb29wIGxhYmVscworZm9yIF8gaW4gWzFdIHsKKyAgYnJlYWsgb3V0ZXJsb29wIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVucmVzb2x2ZWQgbGFiZWwgJ291dGVybG9vcCd9fQorICBjb250aW51ZSBvdXRlcmxvb3AgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5yZXNvbHZlZCBsYWJlbCAnb3V0ZXJsb29wJ319Cit9Cit3aGlsZSB0cnVlIHsKKyAgYnJlYWsgb3V0ZXJsb29wIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVucmVzb2x2ZWQgbGFiZWwgJ291dGVybG9vcCd9fQorICBjb250aW51ZSBvdXRlcmxvb3AgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5yZXNvbHZlZCBsYWJlbCAnb3V0ZXJsb29wJ319Cit9CityZXBlYXQgeworICBicmVhayBvdXRlcmxvb3AgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5yZXNvbHZlZCBsYWJlbCAnb3V0ZXJsb29wJ319CisgIGNvbnRpbnVlIG91dGVybG9vcCAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bnJlc29sdmVkIGxhYmVsICdvdXRlcmxvb3AnfX0KK30gd2hpbGUgdHJ1ZQorCitvdXRlckxvb3A6IGZvciBfIGluIFsxXSB7IC8vIGV4cGVjdGVkLW5vdGUge3snb3V0ZXJMb29wJyBkZWNsYXJlZCBoZXJlfX0KKyAgYnJlYWsgb3V0ZXJsb29wIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVucmVzb2x2ZWQgbGFiZWwgJ291dGVybG9vcCc7IGRpZCB5b3UgbWVhbiAnb3V0ZXJMb29wJz99fSB7ezktMTg9b3V0ZXJMb29wfX0KK30KK291dGVyTG9vcDogZm9yIF8gaW4gWzFdIHsgLy8gZXhwZWN0ZWQtbm90ZSB7eydvdXRlckxvb3AnIGRlY2xhcmVkIGhlcmV9fQorICBjb250aW51ZSBvdXRlcmxvb3AgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5yZXNvbHZlZCBsYWJlbCAnb3V0ZXJsb29wJzsgZGlkIHlvdSBtZWFuICdvdXRlckxvb3AnP319IHt7MTItMjE9b3V0ZXJMb29wfX0KK30KK291dGVyTG9vcDogd2hpbGUgdHJ1ZSB7IC8vIGV4cGVjdGVkLW5vdGUge3snb3V0ZXJMb29wJyBkZWNsYXJlZCBoZXJlfX0KKyAgYnJlYWsgb3V0ZXJsb29wIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVucmVzb2x2ZWQgbGFiZWwgJ291dGVybG9vcCc7IGRpZCB5b3UgbWVhbiAnb3V0ZXJMb29wJz99fSB7ezktMTg9b3V0ZXJMb29wfX0KK30KK291dGVyTG9vcDogd2hpbGUgdHJ1ZSB7IC8vIGV4cGVjdGVkLW5vdGUge3snb3V0ZXJMb29wJyBkZWNsYXJlZCBoZXJlfX0KKyAgY29udGludWUgb3V0ZXJsb29wIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVucmVzb2x2ZWQgbGFiZWwgJ291dGVybG9vcCc7IGRpZCB5b3UgbWVhbiAnb3V0ZXJMb29wJz99fSB7ezEyLTIxPW91dGVyTG9vcH19Cit9CitvdXRlckxvb3A6IHJlcGVhdCB7IC8vIGV4cGVjdGVkLW5vdGUge3snb3V0ZXJMb29wJyBkZWNsYXJlZCBoZXJlfX0KKyAgYnJlYWsgb3V0ZXJsb29wIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVucmVzb2x2ZWQgbGFiZWwgJ291dGVybG9vcCc7IGRpZCB5b3UgbWVhbiAnb3V0ZXJMb29wJz99fSB7ezktMTg9b3V0ZXJMb29wfX0KK30gd2hpbGUgdHJ1ZQorb3V0ZXJMb29wOiByZXBlYXQgeyAvLyBleHBlY3RlZC1ub3RlIHt7J291dGVyTG9vcCcgZGVjbGFyZWQgaGVyZX19CisgIGNvbnRpbnVlIG91dGVybG9vcCAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bnJlc29sdmVkIGxhYmVsICdvdXRlcmxvb3AnOyBkaWQgeW91IG1lYW4gJ291dGVyTG9vcCc/fX0ge3sxMi0yMT1vdXRlckxvb3B9fQorfSB3aGlsZSB0cnVlCisKK291dGVyTG9vcDE6IGZvciBfIGluIFsxXSB7IC8vIGV4cGVjdGVkLW5vdGUge3tkaWQgeW91IG1lYW4gJ291dGVyTG9vcDEnP319IHt7MTEtMjA9b3V0ZXJMb29wMX19CisgIG91dGVyTG9vcDI6IGZvciBfIGluIFsxXSB7IC8vIGV4cGVjdGVkLW5vdGUge3tkaWQgeW91IG1lYW4gJ291dGVyTG9vcDInP319IHt7MTEtMjA9b3V0ZXJMb29wMn19CisgICAgYnJlYWsgb3V0ZXJsb29wIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVucmVzb2x2ZWQgbGFiZWwgJ291dGVybG9vcCd9fQorICB9Cit9CitvdXRlckxvb3AxOiBmb3IgXyBpbiBbMV0geyAvLyBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuICdvdXRlckxvb3AxJz99fSB7ezE0LTIzPW91dGVyTG9vcDF9fQorICBvdXRlckxvb3AyOiBmb3IgXyBpbiBbMV0geyAvLyBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuICdvdXRlckxvb3AyJz99fSB7ezE0LTIzPW91dGVyTG9vcDJ9fQorICAgIGNvbnRpbnVlIG91dGVybG9vcCAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bnJlc29sdmVkIGxhYmVsICdvdXRlcmxvb3AnfX0KKyAgfQorfQorb3V0ZXJMb29wMTogd2hpbGUgdHJ1ZSB7IC8vIGV4cGVjdGVkLW5vdGUge3tkaWQgeW91IG1lYW4gJ291dGVyTG9vcDEnP319IHt7MTEtMjA9b3V0ZXJMb29wMX19CisgIG91dGVyTG9vcDI6IHdoaWxlIHRydWUgeyAvLyBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuICdvdXRlckxvb3AyJz99fSB7ezExLTIwPW91dGVyTG9vcDJ9fQorICAgIGJyZWFrIG91dGVybG9vcCAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bnJlc29sdmVkIGxhYmVsICdvdXRlcmxvb3AnfX0KKyAgfQorfQorb3V0ZXJMb29wMTogd2hpbGUgdHJ1ZSB7IC8vIGV4cGVjdGVkLW5vdGUge3tkaWQgeW91IG1lYW4gJ291dGVyTG9vcDEnP319IHt7MTQtMjM9b3V0ZXJMb29wMX19CisgIG91dGVyTG9vcDI6IHdoaWxlIHRydWUgeyAvLyBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuICdvdXRlckxvb3AyJz99fSB7ezE0LTIzPW91dGVyTG9vcDJ9fQorICAgIGNvbnRpbnVlIG91dGVybG9vcCAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bnJlc29sdmVkIGxhYmVsICdvdXRlcmxvb3AnfX0KKyAgfQorfQorb3V0ZXJMb29wMTogcmVwZWF0IHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RpZCB5b3UgbWVhbiAnb3V0ZXJMb29wMSc/fX0ge3sxMS0yMD1vdXRlckxvb3AxfX0KKyAgb3V0ZXJMb29wMjogcmVwZWF0IHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RpZCB5b3UgbWVhbiAnb3V0ZXJMb29wMic/fX0ge3sxMS0yMD1vdXRlckxvb3AyfX0KKyAgICBicmVhayBvdXRlcmxvb3AgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5yZXNvbHZlZCBsYWJlbCAnb3V0ZXJsb29wJ319CisgIH0gd2hpbGUgdHJ1ZQorfSB3aGlsZSB0cnVlCitvdXRlckxvb3AxOiByZXBlYXQgeyAvLyBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuICdvdXRlckxvb3AxJz99fSB7ezE0LTIzPW91dGVyTG9vcDF9fQorICBvdXRlckxvb3AyOiByZXBlYXQgeyAvLyBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuICdvdXRlckxvb3AyJz99fSB7ezE0LTIzPW91dGVyTG9vcDJ9fQorICAgIGNvbnRpbnVlIG91dGVybG9vcCAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bnJlc29sdmVkIGxhYmVsICdvdXRlcmxvb3AnfX0KKyAgfSB3aGlsZSB0cnVlCit9IHdoaWxlIHRydWUKKwogLy8gRXJyb3JzIGluIGNhc2Ugc3ludGF4CiBjbGFzcwogY2FzZSwgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBpZGVudGlmaWVyIGluIGVudW0gJ2Nhc2UnIGRlY2xhcmF0aW9ufX0gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBwYXR0ZXJufX0KZGlmZiAtLWdpdCBhL3Rvb2xzL1NvdXJjZUtpdC9saWIvU3dpZnRMYW5nL1N3aWZ0RG9jU3VwcG9ydC5jcHAgYi90b29scy9Tb3VyY2VLaXQvbGliL1N3aWZ0TGFuZy9Td2lmdERvY1N1cHBvcnQuY3BwCmluZGV4IDEzOTg5ZDcuLjdkNjQ0NDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL1NvdXJjZUtpdC9saWIvU3dpZnRMYW5nL1N3aWZ0RG9jU3VwcG9ydC5jcHAKKysrIGIvdG9vbHMvU291cmNlS2l0L2xpYi9Td2lmdExhbmcvU3dpZnREb2NTdXBwb3J0LmNwcApAQCAtNDEzLDYgKzQxMyw3IEBACiAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OlRvcExldmVsQ29kZURlY2w6CiAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkFic3RyYWN0RnVuY3Rpb25EZWNsOgogICAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpTdWJzY3JpcHREZWNsOgorICAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpFbnVtRWxlbWVudERlY2w6CiAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkluaXRpYWxpemVyOgogICAgIGNhc2UgRGVjbENvbnRleHRLaW5kOjpTZXJpYWxpemVkTG9jYWw6CiAgICAgY2FzZSBEZWNsQ29udGV4dEtpbmQ6OkV4dGVuc2lvbkRlY2w6CmRpZmYgLS1naXQgYS90b29scy9Tb3VyY2VLaXQvbGliL1N3aWZ0TGFuZy9Td2lmdEVkaXRvci5jcHAgYi90b29scy9Tb3VyY2VLaXQvbGliL1N3aWZ0TGFuZy9Td2lmdEVkaXRvci5jcHAKaW5kZXggYjE1MTg2My4uNDc5YzdlNSAxMDA2NDQKLS0tIGEvdG9vbHMvU291cmNlS2l0L2xpYi9Td2lmdExhbmcvU3dpZnRFZGl0b3IuY3BwCisrKyBiL3Rvb2xzL1NvdXJjZUtpdC9saWIvU3dpZnRMYW5nL1N3aWZ0RWRpdG9yLmNwcApAQCAtNjg1LDcgKzY4NSw3IEBACiAgICAgaWYgKENvbXBJbnYuZ2V0TGFuZ09wdGlvbnMoKS5CdWlsZFN5bnRheFRyZWUpIHsKICAgICAgIFJDPFN5bnRheEFyZW5hPiBzeW50YXhBcmVuYXtuZXcgc3ludGF4OjpTeW50YXhBcmVuYSgpfTsKICAgICAgIFN5blRyZWVDcmVhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxTeW50YXhUcmVlQ3JlYXRvcj4oCi0gICAgICAgICAgQ29tcEludi5nZXRNYWluRmlsZVN5bnRheFBhcnNpbmdDYWNoZSgpLCBzeW50YXhBcmVuYSk7CisgICAgICAgICAgU00sIEJ1ZmZlcklELCBDb21wSW52LmdldE1haW5GaWxlU3ludGF4UGFyc2luZ0NhY2hlKCksIHN5bnRheEFyZW5hKTsKICAgICB9CiAKICAgICBQYXJzZXIucmVzZXQoCmRpZmYgLS1naXQgYS90b29scy9kcml2ZXIvQ01ha2VMaXN0cy50eHQgYi90b29scy9kcml2ZXIvQ01ha2VMaXN0cy50eHQKaW5kZXggNTNlZTEyYi4uNzk2ZGEwOSAxMDA2NDQKLS0tIGEvdG9vbHMvZHJpdmVyL0NNYWtlTGlzdHMudHh0CisrKyBiL3Rvb2xzL2RyaXZlci9DTWFrZUxpc3RzLnR4dApAQCAtMSw1ICsxLDQgQEAKIGFkZF9zd2lmdF9ob3N0X3Rvb2woc3dpZnQKLSAgYXBpX25vdGVzLmNwcAogICBkcml2ZXIuY3BwCiAgIGF1dG9saW5rX2V4dHJhY3RfbWFpbi5jcHAKICAgbW9kdWxld3JhcF9tYWluLmNwcApkaWZmIC0tZ2l0IGEvdG9vbHMvZHJpdmVyL2FwaV9ub3Rlcy5jcHAgYi90b29scy9kcml2ZXIvYXBpX25vdGVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmODViYi4uMDAwMDAwMAotLS0gYS90b29scy9kcml2ZXIvYXBpX25vdGVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLz09PS0tLSBhcGlfbm90ZXMuY3BwIC0gU3dpZnQgQ29tcGlsZXIgRnJvbnRlbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgcGFydCBvZiB0aGUgU3dpZnQub3JnIG9wZW4gc291cmNlIHByb2plY3QKLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMTQgLSAyMDE3IEFwcGxlIEluYy4gYW5kIHRoZSBTd2lmdCBwcm9qZWN0IGF1dGhvcnMKLS8vIExpY2Vuc2VkIHVuZGVyIEFwYWNoZSBMaWNlbnNlIHYyLjAgd2l0aCBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uCi0vLwotLy8gU2VlIGh0dHBzOi8vc3dpZnQub3JnL0xJQ0VOU0UudHh0IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uCi0vLyBTZWUgaHR0cHM6Ly9zd2lmdC5vcmcvQ09OVFJJQlVUT1JTLnR4dCBmb3IgdGhlIGxpc3Qgb2YgU3dpZnQgcHJvamVjdCBhdXRob3JzCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vLwotLy8vIFxmaWxlCi0vLy8gVGhpcyBpcyB0aGUgWUFNTCB0byBiaW5hcnkgY29udmVydGVyIGZvciBBUEkgbm90ZXMuCi0vLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0jaW5jbHVkZSAiY2xhbmcvQVBJTm90ZXMvQVBJTm90ZXNZQU1MQ29tcGlsZXIuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TaWduYWxzLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci1uYW1lc3BhY2UgYXBpX25vdGVzID0gY2xhbmc6OmFwaV9ub3RlczsKLQotaW50IGFwaW5vdGVzX21haW4oQXJyYXlSZWY8Y29uc3QgY2hhciAqPiBBcmdzKSB7Ci0KLSAgLy8gTWFyayBhbGwgb3VyIG9wdGlvbnMgd2l0aCB0aGlzIGNhdGVnb3J5LCBldmVyeXRoaW5nIGVsc2UgKGV4Y2VwdCBmb3IKLSAgLy8gLXZlcnNpb24gYW5kIC1oZWxwKSB3aWxsIGJlIGhpZGRlbi4KLSAgc3RhdGljIGNsOjpPcHRpb25DYXRlZ29yeSBBUElOb3Rlc0NhdGVnb3J5KCJBUEkgTm90ZXMgb3B0aW9ucyIpOwotCi0gIHN0YXRpYyBjbDo6b3B0PGFwaV9ub3Rlczo6QWN0aW9uVHlwZT4KLSAgQWN0aW9uKGNsOjpkZXNjKCJNb2RlOiIpLCBjbDo6aW5pdChhcGlfbm90ZXM6OkFjdGlvblR5cGU6Ok5vbmUpLAotICAgICAgICAgY2w6OnZhbHVlcygKLSAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihhcGlfbm90ZXM6OkFjdGlvblR5cGU6OllBTUxUb0JpbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWFtbC10by1iaW5hcnkiLCAiQ29udmVydCBZQU1MIHRvIGJpbmFyeSBmb3JtYXQiKSwKLSAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihhcGlfbm90ZXM6OkFjdGlvblR5cGU6OkJpbmFyeVRvWUFNTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmluYXJ5LXRvLXlhbWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb252ZXJ0IGJpbmFyeSBmb3JtYXQgdG8gWUFNTCIpLAotICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKGFwaV9ub3Rlczo6QWN0aW9uVHlwZTo6RHVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVtcCIsICJQYXJzZSBhbmQgZHVtcCB0aGUgb3V0cHV0IikpLAotICAgICAgICAgY2w6OmNhdChBUElOb3Rlc0NhdGVnb3J5KSk7Ci0KLSAgc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+Ci0gIElucHV0RmlsZW5hbWUoY2w6OlBvc2l0aW9uYWwsIGNsOjpkZXNjKCI8aW5wdXQgZmlsZT4iKSwKLSAgICAgICAgICAgICAgICBjbDo6UmVxdWlyZWQsIGNsOjpjYXQoQVBJTm90ZXNDYXRlZ29yeSkpOwotCi0gIHN0YXRpYyBjbDo6b3B0PHN0ZDo6c3RyaW5nPgotICBUYXJnZXQoInRhcmdldCIsIGNsOjpkZXNjKCJHZW5lcmF0ZSBiaW5hcnkgZm9ybWF0IGZvciB0aGUgZ2l2ZW4gdGFyZ2V0IiksCi0gICAgICAgICAgICAgICAgICAgY2w6OmNhdChBUElOb3Rlc0NhdGVnb3J5KSk7Ci0KLSAgc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+Ci0gIE91dHB1dEZpbGVuYW1lKCJvIiwgY2w6OmRlc2MoIk91dHB1dCBmaWxlIG5hbWUiKSwgY2w6OmNhdChBUElOb3Rlc0NhdGVnb3J5KSk7Ci0KLSAgLy8gSGlkZSB1bnJlbGF0ZWQgb3B0aW9ucy4KLSAgU3RyaW5nTWFwPGNsOjpPcHRpb24gKj4gJk9wdGlvbnMgPQotICAgICAgY2w6OmdldFJlZ2lzdGVyZWRPcHRpb25zKCpjbDo6VG9wTGV2ZWxTdWJDb21tYW5kKTsKLSAgZm9yIChhdXRvICZPcHRpb24gOiBPcHRpb25zKSB7Ci0gICAgaWYgKE9wdGlvbi5zZWNvbmQtPkNhdGVnb3J5ICE9ICZBUElOb3Rlc0NhdGVnb3J5ICYmCi0gICAgICAgIE9wdGlvbi5maXJzdCgpICE9ICJoZWxwIiAmJiBPcHRpb24uZmlyc3QoKSAhPSAidmVyc2lvbiIpIHsKLSAgICAgIE9wdGlvbi5zZWNvbmQtPnNldEhpZGRlbkZsYWcoY2w6OlJlYWxseUhpZGRlbik7Ci0gICAgfQotICB9Ci0KLSAgY2w6OlBhcnNlQ29tbWFuZExpbmVPcHRpb25zKEFyZ3Muc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncy5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3dpZnQgQVBJIE5vdGVzIFRvb2xcbiIpOwotCi0gIGlmIChBY3Rpb24gPT0gY2xhbmc6OmFwaV9ub3Rlczo6QWN0aW9uVHlwZTo6Tm9uZSkgewotICAgIGVycnMoKSA8PCAiYWN0aW9uIHJlcXVpcmVkXG4iOwotICAgIGNsOjpQcmludEhlbHBNZXNzYWdlKCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBhdXRvIGZpbGVCdWZPckVyciA9IE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShJbnB1dEZpbGVuYW1lKTsKLSAgaWYgKHN0ZDo6ZXJyb3JfY29kZSBFQyA9IGZpbGVCdWZPckVyci5nZXRFcnJvcigpKSB7Ci0gICAgbGx2bTo6ZXJycygpIDw8ICJcbiBDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiAiICsgRUMubWVzc2FnZSgpIDw8ICdcbic7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgU3RyaW5nUmVmIGlucHV0ID0gZmlsZUJ1Zk9yRXJyLmdldCgpLT5nZXRCdWZmZXIoKTsKLQotICBzd2l0Y2ggKEFjdGlvbikgewotICBjYXNlIGFwaV9ub3Rlczo6QWN0aW9uVHlwZTo6Tm9uZToKLSAgICBsbHZtX3VucmVhY2hhYmxlKCJoYW5kbGVkIGFib3ZlIik7Ci0KLSAgY2FzZSBhcGlfbm90ZXM6OkFjdGlvblR5cGU6OllBTUxUb0JpbmFyeTogewotICAgIGlmIChPdXRwdXRGaWxlbmFtZS5lbXB0eSgpKSB7Ci0gICAgICBlcnJzKCkgPDwgIm91dHB1dCBmaWxlIGlzIHJlcXVpcmVkXG4iOwotICAgICAgY2w6OlByaW50SGVscE1lc3NhZ2UoKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGFwaV9ub3Rlczo6T1NUeXBlIHRhcmdldE9TID0gYXBpX25vdGVzOjpPU1R5cGU6OkFic2VudDsKLSAgICAvLyBUT0RPOiBDaGVjayB0aGF0IHdlJ3ZlIHNwZWNpZmllZCB0aGUgdGFyZ2V0LgotICAgIGlmICghVGFyZ2V0LmVtcHR5KCkpIHsKLSAgICAgIGxsdm06OlRyaXBsZSB0YXJnZXQobGx2bTo6VHJpcGxlOjpub3JtYWxpemUoVGFyZ2V0KSk7Ci0gICAgICBzd2l0Y2ggKHRhcmdldC5nZXRPUygpKSB7Ci0gICAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpEYXJ3aW46Ci0gICAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpNYWNPU1g6Ci0gICAgICAgICAgdGFyZ2V0T1MgPSBhcGlfbm90ZXM6Ok9TVHlwZTo6T1NYOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxsdm06OlRyaXBsZTo6SU9TOgotICAgICAgICAgIHRhcmdldE9TID0gYXBpX25vdGVzOjpPU1R5cGU6OklPUzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OlR2T1M6Ci0gICAgICAgICAgdGFyZ2V0T1MgPSBhcGlfbm90ZXM6Ok9TVHlwZTo6VHZPUzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OldhdGNoT1M6Ci0gICAgICAgICAgdGFyZ2V0T1MgPSBhcGlfbm90ZXM6Ok9TVHlwZTo6V2F0Y2hPUzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBlcnJzKCkgPDwgInRhcmdldCBpcyBub3Qgc3VwcG9ydGVkXG4iOwotICAgICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0KLSAgICBzdGQ6OmVycm9yX2NvZGUgRUM7Ci0gICAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gb3MoT3V0cHV0RmlsZW5hbWUsIEVDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6Ok9wZW5GbGFnczo6Rl9Ob25lKTsKLQotICAgIGlmIChhcGlfbm90ZXM6OmNvbXBpbGVBUElOb3RlcyhpbnB1dCwgLypzb3VyY2VGaWxlPSovbnVsbHB0ciwgb3MsIHRhcmdldE9TKSkKLSAgICAgIHJldHVybiAxOwotICAgIAotICAgIG9zLmZsdXNoKCk7Ci0KLSAgICByZXR1cm4gb3MuaGFzX2Vycm9yKCk7Ci0gIH0KLQotICBjYXNlIGFwaV9ub3Rlczo6QWN0aW9uVHlwZTo6QmluYXJ5VG9ZQU1MOiB7Ci0gICAgaWYgKE91dHB1dEZpbGVuYW1lLmVtcHR5KCkpIHsKLSAgICAgIGVycnMoKSA8PCAib3V0cHV0IGZpbGUgcmVxdWlyZWRcbiI7Ci0gICAgICBjbDo6UHJpbnRIZWxwTWVzc2FnZSgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgc3RkOjplcnJvcl9jb2RlIEVDOwotICAgIGxsdm06OnJhd19mZF9vc3RyZWFtIG9zKE91dHB1dEZpbGVuYW1lLCBFQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzeXM6OmZzOjpPcGVuRmxhZ3M6OkZfTm9uZSk7Ci0KLSAgICBpZiAoYXBpX25vdGVzOjpkZWNvbXBpbGVBUElOb3RlcyhzdGQ6Om1vdmUoZmlsZUJ1Zk9yRXJyLmdldCgpKSwgb3MpKQotICAgICAgcmV0dXJuIDE7Ci0gICAgCi0gICAgb3MuZmx1c2goKTsKLQotICAgIHJldHVybiBvcy5oYXNfZXJyb3IoKTsKLSAgfQotCi0gIGNhc2UgYXBpX25vdGVzOjpBY3Rpb25UeXBlOjpEdW1wOgotICAgIHJldHVybiBhcGlfbm90ZXM6OnBhcnNlQW5kRHVtcEFQSU5vdGVzKGlucHV0KTsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCmRpZmYgLS1naXQgYS90b29scy9kcml2ZXIvZHJpdmVyLmNwcCBiL3Rvb2xzL2RyaXZlci9kcml2ZXIuY3BwCmluZGV4IDU1YzU0OTIuLmQ4ZWMwMzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RyaXZlci9kcml2ZXIuY3BwCisrKyBiL3Rvb2xzL2RyaXZlci9kcml2ZXIuY3BwCkBAIC0xMTEsOCArMTExLDYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWV4dGVybiBpbnQgYXBpbm90ZXNfbWFpbihBcnJheVJlZjxjb25zdCBjaGFyICo+IEFyZ3MpOwotCiBzdGF0aWMgaW50IHJ1bl9kcml2ZXIoU3RyaW5nUmVmIEV4ZWNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcnJheVJlZjxjb25zdCBjaGFyICo+IGFyZ3YpIHsKICAgLy8gSGFuZGxlIGludGVncmF0ZWQgdG9vbHMuCkBAIC0xMjgsMTAgKzEyNiw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2LmRhdGEoKSthcmd2LnNpemUoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sICh2b2lkICopKGludHB0cl90KWdldEV4ZWN1dGFibGVQYXRoKTsKICAgICB9Ci0gICAgaWYgKEZpcnN0QXJnID09ICItYXBpbm90ZXMiKSB7Ci0gICAgICByZXR1cm4gYXBpbm90ZXNfbWFpbihsbHZtOjptYWtlQXJyYXlSZWYoYXJndi5kYXRhKCkrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2LmRhdGEoKSthcmd2LnNpemUoKSkpOwotICAgIH0KICAgfQogCiAgIHN0ZDo6c3RyaW5nIFBhdGggPSBnZXRFeGVjdXRhYmxlUGF0aChhcmd2WzBdKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYlN3aWZ0U3ludGF4UGFyc2VyL2xpYlN3aWZ0U3ludGF4UGFyc2VyLmNwcCBiL3Rvb2xzL2xpYlN3aWZ0U3ludGF4UGFyc2VyL2xpYlN3aWZ0U3ludGF4UGFyc2VyLmNwcAppbmRleCA2NzM0YWNlLi4xMjBlNjlmIDEwMDY0NAotLS0gYS90b29scy9saWJTd2lmdFN5bnRheFBhcnNlci9saWJTd2lmdFN5bnRheFBhcnNlci5jcHAKKysrIGIvdG9vbHMvbGliU3dpZnRTeW50YXhQYXJzZXIvbGliU3dpZnRTeW50YXhQYXJzZXIuY3BwCkBAIC04OCwxNCArODgsMTQgQEAKICAgfQogCiAgIHN0YXRpYyB2b2lkIG1ha2VDVHJpdmlhKFNtYWxsVmVjdG9ySW1wbDxDVHJpdmlhUGllY2U+ICZjX3RyaXZpYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJpdmlhICZ0cml2aWEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHJpdmlhUGllY2U+IHRyaXZpYSkgewogICAgIGZvciAoY29uc3QgYXV0byAmcGllY2UgOiB0cml2aWEpIHsKICAgICAgIENUcml2aWFQaWVjZSBjX3BpZWNlOwogICAgICAgYXV0byBudW1WYWx1ZSA9CiAgICAgICAgIFdyYXBwZXJUeXBlVHJhaXRzPFRyaXZpYUtpbmQ+OjpudW1lcmljVmFsdWUocGllY2UuZ2V0S2luZCgpKTsKICAgICAgIGNfcGllY2Uua2luZCA9IG51bVZhbHVlOwogICAgICAgYXNzZXJ0KGNfcGllY2Uua2luZCA9PSBudW1WYWx1ZSAmJiAidHJpdmlhIGtpbmQgdmFsdWUgaXMgdG9vIGxhcmdlIik7Ci0gICAgICBjX3BpZWNlLmxlbmd0aCA9IHBpZWNlLmdldFRleHRMZW5ndGgoKTsKKyAgICAgIGNfcGllY2UubGVuZ3RoID0gcGllY2UuZ2V0TGVuZ3RoKCk7CiAgICAgICBjX3RyaXZpYS5wdXNoX2JhY2soY19waWVjZSk7CiAgICAgfQogICB9CkBAIC0xMzEsMTUgKzEzMSwxNSBAQAogICAgIG5vZGUucHJlc2VudCA9IHRydWU7CiAgIH0KIAotICBPcGFxdWVTeW50YXhOb2RlIHJlY29yZFRva2VuKGNvbnN0IFRva2VuICZ0b2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJpdmlhICZsZWFkaW5nVHJpdmlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyaXZpYSAmdHJhaWxpbmdUcml2aWEsCisgIE9wYXF1ZVN5bnRheE5vZGUgcmVjb3JkVG9rZW4odG9rIHRva2VuS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZWRUcml2aWFQaWVjZT4gbGVhZGluZ1RyaXZpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZWRUcml2aWFQaWVjZT4gdHJhaWxpbmdUcml2aWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIHJhbmdlKSBvdmVycmlkZSB7CiAgICAgU21hbGxWZWN0b3I8Q1RyaXZpYVBpZWNlLCA4PiBjX2xlYWRpbmdUcml2aWEsIGNfdHJhaWxpbmdUcml2aWE7CiAgICAgbWFrZUNUcml2aWEoY19sZWFkaW5nVHJpdmlhLCBsZWFkaW5nVHJpdmlhKTsKICAgICBtYWtlQ1RyaXZpYShjX3RyYWlsaW5nVHJpdmlhLCB0cmFpbGluZ1RyaXZpYSk7CiAgICAgQ1Jhd1N5bnRheE5vZGUgbm9kZTsKLSAgICBtYWtlQ1Jhd1Rva2VuKG5vZGUsIHRvay5nZXRLaW5kKCksIGNfbGVhZGluZ1RyaXZpYSwgY190cmFpbGluZ1RyaXZpYSwKKyAgICBtYWtlQ1Jhd1Rva2VuKG5vZGUsIHRva2VuS2luZCwgY19sZWFkaW5nVHJpdmlhLCBjX3RyYWlsaW5nVHJpdmlhLAogICAgICAgICAgICAgICAgICAgcmFuZ2UpOwogICAgIHJldHVybiBnZXROb2RlSGFuZGxlcigpKCZub2RlKTsKICAgfQpAQCAtMTg3LDYgKzE4Nyw4IEBACiAgIExhbmdPcHRpb25zIGxhbmdPcHRzOwogICBsYW5nT3B0cy5CdWlsZFN5bnRheFRyZWUgPSB0cnVlOwogICBsYW5nT3B0cy5Db2xsZWN0UGFyc2VkVG9rZW4gPSBmYWxzZTsKKyAgLy8gRGlzYWJsZSBuYW1lIGxvb2t1cHMgZHVyaW5nIHBhcnNpbmcuCisgIGxhbmdPcHRzLkVuYWJsZUFTVFNjb3BlTG9va3VwID0gdHJ1ZTsKIAogICBhdXRvIHBhcnNlQWN0aW9ucyA9CiAgICAgc3RkOjptYWtlX3NoYXJlZDxDTGliUGFyc2VBY3Rpb25zPigqdGhpcywgU00sIGJ1ZklEKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3N3aWZ0LWlkZS10ZXN0L3N3aWZ0LWlkZS10ZXN0LmNwcCBiL3Rvb2xzL3N3aWZ0LWlkZS10ZXN0L3N3aWZ0LWlkZS10ZXN0LmNwcAppbmRleCA1MzEyMWI0Li5jMDNjYTkwIDEwMDY0NAotLS0gYS90b29scy9zd2lmdC1pZGUtdGVzdC9zd2lmdC1pZGUtdGVzdC5jcHAKKysrIGIvdG9vbHMvc3dpZnQtaWRlLXRlc3Qvc3dpZnQtaWRlLXRlc3QuY3BwCkBAIC0zMTk1LDYgKzMxOTUsNyBAQAogICAgIFByaW50T3B0cyA9IFByaW50T3B0aW9uczo6cHJpbnREb2NJbnRlcmZhY2UoKTsKICAgfSBlbHNlIHsKICAgICBQcmludE9wdHMgPSBQcmludE9wdGlvbnM6OnByaW50RXZlcnl0aGluZygpOworICAgIFByaW50T3B0cy5GdWxseVF1YWxpZmllZFR5cGVzID0gb3B0aW9uczo6RnVsbHlRdWFsaWZpZWRUeXBlczsKICAgICBQcmludE9wdHMuRnVsbHlRdWFsaWZpZWRUeXBlc0lmQW1iaWd1b3VzID0KICAgICAgIG9wdGlvbnM6OkZ1bGx5UXVhbGlmaWVkVHlwZXNJZkFtYmlndW91czsKICAgICBQcmludE9wdHMuU3ludGhlc2l6ZVN1Z2FyT25UeXBlcyA9IG9wdGlvbnM6OlN5bnRoZXNpemVTdWdhck9uVHlwZXM7CmRpZmYgLS1naXQgYS90b29scy9zd2lmdC1yZW1vdGVhc3QtdGVzdC9zd2lmdC1yZW1vdGVhc3QtdGVzdC5jcHAgYi90b29scy9zd2lmdC1yZW1vdGVhc3QtdGVzdC9zd2lmdC1yZW1vdGVhc3QtdGVzdC5jcHAKaW5kZXggMGYzZjUwZi4uNTRkMDAyOSAxMDA2NDQKLS0tIGEvdG9vbHMvc3dpZnQtcmVtb3RlYXN0LXRlc3Qvc3dpZnQtcmVtb3RlYXN0LXRlc3QuY3BwCisrKyBiL3Rvb2xzL3N3aWZ0LXJlbW90ZWFzdC10ZXN0L3N3aWZ0LXJlbW90ZWFzdC10ZXN0LmNwcApAQCAtNDIsOCArNDIsOCBAQAogCiAvLyBGSVhNRTogc3dpZnRjYWxsCiAvLy8gZnVuYyBwcmludFR5cGUoZm9yTWV0YWRhdGE6IEFueS5UeXBlKQotTExWTV9BVFRSSUJVVEVfVVNFRCBTV0lGVF9SRU1PVEVBU1RfVEVTVF9BQkkKLWV4dGVybiAiQyIgdm9pZCBwcmludE1ldGFkYXRhVHlwZShjb25zdCBNZXRhZGF0YSAqdHlwZU1ldGFkYXRhKSB7CitMTFZNX0FUVFJJQlVURV9VU0VEIGV4dGVybiAiQyIgdm9pZCBTV0lGVF9SRU1PVEVBU1RfVEVTVF9BQkkKK3ByaW50TWV0YWRhdGFUeXBlKGNvbnN0IE1ldGFkYXRhICp0eXBlTWV0YWRhdGEpIHsKICAgYXNzZXJ0KENvbnRleHQgJiYgImNvbnRleHQgd2FzIG5vdCBzZXQiKTsKIAogICBzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5UmVhZGVyPiByZWFkZXIobmV3IEluUHJvY2Vzc01lbW9yeVJlYWRlcigpKTsKQEAgLTY0LDggKzY0LDggQEAKIAogLy8gRklYTUU6IHN3aWZ0Y2FsbAogLy8vIGZ1bmMgcHJpbnREeW5hbWljVHlwZShfOiBBbnlPYmplY3QpCi1MTFZNX0FUVFJJQlVURV9VU0VEIFNXSUZUX1JFTU9URUFTVF9URVNUX0FCSQotZXh0ZXJuICJDIiB2b2lkIHByaW50SGVhcE1ldGFkYXRhVHlwZSh2b2lkICpvYmplY3QpIHsKK0xMVk1fQVRUUklCVVRFX1VTRUQgZXh0ZXJuICJDIiB2b2lkIFNXSUZUX1JFTU9URUFTVF9URVNUX0FCSQorcHJpbnRIZWFwTWV0YWRhdGFUeXBlKHZvaWQgKm9iamVjdCkgewogICBhc3NlcnQoQ29udGV4dCAmJiAiY29udGV4dCB3YXMgbm90IHNldCIpOwogCiAgIHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlSZWFkZXI+IHJlYWRlcihuZXcgSW5Qcm9jZXNzTWVtb3J5UmVhZGVyKCkpOwpAQCAtMTI3LDggKzEyNyw4IEBACiAKIC8vIEZJWE1FOiBzd2lmdGNhbGwKIC8vLyBmdW5jIHByaW50VHlwZU1lbWJlck9mZnNldChmb3JUeXBlOiBBbnkuVHlwZSwgbWVtYmVyTmFtZTogU3RhdGljU3RyaW5nKQotTExWTV9BVFRSSUJVVEVfVVNFRCBTV0lGVF9SRU1PVEVBU1RfVEVTVF9BQkkKLWV4dGVybiAiQyIgdm9pZCBwcmludFR5cGVNZW1iZXJPZmZzZXQoY29uc3QgTWV0YWRhdGEgKnR5cGVNZXRhZGF0YSwKK0xMVk1fQVRUUklCVVRFX1VTRUQgZXh0ZXJuICJDIiB2b2lkIFNXSUZUX1JFTU9URUFTVF9URVNUX0FCSQorcHJpbnRUeXBlTWVtYmVyT2Zmc2V0KGNvbnN0IE1ldGFkYXRhICp0eXBlTWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lbWJlck5hbWUpIHsKICAgcHJpbnRNZW1iZXJPZmZzZXQodHlwZU1ldGFkYXRhLCBtZW1iZXJOYW1lLCAvKnBhc3MgbWV0YWRhdGEqLyBmYWxzZSk7CiB9CkBAIC0xMzYsMTUgKzEzNiwxNSBAQAogLy8gRklYTUU6IHN3aWZ0Y2FsbAogLy8vIGZ1bmMgcHJpbnRUeXBlTWV0YWRhdGFNZW1iZXJPZmZzZXQoZm9yVHlwZTogQW55LlR5cGUsCiAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJOYW1lOiBTdGF0aWNTdHJpbmcpCi1MTFZNX0FUVFJJQlVURV9VU0VEIFNXSUZUX1JFTU9URUFTVF9URVNUX0FCSQotZXh0ZXJuICJDIiB2b2lkIHByaW50VHlwZU1ldGFkYXRhTWVtYmVyT2Zmc2V0KGNvbnN0IE1ldGFkYXRhICp0eXBlTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVtYmVyTmFtZSkgeworTExWTV9BVFRSSUJVVEVfVVNFRCBleHRlcm4gIkMiIHZvaWQgU1dJRlRfUkVNT1RFQVNUX1RFU1RfQUJJCitwcmludFR5cGVNZXRhZGF0YU1lbWJlck9mZnNldChjb25zdCBNZXRhZGF0YSAqdHlwZU1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVtYmVyTmFtZSkgewogICBwcmludE1lbWJlck9mZnNldCh0eXBlTWV0YWRhdGEsIG1lbWJlck5hbWUsIC8qcGFzcyBtZXRhZGF0YSovIHRydWUpOwogfQogCiAvLyBGSVhNRTogc3dpZnRjYWxsCiAvLy8gZnVuYyBwcmludER5bmFtaWNUeXBlQW5kQWRkcmVzc0ZvckV4aXN0ZW50aWFsPFQ+KF86IFQpCi1MTFZNX0FUVFJJQlVURV9VU0VEIFNXSUZUX1JFTU9URUFTVF9URVNUX0FCSSBleHRlcm4gIkMiIHZvaWQKK0xMVk1fQVRUUklCVVRFX1VTRUQgZXh0ZXJuICJDIiB2b2lkIFNXSUZUX1JFTU9URUFTVF9URVNUX0FCSQogcHJpbnREeW5hbWljVHlwZUFuZEFkZHJlc3NGb3JFeGlzdGVudGlhbCh2b2lkICpvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGFkYXRhICp0eXBlTWV0YWRhdGEpIHsKICAgYXNzZXJ0KENvbnRleHQgJiYgImNvbnRleHQgd2FzIG5vdCBzZXQiKTsKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9QYXJzZS9MZXhlclRlc3RzLmNwcCBiL3VuaXR0ZXN0cy9QYXJzZS9MZXhlclRlc3RzLmNwcAppbmRleCBkNjk0NzQ4Li40MjMzYjg5IDEwMDY0NAotLS0gYS91bml0dGVzdHMvUGFyc2UvTGV4ZXJUZXN0cy5jcHAKKysrIGIvdW5pdHRlc3RzL1BhcnNlL0xleGVyVGVzdHMuY3BwCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgInN3aWZ0L0Jhc2ljL0xhbmdPcHRpb25zLmgiCiAjaW5jbHVkZSAic3dpZnQvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL0xleGVyLmgiCisjaW5jbHVkZSAic3dpZnQvU3ludGF4L1RyaXZpYS5oIgogI2luY2x1ZGUgInN3aWZ0L1N1YnN5c3RlbXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Byb2Nlc3MuaCIKQEAgLTE4LDYgKzE5LDcgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN3aWZ0OwogdXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBzeW50YXg6OlRyaXZpYUtpbmQ7CiAKIC8vIFRoZSB0ZXN0IGZpeHR1cmUuCiBjbGFzcyBMZXhlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKQEAgLTI4Myw3ICsyODUsNyBAQAogICAgICAgICAgIFRyaXZpYVJldGVudGlvbk1vZGU6OldpdGhvdXRUcml2aWEpOwogICAKICAgVG9rZW4gVG9rOwotICBzeW50YXg6OlRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKKyAgUGFyc2VkVHJpdmlhIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhOwogICAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAgIEFTU0VSVF9FUSh0b2s6OmlkZW50aWZpZXIsIFRvay5nZXRLaW5kKCkpOwpAQCAtMjkxLDE2ICsyOTMsMTYgQEAKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDE0KSwgVG9rLmdldExvYygpKTsKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDE0KSwgVG9rLmdldENvbW1lbnRSYW5nZSgpLmdldFN0YXJ0KCkpOwogICBBU1NFUlRfRVEoMHUsIFRvay5nZXRDb21tZW50UmFuZ2UoKS5nZXRCeXRlTGVuZ3RoKCkpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIExlYWRpbmdUcml2aWEpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgTGVhZGluZ1RyaXZpYSk7CisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKICAgCiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBBU1NFUlRfRVEodG9rOjplb2YsIFRvay5nZXRLaW5kKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMzEpLCBUb2suZ2V0TG9jKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMzEpLCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0U3RhcnQoKSk7CiAgIEFTU0VSVF9FUSgwdSwgVG9rLmdldENvbW1lbnRSYW5nZSgpLmdldEJ5dGVMZW5ndGgoKSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7e319KSwgTGVhZGluZ1RyaXZpYSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7e319KSwgVHJhaWxpbmdUcml2aWEpOworICBBU1NFUlRfRVEoKFBhcnNlZFRyaXZpYXt7fX0pLCBMZWFkaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgVHJhaWxpbmdUcml2aWEpOwogfQogCiBURVNUX0YoTGV4ZXJUZXN0LCBCT01Ub2tlbkNvbW1lbnROb1RyaXZpYSkgewpAQCAtMzE1LDcgKzMxNyw3IEBACiAgICAgICAgICAgVHJpdmlhUmV0ZW50aW9uTW9kZTo6V2l0aG91dFRyaXZpYSk7CiAgIAogICBUb2tlbiBUb2s7Ci0gIHN5bnRheDo6VHJpdmlhIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhOworICBQYXJzZWRUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CiAgIAogICBMLmxleChUb2ssIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhKTsKICAgQVNTRVJUX0VRKHRvazo6Y29tbWVudCwgVG9rLmdldEtpbmQoKSk7CkBAIC0zMjMsOCArMzI1LDggQEAKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDMpLCBUb2suZ2V0TG9jKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMyksIFRvay5nZXRDb21tZW50UmFuZ2UoKS5nZXRTdGFydCgpKTsKICAgQVNTRVJUX0VRKDB1LCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0Qnl0ZUxlbmd0aCgpKTsKLSAgQVNTRVJUX0VRKChzeW50YXg6OlRyaXZpYXt7fX0pLCBMZWFkaW5nVHJpdmlhKTsKLSAgQVNTRVJUX0VRKChzeW50YXg6OlRyaXZpYXt7fX0pLCBUcmFpbGluZ1RyaXZpYSk7CisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3t9fSksIExlYWRpbmdUcml2aWEpOworICBBU1NFUlRfRVEoKFBhcnNlZFRyaXZpYXt7fX0pLCBUcmFpbGluZ1RyaXZpYSk7CiAgIAogICBMLmxleChUb2ssIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhKTsKICAgQVNTRVJUX0VRKHRvazo6aWRlbnRpZmllciwgVG9rLmdldEtpbmQoKSk7CkBAIC0zMzIsOCArMzM0LDggQEAKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDE0KSwgVG9rLmdldExvYygpKTsKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDE0KSwgVG9rLmdldENvbW1lbnRSYW5nZSgpLmdldFN0YXJ0KCkpOwogICBBU1NFUlRfRVEoMHUsIFRvay5nZXRDb21tZW50UmFuZ2UoKS5nZXRCeXRlTGVuZ3RoKCkpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIExlYWRpbmdUcml2aWEpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgTGVhZGluZ1RyaXZpYSk7CisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKICAgCiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBBU1NFUlRfRVEodG9rOjpjb21tZW50LCBUb2suZ2V0S2luZCgpKTsKQEAgLTM0MSw4ICszNDMsOCBAQAogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMTgpLCBUb2suZ2V0TG9jKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMTgpLCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0U3RhcnQoKSk7CiAgIEFTU0VSVF9FUSgwdSwgVG9rLmdldENvbW1lbnRSYW5nZSgpLmdldEJ5dGVMZW5ndGgoKSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7e319KSwgTGVhZGluZ1RyaXZpYSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7e319KSwgVHJhaWxpbmdUcml2aWEpOworICBBU1NFUlRfRVEoKFBhcnNlZFRyaXZpYXt7fX0pLCBMZWFkaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgVHJhaWxpbmdUcml2aWEpOwogICAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAgIEFTU0VSVF9FUSh0b2s6OmNvbW1lbnQsIFRvay5nZXRLaW5kKCkpOwpAQCAtMzUwLDE2ICszNTIsMTYgQEAKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDI0KSwgVG9rLmdldExvYygpKTsKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDI0KSwgVG9rLmdldENvbW1lbnRSYW5nZSgpLmdldFN0YXJ0KCkpOwogICBBU1NFUlRfRVEoMHUsIFRvay5nZXRDb21tZW50UmFuZ2UoKS5nZXRCeXRlTGVuZ3RoKCkpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIExlYWRpbmdUcml2aWEpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgTGVhZGluZ1RyaXZpYSk7CisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKICAgCiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBBU1NFUlRfRVEodG9rOjplb2YsIFRvay5nZXRLaW5kKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMzEpLCBUb2suZ2V0TG9jKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMzEpLCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0U3RhcnQoKSk7CiAgIEFTU0VSVF9FUSgwdSwgVG9rLmdldENvbW1lbnRSYW5nZSgpLmdldEJ5dGVMZW5ndGgoKSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7e319KSwgTGVhZGluZ1RyaXZpYSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7e319KSwgVHJhaWxpbmdUcml2aWEpOworICBBU1NFUlRfRVEoKFBhcnNlZFRyaXZpYXt7fX0pLCBMZWFkaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgVHJhaWxpbmdUcml2aWEpOwogfQogCiBURVNUX0YoTGV4ZXJUZXN0LCBCT01BdHRhY2hDb21tZW50Tm9Ucml2aWEpIHsKQEAgLTM3NCw3ICszNzYsNyBAQAogICAgICAgICAgIFRyaXZpYVJldGVudGlvbk1vZGU6OldpdGhvdXRUcml2aWEpOwogICAKICAgVG9rZW4gVG9rOwotICBzeW50YXg6OlRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKKyAgUGFyc2VkVHJpdmlhIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhOwogICAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAgIEFTU0VSVF9FUSh0b2s6OmlkZW50aWZpZXIsIFRvay5nZXRLaW5kKCkpOwpAQCAtMzgyLDE2ICszODQsMTYgQEAKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDE0KSwgVG9rLmdldExvYygpKTsKICAgQVNTRVJUX0VRKFNvdXJjZU1nci5nZXRMb2NGb3JPZmZzZXQoQnVmZmVySUQsIDMpLCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0U3RhcnQoKSk7CiAgIEFTU0VSVF9FUSgxMHUsIFRvay5nZXRDb21tZW50UmFuZ2UoKS5nZXRCeXRlTGVuZ3RoKCkpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIExlYWRpbmdUcml2aWEpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgTGVhZGluZ1RyaXZpYSk7CisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKICAgCiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBBU1NFUlRfRVEodG9rOjplb2YsIFRvay5nZXRLaW5kKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMzEpLCBUb2suZ2V0TG9jKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMTgpLCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0U3RhcnQoKSk7CiAgIEFTU0VSVF9FUSgxM3UsIFRvay5nZXRDb21tZW50UmFuZ2UoKS5nZXRCeXRlTGVuZ3RoKCkpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIExlYWRpbmdUcml2aWEpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgTGVhZGluZ1RyaXZpYSk7CisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKIH0KIAogVEVTVF9GKExleGVyVGVzdCwgQk9NTm9Db21tZW50VHJpdmlhKSB7CkBAIC00MDYsNyArNDA4LDcgQEAKICAgICAgICAgICBUcml2aWFSZXRlbnRpb25Nb2RlOjpXaXRoVHJpdmlhKTsKICAgCiAgIFRva2VuIFRvazsKLSAgc3ludGF4OjpUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CisgIFBhcnNlZFRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKICAgCiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBBU1NFUlRfRVEodG9rOjppZGVudGlmaWVyLCBUb2suZ2V0S2luZCgpKTsKQEAgLTQxNCwxMyArNDE2LDEzIEBACiAgIEFTU0VSVF9FUShTb3VyY2VNZ3IuZ2V0TG9jRm9yT2Zmc2V0KEJ1ZmZlcklELCAxNCksIFRvay5nZXRMb2MoKSk7CiAgIEFTU0VSVF9FUShTb3VyY2VNZ3IuZ2V0TG9jRm9yT2Zmc2V0KEJ1ZmZlcklELCAxNCksIFRvay5nZXRDb21tZW50UmFuZ2UoKS5nZXRTdGFydCgpKTsKICAgQVNTRVJUX0VRKDB1LCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0Qnl0ZUxlbmd0aCgpKTsKLSAgQVNTRVJUX0VRKChzeW50YXg6OlRyaXZpYXt7Ci0gICAgc3ludGF4OjpUcml2aWFQaWVjZTo6Z2FyYmFnZVRleHQoIlx4RUZceEJCXHhCRiIpLAotICAgIHN5bnRheDo6VHJpdmlhUGllY2U6OmxpbmVDb21tZW50KCIvLyBjb21tZW50IiksCi0gICAgc3ludGF4OjpUcml2aWFQaWVjZTo6bmV3bGluZXMoMSkKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7eworICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6OkdhcmJhZ2VUZXh0LCBzdHJsZW4oIlx4RUZceEJCXHhCRiIpKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpMaW5lQ29tbWVudCwgc3RybGVuKCIvLyBjb21tZW50IikpLAorICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6Ok5ld2xpbmUsIDEpCiAgIH19KSwgTGVhZGluZ1RyaXZpYSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7ewotICAgIHN5bnRheDo6VHJpdmlhUGllY2U6OnNwYWNlcygxKQorICBBU1NFUlRfRVEoKFBhcnNlZFRyaXZpYXt7CisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6U3BhY2UsIDEpCiAgIH19KSwgVHJhaWxpbmdUcml2aWEpOwogICAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CkBAIC00MjgsMTIgKzQzMCwxMiBAQAogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMzEpLCBUb2suZ2V0TG9jKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMzEpLCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0U3RhcnQoKSk7CiAgIEFTU0VSVF9FUSgwdSwgVG9rLmdldENvbW1lbnRSYW5nZSgpLmdldEJ5dGVMZW5ndGgoKSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7ewotICAgIHN5bnRheDo6VHJpdmlhUGllY2U6OmxpbmVDb21tZW50KCIvL3h4ICIpLAotICAgIHN5bnRheDo6VHJpdmlhUGllY2U6Om5ld2xpbmVzKDEpLAotICAgIHN5bnRheDo6VHJpdmlhUGllY2U6OmJsb2NrQ29tbWVudCgiLyogeCAqLyIpCisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3sKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpMaW5lQ29tbWVudCwgc3RybGVuKCIvL3h4ICIpKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpOZXdsaW5lLCAxKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpCbG9ja0NvbW1lbnQsIHN0cmxlbigiLyogeCAqLyIpKQogICB9fSksIExlYWRpbmdUcml2aWEpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7e319KSwgVHJhaWxpbmdUcml2aWEpOwogfQogCiBURVNUX0YoTGV4ZXJUZXN0LCBCT01BdHRhY2hDb21tZW50VHJpdmlhKSB7CkBAIC00NDgsNyArNDUwLDcgQEAKICAgICAgICAgICBUcml2aWFSZXRlbnRpb25Nb2RlOjpXaXRoVHJpdmlhKTsKICAgCiAgIFRva2VuIFRvazsKLSAgc3ludGF4OjpUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CisgIFBhcnNlZFRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKICAgCiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBBU1NFUlRfRVEodG9rOjppZGVudGlmaWVyLCBUb2suZ2V0S2luZCgpKTsKQEAgLTQ1NiwxMyArNDU4LDEzIEBACiAgIEFTU0VSVF9FUShTb3VyY2VNZ3IuZ2V0TG9jRm9yT2Zmc2V0KEJ1ZmZlcklELCAxNCksIFRvay5nZXRMb2MoKSk7CiAgIEFTU0VSVF9FUShTb3VyY2VNZ3IuZ2V0TG9jRm9yT2Zmc2V0KEJ1ZmZlcklELCAzKSwgVG9rLmdldENvbW1lbnRSYW5nZSgpLmdldFN0YXJ0KCkpOwogICBBU1NFUlRfRVEoMTB1LCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0Qnl0ZUxlbmd0aCgpKTsKLSAgQVNTRVJUX0VRKChzeW50YXg6OlRyaXZpYXt7Ci0gICAgc3ludGF4OjpUcml2aWFQaWVjZTo6Z2FyYmFnZVRleHQoIlx4RUZceEJCXHhCRiIpLAotICAgIHN5bnRheDo6VHJpdmlhUGllY2U6OmxpbmVDb21tZW50KCIvLyBjb21tZW50IiksCi0gICAgc3ludGF4OjpUcml2aWFQaWVjZTo6bmV3bGluZXMoMSkKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7eworICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6OkdhcmJhZ2VUZXh0LCBzdHJsZW4oIlx4RUZceEJCXHhCRiIpKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpMaW5lQ29tbWVudCwgc3RybGVuKCIvLyBjb21tZW50IikpLAorICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6Ok5ld2xpbmUsIDEpCiAgIH19KSwgTGVhZGluZ1RyaXZpYSk7Ci0gIEFTU0VSVF9FUSgoc3ludGF4OjpUcml2aWF7ewotICAgIHN5bnRheDo6VHJpdmlhUGllY2U6OnNwYWNlcygxKQorICBBU1NFUlRfRVEoKFBhcnNlZFRyaXZpYXt7CisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6U3BhY2UsIDEpCiAgIH19KSwgVHJhaWxpbmdUcml2aWEpOwogICAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CkBAIC00NzAsMTIgKzQ3MiwxMiBAQAogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMzEpLCBUb2suZ2V0TG9jKCkpOwogICBBU1NFUlRfRVEoU291cmNlTWdyLmdldExvY0Zvck9mZnNldChCdWZmZXJJRCwgMTgpLCBUb2suZ2V0Q29tbWVudFJhbmdlKCkuZ2V0U3RhcnQoKSk7CiAgIEFTU0VSVF9FUSgxM3UsIFRvay5nZXRDb21tZW50UmFuZ2UoKS5nZXRCeXRlTGVuZ3RoKCkpOwotICBBU1NFUlRfRVEoKHN5bnRheDo6VHJpdmlhe3sKLSAgICBzeW50YXg6OlRyaXZpYVBpZWNlOjpsaW5lQ29tbWVudCgiLy94eCAiKSwKLSAgICBzeW50YXg6OlRyaXZpYVBpZWNlOjpuZXdsaW5lcygxKSwKLSAgICBzeW50YXg6OlRyaXZpYVBpZWNlOjpibG9ja0NvbW1lbnQoIi8qIHggKi8iKQorICBBU1NFUlRfRVEoKFBhcnNlZFRyaXZpYXt7CisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6TGluZUNvbW1lbnQsIHN0cmxlbigiLy94eCAiKSksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6TmV3bGluZSwgMSksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6QmxvY2tDb21tZW50LCBzdHJsZW4oIi8qIHggKi8iKSkKICAgfX0pLCBMZWFkaW5nVHJpdmlhKTsKLSAgQVNTRVJUX0VRKChzeW50YXg6OlRyaXZpYXt7fX0pLCBUcmFpbGluZ1RyaXZpYSk7CisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3t9fSksIFRyYWlsaW5nVHJpdmlhKTsKIH0KIAogVEVTVF9GKExleGVyVGVzdCwgUmVzdG9yZUJhc2ljKSB7CmRpZmYgLS1naXQgYS91bml0dGVzdHMvUGFyc2UvTGV4ZXJUcml2aWFUZXN0cy5jcHAgYi91bml0dGVzdHMvUGFyc2UvTGV4ZXJUcml2aWFUZXN0cy5jcHAKaW5kZXggNTY1MzY2ZC4uMzNmY2IxNiAxMDA2NDQKLS0tIGEvdW5pdHRlc3RzL1BhcnNlL0xleGVyVHJpdmlhVGVzdHMuY3BwCisrKyBiL3VuaXR0ZXN0cy9QYXJzZS9MZXhlclRyaXZpYVRlc3RzLmNwcApAQCAtMSwxMyArMSwxNCBAQAogI2luY2x1ZGUgInN3aWZ0L0Jhc2ljL0xhbmdPcHRpb25zLmgiCiAjaW5jbHVkZSAic3dpZnQvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgInN3aWZ0L1BhcnNlL0xleGVyLmgiCisjaW5jbHVkZSAic3dpZnQvU3ludGF4L1RyaXZpYS5oIgogI2luY2x1ZGUgInN3aWZ0L1N1YnN5c3RlbXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN3aWZ0OwotdXNpbmcgbmFtZXNwYWNlIHN3aWZ0OjpzeW50YXg7CiB1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIHN5bnRheDo6VHJpdmlhS2luZDsKIAogY2xhc3MgTGV4ZXJUcml2aWFUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7fTsKIApAQCAtMjQsMjIgKzI1LDI1IEBACiAgICAgICAgICAgVHJpdmlhUmV0ZW50aW9uTW9kZTo6V2l0aFRyaXZpYSk7CiAKICAgVG9rZW4gVG9rOwotICBUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CisgIFBhcnNlZFRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKIAogICBMLmxleChUb2ssIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhKTsKICAgQVNTRVJUX0VRKHRvazo6aWRlbnRpZmllciwgVG9rLmdldEtpbmQoKSk7CiAgIEFTU0VSVF9FUSgiYWFhIiwgVG9rLmdldFRleHQoKSk7CiAgIEFTU0VSVF9UUlVFKFRvay5pc0F0U3RhcnRPZkxpbmUoKSk7Ci0gIEFTU0VSVF9FUShMZWFkaW5nVHJpdmlhLCBUcml2aWEoKSk7Ci0gIEFTU0VSVF9FUShUcmFpbGluZ1RyaXZpYSwgKFRyaXZpYXt7VHJpdmlhUGllY2U6OnNwYWNlcygxKX19KSk7CisgIEFTU0VSVF9FUShMZWFkaW5nVHJpdmlhLCBQYXJzZWRUcml2aWEoKSk7CisgIEFTU0VSVF9FUShUcmFpbGluZ1RyaXZpYSwKKyAgICAgICAgICAgIChQYXJzZWRUcml2aWF7e1BhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6OlNwYWNlLCAxKX19KSk7CiAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAgIEFTU0VSVF9FUSh0b2s6OmlkZW50aWZpZXIsIFRvay5nZXRLaW5kKCkpOwogICBBU1NFUlRfRVEoImJiYiIsIFRvay5nZXRUZXh0KCkpOwogICBBU1NFUlRfVFJVRShUb2suaXNBdFN0YXJ0T2ZMaW5lKCkpOwogICBBU1NFUlRfRVEoTGVhZGluZ1RyaXZpYSwKLSAgICAgICAgICAgIChUcml2aWF7e1RyaXZpYVBpZWNlOjpuZXdsaW5lcygxKSwgVHJpdmlhUGllY2U6OnNwYWNlcygxKX19KSk7Ci0gIEFTU0VSVF9FUShUcmFpbGluZ1RyaXZpYSwgKFRyaXZpYXt7VHJpdmlhUGllY2U6OnNwYWNlcygxKX19KSk7CisgICAgICAgICAgICAoUGFyc2VkVHJpdmlhe3tQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpOZXdsaW5lLCAxKSwKKyAgICAgICAgICAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpTcGFjZSwgMSl9fSkpOworICBBU1NFUlRfRVEoVHJhaWxpbmdUcml2aWEsCisgICAgICAgICAgICAoUGFyc2VkVHJpdmlhe3tQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpTcGFjZSwgMSl9fSkpOwogCiAgIExleGVyU3RhdGUgUyA9IEwuZ2V0U3RhdGVGb3JCZWdpbm5pbmdPZlRva2VuKFRvaywgTGVhZGluZ1RyaXZpYSk7CiAKQEAgLTQ3LDggKzUxLDEwIEBACiAgIEFTU0VSVF9FUSh0b2s6OmlkZW50aWZpZXIsIFRvay5nZXRLaW5kKCkpOwogICBBU1NFUlRfRVEoImNjYyIsIFRvay5nZXRUZXh0KCkpOwogICBBU1NFUlRfRkFMU0UoVG9rLmlzQXRTdGFydE9mTGluZSgpKTsKLSAgQVNTRVJUX0VRKExlYWRpbmdUcml2aWEsIChUcml2aWF7e1RyaXZpYVBpZWNlOjpibG9ja0NvbW1lbnQoIi8qQyovIil9fSkpOwotICBBU1NFUlRfRVEoVHJhaWxpbmdUcml2aWEsIFRyaXZpYSgpKTsKKyAgQVNTRVJUX0VRKExlYWRpbmdUcml2aWEsCisgICAgICAgICAgICAoUGFyc2VkVHJpdmlhe3tQYXJzZWRUcml2aWFQaWVjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpdmlhS2luZDo6QmxvY2tDb21tZW50LCBzdHJsZW4oIi8qQyovIikpfX0pKTsKKyAgQVNTRVJUX0VRKFRyYWlsaW5nVHJpdmlhLCBQYXJzZWRUcml2aWEoKSk7CiAKICAgTC5yZXN0b3JlU3RhdGUoUyk7CiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwpAQCAtNTYsOCArNjIsMTAgQEAKICAgQVNTRVJUX0VRKCJiYmIiLCBUb2suZ2V0VGV4dCgpKTsKICAgQVNTRVJUX1RSVUUoVG9rLmlzQXRTdGFydE9mTGluZSgpKTsKICAgQVNTRVJUX0VRKExlYWRpbmdUcml2aWEsCi0gICAgICAgICAgICAoVHJpdmlhe3tUcml2aWFQaWVjZTo6bmV3bGluZXMoMSksIFRyaXZpYVBpZWNlOjpzcGFjZXMoMSl9fSkpOwotICBBU1NFUlRfRVEoVHJhaWxpbmdUcml2aWEsIChUcml2aWF7e1RyaXZpYVBpZWNlOjpzcGFjZXMoMSl9fSkpOworICAgICAgICAgICAgKFBhcnNlZFRyaXZpYXt7UGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6TmV3bGluZSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpTcGFjZSwgMSl9fSkpOworICBBU1NFUlRfRVEoVHJhaWxpbmdUcml2aWEsCisgICAgICAgICAgICAoUGFyc2VkVHJpdmlhe3tQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpTcGFjZSwgMSl9fSkpOwogfQogCiBURVNUX0YoTGV4ZXJUcml2aWFUZXN0LCBUcml2aWFIYXNoYmFuZykgewpAQCAtNzIsMTUgKzgwLDE1IEBACiAgICAgICAgICAgVHJpdmlhUmV0ZW50aW9uTW9kZTo6V2l0aFRyaXZpYSk7CiAKICAgVG9rZW4gVG9rOwotICBUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CisgIFBhcnNlZFRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAKICAgQVNTRVJUX0VRKHRvazo6aWRlbnRpZmllciwgVG9rLmdldEtpbmQoKSk7CiAgIEFTU0VSVF9FUSgiYWFhIiwgVG9rLmdldFRleHQoKSk7CiAgIEFTU0VSVF9UUlVFKFRvay5pc0F0U3RhcnRPZkxpbmUoKSk7Ci0gIEFTU0VSVF9FUShMZWFkaW5nVHJpdmlhLAotICAgICAgICAgICAgKFRyaXZpYXt7VHJpdmlhUGllY2U6OmdhcmJhZ2VUZXh0KCIjIS9iaW4vc3dpZnQiKSwKLSAgICAgICAgICAgICAgICAgICAgIFRyaXZpYVBpZWNlOjpuZXdsaW5lcygxKX19KSk7CisgIEFTU0VSVF9FUShMZWFkaW5nVHJpdmlhLCAoUGFyc2VkVHJpdmlhe3sKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpHYXJiYWdlVGV4dCwgc3RybGVuKCIjIS9iaW4vc3dpZnQiKSksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6TmV3bGluZSwgMSl9fSkpOwogfQogCiBURVNUX0YoTGV4ZXJUcml2aWFUZXN0LCBUcml2aWFIYXNoYmFuZ0FmdGVyQk9NKSB7CkBAIC05NSwxNyArMTAzLDE3IEBACiAgICAgICAgICAgVHJpdmlhUmV0ZW50aW9uTW9kZTo6V2l0aFRyaXZpYSk7CiAKICAgVG9rZW4gVG9rOwotICBUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CisgIFBhcnNlZFRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAKICAgQVNTRVJUX0VRKHRvazo6aWRlbnRpZmllciwgVG9rLmdldEtpbmQoKSk7CiAgIEFTU0VSVF9FUSgiYWFhIiwgVG9rLmdldFRleHQoKSk7CiAgIEFTU0VSVF9UUlVFKFRvay5pc0F0U3RhcnRPZkxpbmUoKSk7CiAKLSAgQVNTRVJUX0VRKExlYWRpbmdUcml2aWEsCi0gICAgICAgICAgICAoVHJpdmlhe3tUcml2aWFQaWVjZTo6Z2FyYmFnZVRleHQoIlx4RUZceEJCXHhCRiIpLAotICAgICAgICAgICAgICAgICAgICAgVHJpdmlhUGllY2U6OmdhcmJhZ2VUZXh0KCIjIS9iaW4vc3dpZnQiKSwKLSAgICAgICAgICAgICAgICAgICAgIFRyaXZpYVBpZWNlOjpuZXdsaW5lcygxKX19KSk7CisgIEFTU0VSVF9FUShMZWFkaW5nVHJpdmlhLCAoUGFyc2VkVHJpdmlhe3sKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpHYXJiYWdlVGV4dCwgc3RybGVuKCJceEVGXHhCQlx4QkYiKSksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6R2FyYmFnZVRleHQsIHN0cmxlbigiIyEvYmluL3N3aWZ0IikpLAorICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6Ok5ld2xpbmUsIDEpfX0pKTsKIH0KIAogVEVTVF9GKExleGVyVHJpdmlhVGVzdCwgVHJpdmlhQ29uZmxpY3RNYXJrZXIpIHsKQEAgLTEyOCw3ICsxMzYsNyBAQAogICAgICAgICAgIFRyaXZpYVJldGVudGlvbk1vZGU6OldpdGhUcml2aWEpOwogCiAgIFRva2VuIFRvazsKLSAgVHJpdmlhIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhOworICBQYXJzZWRUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CiAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAgIEFTU0VSVF9FUSh0b2s6OmlkZW50aWZpZXIsIFRvay5nZXRLaW5kKCkpOwpAQCAtMTQ0LDkgKzE1MiwxMCBAQAogICAgICAgIj09PT09PT1cbiIKICAgICAgICJvbGRcbiIKICAgICAgICI+Pj4+Pj4+IDE4ODQ0YmM2NTIyOTc4NmI5NmI4OWE5ZmM3NzM5YzBmOmNvbmZsaWN0X21hcmtlcnMuc3dpZnQiOwotICBBU1NFUlRfRVEoTGVhZGluZ1RyaXZpYSwgKFRyaXZpYXt7VHJpdmlhUGllY2U6Om5ld2xpbmVzKDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpdmlhUGllY2U6OmdhcmJhZ2VUZXh0KGV4cGVjdGVkVHJpdmlhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaXZpYVBpZWNlOjpuZXdsaW5lcygxKX19KSk7CisgIEFTU0VSVF9FUShMZWFkaW5nVHJpdmlhLCAoUGFyc2VkVHJpdmlhe3sKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpOZXdsaW5lLCAxKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpHYXJiYWdlVGV4dCwgZXhwZWN0ZWRUcml2aWEuc2l6ZSgpKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpOZXdsaW5lLCAxKX19KSk7CiB9CiAKIFRFU1RfRihMZXhlclRyaXZpYVRlc3QsIFRyaXZpYUNhcnJpYWdlUmV0dXJuKSB7CkBAIC0xNjIsMjcgKzE3MSwyOSBAQAogICAgICAgICAgIFRyaXZpYVJldGVudGlvbk1vZGU6OldpdGhUcml2aWEpOwogCiAgIFRva2VuIFRvazsKLSAgVHJpdmlhIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhOworICBQYXJzZWRUcml2aWEgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWE7CiAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAgIEFTU0VSVF9FUSh0b2s6OmlkZW50aWZpZXIsIFRvay5nZXRLaW5kKCkpOwogICBBU1NFUlRfRVEoImFhYSIsIFRvay5nZXRUZXh0KCkpOwogICBBU1NFUlRfVFJVRShUb2suaXNBdFN0YXJ0T2ZMaW5lKCkpOwotICBBU1NFUlRfRVEoTGVhZGluZ1RyaXZpYSwgVHJpdmlhKCkpOwotICBBU1NFUlRfRVEoVHJhaWxpbmdUcml2aWEsIFRyaXZpYSgpKTsKKyAgQVNTRVJUX0VRKExlYWRpbmdUcml2aWEsIFBhcnNlZFRyaXZpYSgpKTsKKyAgQVNTRVJUX0VRKFRyYWlsaW5nVHJpdmlhLCBQYXJzZWRUcml2aWEoKSk7CiAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAgIEFTU0VSVF9FUSh0b2s6OmlkZW50aWZpZXIsIFRvay5nZXRLaW5kKCkpOwogICBBU1NFUlRfRVEoImJiYiIsIFRvay5nZXRUZXh0KCkpOwogICBBU1NFUlRfVFJVRShUb2suaXNBdFN0YXJ0T2ZMaW5lKCkpOwotICBBU1NFUlRfRVEoTGVhZGluZ1RyaXZpYSwgKFRyaXZpYXt7VHJpdmlhUGllY2U6OmNhcnJpYWdlUmV0dXJucygyKX19KSk7Ci0gIEFTU0VSVF9FUShUcmFpbGluZ1RyaXZpYSwgVHJpdmlhKCkpOworICBBU1NFUlRfRVEoTGVhZGluZ1RyaXZpYSwKKyAgICAgICAgICAgIChQYXJzZWRUcml2aWF7e1BhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6OkNhcnJpYWdlUmV0dXJuLCAyKX19KSk7CisgIEFTU0VSVF9FUShUcmFpbGluZ1RyaXZpYSwgUGFyc2VkVHJpdmlhKCkpOwogCiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBBU1NFUlRfRVEodG9rOjplb2YsIFRvay5nZXRLaW5kKCkpOwogICBBU1NFUlRfVFJVRShUb2suaXNBdFN0YXJ0T2ZMaW5lKCkpOwotICBBU1NFUlRfRVEoTGVhZGluZ1RyaXZpYSwgKFRyaXZpYXt7VHJpdmlhUGllY2U6OmNhcnJpYWdlUmV0dXJucygxKX19KSk7Ci0gIEFTU0VSVF9FUShUcmFpbGluZ1RyaXZpYSwgVHJpdmlhKCkpOworICBBU1NFUlRfRVEoTGVhZGluZ1RyaXZpYSwKKyAgICAgICAgICAgIChQYXJzZWRUcml2aWF7e1BhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6OkNhcnJpYWdlUmV0dXJuLCAxKX19KSk7CisgIEFTU0VSVF9FUShUcmFpbGluZ1RyaXZpYSwgUGFyc2VkVHJpdmlhKCkpOwogfQogCiBURVNUX0YoTGV4ZXJUcml2aWFUZXN0LCBUcml2aWFOZXdMaW5lcykgewpAQCAtMjAyLDQ2ICsyMTMsNDYgQEAKICAgICAgICAgICBUcml2aWFSZXRlbnRpb25Nb2RlOjpXaXRoVHJpdmlhKTsKIAogICBUb2tlbiBUb2s7Ci0gIFRyaXZpYSBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYTsKKyAgUGFyc2VkVHJpdmlhIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhOwogCiAgIEwubGV4KFRvaywgTGVhZGluZ1RyaXZpYSwgVHJhaWxpbmdUcml2aWEpOwogICBBU1NFUlRfRVEodG9rOjppZGVudGlmaWVyLCBUb2suZ2V0S2luZCgpKTsKICAgQVNTRVJUX0VRKCJhYWEiLCBUb2suZ2V0VGV4dCgpKTsKICAgQVNTRVJUX1RSVUUoVG9rLmlzQXRTdGFydE9mTGluZSgpKTsKLSAgQVNTRVJUX0VRKChUcml2aWF7ewotICAgIFRyaXZpYVBpZWNlOjpuZXdsaW5lcygxKSwKLSAgICBUcml2aWFQaWVjZTo6Y2FycmlhZ2VSZXR1cm5zKDEpLAotICAgIFRyaXZpYVBpZWNlOjpjYXJyaWFnZVJldHVybkxpbmVGZWVkcygxKSwKLSAgICBUcml2aWFQaWVjZTo6Y2FycmlhZ2VSZXR1cm5zKDIpLAotICAgIFRyaXZpYVBpZWNlOjpjYXJyaWFnZVJldHVybkxpbmVGZWVkcygyKSwKLSAgICBUcml2aWFQaWVjZTo6bmV3bGluZXMoMikKKyAgQVNTRVJUX0VRKChQYXJzZWRUcml2aWF7eworICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6Ok5ld2xpbmUsIDEpLAorICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6OkNhcnJpYWdlUmV0dXJuLCAxKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpDYXJyaWFnZVJldHVybkxpbmVGZWVkLCAyKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpDYXJyaWFnZVJldHVybiwgMiksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6Q2FycmlhZ2VSZXR1cm5MaW5lRmVlZCwgNCksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6TmV3bGluZSwgMiksCiAgIH19KSwgTGVhZGluZ1RyaXZpYSk7Ci0gIEFTU0VSVF9FUShUcml2aWEoKSwgVHJhaWxpbmdUcml2aWEpOworICBBU1NFUlRfRVEoUGFyc2VkVHJpdmlhKCksIFRyYWlsaW5nVHJpdmlhKTsKIAogICBMLmxleChUb2ssIExlYWRpbmdUcml2aWEsIFRyYWlsaW5nVHJpdmlhKTsKICAgQVNTRVJUX0VRKHRvazo6aWRlbnRpZmllciwgVG9rLmdldEtpbmQoKSk7CiAgIEFTU0VSVF9FUSgiYmJiIiwgVG9rLmdldFRleHQoKSk7CiAgIEFTU0VSVF9UUlVFKFRvay5pc0F0U3RhcnRPZkxpbmUoKSk7Ci0gIEFTU0VSVF9FUSgoVHJpdmlhe3sKLSAgICBUcml2aWFQaWVjZTo6bmV3bGluZXMoMSksCi0gICAgVHJpdmlhUGllY2U6OmNhcnJpYWdlUmV0dXJucygxKSwKLSAgICBUcml2aWFQaWVjZTo6Y2FycmlhZ2VSZXR1cm5MaW5lRmVlZHMoMSksCi0gICAgVHJpdmlhUGllY2U6OmNhcnJpYWdlUmV0dXJucygyKSwKLSAgICBUcml2aWFQaWVjZTo6Y2FycmlhZ2VSZXR1cm5MaW5lRmVlZHMoMiksCi0gICAgVHJpdmlhUGllY2U6Om5ld2xpbmVzKDIpCisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3sKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpOZXdsaW5lLCAxKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpDYXJyaWFnZVJldHVybiwgMSksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6Q2FycmlhZ2VSZXR1cm5MaW5lRmVlZCwgMiksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6Q2FycmlhZ2VSZXR1cm4sIDIpLAorICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6OkNhcnJpYWdlUmV0dXJuTGluZUZlZWQsIDQpLAorICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6Ok5ld2xpbmUsIDIpLAogICB9fSksIExlYWRpbmdUcml2aWEpOwotICBBU1NFUlRfRVEoVHJpdmlhKCksIFRyYWlsaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKFBhcnNlZFRyaXZpYSgpLCBUcmFpbGluZ1RyaXZpYSk7CiAKICAgTC5sZXgoVG9rLCBMZWFkaW5nVHJpdmlhLCBUcmFpbGluZ1RyaXZpYSk7CiAgIEFTU0VSVF9FUSh0b2s6OmVvZiwgVG9rLmdldEtpbmQoKSk7CiAgIEFTU0VSVF9UUlVFKFRvay5pc0F0U3RhcnRPZkxpbmUoKSk7Ci0gIEFTU0VSVF9FUSgoVHJpdmlhe3sKLSAgICBUcml2aWFQaWVjZTo6bmV3bGluZXMoMSksCi0gICAgVHJpdmlhUGllY2U6OmNhcnJpYWdlUmV0dXJucygxKSwKLSAgICBUcml2aWFQaWVjZTo6Y2FycmlhZ2VSZXR1cm5MaW5lRmVlZHMoMSksCi0gICAgVHJpdmlhUGllY2U6OmNhcnJpYWdlUmV0dXJucygyKSwKLSAgICBUcml2aWFQaWVjZTo6Y2FycmlhZ2VSZXR1cm5MaW5lRmVlZHMoMiksCi0gICAgVHJpdmlhUGllY2U6Om5ld2xpbmVzKDIpCisgIEFTU0VSVF9FUSgoUGFyc2VkVHJpdmlhe3sKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpOZXdsaW5lLCAxKSwKKyAgICBQYXJzZWRUcml2aWFQaWVjZShUcml2aWFLaW5kOjpDYXJyaWFnZVJldHVybiwgMSksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6Q2FycmlhZ2VSZXR1cm5MaW5lRmVlZCwgMiksCisgICAgUGFyc2VkVHJpdmlhUGllY2UoVHJpdmlhS2luZDo6Q2FycmlhZ2VSZXR1cm4sIDIpLAorICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6OkNhcnJpYWdlUmV0dXJuTGluZUZlZWQsIDQpLAorICAgIFBhcnNlZFRyaXZpYVBpZWNlKFRyaXZpYUtpbmQ6Ok5ld2xpbmUsIDIpLAogICB9fSksIExlYWRpbmdUcml2aWEpOwotICBBU1NFUlRfRVEoVHJpdmlhKCksIFRyYWlsaW5nVHJpdmlhKTsKKyAgQVNTRVJUX0VRKFBhcnNlZFRyaXZpYSgpLCBUcmFpbGluZ1RyaXZpYSk7CiB9CmRpZmYgLS1naXQgYS91dGlscy9idWdfcmVkdWNlci90ZXN0cy90ZXN0X2Z1bmNidWdyZWR1Y2VyLnB5IGIvdXRpbHMvYnVnX3JlZHVjZXIvdGVzdHMvdGVzdF9mdW5jYnVncmVkdWNlci5weQppbmRleCA0MzYzZjdkLi5iOTE3YTZkIDEwMDY0NAotLS0gYS91dGlscy9idWdfcmVkdWNlci90ZXN0cy90ZXN0X2Z1bmNidWdyZWR1Y2VyLnB5CisrKyBiL3V0aWxzL2J1Z19yZWR1Y2VyL3Rlc3RzL3Rlc3RfZnVuY2J1Z3JlZHVjZXIucHkKQEAgLTEyMCwxMSArMTIwLDExIEBACiAgICAgICAgIG91dHB1dF9maWxlX3JlID0gcmUuY29tcGlsZShyJ1wqXCpcKiBGaW5hbCBGaWxlOiAuKicgKyByZV9lbmQpCiAgICAgICAgIG91dHB1dF9tYXRjaGVzID0gWwogICAgICAgICAgICAgMSBmb3IgbyBpbiBvdXRwdXQgaWYgb3V0cHV0X2ZpbGVfcmUubWF0Y2gobykgaXMgbm90IE5vbmVdCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN1bShvdXRwdXRfbWF0Y2hlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKG91dHB1dF9tYXRjaGVzKSwgMSkKICAgICAgICAgIyBNYWtlIHN1cmUgb3VyIGZpbmFsIG91dHB1dCBjb21tYW5kIGRvZXMgbm90IGhhdmUgLWVtaXQtc2liIGluCiAgICAgICAgICMgdGhlIG91dHB1dC4gV2Ugd2FudCB1c2VycyB0byBnZXQgc2lsIG91dHB1dCB3aGVuIHRoZXkgdHlwZSBpbgogICAgICAgICAjIHRoZSByZWxldmFudCBjb21tYW5kLgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbXSwgW28gZm9yIG8gaW4gb3V0cHV0IGlmICctZW1pdC1zaWInIGluIG9dKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBbbyBmb3IgbyBpbiBvdXRwdXQgaWYgJy1lbWl0LXNpYicgaW4gb10pCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL3V0aWxzL2J1Z19yZWR1Y2VyL3Rlc3RzL3Rlc3Rfb3B0YnVncmVkdWNlci5weSBiL3V0aWxzL2J1Z19yZWR1Y2VyL3Rlc3RzL3Rlc3Rfb3B0YnVncmVkdWNlci5weQppbmRleCA0ODQ3OWJhLi41ZWY5YTMzIDEwMDY0NAotLS0gYS91dGlscy9idWdfcmVkdWNlci90ZXN0cy90ZXN0X29wdGJ1Z3JlZHVjZXIucHkKKysrIGIvdXRpbHMvYnVnX3JlZHVjZXIvdGVzdHMvdGVzdF9vcHRidWdyZWR1Y2VyLnB5CkBAIC0xMDgsMTEgKzEwOCwxMSBAQAogICAgICAgICBvdXRwdXRfZmlsZV9yZSA9IHJlLmNvbXBpbGUocidcKlwqXCogRmluYWwgRmlsZTogLionICsgcmVfZW5kKQogICAgICAgICBvdXRwdXRfbWF0Y2hlcyA9IFsKICAgICAgICAgICAgIDEgZm9yIG8gaW4gb3V0cHV0IGlmIG91dHB1dF9maWxlX3JlLm1hdGNoKG8pIGlzIG5vdCBOb25lXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzdW0ob3V0cHV0X21hdGNoZXMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShvdXRwdXRfbWF0Y2hlcyksIDEpCiAgICAgICAgICMgTWFrZSBzdXJlIG91ciBmaW5hbCBvdXRwdXQgY29tbWFuZCBkb2VzIG5vdCBoYXZlIC1lbWl0LXNpYiBpbgogICAgICAgICAjIHRoZSBvdXRwdXQuIFdlIHdhbnQgdXNlcnMgdG8gZ2V0IHNpbCBvdXRwdXQgd2hlbiB0aGV5IHR5cGUgaW4KICAgICAgICAgIyB0aGUgcmVsZXZhbnQgY29tbWFuZC4KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoW10sIFtvIGZvciBvIGluIG91dHB1dCBpZiAnLWVtaXQtc2liJyBpbiBvXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgW28gZm9yIG8gaW4gb3V0cHV0IGlmICctZW1pdC1zaWInIGluIG9dKQogCiAgICAgZGVmIHRlc3Rfc3VmZml4X2luX25lZWRfb2ZfcHJlZml4KHNlbGYpOgogICAgICAgICBuYW1lID0gJ3Rlc3RzdWZmaXhpbm5lZWRvZnByZWZpeCcKQEAgLTEzNywxMSArMTM3LDExIEBACiAgICAgICAgIG91dHB1dF9maWxlX3JlID0gcmUuY29tcGlsZShyJ1wqXCpcKiBGaW5hbCBGaWxlOiAuKicgKyByZV9lbmQpCiAgICAgICAgIG91dHB1dF9tYXRjaGVzID0gWwogICAgICAgICAgICAgMSBmb3IgbyBpbiBvdXRwdXQgaWYgb3V0cHV0X2ZpbGVfcmUubWF0Y2gobykgaXMgbm90IE5vbmVdCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN1bShvdXRwdXRfbWF0Y2hlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKG91dHB1dF9tYXRjaGVzKSwgMSkKICAgICAgICAgIyBNYWtlIHN1cmUgb3VyIGZpbmFsIG91dHB1dCBjb21tYW5kIGRvZXMgbm90IGhhdmUgLWVtaXQtc2liIGluIHRoZQogICAgICAgICAjIG91dHB1dC4gV2Ugd2FudCB1c2VycyB0byBnZXQgc2lsIG91dHB1dCB3aGVuIHRoZXkgdHlwZSBpbiB0aGUKICAgICAgICAgIyByZWxldmFudCBjb21tYW5kLgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbXSwgW28gZm9yIG8gaW4gb3V0cHV0IGlmICctZW1pdC1zaWInIGluIG9dKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBbbyBmb3IgbyBpbiBvdXRwdXQgaWYgJy1lbWl0LXNpYicgaW4gb10pCiAKICAgICBkZWYgdGVzdF9yZWR1Y2VfZnVuY3Rpb24oc2VsZik6CiAgICAgICAgIG5hbWUgPSAndGVzdHJlZHVjZWZ1bmN0aW9uJwpAQCAtMTcwLDExICsxNzAsMTEgQEAKICAgICAgICAgb3V0cHV0X2ZpbGVfcmUgPSByZS5jb21waWxlKHInXCpcKlwqIEZpbmFsIEZpbGU6IC4qJyArIHJlX2VuZCkKICAgICAgICAgb3V0cHV0X21hdGNoZXMgPSBbCiAgICAgICAgICAgICAxIGZvciBvIGluIG91dHB1dCBpZiBvdXRwdXRfZmlsZV9yZS5tYXRjaChvKSBpcyBub3QgTm9uZV0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3VtKG91dHB1dF9tYXRjaGVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0ob3V0cHV0X21hdGNoZXMpLCAxKQogICAgICAgICAjIE1ha2Ugc3VyZSBvdXIgZmluYWwgb3V0cHV0IGNvbW1hbmQgZG9lcyBub3QgaGF2ZSAtZW1pdC1zaWIgaW4gdGhlCiAgICAgICAgICMgb3V0cHV0LiBXZSB3YW50IHVzZXJzIHRvIGdldCBzaWwgb3V0cHV0IHdoZW4gdGhleSB0eXBlIGluIHRoZQogICAgICAgICAjIHJlbGV2YW50IGNvbW1hbmQuCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFtdLCBbbyBmb3IgbyBpbiBvdXRwdXQgaWYgJy1lbWl0LXNpYicgaW4gb10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIFtvIGZvciBvIGluIG91dHB1dCBpZiAnLWVtaXQtc2liJyBpbiBvXSkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvdXRpbHMvYnVpbGQtcHJlc2V0cy5pbmkgYi91dGlscy9idWlsZC1wcmVzZXRzLmluaQppbmRleCA0NDBjZmIyLi5jNWUwOTNhIDEwMDY0NAotLS0gYS91dGlscy9idWlsZC1wcmVzZXRzLmluaQorKysgYi91dGlscy9idWlsZC1wcmVzZXRzLmluaQpAQCAtMTc3MiwzICsxNzcyLDkgQEAKIHN3aWZ0LWluY2x1ZGUtdGVzdHM9MAogZGFyd2luLWRlcGxveW1lbnQtdmVyc2lvbi1pb3M9MTAuMAogZGFyd2luLWNyYXNoLXJlcG9ydGVyLWNsaWVudD0xCisKK1twcmVzZXQ6IGJ1aWxkX3N3aWZ0c3ludGF4X3JlbGVhc2VdCityZWxlYXNlCituby1hc3NlcnRpb25zCitidWlsZC1saWJwYXJzZXItb25seQorc3dpZnRzeW50YXgKZGlmZiAtLWdpdCBhL3V0aWxzL2J1aWxkLXNjcmlwdCBiL3V0aWxzL2J1aWxkLXNjcmlwdAppbmRleCBiODdkYTY1Li41YjU4ZjM4IDEwMDc1NQotLS0gYS91dGlscy9idWlsZC1zY3JpcHQKKysrIGIvdXRpbHMvYnVpbGQtc2NyaXB0CkBAIC00MDQsNiArNDA0LDcgQEAKICAgICAgICAgaWYgbm90IGFyZ3MudGVzdF93YXRjaG9zX2hvc3Q6CiAgICAgICAgICAgICBzZWxmLnBsYXRmb3Jtc190b19za2lwX3Rlc3RfaG9zdC5hZGQoCiAgICAgICAgICAgICAgICAgU3RkbGliRGVwbG95bWVudFRhcmdldC5BcHBsZVdhdGNoKQorICAgICAgICBzZWxmLmJ1aWxkX2xpYnBhcnNlcl9vbmx5ID0gYXJncy5idWlsZF9saWJwYXJzZXJfb25seQogCiAgICAgZGVmIGluaXRpYWxpemVfcnVudGltZV9lbnZpcm9ubWVudChzZWxmKToKICAgICAgICAgIiIiQ2hhbmdlIHRoZSBwcm9ncmFtIGVudmlyb25tZW50IGZvciBidWlsZGluZy4iIiIKQEAgLTY5Nyw3ICs2OTgsOCBAQAogICAgICAgICAgICAgaW1wbF9hcmdzICs9IFsiLS1za2lwLXRlc3Qtb3B0aW1pemVkIl0KICAgICAgICAgaWYgbm90IGFyZ3MudGVzdF9vcHRpbWl6ZV9mb3Jfc2l6ZToKICAgICAgICAgICAgIGltcGxfYXJncyArPSBbIi0tc2tpcC10ZXN0LW9wdGltaXplLWZvci1zaXplIl0KLQorICAgICAgICBpZiBhcmdzLmJ1aWxkX2xpYnBhcnNlcl9vbmx5OgorICAgICAgICAgICAgaW1wbF9hcmdzICs9IFsiLS1idWlsZC1saWJwYXJzZXItb25seSJdCiAgICAgICAgIGlmIGFyZ3MuYW5kcm9pZDoKICAgICAgICAgICAgIGltcGxfYXJncyArPSBbCiAgICAgICAgICAgICAgICAgIi0tYW5kcm9pZC1hcmNoIiwgYXJncy5hbmRyb2lkX2FyY2gsCmRpZmYgLS1naXQgYS91dGlscy9idWlsZC1zY3JpcHQtaW1wbCBiL3V0aWxzL2J1aWxkLXNjcmlwdC1pbXBsCmluZGV4IDYzNTczNzAuLjc0MTE1NzYgMTAwNzU1Ci0tLSBhL3V0aWxzL2J1aWxkLXNjcmlwdC1pbXBsCisrKyBiL3V0aWxzL2J1aWxkLXNjcmlwdC1pbXBsCkBAIC0xMDMsNiArMTAzLDcgQEAKICAgICBpbnN0YWxsYWJsZS1wYWNrYWdlICAgICAgICAgIiIgICAgICAgICAgICAgICAidGhlIHBhdGggdG8gdGhlIGFyY2hpdmUgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkiCiAgICAgdGVzdC1pbnN0YWxsYWJsZS1wYWNrYWdlICAgICIiICAgICAgICAgICAgICAgIndoZXRoZXIgdG8gcnVuIHBvc3QtcGFja2FnaW5nIHRlc3RzIG9uIHRoZSBwcm9kdWNlZCBwYWNrYWdlIgogICAgIHJlY29uZmlndXJlICAgICAgICAgICAgICAgICAiIiAgICAgICAgICAgICAgICJmb3JjZSBhIENNYWtlIGNvbmZpZ3VyYXRpb24gcnVuIGV2ZW4gaWYgQ01ha2VDYWNoZS50eHQgYWxyZWFkeSBleGlzdHMiCisgICAgYnVpbGQtbGlicGFyc2VyLW9ubHkgICAgICAgICIiICAgICAgICAgICAgICAgIm9ubHkgYnVpbGQgbGliU3dpZnRTeW50YXhQYXJzZXIiCiAgICAgc2tpcC1yZWNvbmZpZ3VyZSAgICAgICAgICAgICIiICAgICAgICAgICAgICAgInNldCB0byBza2lwIHJlY29uZmlndXJlIgogICAgIHN3aWZ0LXByaW1hcnktdmFyaWFudC1zZGsgICAiIiAgICAgICAgICAgICAgICJkZWZhdWx0IFNESyBmb3IgdGFyZ2V0IGJpbmFyaWVzIgogICAgIHN3aWZ0LXByaW1hcnktdmFyaWFudC1hcmNoICAiIiAgICAgICAgICAgICAgICJkZWZhdWx0IGFyY2ggZm9yIHRhcmdldCBiaW5hcmllcyIKQEAgLTExNDAsNyArMTE0MSw2IEBACiAjIGFuZCBhcmNoaXRlY3R1cmUgb2YgZWFjaCBzdGRsaWIgdGFyZ2V0IC0tIGN1cnJlbnRseSBpdCBvbmx5IGNhcHR1cmVzIHRoZSBTREsuCiAjCiAjIFdlIHR1cm4gdGhlc2UgdGFyZ2V0cyBpbiB0byBTV0lGVF9TREtTIGluIGBjYWxjdWxhdGVfdGFyZ2V0c19mb3JfaG9zdCgpYAotCiAgICAgaWYgW1sgJChpc19jcm9zc190b29sc19ob3N0ICQxKSBdXSA7IHRoZW4KICAgICAgICAgZWNobyAiJDEiCiAgICAgZWxzZQpAQCAtMTgyNCw2ICsxODI0LDE2IEBACiAgICAgICAgIFNXSUZUX1RFU1Q9IiQoYnVpbGRfZGlyZWN0b3J5X2JpbiAke0xPQ0FMX0hPU1R9IHN3aWZ0cG0pL3N3aWZ0LXRlc3QiCiAgICAgZmkKIAorICAgIGlmIFsgIiR7QlVJTERfTElCUEFSU0VSX09OTFl9IiBdOyB0aGVuCisgICAgICAgICMgd2UgZG9uJ3QgaGF2ZSBhIGNvbXBpbGVyIGJ1aWx0IHNvIHdlIGhhdmUgdG8gdXNlIHRoZSBvbmUgaW4gdGhlIGVudmlyb25tZW50LgorICAgICAgICBTV0lGVENfQklOPSIkKHhjcnVuX2ZpbmRfdG9vbCBzd2lmdGMpIgorICAgICAgICAjIHdlIGRvbid0IGhhdmUgYSBzd2lmdHBtIGJ1aWx0IHNvIHdlIGhhdmUgdG8gdXNlIHRoZSBvbmUgaW4gdGhlIGVudmlyb25tZW50LgorICAgICAgICBTV0lGVF9CVUlMRD0iJCh4Y3J1bl9maW5kX3Rvb2wgc3dpZnQtYnVpbGQpIgorICAgICAgICBTV0lGVF9URVNUPSIkKHhjcnVuX2ZpbmRfdG9vbCBzd2lmdC10ZXN0KSIKKyAgICBlbHNlCisgICAgICAgIFNXSUZUQ19CSU49IiQoYnVpbGRfZGlyZWN0b3J5X2JpbiAke0xPQ0FMX0hPU1R9IHN3aWZ0KS9zd2lmdGMiCisgICAgZmkKKwogICAgIHN3aWZ0c3ludGF4X2J1aWxkX2NvbW1hbmQ9KCIke1NXSUZUU1lOVEFYX1NPVVJDRV9ESVJ9L2J1aWxkLXNjcmlwdC5weSIpCiAgICAgIyBBZGQgLS1yZWxlYXNlIGlmIHdlIGhhdmUgdG8gYnVpbGQgaW4gcmVsZWFzZSBtb2RlLgogICAgIGlmIFtbICQoaXNfY21ha2VfcmVsZWFzZV9idWlsZF90eXBlICIke1NXSUZUU1lOVEFYX0JVSUxEX1RZUEV9IikgXV0gOyB0aGVuCkBAIC0xODM2LDcgKzE4NDYsNyBAQAogICAgICAgICAtLWJ1aWxkLWRpcj0iJHtidWlsZF9kaXJ9IgogICAgICAgICAtLXN3aWZ0LWJ1aWxkLWV4ZWM9IiR7U1dJRlRfQlVJTER9IgogICAgICAgICAtLXN3aWZ0LXRlc3QtZXhlYz0iJHtTV0lGVF9URVNUfSIKLSAgICAgICAgLS1zd2lmdGMtZXhlYz0iJChidWlsZF9kaXJlY3RvcnlfYmluICR7TE9DQUxfSE9TVH0gc3dpZnQpL3N3aWZ0YyIKKyAgICAgICAgLS1zd2lmdGMtZXhlYz0iJHtTV0lGVENfQklOfSIKICAgICAgICAgLS1zeW50YXgtcGFyc2VyLWhlYWRlci1kaXI9IiR7U1dJRlRfU09VUkNFX0RJUn0vaW5jbHVkZS9zd2lmdC1jL1N5bnRheFBhcnNlciIKICAgICAgICAgLS1zeW50YXgtcGFyc2VyLWxpYi1kaXI9IiQoYnVpbGRfZGlyZWN0b3J5ICR7aG9zdH0gc3dpZnQpL2xpYiIKICAgICAgICAgLS1zd2lmdC1zeW50YXgtdGVzdC1leGVjPSIkKGJ1aWxkX2RpcmVjdG9yeV9iaW4gJHtMT0NBTF9IT1NUfSBzd2lmdCkvc3dpZnQtc3ludGF4LXRlc3QiCkBAIC0yMjkyLDcgKzIzMDIsNiBAQAogICAgICAgICAgICAgICAgICAgICAtRFNXSUZUX0JVSUxEX0VYVEVSTkFMX1BFUkZfVEVTVFNVSVRFOkJPT0w9JCh0cnVlX2ZhbHNlICIke2J1aWxkX2V4dGVybmFsX3BlcmZfdGVzdHN1aXRlX3RoaXNfdGltZX0iKQogICAgICAgICAgICAgICAgICAgICAtRFNXSUZUX0JVSUxEX0VYQU1QTEVTOkJPT0w9JCh0cnVlX2ZhbHNlICIke0JVSUxEX1NXSUZUX0VYQU1QTEVTfSIpCiAgICAgICAgICAgICAgICAgICAgIC1EU1dJRlRfSU5DTFVERV9URVNUUzpCT09MPSQodHJ1ZV9mYWxzZSAiJHtidWlsZF90ZXN0c190aGlzX3RpbWV9IikKLSAgICAgICAgICAgICAgICAgICAgLURTV0lGVF9JTlNUQUxMX0NPTVBPTkVOVFM6U1RSSU5HPSIke1NXSUZUX0lOU1RBTExfQ09NUE9ORU5UU30iCiAgICAgICAgICAgICAgICAgICAgIC1EU1dJRlRfRU1CRURfQklUQ09ERV9TRUNUSU9OOkJPT0w9JCh0cnVlX2ZhbHNlICIke0VNQkVEX0JJVENPREVfU0VDVElPTn0iKQogICAgICAgICAgICAgICAgICAgICAtRFNXSUZUX1RPT0xTX0VOQUJMRV9MVE86U1RSSU5HPSIke1NXSUZUX1RPT0xTX0VOQUJMRV9MVE99IgogICAgICAgICAgICAgICAgICAgICAtRFNXSUZUX0JVSUxEX1JVTlRJTUVfV0lUSF9IT1NUX0NPTVBJTEVSOkJPT0w9JCh0cnVlX2ZhbHNlICIke0JVSUxEX1JVTlRJTUVfV0lUSF9IT1NUX0NPTVBJTEVSfSIpCkBAIC0yMzYzLDYgKzIzNzIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIGZpCiAKKyAgICAgICAgICAgICAgICBpZiBbICIke1NXSUZUX0lOU1RBTExfQ09NUE9ORU5UU30iIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGNtYWtlX29wdGlvbnM9KAorICAgICAgICAgICAgICAgICAgICAgICAgIiR7Y21ha2Vfb3B0aW9uc1tAXX0iCisgICAgICAgICAgICAgICAgICAgICAgICAtRFNXSUZUX0lOU1RBTExfQ09NUE9ORU5UUzpTVFJJTkc9IiR7U1dJRlRfSU5TVEFMTF9DT01QT05FTlRTfSIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGZpCisKICAgICAgICAgICAgICAgICBpZiBjb250YWluc19wcm9kdWN0ICJsbGRiIiA7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgbGxkYl9idWlsZF9kaXI9JChidWlsZF9kaXJlY3RvcnkgJHtob3N0fSBsbGRiKQogICAgICAgICAgICAgICAgICAgICBjbWFrZV9vcHRpb25zPSgKQEAgLTIzODIsNyArMjM5OCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX3RhcmdldHM9KCIke2J1aWxkX3RhcmdldHNbQF19IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtTV0lGVF9CRU5DSE1BUktfVEFSR0VUU1tAXX0iKQogICAgICAgICAgICAgICAgIGZpCi0KKyAgICAgICAgICAgICAgICBpZiBbICIke0JVSUxEX0xJQlBBUlNFUl9PTkxZfSIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBidWlsZF90YXJnZXRzPShsaWJTd2lmdFN5bnRheFBhcnNlcikKKyAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgIHNraXBfYnVpbGQ9JHtTS0lQX0JVSUxEX1NXSUZUfQogICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICBsbGRiKQpAQCAtMzE1NCw3ICszMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7bGxkYl9idWlsZF9kaXJ9L2xpdCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0xMVk1fTElUX0FSR1N9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS14dW5pdC14bWwtb3V0cHV0PSR7cmVzdWx0c19kaXJ9L3Jlc3VsdHMueG1sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wYXJhbSBkb3Rlc3QtYXJncz0iLS1idWlsZC1kaXIgJHtsbGRiX2J1aWxkX2Rpcn0vbGxkYi10ZXN0LWJ1aWxkLm5vaW5kZXggJHtMTERCX1RFU1RfU1VCRElSX0NMQVVTRX0gJHtMTERCX1RFU1RfQ0FURUdPUklFU30gLUcgc3dpZnQtaGlzdG9yeSAtLXN3aWZ0LWNvbXBpbGVyIFwiJHtMTERCX1RFU1RfU1dJRlRfQ09NUEFUSUJJTElUWX1cIiAtdCAtRSBcIiR7RE9URVNUX0VYVFJBfVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXBhcmFtIGRvdGVzdC1hcmdzPSItLWJ1aWxkLWRpciAke2xsZGJfYnVpbGRfZGlyfS9sbGRiLXRlc3QtYnVpbGQubm9pbmRleCAke0xMREJfVEVTVF9TVUJESVJfQ0xBVVNFfSAke0xMREJfVEVTVF9DQVRFR09SSUVTfSAtRyBzd2lmdC1oaXN0b3J5IC0tc3dpZnQtY29tcGlsZXIgXCIke0xMREJfVEVTVF9TV0lGVF9DT01QQVRJQklMSVRZfVwiIC10IC1FIFwiJHtET1RFU1RfRVhUUkF9XCIiIC0tZmlsdGVyPWNvbXBhdAogICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgd2l0aF9wdXNoZCAiJHtyZXN1bHRzX2Rpcn0iIFwKZGlmZiAtLWdpdCBhL3V0aWxzL2J1aWxkX3N3aWZ0L2RyaXZlcl9hcmd1bWVudHMucHkgYi91dGlscy9idWlsZF9zd2lmdC9kcml2ZXJfYXJndW1lbnRzLnB5CmluZGV4IGU2NjE4YjkuLjVhMzk5ZTIgMTAwNjQ0Ci0tLSBhL3V0aWxzL2J1aWxkX3N3aWZ0L2RyaXZlcl9hcmd1bWVudHMucHkKKysrIGIvdXRpbHMvYnVpbGRfc3dpZnQvZHJpdmVyX2FyZ3VtZW50cy5weQpAQCAtNTQyLDYgKzU0Miw5IEBACiAgICAgb3B0aW9uKCctLWJ1aWxkLW5pbmphJywgdG9nZ2xlX3RydWUsCiAgICAgICAgICAgIGhlbHA9J2J1aWxkIHRoZSBOaW5qYSB0b29sJykKIAorICAgIG9wdGlvbihbJy0tYnVpbGQtbGlicGFyc2VyLW9ubHknXSwgc3RvcmVfdHJ1ZSgnYnVpbGRfbGlicGFyc2VyX29ubHknKSwKKyAgICAgICAgICAgaGVscD0nYnVpbGQgb25seSBsaWJQYXJzZXIgZm9yIFN3aWZ0U3ludGF4JykKKwogICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGluX2dyb3VwKCdFeHRyYSBhY3Rpb25zIHRvIHBlcmZvcm0gYmVmb3JlIG9yIGluIGFkZGl0aW9uIHRvIGJ1aWxkaW5nJykKIApkaWZmIC0tZ2l0IGEvdXRpbHMvYnVpbGRfc3dpZnQvdGVzdHMvZXhwZWN0ZWRfb3B0aW9ucy5weSBiL3V0aWxzL2J1aWxkX3N3aWZ0L3Rlc3RzL2V4cGVjdGVkX29wdGlvbnMucHkKaW5kZXggNGRjZjA0NS4uYTYxZDQ2NiAxMDA2NDQKLS0tIGEvdXRpbHMvYnVpbGRfc3dpZnQvdGVzdHMvZXhwZWN0ZWRfb3B0aW9ucy5weQorKysgYi91dGlscy9idWlsZF9zd2lmdC90ZXN0cy9leHBlY3RlZF9vcHRpb25zLnB5CkBAIC04Miw2ICs4Miw3IEBACiAgICAgJ2J1aWxkX3N3aWZ0X3N0ZGxpYl91bml0dGVzdF9leHRyYSc6IEZhbHNlLAogICAgICdidWlsZF9zd2lmdHBtJzogRmFsc2UsCiAgICAgJ2J1aWxkX3N3aWZ0c3ludGF4JzogRmFsc2UsCisgICAgJ2J1aWxkX2xpYnBhcnNlcl9vbmx5JzogRmFsc2UsCiAgICAgJ2J1aWxkX3Nrc3RyZXNzdGVzdGVyJzogRmFsc2UsCiAgICAgJ2J1aWxkX3N3aWZ0ZXZvbHZlJzogRmFsc2UsCiAgICAgJ2J1aWxkX3R2b3MnOiBUcnVlLApAQCAtNDAwLDYgKzQwMSw3IEBACiAgICAgU2V0VHJ1ZU9wdGlvbignLS1za2lwLWJ1aWxkJyksCiAgICAgU2V0VHJ1ZU9wdGlvbignLS1zd2lmdHBtJywgZGVzdD0nYnVpbGRfc3dpZnRwbScpLAogICAgIFNldFRydWVPcHRpb24oJy0tc3dpZnRzeW50YXgnLCBkZXN0PSdidWlsZF9zd2lmdHN5bnRheCcpLAorICAgIFNldFRydWVPcHRpb24oJy0tYnVpbGQtbGlicGFyc2VyLW9ubHknLCBkZXN0PSdidWlsZF9saWJwYXJzZXJfb25seScpLAogICAgIFNldFRydWVPcHRpb24oJy0tc2tzdHJlc3N0ZXN0ZXInLCBkZXN0PSdidWlsZF9za3N0cmVzc3Rlc3RlcicpLAogICAgIFNldFRydWVPcHRpb24oJy0tc3dpZnRldm9sdmUnLCBkZXN0PSdidWlsZF9zd2lmdGV2b2x2ZScpLAogICAgIFNldFRydWVPcHRpb24oJy1CJywgZGVzdD0nYmVuY2htYXJrJyksCmRpZmYgLS1naXQgYS91dGlscy9idWlsZF9zd2lmdC90ZXN0cy90ZXN0X2RyaXZlcl9hcmd1bWVudHMucHkgYi91dGlscy9idWlsZF9zd2lmdC90ZXN0cy90ZXN0X2RyaXZlcl9hcmd1bWVudHMucHkKaW5kZXggMmYyYmQ1Mi4uOTc0NjMxZiAxMDA2NDQKLS0tIGEvdXRpbHMvYnVpbGRfc3dpZnQvdGVzdHMvdGVzdF9kcml2ZXJfYXJndW1lbnRzLnB5CisrKyBiL3V0aWxzL2J1aWxkX3N3aWZ0L3Rlc3RzL3Rlc3RfZHJpdmVyX2FyZ3VtZW50cy5weQpAQCAtNTYxLDE0ICs1NjEsMTQgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vdFJhaXNlcyhQYXJzZXJFcnJvcik6CiAgICAgICAgICAgICBuYW1lc3BhY2UgPSBzZWxmLnBhcnNlX2RlZmF1bHRfYXJncyhbJy0tZGVidWcnXSkKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobmFtZXNwYWNlLmNtYXJrX2J1aWxkX3ZhcmlhbnQsICdEZWJ1ZycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lc3BhY2UuZm91bmRhdGlvbl9idWlsZF92YXJpYW50LCAnRGVidWcnKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobmFtZXNwYWNlLmxpYmRpc3BhdGNoX2J1aWxkX3ZhcmlhbnQsICdEZWJ1ZycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lc3BhY2UubGliaWN1X2J1aWxkX3ZhcmlhbnQsICdEZWJ1ZycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhuYW1lc3BhY2UubGxkYl9idWlsZF92YXJpYW50LCAnRGVidWcnKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobmFtZXNwYWNlLmxsdm1fYnVpbGRfdmFyaWFudCwgJ0RlYnVnJykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG5hbWVzcGFjZS5zd2lmdF9idWlsZF92YXJpYW50LCAnRGVidWcnKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobmFtZXNwYWNlLnN3aWZ0X3N0ZGxpYl9idWlsZF92YXJpYW50LCAnRGVidWcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lc3BhY2UuY21hcmtfYnVpbGRfdmFyaWFudCwgJ0RlYnVnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlLmZvdW5kYXRpb25fYnVpbGRfdmFyaWFudCwgJ0RlYnVnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlLmxpYmRpc3BhdGNoX2J1aWxkX3ZhcmlhbnQsICdEZWJ1ZycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVzcGFjZS5saWJpY3VfYnVpbGRfdmFyaWFudCwgJ0RlYnVnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlLmxsZGJfYnVpbGRfdmFyaWFudCwgJ0RlYnVnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlLmxsdm1fYnVpbGRfdmFyaWFudCwgJ0RlYnVnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlLnN3aWZ0X2J1aWxkX3ZhcmlhbnQsICdEZWJ1ZycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVzcGFjZS5zd2lmdF9zdGRsaWJfYnVpbGRfdmFyaWFudCwgJ0RlYnVnJykKIAogICAgIGRlZiB0ZXN0X2ltcGxpZWRfZGVmYXVsdHNfc2tpcF9idWlsZChzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vdFJhaXNlcyhQYXJzZXJFcnJvcik6CkBAIC02OTAsNiArNjkwLDEyIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG5hbWVzcGFjZS50ZXN0X3R2b3NfaG9zdCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmFtZXNwYWNlLnRlc3Rfd2F0Y2hvc19ob3N0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuYW1lc3BhY2UudGVzdF9hbmRyb2lkX2hvc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG5hbWVzcGFjZS5idWlsZF9saWJwYXJzZXJfb25seSkKKworICAgIGRlZiB0ZXN0X2J1aWxkX2xpYl9zd2lmdHN5bnRheHBhcnNlcl9vbmx5KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm90UmFpc2VzKFBhcnNlckVycm9yKToKKyAgICAgICAgICAgIG5hbWVzcGFjZSA9IHNlbGYucGFyc2VfZGVmYXVsdF9hcmdzKFsnLS1idWlsZC1saWJwYXJzZXItb25seSddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWVzcGFjZS5idWlsZF9saWJwYXJzZXJfb25seSkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvdXRpbHMvZmluZC1vdmVybGF5LWRlcHMtY2xvc3VyZS5zaCBiL3V0aWxzL2ZpbmQtb3ZlcmxheS1kZXBzLWNsb3N1cmUuc2gKaW5kZXggNGQwMjRhZC4uM2IxMWEyMyAxMDA3NTUKLS0tIGEvdXRpbHMvZmluZC1vdmVybGF5LWRlcHMtY2xvc3VyZS5zaAorKysgYi91dGlscy9maW5kLW92ZXJsYXktZGVwcy1jbG9zdXJlLnNoCkBAIC0xNSw3ICsxNSw3IEBACiBzZXQgLW8gcGlwZWZhaWwKIHNldCAtZQogCi1PVkVSTEFZX05BTUVfQUxURVJOQVRJT049IkFwcEtpdHxBc3NldHNMaWJyYXJ5fEFWRm91bmRhdGlvbnxDYWxsS2l0fENsb3VkS2l0fENvbnRhY3RzfENvcmVBdWRpb3xDb3JlRGF0YXxDb3JlR3JhcGhpY3N8Q29yZUltYWdlfENvcmVMb2NhdGlvbnxDb3JlTWVkaWF8Q3J5cHRvVG9rZW5LaXR8ZGlzcGF0Y2h8Rm91bmRhdGlvbnxHYW1lcGxheUtpdHxHTEtpdHxIb21lS2l0fElPS2l0fEludGVudHN8TWFwS2l0fG9iamN8T3BlbkNMfG9zfFBob3Rvc3xRdWFydHpDb3JlfFNhZmFyaVNlcnZpY2VzfFNjZW5lS2l0fHNpbWR8U3ByaXRlS2l0fFVJS2l0fFdhdGNoS2l0fFhDVGVzdHx4cGMiCitPVkVSTEFZX05BTUVfQUxURVJOQVRJT049IkFwcEtpdHxBc3NldHNMaWJyYXJ5fEFWRm91bmRhdGlvbnxDYWxsS2l0fENsb3VkS2l0fENvbXByZXNzaW9ufENvbnRhY3RzfENvcmVBdWRpb3xDb3JlRGF0YXxDb3JlR3JhcGhpY3N8Q29yZUltYWdlfENvcmVMb2NhdGlvbnxDb3JlTWVkaWF8Q3J5cHRvVG9rZW5LaXR8ZGlzcGF0Y2h8Rm91bmRhdGlvbnxHYW1lcGxheUtpdHxHTEtpdHxIb21lS2l0fElPS2l0fEludGVudHN8TWFwS2l0fG9iamN8T3BlbkNMfG9zfFBob3Rvc3xRdWFydHpDb3JlfFNhZmFyaVNlcnZpY2VzfFNjZW5lS2l0fHNpbWR8U3ByaXRlS2l0fFVJS2l0fFdhdGNoS2l0fFhDVGVzdHx4cGMiCiAKIGZ1bmN0aW9uIGZpbmRfZGVwcygpIHsKICAgICBsb2NhbCBPVkVSTEFZX0FSRz0kMQpAQCAtMzksNyArMzksNyBAQAogICAgICAgICBleGl0IDEyMwogICAgIGZpCiAKLSAgICBsb2NhbCBSRUdFWD0iLi9GcmFtZXdvcmtzLygke09WRVJMQVlfTkFNRV9BTFRFUk5BVElPTn0pLmZyYW1ld29yay8uKnwuKi91c3IvaW5jbHVkZS8oeHBjfGRpc3BhdGNofG9zfG9iamN8c2ltZCkvLipcLmgiCisgICAgbG9jYWwgUkVHRVg9Ii4vRnJhbWV3b3Jrcy8oJHtPVkVSTEFZX05BTUVfQUxURVJOQVRJT059KS5mcmFtZXdvcmsvLip8LiovdXNyL2luY2x1ZGUvKHhwY3xkaXNwYXRjaHxvc3xvYmpjfHNpbWR8Y29tcHJlc3Npb24pLy4qXC5oIgogCiAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MxMDA0CiAgICAgSUZTPSdcCmRpZmYgLS1naXQgYS91dGlscy9neWIucHkgYi91dGlscy9neWIucHkKaW5kZXggNWY0NGUxOC4uZDljZTBlNyAxMDA3NTUKLS0tIGEvdXRpbHMvZ3liLnB5CisrKyBiL3V0aWxzL2d5Yi5weQpAQCAtNzUxLDcgKzc1MSw3IEBACiAKIAogZGVmIGV4cGFuZChmaWxlbmFtZSwgbGluZV9kaXJlY3RpdmU9X2RlZmF1bHRfbGluZV9kaXJlY3RpdmUsICoqbG9jYWxfYmluZGluZ3MpOgotICAgIHIiIiJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlcG4gdGVtcGxhdGUgZmlsZSwgZXhlY3V0ZWQgd2l0aCB0aGUgZ2l2ZW4KKyAgICByIiIiUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gdGVtcGxhdGUgZmlsZSwgZXhlY3V0ZWQgd2l0aCB0aGUgZ2l2ZW4KICAgICBsb2NhbCBiaW5kaW5ncy4KIAogICAgID4+PiBmcm9tIHRlbXBmaWxlIGltcG9ydCBOYW1lZFRlbXBvcmFyeUZpbGUKZGlmZiAtLWdpdCBhL3V0aWxzL2d5Yl9zeW50YXhfc3VwcG9ydC9FeHByTm9kZXMucHkgYi91dGlscy9neWJfc3ludGF4X3N1cHBvcnQvRXhwck5vZGVzLnB5CmluZGV4IDkxNTc0MzYuLjU3ZTc0MjIgMTAwNjQ0Ci0tLSBhL3V0aWxzL2d5Yl9zeW50YXhfc3VwcG9ydC9FeHByTm9kZXMucHkKKysrIGIvdXRpbHMvZ3liX3N5bnRheF9zdXBwb3J0L0V4cHJOb2Rlcy5weQpAQCAtMjEwLDE1ICsyMTAsNiBAQAogICAgICAgICAgICAgIENoaWxkKCdSaWdodFNxdWFyZScsIGtpbmQ9J1JpZ2h0U3F1YXJlQnJhY2tldFRva2VuJyksCiAgICAgICAgICBdKSwKIAotICAgICMgLmZvbwotICAgIE5vZGUoJ0ltcGxpY2l0TWVtYmVyRXhwcicsIGtpbmQ9J0V4cHInLAotICAgICAgICAgY2hpbGRyZW49WwotICAgICAgICAgICAgIENoaWxkKCJEb3QiLCBraW5kPSdQcmVmaXhQZXJpb2RUb2tlbicpLAotICAgICAgICAgICAgIENoaWxkKCJOYW1lIiwga2luZD0nVG9rZW4nKSwKLSAgICAgICAgICAgICBDaGlsZCgnRGVjbE5hbWVBcmd1bWVudHMnLCBraW5kPSdEZWNsTmFtZUFyZ3VtZW50cycsCi0gICAgICAgICAgICAgICAgICAgaXNfb3B0aW9uYWw9VHJ1ZSksCi0gICAgICAgICBdKSwKLQogICAgICMgZnVuY3Rpb24tY2FsbC1hcmd1bWVudCAtPiBsYWJlbD8gJzonPyBleHByZXNzaW9uICcsJz8KICAgICBOb2RlKCdGdW5jdGlvbkNhbGxBcmd1bWVudCcsIGtpbmQ9J1N5bnRheCcsCiAgICAgICAgICB0cmFpdHM9WydXaXRoVHJhaWxpbmdDb21tYSddLApAQCAtMjk3LDI3ICsyODgsMjAgQEAKICAgICAgICAgICAgICBDaGlsZCgiU2Vjb25kQ2hvaWNlIiwga2luZD0nRXhwcicpCiAgICAgICAgICBdKSwKIAotICAgICMgYS5iCisgICAgIyBleHByPy5uYW1lCiAgICAgTm9kZSgnTWVtYmVyQWNjZXNzRXhwcicsIGtpbmQ9J0V4cHInLAogICAgICAgICAgY2hpbGRyZW49WwogICAgICAgICAgICAgICMgVGhlIGJhc2UgbmVlZHMgdG8gYmUgb3B0aW9uYWwgdG8gcGFyc2UgZXhwcmVzc2lvbnMgaW4ga2V5IHBhdGhzCiAgICAgICAgICAgICAgIyBsaWtlIFwuYQogICAgICAgICAgICAgIENoaWxkKCJCYXNlIiwga2luZD0nRXhwcicsIGlzX29wdGlvbmFsPVRydWUpLAotICAgICAgICAgICAgIENoaWxkKCJEb3QiLCBraW5kPSdQZXJpb2RUb2tlbicpLAotICAgICAgICAgICAgIENoaWxkKCJOYW1lIiwga2luZD0nVG9rZW4nKSwKLSAgICAgICAgICAgICBDaGlsZCgnRGVjbE5hbWVBcmd1bWVudHMnLCBraW5kPSdEZWNsTmFtZUFyZ3VtZW50cycsCi0gICAgICAgICAgICAgICAgICAgaXNfb3B0aW9uYWw9VHJ1ZSksCi0gICAgICAgICBdKSwKLQotICAgICMgZG90LXNlbGYtZXhwciAtPiBleHByICcuJyAnc2VsZicKLSAgICBOb2RlKCdEb3RTZWxmRXhwcicsIGtpbmQ9J0V4cHInLAotICAgICAgICAgY2hpbGRyZW49WwotICAgICAgICAgICAgIENoaWxkKCdFeHByZXNzaW9uJywga2luZD0nRXhwcicpLAotICAgICAgICAgICAgIENoaWxkKCdEb3QnLCBraW5kPSdUb2tlbicsCisgICAgICAgICAgICAgQ2hpbGQoIkRvdCIsIGtpbmQ9J1Rva2VuJywKICAgICAgICAgICAgICAgICAgICB0b2tlbl9jaG9pY2VzPVsKICAgICAgICAgICAgICAgICAgICAgICAgJ1BlcmlvZFRva2VuJywgJ1ByZWZpeFBlcmlvZFRva2VuJwogICAgICAgICAgICAgICAgICAgIF0pLAotICAgICAgICAgICAgIENoaWxkKCdTZWxmS2V5d29yZCcsIGtpbmQ9J1NlbGZUb2tlbicpLAorICAgICAgICAgICAgICMgTmFtZSBjb3VsZCBiZSAnc2VsZicKKyAgICAgICAgICAgICBDaGlsZCgiTmFtZSIsIGtpbmQ9J1Rva2VuJyksCisgICAgICAgICAgICAgQ2hpbGQoJ0RlY2xOYW1lQXJndW1lbnRzJywga2luZD0nRGVjbE5hbWVBcmd1bWVudHMnLAorICAgICAgICAgICAgICAgICAgIGlzX29wdGlvbmFsPVRydWUpLAogICAgICAgICAgXSksCiAKICAgICAjIGlzIFR5cGVOYW1lCmRpZmYgLS1naXQgYS91dGlscy9yb3VuZC10cmlwLXN5bnRheC10ZXN0IGIvdXRpbHMvcm91bmQtdHJpcC1zeW50YXgtdGVzdAppbmRleCAyOWVlZmUzLi44N2NmMmY3IDEwMDc1NQotLS0gYS91dGlscy9yb3VuZC10cmlwLXN5bnRheC10ZXN0CisrKyBiL3V0aWxzL3JvdW5kLXRyaXAtc3ludGF4LXRlc3QKQEAgLTMsNiArMyw3IEBACiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uLCB1bmljb2RlX2xpdGVyYWxzCiAKIGltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGRpZmZsaWIKIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKIGltcG9ydCBzdWJwcm9jZXNzCkBAIC0zNiw2MiArMzcsNTIgQEAKICAgICAgICAgcmV0dXJuIFtzZWxmLnN3aWZ0X3N5bnRheF90ZXN0LCBzZWxmLmFjdGlvbiwKICAgICAgICAgICAgICAgICAnLWlucHV0LXNvdXJjZS1maWxlbmFtZScsIHNlbGYuaW5wdXRfZmlsZW5hbWVdCiAKLSAgICBAcHJvcGVydHkKLSAgICBkZWYgZGlmZl9jb21tYW5kKHNlbGYpOgotICAgICAgICByZXR1cm4gWycvdXNyL2Jpbi9kaWZmJywgJy11Jywgc2VsZi5pbnB1dF9maWxlbmFtZSwgJy0nXQotCi0gICAgZGVmIGRpZmYoc2VsZik6Ci0gICAgICAgIGxvZ2dpbmcuZGVidWcoJyAnLmpvaW4oc2VsZi5kaWZmX2NvbW1hbmQpKQotICAgICAgICBkaWZmID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmRpZmZfY29tbWFuZCwgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQotICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IGRpZmYuY29tbXVuaWNhdGUoc2VsZi5zdGRvdXQpCi0gICAgICAgIGlmIGRpZmYucmV0dXJuY29kZSAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHN0ZG91dAotICAgICAgICBhc3NlcnQgc3Rkb3V0ID09ICcnCi0gICAgICAgIGFzc2VydCBzdGRlcnIgPT0gJycKLSAgICAgICAgcmV0dXJuIE5vbmUKLQogICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIGNvbW1hbmQgPSBzZWxmLnRlc3RfY29tbWFuZAogICAgICAgICBsb2dnaW5nLmRlYnVnKCcgJy5qb2luKGNvbW1hbmQpKQotICAgICAgICBzZWxmLm91dHB1dF9maWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCd3JykKLSAgICAgICAgc2VsZi5zdGRlcnJfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgndycpCisgICAgICAgIHNlbGYub3V0cHV0X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoJ3cnLCBkZWxldGU9RmFsc2UpCisgICAgICAgIHNlbGYuc3RkZXJyX2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoJ3cnLCBkZWxldGU9RmFsc2UpCiAKICAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwgc3Rkb3V0PXNlbGYub3V0cHV0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zZWxmLnN0ZGVycl9maWxlKQogICAgICAgICBwcm9jZXNzLndhaXQoKQogICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBwcm9jZXNzLnJldHVybmNvZGUKIAorICAgICAgICBzZWxmLm91dHB1dF9maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5zdGRlcnJfZmlsZS5jbG9zZSgpCisKICAgICAgICAgd2l0aCBvcGVuKHNlbGYub3V0cHV0X2ZpbGUubmFtZSwgJ3InKSBhcyBzdGRvdXRfaW46CiAgICAgICAgICAgICBzZWxmLnN0ZG91dCA9IHN0ZG91dF9pbi5yZWFkKCkKICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RkZXJyX2ZpbGUubmFtZSwgJ3InKSBhcyBzdGRlcnJfaW46CiAgICAgICAgICAgICBzZWxmLnN0ZGVyciA9IHN0ZGVycl9pbi5yZWFkKCkKIAotICAgICAgICBzZWxmLm91dHB1dF9maWxlLmZsdXNoKCkKLSAgICAgICAgc2VsZi5zdGRlcnJfZmlsZS5mbHVzaCgpCisgICAgICAgIG9zLnJlbW92ZShzZWxmLm91dHB1dF9maWxlLm5hbWUpCisgICAgICAgIG9zLnJlbW92ZShzZWxmLnN0ZGVycl9maWxlLm5hbWUpCiAKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlICE9IDA6Ci0gICAgICAgICAgICAgICAgaWYgc2VsZi5za2lwX2JhZF9zeW50YXg6Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygnLS0tPT09V0FSTklORz09PS0tLSBMZXgvcGFyc2UgaGFkIGVycm9yJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkaWFnbm9zdGljcywgc28gbm90IGRpZmZpbmcuIFNraXBwaW5nJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyB0aGlzIGZpbGUgZHVlIHRvIC1za2lwLWJhZC1zeW50YXguJykKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcignICcuam9pbihjb21tYW5kKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCctLS09PT1FUlJPUj09PS0tLSBMZXgvcGFyc2UgaGFkIGVycm9yJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZGlhZ25vc3RpY3MsIHNvIG5vdCBkaWZmaW5nLicpCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoJyAnLmpvaW4oY29tbWFuZCkpCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3Ioc2VsZi5zdGRvdXQpCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3Ioc2VsZi5zdGRlcnIpCi0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzZWxmLm91dHB1dF9maWxlLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuc3RkZXJyX2ZpbGUuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgIT0gMDoKKyAgICAgICAgICAgIGlmIHNlbGYuc2tpcF9iYWRfc3ludGF4OgorICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygnLS0tPT09V0FSTklORz09PS0tLSBMZXgvcGFyc2UgaGFkIGVycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRpYWdub3N0aWNzLCBzbyBub3QgZGlmZmluZy4gU2tpcHBpbmcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgdGhpcyBmaWxlIGR1ZSB0byAtc2tpcC1iYWQtc3ludGF4LicpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcignICcuam9pbihjb21tYW5kKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCctLS09PT1FUlJPUj09PS0tLSBMZXgvcGFyc2UgaGFkIGVycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkaWFnbm9zdGljcywgc28gbm90IGRpZmZpbmcuJykKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCcgJy5qb2luKGNvbW1hbmQpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3Ioc2VsZi5zdGRvdXQpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcihzZWxmLnN0ZGVycikKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQogCi0gICAgICAgIGRpZmYgPSBzZWxmLmRpZmYoKQotICAgICAgICByZXR1cm4gZGlmZgorICAgICAgICBjb250ZW50cyA9ICcnLmpvaW4obWFwKGxhbWJkYSBsOiBsLmRlY29kZSgndXRmLTgnLCBlcnJvcnM9J3JlcGxhY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuKHNlbGYuaW5wdXRfZmlsZW5hbWUpLnJlYWRsaW5lcygpKSkKKyAgICAgICAgbGluZXMgPSBkaWZmbGliLnVuaWZpZWRfZGlmZihjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5kZWNvZGUoJ3V0Zi04JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzPSdyZXBsYWNlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbWZpbGU9c2VsZi5pbnB1dF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2ZpbGU9Jy0nKQorICAgICAgICBkaWZmID0gJ1xuJy5qb2luKGxpbmUgZm9yIGxpbmUgaW4gbGluZXMpCisgICAgICAgIHJldHVybiBkaWZmIGlmIGRpZmYgZWxzZSBOb25lCiAKIAogZGVmIHN3aWZ0X2ZpbGVzX2luX2RpcihkKToKZGlmZiAtLWdpdCBhL3V0aWxzL3J1c2FnZS5weSBiL3V0aWxzL3J1c2FnZS5weQppbmRleCAyNzAxYTcwLi5lMDE5NWFjIDEwMDc1NQotLS0gYS91dGlscy9ydXNhZ2UucHkKKysrIGIvdXRpbHMvcnVzYWdlLnB5CkBAIC0zNiw2ICszNiw3IEBACiBpbXBvcnQgcmVzb3VyY2UKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCitpbXBvcnQgdGltZQogCiAKIGNsYXNzIE1lbUFjdGlvbihhcmdwYXJzZS5BY3Rpb24pOgpAQCAtNzksNiArODAsOSBAQAogICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSJUIiwKICAgICAgICAgICAgICAgICAgICAgaGVscD0idGltZSAoaW4gc2Vjcywgb3IgLi4nbXMnLCAndXMnKSIsCiAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj1UaW1lQWN0aW9uKQorcGFyc2VyLmFkZF9hcmd1bWVudCgiLS13YWxsLXRpbWUiLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJ3YWxsIHRpbWUgKGluIHNlY3MsIG9yIC4uJ21zJywgJ3VzJykiLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQogcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1lbmZvcmNlIiwKICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKQEAgLTEyNSw3ICsxMjksMTMgQEAKICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInJ1c2FnZTogc2V0cmxpbWl0KFJMSU1JVF9SU1MsICVkKVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIG1lbSkKICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9SU1MsIChtZW0sIG1lbSkpCisKK3N0YXJ0ID0gdGltZS50aW1lKCkKIHJldCA9IHN1YnByb2Nlc3MuY2FsbChhcmdzLnJlbWFpbmRlcikKK2VuZCA9IHRpbWUudGltZSgpCisKK3dhbGxfdGltZSA9IGVuZCAtIHN0YXJ0CisKIHVzZWQgPSByZXNvdXJjZS5nZXRydXNhZ2UocmVzb3VyY2UuUlVTQUdFX0NISUxEUkVOKQogCiBpZiBhcmdzLnZlcmJvc2U6CkBAIC0xNDQsMTggKzE1NCwyNyBAQAogaWYgYXJncy52ZXJib3NlIG9yIG92ZXJfdGltZToKICAgICBzeXMuc3RkZXJyLndyaXRlKCJydXNhZ2U6IHN1YnByb2Nlc3MgdGltZTogJS42ZiBzZWNzXG4iCiAgICAgICAgICAgICAgICAgICAgICAlIHVzZWQucnVfdXRpbWUpCisgICAgaWYgYXJncy53YWxsX3RpbWU6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInJ1c2FnZTogc3VicHJvY2VzcyB3YWxsIHRpbWU6ICUuNmYgc2Vjc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgd2FsbF90aW1lKQogaWYgb3Zlcl90aW1lOgogICAgIHN5cy5zdGRlcnIud3JpdGUoInJ1c2FnZTogIGV4Y2VlZGVkIGxpbWl0OiAlLjZmIHNlY3NcbiIKICAgICAgICAgICAgICAgICAgICAgICUgYXJncy50aW1lKQogCiBpZiBhcmdzLmNzdjoKICAgICBmaWVsZG5hbWVzID0gWyJ0aW1lIiwgIm1lbSIsICJydW4iXQorICAgIHJvdyA9IHsKKyAgICAgICAgJ3RpbWUnOiB1c2VkLnJ1X3V0aW1lLAorICAgICAgICAnbWVtJzogdXNlZC5ydV9tYXhyc3MsCisgICAgICAgICdydW4nOiBhcmdzLmNzdl9uYW1lCisgICAgfQorICAgIGlmIGFyZ3Mud2FsbF90aW1lOgorICAgICAgICByb3dbJ3dhbGwnXSA9IHdhbGxfdGltZQorICAgICAgICBmaWVsZG5hbWVzLmluc2VydCgxLCAnd2FsbCcpCiAgICAgb3V0ID0gY3N2LkRpY3RXcml0ZXIoYXJncy5jc3Zfb3V0cHV0LCBmaWVsZG5hbWVzLCBkaWFsZWN0PSdleGNlbC10YWInKQogICAgIGlmIGFyZ3MuY3N2X2hlYWRlcjoKICAgICAgICAgb3V0LndyaXRlaGVhZGVyKCkKLSAgICBvdXQud3JpdGVyb3coZGljdCh0aW1lPXVzZWQucnVfdXRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgbWVtPXVzZWQucnVfbWF4cnNzLAotICAgICAgICAgICAgICAgICAgICAgIHJ1bj1hcmdzLmNzdl9uYW1lKSkKKyAgICBvdXQud3JpdGVyb3cocm93KQogCiBpZiBvdmVyX21lbSBvciBvdmVyX3RpbWU6CiAgICAgc3lzLmV4aXQoLTEpCmRpZmYgLS1naXQgYS92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9DbGFzc2VzLnN3aWZ0IGIvdmFsaWRhdGlvbi10ZXN0L1J1bnRpbWUvSW5wdXRzL2NsYXNzLWxheW91dC1mcm9tLW9iamMvQ2xhc3Nlcy5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQ1OTYxCi0tLSAvZGV2L251bGwKKysrIGIvdmFsaWRhdGlvbi10ZXN0L1J1bnRpbWUvSW5wdXRzL2NsYXNzLWxheW91dC1mcm9tLW9iamMvQ2xhc3Nlcy5zd2lmdApAQCAtMCwwICsxLDY1IEBACitpbXBvcnQgUmVzaWxpZW50CitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IE9uZVdvcmRTdXBlcmNsYXNzCisKK3B1YmxpYyBjbGFzcyBTdGF0aWNDbGFzczogT25lV29yZFN1cGVyY2xhc3MgeworICBAb2JqYyB2YXIgZmlyc3Q6IEludDMyID0gMAorICB2YXIgbWlkZGxlID0gR3Jvd3NUb0ludDY0KCkKKyAgQG9iamMgdmFyIGxhc3Q6IEludCA9IDAKKworICBAb2JqYyBwdWJsaWMgc3RhdGljIHZhciBvZmZzZXRPZkZpcnN0OiBJbnQgeworICAgIC8vIElSR2VuIGxheXMgb3V0IFN3aWZ0IGNsYXNzZXMgdGhhdCBzdWJjbGFzcyBPYmplY3RpdmUtQyBjbGFzc2VzIGFzIGlmIHRoZQorICAgIC8vIG9ubHkgc3VwZXJjbGFzcyB3YXMgTlNPYmplY3QsIHNvIHRoZSBzdGFydGluZyAob2Zmc2V0ICUgYWxpZ25tZW50KSBpc24ndAorICAgIC8vIGFsd2F5cyAwLiBUaGlzIG1lYW5zIHRoYXQgb24gMzItYml0IHBsYXRmb3JtcyB3ZSdsbCBoYXZlIGEgZ2FwICpiZWZvcmUqCisgICAgLy8gJ2ZpcnN0JyB3aGVuIHdlIG5lZWQgOC1ieXRlIGFsaWdubWVudCwgcmF0aGVyIHRoYW4gYWZ0ZXIgYXMgeW91J2Qgc2VlIGluCisgICAgLy8gYSBzdHJ1Y3QgKG9yIGJhc2UgY2xhc3MpLgorICAgIHJldHVybiBtYXgoTWVtb3J5TGF5b3V0PEludD4uc2l6ZSwgTWVtb3J5TGF5b3V0PEdyb3dzVG9JbnQ2ND4uYWxpZ25tZW50KSArCisgICAgICAgICAgIE1lbW9yeUxheW91dDxJbnQ+LnNpemUKKyAgfQorCisgIEBvYmpjIHB1YmxpYyBzdGF0aWMgdmFyIHRvdGFsU2l6ZTogSW50IHsKKyAgICByZXR1cm4gKDIgKiBNZW1vcnlMYXlvdXQ8SW50Pi5zaXplKSArCisgICAgICAgICAgICgyICogTWVtb3J5TGF5b3V0PEdyb3dzVG9JbnQ2ND4uc2l6ZSkgKyAvLyBhbGlnbm1lbnQKKyAgICAgICAgICAgTWVtb3J5TGF5b3V0PEludD4uc2l6ZQorICB9Cit9CisKKy8vLyBUaGlzIGNsYXNzIGhhcyB0aGUgc2FtZSBsYXlvdXQgYXMgYFN0YXRpY0NsYXNzYCwgYnV0IHdpbGwgYmUgYWNjZXNzZWQgdXNpbmcKKy8vLyBgTlNDbGFzc0Zyb21TdHJpbmdgIGluc3RlYWQgb2YgYCtjbGFzc2AuCitwdWJsaWMgY2xhc3MgRHluYW1pY0NsYXNzOiBPbmVXb3JkU3VwZXJjbGFzcyB7CisgIEBvYmpjIHZhciBmaXJzdDogSW50MzIgPSAwCisgIHZhciBtaWRkbGUgPSBHcm93c1RvSW50NjQoKQorICBAb2JqYyB2YXIgbGFzdDogSW50ID0gMAorCisgIEBvYmpjIHB1YmxpYyBzdGF0aWMgdmFyIG9mZnNldE9mRmlyc3Q6IEludCB7CisgICAgLy8gU2VlIGFib3ZlLgorICAgIHJldHVybiBtYXgoTWVtb3J5TGF5b3V0PEludD4uc2l6ZSwgTWVtb3J5TGF5b3V0PEdyb3dzVG9JbnQ2ND4uYWxpZ25tZW50KSArCisgICAgICAgICAgIE1lbW9yeUxheW91dDxJbnQ+LnNpemUKKyAgfQorCisgIEBvYmpjIHB1YmxpYyBzdGF0aWMgdmFyIHRvdGFsU2l6ZTogSW50IHsKKyAgICByZXR1cm4gKDIgKiBNZW1vcnlMYXlvdXQ8SW50Pi5zaXplKSArCisgICAgICAgICAgICgyICogTWVtb3J5TGF5b3V0PEdyb3dzVG9JbnQ2ND4uc2l6ZSkgKyAvLyBhbGlnbm1lbnQKKyAgICAgICAgICAgTWVtb3J5TGF5b3V0PEludD4uc2l6ZQorICB9Cit9CisKK3B1YmxpYyBjbGFzcyBQdXJlU3dpZnRCYXNlQ2xhc3MgeworICB2YXIgd29yZDogSW50NjQgPSAwCit9CisKK3B1YmxpYyBjbGFzcyBQdXJlU3dpZnRDbGFzczogUHVyZVN3aWZ0QmFzZUNsYXNzIHsKKyAgQG9iamMgdmFyIGZpcnN0OiBJbnQzMiA9IDAKKyAgdmFyIG1pZGRsZSA9IEdyb3dzVG9JbnQ2NCgpCisgIEBvYmpjIHZhciBsYXN0OiBJbnQgPSAwCisKKyAgQG9iamMgcHVibGljIHN0YXRpYyB2YXIgb2Zmc2V0T2ZGaXJzdDogSW50IHsKKyAgICByZXR1cm4gKDIgKiBNZW1vcnlMYXlvdXQ8SW50Pi5zaXplKSArIE1lbW9yeUxheW91dDxJbnQ2ND4uc2l6ZQorICB9CisKKyAgQG9iamMgcHVibGljIHN0YXRpYyB2YXIgdG90YWxTaXplOiBJbnQgeworICAgIHJldHVybiAoMiAqIE1lbW9yeUxheW91dDxJbnQ+LnNpemUpICsgTWVtb3J5TGF5b3V0PEludDY0Pi5zaXplICsKKyAgICAgICAgICAgKDIgKiBNZW1vcnlMYXlvdXQ8R3Jvd3NUb0ludDY0Pi5zaXplKSArIC8vIGFsaWdubWVudAorICAgICAgICAgICBNZW1vcnlMYXlvdXQ8SW50Pi5zaXplCisgIH0KK30KZGlmZiAtLWdpdCBhL3ZhbGlkYXRpb24tdGVzdC9SdW50aW1lL0lucHV0cy9jbGFzcy1sYXlvdXQtZnJvbS1vYmpjL09uZVdvcmRTdXBlcmNsYXNzLmggYi92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9PbmVXb3JkU3VwZXJjbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmJlYzAKLS0tIC9kZXYvbnVsbAorKysgYi92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9PbmVXb3JkU3VwZXJjbGFzcy5oCkBAIC0wLDAgKzEsNCBAQAorQGltcG9ydCBGb3VuZGF0aW9uOworCitAaW50ZXJmYWNlIE9uZVdvcmRTdXBlcmNsYXNzIDogTlNPYmplY3QKK0BlbmQKZGlmZiAtLWdpdCBhL3ZhbGlkYXRpb24tdGVzdC9SdW50aW1lL0lucHV0cy9jbGFzcy1sYXlvdXQtZnJvbS1vYmpjL09uZVdvcmRTdXBlcmNsYXNzLm0gYi92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9PbmVXb3JkU3VwZXJjbGFzcy5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDc2MTQKLS0tIC9kZXYvbnVsbAorKysgYi92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9PbmVXb3JkU3VwZXJjbGFzcy5tCkBAIC0wLDAgKzEsNiBAQAorI2ltcG9ydCAiT25lV29yZFN1cGVyY2xhc3MuaCIKKworQGltcGxlbWVudGF0aW9uIE9uZVdvcmRTdXBlcmNsYXNzIHsKKyAgaW50cHRyX3QgdW51c2VkOworfQorQGVuZApkaWZmIC0tZ2l0IGEvdmFsaWRhdGlvbi10ZXN0L1J1bnRpbWUvSW5wdXRzL2NsYXNzLWxheW91dC1mcm9tLW9iamMvUmVzaWxpZW50LnN3aWZ0IGIvdmFsaWRhdGlvbi10ZXN0L1J1bnRpbWUvSW5wdXRzL2NsYXNzLWxheW91dC1mcm9tLW9iamMvUmVzaWxpZW50LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjRiNmUKLS0tIC9kZXYvbnVsbAorKysgYi92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9SZXNpbGllbnQuc3dpZnQKQEAgLTAsMCArMSwxMSBAQAorcHVibGljIHN0cnVjdCBHcm93c1RvSW50NjQgeworICAjaWYgU01BTEwKKyAgdmFyIHZhbHVlOiBJbnQzMgorICAjZWxzZWlmIEJJRworICB2YXIgdmFsdWU6IEludDY0CisgICNlbHNlCisgICNlcnJvcigiTXVzdCBkZWZpbmUgU01BTEwgb3IgQklHIikKKyAgI2VuZGlmCisKKyAgcHVibGljIGluaXQoKSB7IHNlbGYudmFsdWUgPSAwIH0KK30KZGlmZiAtLWdpdCBhL3ZhbGlkYXRpb24tdGVzdC9SdW50aW1lL0lucHV0cy9jbGFzcy1sYXlvdXQtZnJvbS1vYmpjL21vZHVsZS5tb2R1bGVtYXAgYi92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9tb2R1bGUubW9kdWxlbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZmIzMjcKLS0tIC9kZXYvbnVsbAorKysgYi92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9tb2R1bGUubW9kdWxlbWFwCkBAIC0wLDAgKzEsNCBAQAorbW9kdWxlIE9uZVdvcmRTdXBlcmNsYXNzIHsKKyAgaGVhZGVyICJPbmVXb3JkU3VwZXJjbGFzcy5oIgorICBleHBvcnQgKgorfQpkaWZmIC0tZ2l0IGEvdmFsaWRhdGlvbi10ZXN0L1J1bnRpbWUvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy5tIGIvdmFsaWRhdGlvbi10ZXN0L1J1bnRpbWUvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Y2JlZTQKLS0tIC9kZXYvbnVsbAorKysgYi92YWxpZGF0aW9uLXRlc3QvUnVudGltZS9jbGFzcy1sYXlvdXQtZnJvbS1vYmpjLm0KQEAgLTAsMCArMSw3OCBAQAorLy8gQ2hlY2sgdGhhdCB3aGVuIE9iamVjdGl2ZS1DIGlzIGZpcnN0IHRvIHRvdWNoIGEgU3dpZnQgY2xhc3MsIGl0IGdpdmVzIHRoZQorLy8gU3dpZnQgcnVudGltZSBhIGNoYW5jZSB0byB1cGRhdGUgaW5zdGFuY2Ugc2l6ZSBhbmQgaXZhciBvZmZzZXQgbWV0YWRhdGEuCisKKy8vIFJVTjogJWVtcHR5LWRpcmVjdG9yeSgldCkKKy8vIFJVTjogJXRhcmdldC1idWlsZC1zd2lmdCAtZW1pdC1saWJyYXJ5IC1lbWl0LW1vZHVsZSAtbyAldC9saWJSZXNpbGllbnQuZHlsaWIgJVMvSW5wdXRzL2NsYXNzLWxheW91dC1mcm9tLW9iamMvUmVzaWxpZW50LnN3aWZ0IC1YbGlua2VyIC1pbnN0YWxsX25hbWUgLVhsaW5rZXIgQGV4ZWN1dGFibGVfcGF0aC9saWJSZXNpbGllbnQuZHlsaWIgLVhmcm9udGVuZCAtZW5hYmxlLXJlc2lsaWVuY2UgLURTTUFMTAorCisvLyBSVU46ICV0YXJnZXQtY2xhbmcgLWMgJVMvSW5wdXRzL2NsYXNzLWxheW91dC1mcm9tLW9iamMvT25lV29yZFN1cGVyY2xhc3MubSAtZm1vZHVsZXMgLWZvYmpjLWFyYyAtbyAldC9PbmVXb3JkU3VwZXJjbGFzcy5vCisvLyBSVU46ICV0YXJnZXQtYnVpbGQtc3dpZnQgLWVtaXQtbGlicmFyeSAtbyAldC9saWJDbGFzc2VzLmR5bGliIC1lbWl0LW9iamMtaGVhZGVyLXBhdGggJXQvQ2xhc3Nlcy5oIC1JICV0IC1JICVTL0lucHV0cy9jbGFzcy1sYXlvdXQtZnJvbS1vYmpjLyAlUy9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9DbGFzc2VzLnN3aWZ0ICV0L09uZVdvcmRTdXBlcmNsYXNzLm8gLVhsaW5rZXIgLWluc3RhbGxfbmFtZSAtWGxpbmtlciBAZXhlY3V0YWJsZV9wYXRoL2xpYkNsYXNzZXMuZHlsaWIgLWxSZXNpbGllbnQgLUwgJXQKKy8vIFJVTjogJXRhcmdldC1jbGFuZyAlcyAtSSAlUy9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy8gLUkgJXQgLWZtb2R1bGVzIC1mb2JqYy1hcmMgLW8gJXQvbWFpbiAtbFJlc2lsaWVudCAtbENsYXNzZXMgLUwgJXQKKy8vIFJVTjogJXRhcmdldC1jb2Rlc2lnbiAldC9tYWluICV0L2xpYlJlc2lsaWVudC5keWxpYiAldC9saWJDbGFzc2VzLmR5bGliCisvLyBSVU46ICV0YXJnZXQtcnVuICV0L21haW4gT0xEICV0L2xpYlJlc2lsaWVudC5keWxpYiAldC9saWJDbGFzc2VzLmR5bGliCisKKy8vIFJVTjogJXRhcmdldC1idWlsZC1zd2lmdCAtZW1pdC1saWJyYXJ5IC1lbWl0LW1vZHVsZSAtbyAldC9saWJSZXNpbGllbnQuZHlsaWIgJVMvSW5wdXRzL2NsYXNzLWxheW91dC1mcm9tLW9iamMvUmVzaWxpZW50LnN3aWZ0IC1YbGlua2VyIC1pbnN0YWxsX25hbWUgLVhsaW5rZXIgQGV4ZWN1dGFibGVfcGF0aC9saWJSZXNpbGllbnQuZHlsaWIgLVhmcm9udGVuZCAtZW5hYmxlLXJlc2lsaWVuY2UgLURCSUcKKy8vIFJVTjogJXRhcmdldC1jb2Rlc2lnbiAldC9saWJSZXNpbGllbnQuZHlsaWIKKy8vIFJVTjogJXRhcmdldC1ydW4gJXQvbWFpbiBORVcgJXQvbGliUmVzaWxpZW50LmR5bGliICV0L2xpYkNsYXNzZXMuZHlsaWIKKworLy8gVHJ5IGFnYWluIHdoZW4gdGhlIGNsYXNzIGl0c2VsZiBpcyBhbHNvIHJlc2lsaWVudC4KKy8vIFJVTjogJXRhcmdldC1idWlsZC1zd2lmdCAtZW1pdC1saWJyYXJ5IC1vICV0L2xpYkNsYXNzZXMuZHlsaWIgLWVtaXQtb2JqYy1oZWFkZXItcGF0aCAldC9DbGFzc2VzLmggLUkgJVMvSW5wdXRzL2NsYXNzLWxheW91dC1mcm9tLW9iamMvIC1JICV0ICVTL0lucHV0cy9jbGFzcy1sYXlvdXQtZnJvbS1vYmpjL0NsYXNzZXMuc3dpZnQgJXQvT25lV29yZFN1cGVyY2xhc3MubyAtWGxpbmtlciAtaW5zdGFsbF9uYW1lIC1YbGlua2VyIEBleGVjdXRhYmxlX3BhdGgvbGliQ2xhc3Nlcy5keWxpYiAtbFJlc2lsaWVudCAtTCAldAorLy8gUlVOOiAldGFyZ2V0LWNvZGVzaWduICV0L2xpYkNsYXNzZXMuZHlsaWIKKy8vIFJVTjogJXRhcmdldC1ydW4gJXQvbWFpbiBPTEQgJXQvbGliUmVzaWxpZW50LmR5bGliICV0L2xpYkNsYXNzZXMuZHlsaWIKKworLy8gUlVOOiAldGFyZ2V0LWJ1aWxkLXN3aWZ0IC1lbWl0LWxpYnJhcnkgLWVtaXQtbW9kdWxlIC1vICV0L2xpYlJlc2lsaWVudC5keWxpYiAlUy9JbnB1dHMvY2xhc3MtbGF5b3V0LWZyb20tb2JqYy9SZXNpbGllbnQuc3dpZnQgLVhsaW5rZXIgLWluc3RhbGxfbmFtZSAtWGxpbmtlciBAZXhlY3V0YWJsZV9wYXRoL2xpYlJlc2lsaWVudC5keWxpYiAtWGZyb250ZW5kIC1lbmFibGUtcmVzaWxpZW5jZSAtRFNNQUxMCisvLyBSVU46ICV0YXJnZXQtY29kZXNpZ24gJXQvbGliUmVzaWxpZW50LmR5bGliCisvLyBSVU46ICV0YXJnZXQtcnVuICV0L21haW4gTkVXICV0L2xpYlJlc2lsaWVudC5keWxpYiAldC9saWJDbGFzc2VzLmR5bGliCisKKy8vIFJFUVVJUkVTOiBleGVjdXRhYmxlX3Rlc3QKKy8vIFJFUVVJUkVTOiBvYmpjX2ludGVyb3AKKworI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+CisjaW1wb3J0IDxhc3NlcnQuaD4KKyNpbXBvcnQgPGRsZmNuLmg+CisjaW1wb3J0IDxzdGRib29sLmg+CisjaW1wb3J0IDxzdHJpbmcuaD4KKworI2ltcG9ydCAiQ2xhc3Nlcy5oIgorCit2b2lkIGNoZWNrQ2xhc3MoQ2xhc3MgYykgeworICBhc3NlcnQoYyk7CisKKyAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IFtjIHRvdGFsU2l6ZV07CisgIHNpemVfdCBhY3R1YWxTaXplID0gY2xhc3NfZ2V0SW5zdGFuY2VTaXplKFtjIGNsYXNzXSk7CisgIE5TTG9nKEAiJUA6IGV4cGVjdGVkIHNpemUgJXpkLCBhY3R1YWwgc2l6ZSAlemQiLCBjLCBleHBlY3RlZFNpemUsIGFjdHVhbFNpemUpOworICBhc3NlcnQoZXhwZWN0ZWRTaXplID09IGFjdHVhbFNpemUpOworCisgIHNpemVfdCBleHBlY3RlZE9mZnNldE9mRmlyc3QgPSBbYyBvZmZzZXRPZkZpcnN0XTsKKyAgc2l6ZV90IG9mZnNldE9mRmlyc3QgPSBpdmFyX2dldE9mZnNldChjbGFzc19nZXRJbnN0YW5jZVZhcmlhYmxlKGMsICJmaXJzdCIpKTsKKyAgTlNMb2coQCJleHBlY3RlZCBvZmZzZXQgb2YgJ2ZpcnN0JyAlemQsIGFjdHVhbCAlemQiLAorICAgICAgICBleHBlY3RlZE9mZnNldE9mRmlyc3QsIG9mZnNldE9mRmlyc3QpOworICBhc3NlcnQob2Zmc2V0T2ZGaXJzdCA9PSBleHBlY3RlZE9mZnNldE9mRmlyc3QpOworCisgIHNpemVfdCBvZmZzZXRPZkxhc3QgPSBpdmFyX2dldE9mZnNldChjbGFzc19nZXRJbnN0YW5jZVZhcmlhYmxlKGMsICJsYXN0IikpOworICBOU0xvZyhAIm9mZnNldCBvZiAnbGFzdCcgJXpkIiwgb2Zmc2V0T2ZMYXN0KTsKKyAgYXNzZXJ0KG9mZnNldE9mTGFzdCA9PSBhY3R1YWxTaXplIC0gc2l6ZW9mKGludHB0cl90KSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgYXJndltdKSB7CisgIGFzc2VydChhcmdjID4gMSk7CisKKyAgaWYgKCFzdHJjbXAoYXJndlsxXSwgIk9MRCIpKSB7CisgICAgOworICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIk5FVyIpKSB7CisgICAgLy8gT25seSB0ZXN0IHRoZSBuZXcgYmVoYXZpb3Igb24gYSBuZXcgZW5vdWdoIGxpYm9iamMuCisgICAgaWYgKCFkbHN5bShSVExEX05FWFQsICJfb2JqY19yZWFsaXplQ2xhc3NGcm9tU3dpZnQiKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJza2lwcGluZyBldm9sdXRpb24gdGVzdHM7IE9TIHRvbyBvbGRcbiIpOworICAgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgKE9MRHxORVcpXG4iLCBhcmd2WzBdKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgQGF1dG9yZWxlYXNlcG9vbCB7CisgICAgTlNMb2coQCIlemQiLCBjbGFzc19nZXRJbnN0YW5jZVNpemUoW09uZVdvcmRTdXBlcmNsYXNzIGNsYXNzXSkpOworICAgIGNoZWNrQ2xhc3MoW1N0YXRpY0NsYXNzIGNsYXNzXSk7CisgICAgY2hlY2tDbGFzcyhvYmpjX2dldENsYXNzKCJDbGFzc2VzLkR5bmFtaWNDbGFzcyIpKTsKKyAgICBjaGVja0NsYXNzKG9iamNfZ2V0Q2xhc3MoIkNsYXNzZXMuUHVyZVN3aWZ0Q2xhc3MiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3ZhbGlkYXRpb24tdGVzdC9TYW5pdGl6ZXJzL3dpdG5lc3NfdGFibGVfbG9va3VwLnN3aWZ0IGIvdmFsaWRhdGlvbi10ZXN0L1Nhbml0aXplcnMvd2l0bmVzc190YWJsZV9sb29rdXAuc3dpZnQKaW5kZXggZjNhOTMxMy4uMzM5OTRkMSAxMDA2NDQKLS0tIGEvdmFsaWRhdGlvbi10ZXN0L1Nhbml0aXplcnMvd2l0bmVzc190YWJsZV9sb29rdXAuc3dpZnQKKysrIGIvdmFsaWRhdGlvbi10ZXN0L1Nhbml0aXplcnMvd2l0bmVzc190YWJsZV9sb29rdXAuc3dpZnQKQEAgLTMsNiArMyw3IEBACiAvLyBSRVFVSVJFUzogZXhlY3V0YWJsZV90ZXN0CiAvLyBSRVFVSVJFUzogc3RyZXNzX3Rlc3QKIC8vIFJFUVVJUkVTOiB0c2FuX3J1bnRpbWUKKy8vIFVOU1VQUE9SVEVEOiBDUFU9cG93ZXJwYzY0bGUKIAogLy8gQ2hlY2sgdGhhdCBUU2FuIGRvZXMgbm90IHJlcG9ydCBzcHVyaW91cyByYWNlcyBpbiB3aXRuZXNzIHRhYmxlIGxvb2t1cC4KIApkaWZmIC0tZ2l0IGEvdmFsaWRhdGlvbi10ZXN0L1NlbWEvdHlwZV9jaGVja2VyX2NyYXNoZXJzX2ZpeGVkL3JkYXI0NzI2NjU2My5zd2lmdCBiL3ZhbGlkYXRpb24tdGVzdC9TZW1hL3R5cGVfY2hlY2tlcl9jcmFzaGVyc19maXhlZC9yZGFyNDcyNjY1NjMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzZjI5NgotLS0gL2Rldi9udWxsCisrKyBiL3ZhbGlkYXRpb24tdGVzdC9TZW1hL3R5cGVfY2hlY2tlcl9jcmFzaGVyc19maXhlZC9yZGFyNDcyNjY1NjMuc3dpZnQKQEAgLTAsMCArMSwzIEBACisvLyBSVU46ICV0YXJnZXQtc3dpZnQtZnJvbnRlbmQgJXMgLXR5cGVjaGVjaworCitwcmludCh0cnVlID8gInJlYWRsaW5lIiA6IG5pbCkKZGlmZiAtLWdpdCBhL3ZhbGlkYXRpb24tdGVzdC9jb21waWxlcl9zY2FsZS9mdW5jdGlvbl9ib2RpZXMuZ3liIGIvdmFsaWRhdGlvbi10ZXN0L2NvbXBpbGVyX3NjYWxlL2Z1bmN0aW9uX2JvZGllcy5neWIKaW5kZXggNDljZmUzOS4uMzhiNzc4MiAxMDA2NDQKLS0tIGEvdmFsaWRhdGlvbi10ZXN0L2NvbXBpbGVyX3NjYWxlL2Z1bmN0aW9uX2JvZGllcy5neWIKKysrIGIvdmFsaWRhdGlvbi10ZXN0L2NvbXBpbGVyX3NjYWxlL2Z1bmN0aW9uX2JvZGllcy5neWIKQEAgLTMsMyArMywzNSBAQAogLy8gUkVRVUlSRVM6IGFzc2VydHMKIAogZnVuYyBtZXRob2Qke059KCkge30KKworY2xhc3MgQyR7Tn0geworICAgIGZ1bmMgbWV0aG9kJHtOfSgpIHt9Cit9CisKK2V4dGVuc2lvbiBDJHtOfSB7CisgICAgZnVuYyBvdGhlck1ldGhvZCR7Tn0oKSB7fQorfQorCitzdHJ1Y3QgUyR7Tn0geworICAgIGZ1bmMgbWV0aG9kJHtOfSgpIHt9Cit9CisKK2V4dGVuc2lvbiBTJHtOfSB7CisgICAgZnVuYyBvdGhlck1ldGhvZCR7Tn0oKSB7fQorfQorCitlbnVtIEUke059IHsKKyAgICBmdW5jIG1ldGhvZCR7Tn0oKSB7fQorfQorCitleHRlbnNpb24gRSR7Tn0geworICAgIGZ1bmMgb3RoZXJNZXRob2Qke059KCkge30KK30KKworcHJvdG9jb2wgUCR7Tn0geworICAgIGZ1bmMgbWV0aG9kJHtOfSgpCit9CisKK2V4dGVuc2lvbiBQJHtOfSB7CisgICAgZnVuYyBvdGhlck1ldGhvZCR7Tn0oKSB7fQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZhbGlkYXRpb24tdGVzdC9leGVjdXRpb24vYXJjXzM2NTA5NDYxLnN3aWZ0IGIvdmFsaWRhdGlvbi10ZXN0L2V4ZWN1dGlvbi9hcmNfMzY1MDk0NjEuc3dpZnQKaW5kZXggNTZmNDYwMy4uNWM3MzBlMyAxMDA2NDQKLS0tIGEvdmFsaWRhdGlvbi10ZXN0L2V4ZWN1dGlvbi9hcmNfMzY1MDk0NjEuc3dpZnQKKysrIGIvdmFsaWRhdGlvbi10ZXN0L2V4ZWN1dGlvbi9hcmNfMzY1MDk0NjEuc3dpZnQKQEAgLTksNiArOSw5IEBACiAvLyBSRVFVSVJFUzogb2JqY19pbnRlcm9wCiAvLyBSRVFVSVJFUzogT1M9bWFjb3N4CiAKKy8vIHJkYXI6Ly9wcm9ibGVtLzQ3MzY3Njk0IHRyYWNrcyByZS1lbmFibGluZyB0aGlzIHRlc3QgZm9yIGJhY2t3YXJkIGRlcGxveW1lbnQuCisvLyBVTlNVUFBPUlRFRDogcmVtb3RlX3J1bgorCiBpbXBvcnQgRm91bmRhdGlvbgogCiBzdHJ1Y3QgRmFrZVVVSUQgewo=