Li4gTWV0YWZ1bmN0aW9ucy9Bcml0aG1ldGljIE9wZXJhdGlvbnMvL2RpdmlkZXMgfDQwCgpkaXZpZGVzCj09PT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgVDEKICAgICAgICAsIHR5cGVuYW1lIFQyCiAgICAgICAgLCB0eXBlbmFtZSBUMyA9IHx1bnNwZWNpZmllZHwKICAgICAgICB8Li4ufAogICAgICAgICwgdHlwZW5hbWUgVFwgKm4qID0gfHVuc3BlY2lmaWVkfAogICAgICAgID4KICAgIHN0cnVjdCBkaXZpZGVzCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyB0aGUgcXVvdGllbnQgb2YgaXRzIGFyZ3VtZW50cy4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvZGl2aWRlcy5ocHA+CiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2FyaXRobWV0aWMuaHBwPgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8TnVtZXJpYyBNZXRhZnVuY3Rpb258CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IHxUMS4uLlRufCAgICAgfCB8SW50ZWdyYWwgQ29uc3RhbnR8ICAgICAgIHwgT3BlcmF0aW9uJ3MgYXJndW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgp8Tm90ZTp8IHxudW1lcmljIG1ldGFmdW5jdGlvbiBub3RlfCB8LS0gZW5kIG5vdGV8CgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgfEludGVncmFsIENvbnN0YW50fFwgcyB8YzEuLi5jbnw6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgZGl2aWRlczxjMSxcIHwuLi58XCBjXCAqbipcPjo6dHlwZSByOyAKCjpSZXR1cm4gdHlwZToKICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgo6UHJlY29uZGl0aW9uOgogICAgYGBjMjo6dmFsdWUgIT0gMGBgLCB8Li4ufCBgYGNuOjp2YWx1ZSAhPSAwYGAuCiAKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgaW50ZWdyYWxfYzwKICAgICAgICAgICAgICB0eXBlb2YoYzE6OnZhbHVlIC8gYzI6OnZhbHVlKQogICAgICAgICAgICAsICggYzE6OnZhbHVlIC8gYzI6OnZhbHVlICkKICAgICAgICAgICAgPiBjOwogICAgICAgICAgICAKICAgICAgICB0eXBlZGVmIGRpdmlkZXM8YyxjMyxcIHwuLi58XGNcICpuKlw+Ojp0eXBlIHI7IAoKLi4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGRpdmlkZXM8YzEsXCB8Li4ufFwgY1wgKm4qXD4gcjsKCjpSZXR1cm4gdHlwZToKICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgo6UHJlY29uZGl0aW9uOgogICAgYGBjMjo6dmFsdWUgIT0gMGBgLCB8Li4ufCBgYGNuOjp2YWx1ZSAhPSAwYGAuCiAKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHN0cnVjdCByIDogZGl2aWRlczxjMSxcIHwuLi58XCBjXCAqbipcPjo6dHlwZSB7fTsKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkFtb3J0aXplZCBjb25zdGFudCB0aW1lLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIGRpdmlkZXM8IGludF88LTEwPiwgaW50XzwzPiwgbG9uZ188MT4gPjo6dHlwZSByOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggcjo6dmFsdWUsID09LCAtMyApOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8IHI6OnZhbHVlX3R5cGUsIGxvbmcgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEFyaXRobWV0aWMgT3BlcmF0aW9uc3wsIHxOdW1lcmljIE1ldGFmdW5jdGlvbnwsIHxudW1lcmljX2Nhc3R8LCB8dGltZXN8LCB8bW9kdWx1c3wsIHxwbHVzfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK