LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENPUFlSSUdIVDoKICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDMsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kCiAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImxvY3Rlc3QuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICJ1bmljb2RlL2RlY2ltZm10LmgiCiNpbmNsdWRlICJ1bmljb2RlL3VjdXJyLmgiCiNpbmNsdWRlICJ1bmljb2RlL3NtcGR0Zm10LmgiCiNpbmNsdWRlICJ1bmljb2RlL2R0Zm10c3ltLmgiCiNpbmNsdWRlICJ1bmljb2RlL2Jya2l0ZXIuaCIKI2luY2x1ZGUgInVuaWNvZGUvY29sbC5oIgojaW5jbHVkZSAiY3N0cmluZy5oIgojaW5jbHVkZSAidWFzc2VydC5oIgoKY29uc3QgY2hhciogcmF3RGF0YVszM11bOF0gPSB7CgogICAgICAgIC8vIGxhbmd1YWdlIGNvZGUKICAgICAgICB7ICAgImVuIiwgICAiZnIiLCAgICJjYSIsICAgImVsIiwgICAibm8iLCAgICJpdCIsICAgInh4IiwgICAiemgiICB9LAogICAgICAgIC8vIHNjcmlwdCBjb2RlCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIkhhbnMiIH0sCiAgICAgICAgLy8gY291bnRyeSBjb2RlCiAgICAgICAgeyAgICJVUyIsICAgIkZSIiwgICAiRVMiLCAgICJHUiIsICAgIk5PIiwgICAiIiwgICAgICJZWSIsICAgIkNOIiAgfSwKICAgICAgICAvLyB2YXJpYW50IGNvZGUKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiTlkiLCAgICIiLCAgICAgIiIsICAgIiIgICAgfSwKICAgICAgICAvLyBmdWxsIG5hbWUKICAgICAgICB7ICAgImVuX1VTIiwgICAgImZyX0ZSIiwgICAgImNhX0VTIiwgICAgImVsX0dSIiwgICAgIm5vX05PX05ZIiwgIml0IiwgICAieHhfWVkiLCAgICJ6aF9IYW5zX0NOIiB9LAogICAgICAgIC8vIElTTy0zIGxhbmd1YWdlCiAgICAgICAgeyAgICJlbmciLCAgImZyYSIsICAiY2F0IiwgICJlbGwiLCAgIm5vciIsICAiaXRhIiwgICIiLCAgICJ6aG8iICAgfSwKICAgICAgICAvLyBJU08tMyBjb3VudHJ5CiAgICAgICAgeyAgICJVU0EiLCAgIkZSQSIsICAiRVNQIiwgICJHUkMiLCAgIk5PUiIsICAiIiwgICAgICIiLCAgICJDSE4iICAgfSwKICAgICAgICAvLyBMQ0lECiAgICAgICAgeyAgICI0MDkiLCAiNDBjIiwgIjQwMyIsICI0MDgiLCAiODE0IiwgIjEwIiwgICAgICIwIiwgICAiODA0IiAgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChFbmdsaXNoKQogICAgICAgIHsgICAiRW5nbGlzaCIsICAiRnJlbmNoIiwgICAiQ2F0YWxhbiIsICJHcmVlayIsICAgICJOb3J3ZWdpYW4iLCAgICAiSXRhbGlhbiIsICAieHgiLCAgICJDaGluZXNlIiB9LAogICAgICAgIC8vIGRpc3BsYXkgc2NyaXB0IChFbmdsaXNoKQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICIiLCAgICAgIiIsICAgIlNpbXBsaWZpZWQgSGFuIiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoRW5nbGlzaCkKICAgICAgICB7ICAgIlVuaXRlZCBTdGF0ZXMiLCAgICAiRnJhbmNlIiwgICAiU3BhaW4iLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiLCAgICJDaGluYSIgfSwKICAgICAgICAvLyBkaXNwbGF5IHZhcmlhbnQgKEVuZ2xpc2gpCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIk5ZIiwgICAiIiwgICAgICIiLCAgICIifSwKICAgICAgICAvLyBkaXNwbGF5IG5hbWUgKEVuZ2xpc2gpCiAgICAgICAgLy8gVXBkYXRlZCBub19OT19OWSBFbmdsaXNoIGRpc3BsYXkgbmFtZSBmb3IgbmV3IHBhdHRlcm4tYmFzZWQgYWxnb3JpdGhtCiAgICAgICAgLy8gKHBhcnQgb2YgRXVybyBzdXBwb3J0KS4KICAgICAgICB7ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDYXRhbGFuIChTcGFpbikiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksIE5ZKSIsICJJdGFsaWFuIiwgInh4IChZWSkiLCAiQ2hpbmVzZSAoU2ltcGxpZmllZCBIYW4sIENoaW5hKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChGcmVuY2gpCiAgICAgICAgeyAgICJhbmdsYWlzIiwgICJmcmFuXFx1MDBFN2FpcyIsICAgImNhdGFsYW4iLCAiZ3JlYyIsICAgICJub3J2XFx1MDBFOWdpZW4iLCAgICAiaXRhbGllbiIsICJ4eCIsICJjaGlub2lzIiB9LAogICAgICAgIC8vIGRpc3BsYXkgc2NyaXB0IChGcmVuY2gpCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICJIYW5zIiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoRnJlbmNoKQogICAgICAgIHsgICAiXFx1MDBDOXRhdHMtVW5pcyIsICAgICJGcmFuY2UiLCAgICJFc3BhZ25lIiwgICJHclxcdTAwRThjZSIsICAgIk5vcnZcXHUwMEU4Z2UiLCAiIiwgIllZIiwgIkNoaW5lIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoRnJlbmNoKQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgICAiIiwgICAgICIiLCAgICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChGcmVuY2gpCiAgICAgICAgLy97ICAgImFuZ2xhaXMgKMl0YXRzLVVuaXMpIiwgImZyYW7nYWlzIChGcmFuY2UpIiwgImNhdGFsYW4gKEVzcGFnbmUpIiwgImdyZWMgKEdy6GNlKSIsICJub3J26WdpZW4gKE5vcnboZ2UsTnlub3JzaykiLCAiaXRhbGllbiIsICJ4eCAoWVkpIiB9LAogICAgICAgIHsgICAiYW5nbGFpcyAoXFx1MDBDOXRhdHMtVW5pcykiLCAiZnJhblxcdTAwRTdhaXMgKEZyYW5jZSkiLCAiY2F0YWxhbiAoRXNwYWduZSkiLCAiZ3JlYyAoR3JcXHUwMEU4Y2UpIiwgIm5vcnZcXHUwMEU5Z2llbiAoTm9ydlxcdTAwRThnZSwgTlkpIiwgIml0YWxpZW4iLCAieHggKFlZKSIsICJjaGlub2lzIChIYW5zLCBDaGluZSkiIH0sIC8vIFNUSUxMIG5vdCByaWdodAoKCiAgICAgICAgLyogZGlzcGxheSBsYW5ndWFnZSAoQ2F0YWxhbikgKi8KICAgICAgICB7ICAgImFuZ2xcXHUwMEU4cyIsICJmcmFuY1xcdTAwRThzIiwgImNhdGFsXFx1MDBFMCIsICJncmVjIiwgICJub3J1ZWMiLCAiaXRhbGlcXHUwMEUwIiwgIiIsICJ4aW5cXHUwMEU5cyIgfSwKICAgICAgICAvKiBkaXNwbGF5IHNjcmlwdCAoQ2F0YWxhbikgKi8KICAgICAgICB7ICAgIiIsICIiLCAiIiwgICAgICAgICAgICAgICAgICAgICIiLCAiIiwgIiIsICIiLCAiSGFucyIgfSwKICAgICAgICAvKiBkaXNwbGF5IGNvdW50cnkgKENhdGFsYW4pICovCiAgICAgICAgeyAgICJFc3RhdHMgVW5pdHMiLCAiRnJhblxcdTAwRTdhIiwgIkVzcGFueWEiLCAgIkdyXFx1MDBFOGNpYSIsICJOb3J1ZWdhIiwgIiIsICIiLCAiWGluYSIgfSwKICAgICAgICAvKiBkaXNwbGF5IHZhcmlhbnQgKENhdGFsYW4pICovCiAgICAgICAgeyAgICIiLCAiIiwgIiIsICAgICAgICAgICAgICAgICAgICAiIiwgIk5ZIiwgIiIsICIiIH0sCiAgICAgICAgLyogZGlzcGxheSBuYW1lIChDYXRhbGFuKSAqLwogICAgICAgIHsgICAiYW5nbFxcdTAwRThzIChFc3RhdHMgVW5pdHMpIiwgImZyYW5jXFx1MDBFOHMgKEZyYW5cXHUwMEU3YSkiLCAiY2F0YWxcXHUwMEUwIChFc3BhbnlhKSIsICJncmVjIChHclxcdTAwRThjaWEpIiwgIm5vcnVlYyAoTm9ydWVnYSwgTlkpIiwgIml0YWxpXFx1MDBFMCIsICIiLCAieGluXFx1MDBFOXMgKEhhbnMsIFhpbmEpIiB9LAoKICAgICAgICAvLyBkaXNwbGF5IGxhbmdhZ2UgKEdyZWVrKVthY3R1YWwgdmFsdWVzIGxpc3RlZCBiZWxvd10KICAgICAgICB7ICAgIlxcdTAzOTFcXHUwM2IzXFx1MDNiM1xcdTAzYmJcXHUwM2I5XFx1MDNiYVxcdTAzYWMiLAogICAgICAgICAgICAiXFx1MDM5M1xcdTAzYjFcXHUwM2JiXFx1MDNiYlxcdTAzYjlcXHUwM2JhXFx1MDNhYyIsCiAgICAgICAgICAgICJcXHUwMzlhXFx1MDNiMVxcdTAzYzRcXHUwM2IxXFx1MDNiYlxcdTAzYjFcXHUwM2JkXFx1MDNiOVxcdTAzYmFcXHUwM2FjIiwKICAgICAgICAgICAgIlxcdTAzOTVcXHUwM2JiXFx1MDNiYlxcdTAzYjdcXHUwM2JkXFx1MDNiOVxcdTAzYmFcXHUwM2FjIiwKICAgICAgICAgICAgIlxcdTAzOWRcXHUwM2JmXFx1MDNjMVxcdTAzYjJcXHUwM2I3XFx1MDNiM1xcdTAzYjlcXHUwM2JhXFx1MDNhYyIsCiAgICAgICAgICAgICJcXHUwMzk5XFx1MDNjNFxcdTAzYjFcXHUwM2JiXFx1MDNiOVxcdTAzYmFcXHUwM2FjIiwKICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICJcXHUwMzlBXFx1MDNCOVxcdTAzQkRcXHUwM0I1XFx1MDNCNlxcdTAzQjlcXHUwM0JBXFx1MDNBQyIKICAgICAgICB9LAogICAgICAgIC8vIGRpc3BsYXkgc2NyaXB0IChHcmVlaykKICAgICAgICB7ICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJIYW5zIiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoR3JlZWspW2FjdHVhbCB2YWx1ZXMgbGlzdGVkIGJlbG93XQogICAgICAgIHsgICAiXFx1MDM5N1xcdTAzQkRcXHUwM0M5XFx1MDNCQ1xcdTAzQURcXHUwM0JEXFx1MDNCNVxcdTAzQzIgXFx1MDNBMFxcdTAzQkZcXHUwM0JCXFx1MDNCOVxcdTAzQzRcXHUwM0I1XFx1MDNBRlxcdTAzQjVcXHUwM0MyIiwKICAgICAgICAgICAgIlxcdTAzOTNcXHUwM2IxXFx1MDNiYlxcdTAzYmJcXHUwM2FmXFx1MDNiMSIsCiAgICAgICAgICAgICJcXHUwMzk5XFx1MDNjM1xcdTAzYzBcXHUwM2IxXFx1MDNiZFxcdTAzYWZcXHUwM2IxIiwKICAgICAgICAgICAgIlxcdTAzOTVcXHUwM2JiXFx1MDNiYlxcdTAzYWNcXHUwM2I0XFx1MDNiMSIsCiAgICAgICAgICAgICJcXHUwMzlkXFx1MDNiZlxcdTAzYzFcXHUwM2IyXFx1MDNiN1xcdTAzYjNcXHUwM2FmXFx1MDNiMSIsCiAgICAgICAgICAgICIiLAogICAgICAgICAgICAiIiwKICAgICAgICAgICAgIlxcdTAzOUFcXHUwM0FGXFx1MDNCRFxcdTAzQjEiCiAgICAgICAgfSwKICAgICAgICAvLyBkaXNwbGF5IHZhcmlhbnQgKEdyZWVrKQogICAgICAgIHsgICAiIiwgIiIsICIiLCAiIiwgIk5ZIiwgIiIsICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICAgICAgeyAgICJcXHUwMzkxXFx1MDNiM1xcdTAzYjNcXHUwM2JiXFx1MDNiOVxcdTAzYmFcXHUwM2FjIChcXHUwMzk3XFx1MDNCRFxcdTAzQzlcXHUwM0JDXFx1MDNBRFxcdTAzQkRcXHUwM0I1XFx1MDNDMiBcXHUwM0EwXFx1MDNCRlxcdTAzQkJcXHUwM0I5XFx1MDNDNFxcdTAzQjVcXHUwM0FGXFx1MDNCNVxcdTAzQzIpIiwKICAgICAgICAgICAgIlxcdTAzOTNcXHUwM2IxXFx1MDNiYlxcdTAzYmJcXHUwM2I5XFx1MDNiYVxcdTAzYWMgKFxcdTAzOTNcXHUwM2IxXFx1MDNiYlxcdTAzYmJcXHUwM2FmXFx1MDNiMSkiLAogICAgICAgICAgICAiXFx1MDM5YVxcdTAzYjFcXHUwM2M0XFx1MDNiMVxcdTAzYmJcXHUwM2IxXFx1MDNiZFxcdTAzYjlcXHUwM2JhXFx1MDNhYyAoXFx1MDM5OVxcdTAzYzNcXHUwM2MwXFx1MDNiMVxcdTAzYmRcXHUwM2FmXFx1MDNiMSkiLAogICAgICAgICAgICAiXFx1MDM5NVxcdTAzYmJcXHUwM2JiXFx1MDNiN1xcdTAzYmRcXHUwM2I5XFx1MDNiYVxcdTAzYWMgKFxcdTAzOTVcXHUwM2JiXFx1MDNiYlxcdTAzYWNcXHUwM2I0XFx1MDNiMSkiLAogICAgICAgICAgICAiXFx1MDM5ZFxcdTAzYmZcXHUwM2MxXFx1MDNiMlxcdTAzYjdcXHUwM2IzXFx1MDNiOVxcdTAzYmFcXHUwM2FjIChcXHUwMzlkXFx1MDNiZlxcdTAzYzFcXHUwM2IyXFx1MDNiN1xcdTAzYjNcXHUwM2FmXFx1MDNiMSwgTlkpIiwKICAgICAgICAgICAgIlxcdTAzOTlcXHUwM2M0XFx1MDNiMVxcdTAzYmJcXHUwM2I5XFx1MDNiYVxcdTAzYWMiLAogICAgICAgICAgICAiIiwKICAgICAgICAgICAgIlxcdTAzOUFcXHUwM0I5XFx1MDNCRFxcdTAzQjVcXHUwM0I2XFx1MDNCOVxcdTAzQkFcXHUwM0FDIChIYW5zLCBcXHUwMzlBXFx1MDNBRlxcdTAzQkRcXHUwM0IxKSIKICAgICAgICB9LAoKICAgICAgICAvLyBkaXNwbGF5IGxhbmdhZ2UgKDxyb290PikKICAgICAgICB7ICAgIkVuZ2xpc2giLCAgIkZyZW5jaCIsICAgIkNhdGFsYW4iLCAiR3JlZWsiLCAgICAiTm9yd2VnaWFuIiwgICAgIkl0YWxpYW4iLCAgInh4IiwgIiIgfSwKICAgICAgICAvLyBkaXNwbGF5IHNjcmlwdCAoPHJvb3Q+KQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICIiLCAgICAgIiIsICIifSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKDxyb290PikKICAgICAgICB7ICAgIlVuaXRlZCBTdGF0ZXMiLCAgICAiRnJhbmNlIiwgICAiU3BhaW4iLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiLCAiIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoPHJvb3Q+KQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiwgICAiIiwgICAgICIiLCAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lICg8cm9vdD4pCiAgICAgICAgLy97ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDYXRhbGFuIChTcGFpbikiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksTnlub3JzaykiLCAiSXRhbGlhbiIsICJ4eCAoWVkpIiB9LAogICAgICAgIHsgICAiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykiLCAiRnJlbmNoIChGcmFuY2UpIiwgIkNhdGFsYW4gKFNwYWluKSIsICJHcmVlayAoR3JlZWNlKSIsICJOb3J3ZWdpYW4gKE5vcndheSxOWSkiLCAiSXRhbGlhbiIsICJ4eCAoWVkpIiwgIiIgfQp9OwoKLy8gKiB0ZXN0IG1hY3JvcwovKgogVXNhZ2U6CiAgICB0ZXN0X2NvbXBhcmUoICAgIEZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZCwKICAgICAgICAgICAgICAgICAgICAgICBUZXN0IG9mIHRoZSBmdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCByZXN1bHQgb2YgdGhlIHRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRhYmxlIHJlc3VsdAogICAgICAgICAgICAgICAgICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9jb21wYXJlKGk9MyxpLDMsIHNvbWVOdW1iZXJGb3JtYXR0ZXIoaSkpOwogICAgICAgdGVzdF9jb21wYXJlKDAsMSsxLDIsc29tZU51bWJlckZvcm1hdHRlcigxKzEpKTsKCiAgIE5vdGUgdGhhdCBpbiB0aGUgc2Vjb25kIGV4YW1wbGUgdGhlIGV4cHJlc3Npb24gaXMgMCwgYmVjYXVzZSB0aGUgZmNuIHByb2R1Y2VzIGl0J3Mgb3duIHJlc3VsdC4KCiAgIE1hY3JvIGlzIHVnbHkgYnV0IG1ha2VzIHRoZSB0ZXN0cyBwcmV0dHkuCiovCgojZGVmaW5lIHRlc3RfY29tcGFyZShleHByZXNzaW9uLHRlc3QsZXhwZWN0ZWQscHJpbnRhYmxlUmVzdWx0KSBcCiAgICB7IFwKICAgICAgICBleHByZXNzaW9uOyBcCiAgICAgICAgXAogICAgICAgIGlmKCh0ZXN0KSAhPSAoZXhwZWN0ZWQpKSBcCiAgICAgICAgICAgIGVycmxuKCJGQUlMOiAiICsgVW5pY29kZVN0cmluZygjZXhwcmVzc2lvbikgKyAiOyAtPiAiICsgcHJpbnRhYmxlUmVzdWx0ICsgIlxuIiArIFwKICAgICAgICAgICAgICAgICAgICAiICAgKCIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSArICIgIT0gIiArIFVuaWNvZGVTdHJpbmcoI2V4cGVjdGVkKSArICIpIiApOyBcCiAgICAgICAgZWxzZSBcCiAgICAgICAgICAgIGxvZ2xuKFVuaWNvZGVTdHJpbmcoI2V4cHJlc3Npb24pICsgIiAtPiAiICsgcHJpbnRhYmxlUmVzdWx0ICsgIiAoIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIikiKTsgXAogICAgfQoKCgoKLyoKIFVzYWdlOgogICAgdGVzdF9hc3NlcnRfcHJpbnQoICAgIFRlc3QgKHNob3VsZCBiZSBUUlVFKSwgIHByaW50YWJsZSAgKQoKICAgRXhhbXBsZToKICAgICAgIHRlc3RfYXNzZXJ0KGk9PTMsIHRvU3RyaW5nKGkpKTsKCiAgIHRoZSBtYWNybyBpcyB1Z2x5IGJ1dCBtYWtlcyB0aGUgdGVzdHMgcHJldHR5LgoqLwoKI2RlZmluZSB0ZXN0X2Fzc2VydF9wcmludCh0ZXN0LHByaW50KSBcCiAgICB7IFwKICAgICAgICBpZighKHRlc3QpKSBcCiAgICAgICAgICAgIGVycmxuKCJGQUlMOiAiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiIHdhcyBub3QgdHJ1ZS4iICsgIi0+ICIgKyBVbmljb2RlU3RyaW5nKHByaW50KSApOyBcCiAgICAgICAgZWxzZSBcCiAgICAgICAgICAgIGxvZ2xuKCJQQVNTOiBhc3NlcnRlZCAiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiLT4gIiArIFVuaWNvZGVTdHJpbmcocHJpbnQpKTsgXAogICAgfQoKCiNkZWZpbmUgdGVzdF9kdW1wTG9jYWxlKGwpIHsgVW5pY29kZVN0cmluZyBzKGwuZ2V0TmFtZSgpLCIiKTsgbG9nbG4oI2wgKyBVbmljb2RlU3RyaW5nKCIgPSAiKSArIHMpOyB9CgpMb2NhbGVUZXN0OjpMb2NhbGVUZXN0KCkKOiBkYXRhVGFibGUoTlVMTCkKewogICAgc2V0VXBEYXRhVGFibGUoKTsKfQoKTG9jYWxlVGVzdDo6fkxvY2FsZVRlc3QoKQp7CiAgICBpZiAoZGF0YVRhYmxlICE9IDApIHsKICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzMzsgaSsrKSB7CiAgICAgICAgICAgIGRlbGV0ZSBbXWRhdGFUYWJsZVtpXTsKICAgICAgICB9CiAgICAgICAgZGVsZXRlIFtdZGF0YVRhYmxlOwogICAgICAgIGRhdGFUYWJsZSA9IDA7CiAgICB9Cn0KCnZvaWQgTG9jYWxlVGVzdDo6cnVuSW5kZXhlZFRlc3QoIGludDMyX3QgaW5kZXgsIFVCb29sIGV4ZWMsIGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyKiAvKnBhciovICkKewogICAgc3dpdGNoIChpbmRleCkgewogICAgICAgIFRFU1RDQVNFKDAsIFRlc3RCYXNpY0dldHRlcnMpOwogICAgICAgIFRFU1RDQVNFKDEsIFRlc3RTaW1wbGVSZXNvdXJjZUluZm8pOwogICAgICAgIFRFU1RDQVNFKDIsIFRlc3REaXNwbGF5TmFtZXMpOwogICAgICAgIFRFU1RDQVNFKDMsIFRlc3RTaW1wbGVPYmplY3RTdHVmZik7CiAgICAgICAgVEVTVENBU0UoNCwgVGVzdFBPU0lYUGFyc2luZyk7CiAgICAgICAgVEVTVENBU0UoNSwgVGVzdEdldEF2YWlsYWJsZUxvY2FsZXMpOwogICAgICAgIFRFU1RDQVNFKDYsIFRlc3REYXRhRGlyZWN0b3J5KTsKICAgICAgICBURVNUQ0FTRSg3LCBUZXN0SVNPM0ZhbGxiYWNrKTsKICAgICAgICBURVNUQ0FTRSg4LCBUZXN0R2V0TGFuZ3NBbmRDb3VudHJpZXMpOwogICAgICAgIFRFU1RDQVNFKDksIFRlc3RTaW1wbGVEaXNwbGF5TmFtZXMpOwogICAgICAgIFRFU1RDQVNFKDEwLCBUZXN0VW5pbnN0YWxsZWRJU08zTmFtZXMpOwogICAgICAgIFRFU1RDQVNFKDExLCBUZXN0QXR5cGljYWxMb2NhbGVzKTsKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKICAgICAgICBURVNUQ0FTRSgxMiwgVGVzdFRoYWlDdXJyZW5jeUZvcm1hdCk7CiAgICAgICAgVEVTVENBU0UoMTMsIFRlc3RFdXJvU3VwcG9ydCk7CiNlbmRpZgogICAgICAgIFRFU1RDQVNFKDE0LCBUZXN0VG9TdHJpbmcpOwojaWYgIVVDT05GSUdfTk9fRk9STUFUVElORwogICAgICAgIFRFU1RDQVNFKDE1LCBUZXN0NDEzOTk0MCk7CiAgICAgICAgVEVTVENBU0UoMTYsIFRlc3Q0MTQzOTUxKTsKI2VuZGlmCiAgICAgICAgVEVTVENBU0UoMTcsIFRlc3Q0MTQ3MzE1KTsKICAgICAgICBURVNUQ0FTRSgxOCwgVGVzdDQxNDczMTcpOwogICAgICAgIFRFU1RDQVNFKDE5LCBUZXN0NDE0NzU1Mik7CiAgICAgICAgVEVTVENBU0UoMjAsIFRlc3RWYXJpYW50UGFyc2luZyk7CiNpZiAhVUNPTkZJR19OT19GT1JNQVRUSU5HCiAgICAgICAgVEVTVENBU0UoMjEsIFRlc3Q0MTA1ODI4KTsKI2VuZGlmCiAgICAgICAgVEVTVENBU0UoMjIsIFRlc3RTZXRJc0JvZ3VzKTsKICAgICAgICBURVNUQ0FTRSgyMywgVGVzdFBhcmFsbGVsQVBJVmFsdWVzKTsKICAgICAgICBURVNUQ0FTRSgyNCwgVGVzdEtleXdvcmRWYXJpYW50cyk7CiAgICAgICAgVEVTVENBU0UoMjUsIFRlc3RLZXl3b3JkVmFyaWFudFBhcnNpbmcpOwogICAgICAgIFRFU1RDQVNFKDI2LCBUZXN0R2V0QmFzZU5hbWUpOwogICAgICAgIFRFU1RDQVNFKDI3LCBUZXN0R2V0TG9jYWxlKTsKCiAgICAgICAgLy8ga2VlcCB0aGUgbGFzdCBpbmRleCBpbiBzeW5jIHdpdGggdGhlIGNvbmRpdGlvbiBpbiBkZWZhdWx0OgoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAoaW5kZXggPD0gMjcpIHsgLy8ga2VlcCB0aGlzIGluIHN5bmMgd2l0aCB0aGUgbGFzdCBpbmRleCEKICAgICAgICAgICAgICAgIG5hbWUgPSAiKHRlc3Qgb21pdHRlZCBieSAhVUNPTkZJR19OT19GT1JNQVRUSU5HKSI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuYW1lID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7IC8vbmVlZGVkIHRvIGVuZCBsb29wCiAgICB9Cn0KCnZvaWQgTG9jYWxlVGVzdDo6VGVzdEJhc2ljR2V0dGVycygpIHsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZW1wOwoKICAgIGludDMyX3QgaTsKICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKCIiKTsKICAgICAgICBpZiAocmF3RGF0YVtTQ1JJUFRdW2ldICYmIHJhd0RhdGFbU0NSSVBUXVtpXVswXSAhPSAwKSB7CiAgICAgICAgICAgIHRlc3RMb2NhbGUgPSBMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtTQ1JJUFRdW2ldLCByYXdEYXRhW0NUUlldW2ldLCByYXdEYXRhW1ZBUl1baV0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGVzdExvY2FsZSA9IExvY2FsZShyYXdEYXRhW0xBTkddW2ldLCByYXdEYXRhW0NUUlldW2ldLCByYXdEYXRhW1ZBUl1baV0pOwogICAgICAgIH0KICAgICAgICBsb2dsbigiVGVzdGluZyAiICsgKFVuaWNvZGVTdHJpbmcpdGVzdExvY2FsZS5nZXROYW1lKCkgKyAiLi4uIik7CgogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRMYW5ndWFnZSgpKSAhPSAoZGF0YVRhYmxlW0xBTkddW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0xBTkddW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0U2NyaXB0KCkpICE9IChkYXRhVGFibGVbU0NSSVBUXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIFNjcmlwdCBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbU0NSSVBUXVtpXSk7CiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldENvdW50cnkoKSkgIT0gKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0VmFyaWFudCgpKSAhPSAoZGF0YVRhYmxlW1ZBUl1baV0pKQogICAgICAgICAgICBlcnJsbigiICBWYXJpYW50IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtWQVJdW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TmFtZSgpKSAhPSAoZGF0YVRhYmxlW05BTUVdW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTG9jYWxlIG5hbWUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtOQU1FXVtpXSk7CiAgICB9CgogICAgbG9nbG4oIlNhbWUgdGhpbmcgd2l0aG91dCB2YXJpYW50IGNvZGVzLi4uIik7CiAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZSgiIik7CiAgICAgICAgaWYgKHJhd0RhdGFbU0NSSVBUXVtpXSAmJiByYXdEYXRhW1NDUklQVF1baV1bMF0gIT0gMCkgewogICAgICAgICAgICB0ZXN0TG9jYWxlID0gTG9jYWxlKHJhd0RhdGFbTEFOR11baV0sIHJhd0RhdGFbU0NSSVBUXVtpXSwgcmF3RGF0YVtDVFJZXVtpXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0ZXN0TG9jYWxlID0gTG9jYWxlKHJhd0RhdGFbTEFOR11baV0sIHJhd0RhdGFbQ1RSWV1baV0pOwogICAgICAgIH0KICAgICAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlbXA9dGVzdExvY2FsZS5nZXROYW1lKCkpICsgIi4uLiIpOwoKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TGFuZ3VhZ2UoKSkgIT0gKGRhdGFUYWJsZVtMQU5HXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCJMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTEFOR11baV0pOwogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRTY3JpcHQoKSkgIT0gKGRhdGFUYWJsZVtTQ1JJUFRdW2ldKSkKICAgICAgICAgICAgZXJybG4oIlNjcmlwdCBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbU0NSSVBUXVtpXSk7CiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldENvdW50cnkoKSkgIT0gKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCJDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtDVFJZXVtpXSk7CiAgICAgICAgaWYgKHRlc3RMb2NhbGUuZ2V0VmFyaWFudCgpWzBdICE9IDApCiAgICAgICAgICAgIGVycmxuKCJWYXJpYW50IGNvZGUgbWlzbWF0Y2g6IHNvbWV0aGluZyB2ZXJzdXMgXCJcIiIpOwogICAgfQoKICAgIGxvZ2xuKCJUZXN0aW5nIGxvbmcgbGFuZ3VhZ2UgbmFtZXMgYW5kIGdldHRlcnMiKTsKICAgIExvY2FsZSAgdGVzdDggPSBMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKCJ4LWtsaW5nb24tbGF0bi16eC51dGYzMmJlQHNwZWNpYWwiKTsKCiAgICB0ZW1wID0gdGVzdDguZ2V0TGFuZ3VhZ2UoKTsKICAgIGlmICh0ZW1wICE9IFVuaWNvZGVTdHJpbmcoIngta2xpbmdvbiIpICkKICAgICAgICBlcnJsbigiTGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiICB2ZXJzdXMgXCJ4LWtsaW5nb25cIiIpOwoKICAgIHRlbXAgPSB0ZXN0OC5nZXRTY3JpcHQoKTsKICAgIGlmICh0ZW1wICE9IFVuaWNvZGVTdHJpbmcoIkxhdG4iKSApCiAgICAgICAgZXJybG4oIlNjcmlwdCBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgIHZlcnN1cyBcIkxhdG5cIiIpOwoKICAgIHRlbXAgPSB0ZXN0OC5nZXRDb3VudHJ5KCk7CiAgICBpZiAodGVtcCAhPSBVbmljb2RlU3RyaW5nKCJaWCIpICkKICAgICAgICBlcnJsbigiQ291bnRyeSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgIHZlcnN1cyBcIlpYXCIiKTsKCiAgICB0ZW1wID0gdGVzdDguZ2V0VmFyaWFudCgpOwogICAgaWYgKHRlbXAgIT0gVW5pY29kZVN0cmluZygiU1BFQ0lBTCIpICkKICAgICAgICBlcnJsbigiVmFyaWFudCBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgIHZlcnN1cyBcIlNQRUNJQUxcIiIpOwoKICAgIGlmIChMb2NhbGU6OmdldERlZmF1bHQoKSAhPSBMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKE5VTEwpKQogICAgICAgIGVycmxuKCJMb2NhbGU6OmdldERlZmF1bHQoKSA9PSBMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKE5VTEwpIik7CgogICAgLyotLS0tLS0tLS0tKi8KICAgIC8vIE5PVEU6IFRoZXJlIHVzZWQgdG8gYmUgYSBzcGVjaWFsIHRlc3QgZm9yIGxvY2FsZSBuYW1lcyB0aGF0IGhhZCBsYW5ndWFnZSBvcgogICAgLy8gY291bnRyeSBjb2RlcyB0aGF0IHdlcmUgbG9uZ2VyIHRoYW4gdHdvIGxldHRlcnMuICBUaGUgbmV3IHZlcnNpb24gb2YgTG9jYWxlCiAgICAvLyBkb2Vzbid0IHN1cHBvcnQgYW55dGhpbmcgdGhhdCBpc24ndCBhbiBvZmZpY2lhbGx5IHJlY29nbml6ZWQgbGFuZ3VhZ2Ugb3IKICAgIC8vIGNvdW50cnkgY29kZSwgc28gd2Ugbm8gbG9uZ2VyIHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoKICAgIExvY2FsZSBib2d1c0xhbmcoIlRISVNJU0FCT0dVU0xBTkdVQUdFIik7IC8vIEppdHRlcmJ1ZyAyODY0OiBsYW5ndWFnZSBjb2RlIHRvbyBsb25nCiAgICBpZighYm9ndXNMYW5nLmlzQm9ndXMoKSkgewogICAgICAgIGVycmxuKCJMb2NhbGUoXCJUSElTSVNBQk9HVVNMQU5HVUFHRVwiKS5pc0JvZ3VzKCk9PUZBTFNFIik7CiAgICB9CgogICAgYm9ndXNMYW5nPUxvY2FsZSgiZW8iKTsKICAgIGlmKCBib2d1c0xhbmcuaXNCb2d1cygpIHx8CiAgICAgICAgc3RyY21wKGJvZ3VzTGFuZy5nZXRMYW5ndWFnZSgpLCAiZW8iKSE9MCB8fAogICAgICAgICpib2d1c0xhbmcuZ2V0Q291bnRyeSgpIT0wIHx8CiAgICAgICAgKmJvZ3VzTGFuZy5nZXRWYXJpYW50KCkhPTAgfHwKICAgICAgICBzdHJjbXAoYm9ndXNMYW5nLmdldE5hbWUoKSwgImVvIikhPTAKICAgICkgewogICAgICAgIGVycmxuKCJhc3NpZ25tZW50IHRvIGJvZ3VzIExvY2FsZSBkb2VzIG5vdCB1bmJvZ3VzIGl0IG9yIHNldHMgYmFkIGRhdGEiKTsKICAgIH0KCiAgICBMb2NhbGUgYSgiZW9fREVAY3VycmVuY3k9REVNIik7CiAgICBMb2NhbGUgKnBiPWEuY2xvbmUoKTsKICAgIGlmKHBiPT0mYSB8fCAqcGIhPWEpIHsKICAgICAgICBlcnJsbigiTG9jYWxlLmNsb25lKCkgZmFpbGVkIik7CiAgICB9CiAgICBkZWxldGUgcGI7Cn0KCnZvaWQgTG9jYWxlVGVzdDo6VGVzdFBhcmFsbGVsQVBJVmFsdWVzKCkgewogICAgbG9nbG4oIlRlc3Qgc3luY2hyb25pemF0aW9uIGJldHdlZW4gQyBhbmQgQysrIEFQSSIpOwogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldENoaW5lc2UoKS5nZXROYW1lKCksIFVMT0NfQ0hJTkVTRSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19DSElORVNFIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEVuZ2xpc2goKS5nZXROYW1lKCksIFVMT0NfRU5HTElTSCkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19FTkdMSVNIIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEZyZW5jaCgpLmdldE5hbWUoKSwgVUxPQ19GUkVOQ0gpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfRlJFTkNIIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEdlcm1hbigpLmdldE5hbWUoKSwgVUxPQ19HRVJNQU4pICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfR0VSTUFOIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEl0YWxpYW4oKS5nZXROYW1lKCksIFVMT0NfSVRBTElBTikgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19JVEFMSUFOIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEphcGFuZXNlKCkuZ2V0TmFtZSgpLCBVTE9DX0pBUEFORVNFKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0pBUEFORVNFIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEtvcmVhbigpLmdldE5hbWUoKSwgVUxPQ19LT1JFQU4pICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfS09SRUFOIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldFNpbXBsaWZpZWRDaGluZXNlKCkuZ2V0TmFtZSgpLCBVTE9DX1NJTVBMSUZJRURfQ0hJTkVTRSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19TSU1QTElGSUVEX0NISU5FU0UgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0VHJhZGl0aW9uYWxDaGluZXNlKCkuZ2V0TmFtZSgpLCBVTE9DX1RSQURJVElPTkFMX0NISU5FU0UpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfVFJBRElUSU9OQUxfQ0hJTkVTRSBMb2NhbGUiKTsKICAgIH0KCgogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldENhbmFkYSgpLmdldE5hbWUoKSwgVUxPQ19DQU5BREEpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfQ0FOQURBIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldENhbmFkYUZyZW5jaCgpLmdldE5hbWUoKSwgVUxPQ19DQU5BREFfRlJFTkNIKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0NBTkFEQV9GUkVOQ0ggTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0Q2hpbmEoKS5nZXROYW1lKCksIFVMT0NfQ0hJTkEpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfQ0hJTkEgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0UFJDKCkuZ2V0TmFtZSgpLCBVTE9DX1BSQykgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19QUkMgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0RnJhbmNlKCkuZ2V0TmFtZSgpLCBVTE9DX0ZSQU5DRSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19GUkFOQ0UgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0R2VybWFueSgpLmdldE5hbWUoKSwgVUxPQ19HRVJNQU5ZKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0dFUk1BTlkgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0SXRhbHkoKS5nZXROYW1lKCksIFVMT0NfSVRBTFkpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfSVRBTFkgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0SmFwYW4oKS5nZXROYW1lKCksIFVMT0NfSkFQQU4pICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfSkFQQU4gTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0S29yZWEoKS5nZXROYW1lKCksIFVMT0NfS09SRUEpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfS09SRUEgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0VGFpd2FuKCkuZ2V0TmFtZSgpLCBVTE9DX1RBSVdBTikgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19UQUlXQU4gTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0VUsoKS5nZXROYW1lKCksIFVMT0NfVUspICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfVUsgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0VVMoKS5nZXROYW1lKCksIFVMT0NfVVMpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfVVMgTG9jYWxlIik7CiAgICB9Cn0KCgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RTaW1wbGVSZXNvdXJjZUluZm8oKSB7CiAgICBVbmljb2RlU3RyaW5nICAgdGVtcDsKICAgIGNoYXIgICAgICAgICAgICB0ZW1wMlsyMF07CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgIGludDMyX3QgaSA9IDA7CgogICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtDVFJZXVtpXSwgcmF3RGF0YVtWQVJdW2ldKTsKICAgICAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlbXA9dGVzdExvY2FsZS5nZXROYW1lKCkpICsgIi4uLiIpOwoKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkpICE9IChkYXRhVGFibGVbTEFORzNdW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgSVNPLTMgbGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICAgICAgICAgICsgIiB2ZXJzdXMgIiArIGRhdGFUYWJsZVtMQU5HM11baV0pOwogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRJU08zQ291bnRyeSgpKSAhPSAoZGF0YVRhYmxlW0NUUlkzXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIElTTy0zIGNvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICAgICAgICAgICsgIiB2ZXJzdXMgIiArIGRhdGFUYWJsZVtDVFJZM11baV0pOwoKICAgICAgICBzcHJpbnRmKHRlbXAyLCAiJXgiLCB0ZXN0TG9jYWxlLmdldExDSUQoKSk7CiAgICAgICAgaWYgKFVuaWNvZGVTdHJpbmcodGVtcDIpICE9IGRhdGFUYWJsZVtMQ0lEXVtpXSkKICAgICAgICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIiAgTENJRCBtaXNtYXRjaDogIiArIHRlbXAyICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTENJRF1baV0pOwoKICAgICAgICBpZihVX0ZBSUxVUkUoZXJyKSkKICAgICAgICB7CiAgICAgICAgICAgIGVycmxuKChVbmljb2RlU3RyaW5nKSJTb21lIGVycm9yIG9uIG51bWJlciAiICsgaSArIHVfZXJyb3JOYW1lKGVycikpOwogICAgICAgIH0KICAgICAgICBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICB9CgogICAgTG9jYWxlIGxvY2FsZSgiZW4iKTsKICAgIGlmKHN0cmNtcChsb2NhbGUuZ2V0TmFtZSgpLCAiZW4iKSAhPSAwfHwKICAgICAgICBzdHJjbXAobG9jYWxlLmdldExhbmd1YWdlKCksICJlbiIpICE9IDApIHsKICAgICAgICBlcnJsbigiY29uc3RydWN0aW9uIG9mIExvY2FsZShlbikgZmFpbGVkXG4iKTsKICAgIH0KICAgIC8qLS0tLS0qLwoKfQoKLyoKICogSml0dGVyYnVnIDI0MzkgLS0gbWFya3VzIDIwMDMwNDI1CiAqCiAqIFRoZSBsb29rdXAgb2YgZGlzcGxheSBuYW1lcyBtdXN0IG5vdCBmYWxsIGJhY2sgdGhyb3VnaCB0aGUgZGVmYXVsdAogKiBsb2NhbGUgYmVjYXVzZSB0aGF0IHlpZWxkcyB1c2VsZXNzIHJlc3VsdHMuCiAqLwp2b2lkCkxvY2FsZVRlc3Q6OlRlc3REaXNwbGF5TmFtZXMoKQp7CiAgICBMb2NhbGUgIGVuZ2xpc2goImVuIiwgIlVTIik7CiAgICBMb2NhbGUgIGZyZW5jaCgiZnIiLCAiRlIiKTsKICAgIExvY2FsZSAgY3JvYXRpYW4oImNhIiwgIkVTIik7CiAgICBMb2NhbGUgIGdyZWVrKCJlbCIsICJHUiIpOwoKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVuX1VTLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW5nbGlzaCwgRExBTkdfRU4pOwogICAgbG9nbG4oIiAgSW4gbG9jYWxlID0gZnJfRlIuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhmcmVuY2gsIERMQU5HX0ZSKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGNhX0VTLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoY3JvYXRpYW4sIERMQU5HX0NBKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVsX0dSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZ3JlZWssIERMQU5HX0VMKTsKCiAgICAvKiB0ZXN0IHRoYXQgdGhlIGRlZmF1bHQgbG9jYWxlIGhhcyBhIGRpc3BsYXkgbmFtZSBmb3IgaXRzIG93biBsYW5ndWFnZSAqLwogICAgVW5pY29kZVN0cmluZyBzOwogICAgTG9jYWxlKCkuZ2V0RGlzcGxheUxhbmd1YWdlKExvY2FsZSgpLCBzKTsKICAgIGlmKHMubGVuZ3RoKCk8PTMgJiYgcy5jaGFyQXQoMCk8PTB4N2YpIHsKICAgICAgICAvKiBjaGVjayA8PTMgdG8gcmVqZWN0IGdldHRpbmcgdGhlIGxhbmd1YWdlIGNvZGUgYXMgYSBkaXNwbGF5IG5hbWUgKi8KICAgICAgICBlcnJsbigidW5hYmxlIHRvIGdldCBhIGRpc3BsYXkgc3RyaW5nIGZvciB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGRlZmF1bHQgbG9jYWxlXG4iKTsKICAgIH0KCiAgICAvKgogICAgICogQVBJIGNvdmVyYWdlIGltcHJvdmVtZW50czogY2FsbAogICAgICogTG9jYWxlOjpnZXREaXNwbGF5TGFuZ3VhZ2UoVW5pY29kZVN0cmluZyAmKSBhbmQKICAgICAqIExvY2FsZTo6Z2V0RGlzcGxheUNvdW50cnkoVW5pY29kZVN0cmluZyAmKQogICAgICovCiAgICBzLnJlbW92ZSgpOwogICAgTG9jYWxlKCkuZ2V0RGlzcGxheUxhbmd1YWdlKHMpOwogICAgaWYocy5sZW5ndGgoKTw9MyAmJiBzLmNoYXJBdCgwKTw9MHg3ZikgewogICAgICAgIGVycmxuKCJ1bmFibGUgdG8gZ2V0IGEgZGlzcGxheSBzdHJpbmcgZm9yIHRoZSBsYW5ndWFnZSBvZiB0aGUgZGVmYXVsdCBsb2NhbGUgWzJdXG4iKTsKICAgIH0KICAgIHMucmVtb3ZlKCk7CiAgICBmcmVuY2guZ2V0RGlzcGxheUNvdW50cnkocyk7CiAgICBpZihzLmlzRW1wdHkoKSkgewogICAgICAgIGVycmxuKCJ1bmFibGUgdG8gZ2V0IGFueSBkZWZhdWx0LWxvY2FsZSBkaXNwbGF5IHN0cmluZyBmb3IgdGhlIGNvdW50cnkgb2YgZnJfRlJcbiIpOwogICAgfQp9CgovKgogVXNhZ2U6CiAgICB0ZXN0X2Fzc2VydCggICAgVGVzdCAoc2hvdWxkIGJlIFRSVUUpICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9hc3NlcnQoaT09Myk7CgogICB0aGUgbWFjcm8gaXMgdWdseSBidXQgbWFrZXMgdGhlIHRlc3RzIHByZXR0eS4KKi8KCiNkZWZpbmUgdGVzdF9hc3NlcnQodGVzdCkgXAogICAgeyBcCiAgICAgICAgaWYoISh0ZXN0KSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIiB3YXMgbm90IHRydWUuICIgKyBVbmljb2RlU3RyaW5nKF9fRklMRV9fICIgbGluZSAiKSArIF9fTElORV9fICk7IFwKICAgICAgICBlbHNlIFwKICAgICAgICAgICAgbG9nbG4oIlBBU1M6IGFzc2VydGVkICIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSApOyBcCiAgICB9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RTaW1wbGVPYmplY3RTdHVmZigpIHsKICAgIExvY2FsZSAgdGVzdDEoImFhIiwgIkFBIik7CiAgICBMb2NhbGUgIHRlc3QyKCJhYSIsICJBQSIpOwogICAgTG9jYWxlICB0ZXN0Myh0ZXN0MSk7CiAgICBMb2NhbGUgIHRlc3Q0KCJ6eiIsICJaWiIpOwogICAgTG9jYWxlICB0ZXN0NSgiYWEiLCAiQUEiLCAiIik7CiAgICBMb2NhbGUgIHRlc3Q2KCJhYSIsICJBQSIsICJBTlRBUkVTIik7CiAgICBMb2NhbGUgIHRlc3Q3KCJhYSIsICJBQSIsICJKVVBJVEVSIik7CiAgICBMb2NhbGUgIHRlc3Q4ID0gTG9jYWxlOjpjcmVhdGVGcm9tTmFtZSgiYWEtYWEudXRmOEBqdXBpdGVyIik7CgogICAgLy8gbm93IGxpc3QgdGhlbSBhbGwgZm9yIGRlYnVnZ2luZyB1c2FnZS4KICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0MSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDIpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QzKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NCk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDUpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q2KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nyk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDgpOwoKICAgIC8vIE1ha2Ugc3VyZSB0aGluZ3MgY29tcGFyZSB0byB0aGVtc2VsdmVzIQogICAgdGVzdF9hc3NlcnQodGVzdDEgPT0gdGVzdDEpOwogICAgdGVzdF9hc3NlcnQodGVzdDIgPT0gdGVzdDIpOwogICAgdGVzdF9hc3NlcnQodGVzdDMgPT0gdGVzdDMpOwogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDQpOwogICAgdGVzdF9hc3NlcnQodGVzdDUgPT0gdGVzdDUpOwogICAgdGVzdF9hc3NlcnQodGVzdDYgPT0gdGVzdDYpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDggPT0gdGVzdDgpOwoKICAgIC8vIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIG5vdCBlcXVhbCB0byB0aGVtc2VsdmVzLgogICAgdGVzdF9hc3NlcnQoISh0ZXN0MSAhPSB0ZXN0MSkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MiAhPSB0ZXN0MikpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MyAhPSB0ZXN0MykpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0NCAhPSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0NSAhPSB0ZXN0NSkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0NiAhPSB0ZXN0NikpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0NyAhPSB0ZXN0NykpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0OCAhPSB0ZXN0OCkpOwoKICAgIC8vIG1ha2Ugc3VyZSB0aGluZ3MgdGhhdCBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBkb24ndCBzaG93IHVwIGFzIHVuZXF1YWwuCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxICE9IHRlc3QyKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyICE9IHRlc3QxKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxICE9IHRlc3QzKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyICE9IHRlc3QzKSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Mik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0NSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDYgIT0gdGVzdDcpOwoKICAgIC8vIHRlc3QgZm9yIHRoaW5ncyB0aGF0IHNob3VsZG4ndCBjb21wYXJlIGVxdWFsLgogICAgdGVzdF9hc3NlcnQoISh0ZXN0MSA9PSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MiA9PSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MyA9PSB0ZXN0NCkpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3Q3ID09IHRlc3Q4KTsKCiAgICAvLyB0ZXN0IGZvciBoYXNoIGNvZGVzIHRvIGJlIHRoZSBzYW1lLgogICAgaW50MzJfdCBoYXNoMSA9IHRlc3QxLmhhc2hDb2RlKCk7CiAgICBpbnQzMl90IGhhc2gyID0gdGVzdDIuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDMgPSB0ZXN0My5oYXNoQ29kZSgpOwoKICAgIHRlc3RfYXNzZXJ0KGhhc2gxID09IGhhc2gyKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gxID09IGhhc2gzKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gyID09IGhhc2gzKTsKCiAgICAvLyB0ZXN0IHRoYXQgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3Igd29ya3MuCiAgICB0ZXN0NCA9IHRlc3QxOwogICAgbG9nbG4oInRlc3Q0PXRlc3QxOyIpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q0KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3Q0KTsKCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxICE9IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyICE9IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QzICE9IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NCA9PSB0ZXN0MSk7CgogICAgLy8gdGVzdCBhc3NpZ25tZW50cyB3aXRoIGEgdmFyaWFudAogICAgbG9nbG4oInRlc3Q3ID0gdGVzdDYiKTsKICAgIHRlc3Q3ID0gdGVzdDY7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDYpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgIT0gdGVzdDUpOwoKICAgIGxvZ2xuKCJ0ZXN0NiA9IHRlc3QxIik7CiAgICB0ZXN0Nj10ZXN0MTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0Nik7Cn0KCi8vIEEgY2xhc3Mgd2hpY2ggZXhwb3NlcyBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIFBPU0lYIHBhcnNpbmcgY29kZS4KY2xhc3MgUE9TSVhMb2NhbGUgOiBwdWJsaWMgTG9jYWxlCnsKcHVibGljOgogICAgUE9TSVhMb2NhbGUoY29uc3QgVW5pY29kZVN0cmluZyYgbCkKICAgICAgICA6TG9jYWxlKCkKICAgIHsKICAgICAgY2hhciAqY2g7CiAgICAgIGNoID0gbmV3IGNoYXJbbC5sZW5ndGgoKSArIDFdOwogICAgICBjaFtsLmV4dHJhY3QoMCwgMHg3ZmZmZmZmZiwgY2gsICIiKV0gPSAwOwogICAgICBzZXRGcm9tUE9TSVhJRChjaCk7CiAgICAgIGRlbGV0ZSBbXSBjaDsKICAgIH0KICAgIFBPU0lYTG9jYWxlKGNvbnN0IGNoYXIgKmwpCiAgICAgICAgOkxvY2FsZSgpCiAgICB7CiAgICAgICAgc2V0RnJvbVBPU0lYSUQobCk7CiAgICB9Cn07Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RQT1NJWFBhcnNpbmcoKQp7CiAgICBQT1NJWExvY2FsZSAgdGVzdDEoImFiX0FCIik7CiAgICBQT1NJWExvY2FsZSAgdGVzdDIoVW5pY29kZVN0cmluZygiYWJfQUIiKSk7CiAgICBMb2NhbGUgIHRlc3QzKCJhYiIsIkFCIik7CgogICAgUE9TSVhMb2NhbGUgdGVzdDQoImFiX0FCX0FudGFyZXMiKTsKICAgIFBPU0lYTG9jYWxlIHRlc3Q1KFVuaWNvZGVTdHJpbmcoImFiX0FCX0FudGFyZXMiKSk7CiAgICBMb2NhbGUgIHRlc3Q2KCJhYiIsICJBQiIsICJBbnRhcmVzIik7CgogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QxKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Mik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDMpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q0KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDYpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3QxID09IHRlc3QxKTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0Mik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MiA9PSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MyA9PSB0ZXN0MSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDUpOwogICAgdGVzdF9hc3NlcnQodGVzdDUgPT0gdGVzdDYpOwogICAgdGVzdF9hc3NlcnQodGVzdDYgPT0gdGVzdDQpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3QxICE9IHRlc3Q0KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ICE9IHRlc3QzKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ICE9IHRlc3QyKTsKCiAgICBpbnQzMl90IGhhc2gxID0gdGVzdDEuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDIgPSB0ZXN0Mi5oYXNoQ29kZSgpOwogICAgaW50MzJfdCBoYXNoMyA9IHRlc3QzLmhhc2hDb2RlKCk7CgogICAgdGVzdF9hc3NlcnQoaGFzaDEgPT0gaGFzaDIpOwogICAgdGVzdF9hc3NlcnQoaGFzaDIgPT0gaGFzaDMpOwogICAgdGVzdF9hc3NlcnQoaGFzaDMgPT0gaGFzaDEpOwp9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RHZXRBdmFpbGFibGVMb2NhbGVzKCkKewogICAgaW50MzJfdCBsb2NDb3VudCA9IDA7CiAgICBjb25zdCBMb2NhbGUqIGxvY0xpc3QgPSBMb2NhbGU6OmdldEF2YWlsYWJsZUxvY2FsZXMobG9jQ291bnQpOwoKICAgIGlmIChsb2NDb3VudCA9PSAwKQogICAgICAgIGVycmxuKCJnZXRBdmFpbGFibGVMb2NhbGVzKCkgcmV0dXJuZWQgYW4gZW1wdHkgbGlzdCEiKTsKICAgIGVsc2UgewogICAgICAgIGxvZ2xuKFVuaWNvZGVTdHJpbmcoIk51bWJlciBvZiBsb2NhbGVzIHJldHVybmVkID0gIikgKyBsb2NDb3VudCk7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbG9jQ291bnQ7ICsraSkKICAgICAgICAgICAgbG9nbG4obG9jTGlzdFtpXS5nZXROYW1lKCkpOwogICAgfQogICAgLy8gSSBoYXZlIG5vIGlkZWEgaG93IHRvIHRlc3QgdGhpcyBmdW5jdGlvbi4uLgp9CgovLyBUaGlzIHRlc3QgaXNuJ3QgYXBwbGljYWJsZSBhbnltb3JlIC0gZ2V0SVNPM0xhbmd1YWdlIGlzCi8vIGluZGVwZW5kZW50IG9mIHRoZSBkYXRhIGRpcmVjdG9yeQp2b2lkIExvY2FsZVRlc3Q6OlRlc3REYXRhRGlyZWN0b3J5KCkKewovKgogICAgY2hhciAgICAgICAgICAgIG9sZERpcmVjdG9yeVs4MF07CiAgICBjb25zdCBjaGFyKiAgICAgdGVtcDsKICAgIFVFcnJvckNvZGUgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgVW5pY29kZVN0cmluZyAgIHRlc3RWYWx1ZTsKCiAgICB0ZW1wID0gTG9jYWxlOjpnZXREYXRhRGlyZWN0b3J5KCk7CiAgICBzdHJjcHkob2xkRGlyZWN0b3J5LCB0ZW1wKTsKICAgIGxvZ2xuKFVuaWNvZGVTdHJpbmcoIm9sZERpcmVjdG9yeSA9ICIpICsgb2xkRGlyZWN0b3J5KTsKCiAgICBMb2NhbGUgIHRlc3QoTG9jYWxlOjpVUyk7CiAgICB0ZXN0LmdldElTTzNMYW5ndWFnZSh0ZXN0VmFsdWUpOwogICAgbG9nbG4oImZpcnN0IGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAiICsgdGVzdFZhbHVlKTsKICAgIGlmICh0ZXN0VmFsdWUgIT0gImVuZyIpCiAgICAgICAgZXJybG4oIkluaXRpYWwgY2hlY2sgb2YgSVNPMyBsYW5ndWFnZSBmYWlsZWQ6IGV4cGVjdGVkIFwiZW5nXCIsIGdvdCBcIiIgKyB0ZXN0VmFsdWUgKyAiXCIiKTsKCiAgICB7CiAgICAgICAgY2hhciAqcGF0aDsKICAgICAgICBwYXRoPUludGxUZXN0OjpnZXRUZXN0RGlyZWN0b3J5KCk7CiAgICAgICAgTG9jYWxlOjpzZXREYXRhRGlyZWN0b3J5KCBwYXRoICk7CiAgICB9CgogICAgdGVzdC5nZXRJU08zTGFuZ3VhZ2UodGVzdFZhbHVlKTsKICAgIGxvZ2xuKCJzZWNvbmQgZmV0Y2ggb2YgbGFuZ3VhZ2UgcmV0cmlldmVkICIgKyB0ZXN0VmFsdWUpOwogICAgaWYgKHRlc3RWYWx1ZSAhPSAieHh4IikKICAgICAgICBlcnJsbigic2V0RGF0YURpcmVjdG9yeSgpIGZhaWxlZDogZXhwZWN0ZWQgXCJ4eHhcIiwgZ290IFwiIiArIHRlc3RWYWx1ZSArICJcIiIpOwoKICAgIExvY2FsZTo6c2V0RGF0YURpcmVjdG9yeShvbGREaXJlY3RvcnkpOwogICAgdGVzdC5nZXRJU08zTGFuZ3VhZ2UodGVzdFZhbHVlKTsKICAgIGxvZ2xuKCJ0aGlyZCBmZXRjaCBvZiBsYW5ndWFnZSByZXRyaWV2ZWQgIiArIHRlc3RWYWx1ZSk7CiAgICBpZiAodGVzdFZhbHVlICE9ICJlbmciKQogICAgICAgIGVycmxuKCJnZXQvc2V0RGF0YURpcmVjdG9yeSgpIGZhaWxlZDogZXhwZWN0ZWQgXCJlbmdcIiwgZ290IFwiIiArIHRlc3RWYWx1ZSArICJcIiIpOwoqLwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp2b2lkIExvY2FsZVRlc3Q6OmRvVGVzdERpc3BsYXlOYW1lcyhMb2NhbGUmIGRpc3BsYXlMb2NhbGUsIGludDMyX3QgY29tcGFyZUluZGV4KSB7CiAgICBVbmljb2RlU3RyaW5nICAgdGVtcDsKCiAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKCIiKTsKICAgICAgICBpZiAocmF3RGF0YVtTQ1JJUFRdW2ldICYmIHJhd0RhdGFbU0NSSVBUXVtpXVswXSAhPSAwKSB7CiAgICAgICAgICAgIHRlc3RMb2NhbGUgPSBMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtTQ1JJUFRdW2ldLCByYXdEYXRhW0NUUlldW2ldLCByYXdEYXRhW1ZBUl1baV0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGVzdExvY2FsZSA9IExvY2FsZShyYXdEYXRhW0xBTkddW2ldLCByYXdEYXRhW0NUUlldW2ldLCByYXdEYXRhW1ZBUl1baV0pOwogICAgICAgIH0KICAgICAgICBsb2dsbigiICBUZXN0aW5nICIgKyAodGVtcD10ZXN0TG9jYWxlLmdldE5hbWUoKSkgKyAiLi4uIik7CgogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RMYW5nOwogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RTY3JpcHQ7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdEN0cnk7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdFZhcjsKICAgICAgICBVbmljb2RlU3RyaW5nICB0ZXN0TmFtZTsKCiAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5TGFuZ3VhZ2UoZGlzcGxheUxvY2FsZSwgdGVzdExhbmcpOwogICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheVNjcmlwdChkaXNwbGF5TG9jYWxlLCB0ZXN0U2NyaXB0KTsKICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlDb3VudHJ5KGRpc3BsYXlMb2NhbGUsIHRlc3RDdHJ5KTsKICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlWYXJpYW50KGRpc3BsYXlMb2NhbGUsIHRlc3RWYXIpOwogICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheU5hbWUoZGlzcGxheUxvY2FsZSwgdGVzdE5hbWUpOwoKICAgICAgICBVbmljb2RlU3RyaW5nICBleHBlY3RlZExhbmc7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWRTY3JpcHQ7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWRDdHJ5OwogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkVmFyOwogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkTmFtZTsKCiAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleF1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkTGFuZy5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZExhbmcgPSBkYXRhVGFibGVbRExBTkdfRU5dW2ldOwoKICAgICAgICBleHBlY3RlZFNjcmlwdCA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAxXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRTY3JpcHQubGVuZ3RoKCkgPT0gMCkKICAgICAgICAgICAgZXhwZWN0ZWRTY3JpcHQgPSBkYXRhVGFibGVbRFNDUklQVF9FTl1baV07CgogICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAyXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRDdHJ5Lmxlbmd0aCgpID09IDApCiAgICAgICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtEQ1RSWV9FTl1baV07CgogICAgICAgIGV4cGVjdGVkVmFyID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDNdW2ldOwogICAgICAgIGlmIChleHBlY3RlZFZhci5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZFZhciA9IGRhdGFUYWJsZVtEVkFSX0VOXVtpXTsKCiAgICAgICAgZXhwZWN0ZWROYW1lID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDRdW2ldOwogICAgICAgIGlmIChleHBlY3RlZE5hbWUubGVuZ3RoKCkgPT0gMCkKICAgICAgICAgICAgZXhwZWN0ZWROYW1lID0gZGF0YVRhYmxlW0ROQU1FX0VOXVtpXTsKCiAgICAgICAgaWYgKHRlc3RMYW5nICE9IGV4cGVjdGVkTGFuZykKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgbGFuZ3VhZ2UgKCIgKyBVbmljb2RlU3RyaW5nKGRpc3BsYXlMb2NhbGUuZ2V0TmFtZSgpKSArICIpIG9mICgiICsgVW5pY29kZVN0cmluZyh0ZXN0TG9jYWxlLmdldE5hbWUoKSkgKyAiKSBnb3QgIiArIHRlc3RMYW5nICsgIiBleHBlY3RlZCAiICsgZXhwZWN0ZWRMYW5nKTsKICAgICAgICBpZiAodGVzdFNjcmlwdCAhPSBleHBlY3RlZFNjcmlwdCkKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgc2NyaXB0ICgiICsgVW5pY29kZVN0cmluZyhkaXNwbGF5TG9jYWxlLmdldE5hbWUoKSkgKyAiKSBvZiAoIiArIFVuaWNvZGVTdHJpbmcodGVzdExvY2FsZS5nZXROYW1lKCkpICsgIikgZ290ICIgKyB0ZXN0U2NyaXB0ICsgIiBleHBlY3RlZCAiICsgZXhwZWN0ZWRTY3JpcHQpOwogICAgICAgIGlmICh0ZXN0Q3RyeSAhPSBleHBlY3RlZEN0cnkpCiAgICAgICAgICAgIGVycmxuKCJEaXNwbGF5IGNvdW50cnkgKCIgKyBVbmljb2RlU3RyaW5nKGRpc3BsYXlMb2NhbGUuZ2V0TmFtZSgpKSArICIpIG9mICgiICsgVW5pY29kZVN0cmluZyh0ZXN0TG9jYWxlLmdldE5hbWUoKSkgKyAiKSBnb3QgIiArIHRlc3RDdHJ5ICsgIiBleHBlY3RlZCAiICsgZXhwZWN0ZWRDdHJ5KTsKICAgICAgICBpZiAodGVzdFZhciAhPSBleHBlY3RlZFZhcikKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgdmFyaWFudCAoIiArIFVuaWNvZGVTdHJpbmcoZGlzcGxheUxvY2FsZS5nZXROYW1lKCkpICsgIikgb2YgKCIgKyBVbmljb2RlU3RyaW5nKHRlc3RMb2NhbGUuZ2V0TmFtZSgpKSArICIpIGdvdCAiICsgdGVzdFZhciArICIgZXhwZWN0ZWQgIiArIGV4cGVjdGVkVmFyKTsKICAgICAgICBpZiAodGVzdE5hbWUgIT0gZXhwZWN0ZWROYW1lKQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSBuYW1lICgiICsgVW5pY29kZVN0cmluZyhkaXNwbGF5TG9jYWxlLmdldE5hbWUoKSkgKyAiKSBvZiAoIiArIFVuaWNvZGVTdHJpbmcodGVzdExvY2FsZS5nZXROYW1lKCkpICsgIikgZ290ICIgKyB0ZXN0TmFtZSArICIgZXhwZWN0ZWQgIiArIGV4cGVjdGVkTmFtZSk7CiAgICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRhYmxlIG9mIHZhbGlkIGRhdGEKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoKdm9pZCBMb2NhbGVUZXN0OjpzZXRVcERhdGFUYWJsZSgpCnsKICAgIGlmIChkYXRhVGFibGUgPT0gMCkgewogICAgICAgIGRhdGFUYWJsZSA9IG5ldyBVbmljb2RlU3RyaW5nKlszM107CgogICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDMzOyBpKyspIHsKICAgICAgICAgICAgZGF0YVRhYmxlW2ldID0gbmV3IFVuaWNvZGVTdHJpbmdbOF07CiAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDg7IGorKykgewogICAgICAgICAgICAgICAgZGF0YVRhYmxlW2ldW2pdID0gQ2hhcnNUb1VuaWNvZGVTdHJpbmcocmF3RGF0YVtpXVtqXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8vID09PT09PT09PT09PT09PT09PT09CgoKLyoqCiAqIEBidWcgNDAxMTc1NiA0MDExMzgwCiAqLwp2b2lkCkxvY2FsZVRlc3Q6OlRlc3RJU08zRmFsbGJhY2soKQp7CiAgICBMb2NhbGUgdGVzdCgieHgiLCAiWVkiKTsKCiAgICBjb25zdCBjaGFyICogcmVzdWx0OwoKICAgIHJlc3VsdCA9IHRlc3QuZ2V0SVNPM0xhbmd1YWdlKCk7CgogICAgLy8gQ29uZm9ybSB0byBDIEFQSSB1c2FnZQoKICAgIGlmICghcmVzdWx0IHx8IChyZXN1bHRbMF0gIT0gMCkpCiAgICAgICAgZXJybG4oImdldElTTzNMYW5ndWFnZSgpIG9uIHh4X1lZIHJldHVybmVkICIgKyBVbmljb2RlU3RyaW5nKHJlc3VsdCkgKyAiIGluc3RlYWQgb2YgXCJcIiIpOwoKICAgIHJlc3VsdCA9IHRlc3QuZ2V0SVNPM0NvdW50cnkoKTsKCiAgICBpZiAoIXJlc3VsdCB8fCAocmVzdWx0WzBdICE9IDApKQogICAgICAgIGVycmxuKCJnZXRJU08zQ291bnRyeSgpIG9uIHh4X1lZIHJldHVybmVkICIgKyBVbmljb2RlU3RyaW5nKHJlc3VsdCkgKyAiIGluc3RlYWQgb2YgXCJcIiIpOwp9CgovKioKICogQGJ1ZyA0MTA2MTU1IDQxMTg1ODcKICovCnZvaWQKTG9jYWxlVGVzdDo6VGVzdEdldExhbmdzQW5kQ291bnRyaWVzKCkKewogICAgLy8gSXQgZGlkbid0IHNlZW0gcmlnaHQgdG8ganVzdCBkbyBhbiBleGhhdXN0aXZlIHRlc3Qgb2YgZXZlcnl0aGluZyBoZXJlLCBzbyBJIGNoZWNrCiAgICAvLyBmb3IgdGhlIGZvbGxvd2luZyB0aGluZ3M6CiAgICAvLyAxKSBEb2VzIGVhY2ggbGlzdCBoYXZlIHRoZSByaWdodCB0b3RhbCBudW1iZXIgb2YgZW50cmllcz8KICAgIC8vIDIpIERvZXMgZWFjaCBsaXN0IGNvbnRhaW4gY2VydGFpbiBsYW5ndWFnZSBhbmQgY291bnRyeSBjb2RlcyB3ZSB0aGluayBhcmUgaW1wb3J0YW50CiAgICAvLyAgICAgKHRoZSBHNyBjb3VudHJpZXMsIHBsdXMgYSBjb3VwbGUgb3RoZXJzKT8KICAgIC8vIDMpIERvZXMgZWFjaCBsaXN0IGhhdmUgZXZlcnkgZW50cnkgZm9ybWF0dGVkIGNvcnJlY3RseT8gKGkuZS4sIHR3byBjaGFyYWN0ZXJzLAogICAgLy8gICAgIGFsbCBsb3dlciBjYXNlIGZvciB0aGUgbGFuZ3VhZ2UgY29kZXMsIGFsbCB1cHBlciBjYXNlIGZvciB0aGUgY291bnRyeSBjb2RlcykKICAgIC8vIDQpIElzIGVhY2ggbGlzdCBpbiBzb3J0ZWQgb3JkZXI/CiAgICBpbnQzMl90IHRlc3RDb3VudCA9IDA7CiAgICBjb25zdCBjaGFyICogY29uc3QgKiB0ZXN0ID0gTG9jYWxlOjpnZXRJU09MYW5ndWFnZXMoKTsKICAgIGNvbnN0IGNoYXIgc3BvdENoZWNrMVsgXVs0XSA9IHsgImVuIiwgImVzIiwgImZyIiwgImRlIiwgIml0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphIiwgImtvIiwgInpoIiwgInRoIiwgImhlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIiwgIml1IiwgInVnIiwgInlpIiwgInphIiB9OwoKICAgIGludDMyX3QgaTsKCiAgICBmb3IodGVzdENvdW50ID0gMDt0ZXN0W3Rlc3RDb3VudF07dGVzdENvdW50KyspCiAgICAgIDsKCiAgICBpZiAodGVzdENvdW50ICE9IDQ2NykKICAgICAgICBlcnJsbigiRXhwZWN0ZWQgZ2V0SVNPTGFuZ3VhZ2VzKCkgdG8gcmV0dXJuIDQ2NyBsYW5ndWFnZXM7IGl0IHJldHVybmVkICVkIiwgdGVzdENvdW50KTsKICAgIGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CiAgICAgICAgICAgIGludDMyX3QgajsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRlc3RDb3VudDsgaisrKQogICAgICAgICAgICAgIGlmICh1cHJ2X3N0cmNtcCh0ZXN0W2pdLHNwb3RDaGVjazFbaV0pPT0gMCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKGogPT0gdGVzdENvdW50IHx8ICh1cHJ2X3N0cmNtcCh0ZXN0W2pdLHNwb3RDaGVjazFbaV0pIT0wKSkKICAgICAgICAgICAgICAgIGVycmxuKCJDb3VsZG4ndCBmaW5kICIgKyAoVW5pY29kZVN0cmluZylzcG90Q2hlY2sxW2ldICsgIiBpbiBsYW5ndWFnZSBsaXN0LiIpOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCB0ZXN0Q291bnQ7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdGVlKHRlc3RbaV0sIiIpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgbGModGVzdFtpXSwiIik7CiAgICAgICAgaWYgKHRlc3RlZSAhPSBsYy50b0xvd2VyKCkpCiAgICAgICAgICAgIGVycmxuKGxjICsgIiBpcyBub3QgYWxsIGxvd2VyIGNhc2UuIik7CiAgICAgICAgaWYgKCAodGVzdGVlLmxlbmd0aCgpICE9IDIpICYmICh0ZXN0ZWUubGVuZ3RoKCkgIT0gMykpCiAgICAgICAgICAgIGVycmxuKHRlc3RlZSArICIgaXMgbm90IHR3byBvciB0aHJlZSBjaGFyYWN0ZXJzIGxvbmcuIik7CiAgICAgICAgaWYgKGkgPiAwICYmIHRlc3RlZS5jb21wYXJlKHRlc3RbaSAtIDFdKSA8PSAwKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGFwcGVhcnMgaW4gYW4gb3V0LW9mLW9yZGVyIHBvc2l0aW9uIGluIHRoZSBsaXN0LiIpOwogICAgfQoKICAgIHRlc3QgPSBMb2NhbGU6OmdldElTT0NvdW50cmllcygpOwogICAgVW5pY29kZVN0cmluZyBzcG90Q2hlY2syIFtdID0geyAiVVMiLCAiQ0EiLCAiR0IiLCAiRlIiLCAiREUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVQiLCAiSlAiLCAiS1IiLCAiQ04iLCAiVFciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEgiIH07CiAgICBpbnQzMl90IHNwb3QyTGVuID0gMTE7CiAgICBmb3IodGVzdENvdW50PTA7dGVzdFt0ZXN0Q291bnRdO3Rlc3RDb3VudCsrKQogICAgICA7CgogICAgaWYgKHRlc3RDb3VudCAhPSAyMzkpCiAgICAgICAgZXJybG4oIkV4cGVjdGVkIGdldElTT0xhbmd1YWdlcyB0byByZXR1cm4gMjM4IGxhbmd1YWdlczsgaXQgcmV0dXJuZWQiICsgdGVzdENvdW50KTsKICAgIGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcG90MkxlbjsgaSsrKSB7CiAgICAgICAgICAgIGludDMyX3QgajsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRlc3RDb3VudDsgaisrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdGVlKHRlc3Rbal0sIiIpOwoKICAgICAgICAgICAgICAgIGlmICh0ZXN0ZWUgPT0gc3BvdENoZWNrMltpXSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3RlZSh0ZXN0W2pdLCIiKTsKICAgICAgICAgICAgaWYgKGogPT0gdGVzdENvdW50IHx8IHRlc3RlZSAhPSBzcG90Q2hlY2syW2ldKQogICAgICAgICAgICAgICAgZXJybG4oIkNvdWxkbid0IGZpbmQgIiArIHNwb3RDaGVjazJbaV0gKyAiIGluIGNvdW50cnkgbGlzdC4iKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVzdENvdW50OyBpKyspIHsKICAgICAgVW5pY29kZVN0cmluZyB0ZXN0ZWUodGVzdFtpXSwiIik7CiAgICAgICAgVW5pY29kZVN0cmluZyB1Yyh0ZXN0W2ldLCIiKTsKICAgICAgICBpZiAodGVzdGVlICE9IHVjLnRvVXBwZXIoKSkKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBpcyBub3QgYWxsIHVwcGVyIGNhc2UuIik7CiAgICAgICAgaWYgKHRlc3RlZS5sZW5ndGgoKSAhPSAyKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGlzIG5vdCB0d28gY2hhcmFjdGVycyBsb25nLiIpOwogICAgICAgIGlmIChpID4gMCAmJiB0ZXN0ZWUuY29tcGFyZSh0ZXN0W2kgLSAxXSkgPD0gMCkKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBhcHBlYXJzIGluIGFuIG91dC1vZi1vcmRlciBwb3NpdGlvbiBpbiB0aGUgbGlzdC4iKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDExODU4NwogKi8Kdm9pZApMb2NhbGVUZXN0OjpUZXN0U2ltcGxlRGlzcGxheU5hbWVzKCkKewogICAgLy8gVGhpcyB0ZXN0IGlzIGRpZmZlcmVudCBmcm9tIFRlc3REaXNwbGF5TmFtZXMgYmVjYXVzZSBUZXN0RGlzcGxheU5hbWVzIGNoZWNrcwogICAgLy8gZmFsbGJhY2sgYmVoYXZpb3IsIGNvbWJpbmF0aW9uIG9mIGxhbmd1YWdlIGFuZCBjb3VudHJ5IG5hbWVzIHRvIGZvcm0gbG9jYWxlCiAgICAvLyBuYW1lcywgYW5kIG90aGVyIHN0dWZmIGxpa2UgdGhhdC4gIFRoaXMgdGVzdCBqdXN0IGNoZWNrcyBzcGVjaWZpYyBsYW5ndWFnZQogICAgLy8gYW5kIGNvdW50cnkgY29kZXMgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgbmFtZXMgZm9yIHRoZW0uCiAgICBjaGFyIGxhbmd1YWdlQ29kZXNbXSBbNF0gPSB7ICJoZSIsICJpZCIsICJpdSIsICJ1ZyIsICJ5aSIsICJ6YSIgfTsKICAgIFVuaWNvZGVTdHJpbmcgbGFuZ3VhZ2VOYW1lcyBbXSA9IHsgIkhlYnJldyIsICJJbmRvbmVzaWFuIiwgIkludWt0aXR1dCIsICJVaWdodXIiLCAiWWlkZGlzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmh1YW5nIiB9OwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdDsKICAgICAgICBMb2NhbGUgbChsYW5ndWFnZUNvZGVzW2ldLCAiIiwgIiIpOwogICAgICAgIGwuZ2V0RGlzcGxheUxhbmd1YWdlKExvY2FsZTo6Z2V0VVMoKSwgdGVzdCk7CiAgICAgICAgaWYgKHRlc3QgIT0gbGFuZ3VhZ2VOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBkaXNwbGF5IG5hbWUgZm9yICIgKyBVbmljb2RlU3RyaW5nKGxhbmd1YWdlQ29kZXNbaV0pICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VOYW1lc1tpXSArICJcIiwgZ290IFwiIiArIHRlc3QgKyAiXCIuIik7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMTg1OTUKICovCnZvaWQKTG9jYWxlVGVzdDo6VGVzdFVuaW5zdGFsbGVkSVNPM05hbWVzKCkKewogICAgLy8gVGhpcyB0ZXN0IGNoZWNrcyB0byBtYWtlIHN1cmUgZ2V0SVNPM0xhbmd1YWdlIGFuZCBnZXRJU08zQ291bnRyeSB3b3JrIHJpZ2h0CiAgICAvLyBldmVuIGZvciBsb2NhbGVzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQuCiAgICBjb25zdCBjaGFyIGlzbzJMYW5ndWFnZXMgW11bNF0gPSB7ICAgICAiYW0iLCAiYmEiLCAiZnkiLCAibXIiLCAicm4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNzIiwgInR3IiwgInp1IiB9OwogICAgY29uc3QgY2hhciBpc28zTGFuZ3VhZ2VzIFtdWzVdID0geyAgICAgImFtaCIsICJiYWsiLCAiZnJ5IiwgIm1hciIsICJydW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNzdyIsICJ0d2kiLCAienVsIiB9OwoKICAgIGludDMyX3QgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwoKICAgICAgVW5pY29kZVN0cmluZyB0ZXN0OwogICAgICAgIExvY2FsZSBsKGlzbzJMYW5ndWFnZXNbaV0sICIiLCAiIik7CiAgICAgICAgdGVzdCA9IGwuZ2V0SVNPM0xhbmd1YWdlKCk7CiAgICAgICAgaWYoKHRlc3QgIT0gaXNvM0xhbmd1YWdlc1tpXSkgfHwgVV9GQUlMVVJFKGVycikpCiAgICAgICAgICAgIGVycmxuKCJHb3Qgd3JvbmcgSVNPMyBjb2RlIGZvciAiICsgVW5pY29kZVN0cmluZyhpc28yTGFuZ3VhZ2VzW2ldKSArICI6IEV4cGVjdGVkIFwiIiArCiAgICAgICAgICAgICAgICAgICAgaXNvM0xhbmd1YWdlc1tpXSArICJcIiwgZ290IFwiIiArIHRlc3QgKyAiXCIuIiArIFVuaWNvZGVTdHJpbmcodV9lcnJvck5hbWUoZXJyKSkpOwogICAgfQoKICAgIGNoYXIgaXNvMkNvdW50cmllcyBbXVs0XSA9IHsgICAgICJBRiIsICJCVyIsICJLWiIsICJNTyIsICJNTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0IiLCAiVEMiLCAiWlciIH07CiAgICBjaGFyIGlzbzNDb3VudHJpZXMgW11bNF0gPSB7ICAgICAiQUZHIiwgIkJXQSIsICJLQVoiLCAiTUFDIiwgIk1ORyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0xCIiwgIlRDQSIsICJaV0UiIH07CgogICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogICAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgICAgICBMb2NhbGUgbCgiIiwgaXNvMkNvdW50cmllc1tpXSwgIiIpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdChsLmdldElTTzNDb3VudHJ5KCksICIiKTsKICAgICAgICBpZiAodGVzdCAhPSBpc28zQ291bnRyaWVzW2ldKQogICAgICAgICAgICBlcnJsbigiR290IHdyb25nIElTTzMgY29kZSBmb3IgIiArIFVuaWNvZGVTdHJpbmcoaXNvMkNvdW50cmllc1tpXSkgKyAiOiBFeHBlY3RlZCBcIiIgKwogICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcoaXNvM0NvdW50cmllc1tpXSkgKyAiXCIsIGdvdCBcIiIgKyB0ZXN0ICsgIlwiLiIgKyB1X2Vycm9yTmFtZShlcnIpKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDA5MjQ3NQogKiBJIGNvdWxkIG5vdCByZXByb2R1Y2UgdGhpcyBidWcuICBJJ20gcHJldHR5IGNvbnZpbmNlZCBpdCB3YXMgZml4ZWQgd2l0aCB0aGUKICogYmlnIGxvY2FsZS1kYXRhIHJlb3JnIG9mIDEwLzI4Lzk3LiAgVGhlIGxvb2t1cCBsb2dpYyBmb3IgbGFuZ3VhZ2UgYW5kIGNvdW50cnkKICogZGlzcGxheSBuYW1lcyB3YXMgYWxzbyBjaGFuZ2VkIGF0IHRoYXQgdGltZSBpbiB0aGF0IGNoZWNrLWluLiAgICAtLXJ0ZyAzLzIwLzk4CiAqLwp2b2lkCkxvY2FsZVRlc3Q6OlRlc3RBdHlwaWNhbExvY2FsZXMoKQp7CiAgICBMb2NhbGUgbG9jYWxlc1RvVGVzdCBbXSA9IHsgTG9jYWxlKCJkZSIsICJDQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJqYSIsICJaQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgicnUiLCAiTVgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoImVuIiwgIkZSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJlcyIsICJERSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkhSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCIiLCAiU0UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIiIsICJETyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkJFIikgfTsKCiAgICBVbmljb2RlU3RyaW5nIGVuZ2xpc2hEaXNwbGF5TmFtZXMgW10gPSB7ICJHZXJtYW4gKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphcGFuZXNlIChTb3V0aCBBZnJpY2EpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdXNzaWFuIChNZXhpY28pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIChGcmFuY2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGFuaXNoIChHZXJtYW55KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3dlZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGdpdW0iIH07CiAgICBVbmljb2RlU3RyaW5nIGZyZW5jaERpc3BsYXlOYW1lcyBbXT0geyAiYWxsZW1hbmQgKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFwb25haXMgKEFmcmlxdWUgZHUgU3VkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydXNzZSAoTWV4aXF1ZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZ2xhaXMgKEZyYW5jZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVzcGFnbm9sIChBbGxlbWFnbmUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiU3VcXHUwMEU4ZGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoIlJcXHUwMEU5cHVibGlxdWUgRG9taW5pY2FpbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGdpcXVlIiB9OwogICAgVW5pY29kZVN0cmluZyBzcGFuaXNoRGlzcGxheU5hbWVzIFtdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImFsZW1cXHUwMEUxbiAoQ2FuYWRcXHUwMEUxKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImphcG9uXFx1MDBFOXMgKFN1ZFxcdTAwRTFmcmljYSkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJydXNvIChNXFx1MDBFOXhpY28pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiaW5nbFxcdTAwRTlzIChGcmFuY2lhKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImVzcGFcXHUwMEYxb2wgKEFsZW1hbmlhKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2FjaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1ZWNpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiUmVwXFx1MDBGQWJsaWNhIERvbWluaWNhbmEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJCXFx1MDBFOWxnaWNhIikgfTsKICAgIC8vIERlLUFuZ2xpY2l6aW5nIHJvb3QgcmVxdWlyZWQgdGhlIGNoYW5nZSBmcm9tCiAgICAvLyBFbmdsaXNoIGRpc3BsYXkgbmFtZXMgdG8gSVNPIENvZGVzIC0gcmFtIDIwMDMvMDkvMjYKICAgIFVuaWNvZGVTdHJpbmcgYmVuZ2FsaURpc3BsYXlOYW1lcyBbXSA9IHsgImRlIChDQSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphIChaQSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1IChNWCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuIChGUikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVzIChERSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhSIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRE8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJFIiB9OwoKICAgIGludDMyX3QgaTsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgTG9jYWxlOjpzZXREZWZhdWx0KExvY2FsZTo6Z2V0VVMoKSwgc3RhdHVzKTsKICAgIGZvciAoaSA9IDA7IGkgPCA5OyArK2kpIHsKICAgICAgICBVbmljb2RlU3RyaW5nIG5hbWU7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGU6OmdldFVTKCksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUpOwogICAgICAgIGlmIChuYW1lICE9IGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgewogICAgICAgICAgICBlcnJsbigiTG9va3VwIGluIEVuZ2xpc2ggZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBlbmdsaXNoRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgICAgICAgICBsb2dsbigiTG9jYWxlIG5hbWUgd2FzLT4gIiArIChuYW1lPWxvY2FsZXNUb1Rlc3RbaV0uZ2V0TmFtZSgpKSk7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIG5hbWU7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGUoImVzIiwgIkVTIiksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUpOwogICAgICAgIGlmIChuYW1lICE9IHNwYW5pc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gU3BhbmlzaCBmYWlsZWQ6IGV4cGVjdGVkIFwiIiArIHNwYW5pc2hEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZTo6Z2V0RnJhbmNlKCksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUpOwogICAgICAgIGlmIChuYW1lICE9IGZyZW5jaERpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBGcmVuY2ggZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBmcmVuY2hEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZSgiYmUiLCAiRVMiKSwgbmFtZSk7CiAgICAgICAgbG9nbG4obmFtZSArICIgTG9jYWxlIGZhbGxiYWNrIHRvIGJlLCBhbmQgZGF0YSBmYWxsYmFjayB0byByb290Iik7CiAgICAgICAgaWYgKG5hbWUgIT0gYmVuZ2FsaURpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBCZW5nYWxpIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgYmVuZ2FsaURpc3BsYXlOYW1lc1tpXQogICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgZ290IFwiIiArIG5hbWUgKyAiXCIiKTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZSgiYmUiLCAiRUciKSwgbmFtZSk7CiAgICAgICAgbG9nbG4obmFtZSArICIgRGF0YSBmYWxsYmFjayB0byByb290Iik7CiAgICAgICAgaWYgKG5hbWUgIT0gYmVuZ2FsaURpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBCZW5nYWxpIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgYmVuZ2FsaURpc3BsYXlOYW1lc1tpXQogICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgZ290IFwiIiArIG5hbWUgKyAiXCIiKTsKICAgIH0KfQoKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKCi8qKgogKiBAYnVnIDQxMzU3NTIKICogVGhpcyB3b3VsZCBiZSBiZXR0ZXIgdGVzdGVkIGJ5IHRoZSBMb2NhbGVEYXRhVGVzdC4gIFdpbGwgbW92ZSBpdCB3aGVuIEkKICogZ2V0IHRoZSBMb2NhbGVEYXRhVGVzdCB3b3JraW5nIGFnYWluLgogKi8Kdm9pZApMb2NhbGVUZXN0OjpUZXN0VGhhaUN1cnJlbmN5Rm9ybWF0KCkKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBEZWNpbWFsRm9ybWF0ICp0aGFpQ3VycmVuY3kgPSAoRGVjaW1hbEZvcm1hdCopTnVtYmVyRm9ybWF0OjpjcmVhdGVDdXJyZW5jeUluc3RhbmNlKAogICAgICAgICAgICAgICAgICAgIExvY2FsZSgidGgiLCAiVEgiKSwgc3RhdHVzKTsKICAgIFVDaGFyIHBvc1ByZWZpeCA9IDB4MGUzZjsKICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKCiAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKSB8fCAhdGhhaUN1cnJlbmN5KQogICAgewogICAgICAgIGVycmxuKCJDb3VsZG4ndCBnZXQgdGhfVEggY3VycmVuY3kgLT4gIiArIFVuaWNvZGVTdHJpbmcodV9lcnJvck5hbWUoc3RhdHVzKSkpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlUHJlZml4KHRlbXApICE9IFVuaWNvZGVTdHJpbmcoJnBvc1ByZWZpeCwgMSwgMSkpCiAgICAgICAgZXJybG4oIlRoYWkgY3VycmVuY3kgcHJlZml4IHdyb25nOiBleHBlY3RlZCAweDBlM2YsIGdvdCBcIiIgKwogICAgICAgICAgICAgICAgICAgICAgICB0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlUHJlZml4KHRlbXApICsgIlwiIik7CiAgICBpZiAodGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVN1ZmZpeCh0ZW1wKSAhPSAiIikKICAgICAgICBlcnJsbigiVGhhaSBjdXJyZW5jeSBzdWZmaXggd3Jvbmc6IGV4cGVjdGVkIFwiXCIsIGdvdCBcIiIgKwogICAgICAgICAgICAgICAgICAgICAgICB0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlU3VmZml4KHRlbXApICsgIlwiIik7CgogICAgZGVsZXRlIHRoYWlDdXJyZW5jeTsKfQoKLyoqCiAqIEBidWcgNDEyMjM3MQogKiBDb25maXJtIHRoYXQgRXVybyBzdXBwb3J0IHdvcmtzLiAgVGhpcyB0ZXN0IGlzIHByZXR0eSBydWRpbWVudGFyeTsgYWxsIGl0IGRvZXMKICogaXMgY2hlY2sgdGhhdCBhbnkgbG9jYWxlcyB3aXRoIHRoZSBFVVJPIHZhcmlhbnQgZm9ybWF0IGEgbnVtYmVyIHVzaW5nIHRoZQogKiBFdXJvIGN1cnJlbmN5IHN5bWJvbC4KICoKICogQVNTVU1FOiBBbGwgbG9jYWxlcyBlbmNvZGUgdGhlIEV1cm8gY2hhcmFjdGVyICJcdTIwQUMiLgogKiBJZiB0aGlzIGlzIGNoYW5nZWQgdG8gdXNlIHRoZSBzaW5nbGUtY2hhcmFjdGVyIEV1cm8gc3ltYm9sLCB0aGlzCiAqIHRlc3QgbXVzdCBiZSB1cGRhdGVkLgogKgogKi8Kdm9pZApMb2NhbGVUZXN0OjpUZXN0RXVyb1N1cHBvcnQoKQp7CiAgICBVQ2hhciBldXJvID0gMHgyMGFjOwogICAgY29uc3QgVW5pY29kZVN0cmluZyBFVVJPX0NVUlJFTkNZKCZldXJvLCAxLCAxKTsgLy8gTG9vayBmb3IgdGhpcyBVbmljb2RlU3RyaW5nIGluIGZvcm1hdHRlZCBFdXJvIGN1cnJlbmN5CiAgICBjb25zdCBjaGFyKiBsb2NhbGVBcnJbXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYV9FUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVfQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlX0RFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZV9MVSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxfR1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuX0JFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbl9JRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5fR0JfRVVSTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5fVVNfRVVSTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXNfRVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImV1X0VTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaV9GSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJfQkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyX0ZSIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcl9MVSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2FfSUUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsX0VTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdF9JVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmxfQkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5sX05MIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdF9QVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICBjb25zdCBjaGFyKiogbG9jYWxlcyA9IGxvY2FsZUFycjsKCiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKCiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CgogICAgZm9yICg7KmxvY2FsZXMhPU5VTEw7bG9jYWxlcysrKSB7CiAgICAgICAgTG9jYWxlIGxvYyAoKmxvY2FsZXMpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBOdW1iZXJGb3JtYXQgKm5mID0gTnVtYmVyRm9ybWF0OjpjcmVhdGVDdXJyZW5jeUluc3RhbmNlKGxvYywgc3RhdHVzKTsKICAgICAgICBVbmljb2RlU3RyaW5nIHBvczsKICAgICAgICBuZi0+Zm9ybWF0KDI3MTgyOC4xODI4NDUsIHBvcyk7CiAgICAgICAgVW5pY29kZVN0cmluZyBuZWc7CiAgICAgICAgbmYtPmZvcm1hdCgtMjcxODI4LjE4Mjg0NSwgbmVnKTsKICAgICAgICBpZiAocG9zLmluZGV4T2YoRVVST19DVVJSRU5DWSkgPj0gMCAmJgogICAgICAgICAgICBuZWcuaW5kZXhPZihFVVJPX0NVUlJFTkNZKSA+PSAwKSB7CiAgICAgICAgICAgIGxvZ2xuKCJPazogIiArICh0ZW1wPWxvYy5nZXROYW1lKCkpICsKICAgICAgICAgICAgICAgICI6ICIgKyBwb3MgKyAiIC8gIiArIG5lZyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBlcnJsbigiRmFpbDogIiArICh0ZW1wPWxvYy5nZXROYW1lKCkpICsKICAgICAgICAgICAgICAgICIgZm9ybWF0cyB3aXRob3V0ICIgKyBFVVJPX0NVUlJFTkNZICsKICAgICAgICAgICAgICAgICI6ICIgKyBwb3MgKyAiIC8gIiArIG5lZyArCiAgICAgICAgICAgICAgICAiXG4qKiogVEhJUyBGQUlMVVJFIE1BWSBPTkxZIE1FQU4gVEhBVCBMT0NBTEUgREFUQSBIQVMgQ0hBTkdFRCAqKioiKTsKICAgICAgICB9CgogICAgICAgIGRlbGV0ZSBuZjsKICAgIH0KCiAgICBVbmljb2RlU3RyaW5nIGRvbGxhclN0cigiVVNEIiwgIiIpLCBldXJvU3RyKCJFVVIiLCAiIiksIGdlbmVyaWNTdHIoKFVDaGFyKTB4MDBhNCksIHJlc3VsdFN0cjsKICAgIFVDaGFyIHRtcFs0XTsKICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKCiAgICB1Y3Vycl9mb3JMb2NhbGUoImVuX1VTIiwgdG1wLCA0LCAmc3RhdHVzKTsKICAgIHJlc3VsdFN0ci5zZXRUbyh0bXApOwogICAgaWYgKGRvbGxhclN0ciAhPSByZXN1bHRTdHIpIHsKICAgICAgICBlcnJsbigiRmFpbDogZW5fVVMgZGlkbid0IHJldHVybiBVU0QiKTsKICAgIH0KICAgIHVjdXJyX2ZvckxvY2FsZSgiZW5fVVNfRVVSTyIsIHRtcCwgNCwgJnN0YXR1cyk7CiAgICByZXN1bHRTdHIuc2V0VG8odG1wKTsKICAgIGlmIChldXJvU3RyICE9IHJlc3VsdFN0cikgewogICAgICAgIGVycmxuKCJGYWlsOiBlbl9VU19FVVJPIGRpZG4ndCByZXR1cm4gRVVSIik7CiAgICB9CiAgICB1Y3Vycl9mb3JMb2NhbGUoImVuX0dCX0VVUk8iLCB0bXAsIDQsICZzdGF0dXMpOwogICAgcmVzdWx0U3RyLnNldFRvKHRtcCk7CiAgICBpZiAoZXVyb1N0ciAhPSByZXN1bHRTdHIpIHsKICAgICAgICBlcnJsbigiRmFpbDogZW5fR0JfRVVSTyBkaWRuJ3QgcmV0dXJuIEVVUiIpOwogICAgfQogICAgdWN1cnJfZm9yTG9jYWxlKCJlbl9VU19QUkVFVVJPIiwgdG1wLCA0LCAmc3RhdHVzKTsKICAgIHJlc3VsdFN0ci5zZXRUbyh0bXApOwogICAgaWYgKGRvbGxhclN0ciAhPSByZXN1bHRTdHIpIHsKICAgICAgICBlcnJsbigiRmFpbDogZW5fVVNfUFJFRVVSTyBkaWRuJ3QgZmFsbGJhY2sgdG8gZW5fVVMiKTsKICAgIH0KICAgIHVjdXJyX2ZvckxvY2FsZSgiZW5fVVNfUSIsIHRtcCwgNCwgJnN0YXR1cyk7CiAgICByZXN1bHRTdHIuc2V0VG8odG1wKTsKICAgIGlmIChkb2xsYXJTdHIgIT0gcmVzdWx0U3RyKSB7CiAgICAgICAgZXJybG4oIkZhaWw6IGVuX1VTX1EgZGlkbid0IGZhbGxiYWNrIHRvIGVuX1VTIik7CiAgICB9CiAgICBpbnQzMl90IGludmFsaWRMZW4gPSB1Y3Vycl9mb3JMb2NhbGUoImVuX1FRIiwgdG1wLCA0LCAmc3RhdHVzKTsKICAgIGlmIChpbnZhbGlkTGVuIHx8IFVfU1VDQ0VTUyhzdGF0dXMpKSB7CiAgICAgICAgZXJybG4oIkZhaWw6IGVuX1FRIGRpZG4ndCByZXR1cm4gTlVMTCIpOwogICAgfQp9CgojZW5kaWYKCi8qKgogKiBAYnVnIDQxMzk1MDQKICogdG9TdHJpbmcoKSBkb2Vzbid0IHdvcmsgd2l0aCBsYW5ndWFnZV9WQVJJQU5ULgogKi8Kdm9pZApMb2NhbGVUZXN0OjpUZXN0VG9TdHJpbmcoKSB7CiAgICBMb2NhbGUgREFUQSBbXSA9IHsKICAgICAgICBMb2NhbGUoInh4IiwgIiIsICIiKSwKICAgICAgICBMb2NhbGUoIiIsICJZWSIsICIiKSwKICAgICAgICBMb2NhbGUoIiIsICIiLCAiWloiKSwKICAgICAgICBMb2NhbGUoInh4IiwgIllZIiwgIiIpLAogICAgICAgIExvY2FsZSgieHgiLCAiIiwgIlpaIiksCiAgICAgICAgTG9jYWxlKCIiLCAiWVkiLCAiWloiKSwKICAgICAgICBMb2NhbGUoInh4IiwgIllZIiwgIlpaIiksCiAgICB9OwoKICAgIGNvbnN0IGNoYXIgREFUQV9TIFtdWzIwXSA9IHsKICAgICAgICAieHgiLAogICAgICAgICJfWVkiLAogICAgICAgICJfX1paIiwKICAgICAgICAieHhfWVkiLAogICAgICAgICJ4eF9fWloiLAogICAgICAgICJfWVlfWloiLAogICAgICAgICJ4eF9ZWV9aWiIsCiAgICB9OwoKICAgIGZvciAoaW50MzJfdCBpPTA7IGkgPCA3OyArK2kpIHsKICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICAgbmFtZSA9IERBVEFbaV0uZ2V0TmFtZSgpOwoKICAgICAgaWYgKHN0cmNtcChuYW1lLCBEQVRBX1NbaV0pICE9IDApCiAgICAgICAgewogICAgICAgICAgICBlcnJsbigiRmFpbDogTG9jYWxlLmdldE5hbWUoKSwgZ290OiIgKyBVbmljb2RlU3RyaW5nKG5hbWUpICsgIiwgZXhwZWN0ZWQ6ICIgKyBEQVRBX1NbaV0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvZ2xuKCJQYXNzOiBMb2NhbGUuZ2V0TmFtZSgpLCBnb3Q6IiArIFVuaWNvZGVTdHJpbmcobmFtZSkgKTsKICAgIH0KfQoKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKCi8qKgogKiBAYnVnIDQxMzk5NDAKICogQ291bGRuJ3QgcmVwcm9kdWNlIHRoaXMgYnVnIC0tIHByb2JhYmx5IHdhcyBmaXhlZCBlYXJsaWVyLgogKgogKiBPUklHSU5BTCBCVUcgUkVQT1JUOgogKiAtLSBiYXNpY2FsbHksIGh1bmdhcmlhbiBmb3IgbW9uZGF5IHNob3VsZG4ndCBoYXZlIGFuIFx1MDBmNAogKiAobyBjaXJjdW1mbGV4KWluIGl0IGluc3RlYWQgaXQgc2hvdWxkIGJlIGFuIG8gd2l0aCAyIGluY2xpbmVkCiAqIChyaWdodCkgbGluZXMgb3ZlciBpdC4uCiAqCiAqIFlvdSBtYXkgd29uZGVyIC0tIHdoeSBkbyBhbGwgdGhpcyAtLSB3aHkgbm90IGp1c3QgYWRkIGEgbGluZSB0bwogKiBMb2NhbGVEYXRhPyAgV2VsbCwgSSBjb3VsZCBzZWUgYnkgaW5zcGVjdGlvbiB0aGF0IHRoZSBsb2NhbGUgZmlsZSBoYWQgdGhlCiAqIHJpZ2h0IGNoYXJhY3RlciBpbiBpdCwgc28gSSB3YW50ZWQgdG8gY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lIC0tIGEKICogdmVyeSByZW1vdGUgcG9zc2liaWxpdHksIGJ1dCBJIHdhbnRlZCB0byBiZSBzdXJlLiAgVGhlIG90aGVyIHBvc3NpYmlsaXR5CiAqIGlzIHRoYXQgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIGZvbnQgbWFwcGluZyBzdWJzeXN0ZW0sIGJ1dCB3ZSBjYW4ndAogKiB0ZXN0IHRoYXQgaGVyZS4KICovCnZvaWQKTG9jYWxlVGVzdDo6VGVzdDQxMzk5NDAoKQp7CiAgICBMb2NhbGUgbXlsb2NhbGUoImh1IiwgIiIsICIiKTsKICAgIFVEYXRlIG15ZGF0ZSA9IGRhdGUoOTgsMywxMyk7IC8vIEEgTW9uZGF5CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIFNpbXBsZURhdGVGb3JtYXQgZGZfZnVsbCgiRUVFRSIsIG15bG9jYWxlLCBzdGF0dXMpOwogICAgVW5pY29kZVN0cmluZyBzdHI7CiAgICBGaWVsZFBvc2l0aW9uIHBvcyhGaWVsZFBvc2l0aW9uOjpET05UX0NBUkUpOwogICAgZGZfZnVsbC5mb3JtYXQobXlkYXRlLCBzdHIsIHBvcyk7CiAgICAvLyBNYWtlIHN1cmUgdGhhdCBvIGNpcmN1bWZsZXggKFx1MDBGNCkgaXMgTk9UIHRoZXJlLCBhbmQKICAgIC8vIG8gZG91YmxlIGFjdXRlIChcdTAxNTEpIElTLgogICAgVUNoYXIgb2NmID0gMHgwMGY0OwogICAgVUNoYXIgb2RhID0gMHgwMTUxOwogICAgaWYgKHN0ci5pbmRleE9mKG9kYSkgPCAwIHx8IHN0ci5pbmRleE9mKG9jZikgPj0gMCkgewogICAgICBlcnJsbigiRmFpbDogTW9uZGF5IGluIEh1bmdhcmlhbiBpcyB3cm9uZyAtIG9kYSdzIGluZGV4IGlzICVkIGFuZCBvY2YncyBpcyAlZCIsCiAgICAgICAgICAgIHN0ci5pbmRleE9mKG9kYSksIHN0ci5pbmRleE9mKG9jZikpOwogICAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJTdHJpbmcgaXM6ICIpICsgc3RyICk7CiAgICB9Cn0KClVEYXRlCkxvY2FsZVRlc3Q6OmRhdGUoaW50MzJfdCB5LCBpbnQzMl90IG0sIGludDMyX3QgZCwgaW50MzJfdCBociwgaW50MzJfdCBtaW4sIGludDMyX3Qgc2VjKQp7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIENhbGVuZGFyICpjYWwgPSBDYWxlbmRhcjo6Y3JlYXRlSW5zdGFuY2Uoc3RhdHVzKTsKICAgIGlmIChjYWwgPT0gMCkKICAgICAgICByZXR1cm4gMC4wOwogICAgY2FsLT5jbGVhcigpOwogICAgY2FsLT5zZXQoMTkwMCArIHksIG0sIGQsIGhyLCBtaW4sIHNlYyk7IC8vIEFkZCAxOTAwIHRvIGZvbGxvdyBqYXZhLnV0aWwuRGF0ZSBwcm90b2NvbAogICAgVURhdGUgZHQgPSBjYWwtPmdldFRpbWUoc3RhdHVzKTsKICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKICAgICAgICByZXR1cm4gMC4wOwoKICAgIGRlbGV0ZSBjYWw7CiAgICByZXR1cm4gZHQ7Cn0KCi8qKgogKiBAYnVnIDQxNDM5NTEKICogUnVzc2lhbiBmaXJzdCBkYXkgb2Ygd2VlayBzaG91bGQgYmUgTW9uZGF5LiBDb25maXJtZWQuCiAqLwp2b2lkCkxvY2FsZVRlc3Q6OlRlc3Q0MTQzOTUxKCkKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBDYWxlbmRhciAqY2FsID0gQ2FsZW5kYXI6OmNyZWF0ZUluc3RhbmNlKExvY2FsZSgicnUiLCAiIiwgIiIpLCBzdGF0dXMpOwogICAgaWYoVV9TVUNDRVNTKHN0YXR1cykpIHsKICAgICAgaWYgKGNhbC0+Z2V0Rmlyc3REYXlPZldlZWsoc3RhdHVzKSAhPSBVQ0FMX01PTkRBWSkgewogICAgICAgICAgZXJybG4oIkZhaWw6IEZpcnN0IGRheSBvZiB3ZWVrIGluIFJ1c3NpYSBzaG91bGQgYmUgTW9uZGF5Iik7CiAgICAgIH0KICAgIH0KICAgIGRlbGV0ZSBjYWw7Cn0KCiNlbmRpZgoKLyoqCiAqIEBidWcgNDE0NzMxNQogKiBqYXZhLnV0aWwuTG9jYWxlLmdldElTTzNDb3VudHJ5KCkgd29ya3Mgd3JvbmcgZm9yIG5vbiBJU08tMzE2NiBjb2Rlcy4KICogU2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBmb3IgdW5rbm93biBsb2NhbGVzCiAqLwp2b2lkCkxvY2FsZVRlc3Q6OlRlc3Q0MTQ3MzE1KCkKewogIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgIC8vIFRyeSB3aXRoIGNvZGVzIHRoYXQgYXJlIHRoZSB3cm9uZyBsZW5ndGggYnV0IGhhcHBlbiB0byBtYXRjaCB0ZXh0CiAgICAvLyBhdCBhIHZhbGlkIG9mZnNldCBpbiB0aGUgbWFwcGluZyB0YWJsZQogICAgTG9jYWxlIGxvY2FsZSgiYWFhIiwgIkNDQyIpOwoKICAgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGxvY2FsZS5nZXRJU08zQ291bnRyeSgpOwoKICAgIC8vIENoYW5nZSB0byBjb25mb3JtIHRvIEMgYXBpIHVzYWdlCiAgICBpZigocmVzdWx0PT1OVUxMKXx8KHJlc3VsdFswXSAhPSAwKSkKICAgICAgZXJybG4oIkVSUk9SOiBnZXRJU08zQ291bnRyeSgpIHJldHVybnM6ICIgKyBVbmljb2RlU3RyaW5nKHJlc3VsdCwiIikgKwogICAgICAgICAgICAgICAgIiBmb3IgbG9jYWxlICciICsgKHRlbXA9bG9jYWxlLmdldE5hbWUoKSkgKyAiJyByYXRoZXIgdGhhbiBleGNlcHRpb24iICk7Cn0KCi8qKgogKiBAYnVnIDQxNDczMTcKICogamF2YS51dGlsLkxvY2FsZS5nZXRJU08zTGFuZ3VhZ2UoKSB3b3JrcyB3cm9uZyBmb3Igbm9uIElTTy0zMTY2IGNvZGVzLgogKiBTaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB1bmtub3duIGxvY2FsZXMKICovCnZvaWQKTG9jYWxlVGVzdDo6VGVzdDQxNDczMTcoKQp7CiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAvLyBUcnkgd2l0aCBjb2RlcyB0aGF0IGFyZSB0aGUgd3JvbmcgbGVuZ3RoIGJ1dCBoYXBwZW4gdG8gbWF0Y2ggdGV4dAogICAgLy8gYXQgYSB2YWxpZCBvZmZzZXQgaW4gdGhlIG1hcHBpbmcgdGFibGUKICAgIExvY2FsZSBsb2NhbGUoImFhYSIsICJDQ0MiKTsKCiAgICBjb25zdCBjaGFyICpyZXN1bHQgPSBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCk7CgogICAgLy8gQ2hhbmdlIHRvIGNvbmZvcm0gdG8gQyBhcGkgdXNhZ2UKICAgIGlmKChyZXN1bHQ9PU5VTEwpfHwocmVzdWx0WzBdICE9IDApKQogICAgICBlcnJsbigiRVJST1I6IGdldElTTzNMYW5ndWFnZSgpIHJldHVybnM6ICIgKyBVbmljb2RlU3RyaW5nKHJlc3VsdCwiIikgKwogICAgICAgICAgICAgICAgIiBmb3IgbG9jYWxlICciICsgKHRlbXA9bG9jYWxlLmdldE5hbWUoKSkgKyAiJyByYXRoZXIgdGhhbiBleGNlcHRpb24iICk7Cn0KCi8qCiAqIEBidWcgNDE0NzU1MgogKi8Kdm9pZApMb2NhbGVUZXN0OjpUZXN0NDE0NzU1MigpCnsKICAgIExvY2FsZSBsb2NhbGVzIFtdID0geyAgICAgTG9jYWxlKCJubyIsICJOTyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJubyIsICJOTyIsICJCIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJubyIsICJOTyIsICJOWSIpCiAgICB9OwoKICAgIFVuaWNvZGVTdHJpbmcgZWRuKCJOb3J3ZWdpYW4gKE5vcndheSwgQikiKTsKICAgIFVuaWNvZGVTdHJpbmcgZW5nbGlzaERpc3BsYXlOYW1lcyBbXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcndlZ2lhbiAoTm9yd2F5KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiTm9yd2VnaWFuIChOb3J3YXksQikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8iTm9yd2VnaWFuIChOb3J3YXksTlkpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcndlZ2lhbiAoTm9yd2F5LCBOWSkiCiAgICB9OwogICAgVW5pY29kZVN0cmluZyBuZG4oIm5vcnNrIChOb3JnZSwgQiIpOwogICAgVW5pY29kZVN0cmluZyBub3J3ZWdpYW5EaXNwbGF5TmFtZXMgW10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3JzayAoTm9yZ2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vcnNrIChOb3JnZSwgQikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25kbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3JzayAoTm9yZWcsIE5ZKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIk5vcnNrIChOb3JlZywgTnlub3JzaykiCiAgICB9OwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgIExvY2FsZSBsb2MgPSBsb2NhbGVzW2ldOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBpZiAobG9jLmdldERpc3BsYXlOYW1lKHRlbXApICE9IGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgZXJybG4oIkVuZ2xpc2ggZGlzcGxheS1uYW1lIG1pc21hdGNoOiBleHBlY3RlZCAiICsKICAgICAgICAgICAgICAgICAgIGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0gKyAiLCBnb3QgIiArIGxvYy5nZXREaXNwbGF5TmFtZSh0ZW1wKSk7CiAgICAgICAgaWYgKGxvYy5nZXREaXNwbGF5TmFtZShsb2MsIHRlbXApICE9IG5vcndlZ2lhbkRpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIk5vcndlZ2lhbiBkaXNwbGF5LW5hbWUgbWlzbWF0Y2g6IGV4cGVjdGVkICIgKwogICAgICAgICAgICAgICAgICAgbm9yd2VnaWFuRGlzcGxheU5hbWVzW2ldICsgIiwgZ290ICIgKwogICAgICAgICAgICAgICAgICAgbG9jLmdldERpc3BsYXlOYW1lKGxvYywgdGVtcCkpOwogICAgfQp9Cgp2b2lkCkxvY2FsZVRlc3Q6OlRlc3RWYXJpYW50UGFyc2luZygpCnsKICAgIExvY2FsZSBlbl9VU19jdXN0b20oImVuIiwgIlVTIiwgIkRlIEFuemFfQ3VwZXJ0aW5vX0NhbGlmb3JuaWFfVW5pdGVkIFN0YXRlc19FYXJ0aCIpOwoKICAgIFVuaWNvZGVTdHJpbmcgZGlzcE5hbWUoIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMsIERFIEFOWkFfQ1VQRVJUSU5PX0NBTElGT1JOSUFfVU5JVEVEIFNUQVRFU19FQVJUSCkiKTsKICAgIFVuaWNvZGVTdHJpbmcgZGlzcFZhcigiREUgQU5aQV9DVVBFUlRJTk9fQ0FMSUZPUk5JQV9VTklURUQgU1RBVEVTX0VBUlRIIik7CgogICAgVW5pY29kZVN0cmluZyBnb3Q7CgogICAgZW5fVVNfY3VzdG9tLmdldERpc3BsYXlWYXJpYW50KExvY2FsZTo6Z2V0VVMoKSwgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwVmFyKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiAiICsgZGlzcFZhcik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgZW5fVVNfY3VzdG9tLmdldERpc3BsYXlOYW1lKExvY2FsZTo6Z2V0VVMoKSwgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwTmFtZSkgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5TmFtZSgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogIiArIGRpc3BOYW1lKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgc2hvcnRWYXJpYW50KCJmciIsICJGUiIsICJmb28iKTsKICAgIHNob3J0VmFyaWFudC5nZXREaXNwbGF5VmFyaWFudChnb3QpOwoKICAgIGlmKGdvdCAhPSAiRk9PIikgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5VmFyaWFudCgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogZm9vIik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgTG9jYWxlIGJvZ3VzVmFyaWFudCgiZnIiLCAiRlIiLCAiX2ZvbyIpOwogICAgYm9ndXNWYXJpYW50LmdldERpc3BsYXlWYXJpYW50KGdvdCk7CgogICAgaWYoZ290ICE9ICJGT08iKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiBmb28iKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgYm9ndXNWYXJpYW50MigiZnIiLCAiRlIiLCAiZm9vXyIpOwogICAgYm9ndXNWYXJpYW50Mi5nZXREaXNwbGF5VmFyaWFudChnb3QpOwoKICAgIGlmKGdvdCAhPSAiRk9PIikgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5VmFyaWFudCgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogZm9vIik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgTG9jYWxlIGJvZ3VzVmFyaWFudDMoImZyIiwgIkZSIiwgIl9mb29fIik7CiAgICBib2d1c1ZhcmlhbnQzLmdldERpc3BsYXlWYXJpYW50KGdvdCk7CgogICAgaWYoZ290ICE9ICJGT08iKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiBmb28iKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KfQoKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKCi8qKgogKiBAYnVnIDQxMDU4MjgKICogQ3VycmVuY3kgc3ltYm9sIGluIHpoIGlzIHdyb25nLiAgV2Ugd2lsbCB0ZXN0IHRoaXMgYXQgdGhlIE51bWJlckZvcm1hdAogKiBlbmQgdG8gdGVzdCB0aGUgd2hvbGUgcGlwZS4KICovCnZvaWQKTG9jYWxlVGVzdDo6VGVzdDQxMDU4MjgoKQp7CiAgICBMb2NhbGUgTE9DIFtdID0geyBMb2NhbGU6OmdldENoaW5lc2UoKSwgIExvY2FsZSgiemgiLCAiQ04iLCAiIiksCiAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiemgiLCAiVFciLCAiIiksIExvY2FsZSgiemgiLCAiSEsiLCAiIikgfTsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgTnVtYmVyRm9ybWF0ICpmbXQgPSBOdW1iZXJGb3JtYXQ6OmNyZWF0ZVBlcmNlbnRJbnN0YW5jZShMT0NbaV0sIHN0YXR1cyk7CiAgICAgICAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKICAgICAgICAgICAgZXJybG4oIkNvdWxkbid0IGNyZWF0ZSBOdW1iZXJGb3JtYXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKICAgICAgICBGaWVsZFBvc2l0aW9uIHBvcygwKTsKICAgICAgICBmbXQtPmZvcm1hdCgoaW50MzJfdCkxLCByZXN1bHQsIHBvcyk7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgIGlmKHJlc3VsdCAhPSAiMTAwJSIpIHsKICAgICAgICAgICAgZXJybG4oVW5pY29kZVN0cmluZygiUGVyY2VudCBmb3IgIikgKyBMT0NbaV0uZ2V0RGlzcGxheU5hbWUodGVtcCkgKyAiIHNob3VsZCBiZSAxMDAlLCBnb3QgIiArIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGRlbGV0ZSBmbXQ7CiAgICB9Cn0KCiNlbmRpZgoKLy8gVGVzdHMgc2V0Qm9ndXMgYW5kIGlzQm9ndXMgQVBJcyBmb3IgTG9jYWxlCi8vIEppdHRlcmJ1ZyAxNzM1CnZvaWQKTG9jYWxlVGVzdDo6VGVzdFNldElzQm9ndXMoKSB7CiAgICBMb2NhbGUgbCgiZW5fVVMiKTsKICAgIGwuc2V0VG9Cb2d1cygpOwogICAgaWYobC5pc0JvZ3VzKCkgIT0gVFJVRSkgewogICAgICAgIGVycmxuKCJBZnRlciBzZXR0aW5nIGJvZ3VzLCBkaWRuJ3QgcmV0dXJuIFRSVUUiKTsKICAgIH0KICAgIGwgPSAiZW5fVVMiOyAvLyBUaGlzIHNob3VsZCByZXNldCBib2d1cwogICAgaWYobC5pc0JvZ3VzKCkgIT0gRkFMU0UpIHsKICAgICAgICBlcnJsbigiQWZ0ZXIgcmVzZXR0aW5nIGJvZ3VzLCBkaWRuJ3QgcmV0dXJuIEZBTFNFIik7CiAgICB9Cn0KCgp2b2lkCkxvY2FsZVRlc3Q6OlRlc3RLZXl3b3JkVmFyaWFudHModm9pZCkgewogICAgc3RydWN0IHsKICAgICAgICBjb25zdCBjaGFyICpsb2NhbGVJRDsKICAgICAgICBjb25zdCBjaGFyICpleHBlY3RlZExvY2FsZUlEOwogICAgICAgIGNvbnN0IGNoYXIgKmV4cGVjdGVkS2V5d29yZHNbMTBdOwogICAgICAgIGludDMyX3QgbnVtS2V5d29yZHM7CiAgICAgICAgVUVycm9yQ29kZSBleHBlY3RlZFN0YXR1czsKICAgIH0gdGVzdENhc2VzW10gPSB7CiAgICAgICAgeyAiZGVfREVAICBjdXJyZW5jeSA9IGV1cm87IEMgbyBsbCBBIHQgaSBvIG4gICA9IFBob25lYm9vayAgIDsgQyBhbGVuIGRhciA9IGJ1ZGhpc3QgICAiLAogICAgICAgICAgImRlX0RFQGMgYWxlbiBkYXI9YnVkaGlzdDtjIG8gbGwgYSB0IGkgbyBuPVBob25lYm9vaztjdXJyZW5jeT1ldXJvIiwKICAgICAgICB7ICJjIGFsZW4gZGFyIiwgImMgbyBsbCBhIHQgaSBvIG4iLCAiY3VycmVuY3kifSwKICAgICAgICAzLAogICAgICAgIFVfWkVST19FUlJPUgogICAgICAgIH0sCiAgICAgICAgeyAiZGVfREVAZXVybyIsICJkZV9ERV9FVVJPIiwgeyIifSwgMCwgVV9aRVJPX0VSUk9SfSwgLy8gSW4gQysrLCBsb2NhbGUgbmFtZSBnZXRzIGNhbm9uaWNhbGl6ZWQgZmlyc3QuCiAgICAgICAgLy8gdGhlcmVmb3JlLCBnZXRLZXl3b3JkcyB3aWxsIG5vdCBlbmNvdW50ZXIgdGhlIFBPU0lYIHZhcmlhbnQKICAgICAgICAvKnsgImRlX0RFQGV1cm87Y29sbGF0aW9uPXBob25lYm9vayIsICIiLCAiIiwgVV9JTlZBTElEX0ZPUk1BVF9FUlJPUn0qLwogICAgfTsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwoKICAgIGludDMyX3QgaSA9IDAsIGogPSAwOwogICAgY29uc3QgY2hhciAqcmVzdWx0ID0gTlVMTDsKICAgIFN0cmluZ0VudW1lcmF0aW9uICprZXl3b3JkczsKICAgIGludDMyX3Qga2V5Q291bnQgPSAwOwogICAgY29uc3QgY2hhciAqa2V5d29yZCA9IE5VTEw7CiAgICBjb25zdCBVbmljb2RlU3RyaW5nICprZXl3b3JkU3RyaW5nOwogICAgaW50MzJfdCBrZXl3b3JkTGVuID0gMDsKCiAgICBmb3IoaSA9IDA7IGkgPCAoaW50MzJfdCkoc2l6ZW9mKHRlc3RDYXNlcykvc2l6ZW9mKHRlc3RDYXNlc1swXSkpOyBpKyspIHsKICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgTG9jYWxlIGwodGVzdENhc2VzW2ldLmxvY2FsZUlEKTsKICAgICAgICBrZXl3b3JkcyA9IGwuY3JlYXRlS2V5d29yZHMoc3RhdHVzKTsKCiAgICAgICAgaWYoc3RhdHVzICE9IHRlc3RDYXNlc1tpXS5leHBlY3RlZFN0YXR1cykgewogICAgICAgICAgICBlcnIoIkV4cGVjdGVkIHRvIGdldCBzdGF0dXMgJXMuIEdvdCAlcyBpbnN0ZWFkXG4iLAogICAgICAgICAgICAgICAgdV9lcnJvck5hbWUodGVzdENhc2VzW2ldLmV4cGVjdGVkU3RhdHVzKSwgdV9lcnJvck5hbWUoc3RhdHVzKSk7CiAgICAgICAgfQogICAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgICAgICBpZihrZXl3b3JkcykgewogICAgICAgICAgICBpZigoa2V5Q291bnQgPSBrZXl3b3Jkcy0+Y291bnQoc3RhdHVzKSkgIT0gdGVzdENhc2VzW2ldLm51bUtleXdvcmRzKSB7CiAgICAgICAgICAgICAgICBlcnIoIkV4cGVjdGVkIHRvIGdldCAlaSBrZXl3b3JkcywgZ290ICVpXG4iLCB0ZXN0Q2FzZXNbaV0ubnVtS2V5d29yZHMsIGtleUNvdW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihrZXlDb3VudCkgewogICAgICAgICAgICAgICAgZm9yKGogPSAwOzspIHsKICAgICAgICAgICAgICAgICAgICBpZigoaiYxKT09MCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZigoa2V5d29yZCA9IGtleXdvcmRzLT5uZXh0KCZrZXl3b3JkTGVuLCBzdGF0dXMpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZihzdHJjbXAoa2V5d29yZCwgdGVzdENhc2VzW2ldLmV4cGVjdGVkS2V5d29yZHNbal0pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiRXhwZWN0ZWQgdG8gZ2V0IGtleXdvcmQgdmFsdWUgJXMsIGdvdCAlc1xuIiwgdGVzdENhc2VzW2ldLmV4cGVjdGVkS2V5d29yZHNbal0sIGtleXdvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGtleXdvcmRTdHJpbmcgPSBrZXl3b3Jkcy0+c25leHQoc3RhdHVzKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoKmtleXdvcmRTdHJpbmcgIT0gVW5pY29kZVN0cmluZyh0ZXN0Q2FzZXNbaV0uZXhwZWN0ZWRLZXl3b3Jkc1tqXSwgIiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoIkV4cGVjdGVkIHRvIGdldCBrZXl3b3JkIFVuaWNvZGVTdHJpbmcgJXMsIGdvdCAlc1xuIiwgdGVzdENhc2VzW2ldLmV4cGVjdGVkS2V5d29yZHNbal0sIGtleXdvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGorKzsKCiAgICAgICAgICAgICAgICAgICAgaWYoaiA9PSBrZXlDb3VudCAvIDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBrZXl3b3JkcyB3aXRoIGEgY2xvbmUgb2YgaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0VudW1lcmF0aW9uICprMiA9IGtleXdvcmRzLT5jbG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihrMiA9PSBOVUxMIHx8IGtleUNvdW50ICE9IGsyLT5jb3VudChzdGF0dXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJsbigiS2V5d29yZEVudW1lcmF0aW9uLmNsb25lKCkgZmFpbGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUga2V5d29yZHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkcyA9IGsyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlbGV0ZSBrZXl3b3JkczsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gbC5nZXROYW1lKCk7CiAgICAgICAgaWYodXBydl9zdHJjbXAodGVzdENhc2VzW2ldLmV4cGVjdGVkTG9jYWxlSUQsIHJlc3VsdCkgIT0gMCkgewogICAgICAgICAgICBlcnIoIkV4cGVjdGVkIHRvIGdldCBcIiVzXCIgZnJvbSBcIiVzXCIuIEdvdCBcIiVzXCIgaW5zdGVhZFxuIiwKICAgICAgICAgICAgICAgIHRlc3RDYXNlc1tpXS5leHBlY3RlZExvY2FsZUlELCB0ZXN0Q2FzZXNbaV0ubG9jYWxlSUQsIHJlc3VsdCk7CiAgICAgICAgfQoKICAgIH0KCn0KCnZvaWQKTG9jYWxlVGVzdDo6VGVzdEtleXdvcmRWYXJpYW50UGFyc2luZyh2b2lkKSB7CiAgICBzdHJ1Y3QgewogICAgICAgIGNvbnN0IGNoYXIgKmxvY2FsZUlEOwogICAgICAgIGNvbnN0IGNoYXIgKmtleXdvcmQ7CiAgICAgICAgY29uc3QgY2hhciAqZXhwZWN0ZWRWYWx1ZTsKICAgIH0gdGVzdENhc2VzW10gPSB7CiAgICAgICAgeyAiZGVfREVAICBDIG8gbGwgQSB0IGkgbyBuICAgPSBQaG9uZWJvb2sgICAiLCAiYyBvIGxsIGEgdCBpIG8gbiIsICJQaG9uZWJvb2siIH0sCiAgICAgICAgeyAiZGVfREUiLCAiY29sbGF0aW9uIiwgIiJ9LAogICAgICAgIHsgImRlX0RFQGNvbGxhdGlvbj0gUEhPTkVCT09LIiwgImNvbGxhdGlvbiIsICJQSE9ORUJPT0siIH0sCiAgICAgICAgeyAiZGVfREVAIGN1cnJlbmN5ID0gZXVybyAgIDsgQ29MTGFUaW9uICAgPSBQSE9ORUJPT2sgICAiLCAiY29sbGF0aU9OIiwgIlBIT05FQk9PayIgfSwKICAgIH07CgogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CgogICAgaW50MzJfdCBpID0gMDsKICAgIGludDMyX3QgcmVzdWx0TGVuID0gMDsKICAgIGNoYXIgYnVmZmVyWzI1Nl07CgogICAgZm9yKGkgPSAwOyBpIDwgKGludDMyX3QpKHNpemVvZih0ZXN0Q2FzZXMpL3NpemVvZih0ZXN0Q2FzZXNbMF0pKTsgaSsrKSB7CiAgICAgICAgKmJ1ZmZlciA9IDA7CiAgICAgICAgTG9jYWxlIGwodGVzdENhc2VzW2ldLmxvY2FsZUlEKTsKICAgICAgICByZXN1bHRMZW4gPSBsLmdldEtleXdvcmRWYWx1ZSh0ZXN0Q2FzZXNbaV0ua2V5d29yZCwgYnVmZmVyLCAyNTYsIHN0YXR1cyk7CiAgICAgICAgaWYodXBydl9zdHJjbXAodGVzdENhc2VzW2ldLmV4cGVjdGVkVmFsdWUsIGJ1ZmZlcikgIT0gMCkgewogICAgICAgICAgICBlcnIoIkV4cGVjdGVkIHRvIGV4dHJhY3QgXCIlc1wiIGZyb20gXCIlc1wiIGZvciBrZXl3b3JkIFwiJXNcIi4gR290IFwiJXNcIiBpbnN0ZWFkXG4iLAogICAgICAgICAgICAgICAgdGVzdENhc2VzW2ldLmV4cGVjdGVkVmFsdWUsIHRlc3RDYXNlc1tpXS5sb2NhbGVJRCwgdGVzdENhc2VzW2ldLmtleXdvcmQsIGJ1ZmZlcik7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkCkxvY2FsZVRlc3Q6OlRlc3RHZXRCYXNlTmFtZSh2b2lkKSB7CiAgICBzdHJ1Y3QgewogICAgICAgIGNvbnN0IGNoYXIgKmxvY2FsZUlEOwogICAgICAgIGNvbnN0IGNoYXIgKmJhc2VOYW1lOwogICAgfSB0ZXN0Q2FzZXNbXSA9IHsKICAgICAgICB7ICJkZV9ERUAgIEMgbyBsbCBBIHQgaSBvIG4gICA9IFBob25lYm9vayAgICIsICJkZV9ERSIgfSwKICAgICAgICB7ICJkZUBjdXJyZW5jeSA9IGV1cm87IENvTExhVGlvbiAgID0gUEhPTkVCT09rIiwgImRlIiB9LAogICAgICAgIHsgImphQGNhbGVuZGFyID0gYnVkZGhpc3QiLCAiamEiIH0KICAgIH07CgogICAgaW50MzJfdCBpID0gMDsKCiAgICBmb3IoaSA9IDA7IGkgPCAoaW50MzJfdCkoc2l6ZW9mKHRlc3RDYXNlcykvc2l6ZW9mKHRlc3RDYXNlc1swXSkpOyBpKyspIHsKICAgICAgICBMb2NhbGUgbG9jKHRlc3RDYXNlc1tpXS5sb2NhbGVJRCk7CiAgICAgICAgaWYoc3RyY21wKHRlc3RDYXNlc1tpXS5iYXNlTmFtZSwgbG9jLmdldEJhc2VOYW1lKCkpKSB7CiAgICAgICAgICAgIGVycmxuKCJGb3IgbG9jYWxlIFwiJXNcIiBleHBlY3RlZCBiYXNlTmFtZSBcIiVzXCIsIGJ1dCBnb3QgXCIlc1wiIiwKICAgICAgICAgICAgICAgIHRlc3RDYXNlc1tpXS5sb2NhbGVJRCwgdGVzdENhc2VzW2ldLmJhc2VOYW1lLCBsb2MuZ2V0QmFzZU5hbWUoKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBDb21wYXJlIHR3byBsb2NhbGUgSURzLiAgSWYgdGhleSBhcmUgZXF1YWwsIHJldHVybiAwLiAgSWYgYHN0cmluZycKICogc3RhcnRzIHdpdGggYHByZWZpeCcgcGx1cyBhbiBhZGRpdGlvbmFsIGVsZW1lbnQsIHRoYXQgaXMsIHN0cmluZyA9PQogKiBwcmVmaXggKyAnXycgKyB4LCB0aGVuIHJldHVybiAxLiAgT3RoZXJ3aXNlIHJldHVybiBhIHZhbHVlIDwgMC4KICovCnN0YXRpYyBVQm9vbCBfbG9jY21wKGNvbnN0IGNoYXIqIHN0cmluZywgY29uc3QgY2hhciogcHJlZml4KSB7CiAgICBpbnQzMl90IHNsZW4gPSB1cHJ2X3N0cmxlbihzdHJpbmcpLAogICAgICAgICAgICBwbGVuID0gdXBydl9zdHJsZW4ocHJlZml4KTsKICAgIGludDMyX3QgYyA9IHVwcnZfc3RybmNtcChzdHJpbmcsIHByZWZpeCwgcGxlbik7CiAgICAvKiAncm9vdCcgaXMgImxlc3MgdGhhbiIgZXZlcnl0aGluZyAqLwogICAgaWYgKHVwcnZfc3RyY21wKHByZWZpeCwgInJvb3QiKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuICh1cHJ2X3N0cmNtcChzdHJpbmcsICJyb290IikgPT0gMCkgPyAwIDogMTsKICAgIH0KICAgIGlmIChjKSByZXR1cm4gLTE7IC8qIG1pc21hdGNoICovCiAgICBpZiAoc2xlbiA9PSBwbGVuKSByZXR1cm4gMDsKICAgIGlmIChzdHJpbmdbcGxlbl0gPT0gJ18nKSByZXR1cm4gMTsKICAgIHJldHVybiAtMjsgLyogZmFsc2UgbWF0Y2gsIGUuZy4gImVuX1VTWCIgY21wICJlbl9VUyIgKi8KfQoKLyoqCiAqIENoZWNrIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiByZXF1ZXN0ZWQgbG9jYWxlcywgYW5kIHJlcG9ydCBwcm9ibGVtcy4KICogVGhlIGNhbGxlciBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZXF1ZXN0ZWQKICogYW5kIHZhbGlkIChleHBSZXFWYWxpZCkgYW5kIGJldHdlZW4gdmFsaWQgYW5kIGFjdHVhbCAoZXhwVmFsaWRBY3R1YWwpLgogKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgogKiAiZ3QiIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiwgZS5nLiwgZW5fVVMgPiBlbgogKiAiZ2UiIGdyZWF0ZXIgb3IgZXF1YWwsICAgICAgZS5nLiwgZW4gPj0gZW4KICogImVxIiBlcXVhbCwgICAgICAgICAgICAgICAgIGUuZy4sIGVuID09IGVuCiAqLwp2b2lkIExvY2FsZVRlc3Q6Ol9jaGVja2xvY3MoY29uc3QgY2hhciogbGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhbGUmIHZhbGlkTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYWxlJiBhY3R1YWxMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBSZXFWYWxpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cFZhbGlkQWN0dWFsKSB7CiAgICBjb25zdCBjaGFyKiB2YWxpZCA9IHZhbGlkTG9jLmdldE5hbWUoKTsKICAgIGNvbnN0IGNoYXIqIGFjdHVhbCA9IGFjdHVhbExvYy5nZXROYW1lKCk7CiAgICBpbnQzMl90IHJlcVZhbGlkID0gX2xvY2NtcChyZXEsIHZhbGlkKTsKICAgIGludDMyX3QgdmFsaWRBY3R1YWwgPSBfbG9jY21wKHZhbGlkLCBhY3R1YWwpOwogICAgaWYgKCgoMCA9PSB1cHJ2X3N0cmNtcChleHBSZXFWYWxpZCwgImd0IikgJiYgcmVxVmFsaWQgPiAwKSB8fAogICAgICAgICAoMCA9PSB1cHJ2X3N0cmNtcChleHBSZXFWYWxpZCwgImdlIikgJiYgcmVxVmFsaWQgPj0gMCkgfHwKICAgICAgICAgKDAgPT0gdXBydl9zdHJjbXAoZXhwUmVxVmFsaWQsICJlcSIpICYmIHJlcVZhbGlkID09IDApKSAmJgogICAgICAgICgoMCA9PSB1cHJ2X3N0cmNtcChleHBWYWxpZEFjdHVhbCwgImd0IikgJiYgdmFsaWRBY3R1YWwgPiAwKSB8fAogICAgICAgICAoMCA9PSB1cHJ2X3N0cmNtcChleHBWYWxpZEFjdHVhbCwgImdlIikgJiYgdmFsaWRBY3R1YWwgPj0gMCkgfHwKICAgICAgICAgKDAgPT0gdXBydl9zdHJjbXAoZXhwVmFsaWRBY3R1YWwsICJlcSIpICYmIHZhbGlkQWN0dWFsID09IDApKSkgewogICAgICAgIGxvZ2xuKCIlczsgcmVxPSVzLCB2YWxpZD0lcywgYWN0dWFsPSVzIiwKICAgICAgICAgICAgICBsYWJlbCwgcmVxLCB2YWxpZCwgYWN0dWFsKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZXJybG4oIkZBSUw6ICVzOyByZXE9JXMsIHZhbGlkPSVzLCBhY3R1YWw9JXMiLAogICAgICAgICAgICAgIGxhYmVsLCByZXEsIHZhbGlkLCBhY3R1YWwpOwogICAgfQp9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RHZXRMb2NhbGUoKSB7CiAgICBVRXJyb3JDb2RlIGVjID0gVV9aRVJPX0VSUk9SOwogICAgY29uc3QgY2hhciAqcmVxOwogICAgTG9jYWxlIHZhbGlkLCBhY3R1YWwsIHJlcUxvYzsKICAgIAogICAgLy8gQ2FsZW5kYXIKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKICAgIHJlcSA9ICJlbl9VU19CUk9PS0xZTiI7CiAgICBDYWxlbmRhciogY2FsID0gQ2FsZW5kYXI6OmNyZWF0ZUluc3RhbmNlKExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUocmVxKSwgZWMpOwogICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICBlcnJsbigiRkFJTDogQ2FsZW5kYXI6OmNyZWF0ZUluc3RhbmNlIGZhaWxlZCIpOwogICAgfSBlbHNlIHsKICAgICAgICB2YWxpZCA9IGNhbC0+Z2V0TG9jYWxlKFVMT0NfVkFMSURfTE9DQUxFLCBlYyk7CiAgICAgICAgYWN0dWFsID0gY2FsLT5nZXRMb2NhbGUoVUxPQ19BQ1RVQUxfTE9DQUxFLCBlYyk7CiAgICAgICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICAgICAgZXJybG4oIkZBSUw6IENhbGVuZGFyOjpnZXRMb2NhbGUoKSBmYWlsZWQiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfY2hlY2tsb2NzKCJDYWxlbmRhciIsIHJlcSwgdmFsaWQsIGFjdHVhbCk7CiAgICAgICAgfQogICAgfQogICAgZGVsZXRlIGNhbDsKI2VuZGlmCgogICAgLy8gRGVjaW1hbEZvcm1hdCwgRGVjaW1hbEZvcm1hdFN5bWJvbHMKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKICAgIHJlcSA9ICJmcl9GUl9OSUNFIjsKICAgIERlY2ltYWxGb3JtYXQqIGRlYyA9IChEZWNpbWFsRm9ybWF0KikKICAgICAgICBOdW1iZXJGb3JtYXQ6OmNyZWF0ZUluc3RhbmNlKExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUocmVxKSwgZWMpOwogICAgVV9BU1NFUlQoZGVjLT5nZXREeW5hbWljQ2xhc3NJRCgpID09IERlY2ltYWxGb3JtYXQ6OmdldFN0YXRpY0NsYXNzSUQoKSk7CiAgICBpZiAoVV9GQUlMVVJFKGVjKSkgewogICAgICAgIGVycmxuKCJGQUlMOiBOdW1iZXJGb3JtYXQ6OmNyZWF0ZUluc3RhbmNlIGZhaWxlZCIpOwogICAgfSBlbHNlIHsKICAgICAgICB2YWxpZCA9IGRlYy0+Z2V0TG9jYWxlKFVMT0NfVkFMSURfTE9DQUxFLCBlYyk7CiAgICAgICAgYWN0dWFsID0gZGVjLT5nZXRMb2NhbGUoVUxPQ19BQ1RVQUxfTE9DQUxFLCBlYyk7CiAgICAgICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICAgICAgZXJybG4oIkZBSUw6IERlY2ltYWxGb3JtYXQ6OmdldExvY2FsZSgpIGZhaWxlZCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9jaGVja2xvY3MoIkRlY2ltYWxGb3JtYXQiLCByZXEsIHZhbGlkLCBhY3R1YWwpOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgRGVjaW1hbEZvcm1hdFN5bWJvbHMqIHN5bSA9IGRlYy0+Z2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKTsKICAgICAgICBVX0FTU0VSVChzeW0gIT0gMCk7CiAgICAgICAgdmFsaWQgPSBzeW0tPmdldExvY2FsZShVTE9DX1ZBTElEX0xPQ0FMRSwgZWMpOwogICAgICAgIGFjdHVhbCA9IHN5bS0+Z2V0TG9jYWxlKFVMT0NfQUNUVUFMX0xPQ0FMRSwgZWMpOwogICAgICAgIGlmIChVX0ZBSUxVUkUoZWMpKSB7CiAgICAgICAgICAgIGVycmxuKCJGQUlMOiBEZWNpbWFsRm9ybWF0U3ltYm9sczo6Z2V0TG9jYWxlKCkgZmFpbGVkIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2NoZWNrbG9jcygiRGVjaW1hbEZvcm1hdFN5bWJvbHMiLCByZXEsIHZhbGlkLCBhY3R1YWwpOwogICAgICAgIH0gICAgICAgIAogICAgfQogICAgZGVsZXRlIGRlYzsKI2VuZGlmCgogICAgLy8gRGF0ZUZvcm1hdCwgRGF0ZUZvcm1hdFN5bWJvbHMKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKICAgIHJlcSA9ICJkZV9DSF9MVUNFUk5FIjsKICAgIFNpbXBsZURhdGVGb3JtYXQqIGRhdCA9IChTaW1wbGVEYXRlRm9ybWF0KikKICAgICAgICBEYXRlRm9ybWF0OjpjcmVhdGVEYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdDo6a0RlZmF1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUocmVxKSk7CiAgICBVX0FTU0VSVChkYXQgIT0gMCk7CiAgICBVX0FTU0VSVChkYXQtPmdldER5bmFtaWNDbGFzc0lEKCkgPT0gU2ltcGxlRGF0ZUZvcm1hdDo6Z2V0U3RhdGljQ2xhc3NJRCgpKTsKICAgIHZhbGlkID0gZGF0LT5nZXRMb2NhbGUoVUxPQ19WQUxJRF9MT0NBTEUsIGVjKTsKICAgIGFjdHVhbCA9IGRhdC0+Z2V0TG9jYWxlKFVMT0NfQUNUVUFMX0xPQ0FMRSwgZWMpOwogICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICBlcnJsbigiRkFJTDogU2ltcGxlRGF0ZUZvcm1hdDo6Z2V0TG9jYWxlKCkgZmFpbGVkIik7CiAgICB9IGVsc2UgewogICAgICAgIF9jaGVja2xvY3MoIlNpbXBsZURhdGVGb3JtYXQiLCByZXEsIHZhbGlkLCBhY3R1YWwpOwogICAgfQogICAgCiAgICBjb25zdCBEYXRlRm9ybWF0U3ltYm9scyogc3ltID0gZGF0LT5nZXREYXRlRm9ybWF0U3ltYm9scygpOwogICAgVV9BU1NFUlQoc3ltICE9IDApOwogICAgdmFsaWQgPSBzeW0tPmdldExvY2FsZShVTE9DX1ZBTElEX0xPQ0FMRSwgZWMpOwogICAgYWN0dWFsID0gc3ltLT5nZXRMb2NhbGUoVUxPQ19BQ1RVQUxfTE9DQUxFLCBlYyk7CiAgICBpZiAoVV9GQUlMVVJFKGVjKSkgewogICAgICAgIGVycmxuKCJGQUlMOiBEYXRlRm9ybWF0U3ltYm9sczo6Z2V0TG9jYWxlKCkgZmFpbGVkIik7CiAgICB9IGVsc2UgewogICAgICAgIF9jaGVja2xvY3MoIkRhdGVGb3JtYXRTeW1ib2xzIiwgcmVxLCB2YWxpZCwgYWN0dWFsKTsKICAgIH0gICAgICAgIAogICAgZGVsZXRlIGRhdDsKI2VuZGlmCgogICAgLy8gQnJlYWtJdGVyYXRvcgojaWYgIVVDT05GSUdfTk9fQlJFQUtfSVRFUkFUSU9OCiAgICByZXEgPSAiZXNfRVNfQkFSQ0VMT05BIjsKICAgIHJlcUxvYyA9IExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUocmVxKTsKICAgIEJyZWFrSXRlcmF0b3IqIGJyayA9IEJyZWFrSXRlcmF0b3I6OmNyZWF0ZVdvcmRJbnN0YW5jZShyZXFMb2MsIGVjKTsKICAgIGlmIChVX0ZBSUxVUkUoZWMpKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IEJyZWFrSXRlcmF0b3I6OmNyZWF0ZVdvcmRJbnN0YW5jZSBmYWlsZWQiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdmFsaWQgPSBicmstPmdldExvY2FsZShVTE9DX1ZBTElEX0xPQ0FMRSwgZWMpOwogICAgICAgIGFjdHVhbCA9IGJyay0+Z2V0TG9jYWxlKFVMT0NfQUNUVUFMX0xPQ0FMRSwgZWMpOwogICAgICAgIGlmIChVX0ZBSUxVUkUoZWMpKSB7CiAgICAgICAgICAgIGVycmxuKCJGQUlMOiBCcmVha0l0ZXJhdG9yOjpnZXRMb2NhbGUoKSBmYWlsZWQiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfY2hlY2tsb2NzKCJCcmVha0l0ZXJhdG9yIiwgcmVxLCB2YWxpZCwgYWN0dWFsKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gQWZ0ZXIgcmVnaXN0ZXJpbmcgc29tZXRoaW5nLCB0aGUgYmVoYXZpb3Igc2hvdWxkIGJlIGRpZmZlcmVudAogICAgICAgIFVSZWdpc3RyeUtleSBrZXkgPSBCcmVha0l0ZXJhdG9yOjpyZWdpc3Rlckluc3RhbmNlKGJyaywgcmVxTG9jLCBVQlJLX1dPUkQsIGVjKTsKICAgICAgICBicmsgPSAwOyAvLyByZWdpc3Rlckluc3RhbmNlIGFkb3B0cwogICAgICAgIGlmIChVX0ZBSUxVUkUoZWMpKSB7CiAgICAgICAgICAgIGVycmxuKCJGQUlMOiBCcmVha0l0ZXJhdG9yOjpyZWdpc3Rlckluc3RhbmNlKCkgZmFpbGVkIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJrID0gQnJlYWtJdGVyYXRvcjo6Y3JlYXRlV29yZEluc3RhbmNlKHJlcUxvYywgZWMpOwogICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVjKSkgewogICAgICAgICAgICAgICAgZXJybG4oIkZBSUw6IEJyZWFrSXRlcmF0b3I6OmNyZWF0ZVdvcmRJbnN0YW5jZSBmYWlsZWQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhbGlkID0gYnJrLT5nZXRMb2NhbGUoVUxPQ19WQUxJRF9MT0NBTEUsIGVjKTsKICAgICAgICAgICAgICAgIGFjdHVhbCA9IGJyay0+Z2V0TG9jYWxlKFVMT0NfQUNUVUFMX0xPQ0FMRSwgZWMpOwogICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICAgICAgICAgICAgICBlcnJsbigiRkFJTDogQnJlYWtJdGVyYXRvcjo6Z2V0TG9jYWxlKCkgZmFpbGVkIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIE4uQi46IG5vdyBleHBlY3QgdmFsaWQ9PWFjdHVhbD09cmVxCiAgICAgICAgICAgICAgICAgICAgX2NoZWNrbG9jcygiQnJlYWtJdGVyYXRvcihyZWdpc3RlcmVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEsIHZhbGlkLCBhY3R1YWwsICJlcSIsICJlcSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE5vIG1hdHRlciB3aGF0LCB1bnJlZ2lzdGVyCiAgICAgICAgICAgIEJyZWFrSXRlcmF0b3I6OnVucmVnaXN0ZXIoa2V5LCBlYyk7CiAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZWMpKSB7CiAgICAgICAgICAgICAgICBlcnJsbigiRkFJTDogQnJlYWtJdGVyYXRvcjo6dW5yZWdpc3RlcigpIGZhaWxlZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlbGV0ZSBicms7CiAgICAgICAgICAgIGJyayA9IDA7CiAgICAgICAgfQoKICAgICAgICAvLyBBZnRlciB1bnJlZ2lzdGVyaW5nLCBzaG91bGQgYmVoYXZlIG5vcm1hbGx5IGFnYWluCiAgICAgICAgYnJrID0gQnJlYWtJdGVyYXRvcjo6Y3JlYXRlV29yZEluc3RhbmNlKHJlcUxvYywgZWMpOwogICAgICAgIGlmIChVX0ZBSUxVUkUoZWMpKSB7CiAgICAgICAgICAgIGVycmxuKCJGQUlMOiBCcmVha0l0ZXJhdG9yOjpjcmVhdGVXb3JkSW5zdGFuY2UgZmFpbGVkIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsaWQgPSBicmstPmdldExvY2FsZShVTE9DX1ZBTElEX0xPQ0FMRSwgZWMpOwogICAgICAgICAgICBhY3R1YWwgPSBicmstPmdldExvY2FsZShVTE9DX0FDVFVBTF9MT0NBTEUsIGVjKTsKICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICAgICAgICAgIGVycmxuKCJGQUlMOiBCcmVha0l0ZXJhdG9yOjpnZXRMb2NhbGUoKSBmYWlsZWQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF9jaGVja2xvY3MoIkJyZWFrSXRlcmF0b3IodW5yZWdpc3RlcmVkKSIsIHJlcSwgdmFsaWQsIGFjdHVhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBkZWxldGUgYnJrOwojZW5kaWYKCiAgICAvLyBDb2xsYXRvcgojaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OCiAgICByZXEgPSAiaGlfSU5fQkhPUEFMIjsKICAgIHJlcUxvYyA9IExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUocmVxKTsKICAgIENvbGxhdG9yKiBjb2xsID0gQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKHJlcUxvYywgZWMpOwogICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICBlcnJsbigiRkFJTDogQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlIGZhaWxlZCIpOwogICAgfSBlbHNlIHsKICAgICAgICB2YWxpZCA9IGNvbGwtPmdldExvY2FsZShVTE9DX1ZBTElEX0xPQ0FMRSwgZWMpOwogICAgICAgIGFjdHVhbCA9IGNvbGwtPmdldExvY2FsZShVTE9DX0FDVFVBTF9MT0NBTEUsIGVjKTsKICAgICAgICBpZiAoVV9GQUlMVVJFKGVjKSkgewogICAgICAgICAgICBlcnJsbigiRkFJTDogQ29sbGF0b3I6OmdldExvY2FsZSgpIGZhaWxlZCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9jaGVja2xvY3MoIkNvbGxhdG9yIiwgcmVxLCB2YWxpZCwgYWN0dWFsKTsKICAgICAgICB9CgogICAgICAgIC8vIEFmdGVyIHJlZ2lzdGVyaW5nIHNvbWV0aGluZywgdGhlIGJlaGF2aW9yIHNob3VsZCBiZSBkaWZmZXJlbnQKICAgICAgICBVUmVnaXN0cnlLZXkga2V5ID0gQ29sbGF0b3I6OnJlZ2lzdGVySW5zdGFuY2UoY29sbCwgcmVxTG9jLCBlYyk7CiAgICAgICAgY29sbCA9IDA7IC8vIHJlZ2lzdGVySW5zdGFuY2UgYWRvcHRzCiAgICAgICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICAgICAgZXJybG4oIkZBSUw6IENvbGxhdG9yOjpyZWdpc3Rlckluc3RhbmNlKCkgZmFpbGVkIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29sbCA9IENvbGxhdG9yOjpjcmVhdGVJbnN0YW5jZShyZXFMb2MsIGVjKTsKICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICAgICAgICAgIGVycmxuKCJGQUlMOiBDb2xsYXRvcjo6Y3JlYXRlV29yZEluc3RhbmNlIGZhaWxlZCIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFsaWQgPSBjb2xsLT5nZXRMb2NhbGUoVUxPQ19WQUxJRF9MT0NBTEUsIGVjKTsKICAgICAgICAgICAgICAgIGFjdHVhbCA9IGNvbGwtPmdldExvY2FsZShVTE9DX0FDVFVBTF9MT0NBTEUsIGVjKTsKICAgICAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZWMpKSB7CiAgICAgICAgICAgICAgICAgICAgZXJybG4oIkZBSUw6IENvbGxhdG9yOjpnZXRMb2NhbGUoKSBmYWlsZWQiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTi5CLjogbm93IGV4cGVjdCB2YWxpZD09YWN0dWFsPT1yZXEKICAgICAgICAgICAgICAgICAgICBfY2hlY2tsb2NzKCJDb2xsYXRvcihyZWdpc3RlcmVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEsIHZhbGlkLCBhY3R1YWwsICJlcSIsICJlcSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE5vIG1hdHRlciB3aGF0LCB1bnJlZ2lzdGVyCiAgICAgICAgICAgIENvbGxhdG9yOjp1bnJlZ2lzdGVyKGtleSwgZWMpOwogICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVjKSkgewogICAgICAgICAgICAgICAgZXJybG4oIkZBSUw6IENvbGxhdG9yOjp1bnJlZ2lzdGVyKCkgZmFpbGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVsZXRlIGNvbGw7CiAgICAgICAgICAgIGNvbGwgPSAwOwogICAgICAgIH0KCiAgICAgICAgLy8gQWZ0ZXIgdW5yZWdpc3RlcmluZywgc2hvdWxkIGJlaGF2ZSBub3JtYWxseSBhZ2FpbgogICAgICAgIGNvbGwgPSBDb2xsYXRvcjo6Y3JlYXRlSW5zdGFuY2UocmVxTG9jLCBlYyk7CiAgICAgICAgaWYgKFVfRkFJTFVSRShlYykpIHsKICAgICAgICAgICAgZXJybG4oIkZBSUw6IENvbGxhdG9yOjpjcmVhdGVJbnN0YW5jZSBmYWlsZWQiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWxpZCA9IGNvbGwtPmdldExvY2FsZShVTE9DX1ZBTElEX0xPQ0FMRSwgZWMpOwogICAgICAgICAgICBhY3R1YWwgPSBjb2xsLT5nZXRMb2NhbGUoVUxPQ19BQ1RVQUxfTE9DQUxFLCBlYyk7CiAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZWMpKSB7CiAgICAgICAgICAgICAgICBlcnJsbigiRkFJTDogQ29sbGF0b3I6OmdldExvY2FsZSgpIGZhaWxlZCIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgX2NoZWNrbG9jcygiQ29sbGF0b3IodW5yZWdpc3RlcmVkKSIsIHJlcSwgdmFsaWQsIGFjdHVhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBkZWxldGUgY29sbDsKI2VuZGlmCn0K