IyEvdXNyL2Jpbi9weXRob24NCiMgLSotIGNvZGluZzogZ2JrIC0qLSANCg0KaW1wb3J0IHN5cyxjb2RlY3Msc3RydWN0DQoNCklGVF9OVUxMPTANCklGVF9VTE9ORz0xDQpJRlRfQllURT0yDQpJRlRfVVNIT1JUPTMNCklGVF9EQVRFVElNRT00DQpJRlRfQlVGRkVSPTUNCklGVF9TVFJJTkc9Ng0KSUZUX0xPTkc9Nw0KDQojICgwLDAsMSxJRlRfQllURSwwLCJtc2d0eXBlIiwiz/vPosLrIiksDQoNCkZMRF9OT19JRFg9MA0KRkxEX0xFTkdUSF9JRFg9Mg0KRkxEX1RZUEVfSURYPTMNCkZMRF9GTEFHX0lEWD00DQpGTERfTkFNRV9JRFg9NQ0KRkxEX0RFU0NfSURYPTYNCg0KSERGaWVsZHNEZWYgPSBbDQooMSwwLDAsSUZUX05VTEwsMCwiZXh0ZW5kIiwiwKnVudPyt/EiKSwNCigyLDAsNCxJRlRfVUxPTkcsMCwidGVybWluYWxzbiIsIiDW1bbL0PLB0LrFIiksDQooMywwLDIsSUZUX1VTSE9SVCwwLCJhZGRyZXNzIiwiQ0FOtdjWtyIpLA0KKDQsMCw0LElGVF9VTE9ORywwLCJjYXJkbnVtYmVyIiwiv6i6xSIpLA0KKDUsMCwxLElGVF9CWVRFLDAsImluZGV4b2ZldyIsIiDHrrD8y/fS/SIpLA0KKDYsMCwyLElGVF9VU0hPUlQsMCwidHJhY2VvZmV3IiwiIMeusPzB98uuusUiKSwNCig3LDAsNCxJRlRfTE9ORywwLCJhbW91bnQiLCIgvbvS173wtu4iKSwNCig4LDAsNCxJRlRfTE9ORywwLCJhZGRpdGlvbmFsYW1vdW50MSIsIri9vNO98LbuIiksDQooOSwwLDQsSUZUX1VMT05HLDAsInRyYWNlb2Zwb3MiLCJQT1PB98uuusUiKSwNCigxMCwwLDQsSUZUX1VMT05HLDAsIm9yZ3RyYW5zdHJhY2UiLCLUrb270tfB98uuusUiKSwNCigxMSwwLDcsSUZUX0RBVEVUSU1FLDAsImRhdGV0aW1lIiwivbvS18jVxtq6zcqxvOQiKSwNCigxMiwwLDEsSUZUX0JZVEUsMCwicmVzcG9uc2Vjb2RlIiwiz+zTpsLrIiksDQooMTMsMCwyLElGVF9VU0hPUlQsMCwidGVybWluYWxpZCIsItbVtsu6xSIpLA0KKDE0LDAsMixJRlRfVVNIT1JULDAsInRlcm1pbmFsdHlwZSIsItbVtsvA4NDNIiksDQooMTUsMCwyLElGVF9VU0hPUlQsMCwibWVyY2hhbnRpZCIsIsnMu6cozfi14ym6xSIpLA0KKDE2LDAsNCxJRlRfVUxPTkcsMCwib3BlcmF0b3JpZCIsIrLZ1/fUsbrFIiksDQooMTcsMCw4LElGVF9CVUZGRVIsMCwicGluIiwiuPbIy8q2sfDC61BJTiIpLA0KKDE4LDAsNCxJRlRfVUxPTkcsMCwidmVyb2ZsaXN0IiwiutrD+7WlsOaxviIpLA0KKDE5LDAsNCxJRlRfVUxPTkcsMCwibWFuYWdlZmVlIiwivbvS18X6tM66xSjU3bK708MpIiksDQooMjAsMCwzNjAsSUZUX0JVRkZFUiwyLCJhZGRpdGlvbmFsZGF0YTEiLCK4vbzT0MXPojEiKSwNCigyMSwwLDUyOCxJRlRfQlVGRkVSLDIsImFkZGl0aW9uYWxkYXRhMiIsIri9vNPQxc+iMiIpLA0KKDIyLDAsNTI4LElGVF9TVFJJTkcsMiwiYWRkaXRpb25hbGRhdGEzIiwiuL2809DFz6IzIiksDQooMjMsMCw1MjgsSUZUX1NUUklORywyLCJhZGRpdGlvbmFsZGF0YTQiLCK4vbzT0MXPojQiKSwNCigyNCwwLDIsSUZUX1VTSE9SVCwwLCJtYWMiLCLP+8+iyM/WpMLrIikNCl0NCg0KY2xhc3MgSERQYWNrOg0KICAgICcnJyC747bgIDg1ODMg0K3S6bD8ICcnJw0KICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCiAgICAgICAgc2VsZi5tc2dfdHlwZSA9IDANCiAgICAgICAgc2VsZi52YWx1ZT17fQ0KICAgICAgICBzZWxmLmZpZWxkX2lkeD17fQ0KICAgICAgICBzZWxmLmZpZWxkX25hbWU9e30NCiAgICAgICAgc2VsZi5tc2d0eXBlID0gMA0KICAgICAgICANCiAgICAgICAgc2VsZi5sb2FkX2NvbmZpZygpDQogICAgICAgIA0KICAgIGRlZiBfX2VxX18oc2VsZixvdGhlcik6DQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLEhEUGFjayk6DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYuY29tcGFyZShvdGhlcikNCiAgICBkZWYgX19uZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlcixIRFBhY2spOg0KICAgICAgICAgICAgcmV0dXJuIFRydWUNCiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmNvbXBhcmUob3RoZXIpDQogICAgICAgIA0KICAgIGRlZiBjb21wYXJlKHNlbGYsb3RoZXIpOg0KICAgICAgICBpZiBzZWxmLm1zZ3R5cGUgIT0gb3RoZXIubXNndHlwZToNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICBmb3Igayx2IGluIHNlbGYudmFsdWUuaXRlbXMoKToNCiAgICAgICAgICAgIGlmIG5vdCBvdGhlci52YWx1ZS5oYXNfa2V5KGspOg0KICAgICAgICAgICAgICAgIHByaW50ICJmaWVsZCBbJXNdIG5vdCBlcXVhbCIgJSBrDQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgICAgICBpZiB2IDw+IG90aGVyLmdldChrKToNCiAgICAgICAgICAgICAgICBwcmludCAiZmllbGQgWyVzXSB2YWx1ZSBub3QgZXF1YWwgWyVzLCVzXSIgJSAoayx2LG90aGVyLmdldChrKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgcmV0dXJuIFRydWUNCiAgICAgICAgDQogICAgZGVmIGxvYWRfY29uZmlnKHNlbGYpOg0KICAgICAgICBmb3IgZmllbGQgaW4gSERGaWVsZHNEZWY6DQogICAgICAgICAgICBpbmRleCx0LGxlbix0eXBlLGZsYWcsbmFtZSxkZXNjID0gZmllbGQNCiAgICAgICAgICAgIHNlbGYuZmllbGRfaWR4W2luZGV4XSA9IGZpZWxkDQogICAgICAgICAgICBzZWxmLmZpZWxkX25hbWVbbmFtZV0gPSBmaWVsZA0KICAgICAgICAjcHJpbnQgc2VsZi5maWVsZF9uYW1lDQogICAgICANCiAgICBkZWYgZ2V0X2ZpZWxkX2RlZihzZWxmLGluZGV4KToNCiAgICAgICAgZmllbGRfZGVmID0gTm9uZQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4LGludCk6DQogICAgICAgICAgICBpZiBub3Qgc2VsZi5maWVsZF9pZHguaGFzX2tleShpbmRleCk6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgaW5kZXggJWQgbm90IGV4aXN0cyIgJSBpbmRleCkNCiAgICAgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZmllbGRfaWR4W2luZGV4XQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5kZXgsc3RyKToNCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZpZWxkX25hbWUuaGFzX2tleShpbmRleCk6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgaW5kZXggJXMgbm90IGV4aXN0cyIgJSBpbmRleCkNCiAgICAgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZmllbGRfbmFtZVtpbmRleF0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkIGluZGV4IHR5cGUgbm90IHN1cHBvcnQiKQ0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBmaWVsZF9kZWYNCiAgICAgICAgDQogICAgZGVmIHNldChzZWxmLGluZGV4LHZhbHVlKToNCiAgICAgICAgZmllbGRfZGVmID0gc2VsZi5nZXRfZmllbGRfZGVmKGluZGV4KQ0KICAgICAgICB0ID0gZmllbGRfZGVmW0ZMRF9UWVBFX0lEWF0NCiAgICAgICAgbiA9IGZpZWxkX2RlZltGTERfTkFNRV9JRFhdDQogICAgICAgIGwgPSBmaWVsZF9kZWZbRkxEX0xFTkdUSF9JRFhdDQogICAgICAgIGYgPSBmaWVsZF9kZWZbRkxEX0ZMQUdfSURYXQ0KICAgICAgICBpZiB0ID09IElGVF9VU0hPUlQgb3IgdCA9PSBJRlRfVUxPTkcgb3IgdCA9PSBJRlRfTlVMTCBvciB0ID09IElGVF9CWVRFIG9yIHQgPT0gSUZUX0xPTkc6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLGludCk6DQogICAgICAgICAgICAgICAgYiA9IHZhbHVlDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsc3RyKToNCiAgICAgICAgICAgICAgICBpZiB2YWx1ZS5zdGFydHN3aXRoKCcweCcpOg0KICAgICAgICAgICAgICAgICAgICBiID0gaW50KHZhbHVlLDE2KQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGIgPSBpbnQodmFsdWUpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIHR5cGUgbm90IGludGVnZXIiICUgbikNCiAgICAgICAgZWxpZiB0ID09IElGVF9EQVRFVElNRToNCiAgICAgICAgICAgIGlmIGxlbih2YWx1ZSkgIT0gMTIgYW5kIGxlbih2YWx1ZSkgIT0gMTQ6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgbGVuZ3RoIG11c3QgYmUgMTIgb3IgMTQiICUgbikNCiAgICAgICAgICAgIGlmIGxlbih2YWx1ZSkgPT0gMTQ6DQogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsyOl0NCiAgICAgICAgICAgIGIgPSB2YWx1ZSArICIwMCINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLHN0cik6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgdmFsdWUgdHlwZSBub3Qgc3RyaW5nIiAlIG4pDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiB0ID09IElGVF9EQVRFVElNRToNCiAgICAgICAgICAgICAgICBsICo9IDINCiAgICAgICAgICAgIGVsaWYgdmFsdWUuc3RhcnRzd2l0aCgnMHgnKToNCiAgICAgICAgICAgICAgICBsICo9IDINCiAgICAgICAgICAgICAgICBsICs9IDINCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGlmIGYgPD4gMiBhbmQgbGVuKHZhbHVlKSA8PiBsOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIGRhdGEgbGVuZ3RoIG5vdCBlcXVhbCAlZDw+JWQgIiAlIChuLGxlbih2YWx1ZSksbCkpDQogICAgICAgICAgICBlbGlmIGxlbih2YWx1ZSkgPiBsOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIGRhdGEgbGVuZ3RoIGV4Y2VlZCAlZCAiICUgKG4sbCkpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBiID0gdmFsdWUNCiAgICAgICAgICAgICAgICANCiAgICAgICAgc2VsZi52YWx1ZVtuXSA9IGINCiAgICAgICAgDQogICAgZGVmIGdldChzZWxmLGluZGV4KToNCiAgICAgICAgZmllbGRfZGVmID0gc2VsZi5nZXRfZmllbGRfZGVmKGluZGV4KQ0KICAgICAgICB0ID0gZmllbGRfZGVmWzNdDQogICAgICAgIG4gPSBmaWVsZF9kZWZbNV0NCiAgICAgICAgDQogICAgICAgIGlmIHNlbGYudmFsdWUuaGFzX2tleShuKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlW25dDQogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkZpZWxkICVzIG5vdCBzcGVjaWZpZWQiICUgbikNCiAgICAgICAgDQogICAgICAgIA0KICAgIGRlZiBlbmNvZGVfYml0bWFwKHNlbGYsYml0bWFwKToNCiAgICAgICAgYnVmZmVyID0gJycNCiAgICAgICAgb2Zmc2V0ID0gMA0KICAgICAgICAjcHJpbnQgImJpdCBsZW5bJWRdIiAlIGxlbihiaXRtYXApDQogICAgICAgIHdoaWxlIG9mZnNldCA8IGxlbihiaXRtYXApOg0KICAgICAgICAgICAgYml0ID0gMA0KICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6DQogICAgICAgICAgICAgICAgdCA9IG9yZChiaXRtYXBbb2Zmc2V0K2ldKSAtIDB4MzANCiAgICAgICAgICAgICAgICBpZiB0ID09IDA6IGNvbnRpbnVlDQogICAgICAgICAgICAgICAgYml0IHw9ICgxIDw8ICg3IC0gaSAlIDgpKQ0KICAgICAgICAgICAgYnVmZmVyICs9IGNocihiaXQmMHhGRikNCiAgICAgICAgICAgIG9mZnNldCArPSA4DQogICAgICAgIHJldHVybiBidWZmZXINCiAgICAgICAgICAgIA0KICAgIGRlZiBwYWNrKHNlbGYsd29ya2tleT1Ob25lKToNCiAgICAgICAgYnVmZmVyID0gJycNCiAgICAgICAgYml0bWFwID0gWycwJyBmb3IgaSBpbiByYW5nZSgyNCldDQogICAgICAgIGZvciBmaWVsZCBpbiBIREZpZWxkc0RlZjoNCiAgICAgICAgICAgIGluZGV4LHgsbGVuLHQsZmxhZyxuYW1lLGRlc2MgPSBmaWVsZA0KICAgICAgICAgICAgaWYgbm90IHNlbGYudmFsdWUuaGFzX2tleShuYW1lKToNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiB0ID09IElGVF9VU0hPUlQgb3IgdCA9PSBJRlRfVUxPTkcgb3IgdCA9PSBJRlRfTlVMTCBvciB0ID09IElGVF9CWVRFIG9yIHQgPT0gSUZUX0xPTkc6DQogICAgICAgICAgICAgICAgYnVmZmVyICs9IHNlbGYuaW50XzJfYnVmZmVyKHNlbGYudmFsdWVbbmFtZV0sdCxsZW4pDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBzZWxmLnN0cmluZ18yX2J1ZmZlcihzZWxmLnZhbHVlW25hbWVdLHQsbGVuLGZsYWcpDQogICAgICAgICAgICBiaXRtYXBbaW5kZXgtMV0gPSAnMScNCiAgICAgICAgI3ByaW50IGJpdG1hcA0KICAgICAgICANCiAgICAgICAgYml0bWFwX2J1ZmZlciA9IHNlbGYuZW5jb2RlX2JpdG1hcChiaXRtYXApDQogICAgICAgIGZ1bGxfZGF0YSA9IGNocihzZWxmLm1zZ3R5cGUmMHhGRikgKyBiaXRtYXBfYnVmZmVyICsgYnVmZmVyDQogICAgICAgIGhlYWRlciA9IHNlbGYuZGF0YV9oZWFkZXIoZnVsbF9kYXRhKQ0KICAgICAgICAjcHJpbnQgImhbJXNdZFslc10iICUgKGNvZGVjcy5lbmNvZGUoaGVhZGVyLCdoZXgnKSxjb2RlY3MuZW5jb2RlKGZ1bGxfZGF0YSwnaGV4JykpDQogICAgICAgIHJldHVybiBoZWFkZXIgKyBmdWxsX2RhdGENCiAgICANCiAgICBkZWYgZGF0YV9oZWFkZXIoc2VsZixidWZmZXIpOg0KICAgICAgICBpZiBsZW4oYnVmZmVyKSA+IDB4RkZGRjoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkJ1ZmZlciBtYXggbGVuZ3RoIGV4Y2VlZCAlZCIsIGxlbihidWZmZXIpKQ0KICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QucGFjaygnPEgnLGxlbihidWZmZXIpKQ0KICAgICAgICByZXR1cm4gaGVhZGVyDQogICAgICAgIA0KICAgIGRlZiBpbnRfMl9idWZmZXIoc2VsZix2YWx1ZSx0eXBlLGxlbmd0aCk6DQogICAgICAgIGJ1ZmZlciA9ICcnDQogICAgICAgIGlmIHR5cGUgPT0gSUZUX0JZVEU6DQogICAgICAgICAgICBidWZmZXIgPSBjaHIodmFsdWUlMHgxMDApDQogICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTlVMTDoNCiAgICAgICAgICAgIHJldHVybiBidWZmZXINCiAgICAgICAgZWxpZiB0eXBlID09IElGVF9VU0hPUlQ6DQogICAgICAgICAgICB2ID0gdmFsdWUgJSAweDEwMDAwDQogICAgICAgICAgICBidWZmZXIgPSBzdHJ1Y3QucGFjaygnPEgnLHYpDQogICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfVUxPTkc6DQogICAgICAgICAgICBidWZmZXIgPSBzdHJ1Y3QucGFjaygnPEknLHZhbHVlKQ0KICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX0xPTkc6DQogICAgICAgICAgICBidWZmZXIgPSBzdHJ1Y3QucGFjaygnPGknLHZhbHVlKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW5wdXQgRXJyb3InKQ0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBidWZmZXINCiAgICANCiAgICBkZWYgZW5jb2RlX2JjZChzZWxmLHZhbHVlKToNCiAgICAgICAgaWYgbGVuKHZhbHVlKSAlIDIgIT0gMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInZhbHVlIGxlbmd0aCBtdXN0IGRpdiAyIikNCiAgICAgICAgaSA9IDANCiAgICAgICAgI3ByaW50ICJ2YWx1ZSBbJXNdIiAlIHZhbHVlDQogICAgICAgIGJ1ZmZlciA9ICcnDQogICAgICAgIHdoaWxlIGkgPCBsZW4odmFsdWUpOg0KICAgICAgICAgICAgdDEgPSAob3JkKHZhbHVlW2ldKSAtIDB4MzApJiAweEZGDQogICAgICAgICAgICB0MiA9IChvcmQodmFsdWVbaSsxXSkgLSAweDMwKSAmIDB4RkYNCiAgICAgICAgICAgICNwcmludCAidDFbJWRddDJbJWRdIiAlICh0MSx0MikNCiAgICAgICAgICAgIHQgPSAoKHQxPDw0KSB8IHQyKSAmIDB4RkYNCiAgICAgICAgICAgICNwcmludCAidDFbJWRddDJbJWRddFslZF0iICUgKHQxLHQyLHQpDQogICAgICAgICAgICBidWZmZXIgKz0gY2hyKHQpDQogICAgICAgICAgICBpICs9IDINCiAgICAgICAgI3ByaW50ICJiY2QgdmFsdWVbJXNdIiAlIGNvZGVjcy5lbmNvZGUoYnVmZmVyLCdoZXgnKQ0KICAgICAgICByZXR1cm4gYnVmZmVyDQogICAgICAgIA0KICAgIGRlZiBkZWNvZGVfYmNkKHNlbGYsdmFsdWUpOg0KICAgICAgICBidWZmZXIgPSAnJw0KICAgICAgICAjcHJpbnQgImJjZCBbJXNdIiAlIGNvZGVjcy5lbmNvZGUodmFsdWUsJ2hleCcpDQogICAgICAgIGZvciBjIGluIHZhbHVlOg0KICAgICAgICAgICAgdCA9IG9yZChjKSAmIDB4RkYNCiAgICAgICAgICAgIHQxID0gKHQgPj4gNCkgJiAweDBGDQogICAgICAgICAgICB0MiA9IHQgJiAweDBGDQogICAgICAgICAgICAjcHJpbnQgInRbJTAyeF10MVslZF10MlslZF0iICUgKHQsdDEsdDIpDQogICAgICAgICAgICBidWZmZXIgKz0gY2hyKHQxICsgMHgzMCkgKyBjaHIodDIgKyAweDMwKQ0KICAgICAgICAjcHJpbnQgImJjZCB2YWx1ZVslc10iICUgYnVmZmVyDQogICAgICAgIHJldHVybiBidWZmZXINCiAgICAgICAgDQogICAgZGVmIHN0cmluZ18yX2J1ZmZlcihzZWxmLHZhbHVlLHR5cGUsbGVuZ3RoLGZsYWcpOg0KICAgICAgICBidWZmZXIgPSAnJw0KICAgICAgICBpZiB0eXBlID09IElGVF9TVFJJTkcgb3IgdHlwZSA9PSBJRlRfQlVGRkVSOg0KICAgICAgICAgICAgaWYgdmFsdWUuc3RhcnRzd2l0aCgnMHgnKToNCiAgICAgICAgICAgICAgICBidWZmZXIgPSBjb2RlY3MuZGVjb2RlKHZhbHVlWzI6XSwnaGV4JykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgYnVmZmVyID0gdmFsdWUNCiAgICAgICAgZWxpZiB0eXBlID09IElGVF9EQVRFVElNRToNCiAgICAgICAgICAgIGJ1ZmZlciA9ICcnDQogICAgICAgICAgICBpID0gMA0KICAgICAgICAgICAgd2hpbGUgaSA8IGxlbih2YWx1ZSk6DQogICAgICAgICAgICAgICAgdCA9IGludCh2YWx1ZVtpOmkrMl0pDQogICAgICAgICAgICAgICAgYnVmZmVyICs9IGNocih0ICYgMHhGRikNCiAgICAgICAgICAgICAgICBpICs9IDINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0lucHV0IEVycm9yJykNCiAgICAgICAgICAgIA0KICAgICAgICBpZiBmbGFnID09IDI6DQogICAgICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QucGFjaygnPEgnLGxlbihidWZmZXIpICUgMHgxMDAwMCkNCiAgICAgICAgICAgIHJldHVybiBoZWFkZXIgKyBidWZmZXINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICNpZiB0eXBlID09IElGVF9CVUZGRVI6DQogICAgICAgICAgICAjICAgIGlmIGxlbihidWZmZXIpICUgMiA8PiAwIG9yIGxlbihidWZmZXIpLzIgPD4gbGVuZ3RoOg0KICAgICAgICAgICAgIyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVmFsdWUgbGVuZ3RoIG5vdCBtYXRjaGVkIFslc10iICUgdmFsdWUpDQogICAgICAgICAgICAjICAgIGJ1ZmZlciA9IGNvZGVjcy5kZWNvZGUoYnVmZmVyLCdoZXgnKQ0KICAgICAgICAgICAgaWYgbGVuKGJ1ZmZlcikgIT0gbGVuZ3RoOg0KICAgICAgICAgICAgICAgIHBhZGxlbiA9IGxlbmd0aCAtIGxlbihidWZmZXIpDQogICAgICAgICAgICAgICAgaWYgcGFkbGVuIDwgMDoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVmFsdWUgbGVuZ3RoIG5vdCBtYXRjaGVkIFslc10iICUgdmFsdWUpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcGFkID0gY2hyKDApICogcGFkbGVuDQogICAgICAgICAgICAgICAgYnVmZmVyID0gcGFkICsgYnVmZmVyDQogICAgICAgICAgICByZXR1cm4gYnVmZmVyDQogICAgICAgICAgICANCiAgICANCiAgICBkZWYgZGVjb2RlX2JpdG1hcChzZWxmLGJpdG1hcCk6DQogICAgICAgIGlmIGxlbihiaXRtYXApICE9IDM6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJiaXRtYXAgbGVuZ3RoIGVycm9yIikNCiAgICAgICAgI3ByaW50ICJiaXRtYXBbJXNdIiAlIGNvZGVjcy5lbmNvZGUoYml0bWFwLCdoZXgnKQ0KICAgICAgICBidWZmZXI9W10NCiAgICAgICAgZm9yIHQgaW4gYml0bWFwOg0KICAgICAgICAgICAgdiA9IG9yZCh0KSAmIDB4RkYNCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDgpOg0KICAgICAgICAgICAgICAgIHggPSAodiAmICgxIDw8ICg3LWkpKSkNCiAgICAgICAgICAgICAgICBpZiB4ID4gMDoNCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnMScpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnMCcpDQogICAgICAgIHJldHVybiBidWZmZXINCiAgICAgICAgICAgIA0KICAgIGRlZiB1bnBhY2soc2VsZixkYXRhKToNCiAgICAgICAgc2VsZi52YWx1ZSA9IHt9DQogICAgICAgICNwcmludCAiZGF0YVslc10iICUgY29kZWNzLmVuY29kZShkYXRhLCdoZXgnKQ0KICAgICAgICBkYXRhX2xlbiA9IHN0cnVjdC51bnBhY2soJzxIJyxkYXRhWzoyXSlbMF0NCiAgICAgICAgaWYgbGVuKGRhdGEpICE9IGRhdGFfbGVuICsgMjoNCiAgICAgICAgICAgIHByaW50ICJpbnB1dFslZF0gZXh0dWFsbHlbJWRdIiAlIChkYXRhX2xlbixsZW4oZGF0YSkpDQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgDQogICAgICAgIG9mZnNldCA9IDINCiAgICAgICAgc2VsZi5tc2d0eXBlID0gb3JkKGRhdGFbb2Zmc2V0XSkgJiAweEZGDQogICAgICAgIG9mZnNldCArPSAxDQogICAgICAgIGJpdG1hcCA9IHNlbGYuZGVjb2RlX2JpdG1hcChkYXRhW29mZnNldDpvZmZzZXQrM10pDQogICAgICAgIG9mZnNldCArPSAzDQogICAgICAgICNwcmludCBiaXRtYXANCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGJpdG1hcCkpOg0KICAgICAgICAgICAgaWYgYml0bWFwW2ldID09ICcwJzogY29udGludWUNCiAgICAgICAgICAgIGZpbmRleCA9IGkgKyAxDQogICAgICAgICAgICBmaWVsZCA9IHNlbGYuZ2V0X2ZpZWxkX2RlZihmaW5kZXgpDQogICAgICAgICAgICBmdHlwZSA9IGZpZWxkW0ZMRF9UWVBFX0lEWF0NCiAgICAgICAgICAgIGZsZW4gPSBmaWVsZFtGTERfTEVOR1RIX0lEWF0NCiAgICAgICAgICAgIGZmbGFnID0gZmllbGRbRkxEX0ZMQUdfSURYXQ0KICAgICAgICAgICAgZm5hbWUgPSBmaWVsZFtGTERfTkFNRV9JRFhdDQogICAgICAgICAgICAjcHJpbnQgInBhcnNlIGZpZWxkWyVzXSBbJWRdb2ZmWyVkXVslc10iICUgKGZuYW1lLGZmbGFnLG9mZnNldCxjb2RlY3MuZW5jb2RlKGRhdGFbb2Zmc2V0Om9mZnNldCsyXSwnaGV4JykpDQogICAgICAgICAgICBpZiBmZmxhZyA9PSAyOiAjILHks6TK/b7dDQogICAgICAgICAgICAgICAgI3ByaW50ICJsZW4gWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGRhdGFbb2Zmc2V0Om9mZnNldCsyXSwnaGV4JykNCiAgICAgICAgICAgICAgICBlbmRwb3MgPSBzZWxmLmJ1ZmZlcl8yX2ludChkYXRhW29mZnNldDpvZmZzZXQrMl0sSUZUX1VTSE9SVCkNCiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMg0KICAgICAgICAgICAgICAgIGVuZHBvcyArPSBvZmZzZXQgDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGVuZHBvcyA9IG9mZnNldCArIGZsZW4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGlmIGZ0eXBlID09IElGVF9VU0hPUlQgb3IgZnR5cGUgPT0gSUZUX1VMT05HIG9yIGZ0eXBlID09IElGVF9OVUxMIG9yIGZ0eXBlID09IElGVF9CWVRFIG9yIGZ0eXBlID09IElGVF9MT05HOg0KICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5idWZmZXJfMl9pbnQoZGF0YVtvZmZzZXQ6ZW5kcG9zXSxmdHlwZSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgI3RlbXAgPSBzZWxmLmJ1ZmZlcl8yX3N0cmluZyhkYXRhW29mZnNldDplbmRwb3NdLGZ0eXBlKQ0KICAgICAgICAgICAgICAgICNpZiBmZmxhZyAhPSAyIGFuZCBmdHlwZSA9PSBJRlRfU1RSSU5HOg0KICAgICAgICAgICAgICAgICMgICAgZm9yIGkgaW4gdGVtcDoNCiAgICAgICAgICAgICAgICAjICAgICAgICBwcmludCAiY2hhciBbJTAyeF0iICUgb3JkKGkpDQogICAgICAgICAgICAgICAgIyAgICAgICAgaWYgb3JkKGkpID4gMDoNCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgdmFsdWUgKz0gaQ0KICAgICAgICAgICAgICAgICNlbHNlOg0KICAgICAgICAgICAgICAgICMgICAgdmFsdWUgPSB0ZW1wDQogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmJ1ZmZlcl8yX3N0cmluZyhkYXRhW29mZnNldDplbmRwb3NdLGZ0eXBlKQ0KICAgICAgICAgICAgICAgIGlmIGZmbGFnIDw+IDIgYW5kIGZ0eXBlID09IElGVF9CVUZGRVI6DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJzB4JyArIGNvZGVjcy5lbmNvZGUodmFsdWUsJ2hleCcpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHNlbGYuc2V0KGZpbmRleCx2YWx1ZSkNCiAgICAgICAgICAgICNwcmludCAicGFyc2UgZmllbGRbJXNdIE9LID09PT09IiAlIGZuYW1lDQogICAgICAgICAgICBvZmZzZXQgPSBlbmRwb3MNCiAgICAgICAgI3ByaW50IHNlbGYudmFsdWUNCiAgICAgICAgcmV0dXJuIFRydWUNCiAgICANCiAgICBkZWYgYnVmZmVyXzJfaW50KHNlbGYsZGF0YSx0eXBlKToNCiAgICAgICAgaWYgdHlwZSA9PSBJRlRfQllURToNCiAgICAgICAgICAgIHJldHVybiBvcmQoZGF0YSkNCiAgICAgICAgZWxpZiB0eXBlID09IElGVF9VU0hPUlQ6DQogICAgICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPEgnLGRhdGEpWzBdDQogICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfVUxPTkc6DQogICAgICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPEknLGRhdGEpWzBdDQogICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTE9ORzoNCiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc8aScsZGF0YSlbMF0NCiAgICAgICAgZWxpZiB0eXBlID09IElGVF9OVUxMOg0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlucHV0IGRhdGEgdHlwZSBlcnJvciIpDQogICAgICAgICAgICANCiAgICBkZWYgYnVmZmVyXzJfc3RyaW5nKHNlbGYsZGF0YSx0eXBlKToNCiAgICAgICAgaWYgdHlwZSA9PSBJRlRfU1RSSU5HOg0KICAgICAgICAgICAgcmV0dXJuIGRhdGENCiAgICAgICAgZWxpZiB0eXBlID09IElGVF9CVUZGRVI6DQogICAgICAgICAgICByZXR1cm4gZGF0YQ0KICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX0RBVEVUSU1FOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb2RlX2JjZChkYXRhKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW5wdXQgZGF0YSB0eXBlIGVycm9yIikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgZGVmIGdldF8yYnl0ZV9pbnQoc2VsZixkYXRhKToNCiAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soIj5IIixkYXRhKVswXQ0KICAgICAgICANCiAgICBkZWYgZ2V0XzNieXRlX2ludChzZWxmLGRhdGEpOg0KICAgICAgICB0ZW1wID0gZGF0YSArIGNocigwKQ0KICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygiPEkiLHRlbXApWzBdDQogICAgICAgIA0KICAgIGRlZiBnZXRfNGJ5dGVfaW50KHNlbGYsZGF0YSk6DQogICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCI8SSIsZGF0YSlbMF0NCiAgICAgICAgDQogICAgZGVmIHNldF8yYnl0ZV9pbnQoc2VsZixkYXRhKToNCiAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKCc8SCcsZGF0YSkNCiAgICANCiAgICBkZWYgc2V0XzNieXRlX2ludChzZWxmLGRhdGEpOg0KICAgICAgICB0ZW1wID0gc3RydWN0LnBhY2soJzxIJyxkYXRhKQ0KICAgICAgICByZXR1cm4gdGVtcFs6LTFdDQogICAgICAgICAgICANCiAgICBkZWYgc2V0XzRieXRlX2ludChzZWxmLGRhdGEpOg0KICAgICAgICByZXR1cm4gc3RydWN0LnBhY2soJzxJJyxkYXRhKQ==