TEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjEuMCBhbmQgMi4wLjkKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gVGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIGhhcyBiZWVuIGZpeGVkIHRvIHByb2R1Y2UKICAgICAgX2V4YWN0bHlfIHRoZSBzYW1lIG91dHB1dCBhcyBGcmVlVHlwZSAxLnguICBQcmV2aW91cyBkaWZmZXJlbmNlcwogICAgICB3ZXJlIGR1ZSB0byBzbGlnaHRseSBkaXN0aW5jdCBmaXhlZC1wb2ludCBjb21wdXRhdGlvbiByb3V0aW5lcwogICAgICB1c2VkIHRvIHBlcmZvcm0gZG90IHByb2R1Y3RzIGFuZCB2ZWN0b3IgbGVuZ3RoIG1lYXN1cmVtZW50cy4KCiAgICAgIEl0IHNlZW1zIHRoYXQgbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgaXMgX2V4dHJlbWVseV8gc2Vuc2l0aXZlCiAgICAgIHRvIHJvdW5kaW5nIGVycm9ycy4gIFRoZSByZXF1aXJlZCB2ZWN0b3IgY29tcHV0YXRpb24gcm91dGluZXMgaGF2ZQogICAgICBiZWVuIG9wdGltaXplZCBhbmQgcGxhY2VkIHdpdGhpbiB0aGUgInR0aW50ZXJwLmMiIGZpbGUuCgogICAgLSBGaXhlZCB0aGUgcGFyc2luZyBvZiBhY2NlbGVyYXRvciB0YWJsZXMgaW4gdGhlIFBDRiBmb250IGRyaXZlcgogICAgCiAgICAtIEZpeGVkIHRoZSBUeXBlMSBnbHlwaCBsb2FkZXIgcm91dGluZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGZvbnQncwogICAgICBtYXhpbXVtIGFkdmFuY2Ugd2lkdGguCgogIElJLiBORVcgRkVBVFVSRVMKCiAgICAtIFRoZSBgY29uZmlndXJlJyBzY3JpcHQgdXNlZCBvbiBVbml4IHN5c3RlbXMgaGFzIGJlZW4gbW9kaWZpZWQgdG8KICAgICAgY2hlY2sgdGhhdCBHTlUgTWFrZSBpcyBiZWluZyB1c2VkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiAgT3RoZXJ3aXNlLAogICAgICBpdCB3aWxsIGRpc3BsYXkgYSBtZXNzYWdlIHByb3Bvc2luZyB0byB1c2UgdGhlIEdOVU1BS0UgZW52aXJvbm1lbnQKICAgICAgdmFyaWFibGUgdG8gbmFtZSBpdC4KCiAgICAgIFRoZSBVbml4LXNwZWNpZmljIGZpbGUgUkVBRE1FLlVOWCBoYXMgYmVlbiBtb2RpZmllZCBhY2NvcmRpbmdseS4KCgogIElJSS4gTUlTQ0VMTEFORU9VUwoKICAgIC0gVGhlIEZyZWVUeXBlIExpY2Vuc2UgaW4gYGRvY3MvRlRMLnR4dCcgaGFzIGJlZW4gdXBkYXRlZCB0byBpbmNsdWRlCiAgICAgIGEgcHJvcG9zZWQgcHJlZmVycmVkIGRpc2NsYWltZXIuICBJZiB5b3UgYXJlIHVzaW5nIEZyZWVUeXBlIGluIHlvdXIKICAgICAgcHJvZHVjdHMsIHlvdSBhcmUgZW5jb3VyYWdlZCAoYnV0IG5vdCBtYW5kYXRlZCkgdG8gdXNlIHRoZSBmb2xsb3dpbmcKICAgICAgdGV4dCBpbiB5b3VyIGRvY3VtZW50YXRpb246CgogICAgICAiIiIKICAgICAgICBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBjb3B5cmlnaHQgqSAxOTk2LTIwMDIgVGhlIEZyZWVUeXBlCiAgICAgICAgUHJvamVjdCAod3d3LmZyZWV0eXBlLm9yZykuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICAiIiIKCiAgICAtIFRoZSBkZWZhdWx0IHNpemUgb2YgdGhlIHJlbmRlciBwb29sIGhhcyBiZWVuIHJlZHVjZWQgdG8gMTZrQnl0ZS4KICAgICAgVGhpcyBzaG91bGRuJ3QgcmVzdWx0IGluIGFueSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIHBlbmFsdHksIHVubGVzcwogICAgICB5b3UgYXJlIHVzaW5nIHRoZSBlbmdpbmUgYXMtaXMgdG8gcmVuZGVyIHZlcnkgbGFyZ2UgYW5kIGNvbXBsZXgKICAgICAgZ2x5cGhzLgoKICAgIC0gVGhlIEZyZWVUeXBlIDIgcmVkZXNpZ24gaGFzIGJlZ3VuLiAgTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQKICAgICAgYXQgdGhpcyBVUkw6CgogICAgICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2ZyZWV0eXBlMi9yZWRlc2lnbi5odG1sCgogICAgICBUaGUgZm9sbG93aW5nIGludGVybmFsIGNoYW5nZXMgaGF2ZSBiZWVuIHBlcmZvcm1lZCB3aXRoaW4gdGhlIHNvdXJjZXMKICAgICAgb2YgdGhpcyByZWxlYXNlOgoKICAgICAgICAtIE1hbnkgaW50ZXJuYWwgdHlwZXMgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gaW5jcmVhc2UgY29uc2lzdGVuY3kuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSB0cnVlLCBleGNlcHQgZm9yIHB1YmxpYyB0eXBlczoKCiAgICAgICAgICAgICogQWxsIHN0cnVjdHVyZSB0eXBlcyBoYXZlIGEgbmFtZSBlbmRpbmcgaW4gIlJlYyIgKHNob3J0IGZvcgogICAgICAgICAgICAgIGByZWNvcmQnKS4KCiAgICAgICAgICAgICogQSBwb2ludGVyLXRvLXN0cnVjdHVyZSB0eXBlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZQogICAgICAgICAgICAgIHN0cnVjdHVyZSwgX3dpdGhvdXRfIHRoZSAiUmVjIiBzdWZmaXguCgogICAgICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEZvb1JlY18KICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgICAgICAgfSBGb29SZWMsICpGb287CgogICAgICAgIC0gTWFueSBpbnRlcm5hbCBtYWNyb3MgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gaW5jcmVhc2UgY29uc2lzdGVuY3kuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSB0cnVlOgoKICAgICAgICAgICAgKiBBbGwgbWFjcm9zIGhhdmUgYSBuYW1lIGJlZ2lubmluZyB3aXRoICJGVF8iLiAgVGhpcyByZXF1aXJlZAogICAgICAgICAgICAgIGEgZmV3IGNoYW5nZXMgbGlrZQoKICAgICAgICAgICAgICAgIEFMTE9DICAgPT4gRlRfQUxMT0MKICAgICAgICAgICAgICAgIEZSRUUgICAgPT4gRlRfRlJFRQogICAgICAgICAgICAgICAgUkVBTExPQyA9PiBGVF9SRUFMTE9DCgogICAgICAgICAgICAqIEFsbCBtYWNyb3MgYXJlIGNvbXBsZXRlbHkgVVBQRVJDQVNFLiAgVGhpcyByZXF1aXJlZCBhIGZldwogICAgICAgICAgICAgIGNoYW5nZXMgbGlrZToKCiAgICAgICAgICAgICAgICBSRUFEX1Nob3J0ICA9PiBGVF9SRUFEX1NIT1JUCiAgICAgICAgICAgICAgICBORVhUX1Nob3J0ICA9PiBGVF9ORVhUX1NIT1JUCiAgICAgICAgICAgICAgICBHRVRfVUxvbmdMRSA9PiBGVF9HRVRfVUxPTkdfTEUKICAgICAgICAgICAgICAgIE1FTV9TZXQgICAgID0+IEZUX01FTV9TRVQKICAgICAgICAgICAgICAgIE1FTV9Db3B5ICAgID0+IEZUX01FTV9DT1BZCiAgICAgICAgICAgICAgICBldGMuCgogICAgICAgICAgICAqIFdoZW5ldmVyIHBvc3NpYmxlLCBhbGwgbWFjcm8gbmFtZXMgZm9sbG93IHRoZQogICAgICAgICAgICAgIEZUXzxPQkpFQ1Q+XzxNRVRIT0Q+IHBhdHRlcm4uICBGb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgIEFDQ0VTU19GcmFtZSAgID0+IEZUX0ZSQU1FX0VOVEVSCiAgICAgICAgICAgICAgICBGT1JHRVRfRnJhbWUgICA9PiBGVF9GUkFNRV9FWElUCiAgICAgICAgICAgICAgICBFWFRSQUNUX0ZyYW1lICA9PiBGVF9GUkFNRV9FWFRSQUNUCiAgICAgICAgICAgICAgICBSRUxFQVNFX0ZyYW1lICA9PiBGVF9GUkFNRV9SRUxFQVNFCgogICAgICAgICAgICAgICAgRklMRV9Qb3MgICAgICAgPT4gRlRfU1RSRUFNX1BPUwogICAgICAgICAgICAgICAgRklMRV9TZWVrICAgICAgPT4gRlRfU1RSRUFNX1NFRUsKICAgICAgICAgICAgICAgIEZJTEVfUmVhZCAgICAgID0+IEZUX1NUUkVBTV9SRUFECiAgICAgICAgICAgICAgICBGSUxFX1JlYWRBdCAgICA9PiBGVF9TVFJFQU1fUkVBRF9BVAogICAgICAgICAgICAgICAgUkVBRF9GaWVsZHMgICAgPT4gRlRfU1RSRUFNX1JFQURfRklFTERTCgogICAgICAgIC0gTWFueSBpbnRlcm5hbCBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gZm9sbG93IHRoZQogICAgICAgICAgRlRfPE9iamVjdD5fPE1ldGhvZD4gcGF0dGVybi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgRlRfU2Vla19TdHJlYW0gICAgICAgPT4gRlRfU3RyZWFtX1NlZWsKICAgICAgICAgICAgRlRfUmVhZF9TdHJlYW1fQXQgICAgPT4gRlRfU3RyZWFtX1JlYWRBdAogICAgICAgICAgICBGVF9Eb25lX1N0cmVhbSAgICAgICA9PiBGVF9TdHJlYW1fQ2xvc2UKICAgICAgICAgICAgRlRfTmV3X1N0cmVhbSAgICAgICAgPT4gRlRfU3RyZWFtX09wZW4KICAgICAgICAgICAgRlRfTmV3X01lbW9yeV9TdHJlYW0gPT4gRlRfU3RyZWFtX09wZW5NZW1vcnkKICAgICAgICAgICAgRlRfRXh0cmFjdF9GcmFtZSAgICAgPT4gRlRfU3RyZWFtX0V4dHJhY3RGcmFtZQoKICAgICAgICAgIE5vdGUgdGhhdCBtZXRob2QgbmFtZXMgZG8gbm90IGNvbnRhaW4gIl8iLgoKICAgICAgICAtIFRoZSBGVF9BTExPQ19BUlJBWSBhbmQgRlRfUkVBTExPQ19BUlJBWSBoYXZlIGJlZW4gcmVwbGFjZWQKICAgICAgICAgIHdpdGggRlRfTkVXX0FSUkFZIGFuZCBGVF9SRU5FV19BUlJBWSB3aGljaCBkbyBub3QgdGFrZSBhIHR5cGUKICAgICAgICAgIGFzIHRoZSBmb3VydGggYXJndW1lbnQuICBJbnN0ZWFkLCB0aGUgYXJyYXkgZWxlbWVudCB0eXBlIHNpemUKICAgICAgICAgIGlzIGNvbXB1dGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IHBvaW50ZXIKICAgICAgICAgIHVzZWQuCgogICAgICAgIC0gQSBuZXcgb2JqZWN0IGNsYXNzLCBGVF9DTWFwLCBoYXMgYmVlbiBpbnRyb2R1Y2VkLiAgVGhlc2UKICAgICAgICAgIGludGVybmFsIG9iamVjdHMgYXJlIHVzZWQgdG8gbW9kZWwgY2hhcmFjdGVyIG1hcHMuICBUaGlzIGVhc2VzCiAgICAgICAgICB0aGUgc3VwcG9ydCBvZiBhZGRpdGlvbmFsIGNoYXJtYXAgdHlwZXMgd2l0aGluIHRoZSBlbmdpbmUuCgogICAgICAgIC0gQSBuZXcgY29uZmlndXJhdGlvbiBmaWxlIG5hbWVkICJmdHN0ZGxpYi5oIiBoYXMgYmVlbiBhZGRlZAogICAgICAgICAgdG8gYGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnJy4gIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGFsaWFzZXMKICAgICAgICAgIGZvciBfZXZlcnlfIHJvdXRpbmUgb2YgdGhlIElTTyBDIGxpYnJhcnkgdGhhdCB0aGUgZm9udCBlbmdpbmUKICAgICAgICAgIHVzZXMuICBFYWNoIGFsaWFzZXMgaGFzIGEgImZ0XyIgcHJlZml4IChlLmcuICJmdF9zdHJsZW4iIGlzIGFuCiAgICAgICAgICBhbGlhcyBmb3IgInN0cmxlbiIpLgoKICAgICAgICAgIFRoaXMgaXMgdXNlZCB0byBlYXNlIHRoZSBwb3J0aW5nIG9mIEZyZWVUeXBlIDIgdG8gZXhvdGljIHJ1bnRpbWUKICAgICAgICAgIGVudmlyb25tZW50cyB3aGVyZSB0aGUgSVNPIEMgTGlicmFyeSBpc24ndCBhdmFpbGFibGUgKGUuZy4KICAgICAgICAgIFhGcmVlODYgZXh0ZW5zaW9uIG1vZHVsZXMpLgoKICAgICAgTW9yZSBkZXRhaWxzIGFyZSBhdmFpbGFibGUgaW4gdGhlICJDaGFuZ2VMb2ciIGZpbGUuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuOSBhbmQgMi4wLjgKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gQ2VydGFpbiBmb250cyBsaWtlICJmb3hqdW1wLnR0ZiIgY29udGFpbiBicm9rZW4gbmFtZSB0YWJsZXMgd2l0aAogICAgICBpbnZhbGlkIGVudHJpZXMgYW5kIHdpbGQgb2Zmc2V0cy4gIFRoaXMgY2F1c2VkIEZyZWVUeXBlIHRvIGNyYXNoIHdoZW4KICAgICAgdHJ5aW5nIHRvIGxvYWQgdGhlbS4KCiAgICAgIFRoZSBTRk5UIGBuYW1lJyB0YWJsZSBsb2FkZXIgaGFzIGJlZW4gZml4ZWQgdG8gYmUgYWJsZSB0byBzdXBwb3J0CiAgICAgIHRoZXNlIHN0cmFuZ2UgZm9udHMuCgogICAgICBNb3Jlb3ZlciwgdGhlIGNvZGUgaW4gY2hhcmdlIG9mIHByb2Nlc3NpbmcgdGhpcyB0YWJsZSBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgIHRvIGFsd2F5cyBmYXZvdXIgV2luZG93cy1mb3JtYXR0ZWQgZW50cmllcyBvdmVyIG90aGVyIG9uZXMuICBIZW5jZSwgYQogICAgICBmb250IHRoYXQgd29ya3Mgb24gV2luZG93cyBidXQgbm90IG9uIHRoZSBNYWMgd2lsbCBsb2FkIGNsZWFubHkgaW4KICAgICAgRnJlZVR5cGUgYW5kIHJlcG9ydCBhY2N1cmF0ZSB2YWx1ZXMgZm9yIEZhbWlseSAmIFBvc3RTY3JpcHQgbmFtZXMuCgogICAgLSBUaGUgQ0lEIGZvbnQgZHJpdmVyIGhhcyBiZWVuIGZpeGVkLiAgSXQgdW5mb3J0dW5hdGVseSByZXR1cm5lZCBhCiAgICAgIFBvc3RzY3JpcHQgRm9udCBuYW1lIHdpdGggYSBsZWFkaW5nIHNsYXNoLCBhcyBpbgogICAgICAiL011bmh3YUdvdGhpYy1SZWd1bGFyIi4KCiAgICAtIEZyZWVUeXBlIDIgc2hvdWxkIG5vdyBjb21waWxlIGZpbmUgb24gQUlYIDQuMy4zIGFzIGEgc2hhcmVkIGxpYnJhcnkuCgogICAgLSBBIGJ1ZyBpbiB0aGUgUG9zdHNjcmlwdCBoaW50ZXIgaGFzIGJlZW4gZm91bmQgYW5kIGZpeGVkLCByZW1vdmluZwogICAgICB1bi1ldmVuIHN0ZW0gd2lkdGhzIGF0IHNtYWxsIHBpeGVsIHNpemVzIChsaWtlIDE0LTE3KS4KCiAgICAgIFRoaXMgaW1wcm92ZXMgdGhlIHF1YWxpdHkgb2YgYSBjZXJ0YWluIG51bWJlciBvZiBQb3N0c2NyaXB0IGZvbnRzLgoKCiAgSUkuIE5FVyBGRUFUVVJFUwoKICAgIC0gQSBuZXcgZnVuY3Rpb24gbmFtZWQgYEZUX0xpYnJhcnlfVmVyc2lvbicgaGFzIGJlZW4gYWRkZWQgdG8gcmV0dXJuCiAgICAgIHRoZSBjdXJyZW50IGxpYnJhcnkncyBtYWpvciwgbWlub3IsIGFuZCBwYXRjaCB2ZXJzaW9uIG51bWJlcnMuICBUaGlzCiAgICAgIGlzIGltcG9ydGFudCBzaW5jZSB0aGUgbWFjcm9zIEZSRUVUWVBFX01BSk9SLCBGUkVFVFlQRV9NSU5PUiwgYW5kCiAgICAgIEZSRUVUWVBFX1BBVENIIGNhbm5vdCBiZSB1c2VkIHdoZW4gdGhlIGxpYnJhcnkgaXMgZHluYW1pY2FsbHkgbGlua2VkCiAgICAgIGJ5IGEgcHJvZ3JhbS4KCiAgICAtIFR3byBuZXcgQVBJcyBoYXZlIGJlZW4gYWRkZWQ6IGBGVF9HZXRfRmlyc3RfQ2hhcicgYW5kCiAgICAgIGBGVF9HZXRfTmV4dF9DaGFyJy4KCiAgICAgIFRvZ2V0aGVyLCB0aGVzZSBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIGVmZmljaWVudGx5IG92ZXIgdGhlIGN1cnJlbnRseQogICAgICBzZWxlY3RlZCBjaGFybWFwIG9mIGEgZ2l2ZW4gZmFjZS4gIFJlYWQgdGhlIEFQSSByZWZlcmVuY2UgZm9yIG1vcmUKICAgICAgZGV0YWlscy4KCgogIElJSS4gTUlTQ0VMTEFORU9VUwoKICAgIC0gVGhlIEZyZWVUeXBlIHNvdXJjZXMgYXJlIHVuZGVyIGhlYXZ5IGludGVybmFsIHJlLWZhY3RvcmluZy4gIEFzIGEKICAgICAgY29uc2VxdWVuY2UsIHdlIGhhdmUgY3JlYXRlZCBhIGJyYW5jaCBuYW1lZCAiU1RBQkxFIiBvbiB0aGUgQ1ZTIHRvCiAgICAgIGhvbGQgYWxsIGZ1dHVyZSByZWxlYXNlcy9maXhlcyBpbiB0aGUgMi4wLnggZmFtaWx5LgoKICAgICAgVGhlIEhFQUQgYnJhbmNoIG5vdyBjb250YWlucyB0aGUgcmUtZmFjdG9yZWQgc291cmNlcyBhbmQgc2hvdWxkbid0IGJlCiAgICAgIHVzZWQgZm9yIHRlc3Rpbmcgb3IgcGFja2FnaW5nIG5ldyByZWxlYXNlcy4gIEluIGNhc2UgeW91IHdvdWxkIGxpa2UKICAgICAgdG8gYWNjZXNzIHRoZSAyLjAuOSBzb3VyY2VzIGZyb20gb3VyIENWUyByZXBvc2l0b3J5LCB1c2UgdGhlIHRhZwogICAgICBgVkVSLTItMC05Jy4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC44IGFuZCAyLjAuNwoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBUaGVyZSB3YXMgYSBzbWFsbCBidXQgbmFzdHkgYnVnIGluICJmcmVldHlwZS1jb25maWcuaW4iIHdoaWNoCiAgICAgIGNhdXNlZCB0aGUgImZyZWV0eXBlLWNvbmZpZyIgc2NyaXB0IHRvIGZhaWwgb24gVW5peC4KCiAgICAgIFRoaXMgZGlkbid0IHByZXZlbnQgdGhlIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeSBvciBldmVuCiAgICAgIGl0cyBleGVjdXRpb24sIGJ1dCBjYXVzZWQgcHJvYmxlbXMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSBtYW55CiAgICAgIFVuaXggcGFja2FnZXMgdGhhdCBkZXBlbmQgb24gaXQuCgogICAgLSBTb21lIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnRzIGVtYmVkZGVkIGluIFBERiBkb2N1bWVudHMgZG8KICAgICAgbm90IGhhdmUgYSAnY21hcCcsICdwb3N0JyBhbmQgJ25hbWUnIGFzIGlzIHJlcXVpcmVkIGJ5IHRoZQogICAgICBzcGVjaWZpY2F0aW9uLiAgRnJlZVR5cGUgbm8gbG9uZ2VyIHJlZnVzZXMgdG8gbG9hZCBzdWNoIGZvbnRzLgoKICAgIC0gdmFyaW91cyBmaXhlcyB0byB0aGUgUENGIGZvbnQgZHJpdmVyCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuNyBhbmQgMi4wLjYKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gRml4ZWQgdHdvIGJ1Z3MgaW4gdGhlIFR5cGUgMSBmb250IGRyaXZlci4gIFRoZSBmaXJzdCBvbmUgcmVzdWx0ZWQgaW4gYQogICAgICBtZW1vcnkgbGVhayBpbiBzdWJ0bGUgY2FzZXMuICBUaGUgb3RoZXIgb25lIGNhdXNlZCBGcmVlVHlwZSB0byBjcmFzaAogICAgICB3aGVuIHRyeWluZyB0byBsb2FkICIuZ3NmIiBmaWxlcyAoR2hvc3RzY3JpcHQgc28tY2FsbGVkIFBvc3RzY3JpcHQKICAgICAgZm9udHMpLgoKICAgICAgKFRoaXMgbWFkZSBfbWFueV8gS0RFIGFwcGxpY2F0aW9ucyBjcmFzaCBvbiBjZXJ0YWluIHN5c3RlbXMuICBGcmVlVHlwZQogICAgICAgX2lzXyBiZWNvbWluZyBhIGNyaXRpY2FsIHN5c3RlbSBjb21wb25lbnQgb24gTGludXggOi0pCgogICAgLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBDRkYgZm9udCBkcml2ZXIuCgogICAgLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBQQ0YgZm9udCBkcml2ZXIuCgogICAgLSBGaXhlZCB0aGUgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGUgImJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCIKICAgICAgc2luY2UgaXQgZGlkbid0IGluY2x1ZGUgdGhlIFBvc3RzY3JpcHQgaGludGVyIGNvbXBvbmVudCwgY2F1c2luZwogICAgICBlcnJvcnMgYXQgYnVpbGQgdGltZS4KCiAgICAtIEZpeGVkIGEgc21hbGwgcmVuZGVyaW5nIGJ1ZyBpbiB0aGUgYW50aS1hbGlhc2VkIHJlbmRlcmVyIHRoYXQgb25seQogICAgICBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byBkcmF3IHRoaW4gKGxlc3MgdGhhbiAxIHBpeGVsKSBzdHJva2VzLgoKICAgIC0gRml4ZWQgImJ1aWxkcy91bml4L2ZyZWV0eXBlMi5hNCIgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZSBhIHZhbGlkCiAgICAgICJmcmVldHlwZTIubTQiIGZvciB1c2Ugd2l0aCBhdXRvY29uZi4KCiAgICAtIEZpeGVkIHRoZSBPcGVuVk1TIE1ha2VmaWxlcy4KCgogIElJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBBZGRlZCAiY29uZmlndXJlIiBhbmQgImluc3RhbGwiIHNjcmlwdHMgdG8gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCiAgICAgIEEgR05VLXN0eWxlIGluc3RhbGxhdGlvbiBpcyB0aHVzIG5vdyBlYXNpbHkgcG9zc2libGUgd2l0aAoKICAgICAgICAgIC4vY29uZmlndXJlICA8b3B0aW9ucz4KICAgICAgICAgIG1ha2UKICAgICAgICAgIG1ha2UgaW5zdGFsbAoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjYgYW5kIDIuMC41CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIEl0IHdhc24ndCBwb3NzaWJsZSB0byBsb2FkIGVtYmVkZGVkIGJpdG1hcHMgd2hlbiB0aGUgYXV0by1oaW50ZXIgd2FzCiAgICAgIHVzZWQuICBUaGlzIGlzIG5vdyBmaXhlZC4KCiAgICAtIFRoZSBUcnVlVHlwZSBmb250IGRyaXZlciBkaWRuJ3QgbG9hZCBzb21lIGNvbXBvc2l0ZXMgcHJvcGVybHkgKHRoZQogICAgICBzdWItZ2x5cGhzIHdlcmUgc2xpZ2h0bHkgc2hpZnRlZCwgYW5kIHRoaXMgd2FzIG9ubHkgbm90aWNlYWJsZSB3aGVuCiAgICAgIHVzaW5nIG1vbm9jaHJvbWUgcmVuZGVyaW5nKS4KCiAgICAtIFZhcmlvdXMgZml4ZXMgdG8gdGhlIGF1dG8taGludGVyLiAgVGhleSBtZXJlbHkgaW1wcm92ZSB0aGUgb3V0cHV0IG9mCiAgICAgIHNhbnMtc2VyaWYgZm9udHMuICBOb3RlIHRoYXQgdGhlcmUgYXJlIHN0aWxsIHByb2JsZW1zIHdpdGggc2VyaWZlZAogICAgICBmb250cyBhbmQgY29tcG9zaXRlcyAoYWNjZW50ZWQgY2hhcmFjdGVycykuCgogICAgLSBBbGwgc2NhbGFibGUgZm9udCBkcml2ZXJzIGVycm9uZW91c2x5IHJldHVybmVkIHVuLWZpdHRlZCBnbHlwaAogICAgICBhZHZhbmNlcyB3aGVuIGhpbnRpbmcgd2FzIHJlcXVlc3RlZC4gIFRoaXMgY3JlYXRlZCBwcm9ibGVtcyBmb3IgYQogICAgICBudW1iZXIgb2YgbGF5b3V0IGFwcGxpY2F0aW9ucy4gIFRoaXMgaXMgYSB2ZXJ5IG9sZCBidWcgdGhhdCBnb3QKICAgICAgdW5kZXRlY3RlZCBtYWlubHkgYmVjYXVzZSBtb3N0IHRlc3QvZGVtbyBwcm9ncmFtIHBlcmZvcm0gcm91bmRpbmcKICAgICAgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5ICh0aHJvdWdoIHRoZSBjYWNoZSkuCgogICAgLSBGVF9HbHlwaF9Ub19CaXRtYXAoKSBkaWQgZXJyb25lb3VzbHkgbW9kaWZ5IHRoZSBzb3VyY2UgZ2x5cGggaW4KICAgICAgY2VydGFpbiBjYXNlcy4KCiAgICAtICJnbG5hbWVzLnB5IiBzdGlsbCBjb250YWluZWQgYSBidWcgdGhhdCBtYWRlIEZyZWVUeXBlIHJldHVybiBpbnZhbGlkCiAgICAgIG5hbWVzIGZvciBjZXJ0YWluIGdseXBocy4KCiAgICAtIFRoZSBsaWJyYXJ5IGNyYXNoZWQgd2hlbiBsb2FkaW5nIGNlcnRhaW4gVHlwZSAxIGZvbnRzIGxpa2UgInNhZG4ucGZiIgogICAgICAoIlN0YWxpbmdyYWQgTm9ybWFsIiksIHdoaWNoIGFwcGVhciB0byBjb250YWluIHBhdGhldGljIGZvbnQgaW5mbwogICAgICBkaWN0aW9uYXJpZXMuCgogICAgLSBUaGUgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIGlzIG5vdyBtdWNoIG1vcmUgcGFyYW5vaWQgYW5kIGNoZWNrcyBldmVyeXRoaW5nCiAgICAgIHdoZW4gbG9hZGluZyBhIGdpdmVuIGdseXBoIGltYWdlLiAgVGhpcyB3YXMgbmVjZXNzYXJ5IHRvIGF2b2lkCiAgICAgIHByb2JsZW1zIChjcmFzaGVzIGFuZC9vciBtZW1vcnkgb3ZlcndyaXRlcykgd2l0aCBicm9rZW4gZm9udHMgdGhhdAogICAgICBjYW1lIGZyb20gYSByZWFsbHkgYnVnZ3kgYXV0b21hdGljIGZvbnQgY29udmVydGVyLgoKCiAgSUkuIElNUE9SVEFOVCBVUERBVEVTIEFORCBORVcgRkVBVFVSRVMKCiAgICAtIEltcG9ydGFudCB1cGRhdGVzIHRvIHRoZSBNYWMtc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkuCgogICAgLSBUaGUgY2FjaGluZyBzdWItc3lzdGVtIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmUtZGVzaWduZWQsIGFuZCBpdHMgQVBJCiAgICAgIGhhcyBldm9sdmVkICh0aGUgb2xkIG9uZSBpcyBzdGlsbCBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcwogICAgICBjb21wYXRpYmlsaXR5KS4KCiAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGZvciBpdCBpcyBub3QgeWV0IGNvbXBsZXRlZCwgc29ycnkuICBGb3Igbm93LCB5b3UKICAgICAgYXJlIGVuY291cmFnZWQgdG8gY29udGludWUgdXNpbmcgdGhlIG9sZCBBUEkuICBIb3dldmVyLCB0aGUgZnR2aWV3CiAgICAgIGRlbW8gcHJvZ3JhbSBpbiB0aGUgZnQyZGVtb3MgcGFja2FnZSBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgdG8gdXNlCiAgICAgIHRoZSBuZXcgY2FjaGluZyBmdW5jdGlvbnMuCgogICAgLSBBIG5ldyBjaGFybWFwIGNhY2hlIGlzIHByb3ZpZGVkIHRvby4gIFNlZSBGVENfQ01hcENhY2hlKCkuICBUaGlzIGlzCiAgICAgIHVzZWZ1bCB0byBwZXJmb3JtIGNoYXJhY3RlciBjb2RlIC0+IGdseXBoIGluZGV4IHRyYW5zbGF0aW9ucyBxdWlja2x5LAogICAgICB3aXRob3V0IHRoZSBuZWVkIGZvciBhbiBvcGVuZWQgRlRfRmFjZS4KCiAgICAtIEEgTkVXIFBPU1RTQ1JJUFQgSElOVEVSIG1vZHVsZSBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IG5hdGl2ZSBoaW50cwogICAgICBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6IFBvc3RTY3JpcHQgVHlwZSAxLCBQb3N0U2NyaXB0IENJRCwgYW5kCiAgICAgIENGRi9DRUYuCgogICAgICBQbGVhc2UgdGVzdCEgIE5vdGUgdGhhdCB0aGUgYXV0by1oaW50ZXIgcHJvZHVjZXMgYmV0dGVyIHJlc3VsdHMgZm9yIGEKICAgICAgbnVtYmVyIG9mIGJhZGx5LWhpbnRlZCBmb250cyAobW9zdGx5IGF1dG8tZ2VuZXJhdGVkIG9uZXMpIHRob3VnaC4KCiAgICAtIEEgbWVtb3J5IGRlYnVnZ2VyIGlzIG5vdyBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBGcmVlVHlwZSBzb3VyY2VzLiAgVG8KICAgICAgZW5hYmxlIGl0LCBkZWZpbmUgRlRfREVCVUdfTUVNT1JZIGluIDxmcmVldHlwZS9jb25maWcvZnRvcHRpb24uaD4sIGFuZAogICAgICByZWNvbXBpbGUgdGhlIGxpYnJhcnkuCgogICAgICBBZGRpdGlvbmFsbHksIGRlZmluZSB0aGUgX2Vudmlyb25tZW50XyB2YXJpYWJsZSBGVF9ERUJVR19NRU1PUlkgYW5kCiAgICAgIHJ1biBhbnkgcHJvZ3JhbSB1c2luZyBGcmVlVHlwZS4gIFdoZW4gdGhlIGxpYnJhcnkgaXMgZXhpdGVkLCBhIHN1bW1hcnkKICAgICAgb2YgbWVtb3J5IGZvb3RwcmludHMgYW5kIHBvc3NpYmxlIGxlYWtzIHdpbGwgYmUgZGlzcGxheWVkLgoKICAgICAgVGhpcyB3b3JrcyB0cmFuc3BhcmVudGx5IHdpdGggX2FueV8gcHJvZ3JhbSB0aGF0IHVzZXMgRnJlZVR5cGUuCiAgICAgIEhvd2V2ZXIsIHlvdSB3aWxsIG5lZWQgYSBsb3Qgb2YgbWVtb3J5IHRvIHVzZSB0aGlzIChhbGxvY2F0ZWQgYmxvY2tzCiAgICAgIGFyZSBuZXZlciByZWxlYXNlZCB0byB0aGUgaGVhcCB0byBkZXRlY3QgZG91YmxlIGRlbGV0ZXMgZWFzaWx5KS4KCgogIElJSS4gTUlTQ0VMTEFORU9VUwoKICAgIC0gV2UgYXJlIGF3YXJlIG9mIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvdXRwdXQgb2YgRnJlZVR5cGUKICAgICAgdmVyc2lvbnMgMSBhbmQgMiB3aGVuIGl0IGNvbWVzIHRvIG1vbm9jaHJvbWUgVHJ1ZVR5cGUtaGludGVkIGdseXBocy4KICAgICAgVGhlc2UgYXJlIG1vc3QgcHJvYmFibHkgZHVlIHRvIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRoZSBtb25vY2hyb21lCiAgICAgIHJhc3Rlcml6ZXJzIGFuZCB3aWxsIGJlIHdvcmtlZCBvdXQgaW4gYW4gdXBjb21pbmcgcmVsZWFzZS4KCiAgICAtIFdlIGhhdmUgZGVjaWRlZCB0byBmb3JrIHRoZSBzb3VyY2VzIGluIGEgInN0YWJsZSIgYnJhbmNoLCBhbmQgYW4KICAgICAgInVuc3RhYmxlIiBvbmUsIHNpbmNlIEZyZWVUeXBlIGlzIGJlY29taW5nIGEgY3JpdGljYWwgY29tcG9uZW50IG9mCiAgICAgIG1hbnkgVW5peCBzeXN0ZW1zLgoKICAgICAgVGhlIG5leHQgYnVnLWZpeCByZWxlYXNlcyBvZiB0aGUgbGlicmFyeSB3aWxsIGJlIG5hbWVkIDIuMC43LCAyLjAuOCwKICAgICAgZXRjLiwgd2hpbGUgdGhlICIyLjEiIGJyYW5jaCB3aWxsIGNvbnRhaW4gYSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2VzCiAgICAgIHdoZXJlIHdlIHdpbGwgc3RhcnQgbWFqb3IgcmV3b3JraW5nIG9mIHRoZSBsaWJyYXJ5J3MgaW50ZXJuYWxzLCBpbgogICAgICBvcmRlciB0byBwcm9kdWNlIEZyZWVUeXBlIDIuMi4wIChvciBldmVuIDMuMCkgaW4gYSBtb3JlIGRpc3RhbnQKICAgICAgZnV0dXJlLgoKICAgICAgV2UgYWxzbyBob3BlIHRoYXQgdGhpcyBzY2hlbWUgd2lsbCBhbGxvdyBtdWNoIG1vcmUgZnJlcXVlbnQgcmVsZWFzZXMKICAgICAgdGhhbiBpbiB0aGUgcGFzdC4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC41IGFuZCAyLjAuNAoKICBOT1RFIFRIQVQgMi4wLjUgRE9FUyBOT1QgQ09OVEFJTiBUSEUgUE9TVFNDUklQVCBISU5URVIuICBUSElTIE1PRFVMRSBXSUxMCiAgQkUgUEFSVCBPRiBUSEUgTkVYVCBSRUxFQVNFIChFSVRIRVIgMi4wLjYgb3IgMi4xKQoKICAtIEZpeGVkIGEgYnVnIHRoYXQgbWFkZSBjZXJ0YWluIGdseXBocywgbGlrZSAiQ2FjdXRlIiwgImNhY3V0ZSIgYW5kCiAgICAibHNsYXNoIiB1bmF2YWlsYWJsZSBmcm9tIFVuaWNvZGUgY2hhcm1hcHMgb2YgUG9zdHNjcmlwdCBmb250cy4gIFRoaXMKICAgIHByZXZlbnRlZCB0aGUgY29ycmVjdCBkaXNwbGF5IG9mIFBvbGlzaCB0ZXh0LCBmb3IgZXhhbXBsZS4KCiAgLSBUaGUga2VybmluZyB0YWJsZSBvZiBUeXBlIDEgZm9udHMgd2FzIGxvYWRlZCBieSBGcmVlVHlwZSwgd2hlbiBpdHMgQUZNCiAgICBmaWxlIHdhcyBhdHRhY2hlZCB0byBpdHMgZmFjZSwgYnV0IHRoZSBGVF9GQUNFX0ZMQUdfSEFTX0tFUk5JTkcgYml0CiAgICBmbGFncyB3YXMgbm90IHNldCBjb3JyZWN0bHksIHByZXZlbnRpbmcgRlRfR2V0X0tlcm5pbmcgdG8gcmV0dXJuCiAgICBtZWFuaW5nZnVsIHZhbHVlcy4KCiAgLSBJbXByb3ZlZCBTRk5UIChUcnVlVHlwZSAmIE9wZW5UeXBlKSBjaGFybWFwIHN1cHBvcnQuICBTbGlnaHRseSBiZXR0ZXIKICAgIHBlcmZvcm1hbmNlLCBhcyB3ZWxsIGFzIHN1cHBvcnQgZm9yIHRoZSBuZXcgZm9ybWF0cyBkZWZpbmVkIGJ5IHRoZQogICAgT3BlblR5cGUgMS4zIHNwZWNpZmljYXRpb24gKDgsIDEwLCBhbmQgMTIpCgogIC0gRml4ZWQgYSBzZXJpb3VzIHR5cG8gaW4gInNyYy9iYXNlL2Z0Y2FsYy5jIiB3aGljaCBjYXVzZWQgaW52YWxpZAogICAgY29tcHV0YXRpb25zIGluIGNlcnRhaW4gcmFyZSBjYXNlcywgcHJvZHVjaW5nIHVnbHkgYXJ0ZWZhY3RzLgoKICAtIFRoZSBzaXplIG9mIHRoZSBFTSBzcXVhcmUgaXMgY29tcHV0ZWQgd2l0aCBhIG1vcmUgYWNjdXJhdGUgYWxnb3JpdGhtCiAgICBmb3IgUG9zdHNjcmlwdCBmb250cy4gIFRoZSBvbGQgb25lIGNhdXNlZCBzbGlnaHQgZXJyb3JzIHdpdGggZW1iZWRkZWQKICAgIGZvbnRzIGZvdW5kIGluIFBERiBkb2N1bWVudHMuCgogIC0gRml4ZWQgYSBidWcgaW4gdGhlIGNhY2hlIG1hbmFnZXIgdGhhdCBwcmV2ZW50ZWQgbm9ybWFsIExSVSBiZWhhdmlvdXIKICAgIHdpdGhpbiB0aGUgY2FjaGUgbWFuYWdlciwgY2F1c2luZyB1bm5lY2Vzc2FyeSByZWxvYWRzIChmb3IgRlRfRmFjZSBhbmQKICAgIEZUX1NpemUgb2JqZWN0cyBvbmx5KS4KCiAgLSBBZGRlZCBhIG5ldyBmdW5jdGlvbiBuYW1lZCAiRlRfR2V0X05hbWVfSW5kZXgiIHRvIHJldHJpZXZlIHRoZSBnbHlwaAogICAgaW5kZXggb2YgYSBnaXZlbiBnbHlwaCBuYW1lLCB3aGVuIGZvdW5kIGluIGEgZmFjZS4KCiAgLSBBZGRlZCBhIG5ldyBmdW5jdGlvbiBuYW1lZCAiRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSIgdG8gcmV0cmlldmUgdGhlCiAgICAidW5pcXVlIiBQb3N0c2NyaXB0IGZvbnQgbmFtZSBvZiBhIGdpdmVuIGZhY2UuCgogIC0gQWRkZWQgYSBuZXcgcHVibGljIGhlYWRlciBzaXplIG5hbWVkIEZUX1NJWkVTX0ggKG9yCiAgICA8ZnJlZXR5cGUvZnRzaXplcy5oPikgcHJvdmlkaW5nIG5ldyBGVF9TaXplLW1hbmFnZW1lbnQgZnVuY3Rpb25zOgogICAgRlRfTmV3X1NpemUsIEZUX0FjdGl2YXRlX1NpemUsIEZUX0RvbmVfU2l6ZS4KCiAgLSBGaXhlZCBhIHJlYWxsb2NhdGlvbiBidWcgdGhhdCBnZW5lcmF0ZWQgYSBkYW5nbGluZyBwb2ludGVyIChhbmQgcG9zc2libHkKICAgIG1lbW9yeSBsZWFrcykgd2l0aCBQb3N0c2NyaXB0IGZvbnRzIChpbiBzcmMvcHNhdXgvcHNvYmpzLmMpLgoKICAtIE1hbnkgZml4ZXMgZm9yIDE2LWJpdCBjb3JyZWN0bmVzcy4KCiAgLSBSZW1vdmVkIG1hbnkgcGVkYW50aWMgY29tcGlsZXIgd2FybmluZ3MgZnJvbSB0aGUgc291cmNlcy4KCiAgLSBBZGRlZCBhbiBBbWlnYSBidWlsZCBkaXJlY3RvcnkgaW4gImJ1aWxkcy9hbWlnYSIuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC40IGFuZCAyLjAuMwoKICAtIEZpeGVkIGEgcmF0aGVyIGFubm95aW5nIGJ1ZyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIDIuMC4zLiAgTmFtZWx5LCB0aGUKICAgIGZvbnQgdHJhbnNmb3JtYXRpb24gc2V0IHRocm91Z2ggRlRfU2V0X1RyYW5zZm9ybSB3YXMgYXBwbGllZCB0d2ljZSB0bwogICAgYXV0by1oaW50ZWQgZ2x5cGhzLCByZXN1bHRpbmcgaW4gaW5jb3JyZWN0bHkgcm90YXRlZCB0ZXh0IG91dHB1dC4KCiAgLSBGaXhlZCBfbWFueV8gY29tcGlsZXIgd2FybmluZ3MuICBGVDIgc2hvdWxkIG5vdyBjb21waWxlIGNsZWFubHkgd2l0aAogICAgVmlzdWFsIEMrKydzIG1vc3QgcGVkYW50aWMgd2FybmluZyBsZXZlbCAoL1c0KS4gIEl0IGFscmVhZHkgY29tcGlsZWQKICAgIGZpbmUgd2l0aCBHQ0MgYW5kIGEgZmV3IG90aGVyIGNvbXBpbGVycy4KCiAgLSBGaXhlZCBhIGJ1ZyB0aGF0IHByZXZlbnRlZCB0aGUgbGluZWFyIGFkdmFuY2Ugd2lkdGggb2YgY29tcG9zaXRlCiAgICBUcnVlVHlwZSBnbHlwaHMgdG8gYmUgY29ycmVjdGx5IHJldHVybmVkLgoKICAtIEZpeGVkIHRoZSBWaXN1YWwgQysrIHByb2plY3QgZmlsZXMgbG9jYXRlZCBpbiAiYnVpbGRzL3dpbjMyL3Zpc3VhbGMiCiAgICAocHJldmlvdXMgdmVyc2lvbnMgdXNlZCBvbGRlciBuYW1lcyBvZiB0aGUgbGlicmFyeSkuCgogIC0gTWFueSAzMi1iaXQgY29uc3RhbnRzIGhhdmUgYW4gIkwiIGFwcGVuZGVkIHRvIHRoZWlyIHZhbHVlLCBpbiBvcmRlcgogICAgdG8gaW1wcm92ZSB0aGUgMTYtYml0bmVzcyBvZiB0aGUgY29kZS4gIFNvbWVvbmUgaXMgYWN0dWFsbHkgdHJ5aW5nIHRvCiAgICB1c2UgRlQyIG9uIGFuIEF0YXJpIFNUIG1hY2hpbmUhCgogIC0gVXBkYXRlZCB0aGUgImJ1aWxkcy9kZXRlY3QubWsiIGZpbGUgaW4gb3JkZXIgdG8gYXV0b21hdGljYWxseSBidWlsZAogICAgRlQyIG9uIEFJWCBzeXN0ZW1zLiAgQUlYIHVzZXMgIi91c3Ivc2Jpbi9pbml0IiBpbnN0ZWFkIG9mICIvc2Jpbi9pbml0IgogICAgYW5kIHdhc24ndCBwcmV2aW91c2x5IGRldGVjdGVkIGFzIGEgVW5peCBwbGF0Zm9ybSBieSB0aGUgRnJlZVR5cGUgYnVpbGQKICAgIHN5c3RlbS4KCiAgLSBVcGRhdGVkIHRoZSBVbml4LXNwZWNpZmljIHBvcnRpb25zIG9mIHRoZSBidWlsZCBzeXN0ZW0gKG5ldyBsaWJ0b29sCiAgICB2ZXJzaW9uLCBldGMuKS4KCiAgLSBUaGUgU0ZOVCBrZXJuaW5nIGxvZGFlciBub3cgZW5zdXJlcyB0aGF0IHRoZSB0YWJsZSBpcyBzb3J0ZWQgKHNpbmNlIHNvbWUKICAgIHByb2JsZW0gZm9udHMgZG8gbm90IG1lZXQgdGhpcyByZXF1aXJlbWVudCkuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC4zIGFuZCAyLjAuMgoKICBJLiBDSEFOR0VTIFRPIFRIRSBNT0RVTEVTIC8gRk9OVCBEUklWRVJTCgogICAgLSBUSEUgQVVUTy1ISU5URVIgSEFTIEJFRU4gU0xJR0hUTFkgSU1QUk9WRUQsIGluIG9yZGVyIHRvIGZpeCBzZXZlcmFsCiAgICAgIGFubm95aW5nIGFydGVmYWN0cywgbWFpbmx5OgoKICAgICAgICAtIEJsdWUgem9uZSBhbGlnbmVtZW50IG9mIGhvcml6b250YWwgc3RlbXMgd2Fzbid0IHBlcmZvcm1lZAogICAgICAgICAgY29ycmVjdGx5LCByZXN1bHRpbmcgaW4gYXJ0ZWZhY3RzIGxpa2UgdGhlICJkIiBiZWluZyBwbGFjZWQgb25lCiAgICAgICAgICBwaXhlbCBiZWxvdyB0aGUgImIiIGluIHNvbWUgZm9udHMgbGlrZSBUaW1lIE5ldyBSb21hbi4KCiAgICAgICAgLSBPdmVyc2hvb3QgdGhyZXNob2xkaW5nIHdhc24ndCBwZXJmb3JtZWQgY29ycmVjdGx5LCBjcmVhdGluZwogICAgICAgICAgdW5wbGVhc2FudCBhcnRlZmFjdHMgYXQgbGFyZ2UgY2hhcmFjdGVyIHBpeGVsIHNpemVzLgoKICAgICAgICAtIENvbXBvc2l0ZSBnbHlwaCBsb2FkaW5nIGhhcyBiZWVuIHNpbXBsaWZpZWQuICBUaGlzIGdldHMgcmlkCiAgICAgICAgICBvZiB2YXJpb3VzIGFydGVmYWN0cyB3aGVyZSB0aGUgY29tcG9uZW50cyBvZiBhIGNvbXBvc2l0ZSBnbHlwaHMKICAgICAgICAgIHdlcmUgbm90IGNvcnJlY3RseSBzcGFjZWQuCgogICAgICBUaGVzZSBhcmUgdGhlIGxhc3QgY2hhbmdlcyB0byB0aGUgY3VycmVudCBhdXRvLWhpbnRpbmcgbW9kdWxlLiAgQSBuZXcKICAgICAgaGludGluZyBzdWItc3lzdGVtIGlzIGN1cnJlbnRseSBpbiB0aGUgd29yayBpbiBvcmRlciB0byBzdXBwb3J0IG5hdGl2ZQogICAgICBoaW50cyBpbiBUeXBlIDEgLyBDRkYgLyBPcGVuVHlwZSBmb250cywgYXMgd2VsbCBhcyBnbG9iYWxseSBpbXByb3ZlCiAgICAgIHJlbmRlcmluZy4KCiAgICAtIFRoZSBQQ0YgZHJpdmVyIGhhcyBiZWVuIGZpeGVkLiAgSXQgcmVwb3J0ZWQgaW52YWxpZCBnbHlwaCBkaW1lbnNpb25zCiAgICAgIGZvciB0aGUgZm9udHMgYXZhaWxhYmxlIG9uIFNvbGFyaXMuCgogICAgLSBUaGUgVHlwZSAxLCBDSUQgYW5kIENGRiBkcml2ZXJzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBmaXggdGhlCiAgICAgIGNvbXB1dGF0aW9uIG9mIHRoZSBFTSBzaXplLgoKICAgIC0gVGhlIFR5cGUgMSBkcml2ZXIgaGFzIGJlZW4gZml4ZWQgdG8gYXZvaWQgYSBkYW5nZXJvdXMgYnVnIHRoYXQKICAgICAgY3Jhc2hlZCB0aGUgbGlicmFyeSB3aXRoIG5vbi1jb25mb3JtaW5nIGZvbnRzIChpLmUuIG9uZXMgdGhhdCBkbyBub3QKICAgICAgcGxhY2UgdGhlIC5ub3RkZWYgZ2x5cGggYXQgcG9zaXRpb24gMCkuCgogICAgLSBUaGUgVHJ1ZVR5cGUgZHJpdmVyIGhhZCBhIHJhdGhlciBzdWJ0bGUgYnVnIChkYW5nbGluZyBwb2ludGVyIHdoZW4KICAgICAgbG9hZGluZyBjb21wb3NpdGUgZ2x5cGhzKSB0aGF0IGNvdWxkIGNyYXNoIHRoZSBsaWJyYXJ5IGluIHJhcmUKICAgICAgb2NjYXNpb25zIQoKCiAgSUkuIEhJR0gtTEVWRUwgQVBJIENIQU5HRVMKCiAgICAtIFRoZSBlcnJvciBjb2RlIGVudW1lcmF0aW9uIHZhbHVlcyBoYXZlIGJlZW4gY2hhbmdlZC4gIEFuIGVycm9yIHZhbHVlCiAgICAgIGlzIGRlY29tcG9zZWQgaW4gYSBnZW5lcmljIGVycm9yIGNvZGUsIGFuZCBhIG1vZHVsZSBudW1iZXIuICBzZWUKICAgICAgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+IGZvciBkZXRhaWxzLgoKICAgIC0gQSBuZXcgcHVibGljIGhlYWRlciBmaWxlIGhhcyBiZWVuIGludHJvZHVjZWQsIG5hbWVkIEZUX1RSSUdPTk9NRVRSWV9ICiAgICAgIChpbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZy5oKSwgcHJvdmlkaW5nIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIHRvCiAgICAgIGNvbXB1dGUgc2luZXMsIGNvc2luZXMsIGFyY3RhbmdlbnRzLCBldGMuIHdpdGggMTYuMTYgZml4ZWQgcHJlY2lzaW9uLgogICAgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIENPUkRJQyBhbGdvcml0aG0gYW5kIGlzIHZlcnkgZmFzdAogICAgICB3aGlsZSBiZWluZyBzdWZmaWNpZW50bHkgYWNjdXJhdGUuCgoKICBJSUkuIElOVEVSTkFMUwoKICAgIC0gQWRkZWQgQmVPUy1zcGVjaWZpYyBmaWxlcyBpbiB0aGUgb2xkIGJ1aWxkIHN1Yi1zeXN0ZW0uICBOb3RlIHRoYXQKICAgICAgbm8gY2hhbmdlcyB3ZXJlIHJlcXVpcmVkIHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBKYW0uCgogICAgLSBUaGUgY29uZmlndXJhdGlvbiBpcyBub3cgY2FwYWJsZSBvZiBhdXRvbWF0aWNhbGx5IGRldGVjdGluZyA2NC1iaXQKICAgICAgaW50ZWdlcnMgb24gYSBzZXQgb2YgcHJlZGVmaW5lZCBjb21waWxlcnMgKEdDQywgVmlzdWFsIEMrKywgQm9ybGFuZAogICAgICBDKyspIGFuZCB3aWxsIHVzZSB0aGVtIGJ5IGRlZmF1bHQuICBUaGlzIHByb3ZpZGVzIGEgc21hbGwgcGVyZm9ybWFuY2UKICAgICAgYm9vc3QuCgogICAgLSBBIHNtYWxsIG1lbW9yeSBsZWFrIHRoYXQgaGFwcGVuZWQgd2hlbiBvcGVuaW5nIDAtc2l6ZWQgZmlsZXMgKGR1aCEpCiAgICAgIGhhdmUgYmVlbiBmaXhlZC4KCiAgICAtIEZpeGVkIGJlemllciBzdGFjayBkZXB0aCBidWcgaW4gdGhlIHJvdXRpbmVzIHByb3ZpZGVkIGJ5IHRoZQogICAgICBGVF9CQk9YX0ggaGVhZGVyIGZpbGUuICBBbHNvIGZpeGVkIHNpbWlsYXIgYnVncyBpbiB0aGUgcmFzdGVyaXplcnMuCgogICAgLSBUaGUgb3V0bGluZSBib3VuZGluZyBib3ggY29kZSBoYXMgYmVlbiByZXdyaXR0ZW4gdG8gdXNlIGRpcmVjdAogICAgICBjb21wdXRhdGlvbnMsIGluc3RlYWQgb2YgYmV6aWVyIHN1Yi1kaXZpc2lvbiwgdG8gY29tcHV0ZSB0aGUgZXhhY3QKICAgICAgYm91bmRpbmcgYm94IG9mIGdseXBocy4gIFRoaXMgaXMgc2xpZ2h0bHkgc2xvd2VyIGJ1dCBtb3JlIGFjY3VyYXRlLgoKICAgIC0gVGhlIGJ1aWxkIHN5c3RlbSBoYXMgYmVlbiBpbXByb3ZlZCBhbmQgZml4ZWQsIG1haW5seSB0byBzdXBwb3J0ICJtYWtlIgogICAgICBvbiBXaW5kb3dzIDIwMDAgY29ycmVjdGx5LCBhdm9pZCBwcm9ibGVtcyB3aXRoICJtYWtlIGRpc3RjbGVhbiIgb24gbm9uCiAgICAgIFVuaXggc3lzdGVtcywgZXRjLgoKICAgIC0gSGV4YWRlY2ltYWwgY29uc3RhbnRzIGhhdmUgYmVlbiBzdWZmaXhlZCB3aXRoICJVIiB0byBhdm9pZCBwcm9ibGVtcwogICAgICB3aXRoIGNlcnRhaW4gY29tcGlsZXJzIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCgogICAgLSBBIG5ldyBkaXJlY3RvcnkgbmFtZWQgInNyYy90b29scyIgaGFzIGJlZW4gY3JlYXRlZC4gIEl0IGNvbnRhaW5zCiAgICAgIFB5dGhvbiBzY3JpcHRzIGFuZCBzaW1wbGUgdW5pdCB0ZXN0IHByb2dyYW1zIHVzZWQgdG8gZGV2ZWxvcCB0aGUKICAgICAgbGlicmFyeS4KCiAgICAtIFRoZSBEb2NNYWtlciB0b29sIGhhcyBiZWVuIG1vdmVkIGZyb20gImRvY3MiIHRvICJzcmMvdG9vbHMiIGFuZAogICAgICBoYXMgYmVlbiB1cGRhdGVkIHdpdGggdGhlIGZvbGxvd2luZzoKCiAgICAgICAgIC0gTm93IGFjY2VwdHMgdGhlICItLXRpdGxlPVhYWFgiIG9yICItdCBYWFhYIiBvcHRpb24gZnJvbSB0aGUKICAgICAgICAgICBjb21tYW5kIGxpbmUgdG8gc2V0IHRoZSBwcm9qZWN0J3MgbmFtZSBpbiB0aGUgZ2VuZXJhdGVkIEFQSQogICAgICAgICAgIHJlZmVyZW5jZS4KCiAgICAgICAgIC0gTm93IGFjY2VwdHMgdGhlICItLW91dHB1dD1ESVIiIG9yICItbyBESVIiIG9wdGlvbiBmcm9tIHRoZQogICAgICAgICAgIGNvbW1hbmQgbGluZSB0byBzZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIGFsbCBnZW5lcmF0ZWQgSFRNTAogICAgICAgICAgIGZpbGVzLgoKICAgICAgICAgLSBOb3cgYWNjZXB0cyB0aGUgIi0tcHJlZml4PVhYWFgiIG9yICItcCBYWFgiIG9wdGlvbiBmcm9tIHRoZQogICAgICAgICAgIGNvbW1hbmQgbGluZSB0byBzZXQgdGhlIGZpbGUgcHJlZml4IHRvIHVzZSBmb3IgYWxsIGdlbmVyYXRlZCBIVE1MCiAgICAgICAgICAgZmlsZXMuCgogICAgICAgICAtIE5vdyBnZW5lcmF0ZXMgdGhlIGN1cnJlbnQgdGltZS9kYXRhIG9uIGVhY2ggZ2VuZXJhdGVkIHBhZ2UKICAgICAgICAgICBpbiBvcmRlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHZlcnNpb25zLgoKICAgICAgRG9jTWFrZXIgY2FuIGJlIHVzZWQgd2l0aCBvdGhlciBwcm9qZWN0cyBub3csIG5vdCBvbmx5IEZUMiAoZS5nLiBNTGliLAogICAgICBGVExheW91dCwgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjIgYW5kIDIuMC4xCgoKICBJLiBDSEFOR0VTIFRPIFRIRSBNT0RVTEVTIC8gRk9OVCBEUklWRVJTCgogICAgLSBUSEUgVFJVRVRZUEUgQllURUNPREUgSU5URVJQUkVURVIgSVMgTk9XIFRVUk5FRCBPRkYsIGluIG9yZGVyIHRvCiAgICAgIGF2b2lkIGxlZ2FsIHByb2JsZW1zICB3aXRoIHRoZSBBcHBsZSBwYXRlbnRzLiAgSXQgIHNlZW1zIHRoYXQgd2UKICAgICAgbWlzdGFrZW5seSAgdHVybmVkIHRoaXMgb3B0aW9uICBvbiBpbiAgcHJldmlvdXMgcmVsZWFzZXMgIG9mIHRoZQogICAgICBidWlsZC4KCiAgICAgIE5vdGUgdGhhdCBpZiAgeW91IHdhbnQgdG8gdXNlIHRoZSAgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaW4gb3JkZXIKICAgICAgdG8gZ2V0IGhpZ2gtcXVhbGl0eSBUcnVlVHlwZSAgcmVuZGVyaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIHRvZ2dsZQogICAgICBieSAgICAgICAgaGFuZCAgICAgICAgdGhlICAgICAgICBkZWZpbml0aW9uICAgICAgICBvZiAgICAgICAgdGhlCiAgICAgIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgICBtYWNybyAgICBpbiAgIHRoZSAgIGZpbGUKICAgICAgImluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgiLgoKICAgIC0gVGhlIENGRiBkcml2ZXIgaGFzIGJlZW4gaW1wcm92ZWQgYnkgVG9tIEthY3ZpbnNreSBhbmQgU2FuZGVyIHZhbgogICAgICBkZXIgV2FsOgoKICAgICAgKiBTdXBwb3J0IGZvciAic2VhYyIgZW11bGF0aW9uLgogICAgICAqIFN1cHBvcnQgZm9yICJkb3RzZWN0aW9uIi4KICAgICAgKiBTdXBwb3J0IGZvciByZXRyaWV2aW5nIGdseXBoIG5hbWVzIHRocm91Z2gKICAgICAgICAiRlRfR2V0X0dseXBoX05hbWUiLgoKICAgICAgVGhlIGZpcnN0IHR3byBpdGVtcyBhcmUgbmVjZXNzYXJ5IHRvIGNvcnJlY3RseSBhIGxhcmdlIG51bWJlciBvZgogICAgICBUeXBlIDEgZm9udHMgY29udmVydGVkIHRvIHRoZSBDRkYgZm9ybWF0cyBieSBBZG9iZSBBY3JvYmF0LgoKICAgIC0gVGhlIFR5cGUgMSBkcml2ZXIgd2FzIGFsc28gaW1wcm92ZWQgYnkgVG9tICYgb3RoZXJzOgoKICAgICAgKiBCZXR0ZXIgRU0gc2l6ZSBjb21wdXRhdGlvbi4KICAgICAgKiBCZXR0ZXIgc3VwcG9ydCBmb3Igc3ludGhldGljICh0cmFuc2Zvcm1lZCkgZm9udHMuCiAgICAgICogVGhlICBUeXBlIDEgIGRyaXZlciByZXR1cm5zICB0aGUgY2hhcnN0cmluZ3MgIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICBlYWNoIGdseXBoIGluIHRoZSAgImdseXBoLT5jb250cm9sX2RhdGEiIGZpZWxkIGFmdGVyIGEgY2FsbCB0bwogICAgICAgICJGVF9Mb2FkX0dseXBoIiAodGhhbmtzIEhhIFNoYW8pLgoKICAgIC0gVmFyaW91cyBvdGhlciBidWdmaXhlcywgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6CgogICAgICAqIEZpeGVkIGEgbmFzdHkgbWVtb3J5IGxlYWsgaW4gdGhlIFR5cGUgMSBkcml2ZXIuCiAgICAgICogVGhlIGF1dG9oaW50ZXIgIGFuZCB0aGUgcGNmICBkcml2ZXIgdXNlZCBzdGF0aWMgIHdyaXRhYmxlIGRhdGEKICAgICAgICB3aGVuIHRoZXkgc2hvdWxkbid0LgogICAgICAqIE1hbnkgY2FzdHMgd2VyZSBhZGRlZCB0byAgbWFrZSB0aGUgY29kZSBtb3JlIDY0LWJpdHMgc2FmZS4gIEl0CiAgICAgICAgYWxzbyBub3cgY29tcGlsZXMgb24gV2luZG93cyBYUCA2NC1iaXRzIHdpdGhvdXQgd2FybmluZ3MuCiAgICAgICogU29tZSBpbmNvcnJlY3Qgd3JpdGFibGUgc3RhdGljcyB3ZXJlIHJlbW92ZWQgaW4gdGhlICJhdXRvaGludCIKICAgICAgICBhbmQgInBjZiIgZHJpdmVycy4gIEZyZWVUeXBlIDIgbm93IGNvbXBpbGVzIG9uIEVwb2MgYWdhaW4uCgoKICBJSS4gQ0hBTkdFUyBUTyBUSEUgSElHSC1MRVZFTCBBUEkKCiAgICAtIFRoZSBsaWJyYXJ5IGhlYWRlciBmaWxlcyBpbmNsdXNpb24gc2NoZW1lIGhhcyBiZWVuIGNoYW5nZWQuICBUaGUKICAgICAgb2xkIHNjaGVtZSBsb29rZWQgbGlrZToKCiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Z2x5cGguaD4KICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnRjYWNoZS5oPgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9jYWNoZS9mdGltYWdlLmg+CgogICAgICBOb3cgeW91IHNob3VsZCB1c2U6CgogICAgICAgICNpbmNsdWRlIDxmdDJidWlsZC5oPgogICAgICAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKICAgICAgICAjaW5jbHVkZSBGVF9HTFlQSF9ICiAgICAgICAgI2luY2x1ZGUgRlRfQ0FDSEVfSAogICAgICAgICNpbmNsdWRlIEZUX0NBQ0hFX0lNQUdFX0gKCiAgICAgIE5PVEUgVEhBVCAgVEhFIE9MRCAgSU5DTFVTSU9OIFNDSEVNRSBXSUxMICBTVElMTCBXT1JLICBXSVRIIFRISVMKICAgICAgUkVMRUFTRS4gIEhPV0VWRVIsIFdFICBETyBOT1QgR1VBUkFOVEVFIFRIQVQgVEhJUyAgV0lMTCBTVElMTCBCRQogICAgICBUUlVFIElOIFRIRSBORVhUIE9ORSAoQS5LLkEuIEZSRUVUWVBFIDIuMSkuCgogICAgICBUaGUgIGZpbGUgPGZ0MmJ1aWxkLmg+ICBpcyB1c2VkICB0byBkZWZpbmUgIHRoZSAgaGVhZGVyIGZpbGVuYW1lCiAgICAgIG1hY3Jvcy4gIFRoZSBjb21wbGV0ZSBhbmQgIGNvbW1lbnRlZCBsaXN0IG9mIG1hY3JvcyBpcyBhdmFpbGFibGUKICAgICAgaW4gdGhlIEFQSSByZWZlcmVuY2UgdW5kZXIgdGhlIHNlY3Rpb24gbmFtZSAiSGVhZGVyIEZpbGUgTWFjcm9zIgogICAgICBpbiBDaGFwdGVyIEkuCgogICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHNlY3Rpb24gSSBvZiB0aGUgZm9sbG93aW5nIGRvY3VtZW50OgoKICAgICAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy8KICAgICAgICAgIGZyZWV0eXBlMi9kb2NzL3R1dG9yaWFsL3N0ZXAxLmh0bWwKCiAgICAgIG9yCgogICAgICAgIGh0dHA6Ly9mcmVldHlwZS5zb3VyY2Vmb3JnZS5uZXQvCiAgICAgICAgICBmcmVldHlwZTIvZG9jcy90dXRvcmlhbC9zdGVwMS5odG1sCgogICAgLSBNYW55LCBtYW55IGNvbW1lbnRzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgcHVibGljIHNvdXJjZSBmaWxlIGluCiAgICAgIG9yZGVyIHRvICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlICB0aGUgQVBJIFJlZmVyZW5jZSAgdGhyb3VnaCB0aGUKICAgICAgImRvY21ha2VyLnB5IiBQeXRob24gc2NyaXB0LgoKICAgICAgVGhlIGxhdHRlciBoYXMgYmVlbiB1cGRhdGVkICB0byBzdXBwb3J0IHRoZSBncm91cGluZyBvZiBzZWN0aW9ucwogICAgICBpbiBjaGFwdGVycyBhbmQgYmV0dGVyIGluZGV4IHNvcnQuICBTZWU6CgogICAgICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2ZyZWV0eXBlMi9kb2NzL3JlZmVyZW5jZS9mdDItdG9jLmh0bWwKCgogIElJSS4gQ0hBTkdFUyBUTyBUSEUgQlVJTEQgUFJPQ0VTUwoKICAgIC0gSWYgeW91ICBhcmUgbm90ICBidWlsZGluZyBGcmVlVHlwZSAyICB3aXRoIGl0cyBvd24gIGJ1aWxkIHN5c3RlbQogICAgICAoYnV0IHdpdGggeW91ciBvd24gTWFrZWZpbGVzIG9yIHByb2plY3QgZmlsZXMpLCB5b3Ugd2lsbCBuZWVkIHRvCiAgICAgIGJlICBhd2FyZSB0aGF0ICB0aGUgIGJ1aWxkICBwcm9jZXNzIGhhcyAgY2hhbmdlZCAgYSBsaXR0bGUgIGJpdC4KCiAgICAgIFlvdSBkb24ndCAgbmVlZCB0byBwdXQgdGhlICAic3JjIiBkaXJlY3RvcnkgaW4gIHRoZSBpbmNsdWRlIHBhdGgKICAgICAgd2hlbiAgY29tcGlsaW5nICBhbnkgRlQyICBjb21wb25lbnQuICAgSW5zdGVhZCwgIHNpbXBseSBwdXQgIHRoZQogICAgICBjb21wb25lbnQncyBkaXJlY3RvcnkgaW4gdGhlIGN1cnJlbnQgaW5jbHVkZSBwYXRoLgoKICAgICAgU28sIGlmIHlvdSB3ZXJlIGRvaW5nIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICBjYyAtYyAtSWluY2x1ZGUgLUlzcmMgc3JjL2Jhc2UvZnRiYXNlLmMKCiAgICAgIGNoYW5nZSB0aGUgbGluZSB0bzoKCiAgICAgICAgY2MgLWMgLUlpbmNsdWRlIC1Jc3JjL2Jhc2Ugc3JjL2Jhc2UvZnRiYXNlLmMKCiAgICAgIElmIHlvdSB3ZXJlIGRvaW5nIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICBjZCBzcmMvYmFzZQogICAgICAgIGNjIC1jIC1JLi4vLi4vaW5jbHVkZSAtSS4uIGZ0YmFzZS5jCgogICAgICBjaGFuZ2UgaXQgdG86CgogICAgICAgIGNkIHNyYy9iYXNlCiAgICAgICAgY2MgLWMgLUkuLi8uLi9pbmNsdWRlIGZ0YmFzZS5jCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuMSBhbmQgMi4wCgogIDIuMC4xIGludHJvZHVjZXMgYSBmZXcgY2hhbmdlczoKCiAgICAtIEZpeGVkIG1hbnkgYnVncyByZWxhdGVkIHRvICB0aGUgc3VwcG9ydCBvZiBDRkYgLyBPcGVuVHlwZSBmb250cy4KICAgICAgVGhlc2UgIGZvcm1hdHMgYXJlICBub3cgbXVjaCAgYmV0dGVyIHN1cHBvcnRlZCAgdGhvdWdoICB0aGVyZSBpcwogICAgICBzdGlsbCB3b3JrIHBsYW5uZWQgdG8gIGRlYWwgd2l0aCBjaGFyc2V0IHRhYmxlcyBhbmQgUERGLWVtYmVkZGVkCiAgICAgIENGRiBmaWxlcyB0aGF0IHVzZSB0aGUgb2xkICJzZWFjIiBjb21tYW5kLgoKICAgIC0gVGhlICBsaWJyYXJ5IGNvdWxkIG5vdCAgYmUgY29tcGlsZWQgIGluIGRlYnVnICBtb2RlIHdpdGggIGEgdmVyeQogICAgICBzbWFsbCAgbnVtYmVyICAgb2YgIEMgIGNvbXBpbGVycyAgIHdob3NlICBwcmUtcHJvY2Vzc29ycyAgZGlkbid0CiAgICAgIGltcGxlbWVudCB0aGUgIiMjIiAgZGlyZWN0aXZlIGNvcnJlY3RseSAoaS5lLiBwZXIgc2UgIHRoZSBBTlNJIEMKICAgICAgc3BlY2lmaWNhdGlvbiEpICBBbiBlbGVnYW50IGZpeCB3YXMgZm91bmQuCgogICAgLSBBZGRlZCAgc3VwcG9ydCBmb3IgIHRoZSAgZnJlZSBCb3JsYW5kICBjb21tYW5kLWxpbmUgQysrICBCdWlsZGVyCiAgICAgIGNvbXBpbGVyLiAgIFVzZSAibWFrZSAgc2V0dXAgYmNjMzIiLiAgIEFsc28gZml4ZWQgIGEgIGZldyBzb3VyY2UKICAgICAgbGluZXMgdGhhdCBnZW5lcmF0ZWQgbmV3IHdhcm5pbmdzIHdpdGggQkNDMzIuCgogICAgLSBGaXhlZCBhIGJ1ZyBpbiBGVF9PdXRsaW5lX0dldF9CQm94IHdoZW4gY29tcHV0aW5nIHRoZSBleHRyZW1hIG9mCiAgICAgIGEgY29uaWMgQmV6aWVyIGFyYy4KCiAgICAtIFVwZGF0ZWQgdGhlIElOU1RBTEwgZmlsZSB0byBhZGQgSURFIGNvbXBpbGF0aW9uLgoKICAgIC0gT3RoZXIgIG1pbm9yIGJ1ZyAgZml4ZXMsICBmcm9tICBpbnZhbGlkIFR5cGUgIDEgIHN0eWxlIGZsYWdzICB0bwogICAgICBjb3JyZWN0ICAgc3VwcG9ydCAgIG9mICBzeW50aGV0aWMgICAob2JsaXF1ZWQpICAgZm9udHMgIGluICAgdGhlCiAgICAgIGF1dG8taGludGVyLCBiZXR0ZXIgc3VwcG9ydCBmb3IgZW1iZWRkZWQgYml0bWFwcyBpbiBhIFNGTlQgZm9udC4KCiAgICAtIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCAiZnJlZXR5cGUtY29uZmlnIi4KCiAgRmluYWxseSwgdGhlICJzdGFuZGFyZCIgc2NoZW1lIGZvciBpbmNsdWRpbmcgRnJlZVR5cGUgaGVhZGVycyBpcyBub3cKICBncmFkdWFsbHkgY2hhbmdpbmcsICBidXQgdGhpcyB3aWxsICBiZSBleHBsYWluZWQgaW4gYSAgbGF0ZXIgcmVsZWFzZQogIChwcm9iYWJseSAyLjAuMikuCgogIEFuZCB2ZXJ5ICBzcGVjaWFsIHRoYW5rcyB0byBUb20gS2Fjdmluc2t5ICBhbmQgWUFNQU5PLVVDSEkgSGlkZXRvc2hpCiAgZm9yIHRoZWlyIGNvbnRyaWJ1dGlvbnMhCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ0hBTkdFUyBCRVRXRUVOIGJldGE4IGFuZCAyLjAKCiAgLSBDaGFuZ2VkICB0aGUgZGVmYXVsdCAgaW5zdGFsbGF0aW9uICBwYXRoIGZvciAgcHVibGljIGhlYWRlcnMgIGZyb20KICAgICJpbmNsdWRlL2ZyZWV0eXBlIiB0byAiaW5jbHVkZS9mcmVldHlwZTIiLgoKICAgIEFsc28gYWRkZWQgYSBuZXcgImZyZWV0eXBlLWNvbmZpZyIgdGhhdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICAgYW5kIGluc3RhbGxlZCAgb24gVW5peCBhbmQgIEN5Z3dpbiBzeXN0ZW1zLiAgVGhlIHNjcmlwdCAgaXRzZWxmIGlzCiAgICB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50ICBpbnN0YWxsIHBhdGgsIEMgY29tcGlsYXRpb24gZmxhZ3MgYXMKICAgIHdlbGwgYXMgbGlua2VyIGZsYWdzLgoKICAtIEZpeGVkIHNldmVyYWwgc21hbGwgYnVnczoKCiAgICAqIEluY29ycmVjdCBtYXggYWR2YW5jZSB3aWR0aCBmb3IgZml4ZWQtcGl0Y2ggVHlwZSAxIGZvbnRzLgogICAgKiBJbmNvcnJlY3QgZ2x5cGggbmFtZXMgZm9yIGNlcnRhaW4gVHJ1ZVR5cGUgZm9udHMuCiAgICAqIFRoZSAgZ2x5cGggYWR2YW5jZSAgd2FzIG5vdCAgY29waWVkIHdoZW4gIEZUX0dseXBoX1RvX0JpdG1hcCB3YXMKICAgICAgY2FsbGVkLgogICAgKiBUaGUgIGxpbmVhckhvcmlBZHZhbmNlICBhbmQgIGxpbmVyVmVydEFkdmFuY2UgIGZpZWxkcyAgd2VyZSAgbm90CiAgICAgIGNvcnJlY3RseSByZXR1cm5lZCBmb3IgZ2x5cGhzIHByb2Nlc3NlZCBieSB0aGUgYXV0by1oaW50ZXIuCiAgICAqICJ0eXBlMXoiICByZW5hbWVkIGJhY2sgdG8gICJ0eXBlMSI7IHRoZSAgb2xkICJ0eXBlMSIgIG1vZHVsZSBoYXMKICAgICAgYmVlbiByZW1vdmVkLgoKICAtIFJldmFtcGVkIHRoZSAgYnVpbGQgc3lzdGVtICB0byBtYWtlIGl0ICBhIGxvdCBtb3JlICBnZW5lcmljLiAgVGhpcwogICAgd2lsbCAgYWxsb3cgdXMgIHRvICByZS11c2UgIG5lYXJseSB1bi1tb2RpZmllZCAgaW4gIGxvdHMgb2YgIG90aGVyCiAgICBwcm9qZWN0cyAoaW5jbHVkaW5nIEZyZWVUeXBlIExheW91dCkuCgogIC0gQ2hhbmdlZCAiY2lkIiB0byB1c2UgInBzYXV4IiB0b28uCgogIC0gQWRkZWQgdGhlICBjYWNoZSBzdWItc3lzdGVtLiAgU2VlIDxmcmVldHlwZS9mdGNhY2hlLmg+ICBhcyB3ZWxsIGFzCiAgICB0aGUgc291cmNlcyAgaW4gInNyYy9jYWNoZSIuICBOb3RlICB0aGF0IGl0IGNvbXBpbGVzIGJ1dCAgaXMgc3RpbGwKICAgIHVudGVzdGVkIGZvciBub3cuCgogIC0gVXBkYXRlZCAiZG9jcy9kb2NtYWtlci5weSIsIGEgZHJhZnQgIEFQSSByZWZlcmVuY2UgaXMgYXZhaWxhYmxlIGF0CiAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy9mdDJhcGkuaHRtbC4KCiAgLSBDaGFuZ2VkICJ0eXBlMSIgdG8gdXNlICJwc2F1eCIuCgogIC0gQ3JlYXRlZCBhICBuZXcgbW9kdWxlIG5hbWVkICAicHNhdXgiIHRvIGhvbGQgIHRoZSBUeXBlIDEgJiAgVHlwZSAyCiAgICBwYXJzaW5nIHJvdXRpbmVzLiAgSXQgc2hvdWxkIGJlICB1c2VkIGJ5ICJ0eXBlMSIsICJjaWQiLCBhbmQgImNmZiIKICAgIGluIHRoZSBmdXR1cmUuCgogIC0gRml4ZWQgYW4gaW1wb3J0YW50IGJ1ZyBpbiAiRlRfR2x5cGhfR2V0X0NCb3giLgoKICAtIEZpeGVkICBzb21lIGNvbXBpbGVyICB3YXJuaW5ncyAgdGhhdCBoYXBwZW5lZCAgc2luY2UgdGhlICBUcnVlVHlwZQogICAgYnl0ZWNvZGUgZGVjb2RlciB3YXMgZGVhY3RpdmF0ZWQgYnkgZGVmYXVsdC4KCiAgLSBGaXhlZCB0d28gbWVtb3J5IGxlYWtzOgoKICAgICogVGhlICAgIG1lbW9yeSAgIG1hbmFnZXIgICAoMTYgICAgYnl0ZXMpICAgaXNuJ3QgICAgcmVsZWFzZWQgICBpbgogICAgICBGVF9Eb25lX0ZyZWVUeXBlIQogICAgKiBVc2luZyBjdXN0b20gaW5wdXQgc3RyZWFtcywgdGhlICBjb3B5IG9mIHRoZSBvcmlnaW5hbCBzdHJlYW0gd2FzCiAgICAgIG5ldmVyIHJlbGVhc2VkLgoKICAtIEZpeGVkIHRoZSAgYXV0by1oaW50ZXIgYnkgcGVyZm9ybWluZyBhdXRvbWF0aWMgIGNvbXB1dGF0aW9uIG9mIHRoZQogICAgImZpbGxpbmcgZGlyZWN0aW9uIiBvZiBlYWNoIGdseXBoLiAgIFRoaXMgaXMgZG9uZSB0aHJvdWdoIGEgc2ltcGxlCiAgICBhbmQgIGZhc3QgYXBwcm94aW1hdGlvbiwgYW5kICBzZWVtcyB0byAgd29yayAocHJvYmxlbXMgIHNwb3R0ZWQgYnkKICAgIFdlcm5lciB0aG91Z2gpLiAgVGhlIEFycGhpYyBmb250cyBhcmUgYSBsb3QgbmljZXIgdGhvdWdoIHRoZXJlIGFyZQogICAgc3RpbGwgYSBsb3Qgb2YgdGhpbmdzIHRvIGRvIHRvIGhhbmRsZSBBc2lhbiBmb250cyBjb3JyZWN0bHkuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQkVUQS04IChSRUxFQVNFIENBTkRJREFURSkgQ0hBTkdFUwoKICAtIERlYWN0aXZhdGVkIHRoZSBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBieSBkZWZhdWx0LgoKICAtIERlYWN0aXZhdGVkIHRoZSAic3JjL3R5cGUxIiBmb250IGRyaXZlci4gIE5vdyAic3JjL3R5cGUxeiIgaXMgdXNlZAogICAgYnkgZGVmYXVsdC4KCiAgLSBVcGRhdGVzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICBXZSBub3cgY29tcGlsZSB0aGUgbGlicmFyeSBjb3JyZWN0bHkKICAgIHVuZGVyICBVbml4ICBzeXN0ZW0gIHRocm91Z2ggICJjb25maWd1cmUiIHdoaWNoICBpcyAgYXV0b21hdGljYWxseQogICAgY2FsbGVkIG9uIHRoZSBmaXJzdCAibWFrZSIgaW52b2NhdGlvbi4KCiAgLSBBZGRlZCB0aGUgYXV0by1oaW50aW5nIG1vZHVsZSEgIEZpeGluZyBzb21lIGJ1Z3MgaGVyZSBhbmQgdGhlcmUuCgogIC0gRm91bmQgc29tZSBidWdzIGluIHRoZSAgY29tcG9zaXRlIGxvYWRlciAoc2VhYykgb2YgdGhlIFR5cGUxLWJhc2VkCiAgICBmb250IGRyaXZlcnMuCgogIC0gUmVuYW1lZCB0aGUgZGlyZWN0b3J5ICJmcmVldHlwZTIvY29uZmlnIiB0byAiZnJlZXR5cGUyL2J1aWxkcyIgYW5kCiAgICB1cGRhdGVkIGFsbCByZWxldmFudCBmaWxlcy4KCiAgLSBGb3VuZCBhIG1lbW9yeSBsZWFrIGluIHRoZSAidHlwZTEiIGRyaXZlci4KCiAgLSBJbmNvcnBvcmF0ZWQgVG9tJ3MgcGF0Y2hlcyB0byAgc3VwcG9ydCBmbGV4IG9wZXJhdG9ycyBjb3JyZWN0bHkgaW4KICAgIE9wZW5UeXBlL0NGRiBmb250cy4gIE5vdyBhbGwgSSBuZWVkIGlzIHRvIHN1cHBvcnQgcHVyZSBDRkYgYW5kIENFRgogICAgZm9udHMgdG8gYmUgZG9uZSB3aXRoIHRoaXMgZHJpdmVyIDotKQoKICAtIEFkZGVkIHRoZSAgV2luZG93cyBGTlQvRk9OIGRyaXZlciBpbiAic3JjL3dpbmZvbnRzIi4gICBGb3Igbm93LCBpdAogICAgYWx3YXlzICAic2ltdWxhdGVzIiAgIGEgIFVuaWNvZGUgIGNoYXJtYXAsICBzbyAgIGl0ICBzaG91bGRuJ3QgIGJlCiAgICBjb25zaWRlcmVkIGNvbXBsZXRlZCByaWdodCBub3cuCgogICAgSXQgIGlzIHRoZXJlICB0byBiZSAgbW9yZSBhICBwcm9vZiBvZiAgY29uY2VwdCB0aGFuICBhbnl0aGluZyBlbHNlCiAgICBhbnl3YXkuICBUaGUgZHJpdmVyIGlzIGEgc2luZ2xlICBDIHNvdXJjZSBmaWxlLCB0aGF0IGNvbXBpbGVzIHRvIDMKICAgIEtiIG9mIGNvZGUuCgogICAgSSdtICBzdGlsbCB3b3JraW5nIG9uICB0aGUgUENGL0JERiAgZHJpdmVycywgYnV0ICBJJ20gdG9vICBsYXp5IHRvCiAgICBmaW5pc2ggdGhlbSBub3cuCgogIC0gQ0hBTkdFUyBUTyBUSEUgSElHSC1MRVZFTCBBUEkKCiAgICAqIEZUX0dldF9LZXJuaW5nIGhhcyBhIG5ldyBwYXJhbWV0ZXIgdGhhdCBhbGxvd3MgeW91IHRvIHNlbGVjdCB0aGUKICAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIGtlcm5pbmcgIHZlY3RvciAoZm9udCB1bml0cywgc2NhbGVkLCBzY2FsZWQgKwogICAgICBncmlkLWZpdHRlZCkuCiAgICAqIFRoZSAgb3V0bGluZSBmdW5jdGlvbnMgYXJlICBub3cgaW4gPGZyZWV0eXBlL2Z0b3V0bG4uaD4gIGFuZCBub3QKICAgICAgcGFydCBvZiA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4gYW55bW9yZS4KICAgICogPGZyZWV0eXBlL2Z0bW9kdWxlLmg+ICAgIG5vdyAgICAgY29udGFpbnMgICAgZGVjbGFyYXRpb25zICAgIGZvcgogICAgICAgRlRfTmV3X0xpYnJhcnksIEZUX0RvbmVfTGlicmFyeSwgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcy4KICAgICogVGhlIHNvLWNhbGxlZCBjb252ZW5pZW5jZSAgZnVuY3Rpb25zIGhhdmUgbW92ZWQgZnJvbSAiZnRvdXRsbi5jIgogICAgICB0byAgImZ0Z2x5cGguYyIsICBhbmQgIGFyZSAgdGh1cyBhdmFpbGFibGUgIHdpdGggIHRoaXMgIG9wdGlvbmFsCiAgICAgIGNvbXBvbmVudCAgICBvZiAgIHRoZSAgIGxpYnJhcnkuICAgICBUaGV5ICAgYXJlICAgIGRlY2xhcmVkICAgaW4KICAgICAgPGZyZWV0eXBlL2Z0Z2x5cGguaD4gbm93LgogICAgKiBBbnRpLWFsaWFzZWQgIHJlbmRlcmluZyBpcyBub3cgIHRoZSBkZWZhdWx0ICBmb3IgRlRfUmVuZGVyX0dseXBoCiAgICAgIChpLmUuIGNvcnJlc3BvbmRzIHRvIHJlbmRlcl9tb2RlID09IDAgPT0gZnRfcmVuZGVyX21vZGVfbm9ybWFsKS4KICAgICAgVG8gZ2VuZXJhdGUgYSBtb25vY2hyb21lIGJpdG1hcCwgdXNlIGZ0X3JlbmRlcl9tb2RlX21vbm8sIG9yIHRoZQogICAgICBGVF9MT0FEX01PTk9DSFJPTUUgICAgIGZsYWcgICAgaW4gICAgRlRfTG9hZF9HbHlwaC9GVF9Mb2FkX0NoYXIuCiAgICAgIEZUX0xPQURfQU5USV9BTElBUyBpcyBzdGlsbCBkZWZpbmVkLCBidXQgdmFsdWVzIHRvIDAuCiAgICAqIDxmcmVldHlwZS9mcmVldHlwZS5oPiAgbm93IGluY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oPiwKICAgICAgc29sdmluZyBhIGZldyBoZWFkYWNoZXMgOi0pCiAgICAqIFRoZSB0eXBlIEZUX0dseXBoU2xvdFJlYyBoYXMgbm93IGEgImxpYnJhcnkiIGZpZWxkLgoKICAtIENIQU5HRVMgVE8gVEhFICJmdGdseXBoLmgiIEFQSQoKICAgIFRoaXMgQVBJIGhhcyAgYmVlbiBzZXZlcmVseSBtb2RpZmllZCBpbiBvcmRlciAgdG8gbWFrZSBpdCBzaW1wbGVyLAogICAgY2xlYXJlciwgYW5kIG1vcmUgIGVmZmljaWVudC4gIEl0IGNlcnRhaW5seSBub3cgbG9va3MgIGxpa2UgYSByZWFsCiAgICAiZ2x5cGggZmFjdG9yeSIgIG9iamVjdCwgYW5kIGFsbG93cyBjbGllbnQgIGFwcGxpY2F0aW9ucyB0byBtYW5hZ2UKICAgIChpLmUuICB0cmFuc2Zvcm0sICBiYm94ICBhbmQgIHJlbmRlcikgZ2x5cGggIGltYWdlcyAgd2l0aG91dCAgZXZlcgogICAga25vd2luZyB0aGVpciBvcmlnaW5hbCBmb3JtYXQuCgogIC0gQWRkZWQgIHN1cHBvcnQgIGZvciBDSUQta2V5ZWQgIGZvbnRzICB0byAgdGhlICBDRkYgZHJpdmVyLiAgIE1heWJlCiAgICBzdXBwb3J0IGZvciBwdXJlIENGRiArIENFRiBmb250cyBzaG91bGQgY29tZSBpbj8KCiAgLSBDbGVhbmVkIHVwICBzb3VyY2UgY29kZSBpbiBvcmRlciAgdG8gYXZvaWQgdHdvICBmdW5jdGlvbnMgd2l0aCB0aGUKICAgIHNhbWUgbmFtZS4gIEFsc28gIGNoYW5nZWQgdGhlIG5hbWVzIG9mIHRoZSAgZmlsZXMgaW4gInR5cGUxeiIgZnJvbQogICAgInQxWFhYWCIgdG8gInoxWFhYWCIgaW4gb3JkZXIgdG8gYXZvaWQgYW55IGNvbmZsaWN0cy4KCiAgICAibWFrZSBtdWx0aSIgbm93IHdvcmtzIHdlbGwgOi0pCgogICAgQWxzbyByZW1vdmVkIHRoZSB1c2Ugb2YgImNpZGFmbSIgZm9yIG5vdywgZXZlbiBpZiB0aGUgc291cmNlIGZpbGVzCiAgICBhcmUgIHN0aWxsIHRoZXJlLiAgVGhpcyAgZnVuY3Rpb25hbGl0eSB3aWxsICBjZXJ0YWlubHkgIGdvIGludG8gIGEKICAgIHNwZWNpZmljIG1vZHVsZS4KCiAgLSBBRERFRCBTVVBQT1JUIEZPUiBUSEUgQVVUTy1ISU5URVIKCiAgICBJdCAgd29ya3MgOi0pIEkgIGhhdmUgYSAgZGVtbyBwcm9ncmFtICB3aGljaCBzaW1wbHkgIGlzIGEgIGNvcHkgb2YKICAgICJmdHZpZXciICAgICAgIHRoYXQgICAgICBkb2VzICAgICAgIGEgICAgICBgRlRfQWRkX01vZHVsZShsaWJyYXJ5LAogICAgJmF1dG9oaW50ZXJfbW9kdWxlX2NsYXNzKScgYWZ0ZXIgIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24sIGFuZCBUeXBlCiAgICAxICYgT3BlblR5cGUvQ0ZGIGZvbnRzIGFyZSBub3cgaGludGVkLgoKICAgIENJRCAgZm9udHMgYXJlICBub3QgaGludGVkLCAgYXMgdGhleSAgaW5jbHVkZSBubyAgY2hhcm1hcCAgYW5kIHRoZQogICAgYXV0by1oaW50ZXIgZG9lc24ndCBpbmNsdWRlICAiZ2VuZXJpYyIgZ2xvYmFsIG1ldHJpY3MgY29tcHV0YXRpb25zCiAgICB5ZXQuCgogICAgTm93LCBJIG5lZWQgdG8gcmVsZWFzZSB0aGlzIHRoaW5nIHRvIHRoZSBGcmVlVHlwZSAyIHNvdXJjZS4KCiAgLSBDSEFOR0VTIFRPIFRIRSBSRU5ERVJFUiBNT0RVTEVTCgogICAgVGhlICBtb25vY2hyb21lICBhbmQgc21vb3RoICByZW5kZXJlcnMgIGFyZSAgbm93ICBpbiB0d28gIGRpc3RpbmN0CiAgICBkaXJlY3RvcmllcywgbmFtZWx5ICJzcmMvcmFzdGVyMSIgYW5kICJzcmMvc21vb3RoIi4gIE5vdGUgdGhhdCB0aGUKICAgIG9sZCAic3JjL3JlbmRlcmVyIiBpcyBub3cgZ29uZS4KCiAgICBJIGRpdGNoZWQgIHRoZSA1LWdyYXktbGV2ZWxzIHJlbmRlcmVycy4gIEJhc2ljYWxseSwgIGl0IGludm9sdmVkIGEKICAgIHNpbXBsZSAjZGVmaW5lIHRvZ2dsZSBpbiAnc3JjL3Jhc3RlcjEvZnRyYXN0ZXIuYycuCgogICAgRlRfUmVuZGVyX0dseXBoLCAgRlRfT3V0bGluZV9SZW5kZXIgICYgIEZUX091dGxpbmVfR2V0X0JpdG1hcCAgbm93CiAgICBzZWxlY3QgdGhlIGJlc3QgcmVuZGVyZXIgIGF2YWlsYWJsZSwgZGVwZW5kaW5nIG9uIHJlbmRlciBtb2RlLiAgSWYKICAgIHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciBhICBnaXZlbiBnbHlwaCBpbWFnZSBmb3JtYXQgaXNuJ3QgY2FwYWJsZQogICAgb2Ygc3VwcG9ydGluZyAgdGhlIHJlbmRlciBtb2RlLCBhbm90aGVyICBvbmUgd2lsbCBiZSAgZm91bmQgaW4gdGhlCiAgICBsaWJyYXJ5J3MgbGlzdC4gICBUaGlzIG1lYW5zIHRoYXQgY2xpZW50IGFwcGxpY2F0aW9ucyAgZG8gbm90IG5lZWQKICAgIHRvICBzd2l0Y2ggb3IgIHNldCAgdGhlICByZW5kZXJlcnMgdGhlbXNlbHZlcyAgKGFzICBpbiB0aGUgIGxhdGVzdAogICAgY2hhbmdlKSwgdGhleSdsbCBnZXQgd2hhdCB0aGV5IHdhbnQgYXV0b21hdGljYWxseS4gIEF0IGxhc3QuCgogICAgQ2hhbmdlZCB0aGUgZGVtbyBwcm9ncmFtcyBhY2NvcmRpbmdseS4KCiAgLSBNQUpPUiBJTlRFUk5BTCBSRURFU0lHTjoKCiAgICBBIGxvdCBvZiBpbnRlcm5hbCBtb2RpZmljYXRpb25zICBoYXZlIGJlZW4gcGVyZm9ybWVkIGxhdGVseSBvbiB0aGUKICAgIHNvdXJjZSBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBmb2xsb3dpbmcgZW5oYW5jZW1lbnRzOgoKICAgICogTW9yZSBnZW5lcmljIG1vZHVsZSBzdXBwb3J0OgoKICAgICAgVGhlIEZUX01vZHVsZSAgdHlwZSBpcyAgbm93IGRlZmluZWQgdG8gIHJlcHJlc2VudCBhIGhhbmRsZSAgdG8gYQogICAgICBnaXZlbiAgbW9kdWxlLiAgIFRoZSAgZmlsZSAgPGZyZWV0eXBlL2Z0bW9kdWxlLmg+ICBjb250YWlucyAgdGhlCiAgICAgIEZUX01vZHVsZV9DbGFzcyBkZWZpbml0aW9uLCBhcyB3ZWxsIGFzIHRoZSBtb2R1bGUtbG9hZGluZyBwdWJsaWMKICAgICAgQVBJLgoKICAgICAgVGhlICBGVF9Ecml2ZXIgdHlwZSAgaXMgc3RpbGwgIGRlZmluZWQsIGFuZCAgc3RpbGwgIHJlcHJlc2VudHMgYQogICAgICBwb2ludGVyIHRvICBhIGZvbnQgZHJpdmVyLiAgTm90ZSB0aGF0ICBGVF9BZGRfRHJpdmVyIGlzIHJlcGxhY2VkCiAgICAgIGJ5IEZUX0FkZF9Nb2R1bGUsIEZUX0dldF9Ecml2ZXIgYnkgRlRfR2V0X01vZHVsZSwgZXRjLgoKICAgICogU3VwcG9ydCBmb3IgZ2VuZXJpYyBnbHlwaCBpbWFnZSB0eXBlczoKCiAgICAgIFRoZSBGVF9SZW5kZXJlciAgdHlwZSBpcyBhIHBvaW50ZXIgIHRvIGEgbW9kdWxlICB1c2VkIHRvIHBlcmZvcm0KICAgICAgdmFyaW91cyBvcGVyYXRpb25zIG9uIGdseXBoIGltYWdlLgoKICAgICAgRWFjaCByZW5kZXJlciBpcyAgY2FwYWJsZSBvZiBoYW5kbGluZyBpbWFnZXMgaW4gIGEgc2luZ2xlIGZvcm1hdAogICAgICAoZS5nLiBmdF9nbHlwaF9mb3JtYXRfb3V0bGluZSkuICBJdHMgZnVuY3Rpb25zIGFyZSB1c2VkIHRvOgoKICAgICAgLSB0cmFuc2Zvcm0gYW4gZ2x5cGggaW1hZ2UKICAgICAgLSByZW5kZXIgYSBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwCiAgICAgIC0gcmV0dXJuIHRoZSBjb250cm9sIGJveCAoZGltZW5zaW9ucykgb2YgYSBnaXZlbiBnbHlwaCBpbWFnZQoKICAgICAgVGhlIHNjYW4gY29udmVydGVycyAiZnRyYXN0ZXIuYyIgYW5kICJmdGdyYXlzLmMiIGhhdmUgYmVlbiBtb3ZlZAogICAgICB0byB0aGUgbmV3IGRpcmVjdG9yeSAic3JjL3JlbmRlcmVyIiwgYW5kIGFyZSB1c2VkIHRvIHByb3ZpZGUgdHdvCiAgICAgIGRlZmF1bHQgcmVuZGVyZXIgbW9kdWxlcy4KCiAgICAgIE9uZSBjb3JyZXNwb25kcyAgdG8gdGhlICJzdGFuZGFyZCIgc2Nhbi1jb252ZXJ0ZXIsICB0aGUgb3RoZXIgdG8KICAgICAgdGhlICJzbW9vdGgiIG9uZS4KCiAgICAgIGhlICBjdXJyZW50ICByZW5kZXJlciAgY2FuICBiZSAgc2V0ICB0aHJvdWdoICB0aGUgIG5ldyAgZnVuY3Rpb24KICAgICAgRlRfU2V0X1JlbmRlcmVyLgoKICAgICAgVGhlIG9sZCByYXN0ZXItcmVsYXRlZCBmdW5jdGlvbiBGVF9TZXRfUmFzdGVyLCBGVF9HZXRfUmFzdGVyIGFuZAogICAgICBGVF9TZXRfUmFzdGVyX01vZGUgaGF2ZSBub3cgZGlzYXBwZWFyZWQsIGluIGZhdm9yIG9mIHRoZSBuZXc6CgogICAgICAgIEZUX0dldF9SZW5kZXJlcgogICAgICAgIEZUX1NldF9SZW5kZXJlcgoKICAgICAgU2VlIHRoZSBmaWxlIDxmcmVldHlwZS9mdHJlbmRlci5oPiBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgVGhlc2UgIGNoYW5nZXMgIHdlcmUgIG5lY2Vzc2FyeSAgdG8gcHJvcGVybHkgIHN1cHBvcnQgIGRpZmZlcmVudAogICAgICBzY2FsYWJsZSBmb3JtYXRzIGluIHRoZSBmdXR1cmUsIGxpa2UgYmktY29sb3IgZ2x5cGhzLCBldGMuCgogICAgKiBHbHlwaCBsb2FkZXIgb2JqZWN0OgoKICAgICAgQSAgbmV3ICBpbnRlcm5hbCAgb2JqZWN0LCAgY2FsbGVkICBhICAnZ2x5cGggIGxvYWRlcicgIGhhcyAgYmVlbgogICAgICBpbnRyb2R1Y2VkIGluIHRoZSBiYXNlIGxheWVyLiAgSXQgaXMgdXNlZCBieSBhbGwgc2NhbGFibGUgZm9ybWF0CiAgICAgIGZvbnQgZHJpdmVycyB0byBsb2FkIGdseXBocyBhbmQgY29tcG9zaXRlcy4KCiAgICAgIFRoaXMgb2JqZWN0ICBoYXMgYmVlbiAgY3JlYXRlZCB0byByZWR1Y2UgIHRoZSBjb2RlIHNpemUgIG9mIGVhY2gKICAgICAgZHJpdmVyLCAgYXMgIGVhY2ggIG9uZSAgb2YgIHRoZW0gIGJhc2ljYWxseSAgcmUtaW1wbGVtZW50ZWQgIGl0cwogICAgICBmdW5jdGlvbmFsaXR5LgoKICAgICAgU2VlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4gYW5kIHRoZSBGVF9HbHlwaExvYWRlciB0eXBlIGZvcgogICAgICBtb3JlIGluZm9ybWF0aW9uLgoKICAgICogRlRfR2x5cGhTbG90IGhhcyBuZXcgZmllbGRzOgoKICAgICAgSW4gIG9yZGVyICAgdG8gIHN1cHBvcnQgIGV4dGVuZGVkICBmZWF0dXJlcyAgIChzZWUgIGJlbG93KSwgIHRoZQogICAgICBGVF9HbHlwaFNsb3Qgc3RydWN0dXJlIGhhcyBhIGZldyBuZXcgZmllbGRzOgoKICAgICAgbGluZWFySG9yaUFkdmFuY2U6CgogICAgICAgIFRoaXMgIGZpZWxkICBnaXZlcyAgdGhlICAgbGluZWFybHkgIHNjYWxlZCAgKGkuZS4gIHNjYWxlZCAgYnV0CiAgICAgICAgdW5oaW50ZWQpIGFkdmFuY2UgIHdpZHRoIGZvciB0aGUgIGdseXBoLCBleHByZXNzZWQgYXMgIGEgMTYuMTYKICAgICAgICBmaXhlZCBwaXhlbCB2YWx1ZS4gIFRoaXMgaXMgdXNlZnVsIHRvIHBlcmZvcm0gV1lTSVdZRyB0ZXh0LgoKICAgICAgbGluZWFyVmVydEFkdmFuY2U6CiAgICAgICAgVGhpcyBmaWVsZCAgZ2l2ZXMgdGhlIGxpbmVhcmx5ICBzY2FsZWQgYWR2YW5jZSBoZWlnaHQgIGZvciB0aGUKICAgICAgICBnbHlwaCAgKHJlbGV2YW50IGluICB2ZXJ0aWNhbCAgZ2x5cGggbGF5b3V0cyAgb25seSkuICBUaGlzICBpcwogICAgICAgIHVzZWZ1bCB0byBwZXJmb3JtIFdZU0lXWUcgdGV4dC4KCiAgICAgICAgTm90ZSB0aGF0ICB0aGUgdHdvIGFib3ZlIGZpZWxkIHJlcGxhY2UgIHRoZSByZW1vdmVkICJtZXRyaWNzMiIKICAgICAgICBmaWVsZCBpbiB0aGUgZ2x5cGggc2xvdC4KCiAgICAgIGFkdmFuY2U6CiAgICAgICAgVGhpcyBmaWVsZCBpcyBhIHZlY3RvciAgdGhhdCBnaXZlcyB0aGUgdHJhbnNmb3JtZWQgYWR2YW5jZSBmb3IKICAgICAgICB0aGUgZ2x5cGguICAgQnkgZGVmYXVsdCwgaXQgY29ycmVzcG9uZHMgdG8gIHRoZSBhZHZhbmNlIHdpZHRoLAogICAgICAgIHVubGVzcyAgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgIHdhcyAgc3BlY2lmaWVkICB3aGVuICBjYWxsaW5nCiAgICAgICAgRlRfTG9hZF9HbHlwaCBvciBGVF9Mb2FkX0NoYXIuCgogICAgICBiaXRtYXBfbGVmdDoKICAgICAgICBUaGlzICBmaWVsZCBnaXZlcyAgdGhlICBkaXN0YW5jZSBpbiAgaW50ZWdlciAgcGl4ZWxzIGZyb20gIHRoZQogICAgICAgIGN1cnJlbnQgcGVuIHBvc2l0aW9uICB0byB0aGUgbGVmdC1tb3N0IHBpeGVsIG9mICBhIGdseXBoIGltYWdlCiAgICAgICAgSUYgSVQgSVMgIEEgQklUTUFQLiAgSXQgaXMgb25seSB2YWxpZCAgd2hlbiB0aGUgImZvcm1hdCIgZmllbGQKICAgICAgICBpcyBzZXQgdG8gImZ0X2dseXBoX2Zvcm1hdF9iaXRtYXAiLCBmb3IgZXhhbXBsZSwgYWZ0ZXIgY2FsbGluZwogICAgICAgIHRoZSBuZXcgZnVuY3Rpb24gRlRfUmVuZGVyX0dseXBoLgoKICAgICAgYml0bWFwX3RvcDoKICAgICAgICBUaGlzICBmaWVsZCBnaXZlcyAgdGhlICBkaXN0YW5jZSBpbiAgaW50ZWdlciAgcGl4ZWxzIGZyb20gIHRoZQogICAgICAgIGN1cnJlbnQgcGVuIHBvc2l0aW9uIChsb2NhdGVkIG9uIHRoZSBiYXNlbGluZSkgdG8gdGhlIHRvcC1tb3N0CiAgICAgICAgcGl4ZWwgb2YgdGhlICBnbHlwaCBpbWFnZSBJRiBJVCBJUyAgQSBCSVRNQVAuICBQb3NpdGl2ZSB2YWx1ZXMKICAgICAgICBjb3JyZXNwb25kIHRvIHVwd2FyZHMgWS4KCiAgICAgIGxvYWRlcjoKICAgICAgICBUaGlzICBpcyBhICBuZXcgIHByaXZhdGUgIGZpZWxkIGZvciAgdGhlICBnbHlwaCBzbG90LiAgIENsaWVudAogICAgICAgIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHRvdWNoIGl0LgoKCiAgICAqIFN1cHBvcnQgZm9yIHRyYW5zZm9ybXMgYW5kIGRpcmVjdCByZW5kZXJpbmcgaW4gRlRfTG9hZF9HbHlwaDoKCiAgICAgIE1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgZm91bmQgaW4gPGZyZWV0eXBlL2Z0Z2x5cGguaD4gaGFzIGJlZW4KICAgICAgbW92ZWQgdG8gdGhlIGNvcmUgbGlicmFyeS4gSGVuY2UsIHRoZSBmb2xsb3dpbmc6CgogICAgICAtIEEgICB0cmFuc2Zvcm0gICBjYW4gICBiZSAgIHNwZWNpZmllZCAgZm9yICAgYSAgIGZhY2UgICB0aHJvdWdoCiAgICAgICAgRlRfU2V0X1RyYW5zZm9ybS4gIHRoaXMgdHJhbnNmb3JtICBpcyBhcHBsaWVkIGJ5IEZUX0xvYWRfR2x5cGgKICAgICAgICB0byAgc2NhbGFibGUgZ2x5cGggIGltYWdlcyAoaS5lLiAgTk9UIFRPICBCSVRNQVBTKSAgYmVmb3JlIHRoZQogICAgICAgIGZ1bmN0aW9uIHJldHVybnMsIHVubGVzcyB0aGUgYml0IGZsYWcgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNCiAgICAgICAgd2FzIHNldCBpbiB0aGUgbG9hZCBmbGFncy4KCiAgICAgIC0gT25jZSAgYSAgZ2x5cGggaW1hZ2UgIGhhcyAgYmVlbiAgbG9hZGVkLCAgaXQgY2FuICBiZSAgZGlyZWN0bHkKICAgICAgICBjb252ZXJ0ZWQgIHRvICBhICBiaXRtYXAgIGJ5ICB1c2luZyAgdGhlICBuZXcgIEZUX1JlbmRlcl9HbHlwaAogICAgICAgIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHRoaXMgIGZ1bmN0aW9uIHRha2VzIHRoZSBnbHlwaCBpbWFnZSBmcm9tCiAgICAgICAgdGhlIGdseXBoIHNsb3QsICBhbmQgY29udmVydHMgaXQgdG8gYSAgYml0bWFwIHdob3NlIHByb3BlcnRpZXMKICAgICAgICBhcmUgcmV0dXJuZWQgIGluICJmYWNlLmdseXBoLmJpdG1hcCIsICJmYWNlLmdseXBoLmJpdG1hcF9sZWZ0IgogICAgICAgIGFuZCAiZmFjZS5nbHlwaC5iaXRtYXBfdG9wIi4gIFRoZSAgb3JpZ2luYWwgbmF0aXZlIGltYWdlIG1pZ2h0CiAgICAgICAgYmUgbG9zdCBhZnRlciB0aGUgY29udmVyc2lvbi4KCiAgICAgIC0gV2hlbiB1c2luZyB0aGUgbmV3ICBiaXQgZmxhZyBGVF9MT0FEX1JFTkRFUiwgdGhlIEZUX0xvYWRfR2x5cGgKICAgICAgICBhbmQgICBGVF9Mb2FkX0NoYXIgICBmdW5jdGlvbnMgICB3aWxsICAgY2FsbCAgIEZUX1JlbmRlcl9HbHlwaAogICAgICAgIGF1dG9tYXRpY2FsbHkgd2hlbiBuZWVkZWQuCgogIC0gUmVmb3JtYXR0ZWQgYWxsICBtb2R1bGVzIHNvdXJjZSAgY29kZSBpbiBvcmRlciAgdG8gZ2V0IHJpZCAgb2YgdGhlCiAgICBiYXNpYyBkYXRhIHR5cGVzIHJlZGlmaW5pdGlvbnMgKGkuZS4gIlRUX0ludCIgaW5zdGVhZCBvZiAiRlRfSW50IiwKICAgICJUMV9GaXhlZCIgIGluc3RlYWQgIG9mICAiRlRfRml4ZWQiKS4gIEhlbmNlICB0aGUgIGZvcm1hdC1zcGVjaWZpYwogICAgcHJlZml4ZXMgbGlrZSAgIlRUXyIsICJUMV8iLCAgIlQyXyIgYW5kICJDSURfIiAgYXJlIG9ubHkgIHVzZWQgZm9yCiAgICByZWxldmFudCBzdHJ1Y3R1cmVzLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBDSEFOR0VTIEZPUiBCRVRBIDcKCiAgLSBidWctZml4ZWQgdGhlICBPcGVuVHlwZS9DRkYgcGFyc2VyLiBJdCAgbm93IGxvYWRzIGFuZCAgZGlzcGxheXMgbXkKICAgIHR3byAgZm9udHMgbmljZWx5LCAgYnV0IEknbSAgcHJldHR5IGNlcnRhaW4gIHRoYXQgbW9yZSAgdGVzdGluZyBpcwogICAgbmVlZGVkIDotKQoKICAtIGZpeGVkIHRoZSBjcnVtbXkgVHlwZSAxIGhpbnRlciwgaXQgbm93IGhhbmRsZXMgYWNjZW50ZWQgY2hhcmFjdGVycwogICAgY29ycmVjdGx5ICh3ZWxsLCB0aGUgYWNjZW50IGlzICBub3QgYWx3YXlzIHdlbGwgcGxhY2VkLCBidXQgdGhhdCdzCiAgICBhbm90aGVyIHByb2JsZW0uLikKCiAgLSBhZGRlZCB0aGUgQ0lELWtleWVkIFR5cGUgMSAgZHJpdmVyIGluICJzcmMvY2lkIi4gV29ya3MgcHJldHR5IHdlbGwKICAgIGZvciBvbmx5IDEzIEtiIG9mIGNvZGUgIDstKSBEb2Vzbid0IHJlYWQgQUZNIGZpbGVzIHRob3VnaCwgbm9yIHRoZQogICAgcmVhbGx5IHVzZWZ1bCBDTUFQIGZpbGVzLi4KCiAgLSBmaXhlZCB0d28gYnVncyBpbiB0aGUgc21vb3RoIHJlbmRlcmVyIChzcmMvYmFzZS9mdGdyYXlzLmMpLiBUaGFua3MKICAgIHRvIEJvcmlzIExldG9jaGEgZm9yIHNwb3R0aW5nIHRoZW0gYW5kIHByb3ZpZGluZyBhIGZpeC4uCgogIC0gZml4ZWQgcG90ZW50aWFsICJkaXZpZGUgYnkgemVybyIgYnVncyBpbiBmdGNhbGMuYy4uIG15IGdvZC4uCgogIC0gYWRkZWQgc291cmNlICBjb2RlIGZvciAgdGhlIE9wZW5UeXBlL0NGRiBkcml2ZXIgIChzdGlsbCBpbmNvbXBsZXRlCiAgICB0aG91Z2guLikKCiAgLSBtb2RpZmllZCB0aGUgIFNGTlQgZHJpdmVyIHNsaWdodGx5ICB0byBwZXJmb3JtIG1vcmUgIHJvYnVzdCBoZWFkZXIKICAgIGNoZWNrcyAgaW4gVFRfTG9hZF9TRk5UX0hlYWRlci4gVGhpcyAgcHJldmVudHMgY2VydGFpbiAgZm9udCBmaWxlcwogICAgKGUuZy4gIHNvbWUgIFR5cGUgIDEgIE11bHRpcGxlICBNYXN0ZXJzKSAgZnJvbSAgYmVpbmcgIGluY29ycmVjdGx5CiAgICAicmVjb2duaXplZCIgYXMgVHJ1ZVR5cGUgZm9udCBmaWxlcy4uCgogIC0gbW92ZWQgYSBsb3Qgb2Ygc3R1ZmYgZnJvbSAgdGhlIFRydWVUeXBlIGRyaXZlciB0byB0aGUgU0ZOVCBtb2R1bGUsCiAgICB0aGlzICAgYWxsb3dzICAgZ3JlYXRlciAgIGNvZGUgICByZS11c2UgICBiZXR3ZWVuICAgZm9udCAgIGRyaXZlcnMKICAgIChlLmcuIFRydWVUeXBlLCBPcGVuVHlwZSwgQ29tcGFjdC1UcnVlVHlwZSwgZXRjLi4pCgogIC0gYWRkZWQgYSB0aW55IHNlZ21lbnQgY2FjaGUgdG8gdGhlIFNGTlQgQ2hhcm1hcCA0IGRlY29kZXIsIGluIG9yZGVyCiAgICB0byBtaW5pbWFsbHkgc3BlZWQgaXQgdXAuLgoKICAtIGFkZGVkIHN1cHBvcnQgZm9yIE11bHRpcGxlIE1hc3RlciBmb250cyBpbiAidHlwZTF6Ii4gVGhlcmUgaXMgYWxzbwogICAgYSAgbmV3IGZpbGUgIG5hbWVkICA8ZnJlZXR5cGUvZnRtbS5oPiB3aGljaCAgZGVmaW5lcyBmdW5jdGlvbnMgIHRvCiAgICBtYW5hZ2UgdGhlbSBmcm9tIGNsaWVudCBhcHBsaWNhdGlvbnMuCgogICAgVGhlIG5ldyBmaWxlICJzcmMvYmFzZS9mdG1tLmMiIGlzIGFsc28gb3B0aW9uYWwgdG8gdGhlIGVuZ2luZS4uCgogIC0gdmFyaW91cyAgZm9ybWF0dGluZyBjaGFuZ2VzIChlLmcuICBFWFBPUlRfREVGIC0+ICBGVF9FWFBPUlRfREVGKSArCiAgICBzbWFsbCBidWcgZml4ZXMgaW4gRlRfTG9hZF9HbHlwaCwgdGhlICJ0eXBlMSIgZHJpdmVyLCBldGMuLgoKICAtIGEgbWlub3IgZml4IHRvIHRoZSBUeXBlIDEgZHJpdmVyIHRvIGxldCB0aGVtIGFwcGx5IHRoZSBmb250IG1hdHJpeAogICAgY29ycmVjdGx5ICh1c2VkIGZvciBtYW55IG9ibGlxdWUgZm9udHMuLikKCiAgLSBzb21lIGZpeGVzIGZvciA2NC1iaXQgc3lzdGVtcyAobWFpbmx5IGNoYW5naW5nIHNvbWUgRlRfVFJBQ0UgY2FsbHMKICAgIHRvIHVzZSAlcCBpbnN0ZWFkIG9mICVseCkuLiBUaGFua3MgdG8gS2FybCBSb2JpbGxhcmQKCiAgLSBmaXhlZCAgc29tZSBidWdzICBpbiAgdGhlIHNiaXQgIGxvYWRlciAoc3JjL2Jhc2Uvc2ZudC90dHNiaXQuYykgICsKICAgIGFkZGVkICBhIG5ldyBmbGFnLCAgRlRfTE9BRF9DUk9QX0JJVE1BUCB0byAgcXVlcnkgdGhhdCAgYml0bWFwcyBiZQogICAgY3JvcHBlZCB3aGVuICBsb2FkZWQgZnJvbSBhIGZpbGUgIChtYXliZSBJIHNob3VsZCAgbW92ZSB0aGUgYml0bWFwCiAgICBjcm9wcGVyIHRvIHRoZSBiYXNlIGxheWVyID8/KS4KCiAgLSBjaGFuZ2VkIHRoZSBkZWZhdWx0ICBudW1iZXIgb2YgZ3JheSBsZXZlbHMgb2YgIHRoZSBzbW9vdGggcmVuZGVyZXIKICAgIHRvIDI1NiAgKGluc3RlYWQgb2YgIHRoZSBwcmV2aW91cyAxMjgpLiAgT2YgY291cnNlLCB0aGUgIGh1bWFuIGV5ZQogICAgY2FuJ3Qgc2VlIGFueSBkaWZmZXJlbmNlIDstKQoKICAtIHJlbW92ZWQgVFRfTUFYX1NVQkdMWVBIUywgIHRoZXJlIGlzIG5vIHN0YXRpYyBsaW1pdCAgb24gdGhlIG51bWJlcgogICAgb2Ygc3ViZ2x5cGhzIGluIGEgVHJ1ZVR5cGUgZm9udCBub3cuLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBDSEFOR0VTIDE2IE1heSAyMDAwCgogIC0gdGFnZ2VkICJCRVRBLTYiICBpbiB0aGUgIENWUyB0cmVlLiBUaGlzICBvbmUgaXMgYSAgc2VyaW91cyByZWxlYXNlCiAgICBjYW5kaWRhdGUgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBpbmNvcnBvcmF0ZSB0aGUgYXV0by1oaW50ZXIgeWV0Li4KCiAgLSB2YXJpb3VzIG9ic29sZXRlIGZpbGVzIHdlcmUgcmVtb3ZlZCwgYW5kIGNvcHlyaWdodCBoZWFkZXIgdXBkYXRlZAoKICAtIGZpbmFsbHkgIHVwZGF0ZWQgIHRoZSAgc3RhbmRhcmQgICByYXN0ZXIgIHRvICBmaXggIHRoZSAgbW9ub2Nocm9tZQogICAgcmVuZGVyaW5nIGJ1ZyArIHJlLWVuYWJsZSAgc3VwcG9ydCBmb3IgNS1ncmF5IGxldmVscyBhbnRpLWFsaWFzaW5nCiAgICAoc3Vjaywgc3Vjay4uKQoKICAtIGNyZWF0ZWQgbmV3IGhlYWRlciBmaWxlcywgYW5kIG1vZGlmaWVkIHNvdXJjZXMgYWNjb3JkaW5nbHk6CgogICAgIDxmcmVldHlwZS9mdHR5cGVzLmg+CiAgICAgICAtIHNpbXBsZSBGcmVlVHlwZSB0eXBlcywgd2l0aG91dCB0aGUgQVBJCiAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5Lmg+CiAgICAgICAtIGRlZmluaXRpb24gb2YgbWVtb3J5LW1hbmFnZW1lbnQgbWFjcm9zCgogIC0gYWRkZWQgICB0aGUgICAiRFNJRyIgICAoT3BlblR5cGUgICBEaWdpdGFsICAgU2lnbmF0dXJlKSAgIHRhZyAgIHRvCiAgICA8ZnJlZXR5cGUvdHR0YWdzLmg+CgogIC0gbGlnaHQgdXBkYXRlL2NsZWFuaW5nIG9mIHRoZSBidWlsZCBzeXN0ZW0gKyBjaGFuZ2VzIHRvIHRoZSBzb3VyY2VzCiAgICBpbiAgb3JkZXIgIHRvICBnZXQgIHJpZCAgb2YgX2FsbF8gIGNvbXBpbGVyICB3YXJuaW5ncyAgd2l0aCAgdGhyZWUKICAgIGNvbXBpbGVycywgaS5lOgoKICAgIGdjYyB3aXRoICItYW5zaSAtcGVkYW50aWMgLVdhbGwgLVciLCBWaXN1YWwgQysrIHdpdGggIi9XMyAvV1giIGFuZAogICAgTENDCgogICAgSU1QT1JUQU5UIE5PVEUgRk9SIFdJTjMyLUxDQyBVU0VSUzoKICAgIHwKICAgIHwgIEl0IHNlZW1zIHRoZSBDIHByZS1wcm9jZXNzb3IgIHRoYXQgY29tZXMgd2l0aCBMQ0MgaXMgYnJva2VuLCBpdAogICAgfCAgZG9lc24ndCAgcmVjb2duaXplICB0aGUgIEFOU0kgIHN0YW5kYXJkICBkaXJlY3RpdmVzICAjICBhbmQgICMjCiAgICB8ICBjb3JyZWN0bHkgd2hlbiBvbmUgb2YgdGhlICBhcmd1bWVudCBpcyBhIG1hY3JvLiBBbHNvLCBzb21ldGhpbmcKICAgIHwgIGxpa2U6CiAgICB8CiAgICB8ICAgICAjZGVmaW5lIEYoeCkgIHByaW50IyN4CiAgICB8CiAgICB8ICAgICBGKCgiaGVsbG8iKSkKICAgIHwKICAgIHwgIHdpbGwgZ2V0IGluY29ycmVjdGx5IHRyYW5zbGF0ZWQgdG86CiAgICB8CiAgICB8ICAgICBwcmludCAiaGVsbG8iKQogICAgfAogICAgfCAgYnkgaXRzIHByZS1wcm9jZXNzb3IuIEZvciAgdGhpcyByZWFzb24sIHlvdSBzaW1wbHkgY2Fubm90IGJ1aWxkCiAgICB8ICBGcmVlVHlwZSAyIGluIGRlYnVnIG1vZGUgd2l0aCB0aGlzIGNvbXBpbGVyLi4KCiAgLSB5ZXQgYW5vdGhlciBtYXNzaXZlIGdydW50IHdvcmsuIEkndmUgY2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKICAgIEVYUE9SVF9ERUYsICBFWFBPUlRfRlVOQywgQkFTRV9ERUYgJiAgQkFTRV9GVU5DIG1hY3Jvcy4gIFRoZXNlIG5vdwogICAgdGFrZSBhbiBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIHR5cGUuCgogICAgVGhpcyAgaXMgbmVjZXNzYXJ5IHRvICBjb21waWxlIEZyZWVUeXBlICBhcyBhICBETEwgb24gIFdpbmRvd3MgYW5kCiAgICBPUy8yLiAgRGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciB1c2VkLCBhIGNvbXBpbGVyLXNwZWNpZmljIGtleXdvcmQKICAgIGxpa2UgIF9fZXhwb3J0IG9yIF9fc3lzdGVtICBtdXN0IGJlICBwbGFjZWQgYmVmb3JlICAoVmlzdWFsQysrKSBvcgogICAgYWZ0ZXIgKEJvcmxhbmRDKyspIHRoZSB0eXBlLi4KCiAgICBPZiBjb3Vyc2UsIHRoaXMgbmVlZGVkIGEgbG90IG9mIGNoYW5nZXMgdGhyb3VnaG91dCB0aGUgc291cmNlIGNvZGUKICAgIHRvIG1ha2UgaXQgY29tcGlsZSBhZ2Fpbi4uLiBBbGwgY2xlYW5lZCB1cCBub3csIGFwcGFyZW50bHkuLgoKICAgIE5vdGUgYWxzbyAgdGhhdCB0aGVyZSBpcyBhICBuZXcgRVhQT1JUX1ZBUiBtYWNybyAgZGVmaW5lZCB0byBhbGxvdwogICAgdGhlICAgX2RlY2xhcmF0aW9uXyAgICBvZiAgIGFuICAgZXhwb3J0YWJsZSAgICBwdWJsaWMgICAoY29uc3RhbnQpCiAgICB2YXJpYWJsZS4gIFRoaXMgIGlzICB0aGUgICBjYXNlICBvZiAgdGhlICByYXN0ZXIgIGludGVyZmFjZXMgIChzZWUKICAgIGZ0cmFzdGVyLmggYW5kIGZ0Z3JheXMuaCksIGFzIHdlbGwgYXMgZWFjaCBtb2R1bGUncyBpbnRlcmZhY2UgKHNlZQogICAgc2Zkcml2ZXIuaCwgcHNkcml2ZXIuaCwgZXRjLi4pCgogIC0gbmV3IGZlYXR1cmU6IGl0ICBpcyBub3cgcG9zc2libGUgdG8gcGFzcyAgZXh0cmEgcGFyYW1ldGVycyB0byBmb250CiAgICAgICAgICAgICAgICAgZHJpdmVycyAgd2hlbiBjcmVhdGluZyAgYSBuZXcgIGZhY2Ugb2JqZWN0LiAgRm9yIG5vdywKICAgICAgICAgICAgICAgICB0aGlzIGNhcGFiaWxpdHkgaXMgdW51c2VkLiAgSXQgY291bGQgaG93ZXZlciBwcm92ZSB0bwogICAgICAgICAgICAgICAgIGJlIHVzZWZ1bCBpbiBhIG5lYXIgZnV0dXJlLi4KCiAgICAgIHRoZSBGVF9PcGVuX0FyZ3Mgc3RydWN0dXJlIHdhcyAgY2hhbmdlcywgYXMgd2VsbCBhcyB0aGUgaW50ZXJuYWwKICAgICAgZHJpdmVyIGludGVyZmFjZSAgKHRoZSBzcGVjaWZpYyAiaW5pdF9mYWNlIiAgbW9kdWxlIGZ1bmN0aW9uIGhhcwogICAgICBub3cgYSBkaWZmZXJlbnQgc2lnbmF0dXJlKS4KCiAgLSB1cGRhdGVkIHRoZSB0dXRvcmlhbCAobm90IGZpbmlzaGVkIHRob3VnaCkuCgogIC0gdXBkYXRlZCB0aGUgdG9wLWxldmVsIEJVSUxEICBkb2N1bWVudAoKICAtIGZpeGVkICBhICBwb3RlbnRpYWwgbWVtb3J5ICBsZWFrICB0aGF0ICBjb3VsZCAgb2NjdXIgd2hlbiAgbG9hZGluZwogICAgZW1iZWRkZWQgYml0bWFwcy4KCiAgLSBhZGRlZCAgICAgdGhlICAgICBkZWNsYXJhdGlvbiAgICAgb2YgICAgIEZUX05ld19NZW1vcnlfRmFjZSAgICAgaW4KICAgIDxmcmVldHlwZS9mcmVldHlwZS5oPiwgYXMgIGl0IHdhcyAgbWlzc2luZyBmcm9tIHRoZSAgcHVibGljIGhlYWRlcgogICAgKHRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgYWxyZWFkeSBpbiAiZnRvYmpzLmMiKS4KCiAgLSB0aGUgZmlsZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4gaGFzIGJlZW4gc2VyaW91c2x5IHVwZGF0ZWQgaW4gb3JkZXIKICAgIHRvIGFsbG93IHRoZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBlcnJvciBtZXNzYWdlIHRhYmxlcy4gU2VlIHRoZQogICAgY29tbWVudHMgd2l0aGluIGl0IGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAtIG1ham9yIGRpcmVjdG9yeSAgaGllcmFyY2h5IHJlLW9yZ2FuaXNhdGlvbi4gVGhpcyB3YXMgIGRvbmUgZm9yIHR3bwogICAgdGhpbmdzOgoKICAgICAgKiBmaXJzdCwgIHRvIGVhc2UgIHRoZSAibWFudWFsIiAgY29tcGlsYXRpb24gb2YgIHRoZSAgbGlicmFyeSBieQogICAgICAgIHJlcXVpcmluZyBhdCBsb3QgbGVzcyBpbmNsdWRlIHBhdGhzIDotKQoKICAgICAgKiBzZWNvbmQsICB0byAgYWxsb3cgIGV4dGVybmFsICBwcm9ncmFtcyB0byAgZWZmZWN0aXZlbHkgIGFjY2VzcwogICAgICAgIGludGVybmFsICBkYXRhICBmaWVsZHMuIEZvciAgZXhhbXBsZSwgIHRoaXMgIGNhbiBiZSAgZXh0cmVtZWx5CiAgICAgICAgdXNlZnVsIGlmICBzb21lb25lIHdhbnRzICB0byB3cml0ZSBhICBmb250IHByb2R1Y2VyIG9yICBhIGZvbnQKICAgICAgICBtYW5hZ2VyIG9uIHRvcCBvZiBGcmVlVHlwZS4KCiAgICBCYXNpY2FsbHksIHlvdSAgc2hvdWxkIG5vdyB1c2UgIHRoZSAnZnJlZXR5cGUvJyBwcmVmaXggIGZvciBoZWFkZXIKICAgIGluY2x1c2lvbiwgYXMgaW46CgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdGdseXBoLmg+CgogICAgU29tZSBuZXcgaW5jbHVkZSBzdWItZGlyZWN0b3JpZXMgYXJlIGF2YWlsYWJsZToKCiAgICAgYS4gdGhlICAiZnJlZXR5cGUvY29uZmlnIiBkaXJlY3RvcnksICBjb250YWlucyB0d28gZmlsZXMgIHVzZWQgdG8KICAgICAgICBjb25maWd1cmUgdGhlIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiBDbGllbnQgYXBwbGljYXRpb25zIHNob3VsZAogICAgICAgIG5vdCBuZWVkIHRvIGxvb2sgYXQgdGhlc2Ugbm9ybWFsbHksIGJ1dCB0aGV5IGNhbiBpZiB0aGV5IHdhbnQuCgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRvcHRpb24uaD4KICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg+CgogICAgIGIuIHRoZSAiZnJlZXR5cGUvaW50ZXJuYWwiICBkaXJlY3RvcnksIGNvbnRhaW5zIGhlYWRlciBmaWxlcyB0aGF0CiAgICAgICAgZGVzY3JpYmVzIGxpYnJhcnkgIGludGVybmFscy4gVGhlc2UgYXJlIHRoZSAgaGVhZGVyIGZpbGVzIHRoYXQKICAgICAgICB3ZXJlICBwcmV2aW91c2x5ICBmb3VuZCAgaW4gIHRoZSAic3JjL2Jhc2UiICBhbmQgICJzcmMvc2hhcmVkIgogICAgICAgIGRpcmVjdG9yaWVzLgoKCiAgICBBcyAgdXN1YWwsIHRoZSBidWlsZCAgc3lzdGVtIGFuZCAgdGhlIGRlbW9zICBoYXZlIGJlZW4gIHVwZGF0ZWQgdG8KICAgIHJlZmxlY3QgdGhlIGNoYW5nZS4uCgogICAgSGVyZSdzIGEgbGF5b3V0IG9mIHRoZSBuZXcgZGlyZWN0b3J5IGhpZXJhcmNoeToKCiAgICBUT1AKICAgICAgaW5jbHVkZS8KICAgICAgICAgZnJlZXR5cGUvCiAgICAgICAgICAgIGZyZWV0eXBlLmgKICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIGNvbmZpZy8KICAgICAgICAgICAgICBmdG9wdGlvbi5oCiAgICAgICAgICAgICAgZnRjb25maWcuaAogICAgICAgICAgICAgIGZ0bW9kdWxlLmgKCiAgICAgICAgICAgIGludGVybmFsLwogICAgICAgICAgICAgIGZ0b2Jqcy5oCiAgICAgICAgICAgICAgZnRzdHJlYW0uaAogICAgICAgICAgICAgIGZ0Y2FsYy5oCiAgICAgICAgICAgICAgLi4uCgogICAgICBzcmMvCiAgICAgICAgIGJhc2UvCiAgICAgICAgICAgIC4uLgoKICAgICAgICAgc2ZudC8KICAgICAgICAgcHNuYW1lcy8KICAgICAgICAgdHJ1ZXR5cGUvCiAgICAgICAgIHR5cGUxLwogICAgICAgICB0eXBlMXovCgoKICAgIENvbXBpbGluZyBhIG1vZHVsZSBpcyBub3cgIG11Y2ggZWFzaWVyLCBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwogICAgc2hvdWxkIHdvcmsgd2hlbiBpbiB0aGUgVE9QIGRpcmVjdG9yeSBvbiBhbiBBTlNJIGJ1aWxkOgoKICAgICAgIGdjYyAtYyAtSS4vaW5jbHVkZSAtSS4vc3JjL2Jhc2Ugc3JjL2Jhc2UvZnRiYXNlLmMKICAgICAgIGdjYyAtYyAtSS4vaW5jbHVkZSAtSS4vc3JjL3NmbnQgc3JjL3NmbnQvc2ZudC5jCiAgICAgICBldGMuLgoKICAgIChvZiBjb3Vyc2UsIHVzaW5nIC1JY29uZmlnLzxzeXN0ZW0+IGlmIHlvdSBwcm92aWRlIHN5c3RlbS1zcGVjaWZpYwogICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMpLgoKICAtIHVwZGF0ZWQgdGhlIHN0cnVjdHVyZSBvZiBGVF9PdXRsaW5lX0Z1bmNzIGluIG9yZGVyIHRvIGFsbG93IGRpcmVjdAogICAgY29vcmRpbmF0ZSBzY2FsaW5nIHdpdGhpbiAgdGhlIG91dGxpbmUgZGVjb21wb3NpdGlvbiByb3V0aW5lICh0aGlzCiAgICBpcyAgaW1wb3J0YW50IGZvciB2aXJ0dWFsICAib24iIHBvaW50cyAgd2l0aCBUcnVlVHlwZSAgb3V0bGluZXMpICsKICAgIHVwZGF0ZXMgdG8gdGhlIHJhc3RlcnMgdG8gc3VwcG9ydCB0aGlzLi4KCiAgLSB1cGRhdGVkICB0aGUgT1MvMiAgdGFibGUgIGxvYWRpbmcgY29kZSAgaW4gInNyYy9zZm50L3R0bG9hZC5jIiAgaW4KICAgIG9yZGVyIHRvIHN1cHBvcnQgdmVyc2lvbiAyIG9mIHRoZSB0YWJsZSAoc2VlIE9wZW5UeXBlIDEuMiBzcGVjKQoKICAtIGNyZWF0ZWQgICJpbmNsdWRlL3R0dGFibGVzLmgiICBhbmQgICJpbmNsdWRlL3QxdGFibGVzLmgiIHRvICBhbGxvdwogICAgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBhY2Nlc3Mgc29tZSBvZiAgdGhlIFNGTlQgYW5kIFQxIHRhYmxlcyBvZiBhCiAgICBmYWNlICB3aXRoICBhICBwcm9jZWR1cmFsICBpbnRlcmZhY2UgKHNlZSAgRlRfR2V0X1NmbnRfVGFibGUoKSkgICsKICAgIHVwZGF0ZXMgdG8gaW50ZXJuYWwgc291cmNlIGZpbGVzIHRvIHJlZmxlY3QgdGhlIGNoYW5nZS4uCgogIC0gc29tZSAgY2xlYW51cHMgaW4gIHRoZSBzb3VyY2UgIGNvZGUgdG8gIGdldCByaWQgIG9mICB3YXJuaW5ncyB3aGVuCiAgICBjb21waWxpbmcgd2l0aCB0aGUgIi1XYWxsIC1XIC1hbnNpIC1wZWRhbnRpYyIgb3B0aW9ucyBpbiBnY2MuCgogIC0gZGVidWdnZWQgYW5kIG1vdmVkIHRoZSBzbW9vdGggcmVuZGVyZXIgdG8gInNyYy9iYXNlL2Z0Z3JheXMuYyIgYW5kCiAgICBpdHMgaGVhZGVyIHRvICJpbmNsdWRlL2Z0Z3JheXMuaCIKCiAgLSB1cGRhdGVkIFRUX01BWF9TVUJHTFlQSFMgIHRvIDk2IGFzIHNvbWUgQ0pLICBmb250cyBoYXZlIGNvbXBvc2l0ZXMKICAgIHdpdGggdXAgdG8gODAgc3ViLWdseXBocyAhISBUaGFua3MgdG8gV2VybmVyCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgLSAxNC1hcHItMjAwMAoKICAtIGZpeGVkICBhIGJ1ZyAgaW4gIHRoZSAgVHJ1ZVR5cGUgZ2x5cGggIGxvYWRlciAgdGhhdCBwcmV2ZW50ZWQgIHRoZQogICAgY29ycmVjdCBsb2FkaW5nIG9mIHNvbWUgQ0pLIGdseXBocyBpbiBtaW5nbGkudHRmCgogIC0gaW1wcm92ZWQgdGhlIHN0YW5kYXJkIFR5cGUgMSBoaW50ZXIgaW4gInNyYy90eXBlMSIKCiAgLSBmaXhlZCB0d28gYnVncyAgaW4gdGhlIGV4cGVyaW1lbnRhbCBUeXBlIDEgIGRyaXZlciBpbiAic3JjL3R5cGUxeiIKICAgIHRvIGhhbmRsZSB0aGUgbmV3IFhGcmVlODYgNC4wIGZvbnRzIChhbmQgYSBmZXcgb3RoZXIgb25lcy4uKQoKICAtIHRoZSBzbW9vdGggIHJlbmRlcmVyIGlzIG5vdyAgY29tcGxldGUgYW5kIHN1cHBvcnRzICBzdWItYmFuZGluZyB0bwogICAgcmVuZGVyIGxhcmdlIGdseXBocyBhdCBoaWdoIHNwZWVkLiBIb3dldmVyLCBpdCBpcyBzdGlsbCBsb2NhdGVkIGluCiAgICAiZGVtb3Mvc3JjL2Z0Z3JheXMuYyIgYW5kIHNob3VsZCBtb3ZlIHRvIHRoZSBsaWJyYXJ5IGl0c2VsZiBpbiB0aGUKICAgIG5leHQgIGJldGEuLiAgIE5PVEU6ICBUaGUgIHNtb290aCAgcmVuZGVyZXIgICBkb2Vzbid0ICBjb21waWxlICBpbgogICAgc3RhbmQtYWxvbmUgbW9kZSBhbnltb3JlLCBidXQgdGhpcyBzaG91bGQgYmUgZml4ZWQgUlNOLi4KCiAgLSBpbnRyb2R1Y2VkIGNvbnZlbmllbmNlICBmdW5jdGlvbnMgdG8gIG1vcmUgZWFzaWx5IGRlYWwgIHdpdGggZ2x5cGgKICAgIGltYWdlcywgc2VlICAiaW5jbHVkZS9mdGdseXBoLmgiIGZvciBtb3JlIGRldGFpbHMsIGFzICB3ZWxsIGFzIHRoZQogICAgbmV3ICBkZW1vIHByb2dyYW0gIG5hbWVkICJkZW1vcy9zcmMvZnRzdHJpbmcuYyIgIHRoYXQgZGVtb25zdHJhdGVzCiAgICBpdHMgdXNlCgogIC0gaW1wbGVtZW50ZWQgIEZUX0xPQURfTk9fUkVDVVJTRSBpbiAgYm90aCB0aGUgIFRydWVUeXBlIGFuZCAgVHlwZSAxCiAgICBkcml2ZXJzICAodGhpcyAgaXMgcmVxdWlyZWQgIGJ5ICB0aGUgIGF1dG8taGludGVyICB0byBpbXByb3ZlICBpdHMKICAgIHJlc3VsdHMpLgoKICAtIGNoYW5nZWQgICB0aGUgIHJhc3RlciAgIGludGVyZmFjZSwgIGluICAgb3JkZXIgIHRvICAgYWxsb3cgIGNsaWVudAogICAgYXBwbGljYXRpb25zIHRvIHByb3ZpZGUgdGhlaXIgb3duIHNwYW4tZHJhd2luZyBjYWxsYmFja3MuIEhvd2V2ZXIsCiAgICBvbmx5IHRoZSBzbW9vdGggcmVuZGVyZXIgIHN1cHBvcnRzIHRoaXMuIFNlZSAiRlRfUmFzdGVyX1BhcmFtcyIgaW4KICAgIHRoZSBmaWxlICJpbmNsdWRlL2Z0aW1hZ2UuaCIKCiAgLSBmaXhlZCAgYSBzbWFsbCBidWcgIGluIEZUX011bEZpeCAgdGhhdCBjYXVzZWQgIGluY29ycmVjdCB0cmFuc2Zvcm0KICAgIGNvbXB1dGF0aW9uIQoKICAtIE5vdGU6IFRoZSB0dXRvcmlhbCBpcyBvdXQtb2YtZGF0ZSwgZ3J1bXBmLi4gOi0oCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgLSAxMi1tYXItMjAwMAoKICAtIGNoYW5nZWQgIHRoZSAgbGF5b3V0ICBvZiAgY29uZmlndXJhdGlvbiAgZmlsZXMgIDogIG5vdywgIGFsbCAgQU5TSQogICAgY29uZmlndXJhdGlvbiAgICAgICAgIGZpbGVzICAgICAgICAgYXJlICAgICAgICAgbG9jYXRlZCAgICAgICAgIGluCiAgICAiZnJlZXR5cGUyL2NvbmZpZyIuICBTeXN0ZW0tc3BlY2lmaWMgb3Zlci1yaWRlcyAgY2FuIGJlICBwbGFjZWQgaW4KICAgICJmcmVldHlwZTIvY29uZmlnLzxzeXN0ZW0+Ii4KCiAgLSBtb3ZlZCBhbGwgY29uZmlndXJhdGlvbiBtYWNyb3MgdG8gImNvbmZpZy9mdG9wdGlvbi5oIgoKICAtIGltcHJvdmVtZW50cyBpbiB0aGUgVHlwZSAxIGRyaXZlciB3aXRoIEFGTSBzdXBwb3J0CgogIC0gY2hhbmdlZCB0aGUgZmllbGRzICBpbiB0aGUgRlRfT3V0bGluZSBzdHJ1Y3R1cmUgOiAgdGhlIG9sZCAiZmxhZ3MiCiAgICBhcnJheSBpcyByZS1uYW1lZCAidGFncyIsIHdoaWxlIGFsbCBhbmNpZW50IGZsYWdzIGFyZSBlbmNvZGVkIGludG8KICAgIGEgc2luZ2xlIHVuc2lnbmVkIGludCBuYW1lZCAiZmxhZ3MiLgoKICAtIGludHJvZHVjZWQgICAgIG5ldyAgICAgIGZsYWdzICAgICBpbiAgICAgRlRfT3V0bGluZS5mbGFncyAgICAgKHNlZQogICAgZnRfb3V0bGluZV8uLi4uIGVudW1zIGluICJmdGltYWdlLmgiKS4KCiAgLSBjaGFuZ2VkIG91dGxpbmUgZnVuY3Rpb25zIHRvICJGVF9PdXRsaW5lXzxhY3Rpb24+IiBzeW50YXgKCiAgLSBhZGRlZCBhIHNtb290aCBhbnRpLWFsaWFzIHJlbmRlcmVyIHRvIHRoZSBkZW1vbnN0cmF0aW9uIHByb2dyYW1zCgogIC0gYWRkZWQgTWFjIGdyYXBoaWNzIGRyaXZlciAodGhhbmtzIEp1c3QpCgogIC0gRlRfT3Blbl9GYWNlICBjaGFuZ2VkICBpbiAgb3JkZXIgICB0byAgcmVjZWl2ZWQgIGEgIHBvaW50ZXIgIHRvICBhCiAgICBGVF9PcGVuX0FyZ3MgZGVzY3JpcHRvci4uCgogIC0gdmFyaW91cyAgY2xlYW51cHMsICBhICBmZXcgIG1vcmUgQVBJICBmdW5jdGlvbnMgIGltcGxlbWVudGVkICAoc2VlCiAgICBGVF9BdHRhY2hfRmlsZSkKCiAgLSB1cGRhdGVkIHNvbWUgZG9jcwoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBDSEFOR0VTIC0gMjItZmViLTIwMDAKCiAgLSBpbnRyb2R1Y2VkIHRoZSAicHNuYW1lcyIgbW9kdWxlLiBJdCBpcyB1c2VkIHRvOgoKICAgICAgbyBjb252ZXJ0ICBhIFBvc3RzY3JpcHQgZ2x5cGggIG5hbWUgaW50byB0aGUgIGVxdWl2YWxlbnQgVW5pY29kZQogICAgICAgIGNoYXJhY3RlciBjb2RlICh1c2VkIGJ5IHRoZSAgVHlwZSAxIGRyaXZlcihzKSB0byBzeW50aGV0aXplIG9uCiAgICAgICAgdGhlIGZseSBhIFVuaWNvZGUgY2hhcm1hcCkuCgogICAgICBvIHByb3ZpZGUgYW4gIGludGVyZmFjZSB0byByZXRyaWV2ZSB0aGUgUG9zdHNjcmlwdCAgbmFtZXMgb2YgdGhlCiAgICAgICAgTWFjaW50b3NoLCAgQWRvYmUgIFN0YW5kYXJkICYgIEFkb2JlICBFeHBlcnQgY2hhcmFjdGVyICBjb2Rlcy4KICAgICAgICAodGhlIE1hY2ludG9zaCAgbmFtZXMgYXJlICB1c2VkIGJ5IHRoZSAgU0ZOVC1tb2R1bGUgcG9zdHNjcmlwdAogICAgICAgIG5hbWVzIHN1cHBvcnQgcm91dGluZXMsIHdoaWxlIHRoZSBvdGhlciB0d28gdGFibGVzIGFyZSB1c2VkIGJ5CiAgICAgICAgdGhlIFR5cGUgMSBkcml2ZXIocykpLgoKICAtIGludHJvZHVjZWQgdGhlICJ0eXBlMXoiIGFsdGVybmF0ZSBUeXBlICAxIGRyaXZlci4gVGhpcyBpcyBhIChzdGlsbAogICAgZXhwZXJpbWVudGFsKSBkcml2ZXIgIGZvciB0aGUgVHlwZSAgMSBmb3JtYXQgdGhhdCAgd2lsbCB1bHRpbWF0ZWx5CiAgICByZXBsYWNlIHRoZSBvbmUgIGluICJzcmMvdHlwZTEiLiBJdCB1c2VzIHBhdHRlcm4gIG1hdGNoaW5nIHRvIGxvYWQKICAgIGRhdGEgZnJvbSB0aGUgIGZvbnQsIGluc3RlYWQgb2YgYSBmaW5pdGUgIHN0YXRlIGFuYWx5emVyLiBJdCB3b3JrcwogICAgbXVjaCBiZXR0ZXIgdGhhbiB0aGUgIm9sZCIgIGRyaXZlciB3aXRoICJicm9rZW4iIGZvbnRzLiBJdCBpcyBhbHNvCiAgICBtdWNoIHNtYWxsZXIgKHVuZGVyIDE1IEtiKS4KCiAgLSB0aGUgIFR5cGUgMSAgZHJpdmVycyAoYm90aCAgaW4gInNyYy90eXBlMSIgIGFuZCAgInNyYy90eXBlMXoiKSBhcmUKICAgIG5lYXJseSAgY29tcGxldGUuICBUaGV5ICBib3RoICBwcm92aWRlIGF1dG9tYXRpYyAgVW5pY29kZSAgY2hhcm1hcAogICAgc3ludGhlc2lzIHRocm91Z2ggIHRoZSAicHNuYW1lcyIgbW9kdWxlLiBObyAgcmUtZW5jb2RpbmcgdmVjdG9yIGlzCiAgICBuZWVkZWQuICAobm90ZSAgdGhhdCB0aGV5ICBzdGlsbCAgbGVhayAgbWVtb3J5ICBkdWUgdG8gIHNvbWUgIGNvZGUKICAgIG1pc3NpbmcsIGFuZCBJJ20gZ2V0dGluZyBsYXp5KS4KCiAgICBUcml2aWFsIEFGTSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIHRvIHJlYWQga2VybmluZyBpbmZvcm1hdGlvbiBidXQKICAgIHdhc24ndCBleGFjdGx5IHRlc3RlZCBhcyBpdCBzaG91bGQgOy0pCgogIC0gVGhlIFRydWVUeXBlICBnbHlwaCBsb2FkZXIgaGFzICBiZWVuIHNlcmlvdXNseSByZXdyaXR0ZW4gIChzZWUgdGhlCiAgICBmaWxlICAic3JjL3RydWV0eXBlL3R0Z2xvYWQuYyIuIEl0ICBpcyBub3cgIG11Y2gsIG11Y2ggIHNpbXBsZXIgYXMKICAgIHdlbGwgYXMgIGVhc2llciB0byByZWFkLCAgbWFpbnRhaW4gYW5kIHVuZGVyc3RhbmQgIDotKSBQcmVsaW1pbmFyeQogICAgdmVyc2lvbnMgaW50cm9kdWNlZCBhICBtZW1vcnkgbGVhayB0aGF0IGhhcyBiZWVuICByZXBvcnRlZCBieSBKYWNrCiAgICBEYXZpcywgYW5kIGlzIG5vdyBmaXhlZC4uCgogIC0gaW50cm9kdWNlZCAgdGhlIG5ldyAgImZ0X2dseXBoX2Zvcm1hdF9wbG90dGVyIiwgdXNlZCAgdG8gcmVwcmVzZW50CiAgICBzdHJva2VkIG91dGxpbmVzICBsaWtlIFdpbmRvd3MgIlZlY3RvciIgZm9udHMsIGFuZCAgY2VydGFpbiBUeXBlIDEKICAgIGZvbnRzICBsaWtlICJIZXJzaGV5Ii4gIFRoZSBjb3JyZXNwb25kaW5nICByYXN0ZXIgd2lsbCAgYmUgd3JpdHRlbgogICAgc29vbi4KCiAgLSBGVF9OZXdfTWVtb3J5X0ZhY2UgIGlzICBnb25lLiAgTGlrZXdpc2UsICBGVF9PcGVuX0ZhY2UgaGFzICBhICBuZXcKICAgIGludGVyZmFjZSB0aGF0IHVzZXMgYSBzdHJ1Y3R1cmUgIHRvIGRlc2NyaWJlIHRoZSBpbnB1dCBzdHJlYW0sIHRoZQogICAgZHJpdmVyIChpZiByZXF1aXJlZCksIGV0Yy4uCgoKVE9ETwoKICAtIFdyaXRlIEZUX0dldF9HbHlwaF9CaXRtYXAgYW5kIEZUX0xvYWRfR2x5cGhfQml0bWFwCgogIC0gQWRkIGEgZnVuY3Rpb24gbGlrZSBGVF9Mb2FkX0NoYXJhY3RlciggZmFjZSwgY2hhcl9jb2RlLCBsb2FkX2ZsYWdzCiAgICApICB0aGF0ICB3b3VsZCByZWFsbHkgIGVtYmJlZCAgYSAgY2FsbCAgdG8gRlRfR2V0X0NoYXJfSW5kZXggIHRoZW4KICAgIEZUX0xvYWRfR2x5cGggdG8gZWFzZSBkZXZlbG9wZXIncyB3b3JrLgoKICAtIFVwZGF0ZSB0aGUgdHV0b3JpYWwhCgogIC0gY29uc2lkZXIgYWRkaW5nICBzdXBwb3J0IGZvciBNdWx0aXBsZSAgTWFzdGVyIGZvbnRzIGluIHRoZSAgVHlwZSAxCiAgICBkcml2ZXJzLgoKICAtIFRlc3QgdGhlIEFGTSByb3V0aW5lcyBvZiB0aGUgIFR5cGUgMSBkcml2ZXJzIHRvIGNoZWNrIHRoYXQga2VybmluZwogICAgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgY29ycmVjdGx5LgoKICAtIHdyaXRlIGEgZGVjZW50IGF1dG8tZ3JpZGRpbmcgY29tcG9uZW50ICAhISBXZSBuZWVkIHRoaXMgdG8gcmVsZWFzZQogICAgRnJlZVR5cGUgMi4wIGdvbGQgIQoKCmxlc3MgdXJnZW50IG5lZWRzOgoKICAtIGFkZCBhIENGRi9UeXBlMiBkcml2ZXIKICAtIGFkZCBhIEJERiBkcml2ZXIKICAtIGFkZCBhIEZOVC9QQ0YvSEJGIGRyaXZlcgogIC0gYWRkIGEgU3BlZWRvIGRyaXZlciBmcm9tIHRoZSBYMTEgc291cmNlcwoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MREVSIENIQU5HRVMgLSAyNy1qYW4tMjAwMAoKICAtIHVwZGF0ZWQgdGhlICAic2ZudCIgbW9kdWxlICBpbnRlcmZhY2UgdG8gYWxsb3cgIHNldmVyYWwgU0ZOVC1iYXNlZAogICAgZHJpdmVycyB0byBjby1leGlzdCBwZWFjZWZ1bGx5CgogIC0gdXBkYXRlZCAgdGhlICJUMV9GYWNlIiAgdHlwZSAgdG8gYmV0dGVyICBzZXBhcmF0ZSBQb3N0c2NyaXB0ICBmb250CiAgICBjb250ZW50ICBmcm9tIHRoZSAgcmVzdCBvZiAgdGhlIEZUX0ZhY2UgIHN0cnVjdHVyZS4gTWlnaHQgIGJlIHVzZWQKICAgIGxhdGVyIGJ5IHRoZSBDRkYvVHlwZTIgZHJpdmVyLi4KCiAgLSBhZGRlZCBhbiBleHBlcmltZW50YWwgcmVwbGFjZW1lbnQgVHlwZSAxIGRyaXZlciBmZWF0dXJpbmcgYWR2YW5jZWQKICAgIChhbmQgc3BlZWR5KSBwYXR0ZXJuIG1hdGNoaW5nIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gcG9zdHNjcmlwdAogICAgZm9udHMuCgogIC0gdmVyeSBtaW5vciAgY2hhbmdlcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gIG9mIEZUX1NldF9DaGFyX1NpemUgYW5kCiAgICBGVF9TZXRfUGl4ZWxfU2l6ZXMgKHRoZXkgbm93IGltcGxlbWVudCBkZWZhdWx0IHRvIGxpZ3RoZW4gdGhlIGZvbnQKICAgIGRyaXZlcidzIGNvZGUpLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBNRVNTQUdFCgpUaGlzIGZpbGUgc3VtbWFyaXplcyB0aGUgY2hhbmdlcyB0aGF0IG9jY3VyZWQgc2luY2UgdGhlIGxhc3QgImJldGEiIG9mCkZyZWVUeXBlIDIuICBCZWNhdXNlICB0aGUgbGlzdCBpcyBpbXBvcnRhbnQsIGl0ICBoYXMgYmVlbiBkaXZpZGVkIGludG8Kc2VwYXJhdGUgc2VjdGlvbnM6CgpUYWJsZSBPZiBDb250ZW50czoKCiAgICBJICAgSGlnaC1MZXZlbCBJbnRlcmZhY2UgKGVhc2llciAhKQogICBJSSAgIERpcmVjdG9yeSBTdHJ1Y3R1cmUKICBJSUkgICBHbHlwaCBJbWFnZSBGb3JtYXRzCiAgIElWICAgQnVpbGQgU3lzdGVtCiAgICBWICAgUG9ydGFiaWxpdHkKICAgVkkgICBGb250IERyaXZlcnMKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpIaWdoLUxldmVsIEludGVyZmFjZToKCiAgVGhlIGhpZ2gtbGV2ZWwgQVBJIGhhcyBiZWVuIGNvbnNpZGVyYWJseSBzaW1wbGlmaWVkLiAgSGVyZSBpcyBob3c6CgogICAgLSByZXNvdXJjZSBvYmplY3RzIGhhdmUgZGlzYXBwZWFyZWQuICB0aGlzIG1lYW5zIHRoYXQgZmFjZSBvYmplY3RzCiAgICAgIGNhbiBub3cgYmUgY3JlYXRlZCB3aXRoICBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsIChzZWUgRlRfTmV3X0ZhY2UKICAgICAgYW5kIEZUX09wZW5fRmFjZSkKCiAgICAtIHdoZW4gY2FsbGluZyAgZWl0aGVyIEZUX05ld19GYWNlICAmIEZUX09wZW5fRmFjZSwgYSAgc2l6ZSBvYmplY3QKICAgICAgYW5kIGEgZ2x5cGggc2xvdCBvYmplY3QgIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIHRoZSBmYWNlLAogICAgICBhbmQgY2FuICBiZSBhY2Nlc3NlZCAgdGhyb3VnaCAiZmFjZS0+Z2x5cGgiIGFuZCAgImZhY2UtPnNpemUiIGlmCiAgICAgIG9uZSByZWFsbHkgIG5lZWRzIHRvLiAgIEluIG1vc3QgY2FzZXMsICB0aGVyZSdzIG5vIG5lZWQgIHRvIGNhbGwKICAgICAgRlRfTmV3X1NpemUgb3IgRlRfTmV3X0dseXBoLgoKICAgIC0gc2ltaWxhcmx5LCAgRlRfTG9hZF9HbHlwaCAgbm93ICBvbmx5ICB0YWtlcyAgYSAgImZhY2UiICBhcmd1bWVudAogICAgICAoaW5zdGVhZCAgb2YgYSAgZ2x5cGggIHNsb3QgIGFuZCBhICBzaXplKS4gIEFsc28sIGl0J3MgICJyZXN1bHQiCiAgICAgIHBhcmFtZXRlciBpcyAgZ29uZSwgYXMgdGhlIGdseXBoICBpbWFnZSB0eXBlIGlzICByZXR1cm5lZCBpbiB0aGUKICAgICAgZmllbGQgImZhY2UtPmdseXBoLmZvcm1hdCIKCiAgICAtIHRoZSBsaXN0ICBvZiBhdmFpbGFibGUgIGNoYXJtYXBzIGlzIGRpcmVjdGx5ICBhY2Nlc3NpYmxlIHRocm91Z2gKICAgICAgImZhY2UtPmNoYXJtYXBzIiwgIGNvdW50aW5nICJmYWNlLT5udW1fY2hhcm1hcHMiICBlbGVtZW50cy4gRWFjaAogICAgICBjaGFybWFwICBoYXMgYW4gICdlbmNvZGluZycgIGZpZWxkIHdoaWNoICBzcGVjaWZpZXMgd2hpY2ggIGtub3duCiAgICAgIGVuY29kaW5nIGl0IGRlYWxzIHdpdGguIFZhbGlkIHZhbHVlcyBhcmUsIGZvciBleGFtcGxlIDoKCiAgICAgICAgICBmdF9lbmNvZGluZ191bmljb2RlICAgICAgKGZvciBBU0NJSSwgTGF0aW4tMSBhbmQgVW5pY29kZSkKICAgICAgICAgIGZ0X2VuY29kaW5nX2FwcGxlX3JvbWFuCiAgICAgICAgICBmdF9lbmNvZGluZ19zamlzCiAgICAgICAgICBmdF9lbmNvZGluZ19hZG9iZV9zdGFuZGFyZAogICAgICAgICAgZnRfZW5jb2RpbmdfYWRvYmVfZXhwZXJ0CgogICAgICBvdGhlciAgdmFsdWVzIG1heSAgYmUgYWRkZWQgIGluIHRoZSAgZnV0dXJlLiBFYWNoICBjaGFybWFwIHN0aWxsCiAgICAgIGhvbGRzICBpdHMgInBsYXRmb3JtX2lkIiAgYW5kICJlbmNvZGluZ19pZCIgIHZhbHVlcyBpbiAgY2FzZSB0aGUKICAgICAgZW5jb2RpbmcgaXMgdG9vIGV4b3RpYyBmb3IgdGhlIGN1cnJlbnQgbGlicmFyeQoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkRpcmVjdG9yeSBTdHJ1Y3R1cmU6CgogIFNob3VsZCBzZWVtIG9idmlvdXMgdG8gbW9zdCBvZiB5b3U6CgogICAgIGZyZWV0eXBlLwogICAgICAgICBjb25maWcvICAgICAgICAtLSBjb25maWd1cmF0aW9uIHN1Yi1tYWtlZmlsZXMKICAgICAgICAgICAgYW5zaS8KICAgICAgICAgICAgdW5peC8gICAgICAgLS0gcGxhdGZvcm0tc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlcwogICAgICAgICAgICB3aW4zMi8KICAgICAgICAgICAgb3MyLwogICAgICAgICAgICBtc2Rvcy8KCiAgICAgICAgIGluY2x1ZGUvICAgICAgIC0tIHB1YmxpYyBoZWFkZXIgIGZpbGVzLCB0aG9zZSB0byAgYmUgaW5jbHVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgYnkgY2xpZW50IGFwcHMKCiAgICAgICAgIHNyYy8gICAgICAgICAgIC0tIHNvdXJjZXMgb2YgdGhlIGxpYnJhcnkKICAgICAgICAgICBiYXNlLyAgICAgICAgLS0gdGhlIGJhc2UgbGF5ZXIKICAgICAgICAgICBzZm50LyAgICAgICAgLS0gdGhlIHNmbnQgImRyaXZlciIgIChzZWUgdGhlIGRyaXZlcnMgc2VjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdykKICAgICAgICAgICB0cnVldHlwZS8gICAgLS0gdGhlIHRydWV0eXBlIGRyaXZlcgogICAgICAgICAgIHR5cGUxLyAgICAgICAtLSB0aGUgdHlwZTEgZHJpdmVyCiAgICAgICAgICAgc2hhcmVkLyAgICAgIC0tIHNvbWUgaGVhZGVyIGZpbGVzIHNoYXJlZCBiZXR3ZWVuIGRyaXZlcnMKCiAgICAgICAgIGRlbW9zLyAgICAgICAgIC0tIGRlbW9zL3Rvb2xzCgogICAgICAgICBkb2NzLyAgICAgICAgICAtLSBkb2N1bWVudGF0aW9uIChhIGJpdCBlbXB0eSBmb3Igbm93KQoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkdseXBoIEltYWdlIEZvcm1hdHM6CgogIERyaXZlcnMgYXJlIG5vdyBhYmxlIHRvICByZWdpc3RlciBuZXcgZ2x5cGggaW1hZ2UgZm9ybWF0cyB3aXRoaW4gdGhlCiAgbGlicmFyeS4gIEZvciAgbm93LCB0aGUgIGJhc2UgbGF5ZXIgc3VwcG9ydHMgIG9mIGNvdXJzZSAgYml0bWFwcyBhbmQKICB2ZWN0b3IgIG91dGxpbmVzLCBidXQgIG9uZSAgY291bGQgaW1hZ2luZSAgc29tZXRoaW5nIGRpZmZlcmVudCAgbGlrZQogIGNvbG9yZWQgYml0bWFwcywgYmktY29sb3IgdmVjdG9ycyBvciB3YXRoZXZlciBlbHNlIChNZXRhZm9udHMgYW55b25lCiAgPz8pLgoKICBTZWUgIHRoZSAgIGZpbGUgIGBpbmNsdWRlL2Z0aW1hZ2UuaCcuICAgTm90ZSAgYWxzbyAgdGhhdCAgIHRoZSAgdHlwZQogIEZUX1Jhc3Rlcl9NYXAgIGlzIGdvbmUsICBhbmQgIGlzIG5vdyAgcmVwbGFjZWQgIGJ5IEZUX0JpdG1hcCwgIHdoaWNoCiAgc2hvdWxkIGVuY29tcGFzcyBhbGwga25vd24gYml0bWFwIHR5cGVzLgoKICBFYWNoIG5ldyAgaW1hZ2UgZm9ybWF0ICBtdXN0IHByb3ZpZGUgYXQgIGxlYXN0IG9uZSAicmFzdGVyIiwgIGkuZS4gYQogIG1vZHVsZSBjYXBhYmxlIG9mICB0cmFuc2Zvcm1pbmcgdGhlIGdseXBoIGltYWdlIGludG8gIGEgYml0bWFwLiBJdCdzCiAgYWxzbyBwb3NzaWJsZSAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0ICByYXN0ZXIgdXNlZCBmb3IgIGEgZ2l2ZW4gZ2x5cGgKICBpbWFnZSBmb3JtYXQuCgogIFRoZSBkZWZhdWx0IG91dGxpbmUgIHNjYW4tY29udmVydGVyIG5vdyB1c2VzIDEyOCBsZXZlbHMgIG9mIGdyYXlzIGJ5CiAgZGVmYXVsdCwgIHdoaWNoIHRlbmRzICB0byBzbW9vdGggIG1hbnkgIHRoaW5ncy4gTm90ZSAgdGhhdCB0aGUgIGRlbW8KICBwcm9ncmFtcyBoYXZlIGJlZW4gdXBkYXRlZCBzaWduaWZpY2FudGx5IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlc2UuLgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkJ1aWxkIHN5c3RlbToKCiAgWW91IHN0aWxsIG5lZWQgIEdOVSBNYWtlIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiAgVGhlIGJ1aWxkIHN5c3RlbSBoYXMKICBiZWVuIHZlcnkgc2VyaW91c2x5IHJlLXZhbXBlZCBpbiBvcmRlciB0byBwcm92aWRlIHRoaW5ncyBsaWtlIDoKCiAgIC0gYXV0b21hdGljIGhvc3QgcGxhdGZvcm0gIGRldGVjdGlvbiAocmV2ZXJ0aW5nIHRvICdjb25maWcvYW5zaScgaWYKICAgICBpdCBpcyBub3QgZGV0ZWN0ZWQsIHdpdGggcHNldWRvLXN0YW5kYXJkIGNvbXBpbGF0aW9uIGZsYWdzKQoKICAgLSB0aGUgYWJpbGl0eSB0byBjb21waWxlIGZyb20gdGhlIE1ha2VmaWxlcyB3aXRoIHZlcnkgZGlmZmVyZW50IGFuZAogICAgIGV4b3RpYyBjb21waWxlcnMuIE5vdGUgdGhhdCAgbGlua2luZyB0aGUgbGlicmFyeSBjYW4gYmUgZGlmZmljdWx0CiAgICAgZm9yIHNvbWUgcGxhdGZvcm1zLgoKICAgICBGb3IgZXhhbXBsZSwgdGhlIGZpbGUgYGNvbmZpZy93aW4zMi9sY2NsaWIuYmF0JyBpcyBpbnZva2VkIGJ5IHRoZQogICAgIGJ1aWxkIHN5c3RlbSB0byBjcmVhdGUgdGhlICIubGliIiBmaWxlIHdpdGggTENDLVdpbjMyIGJlY2F1c2UgaXRzCiAgICAgbGlicmFyaWFuICBoYXMgdG9vICBtYW55IGZsYXdzICB0byBiZSAgaW52b2tlZCBkaXJlY3RseSAgZnJvbSB0aGUKICAgICBNYWtlZmlsZS4KCiAgSGVyZSdzIGhvdyBpdCB3b3JrczoKCiAgLSB0aGUgZmlyc3QgdGltZSB5b3UgdHlwZSBgbWFrZScsICB0aGUgYnVpbGQgc3lzdGVtIHJ1bnMgYSBzZXJpZXMgb2YKICAgIHN1Yi1tYWtlZmlsZXMgaW4gb3JkZXIgdG8gZGV0ZWN0IHlvdXIgaG9zdCBwbGF0Zm9ybS4gSXQgdGhlbiBkdW1wcwogICAgd2hhdCAgaXQgZm91bmQsICBhbmQgIGNyZWF0ZXMgIGEgZmlsZSAgY2FsbGVkICBgY29uZmlnLm1rJyBpbiAgdGhlCiAgICBjdXJyZW50ICBkaXJlY3RvcnkuIFRoaXMgIGlzIGEgIHN1Yi1NYWtlZmlsZSB1c2VkICB0byAgZGVmaW5lIG1hbnkKICAgIGltcG9ydGFudCBNYWtlIHZhcmlhYmxlcyB1c2VkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgoKICAtIHRoZSBzZWNvbmQgdGltZSwgdGhlIGJ1aWxkIHN5c3RlbSBkZXRlY3RzIHRoZSBgY29uZmlnLm1rJyB0aGVuIHVzZQogICAgaXQgIHRvICBidWlsZCB0aGUgIGxpYnJhcnkuICBBbGwgb2JqZWN0ICBmaWxlcyAgZ28gIGludG8gJ29iaicgIGJ5CiAgICBkZWZhdWx0LCAgYXMgd2VsbCAgYXMgdGhlICBsaWJyYXJ5IGZpbGUsICBidXQgdGhpcyAgY2FuICBlYXNpbHkgYmUKICAgIGNoYW5nZWQuCgogIE5vdGUgdGhhdCAgeW91IGNhbiBydW4gIm1ha2UgIHNldHVwIiB0byBmb3JjZSAgYW5vdGhlciBob3N0IHBsYXRmb3JtCiAgZGV0ZWN0aW9uICBldmVuICAgaWYgIGEgIGBjb25maWcubWsnICBpcyAgcHJlc2VudCAgIGluICB0aGUgIGN1cnJlbnQKICBkaXJlY3RvcnkuICBBbm90aGVyIHNvbHV0aW9uICBpcyAgc2ltcGx5IHRvICBkZWxldGUgIHRoZSBmaWxlLCAgdGhlbgogIHJlLXJ1biBtYWtlLgoKICBGaW5hbGx5LCB0aGUgIGRlZmF1bHQgY29tcGlsZXIgIGZvciBhbGwgcGxhdGZvcm1zICBpcyBnY2MgIChmb3Igbm93LAogIHRoaXMgd2lsbCBob3BlZnVsbHkgY2hhbmdlZCBpbiAgdGhlIGZ1dHVyZSkuIFlvdSBjYW4gaG93ZXZlciBzcGVjaWZ5CiAgYSBkaWZmZXJlbnQgIGNvbXBpbGVyIGJ5IHNwZWNpZnlpbmcgIGl0IGFmdGVyIHRoZSAnc2V0dXAnICB0YXJnZXQgYXMKICBpbjoKCiAgICAgIGdudW1ha2Ugc2V0dXAgbGNjICAgICAgICAgb24gV2luMzIgdG8gdXNlIHRoZSBMQ0MgY29tcGlsZXIKICAgICAgZ251bWFrZSBzZXR1cCB2aXN1YWxjICAgICBvbiBXaW4zMiB0byB1c2UgVmlzdWFsIEMrKwoKICBTZWUgIHRoZSBmaWxlICBgY29uZmlnLzxzeXN0ZW0+L2RldGVjdC5taycgZm9yICBhIGxpc3QgIG9mIHN1cHBvcnRlZAogIGNvbXBpbGVycyBmb3IgeW91ciBwbGF0Zm9ybXMuCgogIEl0IHNob3VsZCBiZSByZWxhdGl2ZWx5IGVhc3kgIHRvIHdyaXRlIG5ldyBkZXRlY3Rpb24gcnVsZXMgZmlsZXMgYW5kCiAgY29uZmlnLm1rLi4KCiAgRmluYWxseSwgdG8gIGJ1aWxkIHRoZSBkZW1vIHByb2dyYW1zLCAgZ28gdG8gYGRlbW9zJyAgYW5kIGxhdW5jaCBHTlUKICBNYWtlLCBpdCB3aWxsIHVzZSB0aGUgYGNvbmZpZy5taycgIGluIHRoZSB0b3AgZGlyZWN0b3J5IHRvIGJ1aWxkIHRoZQogIHRlc3QgcHJvZ3JhbXMuLgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClBvcnRhYmlsaXR5OgoKICBJbiAgdGhlICBwcmV2aW91cyAgYmV0YSwgIGEgIHNpbmdsZSBGVF9TeXN0ZW0gIG9iamVjdCAgd2FzICB1c2VkICB0bwogIGVuY29tcGFzcyAgYWxsICBsb3ctbGV2ZWwgIG9wZXJhdGlvbnMgbGlrZSAgdGhyZWFkICBzeW5jaHJvbmlzYXRpb24sCiAgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGkvbyBhY2Nlc3MuIFRoaXMgaGFzIGJlZW4gZ3JlYXRseSBzaW1wbGlmaWVkOgoKICAgIC0gdGhyZWFkIHN5bmNocm9uaXNhdGlvbiAgaGFzIGJlZW4gZHJvcHBlZCwgZm9yICB0aGUgc2ltcGxlIHJlYXNvbgogICAgICB0aGF0IHRoZSBsaWJyYXJ5ICBpcyBhbHJlYWR5IHJlLWVudHJhbnQsIGFuZCB0aGF0ICBpZiB5b3UgcmVhbGx5CiAgICAgIG5lZWQgIHR3byAgdGhyZWFkcyBhY2Nlc3NpbmcgIHRoZSAgc2FtZSAgRlRfTGlicmFyeSwgeW91ICBzaG91bGQKICAgICAgcmVhbGx5IHN5bmNocm9uaXplIGFjY2VzcyB0byBpdCB5b3Vyc2VsZiB3aXRoIGEgc2ltcGxlIG11dGV4LgoKICAgIC0gbWVtb3J5ICBtYW5hZ2VtZW50IGlzICBwZXJmb3JtZWQgIHRocm91Z2ggYSAgdmVyeSBzaW1wbGUgIG9iamVjdAogICAgICBjYWxsZWQgIkZUX01lbW9yeSIsICB3aGljaCByZWFsbHkgaXMgYSB0YWJsZSAgY29udGFpbmluZyBhIHRhYmxlCiAgICAgIG9mIHBvaW50ZXJzIHRvICBmdW5jdGlvbnMgbGlrZSBtYWxsb2MsIHJlYWxsb2MgYW5kICBmcmVlIGFzIHdlbGwKICAgICAgYXMgc29tZSB1c2VyIGRhdGEgKGNsb3N1cmUpLgoKICAgIC0gcmVzb3VyY2VzIGhhdmUgZGlzYXBwZWFyZWQgKHRoZXkgY3JlYXRlZCBtb3JlIHByb2JsZW1zIHRoYW4gdGhleQogICAgICBzb2x2ZWQpLCBhbmQgIGkvbyBtYW5hZ2VtZW50IGhhdmUgIGJlZW4gc2ltcGxpZmllZCBncmVhdGx5ICBhcyBhCiAgICAgIHJlc3VsdC4gU3RyZWFtcyBhcmUgZGVmaW5lZCB0aHJvdWdoIEZUX1N0cmVhbSBvYmplY3RzLCB3aGljaCBjYW4KICAgICAgYmUgZWl0aGVyIG1lbW9yeS1iYXNlZCBvciBkaXNrLWJhc2VkLgoKICAgICAgTm90ZSB0aGF0ICBlYWNoIGZhY2UgIGhhcyBpdHMgb3duICBzdHJlYW0sIHdoaWNoIGlzICBjbG9zZWQgb25seQogICAgICB3aGVuICB0aGUgIGZhY2Ugb2JqZWN0ICBpcyAgZGVzdHJveWVkLiAgSGVuY2UsICBhIGZ1bmN0aW9uICBsaWtlCiAgICAgIFRUX0ZsdXNoX0ZhY2UgaW4gIDEueCBjYW5ub3QgYmUgZGlyZWN0bHkgIHN1cHBvcnRlZC4gSG93ZXZlciwgaWYKICAgICAgeW91IHJlYWxseSBuZWVkIHNvbWV0aGluZyBsaWtlICB0aGlzLCB5b3UgY2FuIGVhc2lseSB0YWlsb3IgeW91cgogICAgICBvd24gc3RyZWFtcyAgdG8gYWNoaWV2ZSB0aGUgc2FtZSAgZmVhdHVyZSBhdCBhICBsb3dlciBsZXZlbCAoYW5kCiAgICAgIHVzZSBGVF9PcGVuX0ZhY2UgaW5zdGVhZCBvZiBGVF9OZXdfRmFjZSB0byBjcmVhdGUgdGhlIGZhY2UpLgoKICBTZWUgdGhlIGZpbGUgICJpbmNsdWRlL2Z0c3lzdGVtLmgiIGZvciBtb3JlIGRldGFpbHMsIGFzICB3ZWxsIGFzIHRoZQogIGltcGxlbWVudGF0aW9ucyBmb3VuZCBpbiAiY29uZmlnL3VuaXgiIGFuZCAiY29uZmlnL2Fuc2kiLgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvbnQgRHJpdmVyczoKCiAgVGhlICBGb250IERyaXZlciAgaW50ZXJmYWNlIGhhcyAgYmVlbiBtb2RpZmllZCAgaW4gb3JkZXIgIHRvIHN1cHBvcnQKICBleHRlbnNpb25zICYgdmVyc2lvbmluZy4KCgogIFRoZSAgbGlzdCBvZiAgdGhlIGZvbnQgIGRyaXZlcnMgdGhhdCAgYXJlIHN0YXRpY2FsbHkgIGxpbmtlZCAgdG8gdGhlCiAgbGlicmFyeSBhdCBjb21waWxlIHRpbWUgaXMgIG1hbmFnZWQgdGhyb3VnaCBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKICBjYWxsZWQgYGNvbmZpZy88cGxhdGZvcm0+L2Z0bW9kdWxlLmgnLgoKICBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCB3aGVuIGludm9raW5nIGBtYWtlIG1vZHVsZXMnLiBUaGlzIHRhcmdldAogIHdpbGwgcGFyc2UgIGFsbCBzdWItZGlyZWN0b3JpZXMgb2YgJ3NyYycsIGxvb2tpbmcgIGZvciBhICJtb2R1bGUubWsiCiAgcnVsZXMgZmlsZSwgdXNlZCB0byBkZXNjcmliZSB0aGUgZHJpdmVyIHRvIHRoZSBidWlsZCBzeXN0ZW0uCgogIEhlbmNlLCBvbmUgIHNob3VsZCBjYWxsICBgbWFrZSBtb2R1bGVzJyBlYWNoICB0aW1lIGEgZm9udCAgZHJpdmVyIGlzCiAgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBgc3JjJyBkaXJlY3RvcnkuCgogIEZpbmFsbHksIHRoaXMgdmVyc2lvbiBwcm92aWRlcyBhICJwc2V1ZG8tZHJpdmVyIiBpbiBgc3JjL3NmbnQnLiBUaGlzCiAgZHJpdmVyIGRvZXNuJ3QgIHN1cHBvcnQgZm9udCAgZmlsZXMgZGlyZWN0bHksIGJ1dCAgcHJvdmlkZXMgc2VydmljZXMKICB1c2VkIGJ5ICBhbGwgVHJ1ZVR5cGUtbGlrZSBmb250ICBkcml2ZXJzLiBIZW5jZSwgaXRzIGNvZGUgIGlzIHNoYXJlZAogIGJldHdlZW4gIHRoZSBUcnVlVHlwZSAgJiBPcGVuVHlwZSAgZm9udCBmb3JtYXRzLCAgYW5kICBwb3NzaWJseSBtb3JlCiAgZm9ybWF0cyB0byBjb21lIGlmIHdlJ3JlIGx1Y2t5Li4KCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFeHRlbnNpb25zIHN1cHBvcnQ6CgogIFRoZSBleHRlbnNpb25zIHN1cHBvcnQgaXMgaW5zcGlyZWQgYnkgdGhlIG9uZSBmb3VuZCBpbiAxLnguCgogIE5vdywgZWFjaCBmb250IGRyaXZlciBoYXMgIGl0cyBvd24gImV4dGVuc2lvbiByZWdpc3RyeSIsIHdoaWNoIGxpc3RzCiAgd2hpY2ggZXh0ZW5zaW9ucyAgYXJlIGF2YWlsYWJsZSAgZm9yIHRoZSBmb250ICBmYWNlcyBtYW5hZ2VkICBieSB0aGUKICBkcml2ZXIuCgogIEV4dGVuc2lvbiBpZHMgYXJlICBub3cgc3RyaW5ncywgcmF0aGVyIHRoYW4gNC1ieXRlICB0YWdzLCBhcyB0aGlzIGlzCiAgdXN1YWxseSBtb3JlIHJlYWRhYmxlLi4KCiAgRWFjaCBleHRlbnNpb24gaGFzOgogICAgLSBzb21lIGRhdGEsIGFzc29jaWF0ZWQgdG8gZWFjaCBmYWNlIG9iamVjdAogICAgLSBhbiBpbnRlcmZhY2UgKHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzKQoKICBBbiBleHRlbnNpb24gIHRoYXQgaXMgZm9ybWF0LXNwZWNpZmljIHNob3VsZCAgc2ltcGx5IHJlZ2lzdGVyIGl0c2VsZgogIHRvIHRoZSBjb3JyZWN0IGZvbnQgZHJpdmVyLiBIZXJlIGlzIHNvbWUgZXhhbXBsZSBjb2RlOgoKICAgLy8gUmVnaXN0ZXJpbmcgYW4gZXh0ZW5zaW9ucwogICAvLwogICBGVF9FcnJvciAgRlRfSW5pdF9YWFhYX0V4dGVuc2lvbiggRlRfTGlicmFyeSAgbGlicmFyeSApCiAgIHsKICAgICBGVF9Ecml2ZXJJbnRlcmZhY2UqICB0dF9kcml2ZXI7CgogICAgIGRyaXZlciA9IEZUX0dldF9Ecml2ZXIoIGxpYnJhcnksICJ0cnVldHlwZSIgKTsKICAgICBpZiAoIWRyaXZlcikgcmV0dXJuIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7CgogICAgIHJldHVybiBGVF9SZWdpc3Rlcl9FeHRlbnNpb24oIGRyaXZlciwgJmV4dGVuc2lvbl9jbGFzcyApOwogICB9CgoKICAgLy8gSW1wbGVtZW50aW5nIHRoZSBleHRlbnNpb25zCiAgIC8vCiAgIEZUX0Vycm9yICBGVF9Qcm9jZWVkX0V4dGVuc2lvbl9YWFgoIEZUX0ZhY2UgIGZhY2UgKQogICB7CiAgICAgRlRfWFhYX0V4dGVuc2lvbiAgICAgICAgICAgIGV4dDsKICAgICBGVF9YWFhfRXh0ZW5zaW9uX0ludGVyZmFjZSAgZXh0X2ludGVyZmFjZTsKCiAgICAgZXh0ID0gRlRfR2V0X0V4dGVuc2lvbiggZmFjZSwgImV4dGVuc2lvbmlkIiwgJmV4dF9pbnRlcmZhY2UgKTsKICAgICBpZiAoIWV4dCkgcmV0dXJuIGVycm9yOwoKICAgICByZXR1cm4gZXh0X2ludGVyZmFjZS0+ZG9faXQoZXh0KTsKICAgfQoKLS0tIGVuZCBvZiBDSEFOR0VTIC0tLQo=