Li4gSXRlcmF0b3JzL0l0ZXJhdG9yIE1ldGFmdW5jdGlvbnMvL2FkdmFuY2UgfDEwCgphZHZhbmNlCj09PT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgSXRlcmF0b3IKICAgICAgICAsIHR5cGVuYW1lIE4KICAgICAgICA+CiAgICBzdHJ1Y3QgYWR2YW5jZQogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KCk1vdmVzIGBgSXRlcmF0b3JgYCBieSB0aGUgZGlzdGFuY2UgYGBOYGAuIEZvciB8YmlkaXJlY3Rpb25hbHwgYW5kIAp8cmFuZG9tIGFjY2Vzc3wgaXRlcmF0b3JzLCB0aGUgZGlzdGFuY2UgbWF5IGJlIG5lZ2F0aXZlLiAKCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvYWR2YW5jZS5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgSXRlcmF0b3JgYCAgfCB8Rm9yd2FyZCBJdGVyYXRvcnwgICAgICAgIHwgQW4gaXRlcmF0b3IgdG8gYWR2YW5jZS4gICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBOYGAgICAgICAgICB8IHxJbnRlZ3JhbCBDb25zdGFudHwgICAgICAgfCBBIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpNb2RlbCBPZgotLS0tLS0tLQoKfFRhZyBEaXNwYXRjaGVkIE1ldGFmdW5jdGlvbnwKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGEgfEZvcndhcmQgSXRlcmF0b3J8IGBgaXRlcmBgIGFuZCBhcmJpdHJhcnkgfEludGVncmFsIENvbnN0YW50fCBgYG5gYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGFkdmFuY2U8aXRlcixuPjo6dHlwZSBqOyAKCjpSZXR1cm4gdHlwZToKICAgIHxGb3J3YXJkIEl0ZXJhdG9yfC4KCjpQcmVjb25kaXRpb246CiAgICBJZiBgYEl0ZXJhdG9yYGAgaXMgYSB8Rm9yd2FyZCBJdGVyYXRvcnwsIGBgbjo6dmFsdWVgYCBtdXN0IGJlIG5vbm5lZ2F0aXZlLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG86IAogICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIGl0ZXIgaTA7IAogICAgICAgIHR5cGVkZWYgbmV4dDxpMD46OnR5cGUgaTE7IAogICAgICAgIHwuLi58CiAgICAgICAgdHlwZWRlZiBuZXh0PGlcICpuLTEqXCA+Ojp0eXBlIGo7CiAgICAgICAgCiAgICBpZiBgYG46OnZhbHVlID4gMGBgLCBhbmQgCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiBpdGVyIGkwOyAKICAgICAgICB0eXBlZGVmIHByaW9yPGkwPjo6dHlwZSBpMTsgCiAgICAgICAgfC4uLnwKICAgICAgICB0eXBlZGVmIHByaW9yPGlcICpuLTEqXCA+Ojp0eXBlIGo7CiAgICAKICAgIG90aGVyd2lzZS4KCgo6UG9zdGNvbmRpdGlvbjoKICAgIGBgamBgIGlzIGRlcmVmZXJlbmNlYWJsZSBvciBwYXN0LXRoZS1lbmQ7CiAgICBgYGRpc3RhbmNlPGl0ZXIsaj46OnZhbHVlID09IG46OnZhbHVlYGAgaWYgYGBuOjp2YWx1ZSA+IDBgYCwgYW5kIAogICAgYGBkaXN0YW5jZTxqLGl0ZXI+Ojp2YWx1ZSA9PSBuOjp2YWx1ZWBgIG90aGVyd2lzZS4KCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkFtb3J0aXplZCBjb25zdGFudCB0aW1lIGlmIGBgaXRlcmBgIGlzIGEgbW9kZWwgb2YgCnxSYW5kb20gQWNjZXNzIEl0ZXJhdG9yfCwgb3RoZXJ3aXNlIGxpbmVhciB0aW1lLiAKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiByYW5nZV9jPGludCwwLDEwPiBudW1iZXJzOwogICAgdHlwZWRlZiBiZWdpbjxudW1iZXJzPjo6dHlwZSBmaXJzdDsKICAgIHR5cGVkZWYgZW5kPG51bWJlcnM+Ojp0eXBlIGxhc3Q7CgogICAgdHlwZWRlZiBhZHZhbmNlPGZpcnN0LGludF88MTA+ID46OnR5cGUgaTE7CiAgICB0eXBlZGVmIGFkdmFuY2U8bGFzdCxpbnRfPC0xMD4gPjo6dHlwZSBpMjsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGJvb3N0Ojppc19zYW1lPGkxLGxhc3Q+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGJvb3N0Ojppc19zYW1lPGkyLGZpcnN0PiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEl0ZXJhdG9yc3wsIHxUYWcgRGlzcGF0Y2hlZCBNZXRhZnVuY3Rpb258LCB8ZGlzdGFuY2V8LCB8bmV4dHwKCi4uIHxiaWRpcmVjdGlvbmFsfCByZXBsYWNlOjogYGJpZGlyZWN0aW9uYWxgXwouLiBfYmlkaXJlY3Rpb25hbDogYEJpZGlyZWN0aW9uYWwgSXRlcmF0b3JgXwouLiB8cmFuZG9tIGFjY2Vzc3wgcmVwbGFjZTo6IGByYW5kb20gYWNjZXNzYF8KLi4gX3JhbmRvbSBhY2Nlc3M6IGBSYW5kb20gQWNjZXNzIEl0ZXJhdG9yYF8KCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==