Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXZlcnNlX3RyYW5zZm9ybSB8MTMwCgpyZXZlcnNlX3RyYW5zZm9ybQo9PT09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXEKICAgICAgICAsIHR5cGVuYW1lIE9wCiAgICAgICAgLCB0eXBlbmFtZSBJbiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgcmV2ZXJzZV90cmFuc2Zvcm0KICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXExCiAgICAgICAgLCB0eXBlbmFtZSBTZXEyCiAgICAgICAgLCB0eXBlbmFtZSBCaW5hcnlPcAogICAgICAgICwgdHlwZW5hbWUgSW4gPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IHJldmVyc2VfdHJhbnNmb3JtCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpgYHJldmVyc2VfdHJhbnNmb3JtYGAgaXMgYW4gfG92ZXJsb2FkZWQgbmFtZXw6CgoqIGBgcmV2ZXJzZV90cmFuc2Zvcm08U2VxLE9wPmBgIHJldHVybnMgYSByZXZlcnNlZCwgdHJhbnNmb3JtZWQgY29weSBvZiB0aGUgCiAgb3JpZ2luYWwgc2VxdWVuY2UgcHJvZHVjZWQgYnkgYXBwbHlpbmcgYW4gdW5hcnkgdHJhbnNmb3JtYXRpb24gYGBPcGBgIHRvIAogIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHxiZWdpbi9lbmQ8U2VxdWVuY2U+fCByYW5nZS4KCiogYGByZXZlcnNlX3RyYW5zZm9ybTxTZXExLFNlcTIsT3A+YGAgcmV0dXJucyBhIG5ldyBzZXF1ZW5jZSBwcm9kdWNlZCBieSBhcHBseWluZyBhCiAgYmluYXJ5IHRyYW5zZm9ybWF0aW9uIGBgQmluYXJ5T3BgYCB0byBhIHBhaXIgb2YgZWxlbWVudHMgKGVcIDpzdWI6YDFgLCBlMlwgOnN1YjpgMWApIAogIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgfGJlZ2luL2VuZDxTZXExPnwgYW5kIHxiZWdpbi9lbmQ8U2VxMj58IHJhbmdlcyBpbiByZXZlcnNlCiAgb3JkZXIuCgp8dHJhbnNmb3JtYXRpb24gYWxnb3JpdGhtIGRpc2NsYWltZXJ8CgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3RyYW5zZm9ybS5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgLCAgICAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgfCBTZXF1ZW5jZXMgdG8gdHJhbnNmb3JtLiAgICAgICAgICAgfAp8IGBgU2VxMWBgLCBgYFNlcTJgYHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBPcGBgLCAgICAgICAgICAgfCB8TGFtYmRhIEV4cHJlc3Npb258ICAgICAgICAgICAgICAgfCBBIHRyYW5zZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgfAp8IGBgQmluYXJ5T3BgYCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBJbmBgICAgICAgICAgICAgfCB8SW5zZXJ0ZXJ8ICAgICAgICAgICAgICAgICAgICAgICAgfCBBbiBpbnNlcnRlci4gICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKfFNlbWFudGljcyBkaXNjbGFpbWVyLi4ufCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LgoKRm9yIGFueSB8Rm9yd2FyZCBTZXF1ZW5jZXxcIHMgYGBzYGAsIGBgczFgYCBhbmQgYGBzMmBgLCB8TGFtYmRhIEV4cHJlc3Npb258XCBzIGBgb3BgYCBhbmQgYGBvcDJgYCwgCmFuZCBhbiB8SW5zZXJ0ZXJ8IGBgaW5gYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHJldmVyc2VfdHJhbnNmb3JtPHMsb3AsaW4+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgQSB0eXBlLgogICAgCjpQb3N0Y29uZGl0aW9uOgogICAgRXF1aXZhbGVudCB0byAKICAgICAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiBsYW1iZGE8b3A+Ojp0eXBlIGY7CiAgICAgICAgdHlwZWRlZiBsYW1iZGE8aW46Om9wZXJhdGlvbj46OnR5cGUgaW5fb3A7CiAgICAgICAgCiAgICAgICAgdHlwZWRlZiByZXZlcnNlX2ZvbGQ8IAogICAgICAgICAgICAgIHMKICAgICAgICAgICAgLCBpbjo6c3RhdGUKICAgICAgICAgICAgLCBiaW5kPCBpbl9vcCwgXzEsIGJpbmQ8ZiwgXzI+ID4gCiAgICAgICAgICAgID46OnR5cGUgcjsKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiB0cmFuc2Zvcm08czEsczIsb3AsaW4+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgQSB0eXBlLgogICAgCjpQb3N0Y29uZGl0aW9uOgogICAgRXF1aXZhbGVudCB0byAKICAgICAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiBsYW1iZGE8b3AyPjo6dHlwZSBmOwogICAgICAgIHR5cGVkZWYgbGFtYmRhPGluOjpvcGVyYXRpb24+Ojp0eXBlIGluX29wOwoKICAgICAgICB0eXBlZGVmIHJldmVyc2VfZm9sZDwgCiAgICAgICAgICAgICAgcGFpcl92aWV3PHMxLHMyPgogICAgICAgICAgICAsIGluOjpzdGF0ZQogICAgICAgICAgICAsIGJpbmQ8IAogICAgICAgICAgICAgICAgICBpbl9vcAogICAgICAgICAgICAgICAgLCBfMQogICAgICAgICAgICAgICAgLCBiaW5kPGYsIGJpbmQ8Zmlyc3Q8PixfMj4sIGJpbmQ8c2Vjb25kPD4sXzI+ID4KICAgICAgICAgICAgICAgID4gCiAgICAgICAgICAgID46OnR5cGUgcjsKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gRXhhY3RseSBgYHNpemU8cz46OnZhbHVlYGAgLyBgYHNpemU8czE+Ojp2YWx1ZWBgIGFwcGxpY2F0aW9ucyBvZiAKYGBvcGBgIC8gYGBvcDJgYCBhbmQgYGBpbjo6b3BlcmF0aW9uYGAuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgdmVjdG9yPGNoYXIsc2hvcnQsaW50LGxvbmcsZmxvYXQsZG91YmxlPiB0eXBlczsKICAgIHR5cGVkZWYgdmVjdG9yPGRvdWJsZSosZmxvYXQqLGxvbmcqLGludCosc2hvcnQqLGNoYXIqPiBwb2ludGVyczsKICAgIHR5cGVkZWYgcmV2ZXJzZV90cmFuc2Zvcm08IHR5cGVzLGJvb3N0OjphZGRfcG9pbnRlcjxfMT4gPjo6dHlwZSByZXN1bHQ7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbDxyZXN1bHQscG9pbnRlcnM+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8VHJhbnNmb3JtYXRpb24gQWxnb3JpdGhtc3wsIHxSZXZlcnNpYmxlIEFsZ29yaXRobXwsIHx0cmFuc2Zvcm18LCB8cmV2ZXJzZV9jb3B5fCwgfHJlcGxhY2VfaWZ8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=