ZGlmZiAtLWdpdCBhL01hYy9Db250cmliL3N0cnB0aW1lL3N0cnB0aW1lLnB5IGIvTWFjL0NvbnRyaWIvc3RycHRpbWUvc3RycHRpbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiNzlhYQotLS0gL2Rldi9udWxsCisrKyBiL01hYy9Db250cmliL3N0cnB0aW1lL3N0cnB0aW1lLnB5CkBAIC0wLDAgKzEsMjUwIEBACisiIiIgc3RycHRpbWUgdmVyc2lvbiAxLjMsIFRpbWUtc3RhbXA6IDw5Ni8wOS8yMyAyMToyMjoyNCBmbG9nbmF0PgorICAgICAgICAgICAgICAgVGhlIHJldmVyc2Ugb2Ygc3RyZnRpbWUuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTYgQW5keSBFc2tpbHNzb24sIGZsb2duYXRAZnVrdC5oay1yLnNlCisKKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHVucmVzdHJpY3RlZCByZWRpc3RyaWJ1dGlvbiBpcyBhbGxvd2VkIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBHUEwuICBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSBsaWNlbnNlIGNvbmRpdGlvbnMgb2YgdGhpcworICAgIHNvZnR3YXJlLCBzZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgICAgQW5kIGhlcmUgY29tZXMgdGhlIGRvY3VtZW50YXRpb246CisKKyAgICBUaHJvdyBhIHN0cmluZyBhbmQgYSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBhdCBzdHJwdGltZSBhbmQgaWYgZXZlcnl0aGluZworICAgIGlzIG9rIHlvdSB3aWxsIGdldCBhIHR1cGxlIGNvbnRhaW5pbmcgOSBpdGVtcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGgKKyAgICBweXRob25zIHRpbWUtbW9kdWxlLgorCisgICAgaW50ZXJmYWNlOgorICAgICAgIHN0cnB0aW1lKGlucHV0c3RyaW5nLCBmb3JtYXRzdHJpbmcpCisKKyAgICAgICBMaXR0bGUgZXJyb3JjaGVja2luZy4uLiBzbyB5b3UnZCBiZXR0ZXIga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisKKyAgICBleGFtcGxlOgorICAgICAgIGZyb20gc3RycHRpbWUgaW1wb3J0ICoKKyAgICAgICBta3RpbWUoc3RycHRpbWUoIjI2LzYgMTk3MyIsICIlZC8lbSAlWSIpKQorCisgICAgQW5kIHZvaWxhIHlvdSBoYXZlIHRoZSBzZWNvbmQgd2hlbiB0aGUgYXV0aG9yIG9mIHRoaXMgZnVuY3Rpb24gd2FzIGJvcm4uCisKKyAgICBUaGUgc3VwcG9ydGVkIGZvcm1hdCBpZGVudGlmaWVycyBhcmU6CisgICAgICAgICVhIHdlZWtkYXkgaW4gc2hvcnQgdGV4dC1mb3JtLCBlLmcuIE1vbgorCSVBIHdlZWtkYXkgaW4gbG9uZyB0ZXh0LWZvcm0sIGUuZy4gTW9uZGF5CisJJWIgbW9udGggaW4gc2hvcnQgdGV4dC1mb3JtLCBlLmcuIEp1bAorCSVCIG1vbnRoIGluIGxvbmcgdGV4dC1mb3JtIGUuZy4gSnVseQorCSVjIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IERhdGVBbmRUaW1lUmVwcmVzZW50YXRpb24KKwklZCB0aGUgZGF5IGluIG1vbnRoIGluIG51bWVyaWMgZm9ybSwgZS5nLiAyNAorCSVIIGhvdXIgaW4gMjQgaG91ciBmb3JtCisJJWoganVsaWFuIGRheSAoZGF5IG9mIHllYXIpCisJJW0gbW9udGggaW4gbnVtZXJpYyBmb3JtYXQKKwklTSBtaW51dGUKKwklUyBzZWNvbmQKKwklVCBUaW1lIGluICclSDolTTolUyctZm9ybWF0CisJJXcgd2Vla2RheSwgMD1tb25kYXkKKwkleCBkYXRlIGluIGZvcm1hdCByZXByZXNlbnRlZCBieSBEYXRlUmVwcmVzZW50YXRpb24KKwklWCB0aW1lIGluIGZvcm1hdCByZXByZXNlbnRlZCBieSBUaW1lUmVwcmVzZW50YXRpb24KKwkleSB5ZWFyIGluIHNob3J0IGZvcm0KKwklWSB5ZWFyIGluIGxvbmcgZm9ybQorCSUlICUtc2lnbgorCisgICAgSSBoYXZlIGRvbmUgc29tZSB0aGlua2luZyBoZXJlICgqUkVBTExZKikgYW5kIGl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZQorICAgIHRoaXMgbW9kdWxlIHNvIGl0IHVzZXMgb3RoZXIgbGFuZ3VhZ2VzIGJ5IGFkZGluZyB0aGVpciBuYW1lcyB0byB0aGUKKyAgICBkaWN0aW9uYXJpZXMgZmlyc3QgaW4gdGhlIGZpbGUsIGFuZCBzZXR0aW5nIHRoZSB2YXJpYWJsZSBMQU5HVUFHRS4KKworICAgIEZvciB5b3VyIGV4ZXJjaXNlIEkgaGF2ZSBpbnNlcnRlZCB0aGUgc3dlZGlzaCBuYW1lcyA7LSkKKworICAgIFRoZSBsZmluZCwgbmFtZSwgY29tcGxleCwgbnVtYmVycyBhbmQgcGFyc2UgZnVuY3Rpb25zIGFyZSBmb3IgaW50ZXJuYWwKKyAgICB1c2UsIGNhbGxlZCBieSBzdHJwdGltZS4KKworICAgIFVoLi4gb2ggeWVhaC4uIGlmIHlvdSB3YW50IHRvIGdldCBpbiB0b3VjaCB3aXRoIG1lLi4gSSBhbSByZWFjaGFibGUKKyAgICBhdCBmbG9nbmF0QGZ1a3QuaGstci5zZSwgdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBjYW4gcHJvYmFibHkKKyAgICBiZSBmb3VuZCBzb21ld2hlcmUgY2xvc2UgdG8gaHR0cDovL3d3dy5mdWt0LmhrLXIuc2UvfmZsb2duYXQKKworICAgIElmIHlvdSBsaWtlIGl0LCBzZW5kIGEgcG9zdGNhcmQgdG8gQW5keSBFc2tpbHNzb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEvkbW7kcnN2LiAzYjIyOAorCQkJCSAgICAgICBTLTIyNiA0NiBMdW5kCisJCQkJICAgICAgIFN3ZWRlbgorCisgICAgVWhtIGJlIGdlbnRsZSB3aXRoIHRoZSBidWctcmVwb3J0cywgaXRzIHRoZSBmaXJzdCB0aW1lIGZvciBtZSA7LSkKKworICAgICIiIgorCitpbXBvcnQgc3RyaW5nCisKK0xvbmdEYXlOYW1lcz17ICdFbmdsaXNoJyA6IFsgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsCisJCQkgICAgICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknLCAnU3VuZGF5J10sCisJICAgICAgICdTd2VkaXNoJyA6IFsgJ03lbmRhZycsICdUaXNkYWcnLCAnT25zZGFnJywgJ1RvcnNkYWcnLAorCQkJICAgICAnRnJlZGFnJywgJ0z2cmRhZycsICdT9m5kYWcnXX0KK1Nob3J0RGF5TmFtZXM9eyAnRW5nbGlzaCcgOiBbICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsICdTdW4nXSwKKwkJJ1N3ZWRpc2gnIDogWyAnTeVuJywgJ1RpcycsICdPbnMnLCAnVG9yJywgJ0ZyZScsICdM9nInLCAnU/ZuJ119CisKK0xvbmdNb250aE5hbWVzPXsgJ0VuZ2xpc2gnIDogWydub25lJywgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLAorCQkJICAgICAgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsCisJCQkgICAgICAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLAorCQkgJ1N3ZWRpc2gnIDogWydub25lJywgJ0phbnVhcmknLCAnRmVicnVhcmknLCAnTWFycycsICdBcHJpbCcsCisJCQkgICAgICAnTWFqJywgJ0p1bmknLCAnSnVsaScsICdBdWd1c3RpJywnU2VwdGVtYmVyJywKKwkJCSAgICAgICdPa3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfQorU2hvcnRNb250aE5hbWVzPXsgJ0VuZ2xpc2gnIDogWydub25lJywgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywKKwkJCSAgICAgICAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSwKKwkJICAnU3dlZGlzaCcgOiBbJ25vbmUnLCAnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01haicsICdKdW4nLAorCQkJICAgICAgICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPa3QnLCAnTm92JywgJ0RlYyddfQorRGF0ZUFuZFRpbWVSZXByZXNlbnRhdGlvbj17ICdFbmdsaXNoJyA6ICclYSAlYiAlZCAlSDolbTolUyAlWScsCisJCQkgICAgJ1N3ZWRpc2gnIDogJyVhICVkICViICVZICVIOiVtOiVTJyB9CisKK0RhdGVSZXByZXNlbnRhdGlvbiA9IHsgJ0VuZ2xpc2gnIDogJyVtLyVkLyV5JywKKwkJICAgICAgICdTd2VkaXNoJyA6ICclZC8lbS8leSd9CisKK1RpbWVSZXByZXNlbnRhdGlvbiA9IHsgJ0VuZ2xpc2gnIDogJyVIOiVNOiVTJywKKwkJICAgICAgICdTd2VkaXNoJyA6ICclSDolTTolUyd9CisKK0xBTkdVQUdFPSdFbmdsaXNoJworCitCYWRGb3JtYXR0ZXI9J0FuIGlsbGVnYWwgZm9ybWF0dGVyIHdhcyBnaXZlbicKKworI0NoZWNrIGlmIHN0cmluZiBiZWdpbnMgd2l0aCBzdWJzdHIKK2RlZiBsZmluZChzdHIsIHN1YnN0cik6CisgICByZXR1cm4gc3RyaW5nLmxvd2VyKHN0cls6bGVuKHN1YnN0cildKT09c3RyaW5nLmxvd2VyKHN1YnN0cikKKworI2F0b21zIGNvbnNpc3Rpbmcgb2Ygb3RoZXIgYXRvbXMKK2RlZiBjb21wbGV4KHN0ciwgZm9ybWF0LCBiYXNlKToKKyAgIGNvZGU9Zm9ybWF0WzoxXQorICAgaWYgY29kZT09J2MnOiAKKyAgICAgIHN0cmluZz1EYXRlQW5kVGltZVJlcHJlc2VudGF0aW9uW0xBTkdVQUdFXQorICAgZWxpZiBjb2RlPT0nVCc6CisgICAgICBzdHJpbmc9JyVIOiVNOiVTJworICAgZWxpZiBjb2RlPT0neCc6CisgICAgICBzdHJpbmc9RGF0ZVJlcHJlc2VudGF0aW9uW0xBTkdVQUdFXQorICAgZWxpZiBjb2RlPT0nWCc6CisgICAgICBzdHJpbmc9VGltZVJlcHJlc2VudGF0aW9uW0xBTkdVQUdFXQorCisgICByZXR1cm4gcGFyc2Uoc3RyLCBzdHJpbmcsIGJhc2UpCisKKyNzdHJpbmcgYmFzZWQgbmFtZXMKK2RlZiBuYW1lcyhzdHIsIGZvcm1hdCwgYmFzZSk6CisgICBjb2RlPWZvcm1hdFs6MV0KKyAgIGlmIGNvZGU9PSdhJzoKKyAgICAgIHNlbGVjdGlvbj1TaG9ydERheU5hbWVzW0xBTkdVQUdFXQorICAgICAgcmVzdWx0PSd3ZWVrZCcKKyAgIGVsaWYgY29kZT09J0EnOgorICAgICAgc2VsZWN0aW9uPUxvbmdEYXlOYW1lc1tMQU5HVUFHRV0KKyAgICAgIHJlc3VsdD0nd2Vla2QnCisgICBlbGlmIGNvZGU9PSdiJzoKKyAgICAgIHNlbGVjdGlvbj1TaG9ydE1vbnRoTmFtZXNbTEFOR1VBR0VdCisgICAgICByZXN1bHQ9J21vbnRoJworICAgZWxpZiBjb2RlPT0nQic6CisgICAgICBzZWxlY3Rpb249TG9uZ01vbnRoTmFtZXNbTEFOR1VBR0VdCisgICAgICByZXN1bHQ9J21vbnRoJworICAgCisgICBtYXRjaD1Ob25lCisgICBmb3IgaSBpbiBzZWxlY3Rpb246CisgICAgICBpZiBsZmluZChzdHIsIGkpOgorCSBtYXRjaD1pCisJIGJyZWFrCisKKyAgIGJhc2VbcmVzdWx0XT1zZWxlY3Rpb24uaW5kZXgobWF0Y2gpCisgICByZXR1cm4gbGVuKG1hdGNoKQorCisjbnVtZXJpYyBzdHVmZgorZGVmIG51bWVyaWMoc3RyLCBmb3JtYXQsIGJhc2UpOgorICAgY29kZT1mb3JtYXRbOjFdCisgICBpZiBjb2RlPT0nZCc6IHJlc3VsdD0nZGF5JworICAgZWxpZiBjb2RlPT0nSCc6IHJlc3VsdD0naG91cicKKyAgIGVsaWYgY29kZT09J2onOiByZXN1bHQ9J2p1bGlhbmQnCisgICBlbGlmIGNvZGU9PSdtJzogcmVzdWx0PSdtb250aCcKKyAgIGVsaWYgY29kZT09J00nOiByZXN1bHQ9J21pbicKKyAgIGVsaWYgY29kZT09J1MnOiByZXN1bHQ9J3NlYycKKyAgIGVsaWYgY29kZT09J3cnOiByZXN1bHQ9J3dlZWtkJworICAgZWxpZiBjb2RlPT0neSc6IHJlc3VsdD0nc2hvcnRZZWFyJworICAgZWxpZiBjb2RlPT0nWSc6IHJlc3VsdD0neWVhcicKKworICAgaT0wCisgICB3aGlsZSBzdHJbaV0gaW4gc3RyaW5nLndoaXRlc3BhY2U6IGk9aSsxCisgICBqPWkKKyAgIGlmIGxlbihmb3JtYXQpPjE6CisgICAgICB3aGlsZSBub3Qgc3RyW2pdIGluIHN0cmluZy53aGl0ZXNwYWNlIGFuZCBzdHJbal0hPWZvcm1hdFsxXTogaj1qKzEKKyAgIGVsc2U6CisgICAgICB0cnk6CisJIHdoaWxlIG5vdCBzdHJbal0gaW4gc3RyaW5nLndoaXRlc3BhY2U6IGo9aisxCisgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKwkgcGFzcworCisgICAjIGhtbSBjb3VsZCBjaGVjayBleGNlcHRpb24gaGVyZSwgYnV0IHdoYXQgY291bGQgSSBhZGQ/CisgICBiYXNlW3Jlc3VsdF09c3RyaW5nLmF0b2koc3RyW2k6al0pCisgICAKKyAgIHJldHVybiBqCisKK3BhcnNlRnVucz17ICdhJzpuYW1lcywgJ0EnOm5hbWVzLCAnYic6bmFtZXMsICdCJzpuYW1lcywgJ2MnOmNvbXBsZXgsICdkJzpudW1lcmljLAorCSAgICAnSCc6bnVtZXJpYywgJ2onOm51bWVyaWMsICdtJzpudW1lcmljLCAnTSc6bnVtZXJpYywgJ1MnOm51bWVyaWMsCisJICAgICdUJzpjb21wbGV4LCAndyc6bnVtZXJpYywgJ3gnOmNvbXBsZXgsICd5JzpudW1lcmljLCAnWSc6bnVtZXJpY30KKworIyBXZWxsIHNwbGl0IHVwIGluIGF0b21zLCByZWFzb24gdG8gd2h5IHRoaXMgaXMgc2VwYXJhdGVkIGZyb20gYXRycHRpbWUKKyMgaXMgdG8gYmUgYWJsZSB0byByZXBhcnNlIGNvbXBsZXggYXRvbXMKK2RlZiBwYXJzZShzdHIsIGZvcm1hdCwgYmFzZSk6CisgICBhdG9tcz1zdHJpbmcuc3BsaXQoZm9ybWF0LCAnJScpCisgICBjaGFyQ291bnRlcj0wCisgICBhdG9tQ291bnRlcj0wCisKKyAgICMgSGV5IEkgYW0gbGFhenkgYW5kIHRoaW5rIHRoYXQgdGhlIGZvcm1hdCBpcyBleGFjdGx5IHdoYXQgdGhlIHN0cmluZyBpcyEKKyAgIGNoYXJDb3VudGVyPWNoYXJDb3VudGVyK2xlbihhdG9tc1thdG9tQ291bnRlcl0pCisgICBhdG9tQ291bnRlcj1hdG9tQ291bnRlcisxCisKKyAgIHdoaWxlIGF0b21Db3VudGVyIDwgbGVuKGF0b21zKSBhbmQgY2hhckNvdW50ZXIgPCBsZW4oc3RyKToKKyAgICAgIGF0b209YXRvbXNbYXRvbUNvdW50ZXJdCisKKyAgICAgIGlmIGF0b209PScnOiAjIGVzY2FwZWQKKwkgY2hhckNvdW50ZXI9Y2hhckNvdW50ZXIrMQorCSBhdG9tQ291bnRlcj1hdG9tQ291bnRlcisxCisJIGNoYXJDb3VudGVyPWNoYXJDb3VudGVyK2xlbihhdG9tc1thdG9tQ291bnRlcl0pCisgICAgICBlbHNlOgorCSB0cnk6CisJICAgIHBhcnNlZnVuY3Rpb249cGFyc2VGdW5zW2F0b21bOjFdXQorCSBleGNlcHQgS2V5RXJyb3I6CisJICAgIHJhaXNlIEJhZEZvcm1hdHRlciwgYXRvbVs6MV0KKwkgZ3JhYmJlZD1hcHBseShwYXJzZWZ1bmN0aW9uLCAoc3RyW2NoYXJDb3VudGVyOl0sIGF0b20sIGJhc2UpKQorCSBjaGFyQ291bnRlcj1jaGFyQ291bnRlcitncmFiYmVkK2xlbihhdG9tKS0xCisKKyAgICAgIGF0b21Db3VudGVyPWF0b21Db3VudGVyKzEKKworICAgcmV0dXJuIGNoYXJDb3VudGVyCisKKyMgT2sgaGVyZSB3ZSBnbywgdGFkYWFhIC0tPiBTVFJQVElNRSA8LS0gYXQgbGFzdC4uCitkZWYgc3RycHRpbWUoc3RyLCBmb3JtYXQpOgorICAgIiIiQ29udmVydHMgc3RyIHNwZWNpZmllZCBieSBmb3JtYXQgdG8gdHVwbGUgdXNlYWJsZSBieSB0aGUgdGltZSBtb2R1bGUiIiIKKyAgIHJldHVyblRpbWU9e30KKyAgIHJldHVyblRpbWVbJ3llYXInXT0wCisgICByZXR1cm5UaW1lWydzaG9ydFllYXInXT1Ob25lCisgICByZXR1cm5UaW1lWydtb250aCddPTAKKyAgIHJldHVyblRpbWVbJ2RheSddPTAKKyAgIHJldHVyblRpbWVbJ2hvdXInXT0wCisgICByZXR1cm5UaW1lWydtaW4nXT0wCisgICByZXR1cm5UaW1lWydzZWMnXT0wCisgICByZXR1cm5UaW1lWyd3ZWVrZCddPTAKKyAgIHJldHVyblRpbWVbJ2p1bGlhbmQnXT0wCisgICByZXR1cm5UaW1lWydkc3QnXT0wCisKKyAgIHBhcnNlKHN0ciwgZm9ybWF0LCByZXR1cm5UaW1lKQorCisgICBpZiByZXR1cm5UaW1lWydzaG9ydFllYXInXSE9Tm9uZToKKyAgICAgIHJldHVyblRpbWVbJ3llYXInXT1yZXR1cm5UaW1lWydzaG9ydFllYXInXSsxOTAwCisKKyAgIHJldHVybiAocmV0dXJuVGltZVsneWVhciddLCByZXR1cm5UaW1lWydtb250aCddLCByZXR1cm5UaW1lWydkYXknXSwKKwkgICByZXR1cm5UaW1lWydob3VyJ10sIHJldHVyblRpbWVbJ21pbiddLCByZXR1cm5UaW1lWydzZWMnXSwKKwkgICByZXR1cm5UaW1lWyd3ZWVrZCddLCByZXR1cm5UaW1lWydqdWxpYW5kJ10sIHJldHVyblRpbWVbJ2RzdCddKQorCisjIGp1c3QgZm9yIG15IGNvbnZlbmllbmNlCitkZWYgc3RycGRlYnVnKCk6CisgICBpbXBvcnQgcGRiCisgICBwZGIucnVuKCdzdHJwdGltZSgiJSBUdWUgMyBGZWIiLCAiJSUgJWEgJWQgJWIiKScpCisKK2RlZiB0ZXN0KCk6CisgICBmcm9tIHRpbWUgaW1wb3J0ICoKKyAgIGE9YXNjdGltZShsb2NhbHRpbWUodGltZSgpKSkKKyAgIHByaW50IGEKKyAgIGI9c3RycHRpbWUoYSwgJyVhICViICVkICVIOiVNOiVTICVZJykKKyAgIHByaW50IGFzY3RpbWUoYikKKyAgIHByaW50IHN0cnB0aW1lKCIlJSAlIFR1ZSAzIEZlYiIsICIlJSUlICUlICVhICVkICViIikKKyAgIHByaW50IHN0cnB0aW1lKCdUaHUsIDEyIFNlcCAxOTk2IDE5OjQyOjA2IEdNVCcsICclYSwgJWQgJWIgJVkgJVQgR01UJykKKyAgIHByaW50IHN0cnB0aW1lKCdUaHUsIDEyIFNlcCAxOTk2IDE5OjQyOjA2IEdNVCcsICclYSwgJWQgJWIgJVkgJVQnKQorICAgcHJpbnQgc3RycHRpbWUoJ1RodSwgMTIgU2VwIDE5OTYgMTk6NDI6MDYnLCAnJWEsICVkICViICVZICVUJykKKyAgIAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgIHRlc3QoKQorCisK