ZGlmZiAtLWdpdCBhLy5wcm9qZWN0IGIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5ZmZjMQotLS0gL2Rldi9udWxsCisrKyBiLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHByb2plY3REZXNjcmlwdGlvbj4NCisJPG5hbWU+dGN1dGlsczwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5weXRob24ucHlkZXYuUHlEZXZCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJPC9idWlsZFNwZWM+DQorCTxuYXR1cmVzPg0KKwkJPG5hdHVyZT5vcmcucHl0aG9uLnB5ZGV2LnB5dGhvbk5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvLnB5ZGV2cHJvamVjdCBiLy5weWRldnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3MGZmZQotLS0gL2Rldi9udWxsCisrKyBiLy5weWRldnByb2plY3QKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQorPD9lY2xpcHNlLXB5ZGV2IHZlcnNpb249IjEuMCI/Pg0KKw0KKzxweWRldl9wcm9qZWN0Pg0KKzxweWRldl9wcm9wZXJ0eSBuYW1lPSJvcmcucHl0aG9uLnB5ZGV2LlBZVEhPTl9QUk9KRUNUX0lOVEVSUFJFVEVSIj5EZWZhdWx0PC9weWRldl9wcm9wZXJ0eT4NCis8cHlkZXZfcHJvcGVydHkgbmFtZT0ib3JnLnB5dGhvbi5weWRldi5QWVRIT05fUFJPSkVDVF9WRVJTSU9OIj5weXRob24gMi42PC9weWRldl9wcm9wZXJ0eT4NCis8cHlkZXZfcGF0aHByb3BlcnR5IG5hbWU9Im9yZy5weXRob24ucHlkZXYuUFJPSkVDVF9TT1VSQ0VfUEFUSCI+DQorPHBhdGg+L3RjdXRpbHMvc3JjPC9wYXRoPg0KKzwvcHlkZXZfcGF0aHByb3BlcnR5Pg0KKzwvcHlkZXZfcHJvamVjdD4NCmRpZmYgLS1naXQgYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5MWMxYQotLS0gL2Rldi9udWxsCisrKyBiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMCwwICsxLDQgQEAKKyNNb24gU2VwIDI2IDEyOjM5OjQ2IENTVCAyMDExDQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCitlbmNvZGluZy8vc3JjL3B5YmNjY2x0LnB5PWdiaw0KK2VuY29kaW5nL3NldHVwLnB5PXV0Zi04DQpkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDljMjczCi0tLSAvZGV2L251bGwKKysrIGIvc2V0dXAucHkKQEAgLTAsMCArMSwzMSBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitpbXBvcnQgb3MKKworZGVmIGZpbmRfYWxsX2Rpc3RfbW9kdWxlKCk6CisgICAgYmFzZV9kaXIgPSAnc3JjJworICAgIGFsbF9maWxlcyA9IG9zLmxpc3RkaXIoYmFzZV9kaXIpCisgICAgbW9kdWxlcz1bXQorICAgIGZvciBmIGluIGFsbF9maWxlczoKKyAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZV9kaXIsZikKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm5hbWUpOgorICAgICAgICAgICAgZXh0ID0gZi5zcGxpdCgnLicpWy0xXQorICAgICAgICAgICAgI3ByaW50IGYuc3BsaXQoJy4nKQorICAgICAgICAgICAgaWYgZXh0ID09ICdweSc6CisgICAgICAgICAgICAgICAgbW9kdWxlcy5hcHBlbmQoZikKKyAgICAgICAgICAgICAgICAKKyAgICByZXR1cm4gbW9kdWxlcworICAgIAorI3ByaW50IGZpbmRfYWxsX2Rpc3RfbW9kdWxlKCkKKworc2V0dXAoCisgICAgbmFtZSA9ICd0Y3V0aWxzJywKKyAgICB2ZXJzaW9uID0gIjAuMiIsCisgICAgZGVzY3JpcHRpb24gPSAiQ2hlbmcgVGFuZyAncyBweXRob24gbGlicmFyaWVzIiwKKyAgICBhdXRob3IgPSAnQ2hlbmcgVGFuZycsCisgICAgYXV0aG9yX2VtYWlsID0gJ2Nhc2h0YW5nQGdtYWlsLmNvbScsCisgICAgcGxhdGZvcm1zPVsnQWxsJ10sCisgICAgcGFja2FnZXM9Wyd0Y3V0aWxzJ10KKyAgICApClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2FtYXNzcHJvdG9jb2wucHkgYi9zcmMvYW1hc3Nwcm90b2NvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjU2ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2FtYXNzcHJvdG9jb2wucHkKQEAgLTAsMCArMSwzODkgQEAKKyMhL3Vzci9iaW4vcHl0aG9uDQorIyAtKi0gY29kaW5nOiBnYmsgLSotIA0KKw0KK2ltcG9ydCBzeXMsY29kZWNzLHN0cnVjdA0KKw0KK0lGVF9OVUxMPTANCitJRlRfVUxPTkc9MQ0KK0lGVF9CWVRFPTINCitJRlRfVVNIT1JUPTMNCitJRlRfREFURVRJTUU9NA0KK0lGVF9CVUZGRVI9NQ0KK0lGVF9TVFJJTkc9Ng0KK0lGVF9MT05HPTcNCisNCisjICgwLDAsMSxJRlRfQllURSwwLCJtc2d0eXBlIiwiz/vPosLrIiksDQorDQorRkxEX05PX0lEWD0wDQorRkxEX0xFTkdUSF9JRFg9Mg0KK0ZMRF9UWVBFX0lEWD0zDQorRkxEX0ZMQUdfSURYPTQNCitGTERfTkFNRV9JRFg9NQ0KK0ZMRF9ERVNDX0lEWD02DQorDQorSERGaWVsZHNEZWYgPSBbDQorKDEsMCwwLElGVF9OVUxMLDAsImV4dGVuZCIsIsCp1bnT8rfxIiksDQorKDIsMCw0LElGVF9VTE9ORywwLCJ0ZXJtaW5hbHNuIiwiINbVtsvQ8sHQusUiKSwNCisoMywwLDIsSUZUX1VTSE9SVCwwLCJhZGRyZXNzIiwiQ0FOtdjWtyIpLA0KKyg0LDAsNCxJRlRfVUxPTkcsMCwiY2FyZG51bWJlciIsIr+ousUiKSwNCisoNSwwLDEsSUZUX0JZVEUsMCwiaW5kZXhvZmV3IiwiIMeusPzL99L9IiksDQorKDYsMCwyLElGVF9VU0hPUlQsMCwidHJhY2VvZmV3IiwiIMeusPzB98uuusUiKSwNCisoNywwLDQsSUZUX0xPTkcsMCwiYW1vdW50IiwiIL270te98LbuIiksDQorKDgsMCw0LElGVF9MT05HLDAsImFkZGl0aW9uYWxhbW91bnQxIiwiuL28073wtu4iKSwNCisoOSwwLDQsSUZUX1VMT05HLDAsInRyYWNlb2Zwb3MiLCJQT1PB98uuusUiKSwNCisoMTAsMCw0LElGVF9VTE9ORywwLCJvcmd0cmFuc3RyYWNlIiwi1K29u9LXwffLrrrFIiksDQorKDExLDAsNyxJRlRfREFURVRJTUUsMCwiZGF0ZXRpbWUiLCK9u9LXyNXG2rrNyrG85CIpLA0KKygxMiwwLDEsSUZUX0JZVEUsMCwicmVzcG9uc2Vjb2RlIiwiz+zTpsLrIiksDQorKDEzLDAsMixJRlRfVVNIT1JULDAsInRlcm1pbmFsaWQiLCLW1bbLusUiKSwNCisoMTQsMCwyLElGVF9VU0hPUlQsMCwidGVybWluYWx0eXBlIiwi1tW2y8Dg0M0iKSwNCisoMTUsMCwyLElGVF9VU0hPUlQsMCwibWVyY2hhbnRpZCIsIsnMu6cozfi14ym6xSIpLA0KKygxNiwwLDQsSUZUX1VMT05HLDAsIm9wZXJhdG9yaWQiLCKy2df31LG6xSIpLA0KKygxNywwLDgsSUZUX0JVRkZFUiwwLCJwaW4iLCK49sjLyrax8MLrUElOIiksDQorKDE4LDAsNCxJRlRfVUxPTkcsMCwidmVyb2ZsaXN0IiwiutrD+7WlsOaxviIpLA0KKygxOSwwLDQsSUZUX1VMT05HLDAsIm1hbmFnZWZlZSIsIr270tfF+rTOusUo1N2yu9PDKSIpLA0KKygyMCwwLDM2MCxJRlRfQlVGRkVSLDIsImFkZGl0aW9uYWxkYXRhMSIsIri9vNPQxc+iMSIpLA0KKygyMSwwLDUyOCxJRlRfQlVGRkVSLDIsImFkZGl0aW9uYWxkYXRhMiIsIri9vNPQxc+iMiIpLA0KKygyMiwwLDUyOCxJRlRfU1RSSU5HLDIsImFkZGl0aW9uYWxkYXRhMyIsIri9vNPQxc+iMyIpLA0KKygyMywwLDUyOCxJRlRfU1RSSU5HLDIsImFkZGl0aW9uYWxkYXRhNCIsIri9vNPQxc+iNCIpLA0KKygyNCwwLDIsSUZUX1VTSE9SVCwwLCJtYWMiLCLP+8+iyM/WpMLrIikNCitdDQorDQorY2xhc3MgSERQYWNrOg0KKyAgICAnJycgu+O24CA4NTgzINCt0umw/CAnJycNCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KKyAgICAgICAgc2VsZi5tc2dfdHlwZSA9IDANCisgICAgICAgIHNlbGYudmFsdWU9e30NCisgICAgICAgIHNlbGYuZmllbGRfaWR4PXt9DQorICAgICAgICBzZWxmLmZpZWxkX25hbWU9e30NCisgICAgICAgIHNlbGYubXNndHlwZSA9IDANCisgICAgICAgIA0KKyAgICAgICAgc2VsZi5sb2FkX2NvbmZpZygpDQorICAgICAgICANCisgICAgZGVmIF9fZXFfXyhzZWxmLG90aGVyKToNCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLEhEUGFjayk6DQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgICAgICByZXR1cm4gc2VsZi5jb21wYXJlKG90aGVyKQ0KKyAgICBkZWYgX19uZV9fKHNlbGYsb3RoZXIpOg0KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsSERQYWNrKToNCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmNvbXBhcmUob3RoZXIpDQorICAgICAgICANCisgICAgZGVmIGNvbXBhcmUoc2VsZixvdGhlcik6DQorICAgICAgICBpZiBzZWxmLm1zZ3R5cGUgIT0gb3RoZXIubXNndHlwZToNCisgICAgICAgICAgICByZXR1cm4gRmFsc2UNCisgICAgICAgIGZvciBrLHYgaW4gc2VsZi52YWx1ZS5pdGVtcygpOg0KKyAgICAgICAgICAgIGlmIG5vdCBvdGhlci52YWx1ZS5oYXNfa2V5KGspOg0KKyAgICAgICAgICAgICAgICBwcmludCAiZmllbGQgWyVzXSBub3QgZXF1YWwiICUgaw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UNCisgICAgICAgICAgICBpZiB2IDw+IG90aGVyLmdldChrKToNCisgICAgICAgICAgICAgICAgcHJpbnQgImZpZWxkIFslc10gdmFsdWUgbm90IGVxdWFsIFslcywlc10iICUgKGssdixvdGhlci5nZXQoaykpDQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KKyAgICAgICAgcmV0dXJuIFRydWUNCisgICAgICAgIA0KKyAgICBkZWYgbG9hZF9jb25maWcoc2VsZik6DQorICAgICAgICBmb3IgZmllbGQgaW4gSERGaWVsZHNEZWY6DQorICAgICAgICAgICAgaW5kZXgsdCxsZW4sdHlwZSxmbGFnLG5hbWUsZGVzYyA9IGZpZWxkDQorICAgICAgICAgICAgc2VsZi5maWVsZF9pZHhbaW5kZXhdID0gZmllbGQNCisgICAgICAgICAgICBzZWxmLmZpZWxkX25hbWVbbmFtZV0gPSBmaWVsZA0KKyAgICAgICAgI3ByaW50IHNlbGYuZmllbGRfbmFtZQ0KKyAgICAgIA0KKyAgICBkZWYgZ2V0X2ZpZWxkX2RlZihzZWxmLGluZGV4KToNCisgICAgICAgIGZpZWxkX2RlZiA9IE5vbmUNCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXgsaW50KToNCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5maWVsZF9pZHguaGFzX2tleShpbmRleCk6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkIGluZGV4ICVkIG5vdCBleGlzdHMiICUgaW5kZXgpDQorICAgICAgICAgICAgZmllbGRfZGVmID0gc2VsZi5maWVsZF9pZHhbaW5kZXhdDQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5kZXgsc3RyKToNCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5maWVsZF9uYW1lLmhhc19rZXkoaW5kZXgpOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWVsZCBpbmRleCAlcyBub3QgZXhpc3RzIiAlIGluZGV4KQ0KKyAgICAgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZmllbGRfbmFtZVtpbmRleF0NCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgaW5kZXggdHlwZSBub3Qgc3VwcG9ydCIpDQorICAgICAgICAgICAgDQorICAgICAgICByZXR1cm4gZmllbGRfZGVmDQorICAgICAgICANCisgICAgZGVmIHNldChzZWxmLGluZGV4LHZhbHVlKToNCisgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZ2V0X2ZpZWxkX2RlZihpbmRleCkNCisgICAgICAgIHQgPSBmaWVsZF9kZWZbRkxEX1RZUEVfSURYXQ0KKyAgICAgICAgbiA9IGZpZWxkX2RlZltGTERfTkFNRV9JRFhdDQorICAgICAgICBsID0gZmllbGRfZGVmW0ZMRF9MRU5HVEhfSURYXQ0KKyAgICAgICAgZiA9IGZpZWxkX2RlZltGTERfRkxBR19JRFhdDQorICAgICAgICBpZiB0ID09IElGVF9VU0hPUlQgb3IgdCA9PSBJRlRfVUxPTkcgb3IgdCA9PSBJRlRfTlVMTCBvciB0ID09IElGVF9CWVRFIG9yIHQgPT0gSUZUX0xPTkc6DQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSxpbnQpOg0KKyAgICAgICAgICAgICAgICBiID0gdmFsdWUNCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsc3RyKToNCisgICAgICAgICAgICAgICAgaWYgdmFsdWUuc3RhcnRzd2l0aCgnMHgnKToNCisgICAgICAgICAgICAgICAgICAgIGIgPSBpbnQodmFsdWUsMTYpDQorICAgICAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgICAgICBiID0gaW50KHZhbHVlKQ0KKyAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIHR5cGUgbm90IGludGVnZXIiICUgbikNCisgICAgICAgIGVsaWYgdCA9PSBJRlRfREFURVRJTUU6DQorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSAhPSAxMiBhbmQgbGVuKHZhbHVlKSAhPSAxNDoNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgbGVuZ3RoIG11c3QgYmUgMTIgb3IgMTQiICUgbikNCisgICAgICAgICAgICBpZiBsZW4odmFsdWUpID09IDE0Og0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzI6XQ0KKyAgICAgICAgICAgIGIgPSB2YWx1ZSArICIwMCINCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsc3RyKToNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgdmFsdWUgdHlwZSBub3Qgc3RyaW5nIiAlIG4pDQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmIHQgPT0gSUZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgICAgICBsICo9IDINCisgICAgICAgICAgICBlbGlmIHZhbHVlLnN0YXJ0c3dpdGgoJzB4Jyk6DQorICAgICAgICAgICAgICAgIGwgKj0gMg0KKyAgICAgICAgICAgICAgICBsICs9IDINCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgZiA8PiAyIGFuZCBsZW4odmFsdWUpIDw+IGw6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIGRhdGEgbGVuZ3RoIG5vdCBlcXVhbCAlZDw+JWQgIiAlIChuLGxlbih2YWx1ZSksbCkpDQorICAgICAgICAgICAgZWxpZiBsZW4odmFsdWUpID4gbDoNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgdmFsdWUgZGF0YSBsZW5ndGggZXhjZWVkICVkICIgJSAobixsKSkNCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgYiA9IHZhbHVlDQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgc2VsZi52YWx1ZVtuXSA9IGINCisgICAgICAgIA0KKyAgICBkZWYgZ2V0KHNlbGYsaW5kZXgpOg0KKyAgICAgICAgZmllbGRfZGVmID0gc2VsZi5nZXRfZmllbGRfZGVmKGluZGV4KQ0KKyAgICAgICAgdCA9IGZpZWxkX2RlZlszXQ0KKyAgICAgICAgbiA9IGZpZWxkX2RlZls1XQ0KKyAgICAgICAgDQorICAgICAgICBpZiBzZWxmLnZhbHVlLmhhc19rZXkobik6DQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWVbbl0NCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkZpZWxkICVzIG5vdCBzcGVjaWZpZWQiICUgbikNCisgICAgICAgIA0KKyAgICAgICAgDQorICAgIGRlZiBlbmNvZGVfYml0bWFwKHNlbGYsYml0bWFwKToNCisgICAgICAgIGJ1ZmZlciA9ICcnDQorICAgICAgICBvZmZzZXQgPSAwDQorICAgICAgICAjcHJpbnQgImJpdCBsZW5bJWRdIiAlIGxlbihiaXRtYXApDQorICAgICAgICB3aGlsZSBvZmZzZXQgPCBsZW4oYml0bWFwKToNCisgICAgICAgICAgICBiaXQgPSAwDQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6DQorICAgICAgICAgICAgICAgIHQgPSBvcmQoYml0bWFwW29mZnNldCtpXSkgLSAweDMwDQorICAgICAgICAgICAgICAgIGlmIHQgPT0gMDogY29udGludWUNCisgICAgICAgICAgICAgICAgYml0IHw9ICgxIDw8ICg3IC0gaSAlIDgpKQ0KKyAgICAgICAgICAgIGJ1ZmZlciArPSBjaHIoYml0JjB4RkYpDQorICAgICAgICAgICAgb2Zmc2V0ICs9IDgNCisgICAgICAgIHJldHVybiBidWZmZXINCisgICAgICAgICAgICANCisgICAgZGVmIHBhY2soc2VsZix3b3Jra2V5PU5vbmUpOg0KKyAgICAgICAgYnVmZmVyID0gJycNCisgICAgICAgIGJpdG1hcCA9IFsnMCcgZm9yIGkgaW4gcmFuZ2UoMjQpXQ0KKyAgICAgICAgZm9yIGZpZWxkIGluIEhERmllbGRzRGVmOg0KKyAgICAgICAgICAgIGluZGV4LHgsbGVuLHQsZmxhZyxuYW1lLGRlc2MgPSBmaWVsZA0KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnZhbHVlLmhhc19rZXkobmFtZSk6DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgdCA9PSBJRlRfVVNIT1JUIG9yIHQgPT0gSUZUX1VMT05HIG9yIHQgPT0gSUZUX05VTEwgb3IgdCA9PSBJRlRfQllURSBvciB0ID09IElGVF9MT05HOg0KKyAgICAgICAgICAgICAgICBidWZmZXIgKz0gc2VsZi5pbnRfMl9idWZmZXIoc2VsZi52YWx1ZVtuYW1lXSx0LGxlbikNCisgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICBidWZmZXIgKz0gc2VsZi5zdHJpbmdfMl9idWZmZXIoc2VsZi52YWx1ZVtuYW1lXSx0LGxlbixmbGFnKQ0KKyAgICAgICAgICAgIGJpdG1hcFtpbmRleC0xXSA9ICcxJw0KKyAgICAgICAgI3ByaW50IGJpdG1hcA0KKyAgICAgICAgDQorICAgICAgICBiaXRtYXBfYnVmZmVyID0gc2VsZi5lbmNvZGVfYml0bWFwKGJpdG1hcCkNCisgICAgICAgIGZ1bGxfZGF0YSA9IGNocihzZWxmLm1zZ3R5cGUmMHhGRikgKyBiaXRtYXBfYnVmZmVyICsgYnVmZmVyDQorICAgICAgICBoZWFkZXIgPSBzZWxmLmRhdGFfaGVhZGVyKGZ1bGxfZGF0YSkNCisgICAgICAgICNwcmludCAiaFslc11kWyVzXSIgJSAoY29kZWNzLmVuY29kZShoZWFkZXIsJ2hleCcpLGNvZGVjcy5lbmNvZGUoZnVsbF9kYXRhLCdoZXgnKSkNCisgICAgICAgIHJldHVybiBoZWFkZXIgKyBmdWxsX2RhdGENCisgICAgDQorICAgIGRlZiBkYXRhX2hlYWRlcihzZWxmLGJ1ZmZlcik6DQorICAgICAgICBpZiBsZW4oYnVmZmVyKSA+IDB4RkZGRjoNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJCdWZmZXIgbWF4IGxlbmd0aCBleGNlZWQgJWQiLCBsZW4oYnVmZmVyKSkNCisgICAgICAgIGhlYWRlciA9IHN0cnVjdC5wYWNrKCc8SCcsbGVuKGJ1ZmZlcikpDQorICAgICAgICByZXR1cm4gaGVhZGVyDQorICAgICAgICANCisgICAgZGVmIGludF8yX2J1ZmZlcihzZWxmLHZhbHVlLHR5cGUsbGVuZ3RoKToNCisgICAgICAgIGJ1ZmZlciA9ICcnDQorICAgICAgICBpZiB0eXBlID09IElGVF9CWVRFOg0KKyAgICAgICAgICAgIGJ1ZmZlciA9IGNocih2YWx1ZSUweDEwMCkNCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTlVMTDoNCisgICAgICAgICAgICByZXR1cm4gYnVmZmVyDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX1VTSE9SVDoNCisgICAgICAgICAgICB2ID0gdmFsdWUgJSAweDEwMDAwDQorICAgICAgICAgICAgYnVmZmVyID0gc3RydWN0LnBhY2soJzxIJyx2KQ0KKyAgICAgICAgZWxpZiB0eXBlID09IElGVF9VTE9ORzoNCisgICAgICAgICAgICBidWZmZXIgPSBzdHJ1Y3QucGFjaygnPEknLHZhbHVlKQ0KKyAgICAgICAgZWxpZiB0eXBlID09IElGVF9MT05HOg0KKyAgICAgICAgICAgIGJ1ZmZlciA9IHN0cnVjdC5wYWNrKCc8aScsdmFsdWUpDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0lucHV0IEVycm9yJykNCisgICAgICAgICAgICANCisgICAgICAgIHJldHVybiBidWZmZXINCisgICAgDQorICAgIGRlZiBlbmNvZGVfYmNkKHNlbGYsdmFsdWUpOg0KKyAgICAgICAgaWYgbGVuKHZhbHVlKSAlIDIgIT0gMDoNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ2YWx1ZSBsZW5ndGggbXVzdCBkaXYgMiIpDQorICAgICAgICBpID0gMA0KKyAgICAgICAgI3ByaW50ICJ2YWx1ZSBbJXNdIiAlIHZhbHVlDQorICAgICAgICBidWZmZXIgPSAnJw0KKyAgICAgICAgd2hpbGUgaSA8IGxlbih2YWx1ZSk6DQorICAgICAgICAgICAgdDEgPSAob3JkKHZhbHVlW2ldKSAtIDB4MzApJiAweEZGDQorICAgICAgICAgICAgdDIgPSAob3JkKHZhbHVlW2krMV0pIC0gMHgzMCkgJiAweEZGDQorICAgICAgICAgICAgI3ByaW50ICJ0MVslZF10MlslZF0iICUgKHQxLHQyKQ0KKyAgICAgICAgICAgIHQgPSAoKHQxPDw0KSB8IHQyKSAmIDB4RkYNCisgICAgICAgICAgICAjcHJpbnQgInQxWyVkXXQyWyVkXXRbJWRdIiAlICh0MSx0Mix0KQ0KKyAgICAgICAgICAgIGJ1ZmZlciArPSBjaHIodCkNCisgICAgICAgICAgICBpICs9IDINCisgICAgICAgICNwcmludCAiYmNkIHZhbHVlWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGJ1ZmZlciwnaGV4JykNCisgICAgICAgIHJldHVybiBidWZmZXINCisgICAgICAgIA0KKyAgICBkZWYgZGVjb2RlX2JjZChzZWxmLHZhbHVlKToNCisgICAgICAgIGJ1ZmZlciA9ICcnDQorICAgICAgICAjcHJpbnQgImJjZCBbJXNdIiAlIGNvZGVjcy5lbmNvZGUodmFsdWUsJ2hleCcpDQorICAgICAgICBmb3IgYyBpbiB2YWx1ZToNCisgICAgICAgICAgICB0ID0gb3JkKGMpICYgMHhGRg0KKyAgICAgICAgICAgIHQxID0gKHQgPj4gNCkgJiAweDBGDQorICAgICAgICAgICAgdDIgPSB0ICYgMHgwRg0KKyAgICAgICAgICAgICNwcmludCAidFslMDJ4XXQxWyVkXXQyWyVkXSIgJSAodCx0MSx0MikNCisgICAgICAgICAgICBidWZmZXIgKz0gY2hyKHQxICsgMHgzMCkgKyBjaHIodDIgKyAweDMwKQ0KKyAgICAgICAgI3ByaW50ICJiY2QgdmFsdWVbJXNdIiAlIGJ1ZmZlcg0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlcg0KKyAgICAgICAgDQorICAgIGRlZiBzdHJpbmdfMl9idWZmZXIoc2VsZix2YWx1ZSx0eXBlLGxlbmd0aCxmbGFnKToNCisgICAgICAgIGJ1ZmZlciA9ICcnDQorICAgICAgICBpZiB0eXBlID09IElGVF9TVFJJTkcgb3IgdHlwZSA9PSBJRlRfQlVGRkVSOg0KKyAgICAgICAgICAgIGlmIHZhbHVlLnN0YXJ0c3dpdGgoJzB4Jyk6DQorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNvZGVjcy5kZWNvZGUodmFsdWVbMjpdLCdoZXgnKQ0KKyAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHZhbHVlDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgIGJ1ZmZlciA9ICcnDQorICAgICAgICAgICAgaSA9IDANCisgICAgICAgICAgICB3aGlsZSBpIDwgbGVuKHZhbHVlKToNCisgICAgICAgICAgICAgICAgdCA9IGludCh2YWx1ZVtpOmkrMl0pDQorICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjaHIodCAmIDB4RkYpDQorICAgICAgICAgICAgICAgIGkgKz0gMg0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnB1dCBFcnJvcicpDQorICAgICAgICAgICAgDQorICAgICAgICBpZiBmbGFnID09IDI6DQorICAgICAgICAgICAgaGVhZGVyID0gc3RydWN0LnBhY2soJzxIJyxsZW4oYnVmZmVyKSAlIDB4MTAwMDApDQorICAgICAgICAgICAgcmV0dXJuIGhlYWRlciArIGJ1ZmZlcg0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICAjaWYgdHlwZSA9PSBJRlRfQlVGRkVSOg0KKyAgICAgICAgICAgICMgICAgaWYgbGVuKGJ1ZmZlcikgJSAyIDw+IDAgb3IgbGVuKGJ1ZmZlcikvMiA8PiBsZW5ndGg6DQorICAgICAgICAgICAgIyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVmFsdWUgbGVuZ3RoIG5vdCBtYXRjaGVkIFslc10iICUgdmFsdWUpDQorICAgICAgICAgICAgIyAgICBidWZmZXIgPSBjb2RlY3MuZGVjb2RlKGJ1ZmZlciwnaGV4JykNCisgICAgICAgICAgICBpZiBsZW4oYnVmZmVyKSAhPSBsZW5ndGg6DQorICAgICAgICAgICAgICAgIHBhZGxlbiA9IGxlbmd0aCAtIGxlbihidWZmZXIpDQorICAgICAgICAgICAgICAgIGlmIHBhZGxlbiA8IDA6DQorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJWYWx1ZSBsZW5ndGggbm90IG1hdGNoZWQgWyVzXSIgJSB2YWx1ZSkNCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIHBhZCA9IGNocigwKSAqIHBhZGxlbg0KKyAgICAgICAgICAgICAgICBidWZmZXIgPSBwYWQgKyBidWZmZXINCisgICAgICAgICAgICByZXR1cm4gYnVmZmVyDQorICAgICAgICAgICAgDQorICAgIA0KKyAgICBkZWYgZGVjb2RlX2JpdG1hcChzZWxmLGJpdG1hcCk6DQorICAgICAgICBpZiBsZW4oYml0bWFwKSAhPSAzOg0KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJpdG1hcCBsZW5ndGggZXJyb3IiKQ0KKyAgICAgICAgI3ByaW50ICJiaXRtYXBbJXNdIiAlIGNvZGVjcy5lbmNvZGUoYml0bWFwLCdoZXgnKQ0KKyAgICAgICAgYnVmZmVyPVtdDQorICAgICAgICBmb3IgdCBpbiBiaXRtYXA6DQorICAgICAgICAgICAgdiA9IG9yZCh0KSAmIDB4RkYNCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg4KToNCisgICAgICAgICAgICAgICAgeCA9ICh2ICYgKDEgPDwgKDctaSkpKQ0KKyAgICAgICAgICAgICAgICBpZiB4ID4gMDoNCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJzEnKQ0KKyAgICAgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnMCcpDQorICAgICAgICByZXR1cm4gYnVmZmVyDQorICAgICAgICAgICAgDQorICAgIGRlZiB1bnBhY2soc2VsZixkYXRhKToNCisgICAgICAgIHNlbGYudmFsdWUgPSB7fQ0KKyAgICAgICAgI3ByaW50ICJkYXRhWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGRhdGEsJ2hleCcpDQorICAgICAgICBkYXRhX2xlbiA9IHN0cnVjdC51bnBhY2soJzxIJyxkYXRhWzoyXSlbMF0NCisgICAgICAgIGlmIGxlbihkYXRhKSAhPSBkYXRhX2xlbiArIDI6DQorICAgICAgICAgICAgcHJpbnQgImlucHV0WyVkXSBleHR1YWxseVslZF0iICUgKGRhdGFfbGVuLGxlbihkYXRhKSkNCisgICAgICAgICAgICByZXR1cm4gRmFsc2UNCisgICAgICAgIA0KKyAgICAgICAgb2Zmc2V0ID0gMg0KKyAgICAgICAgc2VsZi5tc2d0eXBlID0gb3JkKGRhdGFbb2Zmc2V0XSkgJiAweEZGDQorICAgICAgICBvZmZzZXQgKz0gMQ0KKyAgICAgICAgYml0bWFwID0gc2VsZi5kZWNvZGVfYml0bWFwKGRhdGFbb2Zmc2V0Om9mZnNldCszXSkNCisgICAgICAgIG9mZnNldCArPSAzDQorICAgICAgICAjcHJpbnQgYml0bWFwDQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYml0bWFwKSk6DQorICAgICAgICAgICAgaWYgYml0bWFwW2ldID09ICcwJzogY29udGludWUNCisgICAgICAgICAgICBmaW5kZXggPSBpICsgMQ0KKyAgICAgICAgICAgIGZpZWxkID0gc2VsZi5nZXRfZmllbGRfZGVmKGZpbmRleCkNCisgICAgICAgICAgICBmdHlwZSA9IGZpZWxkW0ZMRF9UWVBFX0lEWF0NCisgICAgICAgICAgICBmbGVuID0gZmllbGRbRkxEX0xFTkdUSF9JRFhdDQorICAgICAgICAgICAgZmZsYWcgPSBmaWVsZFtGTERfRkxBR19JRFhdDQorICAgICAgICAgICAgZm5hbWUgPSBmaWVsZFtGTERfTkFNRV9JRFhdDQorICAgICAgICAgICAgI3ByaW50ICJwYXJzZSBmaWVsZFslc10gWyVkXW9mZlslZF1bJXNdIiAlIChmbmFtZSxmZmxhZyxvZmZzZXQsY29kZWNzLmVuY29kZShkYXRhW29mZnNldDpvZmZzZXQrMl0sJ2hleCcpKQ0KKyAgICAgICAgICAgIGlmIGZmbGFnID09IDI6ICMgseSzpMr9vt0NCisgICAgICAgICAgICAgICAgI3ByaW50ICJsZW4gWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGRhdGFbb2Zmc2V0Om9mZnNldCsyXSwnaGV4JykNCisgICAgICAgICAgICAgICAgZW5kcG9zID0gc2VsZi5idWZmZXJfMl9pbnQoZGF0YVtvZmZzZXQ6b2Zmc2V0KzJdLElGVF9VU0hPUlQpDQorICAgICAgICAgICAgICAgIG9mZnNldCArPSAyDQorICAgICAgICAgICAgICAgIGVuZHBvcyArPSBvZmZzZXQgDQorICAgICAgICAgICAgZWxzZToNCisgICAgICAgICAgICAgICAgZW5kcG9zID0gb2Zmc2V0ICsgZmxlbg0KKyAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBpZiBmdHlwZSA9PSBJRlRfVVNIT1JUIG9yIGZ0eXBlID09IElGVF9VTE9ORyBvciBmdHlwZSA9PSBJRlRfTlVMTCBvciBmdHlwZSA9PSBJRlRfQllURSBvciBmdHlwZSA9PSBJRlRfTE9ORzoNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmJ1ZmZlcl8yX2ludChkYXRhW29mZnNldDplbmRwb3NdLGZ0eXBlKQ0KKyAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgICN0ZW1wID0gc2VsZi5idWZmZXJfMl9zdHJpbmcoZGF0YVtvZmZzZXQ6ZW5kcG9zXSxmdHlwZSkNCisgICAgICAgICAgICAgICAgI2lmIGZmbGFnICE9IDIgYW5kIGZ0eXBlID09IElGVF9TVFJJTkc6DQorICAgICAgICAgICAgICAgICMgICAgZm9yIGkgaW4gdGVtcDoNCisgICAgICAgICAgICAgICAgIyAgICAgICAgcHJpbnQgImNoYXIgWyUwMnhdIiAlIG9yZChpKQ0KKyAgICAgICAgICAgICAgICAjICAgICAgICBpZiBvcmQoaSkgPiAwOg0KKyAgICAgICAgICAgICAgICAjICAgICAgICAgICAgdmFsdWUgKz0gaQ0KKyAgICAgICAgICAgICAgICAjZWxzZToNCisgICAgICAgICAgICAgICAgIyAgICB2YWx1ZSA9IHRlbXANCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmJ1ZmZlcl8yX3N0cmluZyhkYXRhW29mZnNldDplbmRwb3NdLGZ0eXBlKQ0KKyAgICAgICAgICAgICAgICBpZiBmZmxhZyA8PiAyIGFuZCBmdHlwZSA9PSBJRlRfQlVGRkVSOg0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAnMHgnICsgY29kZWNzLmVuY29kZSh2YWx1ZSwnaGV4JykNCisgICAgICAgICAgICANCisgICAgICAgICAgICBzZWxmLnNldChmaW5kZXgsdmFsdWUpDQorICAgICAgICAgICAgI3ByaW50ICJwYXJzZSBmaWVsZFslc10gT0sgPT09PT0iICUgZm5hbWUNCisgICAgICAgICAgICBvZmZzZXQgPSBlbmRwb3MNCisgICAgICAgICNwcmludCBzZWxmLnZhbHVlDQorICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICANCisgICAgZGVmIGJ1ZmZlcl8yX2ludChzZWxmLGRhdGEsdHlwZSk6DQorICAgICAgICBpZiB0eXBlID09IElGVF9CWVRFOg0KKyAgICAgICAgICAgIHJldHVybiBvcmQoZGF0YSkNCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfVVNIT1JUOg0KKyAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc8SCcsZGF0YSlbMF0NCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfVUxPTkc6DQorICAgICAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJzxJJyxkYXRhKVswXQ0KKyAgICAgICAgZWxpZiB0eXBlID09IElGVF9MT05HOg0KKyAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc8aScsZGF0YSlbMF0NCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTlVMTDoNCisgICAgICAgICAgICByZXR1cm4gTm9uZQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnB1dCBkYXRhIHR5cGUgZXJyb3IiKQ0KKyAgICAgICAgICAgIA0KKyAgICBkZWYgYnVmZmVyXzJfc3RyaW5nKHNlbGYsZGF0YSx0eXBlKToNCisgICAgICAgIGlmIHR5cGUgPT0gSUZUX1NUUklORzoNCisgICAgICAgICAgICByZXR1cm4gZGF0YQ0KKyAgICAgICAgZWxpZiB0eXBlID09IElGVF9CVUZGRVI6DQorICAgICAgICAgICAgcmV0dXJuIGRhdGENCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfREFURVRJTUU6DQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb2RlX2JjZChkYXRhKQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnB1dCBkYXRhIHR5cGUgZXJyb3IiKQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIA0KKyAgICBkZWYgZ2V0XzJieXRlX2ludChzZWxmLGRhdGEpOg0KKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soIj5IIixkYXRhKVswXQ0KKyAgICAgICAgDQorICAgIGRlZiBnZXRfM2J5dGVfaW50KHNlbGYsZGF0YSk6DQorICAgICAgICB0ZW1wID0gZGF0YSArIGNocigwKQ0KKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soIjxJIix0ZW1wKVswXQ0KKyAgICAgICAgDQorICAgIGRlZiBnZXRfNGJ5dGVfaW50KHNlbGYsZGF0YSk6DQorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygiPEkiLGRhdGEpWzBdDQorICAgICAgICANCisgICAgZGVmIHNldF8yYnl0ZV9pbnQoc2VsZixkYXRhKToNCisgICAgICAgIHJldHVybiBzdHJ1Y3QucGFjaygnPEgnLGRhdGEpDQorICAgIA0KKyAgICBkZWYgc2V0XzNieXRlX2ludChzZWxmLGRhdGEpOg0KKyAgICAgICAgdGVtcCA9IHN0cnVjdC5wYWNrKCc8SCcsZGF0YSkNCisgICAgICAgIHJldHVybiB0ZW1wWzotMV0NCisgICAgICAgICAgICANCisgICAgZGVmIHNldF80Ynl0ZV9pbnQoc2VsZixkYXRhKToNCisgICAgICAgIHJldHVybiBzdHJ1Y3QucGFjaygnPEknLGRhdGEpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Bib2NmdW5jLnB5IGIvc3JjL3Bib2NmdW5jLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMWJmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGJvY2Z1bmMucHkKQEAgLTAsMCArMSwxMzEgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24NCisjIHZpbTogdGFic3RvcD00DQorDQoraW1wb3J0IHB5RGVzLCBjb2RlY3MNCisNCisNCisNCitkZWYgZGVzZW5jcnlwdChrZXksIGRhdGEsIG09cHlEZXMuRUNCKToNCisgICAgayA9IHB5RGVzLmRlcyhrZXksIHBhZD1Ob25lLCBwYWRtb2RlPXB5RGVzLlBBRF9OT1JNQUwsIG1vZGU9bSkNCisgICAgcmV0dXJuIGsuZW5jcnlwdChkYXRhKSANCisgICAgDQorZGVmIGRlc2RlY3J5cHQoa2V5LCBkYXRhLCBtPXB5RGVzLkVDQik6DQorICAgIGsgPSBweURlcy5kZXMoa2V5LCBwYWQ9Tm9uZSwgcGFkbW9kZT1weURlcy5QQURfTk9STUFMLCBtb2RlPW0pDQorICAgIHJldHVybiBrLmRlY3J5cHQoZGF0YSkgDQorDQorZGVmIHRyaXBsZWRlc2VuY3J5cHQoa2V5LCBkYXRhLCBtPXB5RGVzLkVDQik6DQorICAgIGsgPSBweURlcy50cmlwbGVfZGVzKGtleSwgcGFkPU5vbmUsIHBhZG1vZGU9cHlEZXMuUEFEX05PUk1BTCwgbW9kZT1tKQ0KKyAgICByZXR1cm4gay5lbmNyeXB0KGRhdGEpDQorICAgIA0KK2RlZiB0cmlwbGVkZXNkZWNyeXB0KGtleSwgZGF0YSwgbT1weURlcy5FQ0IpOg0KKyAgICBrID0gcHlEZXMudHJpcGxlX2RlcyhrZXksIHBhZD1Ob25lLCBwYWRtb2RlPXB5RGVzLlBBRF9OT1JNQUwsIG1vZGU9bSkNCisgICAgcmV0dXJuIGsuZGVjcnlwdChkYXRhKQ0KKw0KKw0KK2RlZiBkZXNlbmNyeXB0aGV4KGtleSwgZGF0YSk6DQorICAgIGsgPSBweURlcy5kZXMoY29kZWNzLmRlY29kZShrZXksICdoZXgnKSwgcGFkPU5vbmUsIHBhZG1vZGU9cHlEZXMuUEFEX05PUk1BTCkNCisgICAgZSA9IGsuZW5jcnlwdChjb2RlY3MuZGVjb2RlKGRhdGEsICdoZXgnKSkgDQorICAgIHJldHVybiBjb2RlY3MuZW5jb2RlKGUsICdoZXgnKQ0KKw0KK2RlZiB0cmlwbGVkZXNlbmNyeXB0aGV4KGtleSwgZGF0YSk6DQorICAgIGsgPSBweURlcy50cmlwbGVfZGVzKGNvZGVjcy5kZWNvZGUoa2V5LCAnaGV4JyksIHBhZD1Ob25lLCBwYWRtb2RlPXB5RGVzLlBBRF9OT1JNQUwpDQorICAgIGUxID0gay5lbmNyeXB0KGNvZGVjcy5kZWNvZGUoZGF0YSwgJ2hleCcpKQ0KKyAgICByZXR1cm4gY29kZWNzLmVuY29kZShlMSwgJ2hleCcpDQorDQorZGVmIERhdGFOb3QoZGF0YSk6DQorICAgIHIgPSAnJw0KKyAgICBmb3IgYSBpbiBkYXRhOg0KKyAgICAgICAgciA9IHIgKyBjaHIoKH5vcmQoYSkpICYgMHhGRikNCisgICAgcmV0dXJuIHINCisgICAgICAgIA0KK2RlZiBQYWRDYXJkUGh5Tm8ocGh5bm8pOg0KKyAgICByID0gJycNCisgICAgaWYgbGVuKHBoeW5vKSA8IDg6DQorICAgICAgICBwYWQgPSAiXHg4MFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiDQorICAgICAgICBsID0gOCAtIGxlbihwaHlubykNCisgICAgICAgIHIgPSBwaHlubyArIHBhZFs6bF0NCisgICAgZWxpZiBsZW4ocGh5bm8pID09IDg6DQorICAgICAgICByID0gcGh5bm8NCisgICAgZWxzZToNCisgICAgICAgIHIgPSBwaHlub1s6OF0NCisgICAgcmV0dXJuIHINCisgICAgDQorZGVmIFBhZENhcmRQaHlOb0hleChwaHlubyk6DQorICAgIHJldHVybiBjb2RlY3MuZW5jb2RlKFBhZENhcmRQaHlObyhjb2RlY3MuZGVjb2RlKHBoeW5vLCAnaGV4JykpLCAnaGV4JykNCisgICAgDQorZGVmIFBib2NEZWxpdmVyeUtleShmYWN0b3IsIGtleSk6DQorICAgIGNpcGhlcmRhdGFub3QgPSAnJw0KKyAgICBjaXBoZXJkYXRhID0gUGFkQ2FyZFBoeU5vKGZhY3RvcikNCisgICAgDQorICAgIHByaW50ICJmYWN0b3IgaXMgWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGNpcGhlcmRhdGEsICdoZXgnKQ0KKw0KKyAgICBpZiBsZW4oa2V5KSA9PSA4OiAjIHNpbmdsZWRlcyBkZWxpdmVyeQ0KKyAgICAgICAgazEgPSBkZXNlbmNyeXB0KGtleSwgY2lwaGVyZGF0YSkNCisgICAgICAgIHJldHVybiBrMQ0KKyAgICBlbGlmIGxlbihrZXkpID09IDE2Og0KKyAgICAgICAgY2lwaGVyZGF0YW5vdCA9IERhdGFOb3QoY2lwaGVyZGF0YSkNCisgICAgICAgIA0KKyAgICAgICAgazEgPSB0cmlwbGVkZXNlbmNyeXB0KGtleSwgY2lwaGVyZGF0YSkNCisgICAgICAgIGsyID0gdHJpcGxlZGVzZW5jcnlwdChrZXksIGNpcGhlcmRhdGFub3QpDQorICAgICAgICANCisgICAgICAgIHJldHVybiBrMSArIGsyDQorICAgIGVsc2U6DQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdrZXkgbGVuZ3RoIGVycm9yJykNCisgICAgDQorZGVmIFBib2NEZWxpdmVyeUtleUhleChmYWN0b3IsIGtleSk6DQorICAgIGYgPSBjb2RlY3MuZGVjb2RlKGZhY3RvciwgJ2hleCcpDQorICAgIGsgPSBjb2RlY3MuZGVjb2RlKGtleSwgJ2hleCcpDQorICAgIGsxID0gUGJvY0RlbGl2ZXJ5S2V5KGYsIGspDQorICAgIHJldHVybiBjb2RlY3MuZW5jb2RlKGsxLCAnaGV4JykNCisgICANCisNCitkZWYgQ2FsY01hYzNERVMoZGF0YSwgaW5pdGRhdGEsIGtleSk6DQorICAgIGRhdGFsZW4gPSBsZW4oZGF0YSkNCisgICAgayA9IHB5RGVzLmRlcyhrZXlbOjhdLCBwYWQ9Tm9uZSwgcGFkbW9kZT1weURlcy5QQURfTk9STUFMKQ0KKw0KKyAgICBmb3IgaSBpbiByYW5nZShkYXRhbGVuIC8gOCk6DQorICAgICAgICBtID0gIiINCisgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihpbml0ZGF0YSkpOg0KKyAgICAgICAgICAgIG0gPSBtICsgY2hyKG9yZChpbml0ZGF0YVtqXSkgXiBvcmQoZGF0YVtpICogOCArIGpdKSkNCisNCisgICAgICAgIGluaXRkYXRhID0gbQ0KKyAgICAgICAgeCA9IGsuZW5jcnlwdChpbml0ZGF0YSkNCisgICAgICAgIGluaXRkYXRhID0geA0KKw0KKw0KKyAgICBrMSA9IHB5RGVzLmRlcyhrZXlbODpdLCBwYWQ9Tm9uZSwgcGFkbW9kZT1weURlcy5QQURfTk9STUFMKQ0KKyAgICBuID0gazEuZGVjcnlwdChpbml0ZGF0YSkNCisgICAgaW5pdGRhdGEgPSBrLmVuY3J5cHQobikNCisgICAgcmV0dXJuIGluaXRkYXRhDQorICAgIA0KK2RlZiBDYWxjTWFjM0RFU0hleChkYXRhLCBpbml0ZGF0YSwga2V5KToNCisgICAgZCA9IGNvZGVjcy5kZWNvZGUoZGF0YSwgJ2hleCcpDQorICAgIGlkID0gY29kZWNzLmRlY29kZShpbml0ZGF0YSwgJ2hleCcpDQorICAgIGsgPSBjb2RlY3MuZGVjb2RlKGtleSwgJ2hleCcpDQorICAgIGsxID0gQ2FsY01hYzNERVMoZCwgaWQsIGspDQorICAgIHJldHVybiBjb2RlY3MuZW5jb2RlKGsxLCAnaGV4JykNCisgICAgDQorZGVmIENhbGNNYWNERVMoZGF0YSwgaW5pdGRhdGEsIGtleSk6DQorICAgIGRhdGFsZW4gPSBsZW4oZGF0YSkNCisgICAgayA9IHB5RGVzLmRlcyhrZXksIHBhZD1Ob25lLCBwYWRtb2RlPXB5RGVzLlBBRF9OT1JNQUwpDQorICAgIA0KKyAgICBmb3IgaSBpbiByYW5nZShkYXRhbGVuIC8gOCk6DQorICAgICAgICBtID0gIiINCisgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihpbml0ZGF0YSkpOg0KKyAgICAgICAgICAgIG0gPSBtICsgY2hyKG9yZChpbml0ZGF0YVtqXSkgXiBvcmQoZGF0YVtpICogOCArIGpdKSkNCisNCisgICAgICAgIGluaXRkYXRhID0gbQ0KKyAgICAgICAgeCA9IGsuZW5jcnlwdChpbml0ZGF0YSkNCisgICAgICAgIGluaXRkYXRhID0geA0KKyAgICAgICAgDQorICAgIHJldHVybiBpbml0ZGF0YQ0KKyAgICAgICAgDQorZGVmIENhbGNNYWNERVNIZXgoZGF0YSwgaW5pdGRhdGEsIGtleSk6DQorICAgIGQgPSBjb2RlY3MuZGVjb2RlKGRhdGEsICdoZXgnKQ0KKyAgICBpZCA9IGNvZGVjcy5kZWNvZGUoaW5pdGRhdGEsICdoZXgnKQ0KKyAgICBrID0gY29kZWNzLmRlY29kZShrZXksICdoZXgnKQ0KKyAgICBrMSA9IENhbGNNYWNERVMoZCwgaWQsIGspDQorICAgIHJldHVybiBjb2RlY3MuZW5jb2RlKGsxLCAnaGV4JykNCisgICAgDQorDQorICAgICAgICANCmRpZmYgLS1naXQgYS9zcmMvcGVyZm9ybWFuY2UucHkgYi9zcmMvcGVyZm9ybWFuY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzY2Y5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wZXJmb3JtYW5jZS5weQpAQCAtMCwwICsxLDc1IEBACisjIS91c3IvYmluL2Vudg0KKw0KK2ltcG9ydCBkYXRldGltZSwgdGhyZWFkaW5nLCB0aHJlYWQNCisNCitjbGFzcyBDaGVja1BlcmY6DQorICAgIHdyaXRlbG9jayA9IHRocmVhZGluZy5Mb2NrKCkNCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KKyAgICAgICAgc2VsZi5iZWdpbnRpbWUgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQ0KKyAgICAgICAgc2VsZi5lbmR0aW1lID0gTm9uZQ0KKyAgICAgICAgc2VsZi5taW50aW1lID0gMC4wDQorICAgICAgICBzZWxmLm1heHRpbWUgPSAwLjANCisgICAgICAgIHNlbGYuc3VjY2Vzc2NvdW50ID0gMA0KKyAgICAgICAgc2VsZi5mYWlsZWRjb3VudCA9IDANCisgICAgICAgIHNlbGYudG90YWx0aW1lID0gMC4wDQorICAgICAgICBzZWxmLnJlcG9ydG1zZyA9ICcnDQorICAgICAgICBzZWxmLnByZWNoa3RpbWUgPSBOb25lDQorICAgICAgICANCisgICAgZGVmIHN0YXJ0Y2hrKHNlbGYpOg0KKyAgICAgICAgc2VsZi5iZWdpbnRpbWUgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQ0KKyAgICAgICAgc2VsZi5lbmR0aW1lID0gTm9uZQ0KKyAgICAgICAgc2VsZi5taW50aW1lID0gOTk5OTk5OTkuMA0KKyAgICAgICAgc2VsZi5tYXh0aW1lID0gMC4wDQorICAgICAgICBzZWxmLmNoZWNrY291bnQgPSAwDQorICAgICAgICBzZWxmLnRvdGFsdGltZSA9IDAuMA0KKyAgICAgICAgc2VsZi5yZXBvcnRtc2cgPSAnJw0KKyAgICAgICAgc2VsZi5wcmVjaGt0aW1lID0gc2VsZi5iZWdpbnRpbWUNCisgICAgDQorICAgIGRlZiBzZXRjaGtwb2ludChzZWxmLCBzdWNjZXNzPVRydWUpOg0KKyAgICAgICAgc2VsZi5lbmR0aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkNCisgICAgICAgIGRlbHRhID0gc2VsZi5lbmR0aW1lIC0gc2VsZi5wcmVjaGt0aW1lDQorICAgICAgICB0ID0gZGVsdGEuc2Vjb25kcyArIGRlbHRhLm1pY3Jvc2Vjb25kcyAvIDEwMDAwMDAuMA0KKyAgICAgICAgaWYgdCA8IHNlbGYubWludGltZTogc2VsZi5taW50aW1lID0gdA0KKyAgICAgICAgaWYgdCA+IHNlbGYubWF4dGltZTogc2VsZi5tYXh0aW1lID0gdA0KKyAgICAgICAgaWYgc3VjY2VzczoNCisgICAgICAgICAgICBzZWxmLnN1Y2Nlc3Njb3VudCArPSAxDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgIHNlbGYuZmFpbGVkY291bnQgKz0gMQ0KKyAgICAgICAgc2VsZi50b3RhbHRpbWUgKz0gdA0KKyAgICAgICAgc2VsZi5wcmVjaGt0aW1lID0gc2VsZi5lbmR0aW1lDQorICAgICAgICANCisgICAgZGVmIF9vdXRwdXRfZmlsZShzZWxmLCBvdXRfZmlsZSk6DQorICAgICAgICBoYW5kbGVyID0gb3BlbihvdXRfZmlsZSwgJ2ErYicpDQorICAgICAgICBoYW5kbGVyLndyaXRlKCJ0aHJkWyVkXSIgJSB0aHJlYWQuZ2V0X2lkZW50KCkpDQorICAgICAgICBoYW5kbGVyLndyaXRlKCcgLSAnICsgc2VsZi5yZXBvcnRtc2cgKyAnXG4nKQ0KKyAgICAgICAgaGFuZGxlci5jbG9zZSgpDQorICAgICAgICANCisgICAgZGVmIF9yZXBvcnRUb0ZpbGUoc2VsZiwgb3V0X2ZpbGUpOg0KKyAgICAgICAgQ2hlY2tQZXJmLndyaXRlbG9jay5hY3F1aXJlKCkNCisgICAgICAgIHRyeToNCisgICAgICAgICAgICBzZWxmLl9vdXRwdXRfZmlsZShvdXRfZmlsZSkNCisgICAgICAgICAgICBwcmludCAiZ2VuZXJhdGUgcmVwb3J0IGZpbGUgIiAsIG91dF9maWxlDQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBleDoNCisgICAgICAgICAgICBwcmludCAiZ2VuZXJhdG9yIHJlcG9ydCBmaWxlICIsIG91dF9maWxlICwgIiBFcnJvciAiLCBleA0KKyAgICAgICAgQ2hlY2tQZXJmLndyaXRlbG9jay5yZWxlYXNlKCkNCisgICAgICAgIA0KKyAgICBkZWYgcmVwb3J0X21zZyhzZWxmKToNCisgICAgICAgIHRvdGFsY2hlY2tjb3VudCA9IHNlbGYuc3VjY2Vzc2NvdW50ICsgc2VsZi5mYWlsZWRjb3VudA0KKyAgICAgICAgaWYgdG90YWxjaGVja2NvdW50ID4gMjoNCisgICAgICAgICAgICBhdmcgPSAoc2VsZi50b3RhbHRpbWUgLSBzZWxmLm1pbnRpbWUgLSBzZWxmLm1heHRpbWUpIC8gKHRvdGFsY2hlY2tjb3VudCAtIDIpDQorICAgICAgICBlbGlmIHRvdGFsY2hlY2tjb3VudCA9PSAwOg0KKyAgICAgICAgICAgIHJwdCA9ICJObyBjaGVjayBwb2ludCBoYXMgYmVlbiBzZXQiDQorICAgICAgICAgICAgcmV0dXJuIHJwdA0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICBhdmcgPSBzZWxmLnRvdGFsdGltZSAvIHRvdGFsY2hlY2tjb3VudA0KKyAgICAgICAgcnB0ID0gJ2V4ZWN1dGVbJWRdY291bnQgY29zdChzKSBbJS40Zl1tYXhbJS40Zl1taW5bJS40Zl1hdmdbJS40Zl0gc3VjY2Vzc1slZF0gZmFpbGVkWyVkXScgXA0KKyAgICAgICAgICAgICUgKHRvdGFsY2hlY2tjb3VudCwgc2VsZi50b3RhbHRpbWUsIHNlbGYubWF4dGltZSwgc2VsZi5taW50aW1lLCBhdmcsIFwNCisgICAgICAgICAgICBzZWxmLnN1Y2Nlc3Njb3VudCwgc2VsZi5mYWlsZWRjb3VudCkNCisgICAgICAgIHJldHVybiBycHQNCisgICAgICAgIA0KKyAgICBkZWYgcmVwb3J0KHNlbGYsIG91dF9maWxlPU5vbmUpOg0KKyAgICAgICAgc2VsZi5yZXBvcnRtc2cgPSBzZWxmLnJlcG9ydF9tc2coKQ0KKyAgICAgICAgaWYgb3V0X2ZpbGU6DQorICAgICAgICAgICAgc2VsZi5fcmVwb3J0VG9GaWxlKG91dF9maWxlKQ0KKyAgICAgICAgcmV0dXJuIHNlbGYucmVwb3J0bXNnDQorICAgICAgICANCmRpZmYgLS1naXQgYS9zcmMvcHliY2NjbHQucHkgYi9zcmMvcHliY2NjbHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxMDYzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9weWJjY2NsdC5weQpAQCAtMCwwICsxLDM1MyBAQAorIyEvdXNyL2Jpbi9weXRob24NCisjIC0qLSBjb2Rpbmc6IGdiayAtKi0NCisNCitmcm9tIGN0eXBlcyBpbXBvcnQgKg0KKw0KK2JjY2NsdF9kbGwgPSBOb25lDQoreHBhY2tfcGF0aCA9ICdjcGFjay5kYXQnDQorDQorY3BhY2tfZmllbGRzID0gWw0KKyJzY3VzdF9ubyIsDQorInNjdXN0X25vMiIsDQorInNob2xkZXJfYWNfbm8iLA0KKyJzaG9sZGVyX2FjX25vMiIsDQorInNob2xkZXJfdHlwZSIsDQorInNob2xkZXJfdHlwZTIiLA0KKyJzbmFtZSIsDQorInNuYW1lMiIsDQorInNhbGxfbmFtZSIsDQorInNtYXJrZXRfY29kZSIsDQorInNtYXJrZXRfY29kZTIiLA0KKyJzZGF0ZTAiLA0KKyJzZGF0ZTEiLA0KKyJzZGF0ZTIiLA0KKyJzZGF0ZTMiLA0KKyJzdGltZTAiLA0KKyJzdGltZTEiLA0KKyJzdGltZTIiLA0KKyJzdGltZTMiLA0KKyJsdm9sMCIsDQorImx2b2wxIiwNCisibHZvbDIiLA0KKyJsdm9sMyIsDQorImx2b2w0IiwNCisibHZvbDUiLA0KKyJsdm9sNiIsDQorImx2b2w3IiwNCisibHZvbDgiLA0KKyJsdm9sOSIsDQorImx2b2wxMCIsDQorImx2b2wxMSIsDQorImx2b2wxMiIsDQorImRhbXQwIiwNCisiZGFtdDEiLA0KKyJkYW10MiIsDQorImRhbXQzIiwNCisiZGFtdDQiLA0KKyJkYW10NSIsDQorImRhbXQ2IiwNCisiZGFtdDciLA0KKyJkYW10OCIsDQorImRhbXQ5IiwNCisiZGFtdDEwIiwNCisiZGFtdDExIiwNCisiZGFtdDEyIiwNCisiZGFtdDEzIiwNCisiZGFtdDE0IiwNCisiZGFtdDE1IiwNCisiZGFtdDE2IiwNCisiZGFtdDE3IiwNCisiZGFtdDE4IiwNCisiZGFtdDE5IiwNCisiZGFtdDIwIiwNCisiZGFtdDIxIiwNCisiZGFtdDIyIiwNCisiZGFtdDIzIiwNCisiZGFtdDI0IiwNCisiZGFtdDI1IiwNCisiZGFtdDI2IiwNCisiZGFtdDI3IiwNCisiZGFtdDI4IiwNCisiZGFtdDI5IiwNCisiZGFtdDMwIiwNCisiZGFtdDMxIiwNCisiZGFtdDMyIiwNCisiZGFtdDMzIiwNCisic3N0b2NrX2NvZGUiLA0KKyJzc3RvY2tfY29kZTIiLA0KKyJzY3VzdF90eXBlIiwNCisic2N1c3RfdHlwZTIiLA0KKyJzc3RhdF90eXBlIiwNCisic3N0YXRfdHlwZTIiLA0KKyJzcm9vbV9ubyIsDQorInNyb29tX25vMiIsDQorInNvcGVuX2VtcCIsDQorInNjbG9zZV9lbXAiLA0KKyJzY2hhbmdlX2VtcCIsDQorInNjaGVja19lbXAiLA0KKyJzZW1wIiwNCisic25hdGlvbl9jb2RlIiwNCisibGNlcnRfY29kZSIsDQorInN0eF9wd2QiLA0KKyJzdHhfcHdkMiIsDQorInN3aXRoZHJhd19wd2QiLA0KKyJzd2l0aGRyYXdfcHdkMiIsDQorInNlbXBfcHdkIiwNCisic2VtcF9wd2QyIiwNCisic2JhbmtfcHdkIiwNCisic2JhbmtfcHdkMiIsDQorInNjdXN0X2F1dGgiLA0KKyJzY3VzdF9hdXRoMiIsDQorInNjdXN0X2xpbWl0IiwNCisic2N1c3RfbGltaXQyIiwNCisibHNhZmVfbGV2ZWwiLA0KKyJsc2FmZV9sZXZlbDIiLA0KKyJzcG9zdF9jb2RlIiwNCisic3Bvc3RfY29kZTIiLA0KKyJzcGhvbmUiLA0KKyJzcGhvbmUyIiwNCisic3Bob25lMyIsDQorInNwYWdlciIsDQorInNlbWFpbCIsDQorInNlbWFpbDIiLA0KKyJzbm90ZSIsDQorInNub3RlMiIsDQorInNjZXJ0X25vIiwNCisic2NlcnRfbm8yIiwNCisic2NlcnRfYWRkciIsDQorInNzdGF0dXMwIiwNCisic3N0YXR1czEiLA0KKyJzc3RhdHVzMiIsDQorInNzdGF0dXMzIiwNCisic3N0YXR1czQiLA0KKyJsd2l0aGRyYXdfZmxhZyIsDQorInNhZGRyIiwNCisic2FkZHIyIiwNCisic3NlcmlhbDAiLA0KKyJzc2VyaWFsMSIsDQorInNzZXJpYWwyIiwNCisic3NlcmlhbDMiLA0KKyJzc2VyaWFsNCIsDQorInNjdXJyZW5jeV90eXBlIiwNCisic2N1cnJlbmN5X3R5cGUyIiwNCisic2JyYW5jaF9jb2RlMCIsDQorInNicmFuY2hfY29kZTEiLA0KKyJzYnJhbmNoX2NvZGUyIiwNCisidXNzZXQwIiwNCisidXNzZXQxIiwNCisidXNzZXQyIiwNCisidXNzZXQzIiwNCisidXNzZXQ0IiwNCisidXNzZXQ1IiwNCisidXNzZXQ2IiwNCisic3N0YXRpb24wIiwNCisic3N0YXRpb24xIiwNCisic2JhbmtfYWNjIiwNCisic2JhbmtfYWNjMiIsDQorImxiYW5rX2FjY190eXBlIiwNCisibGJhbmtfYWNjX3R5cGUyIiwNCisic21haW5fZmxhZyIsDQorInNtYWluX2ZsYWcyIiwNCisic2JhbmtfY29kZSIsDQorInNiYW5rX2NvZGUyIiwNCisic2VtcF9ubyIsDQorInNlbXBfbm8yIiwNCisiZHJhdGUwIiwNCisiZHJhdGUxIiwNCisibHNlcmlhbDAiLA0KKyJsc2VyaWFsMSIsDQorInNiYW5rbmFtZSIsDQorInNiYW5rbmFtZTIiLA0KKyJzY2FyZDAiLA0KKyJzY2FyZDEiLA0KKyJzb3JkZXIwIiwNCisic29yZGVyMSIsDQorInNvcmRlcjIiLA0KKyJzY3VzdHR5cGVzIiwNCisic3NlY3R5cGVzIiwNCisidnNtZXNzIiwNCisidnN2YXJzdHIwIiwNCisidnN2YXJzdHIxIiwNCisidnN2YXJzdHIyIg0KK10NCisNCitkZWYgbG9hZF9iY2NjbHQoKToNCisgICAgZ2xvYmFsIGJjY2NsdF9kbGwNCisgICAgYmNjY2x0X2RsbCA9IGNkbGwuTG9hZExpYnJhcnkoJ2JjY2NsdC5kbGwnKQ0KKyAgICANCisgIA0KK2xvYWRfYmNjY2x0KCkgIA0KKw0KK2NsYXNzIHB5QmNjY2x0Og0KKyAgICBkcnRwX25vID0gLTENCisgICAgDQorICAgIGRlZiBzZXR1cChpcCxwb3J0LHhwYWNrPSdjcGFjay5kYXQnLGRlYnVnPTApOg0KKyAgICAgICAgJycnILP1yry7ryAnJycNCisgICAgICAgIGdsb2JhbCB4cGFja19wYXRoDQorICAgICAgICB4cGFja19wYXRoID0geHBhY2sNCisgICAgICAgIGJjY2NsdF9kbGwuU2V0RGVidWdTd2l0Y2goIGRlYnVnICkNCisgICAgICAgIHIgPSBiY2NjbHRfZGxsLkJDQ0NMVEluaXQoMSkNCisgICAgICAgIGlmIG5vdCByOg0KKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigis/XKvLuvway908qnsNwiKQ0KKyAgICAgICAgbm8gPSBiY2NjbHRfZGxsLkFkZERydHBOb2RlKGlwLHBvcnQpDQorICAgICAgICBweUJjY2NsdC5kcnRwX25vID0gbm8NCisgICAgICAgIGlmIHB5QmNjY2x0LmRydHBfbm8gPCAwOg0KKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigns/XKvLuvzajRtsa9zKjBrL3Tyqew3CcpDQorICAgICAgICAgICAgDQorICAgICAgICANCisgICAgICAgIA0KKyAgICBzZXR1cCA9IHN0YXRpY21ldGhvZChzZXR1cCkNCisgICAgICAgIA0KKyAgICBkZWYgX19pbml0X18oc2VsZixtYWluZnVuYyk6DQorICAgICAgICBzZWxmLmhhbmRsZSA9IGJjY2NsdF9kbGwuTmV3WHBhY2tIYW5kbGUoIHhwYWNrX3BhdGggKQ0KKyAgICAgICAgc2VsZi5tYWluZnVuYyA9IG1haW5mdW5jDQorICAgICAgICBzZWxmLnJlc2V0KCkNCisgICAgICAgIA0KKyAgICBkZWYgZ2V0X2Vycm9ybXNnKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIHNlbGYuZXJyb3JfbXNnLnZhbHVlDQorICAgICAgICANCisgICAgZGVmIHJlc2V0KHNlbGYpOg0KKyAgICAgICAgc2VsZi5yZXF1ZXN0X3JvdyA9IDANCisgICAgICAgIHNlbGYuZXJyb3JfY29kZSA9IGNfaW50KDApDQorICAgICAgICBzZWxmLmVycm9yX21zZyA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCdcMDAwJyAqIDEwMjQpDQorICAgICAgICBzZWxmLnJldHVybl9jb2RlID0gY19pbnQoMCkNCisgICAgICAgIHNlbGYucmVjb3JkX2NvdW50ID0gMA0KKyAgICAgICAgc2VsZi5yZWNvcmQgPSBOb25lDQorICAgICAgICBzZWxmLnRpbWVvdXQgPSA1MDAwDQorICAgICAgICBzZWxmLnJlc3BvbnNlX3JvdyA9IDANCisgICAgICAgIGJjY2NsdF9kbGwuUmVzZXRQYWNrSGFuZGxlKHNlbGYuaGFuZGxlKQ0KKyAgICAgICAgDQorICAgIGRlZiBjbG9zZShzZWxmKToNCisgICAgICAgIGlmIHNlbGYuaGFuZGxlIDw+IE5vbmU6DQorICAgICAgICAgICAgYmNjY2x0X2RsbC5EZWxldGVYcGFja0hhbmRsZSggc2VsZi5oYW5kbGUgKQ0KKyAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQ0KKyAgICAgICAgDQorICAgIGRlZiBjYWxsc3ZyKHNlbGYsZnVuYyxyZXF1ZXN0LHRpbWVvdXQgPSAxMDAwKToNCisgICAgICAgIHNlbGYucmVzZXQoKQ0KKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dA0KKyAgICAgICAgZm9yIGssdiBpbiByZXF1ZXN0Lml0ZXJpdGVtcygpOg0KKyAgICAgICAgICAgIGlmIGsgbm90IGluIGNwYWNrX2ZpZWxkczoNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigi19a2ziAlcyCyu7Tm1NoiICUgaykNCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsaW50KToNCisgICAgICAgICAgICAgICAgYmNjY2x0X2RsbC5TZXRJbnRGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlcXVlc3Rfcm93LGssdikNCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodixmbG9hdCk6DQorICAgICAgICAgICAgICAgIGJjY2NsdF9kbGwuU2V0RG91YmxlRmllbGRCeU5hbWUoc2VsZi5oYW5kbGUsc2VsZi5yZXF1ZXN0X3JvdyxrLHYpDQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHYsc3RyKToNCisgICAgICAgICAgICAgICAgYmNjY2x0X2RsbC5TZXRTdHJpbmdGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlcXVlc3Rfcm93LGssdikNCisgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCLX1rbOICVzIMr9vt3A4NDNtO3O8yIgJSBrKQ0KKyAgICAgICAgICAgICAgIA0KKyAgICAgICAgYmNjY2x0X2RsbC5TZXRSZXF1ZXN0VHlwZShzZWxmLmhhbmRsZSxmdW5jKQ0KKyAgICAgICAgI3ByaW50ICJDYWxsUmVxdWVzdCAlZDolZCIgJSAoc2VsZi5tYWluZnVuYyxmdW5jKQ0KKyAgICAgICAgaWYgbm90IGJjY2NsdF9kbGwuQ2FsbFJlcXVlc3Qoc2VsZi5oYW5kbGUscHlCY2NjbHQuZHJ0cF9ubywwLHNlbGYubWFpbmZ1bmMsdGltZW91dCxieXJlZihzZWxmLmVycm9yX2NvZGUpLHNlbGYuZXJyb3JfbXNnKToNCisgICAgICAgICAgICAjcHJpbnQgIkNhbGxSZXF1ZXN0IGVycm9yICINCisgICAgICAgICAgICByZXR1cm4gRmFsc2UNCisgICAgICAgICAgICANCisgICAgICAgIHNlbGYuZ2V0X3JldHVybl9lcnJvcigpDQorICAgICAgICANCisgICAgICAgIGNudCA9IGNfaW50KDApDQorICAgICAgICBiY2NjbHRfZGxsLkdldFJlY29yZENvdW50KHNlbGYuaGFuZGxlLGJ5cmVmKGNudCkpDQorICAgICAgICBzZWxmLnJlY29yZF9jb3VudCA9IGNudC52YWx1ZQ0KKyAgICAgICAgcmV0dXJuIFRydWUNCisgICAgICAgICAgICAgICAgDQorICAgIGRlZiBnZXRfcmV0Y29kZShzZWxmKToNCisgICAgICAgIHJldHVybiBzZWxmLnJldHVybl9jb2RlLnZhbHVlDQorICAgICAgICANCisgICAgZGVmIGdldF9yZXR1cm5fZXJyb3Ioc2VsZik6DQorICAgICAgICByID0gYmNjY2x0X2RsbC5HZXRSZXRDb2RlKHNlbGYuaGFuZGxlLGJ5cmVmKHNlbGYucmV0dXJuX2NvZGUpKQ0KKyAgICAgICAgaWYgbm90IHI6DQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCfIobe1u9jC67TtzvMnKQ0KKyAgICAgICAgaWYgc2VsZi5nZXRfcmV0Y29kZSgpIDw+IDA6DQorICAgICAgICAgICAgYmNjY2x0X2RsbC5HZXRTdHJpbmdGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSwwLCJ2c21lc3MiLHNlbGYuZXJyb3JfbXNnKQ0KKyAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuX2NvZGUudmFsdWUNCisgICAgICAgIA0KKyAgICBkZWYgaGFzX21vcmVfcmVjb3JkKHNlbGYpOg0KKyAgICAgICAgI3ByaW50ICJyZXNwOiVkLCByZWNvcmQ6ICVkIiAlIChzZWxmLnJlc3BvbnNlX3JvdyAsIHNlbGYucmVjb3JkX2NvdW50KQ0KKyAgICAgICAgaWYgc2VsZi5yZXNwb25zZV9yb3cgPCBzZWxmLnJlY29yZF9jb3VudDoNCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICAgICAgZWxpZiBub3QgYmNjY2x0X2RsbC5IYXZlTmV4dFBhY2soIHNlbGYuaGFuZGxlICk6DQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgICAgICBlbGlmIG5vdCBiY2NjbHRfZGxsLkNhbGxOZXh0KHNlbGYuaGFuZGxlLHNlbGYudGltZW91dCxieXJlZihzZWxmLmVycm9yX2NvZGUpLHNlbGYuZXJyb3JfbXNnKToNCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ7vxyKG689D4yv2+3bD80uyzoycpDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2Vfcm93ID0gMA0KKyAgICAgICAgICAgIHNlbGYucmVjb3JkX2NvdW50ID0gMA0KKyAgICAgICAgICAgIHNlbGYuZ2V0X3JldHVybl9lcnJvcigpDQorICAgICAgICAgICAgaWYgc2VsZi5nZXRfcmV0Y29kZSgpIDw+IDA6DQorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignyKG689D4yv2+3be1u9i07c7zo6xyZXQ9JWQnICUgc2VsZi5nZXRfcmV0Y29kZSgpKQ0KKyAgICAgICAgICAgIGNudCA9IGNfaW50KDApDQorICAgICAgICAgICAgYmNjY2x0X2RsbC5HZXRSZWNvcmRDb3VudChzZWxmLmhhbmRsZSxieXJlZihjbnQpKQ0KKyAgICAgICAgICAgIHNlbGYucmVjb3JkX2NvdW50ID0gY250LnZhbHVlDQorICAgICAgICAgICAgaWYgc2VsZi5yZXNwb25zZV9yb3cgIDwgc2VsZi5yZWNvcmRfY291bnQ6DQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlDQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgIA0KKyAgICBkZWYgY29udmVydF9hc2NpaShzZWxmLGRhdGEpOg0KKyAgICAgICAgaSA9IDANCisgICAgICAgIGRhdGFsZW4gPSBsZW4oZGF0YSkNCisgICAgICAgIHJlc3VsdCA9ICcnDQorICAgICAgICB3aGlsZSBpIDwgZGF0YWxlbjoNCisgICAgICAgICAgICB0ID0gZGF0YVtpOmkrMl0NCisgICAgICAgICAgICB0MSA9IGludCh0LDE2KSAmIDB4RkYNCisgICAgICAgICAgICBpZiAodDEgPCBvcmQoJzAnKSBvciB0MSA+IG9yZCgnOScpKSBhbmQgKHQxIDwgb3JkKCdBJykgb3IgdDEgPiBvcmQoJ0YnKSk6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlZhbHVlIGlzIG5vbi1oZXhkaWNpbWFsICVzOiVkIiAlIChjaHIodDEpLHQxKSkNCisgICAgICAgICAgICByZXN1bHQgKz0gY2hyKHQxKQ0KKyAgICAgICAgICAgIGkgKz0gMg0KKyAgICAgICAgcmV0dXJuIHJlc3VsdA0KKyAgICAgICAgDQorICAgIGRlZiBuZXh0X3JlY29yZChzZWxmLGZpZWxkcyk6DQorICAgICAgICBpZiBzZWxmLnJlc3BvbnNlX3JvdyA+PSBzZWxmLnJlY29yZF9jb3VudDoNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCfO3r/J08O8x8K8JykNCisgICAgICAgIA0KKyAgICAgICAgc2VsZi5yZWNvcmQgPSB7fQ0KKyAgICAgICAgZm9yIGYgaW4gZmllbGRzOg0KKyAgICAgICAgICAgICNwcmludCAiu/HIodfWts4gIixmDQorICAgICAgICAgICAgaWYgZiBub3QgaW4gY3BhY2tfZmllbGRzOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCLX1rbOICVzILK7tObU2iIgJSBmKQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGN0eXBlX2ZpZWxkID0gY3JlYXRlX3N0cmluZ19idWZmZXIoZikNCisgICAgICAgICAgICBpZiBmWzBdID09ICdsJzoNCisgICAgICAgICAgICAgICAgdiA9IGNfaW50KDApDQorICAgICAgICAgICAgICAgIHIgPSBiY2NjbHRfZGxsLkdldEludEZpZWxkQnlOYW1lKHNlbGYuaGFuZGxlLHNlbGYucmVzcG9uc2Vfcm93LGN0eXBlX2ZpZWxkLGJ5cmVmKHYpKQ0KKyAgICAgICAgICAgICAgICBpZiBub3QgcjoNCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoItfWts4gJXMgzrS3tbvYIiAlIGYpDQorICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkW2ZdID0gdi52YWx1ZQ0KKyAgICAgICAgICAgIGVsaWYgZlswXSA9PSAncyc6DQorICAgICAgICAgICAgICAgIHYgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcignXDAwMCcgKiA1MTIpDQorICAgICAgICAgICAgICAgIHIgPSBiY2NjbHRfZGxsLkdldFN0cmluZ0ZpZWxkQnlOYW1lKHNlbGYuaGFuZGxlLHNlbGYucmVzcG9uc2Vfcm93LGN0eXBlX2ZpZWxkLHYsNTExKQ0KKyAgICAgICAgICAgICAgICBpZiBub3QgcjoNCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoItfWts4gJXMgzrS3tbvYIiAlIGYpDQorICAgICAgICAgICAgICAgICNwcmludCAiJXM6ICVzIiAlIChmLHYudmFsdWUpDQorICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkW2ZdID0gdi52YWx1ZQ0KKyAgICAgICAgICAgIGVsaWYgZlswXSA9PSAnZCc6DQorICAgICAgICAgICAgICAgIHYgPSBjX2RvdWJsZSgwLjApDQorICAgICAgICAgICAgICAgIHIgPSBiY2NjbHRfZGxsLkdldERvdWJsZUZpZWxkQnlOYW1lKHNlbGYuaGFuZGxlLHNlbGYucmVzcG9uc2Vfcm93LGN0eXBlX2ZpZWxkLGJ5cmVmKHYpKQ0KKyAgICAgICAgICAgICAgICBpZiBub3QgcjoNCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoItfWts4gJXMgzrS3tbvYIiAlIGYpDQorICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkW2ZdID0gdi52YWx1ZQ0KKyAgICAgICAgICAgIGVsaWYgZlswXSA9PSAndSc6DQorICAgICAgICAgICAgICAgIHYgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcignXDAwMCcgKiAxMDI0KQ0KKyAgICAgICAgICAgICAgICByID0gYmNjY2x0X2RsbC5HZXRTdHJpbmdGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlc3BvbnNlX3JvdyxjdHlwZV9maWVsZCx2LDEwMjMpDQorICAgICAgICAgICAgICAgIGlmIG5vdCByOg0KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigi19a2ziAlcyDOtLe1u9giICUgZikNCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBkYXRhID0gdi52YWx1ZQ0KKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVsyOl0NCisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuY29udmVydF9hc2NpaShkYXRhKQ0KKyAgICAgICAgICAgICAgICBzZWxmLnJlY29yZFtmXSA9IGRhdGENCisgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCfX1rbOwODQzbTtzvMgJXMnICUgZikNCisgICAgICAgIHNlbGYucmVzcG9uc2Vfcm93ICs9IDENCisgICAgICAgICNwcmludCAiZmV0Y2ggb25lIHJlY29yZCAsICIgLHNlbGYucmVjb3JkDQorICAgICAgICByZXR1cm4gc2VsZi5yZWNvcmQNCisgICAgICAgIA0KKyAgICBkZWYgZmV0Y2hfcmVjb3JkKHNlbGYsZmllbGRzKToNCisgICAgICAgIHdoaWxlIHNlbGYuaGFzX21vcmVfcmVjb3JkKCk6DQorICAgICAgICAgICAgcmV0ID0gc2VsZi5uZXh0X3JlY29yZChmaWVsZHMpDQorICAgICAgICAgICAgeWllbGQgcmV0DQorICAgICAgICAgICAgDQorICAgIA0KKyAgICANCisgICAgDQorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGN1dGlsc19tb2R1bGUvX19pbml0X18ucHkgYi9zcmMvdGN1dGlsc19tb2R1bGUvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90Y3V0aWxzX21vZHVsZS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvc3JjL3RjdXRpbHNfbW9kdWxlL3Rlc3Rtb2R1bGUucHkgYi9zcmMvdGN1dGlsc19tb2R1bGUvdGVzdG1vZHVsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZlYzAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RjdXRpbHNfbW9kdWxlL3Rlc3Rtb2R1bGUucHkKQEAgLTAsMCArMSw1IEBACisnJycKK0NyZWF0ZWQgb24gMjAxMS05LTI2CisKK0BhdXRob3I6IGNoZW5nLnRhbmcKKycnJwo=