LlwiCi5cIiAkWEZyZWU4NjogeGMvbGliL2ZvbnRjb25maWcvc3JjL2ZvbnRjb25maWcubWFuLHYgMS41IDIwMDIvMDgvMjYgMTk6NTc6NDAga2VpdGhwIEV4cCAkCi5cIgouXCIgQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgouXCIKLlwiIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwouXCIgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLlwiIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAouXCIgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwouXCIgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgouXCIgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci5cIiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwouXCIgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0Ci5cIiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgouXCIKLlwiIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi5cIiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi5cIiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi5cIiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLlwiIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLlwiIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLlwiIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi5cIgouZGUgVFEKLmJyCi5ucwouVFAKXFwkMQouLgouVEggRk9OVENPTkZJRyAzICJWZXJzaW9uIDEuMCIgIlhGcmVlODYiCgouU0ggTkFNRQpmb250Y29uZmlnIFwtIEZvbnQgY29uZmlndXJhdGlvbiBhbmQgY3VzdG9taXphdGlvbiBsaWJyYXJ5CgouU0ggU1lOT1BTSVMKLm5mCi5CICNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KLkIgI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgouZmkKLlNIIERFU0NSSVBUSU9OCi5CIEZvbnRjb25maWcKaXMgYSBsaWJyYXJ5IGRlc2lnbmVkIHRvIHByb3ZpZGUgc3lzdGVtLXdpZGUgZm9udCBjb25maWd1cmF0aW9uLApjdXN0b21pemF0aW9uIGFuZCBhcHBsaWNhdGlvbiBhY2Nlc3MuCgouU0ggRlVOQ1RJT05BTCBPVkVSVklFVwpGb250Y29uZmlnIGNvbnRhaW5zIHR3byBlc3NlbnRpYWwgbW9kdWxlcywgdGhlIGNvbmZpZ3VyYXRpb24gbW9kdWxlIHdoaWNoCmJ1aWxkcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIGZyb20gWE1MIGZpbGVzIGFuZCB0aGUgbWF0Y2hpbmcgbW9kdWxlCndoaWNoIGFjY2VwdHMgZm9udCBwYXR0ZXJucyBhbmQgcmV0dXJucyB0aGUgbmVhcmVzdCBtYXRjaGluZyBmb250LgoKLlNTIEZPTlQgQ09ORklHVVJBVElPTgpUaGUgY29uZmlndXJhdGlvbiBtb2R1bGUgY29uc2lzdHMgb2YgdGhlIEZjQ29uZmlnIGRhdGF0eXBlLCBsaWJleHBhdCBhbmQKRmNDb25maWdQYXJzZSB3aGljaCB3YWxrcyBvdmVyIGFuIFhNTCB0cmVlIGFuZCBhbW1lbmRzIGEgY29uZmlndXJhdGlvbiB3aXRoCmRhdGEgZm91bmQgd2l0aGluLiAgRnJvbSBhbiBleHRlcm5hbCBwZXJzcGVjdGl2ZSwgY29uZmlndXJhdGlvbiBvZiB0aGUKbGlicmFyeSBjb25zaXN0cyBvZiBnZW5lcmF0aW5nIGEgdmFsaWQgWE1MIHRyZWUgYW5kIGZlZWRpbmcgdGhhdCB0bwpGY0NvbmZpZ1BhcnNlLiAgVGhlIG9ubHkgb3RoZXIgbWVjaGFuaXNtIHByb3ZpZGVkIHRvIGFwcGxpY2F0aW9ucyBmb3IKY2hhbmdpbmcgdGhlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiBpcyB0byBhZGQgZm9udHMgYW5kIGRpcmVjdG9yaWVzIHRvIHRoZQpsaXN0IG9mIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGZvbnQgZmlsZXMuICAKLlAKVGhlIGludGVudCBpcyB0byBtYWtlIGZvbnQgY29uZmlndXJhdGlvbnMgcmVsYXRpdmVseSBzdGF0aWMsIGFuZCBzaGFyZWQgYnkKYXMgbWFueSBhcHBsaWNhdGlvbnMgYXMgcG9zc2libGUuICBJdCBpcyBob3BlZCB0aGF0IHRoaXMgd2lsbCBsZWFkIHRvIG1vcmUKc3RhYmxlIGZvbnQgc2VsZWN0aW9uIHdoZW4gcGFzc2luZyBuYW1lcyBmcm9tIG9uZSBhcHBsaWNhdGlvbiB0byBhbm90aGVyLgpYTUwgd2FzIGNob3NlbiBhcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3JtYXQgYmVjYXVzZSBpdCBwcm92aWRlcyBhIGZvcm1hdAp3aGljaCBpcyBlYXN5IGZvciBleHRlcm5hbCBhZ2VudHMgdG8gZWRpdCB3aGlsZSByZXRhaW5pbmcgdGhlIGNvcnJlY3QKc3RydWN0dXJlIGFuZCBzeW50YXguCi5QCkZvbnQgY29uZmlndXJhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGZvbnQgbWF0Y2hpbmc7IGFwcGxpY2F0aW9ucyBuZWVkaW5nIHRvCmRvIHRoZWlyIG93biBtYXRjaGluZyBjYW4gYWNjZXNzIHRoZSBhdmFpbGFibGUgZm9udHMgZnJvbSB0aGUgbGlicmFyeSBhbmQKcGVyZm9ybSBwcml2YXRlIG1hdGNoaW5nLiAgVGhlIGludGVudCBpcyB0byBwZXJtaXQgYXBwbGljYXRpb25zIHRvIHBpY2sgYW5kCmNob29zZSBhcHByb3ByaWF0ZSBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGxpYnJhcnkgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZW0gdG8KY2hvb3NlIGJldHdlZW4gdGhpcyBsaWJyYXJ5IGFuZCBhIHByaXZhdGUgY29uZmlndXJhdGlvbiBtZWNoYW5pc20uICBUaGUgaG9wZQppcyB0aGF0IHRoaXMgd2lsbCBlbnN1cmUgdGhhdCBjb25maWd1cmF0aW9uIG9mIGZvbnRzIGZvciBhbGwgYXBwbGljYXRpb25zCmNhbiBiZSBjZW50cmFsaXplZCBpbiBvbmUgcGxhY2UuICBDZW50cmFsaXppbmcgZm9udCBjb25maWd1cmF0aW9uIHdpbGwgbWFrZQpzaW1wbGlmeSBhbmQgcmVndWxhcml6ZSBmb250IGluc3RhbGxhdGlvbiBhbmQgY3VzdG9taXphdGlvbi4KCi5TUyBGT05UIFBST1BFUlRJRVMKV2hpbGUgZm9udCBwYXR0ZXJucyBtYXkgY29udGFpbiBlc3NlbnRpYWxseSBhbnkgcHJvcGVydGllcywgdGhlcmUgYXJlIHNvbWUKd2VsbCBrbm93biBwcm9wZXJ0aWVzIHdpdGggYXNzb2NpYXRlZCB0eXBlcy4gIEZvbnRjb25maWcgdXNlcyBzb21lIG9mIHRoZXNlCnByb3BlcnRpZXMgZm9yIGZvbnQgbWF0Y2hpbmcgYW5kIGZvbnQgY29tcGxldGlvbi4gIE90aGVycyBhcmUgcHJvdmlkZWQgYXMgYQpjb252ZW5pZW5jZSBmb3IgdGhlIGFwcGxpY2F0aW9ucyByZW5kZXJpbmcgbWVjaGFuaXNtLgouc3AKLm5mCi50YSAxaSAyLjc1aSAzLjVpIDUuNWkKLmxjIFwoZW0KUHJvcGVydHkJQ1BQIHN5bWJvbAlUeXBlCURlc2NyaXB0aW9uCgEBAQEKZmFtaWx5CUZDX0ZBTUlMWQlTdHJpbmcJRm9udCBmYW1pbHkgbmFtZQpzdHlsZQlGQ19TVFlMRQlTdHJpbmcJRm9udCBzdHlsZS4gT3ZlcnJpZGVzIHdlaWdodCBhbmQgc2xhbnQKc2xhbnQJRkNfU0xBTlQJSW50CUl0YWxpYywgb2JsaXF1ZSBvciByb21hbgp3ZWlnaHQJRkNfV0VJR0hUCUludAlMaWdodCwgbWVkaXVtLCBkZW1pYm9sZCwgYm9sZCBvciBibGFjawpzaXplCUZDX1NJWkUJRG91YmxlCVBvaW50IHNpemUKYXNwZWN0CUZDX0FTUEVDVAlEb3VibGUJU3RyZXRjaGVzIGdseXBocyBob3Jpem9udGFsbHkgYmVmb3JlIGhpbnRpbmcKcGl4ZWxzaXplCUZDX1BJWEVMX1NJWkUJRG91YmxlCVBpeGVsIHNpemUKc3BhY2luZwlGQ19TUEFDSU5HCUludAlQcm9wb3J0aW9uYWwsIG1vbm9zcGFjZSBvciBjaGFyY2VsbApmb3VuZHJ5CUZDX0ZPVU5EUlkJU3RyaW5nCUZvbnQgZm91bmRyeSBuYW1lCmFudGlhbGlhcwlGQ19BTlRJQUxJQVMJQm9vbAlXaGV0aGVyIGdseXBocyBjYW4gYmUgYW50aWFsaWFzZWQKaGludGluZwlGQ19ISU5USU5HCUJvb2wJV2hldGhlciB0aGUgcmFzdGVyaXplciBzaG91bGQgdXNlIGhpbnRpbmcKdmVydGljYWxsYXlvdXQJRkNfVkVSVElDQUxfTEFZT1VUCUJvb2wJVXNlIHZlcnRpY2FsIGxheW91dAphdXRvaGludAlGQ19BVVRPSElOVAlCb29sCVVzZSBhdXRvaGludGVyIGluc3RlYWQgb2Ygbm9ybWFsIGhpbnRlcgpnbG9iYWxhZHZhbmNlCUZDX0dMT0JBTF9BRFZBTkNFCUJvb2wJVXNlIGZvbnQgZ2xvYmFsIGFkdmFuY2UgZGF0YQpmaWxlCUZDX0ZJTEUJU3RyaW5nCVRoZSBmaWxlbmFtZSBob2xkaW5nIHRoZSBmb250CmluZGV4CUZDX0lOREVYCUludAlUaGUgaW5kZXggb2YgdGhlIGZvbnQgd2l0aGluIHRoZSBmaWxlCmZ0ZmFjZQlGQ19GVF9GQUNFCUZUX0ZhY2UJVXNlIHRoZSBzcGVjaWZpZWQgRnJlZVR5cGUgZmFjZSBvYmplY3QKcmFzdGVyaXplcglGQ19SQVNURVJJWkVSCVN0cmluZwlXaGljaCByYXN0ZXJpemVyIGlzIGluIHVzZQpvdXRsaW5lCUZDX09VVExJTkUJQm9vbAlXaGV0aGVyIHRoZSBnbHlwaHMgYXJlIG91dGxpbmVzCnNjYWxhYmxlCUZDX1NDQUxBQkxFCUJvb2wJV2hldGhlciBnbHlwaHMgY2FuIGJlIHNjYWxlZApzY2FsZQlGQ19TQ0FMRQlEb3VibGUJU2NhbGUgZmFjdG9yIGZvciBwb2ludC0+cGl4ZWwgY29udmVyc2lvbnMKZHBpCUZDX0RQSQlEb3VibGUJVGFyZ2V0IGRvdHMgcGVyIGluY2gKcmdiYQlGQ19SR0JBCUludAl1bmtub3duLCByZ2IsIGJnciwgdnJnYiwgdmJnciwgbm9uZSAtIHN1YnBpeGVsIGdlb21ldHJ5Cm1pbnNwYWNlCUZDX01JTlNQQUNFCUJvb2wJRWxpbWluYXRlIGxlYWRpbmcgZnJvbSBsaW5lIHNwYWNpbmcKY2hhcnNldAlGQ19DSEFSU0VUCUNoYXJTZXQJVW5pY29kZSBjaGFycyBlbmNvZGVkIGJ5IHRoZSBmb250CmxhbmcJRkNfTEFORwlTdHJpbmcJTGlzdCBvZiBSRkMtMzA2Ni1zdHlsZSBsYW5ndWFnZXMgdGhpcyBmb250IHN1cHBvcnRzCi5EVAouZmkKCi5TUyBGT05UIE1BVENISU5HCkZvbnRjb25maWcgcGVyZm9ybXMgbWF0Y2hpbmcgYnkgbWVhc3VyaW5nIHRoZSBkaXN0YW5jZSBmcm9tIGEgcHJvdmlkZWQKcGF0dGVybiB0byBhbGwgb2YgdGhlIGF2YWlsYWJsZSBmb250cyBpbiB0aGUgc3lzdGVtLiAgVGhlIGNsb3Nlc3QgbWF0Y2hpbmcKZm9udCBpcyBzZWxlY3RlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgZm9udCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCwgYnV0CmRvZXNuJ3QgZW5zdXJlIHRoYXQgaXQgaXMgYW55dGhpbmcgbGlrZSB0aGUgcmVxdWVzdGVkIHBhdHRlcm4uCi5QCkZvbnQgbWF0Y2hpbmcgc3RhcnRzIHdpdGggYW4gYXBwbGljYXRpb24gY29uc3RydWN0ZWQgcGF0dGVybi4gIFRoZSBkZXNpcmVkCmF0dHJpYnV0ZXMgb2YgdGhlIHJlc3VsdGluZyBmb250IGFyZSBjb2xsZWN0ZWQgdG9nZXRoZXIgaW4gYW4gRmNQYXR0ZXJuCm9iamVjdC4gIEVhY2ggcHJvcGVydHkgb2YgdGhlIHBhdHRlcm4gY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgdmFsdWVzOyB0aGVzZQphcmUgbGlzdGVkIGluIHByaW9yaXR5IG9yZGVyOyBtYXRjaGVzIGVhcmxpZXIgaW4gdGhlIGxpc3QgYXJlIGNvbnNpZGVyZWQKImNsb3NlciIgdGhhbiBtYXRjaGVzIGxhdGVyIGluIHRoZSBsaXN0LgouUApUaGUgaW5pdGlhbCBwYXR0ZXJuIGlzIG1vZGlmaWVkIGJ5IGFwcGx5aW5nIHRoZSBsaXN0IG9mIGVkaXRpbmcgaW5zdHJ1Y3Rpb25zCnNwZWNpZmljIHRvIHBhdHRlcm5zIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uOyBlYWNoIGNvbnNpc3RzIG9mIGEgbWF0Y2gKcHJlZGljYXRlIGFuZCBhIHNldCBvZiBlZGl0aW5nIG9wZXJhdGlvbnMuICBUaGV5IGFyZSBleGVjdXRlZCBpbiB0aGUgb3JkZXIKdGhleSBhcHBlYXJlZCBpbiB0aGUgY29uZmlndXJhdGlvbi4gIEVhY2ggbWF0Y2ggY2F1c2VzIHRoZSBhc3NvY2lhdGVkCnNlcXVlbmNlIG9mIGVkaXRpbmcgb3BlcmF0aW9ucyB0byBiZSBhcHBsaWVkLgouUApBZnRlciB0aGUgcGF0dGVybiBoYXMgYmVlbiBlZGl0ZWQsIGEgc2VxdWVuY2Ugb2YgZGVmYXVsdCBzdWJzdGl0dXRpb25zIGFyZQpwZXJmb3JtZWQgdG8gY2Fub25pY2FsaXplIHRoZSBzZXQgb2YgYXZhaWxhYmxlIHByb3BlcnRpZXM7IHRoaXMgYXZvaWRzIHRoZQpuZWVkIGZvciB0aGUgbG93ZXIgbGF5ZXJzIHRvIGNvbnN0YW50bHkgcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaW91cwpmb250IHByb3BlcnRpZXMgZHVyaW5nIHJlbmRlcmluZy4KLlAKVGhlIGNhbm9uaWNhbCBmb250IHBhdHRlcm4gaXMgZmluYWxseSBtYXRjaGVkIGFnYWluc3QgYWxsIGF2YWlsYWJsZSBmb250cy4KVGhlIGRpc3RhbmNlIGZyb20gdGhlIHBhdHRlcm4gdG8gdGhlIGZvbnQgaXMgbWVhc3VyZWQgZm9yIGVhY2ggb2Ygc2V2ZXJhbApwcm9wZXJ0aWVzOiBmb3VuZHJ5LCBjaGFyc2V0LCBmYW1pbHksIGxhbmcsIHNwYWNpbmcsIHBpeGVsc2l6ZSwgc3R5bGUsCnNsYW50LCB3ZWlnaHQsIGFudGlhbGlhcywgcmFzdGVyaXplciBhbmQgb3V0bGluZS4gIFRoaXMgbGlzdCBpcyBpbiBwcmlvcml0eQpvcmRlciAtLSByZXN1bHRzIG9mIGNvbXBhcmluZyBlYXJsaWVyIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCB3ZWlnaCBtb3JlCmhlYXZpbHkgdGhhbiBsYXRlciBlbGVtZW50cy4KLlAKVGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSB0byB0aGlzIHJ1bGU7IGZhbWlseSBuYW1lcyBhcmUgc3BsaXQgaW50byB0d28KYmluZGluZ3M7IHN0cm9uZyBhbmQgd2Vhay4gIFN0cm9uZyBmYW1pbHkgbmFtZXMgYXJlIGdpdmVuIGdyZWF0ZXIgcHJlY2VkZW5jZQppbiB0aGUgbWF0Y2ggdGhhbiBsYW5nIGVsZW1lbnRzIHdoaWxlIHdlYWsgZmFtaWx5IG5hbWVzIGFyZSBnaXZlbiBsb3dlcgpwcmVjZWRlbmNlIHRoYW4gbGFuZyBlbGVtZW50cy4gIFRoaXMgcGVybWl0cyB0aGUgZG9jdW1lbnQgbGFuZ3VhZ2UgdG8gZHJpdmUKZm9udCBzZWxlY3Rpb24gd2hlbiBhbnkgZG9jdW1lbnQgc3BlY2lmaWVkIGZvbnQgaXMgdW5hdmFpbGFibGUuCi5QClRoZSBwYXR0ZXJuIHJlcHJlc2VudGluZyB0aGF0IGZvbnQgaXMgYXVnbWVudGVkIHRvIGluY2x1ZGUgYW55IHByb3BlcnRpZXMKZm91bmQgaW4gdGhlIHBhdHRlcm4gYnV0IG5vdCBmb3VuZCBpbiB0aGUgZm9udCBpdHNlbGY7IHRoaXMgcGVybWl0cyB0aGUKYXBwbGljYXRpb24gdG8gcGFzcyByZW5kZXJpbmcgaW5zdHJ1Y3Rpb25zIG9yIGFueSBvdGhlciBkYXRhIHRocm91Z2ggdGhlCm1hdGNoaW5nIHN5c3RlbS4gIEZpbmFsbHksIHRoZSBsaXN0IG9mIGVkaXRpbmcgaW5zdHJ1Y3Rpb25zIHNwZWNpZmljIHRvCmZvbnRzIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGFyZSBhcHBsaWVkIHRvIHRoZSBwYXR0ZXJuLiAgVGhpcyBtb2RpZmllZApwYXR0ZXJuIGlzIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbi4KLlAKVGhlIHJldHVybiB2YWx1ZSBjb250YWlucyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGxvY2F0ZSBhbmQgcmFzdGVyaXplIHRoZQpmb250LCBpbmNsdWRpbmcgdGhlIGZpbGUgbmFtZSwgcGl4ZWwgc2l6ZSBhbmQgb3RoZXIgcmVuZGVyaW5nIGRhdGEuICBBcwpub25lIG9mIHRoZSBpbmZvcm1hdGlvbiBpbnZvbHZlZCBwZXJ0YWlucyB0byB0aGUgRnJlZVR5cGUgbGlicmFyeSwKYXBwbGljYXRpb25zIGFyZSBmcmVlIHRvIHVzZSBhbnkgcmFzdGVyaXphdGlvbiBlbmdpbmUgb3IgZXZlbiB0byB0YWtlCnRoZSBpZGVudGlmaWVkIGZvbnQgZmlsZSBhbmQgYWNjZXNzIGl0IGRpcmVjdGx5LgouUApUaGUgbWF0Y2gvZWRpdCBzZXF1ZW5jZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYXJlIHBlcmZvcm1lZCBpbiB0d28gcGFzc2VzCmJlY2F1c2UgdGhlcmUgYXJlIGVzc2VudGlhbGx5IHR3byBkaWZmZXJlbnQgb3BlcmF0aW9ucyBuZWNlc3NhcnkgLS0gdGhlCmZpcnN0IGlzIHRvIG1vZGlmeSBob3cgZm9udHMgYXJlIHNlbGVjdGVkOyBhbGlhc2luZyBmYW1pbGllcyBhbmQgYWRkaW5nCnN1aXRhYmxlIGRlZmF1bHRzLiAgVGhlIHNlY29uZCBpcyB0byBtb2RpZnkgaG93IHRoZSBzZWxlY3RlZCBmb250cyBhcmUKcmFzdGVyaXplZC4gIFRob3NlIG11c3QgYXBwbHkgdG8gdGhlIHNlbGVjdGVkIGZvbnQsIG5vdCB0aGUgb3JpZ2luYWwgcGF0dGVybgphcyBmYWxzZSBtYXRjaGVzIHdpbGwgb2Z0ZW4gb2NjdXIuCi5TUyBGT05UIExJU1QgTUFUQ0hJTkcKLlAKV2hpbGUgbWFueSBhcHBsaWNhdGlvbnMgd2FudCB0byBsb2NhdGUgYSBzaW5nbGUgZm9udCBiZXN0IG1hdGNoaW5nIHRoZWlyCnNlYXJjaCBjcml0ZXJpYSwgb3RoZXIgYXBwbGljYXRpb25zIG5lZWQgdG8gYnVpbGQgYSBzZXQgb2YgZm9udHMgd2hpY2ggY2FuCmJlIHVzZWQgdG8gcHJlc2VudCBhbnkgVW5pY29kZSBkYXRhLiAgRm9udGNvbmZpZyBwcm92aWRlcyBhbiBBUEkgdG8gZ2VuZXJhdGUKYSBsaXN0IHNvcnRlZCBieSB0aGUgbmVhcm5lc3Mgb2YgZWFjaCBmb250IHRvIHRoZSBwYXR0ZXJuLiAgRXZlcnkgZm9udCBpbgp0aGUgc3lzdGVtIGlzIGNvbnNpZGVyZWQsIHRoZSBiZXN0IG1hdGNoaW5nIGZvbnRzIGFyZSBwbGFjZWQgZmlyc3QuICBUaGUKYXBwbGljYXRpb24gdGhlbiBjYW4gc2VsZWN0IHdoZXRoZXIgdGhlIHJlbWFpbmluZyBmb250cyBhcmUgdW5jb25kaXRpb25hbGx5IAppbmNsdWRlZCBpbiB0aGUgbGlzdCwgb3Igd2hldGhlciB0aGV5IGFyZSBpbmNsdWRlZCBvbmx5IGlmIHRoZXkgY292ZXIKcG9ydGlvbnMgb2YgVW5pY29kZSBub3QgY292ZXJlZCBieSBhbnkgb2YgdGhlIHByZWNlZWRpbmcgZm9udHMuCi5QClRoZSBsaXN0IHJlc3VsdGluZyBmcm9tIHRoaXMgbWF0Y2ggaXMgcmVwcmVzZW50ZWQgYnkgcmVmZXJlbmNlcyB0byB0aGUKb3JpZ2luYWwgZm9udCBwYXR0ZXJucyBhbmQgc28gY29uc3VtZXMgdmVyeSBsaXR0bGUgbWVtb3J5LiAgVXNpbmcgYSBsaXN0CmVudHJ5IGludm9sdmVzIGNyZWF0aW5nIGEgcGF0dGVybiB3aGljaCBjb21iaW5lcyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKZm9udCB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIGFuZCBleGVjdXRpbmcgdGhlIGZvbnQKc3Vic3RpdHV0aW9ucy4KLlNTIEZPTlQgTkFNRVMKRm9udGNvbmZpZyBwcm92aWRlcyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gZm9yIHBhdHRlcm5zIHRoYXQgdGhlIGxpYnJhcnkKY2FuIGJvdGggYWNjZXB0IGFuZCBnZW5lcmF0ZS4gIFRoZSByZXByZXNlbnRhdGlvbiBpcyBpbiB0aHJlZSBwYXJ0cywgZmlyc3QgYQpsaXN0IG9mIGZhbWlseSBuYW1lcywgc2Vjb25kIGEgbGlzdCBvZiBwb2ludCBzaXplcyBhbmQgZmluYWxseSBhIGxpc3Qgb2YKYWRkaXRpb25hbCBwcm9wZXJ0aWVzOgoubmYKCTxmYW1pbGllcz4tPHBvaW50IHNpemVzPjo8bmFtZTE+PTx2YWx1ZXMxPjo8bmFtZTI+PTx2YWx1ZXMyPi4uLgouZmkKVmFsdWVzIGluIGEgbGlzdCBhcmUgc2VwYXJhdGVkIHdpdGggY29tbWFzLiAgVGhlIG5hbWUgbmVlZG4ndCBpbmNsdWRlIGVpdGhlcgpmYW1pbGllcyBvciBwb2ludCBzaXplczsgdGhleSBjYW4gYmUgZWxpZGVkLiAgSW4gYWRkaXRpb24sIHRoZXJlIGFyZQpzeW1ib2xpYyBjb25zdGFudHMgdGhhdCBzaW11bHRhbmVvdXNseSBpbmRpY2F0ZSBib3RoIGEgbmFtZSBhbmQgYSB2YWx1ZS4KSGVyZSBhcmUgc29tZSBleGFtcGxlczoKLnNwCi5uZgoudGEgMWkgM2kKCVRpbWVzLTEyCTEyIHBvaW50IFRpbWVzIFJvbWFuCglUaW1lcy0xMjpib2xkCTEyIHBvaW50IFRpbWVzIEJvbGQKCUNvdXJpZXI6aXRhbGljCUNvdXJpZXIgSXRhbGljIGluIHRoZSBkZWZhdWx0IHNpemUKCU1vbm9zcGFjZTptYXRyaXg9MSAuMSAwIDEJVGhlIHVzZXJzIHByZWZlcnJlZCBtb25vc3BhY2UgZm9udAoJCXdpdGggYXJ0aWZpY2lhbCBvYmxpcXVpbmcKLmZpCi5EVAoKLlNIIExBTkcgVEFHUwouUApFYWNoIGZvbnQgaW4gdGhlIGRhdGFiYXNlIGNvbnRhaW5zIGEgbGlzdCBvZiBsYW5ndWFnZXMgaXQgc3VwcG9ydHMuICBUaGlzIGlzCmNvbXB1dGVkIGJ5IGNvbXBhcmluZyB0aGUgVW5pY29kZSBjb3ZlcmFnZSBvZiB0aGUgZm9udCB3aXRoIHRoZSBvcnRob2dyYXBoeQpvZiBlYWNoIGxhbmd1YWdlLiAgTGFuZ3VhZ2VzIGFyZSB0YWdnZWQgdXNpbmcgYW4gUkZDLTMwNjYgY29tcGF0aWJsZSBuYW1pbmcKYW5kIG9jY3VyIGluIHR3byBwYXJ0cyAtLSB0aGUgSVNPNjM5IGxhbmd1YWdlIHRhZyBmb2xsb3dlZCBhIGh5cGhlbiBhbmQgdGhlbgpieSB0aGUgSVNPIDMxNjYgY291bnRyeSBjb2RlLiAgVGhlIGh5cGhlbiBhbmQgY291bnRyeSBjb2RlIG1heSBiZSBlbGlkZWQuCgouUApGb250Y29uZmlnIGhhcyBvcnRob2dyYXBoaWVzIGZvciBzZXZlcmFsIGxhbmd1YWdlcyBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5LgpObyBwcm92aXNpb24gaGFzIGJlZW4gbWFkZSBmb3IgYWRkaW5nIG5ldyBvbmVzIGFzaWRlIGZyb20gcmVidWlsZGluZyB0aGUKbGlicmFyeS4gIEl0IGN1cnJlbnRseSBzdXBwb3J0cyAxMjIgb2YgdGhlIDEzOSBsYW5ndWFnZXMgbmFtZWQgaW4gSVNPIDYzOS0xLAoxNDEgb2YgdGhlIGxhbmd1YWdlcyB3aXRoIHR3by1sZXR0ZXIgY29kZXMgZnJvbSBJU08gNjM5LTIgYW5kIGFub3RoZXIgMzAKbGFuZ3VhZ2VzIHdpdGggb25seSB0aHJlZS1sZXR0ZXIgY29kZXMuCgouU0ggREFUQVRZUEVTCgouVFAKLkIgRmNDaGFyOAouVFEKLkIgRmNDaGFyMTYKLlRRCi5CIEZjQ2hhcjMyCi5UUQouQiBGY0Jvb2wKVGhlc2UgYXJlIHByaW1pdGl2ZSBkYXRhdHlwZXM7IHRoZSBGY0NoYXIqIHR5cGVzIGhvbGQgcHJlY2lzZWx5IHRoZSBudW1iZXIKb2YgYml0cyBzdGF0ZWQgKGlmIHN1cHBvcnRlZCBieSB0aGUgQyBpbXBsZW1lbnRhdGlvbikuICBGY0Jvb2wgaG9sZHMKb25lIG9mIHR3byBDUFAgc3ltYm9sczogRmNGYWxzZSBvciBGY1RydWUuCgouVFAKLkIgRmNNYXRyaXgKQW4gRmNNYXRyaXggaG9sZHMgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uLCB1c3VhbGx5IHVzZWQgdG8gcmVzaGFwZSBnbHlwaHMuCkEgc21hbGwgc2V0IG9mIG1hdHJpeCBvcGVyYXRpb25zIGFyZSBwcm92aWRlZCB0byBtYW5pcHVsYXRlIHRoZXNlLgouc3AKLm5mCgl0eXBlZGVmIHN0cnVjdCBfRmNNYXRyaXggewoJCWRvdWJsZSB4eCwgeHksIHl4LCB5eTsKCX0gRmNNYXRyaXg7Ci5maQoKLlRQCi5CIEZjQ2hhclNldApBbiBGY0NoYXJTZXQgaXMgYW4gYWJzdHJhY3QgdHlwZSB0aGF0IGhvbGRzIHRoZSBzZXQgb2YgZW5jb2RlZCB1bmljb2RlIGNoYXJzCmluIGEgZm9udC4gIE9wZXJhdGlvbnMgdG8gYnVpbGQgYW5kIGNvbXBhcmUgdGhlc2Ugc2V0cyBhcmUgcHJvdmlkZWQuCgouVFAKLkIgRmNUeXBlClRhZ3MgdGhlIGtpbmQgb2YgZGF0YSBzdG9yZWQgaW4gYW4gRmNWYWx1ZS4KCi5UUAouQiBGY1ZhbHVlCkFuIEZjVmFsdWUgb2JqZWN0IGhvbGRzIGEgc2luZ2xlIHZhbHVlIHdpdGggb25lIG9mIGEgbnVtYmVyIG9mIGRpZmZlcmVudAp0eXBlcy4gIFRoZSAndHlwZScgdGFnIGluZGljYXRlcyB3aGljaCBtZW1iZXIgaXMgdmFsaWQuCi5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY1ZhbHVlIHsKCQlGY1R5cGUgdHlwZTsKCQl1bmlvbiB7CgkJCWNvbnN0IEZjQ2hhcjggKnM7CgkJCWludCBpOwoJCQlGY0Jvb2wgYjsKCQkJZG91YmxlIGQ7CgkJCWNvbnN0IEZjTWF0cml4ICptOwoJCQljb25zdCBGY0NoYXJTZXQgKmM7CgkJfSB1OwoJfSBGY1ZhbHVlOwouZmkKLlAKLnRhIDFpIDJpIDNpIDRpCi5uZgoubGMgXChlbQoJdHlwZQlVbmlvbiBtZW1iZXIJRGF0YXR5cGUKCQEBAQoJRmNUeXBlVm9pZAkobm9uZSkJKG5vbmUpCglGY1R5cGVJbnRlZ2VyCWkJaW50CglGY1R5cGVEb3VibGUJZAlkb3VibGUKCUZjVHlwZVN0cmluZwlzCWNoYXIgKgoJRmNUeXBlQm9vbAliCWIKCUZjVHlwZU1hdHJpeAltCUZjTWF0cml4ICoKCUZjVHlwZUNoYXJTZXQJYwlGY0NoYXJTZXQgKgouZmkKLkRUCi5UUAouQiBGY1BhdHRlcm4KaG9sZHMgYSBzZXQgb2YgbmFtZXMgd2l0aCBhc3NvY2lhdGVkIHZhbHVlIGxpc3RzOyBlYWNoIG5hbWUgcmVmZXJzIHRvIGEKcHJvcGVydHkgb2YgYSBmb250LiAgRmNQYXR0ZXJucyBhcmUgdXNlZCBhcyBpbnB1dHMgdG8gdGhlIG1hdGNoaW5nIGNvZGUgYXMKd2VsbCBhcyBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGZvbnRzLiAgRWFjaCBwcm9wZXJ0eSBjYW4gaG9sZApvbmUgb3IgbW9yZSB2YWx1ZXM7IGNvbnZlbnRpb25hbGx5IGFsbCBvZiB0aGUgc2FtZSB0eXBlLCBhbHRob3VnaCB0aGUKaW50ZXJmYWNlIGRvZXNuJ3QgZGVtYW5kIHRoYXQuCgouVFAKLkIgRmNGb250U2V0Ci5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY0ZvbnRTZXQgewoJCWludCBuZm9udDsKCQlpbnQgc2ZvbnQ7CgkJRmNQYXR0ZXJuICoqZm9udHM7Cgl9IEZjRm9udFNldDsKLmZpCQpBbiBGY0ZvbnRTZXQgY29udGFpbnMgYSBsaXN0IG9mIEZjUGF0dGVybnMuICBJbnRlcm5hbGx5IGZvbnRjb25maWcgdXNlcyB0aGlzCmRhdGEgc3RydWN0dXJlIHRvIGhvbGQgc2V0cyBvZiBmb250cy4gIEV4dGVybmFsbHksIGZvbnRjb25maWcgcmV0dXJucyB0aGUKcmVzdWx0cyBvZiBsaXN0aW5nIGZvbnRzIGluIHRoaXMgZm9ybWF0LiAgJ25mb250JyBob2xkcyB0aGUgbnVtYmVyIG9mCnBhdHRlcm5zIGluIHRoZSAnZm9udHMnIGFycmF5OyAnc2ZvbnQnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhhdAphcnJheS4KCi5UUAouQiBGY1N0clNldAouQiBGY1N0ckxpc3QKRmNTdHJTZXQgaG9sZHMgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBjYW4gYmUgYXBwZW5kZWQgdG8gYW5kIGVudW1lcmF0ZWQuCkl0cyB1bmlxdWUgY2hhcmFjdGVyaXN0aWMgaXMgdGhhdCB0aGUgZW51bWVyYXRpb24gd29ya3MgZXZlbiB3aGlsZSBzdHJpbmdzCmFyZSBhcHBlbmRlZCBkdXJpbmcgZW51bWVyYXRpb24uICBGY1N0ckxpc3QgaXMgdXNlZCBkdXJpbmcgZW51bWVyYXRpb24gdG8Kc2FmZWx5IGFuZCBjb3JyZWN0bHkgd2FsayB0aGUgbGlzdCBvZiBzdHJpbmdzIGV2ZW4gd2hpbGUgdGhhdCBsaXN0IGlzIGVkaXRlZAppbiB0aGUgbWlkZGxlIG9mIGVudW1lcmF0aW9uLgoKLlRQCi5CIEZjT2JqZWN0U2V0Ci5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY09iamVjdFNldCB7CgkJaW50IG5vYmplY3Q7CgkJaW50IHNvYmplY3Q7CgkJY29uc3QgY2hhciAqKm9iamVjdHM7Cgl9IEZjT2JqZWN0U2V0OwouZmkKLnNwCmhvbGRzIGEgc2V0IG9mIG5hbWVzIGFuZCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGZyb20gZm9udHMgYXJlCnBsYWNlZCBpbiB0aGUgdGhlIGxpc3Qgb2YgcmV0dXJuZWQgcGF0dGVybnMgd2hlbiBsaXN0aW5nIGZvbnRzLgoKLlRQCi5CIEZjT2JqZWN0VHlwZQouc3AKCXR5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGUgewoJCWNvbnN0IGNoYXIgKm9iamVjdDsKCQlGY1R5cGUgdHlwZTsKCX0gRmNPYmplY3RUeXBlOwouZmkKbWFya3MgdGhlIHR5cGUgb2YgYSBwYXR0ZXJuIGVsZW1lbnQgZ2VuZXJhdGVkIHdoZW4gcGFyc2luZyBmb250IG5hbWVzLgpBcHBsaWNhdGlvbnMgY2FuIGFkZCBuZXcgb2JqZWN0IHR5cGVzIHNvIHRoYXQgZm9udCBuYW1lcyBtYXkgY29udGFpbiB0aGUgbmV3CmVsZW1lbnRzLgoKLlRQCi5CIEZjQ29uc3RhbnQKLnNwCgl0eXBlZGVmIHN0cnVjdCBfRmNDb25zdGFudCB7CgkgICAgY29uc3QgRmNDaGFyOCAqbmFtZTsKCSAgICBjb25zdCBjaGFyICpvYmplY3Q7CgkgICAgaW50IHZhbHVlOwoJfSBGY0NvbnN0YW50OwouZmkKUHJvdmlkZXMgZm9yIHN5bWJvbGljIGNvbnN0YW50cyBmb3IgbmV3IHBhdHRlcm4gZWxlbWVudHMuICBXaGVuICduYW1lJyBpcwpzZWVuIGluIGEgZm9udCBuYW1lLCBhbiAnb2JqZWN0JyBlbGVtZW50IGlzIGNyZWF0ZWQgd2l0aCB2YWx1ZSAndmFsdWUnLgoKLlRQCi5CIEZjQmxhbmtzCmhvbGRzIGEgbGlzdCBvZiBVbmljb2RlIGNoYXJzIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBibGFuazsgdW5leHBlY3RlZGx5CmJsYW5rIGNoYXJzIGFyZSBhc3N1bWVkIHRvIGJlIGludmFsaWQgYW5kIGFyZSBlbGlkZWQgZnJvbSB0aGUgY2hhcnNldAphc3NvY2lhdGVkIHdpdGggdGhlIGZvbnQuCgouVFAKLkIgRmNGaWxlQ2FjaGUKaG9sZHMgdGhlIHBlci11c2VyIGNhY2hlIGluZm9ybWF0aW9uIGZvciB1c2Ugd2hpbGUgbG9hZGluZyB0aGUgZm9udApkYXRhYmFzZS4gVGhpcyBpcyBidWlsdCBhdXRvbWF0aWNhbGx5IGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHdoZW4KdGhhdCBpcyBsb2FkZWQuICBBcHBsaWNhdGlvbnMgbXVzdCBhbHdheXMgcGFzcyAnMCcgd2hlbiBvbmUgaXMgcmVxdWVzdGVkLgoKLlRQCi5CIEZjQ29uZmlnCmhvbGRzIGEgY29tcGxldGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeTsgdGhlcmUgaXMgb25lIGRlZmF1bHQKY29uZmlndXJhdGlvbiwgb3RoZXIgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gWE1MIGRhdGEgc3RydWN0dXJlcy4gIEFsbApwdWJsaWMgZW50cnkgcG9pbnRzIHRoYXQgbmVlZCBnbG9iYWwgZGF0YSBjYW4gdGFrZSBhbiBvcHRpb25hbCBGY0NvbmZpZyoKYXJndW1lbnQ7IHBhc3NpbmcgMCB1c2VzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBGY0NvbmZpZyBvYmplY3RzIGhvbGQgdHdvCnNldHMgb2YgZm9udHMsIHRoZSBmaXJzdCBjb250YWlucyB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24sIHRoZQpzZWNvbmQgc2V0IGhvbGRzIHRob3NlIGFkZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhdCBydW4tdGltZS4gIEludGVyZmFjZXMKdGhhdCBuZWVkIHRvIHJlZmVyZW5jZSBhIHBhcnRpY3VsYXQgc2V0IHVzZSBvbmUgb2YgdGhlIEZjU2V0TmFtZSBlbnVtZXJhdGVkCnZhbHVlcy4KCi5UUAouQiBGY1NldE5hbWUKU3BlY2lmaWVzIG9uZSBvZiB0aGUgdHdvIHNldHMgb2YgZm9udHMgYXZhaWxhYmxlIGluIGEgY29uZmlndXJhdGlvbjsKRmNTZXRTeXN0ZW0gZm9yIHRob3NlIGZvbnRzIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQKRmNTZXRBcHBsaWNhdGlvbiB3aGljaCBob2xkcyBmb250cyBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24uCgouVFAKLkIgRmNSZXN1bHQKVXNlZCBhcyBhIHJldHVybiB0eXBlIGZvciBmdW5jdGlvbnMgbWFuaXB1bGF0aW5nIEZjUGF0dGVybiBvYmplY3RzLgouUAoudGEgMWkgM2kgNGkKLmxjIFwoZW0KCVJlc3VsdCBjb2RlCU1lYW5pbmcKLmJyCgkBAQouYnIKCUZjUmVzdWx0TWF0Y2gJT2JqZWN0IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgSUQKLmJyCglGY1Jlc3VsdE5vTWF0Y2gJT2JqZWN0IGRvZXNuJ3QgZXhpc3QgYXQgYWxsCi5icgoJRmNSZXN1bHRUeXBlTWlzbWF0Y2gJT2JqZWN0IGV4aXN0cywgYnV0IHRoZSB0eXBlIGRvZXNuJ3QgbWF0Y2gKLmJyCglGY1Jlc3VsdE5vSWQJT2JqZWN0IGV4aXN0cywgYnV0IGhhcyBmZXdlciB2YWx1ZXMgdGhhbiBzcGVjaWZpZWQKLmJyCi5EVAoKLlRQCi5CIEZjQXRvbWljClVzZWQgZm9yIGxvY2tpbmcgYWNjZXNzIHRvIGNvbmZpZyBmaWxlcy4gIFByb3ZpZGVzIGEgc2FmZSB3YXkgdG8gdXBkYXRlCmNvbmZpZ3VyYXRpb24gZmlsZXMuCgouU0ggRlVOQ1RJT05TCgouU1MgRmNNYXRyaXgKRmNNYXRyaXggc3RydWN0dXJlcyBob2xkIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBpbiBtYXRyaXggZm9ybS4KLlRQCiNkZWZpbmUgRmNNYXRyaXhJbml0KG0pCSgobSktPnh4ID0gKG0pLT55eSA9IDEsIChtKS0+eHkgPSAobSktPnl4ID0gMCkKSW5pdGlhbGl6ZXMgYSBtYXRyaXggdG8gdGhlIGlkZW50aWZ5IHRyYW5zZm9ybWF0aW9uLgoKLlRQCkZjTWF0cml4ICpGY01hdHJpeENvcHkgKGNvbnN0IEZjTWF0cml4ICptYXQpCkFsbG9jYXRlcyBhIG5ldyBGY01hdHJpeCBhbmQgY29waWVzICdtYXQnIGludG8gaXQuCgouVFAKRmNCb29sIEZjTWF0cml4RXF1YWwgKGNvbnN0IEZjTWF0cml4ICptYXQxLCBjb25zdCBGY01hdHJpeCAqbWF0MikKUmV0dXJucyBGY1RydWUgaWYgJ21hdDEnIGFuZCAnbWF0MicgYXJlIGVxdWFsLCBlbHNlIEZjRmFsc2UuCgouVFAKdm9pZCBGY01hdHJpeE11bHRpcGx5IChGY01hdHJpeCAqcmVzdWx0LCBjb25zdCBGY01hdHJpeCAqYSwgY29uc3QgRmNNYXRyaXggKmIpCk11bHRpcGxpZXMgJ2EnIGFuZCAnYicgdG9nZXRoZXIsIHBsYWNpbmcgdGhlIHJlc3VsdCBpbiAncmVzdWx0Jy4gICdyZXN1bHQnCm1heSByZWZlciB0byB0aGUgc2FtIG1hdHJpeCBhcyBlaXRoZXIgJ2EnIG9yICdiJy4KCi5UUAp2b2lkIEZjTWF0cml4Um90YXRlIChGY01hdHJpeCAqbSwgZG91YmxlIGMsIGRvdWJsZSBzKQpJZiAnYycgaXMgY29zKGFuZ2xlKSBhbmQgJ3MnIGlzIHNpbihhbmdsZSksIEZjTWF0cml4Um90YXRlIHJvdGF0ZXMgdGhlCm1hdHJpeCBieSAnYW5nbGUnLgoKLlRQCnZvaWQgRmNNYXRyaXhTY2FsZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBzeCwgZG91YmxlIHN5KQpTY2FsZXMgJ20nIGJ5ICdzeCcgaW4gdGhlIGhvcml6b250YWwgZGltZW5zaW9uIGFuZCAnc3knIGluIHRoZQp2ZXJ0aWNhbCBkaW1lbnNpb24uCgouVFAKdm9pZCBGY01hdHJpeFNoZWFyIChGY01hdHJpeCAqbSwgZG91YmxlIHNoLCBkb3VibGUgc3YpClNoZWFycyAnbScgYnkgJ3NoJyBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24gYW5kICdzdicgaW4gdGhlCnZlcnRpY2FsIGRpcmVjdGlvbi4KCi5TUyBGY0NoYXJTZXQKQW4gRmNDaGFyU2V0IGlzIGEgYm9vbGVhbiBhcnJheSBpbmRpY2F0aW5nIGEgc2V0IG9mIHVuaWNvZGUgY2hhcnMuICBUaG9zZQphc3NvY2lhdGVkIHdpdGggYSBmb250IGFyZSBtYXJrZWQgY29uc3RhbnQgYW5kIGNhbm5vdCBiZSBlZGl0ZWQuCkZjQ2hhclNldHMgbWF5IGJlIHJlZmVyZW5jZSBjb3VudGVkIGludGVybmFsbHkgdG8gcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbjsKdGhpcyBtYXkgYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgYXMgdGhlIHJlc3VsdCBvZiBGY0NoYXJTZXRDb3B5IG1heQpyZXR1cm4gaXQncyBhcmd1bWVudCwgYW5kIHRoYXQgQ2hhclNldCBtYXkgcmVtYWluIHVubW9kaWZpYWJsZS4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldENyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBGY0NoYXJTZXQgb2JqZWN0LgoKLlRQCnZvaWQgRmNDaGFyU2V0RGVzdHJveSAoRmNDaGFyU2V0ICpmY3MpCkZyZWVzIGFuIEZjQ2hhclNldCBvYmplY3QuCgouVFAKRmNCb29sIEZjQ2hhclNldEFkZENoYXIgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQpBZGRzIGEgc2luZ2xlIHVuaWNvZGUgY2hhciB0byB0aGUgc2V0LCByZXR1cm5pbmcgRmNGYWxzZSBvbgpmYWlsdXJlLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgYSBjb25zdGFudCBzZXQgb3IgZnJvbSBydW5uaW5nIG91dCBvZiBtZW1vcnkuCgouVFAKRmNDaGFyU2V0ICpGY0NoYXJTZXRDb3B5IChGY0NoYXJTZXQgKnNyYykKTWFrZXMgYSBjb3B5IG9mICdzcmMnOyBub3RlIHRoYXQgdGhpcyBtYXkgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIG1vcmUgdGhhbgppbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiAnc3JjJy4KCi5UUApGY0Jvb2wgRmNDaGFyU2V0RXF1YWwgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQpSZXR1cm5zIHdoZXRoZXIgJ2EnIGFuZCAnYicgY29udGFpbiB0aGUgc2FtZSBzZXQgb2YgdW5pY29kZSBjaGFycy4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldEludGVyc2VjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpClJldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gYm90aCAnYScgYW5kICdiJy4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldFVuaW9uIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7ClJldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gZWl0aGVyICdhJyBvciAnYicuCgouVFAKRmNDaGFyU2V0ICpGY0NoYXJTZXRTdWJ0cmFjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpClJldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gJ2EnIGJ1dCBub3QgJ2InLgoKLlRQCkZjQm9vbCBGY0NoYXJTZXRIYXNDaGFyIChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKUmV0dXJucyB3aGV0aGVyICdmY3MnIGNvbnRhaW5zIHRoZSBjaGFyICd1Y3M0Jy4KCi5UUApGY0NoYXIzMiBGY0NoYXJTZXRDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphKQpSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgdW5pY29kZSBjaGFycyBpbiAnYScuCgouVFAKRmNDaGFyMzIgRmNDaGFyU2V0SW50ZXJzZWN0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQpSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcnMgdGhhdCBhcmUgaW4gYm90aCAnYScgYW5kICdiJy4KCi5UUApGY0NoYXIzMiBGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJzIHRoYXQgYXJlIGluICdhJyBidXQgbm90IGluICdiJy4KCi5UUApGY0Jvb2wgRmNDaGFyU2V0SXNTdWJzZXQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQpSZXR1cm5zIHdoZXRoZXIgJ2EnIGlzIGEgc3Vic2V0IG9mICdiJy4KCi5UUApGY0NoYXIzMiBGY0NoYXJTZXRGaXJzdFBhZ2UgKGNvbnN0IEZjQ2hhclNldCAqYSwgRmNDaGFyMzIgW0ZDX0NIQVJTRVRfTUFQX1NJWkVdLCBGY0NoYXIzMiAqbmV4dCkKQnVpbGRzIGFuIGFycmF5IG9mIGJpdHMgbWFya2luZyB0aGUgZmlyc3QgcGFnZSBvZiBVbmljb2RlIGNvdmVyYWdlIG9mICdhJy4KUmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgYXJyYXkuICAnbmV4dCcgY29udGFpbnMgdGhlIG5leHQgcGFnZSBpbiB0aGUgZm9udC4KCi5UUApGY0NoYXIzMiBGY0NoYXJTZXROZXh0UGFnZSAoY29uc3QgRmNDaGFyU2V0ICphLCBGY0NoYXIzMiBbRkNfQ0hBUlNFVF9NQVBfU0laRV0sIEZjQ2hhcjMyICpuZXh0KQpCdWlsZHMgYW4gYXJyYXkgb2YgYml0cyBtYXJraW5nIHRoZSBVbmljb2RlIGNvdmVyYWdlIG9mICdhJyBmb3IgcGFnZSAnKm5leHQnLgpSZXR1cm5zIHRoZSBiYXNlIG9mIHRoZSBhcnJheS4gICduZXh0JyBjb250YWlucyB0aGUgbmV4dCBwYWdlIGluIHRoZSBmb250LgoKLlNTIEZjVmFsdWUKRmNWYWx1ZSBpcyBhIHN0cnVjdHVyZSBjb250YWluaW5nIGEgdHlwZSB0YWcgYW5kIGEgdW5pb24gb2YgYWxsIHBvc3NpYmxlCmRhdGF0eXBlcy4gIFRoZSB0YWcgaXMgYW4gZW51bSBvZiB0eXBlIAouQiBGY1R5cGUKYW5kIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSBtZWFzdXJlIG9mIHJ1bi10aW1lCnR5cGVjaGVja2luZywgYWx0aG91Z2ggdGhhdCBkZXBlbmRzIG9uIGNhcmVmdWwgcHJvZ3JhbW1pbmcuCgouVFAKdm9pZCBGY1ZhbHVlRGVzdHJveSAoRmNWYWx1ZSB2KQpGcmVlcyBhbnkgbWVtb3J5IHJlZmVyZW5jZWQgYnkgYHYnLiAgVmFsdWVzIG9mIHR5cGUgRmNUeXBlU3RyaW5nLApGY1R5cGVNYXRyaXggYW5kIEZjVHlwZUNoYXJTZXQgcmVmZXJlbmNlIG1lbW9yeSwgdGhlIG90aGVyIHR5cGVzIGRvIG5vdC4KCi5UUApGY1ZhbHVlIEZjVmFsdWVTYXZlIChGY1ZhbHVlIHYpClJldHVybnMgYSBjb3B5IG9mIGB2JyBkdXBsaWNhdGluZyBhbnkgb2JqZWN0IHJlZmVyZW5jZWQgYnkgaXQgc28gdGhhdCBgdicKbWF5IGJlIHNhZmVseSBkZXN0cm95ZWQgd2l0aG91dCBoYXJtaW5nIHRoZSBuZXcgdmFsdWUuCgouU1MgRmNQYXR0ZXJuCkFuIEZjUGF0dGVybiBpcyBhbiBvcGFxdWUgdHlwZSB0aGF0IGhvbGRzIGJvdGggcGF0dGVybnMgdG8gbWF0Y2ggYWdhaW5zdCB0aGUKYXZhaWxhYmxlIGZvbnRzLCBhcyB3ZWxsIGFzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGZvbnQuCgouVFAKRmNQYXR0ZXJuICpGY1BhdHRlcm5DcmVhdGUgKHZvaWQpCkNyZWF0ZXMgYSBwYXR0ZXJuIHdpdGggbm8gcHJvcGVydGllczsgdXNlZCB0byBidWlsZCBwYXR0ZXJucyBmcm9tIHNjcmF0Y2guCgouVFAKdm9pZCBGY1BhdHRlcm5EZXN0cm95IChGY1BhdHRlcm4gKnApCkRlc3Ryb3lzIGEgcGF0dGVybiwgaW4gdGhlIHByb2Nlc3MgZGVzdHJveWluZyBhbGwgcmVsYXRlZCB2YWx1ZXMuCgouVFAKRmNCb29sIEZjUGF0dGVybkVxdWFsIChjb25zdCBGY1BhdHRlcm4gKnBhLCBjb25zdCBGY1BhdHRlcm4gKnBiKTsKUmV0dXJucyB3aGV0aGVyICdwYScgYW5kICdwYicgYXJlIGV4YWN0bHkgYWxpa2UuCgouVFAKRmNCb29sIEZjUGF0dGVybkVxdWFsU3Vic2V0IChjb25zdCBGY1BhdHRlcm4gKnBhLCBjb25zdCBGY1BhdHRlcm4gKnBiLCBjb25zdCBGY09iamVjdFNldCAqb3MpClJldHVybnMgd2hldGhlciAncGEnIGFuZCAncGInIGhhdmUgZXhhY3RseSB0aGUgc2FtZSB2YWx1ZXMgZm9yIGFsbCBvZiB0aGUKb2JqZWN0cyBpbiAnb3MnLgoKLlRQCkZjQ2hhcjMyIEZjUGF0dGVybkhhc2ggKGNvbnN0IEZjUGF0dGVybiAqcCkKUmV0dXJucyBhIDMyLWJpdCBudW1iZXIgd2hpY2ggaXMgdGhlIHNhbWUgZm9yIGFueSB0d28gcGF0dGVybnMgd2hpY2ggYXJlCmV4YWN0bHkgYWxpa2UuCgouVFAKRmNCb29sIEZjUGF0dGVybkFkZCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjVmFsdWUgdmFsdWUsIEZjQm9vbCBhcHBlbmQpCkFkZHMgYSBzaW5nbGUgdmFsdWUgdG8gdGhlIGxpc3Qgb2YgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbmFtZWQKYG9iamVjdCcuICBJZiBgYXBwZW5kJyBpcyBGY1RydWUsIHRoZSB2YWx1ZSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIGFueQpleGlzdGluZyBsaXN0LCBvdGhlcndpc2UgaXQgaXMgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2luaW5nLiAgYHZhbHVlJyBpcyBzYXZlZAood2l0aCBGY1ZhbHVlU2F2ZSkgd2hlbiBpbnNlcnRlZCBpbnRvIHRoZSBwYXR0ZXJuIHNvIHRoYXQgdGhlIGxpYnJhcnkKcmV0YWlucyBubyByZWZlcmVuY2UgdG8gYW55IGFwcGxpY2F0aW9uLXN1cHBsaWVkIGRhdGEgc3RydWN0dXJlLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5BZGRXZWFrIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZSwgRmNCb29sIGFwcGVuZCkKRmNQYXR0ZXJuQWRkV2VhayBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBGY1BhdHRlcm5BZGQgZXhjZXB0IHRoYXQgYW55CnZhbHVlcyBhZGRlZCB0byB0aGUgbGlzdCBoYXZlIGJpbmRpbmcgJ3dlYWsnIGluc3RlYWQgb2YgJ3N0cm9uZycuCgouVFAKRmNCb29sIEZjUGF0dGVybkFkZEludGVnZXIgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaSkKLlRRCkZjQm9vbCBGY1BhdHRlcm5BZGREb3VibGUgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBkb3VibGUgZCkKLlRRCkZjQm9vbCBGY1BhdHRlcm5BZGRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBjaGFyICpzKQouVFEKRmNCb29sIEZjUGF0dGVybkFkZE1hdHJpeCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjTWF0cml4ICpzKQouVFEKRmNCb29sIEZjUGF0dGVybkFkZENoYXJTZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY0NoYXJTZXQgKmMpCi5UUQpGY0Jvb2wgRmNQYXR0ZXJuQWRkQm9vbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjQm9vbCBiKQpUaGVzZSBhcmUgYWxsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0aGF0IGluc2VydCBvYmplY3RzIG9mIHRoZSBzcGVjaWZpZWQKdHlwZSBpbnRvIHRoZSBwYXR0ZXJuLiAgVXNlIHRoZXNlIGluIHByZWZlcmVuY2UgdG8gRmNQYXR0ZXJuQWRkIGFzIHRoZXkKd2lsbCBwcm92aWRlIGNvbXBpbGUtdGltZSB0eXBlY2hlY2tpbmcuICBUaGVzZSBhbGwgYXBwZW5kIHZhbHVlcyB0bwphbnkgZXhpc3RpbmcgbGlzdCBvZiB2YWx1ZXMuCgouVFAKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGlkLCBGY1ZhbHVlICp2KQpSZXR1cm5zIGluIGB2JyB0aGUgYGlkJ3RoIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgYG9iamVjdCcuClRoZSB2YWx1ZSByZXR1cm5lZCBpcyBub3QgYSBjb3B5LCBidXQgcmF0aGVyIHJlZmVycyB0byB0aGUgZGF0YSBzdG9yZWQKd2l0aGluIHRoZSBwYXR0ZXJuIGRpcmVjdGx5LiAgQXBwbGljYXRpb25zIG11c3Qgbm90IGZyZWUgdGhpcyB2YWx1ZS4KCi5UUApGY1Jlc3VsdCBGY1BhdHRlcm5HZXRJbnRlZ2VyIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIGludCAqaSk7Ci5UUQpGY1Jlc3VsdCBGY1BhdHRlcm5HZXREb3VibGUgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgZG91YmxlICpkKTsKLlRRCkZjUmVzdWx0IEZjUGF0dGVybkdldFN0cmluZyAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBjaGFyICoqY29uc3Qgcyk7Ci5UUQpGY1Jlc3VsdCBGY1BhdHRlcm5HZXRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNNYXRyaXggKipzKTsKLlRRCkZjUmVzdWx0IEZjUGF0dGVybkdldENoYXJTZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNDaGFyU2V0ICoqYyk7Ci5UUQpGY1Jlc3VsdCBGY1BhdHRlcm5HZXRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQm9vbCAqYik7ClRoZXNlIGFyZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdGhhdCBjYWxsIEZjUGF0dGVybkdldCBhbmQgdmVyaWZ5IHRoYXQgdGhlCnJldHVybmVkIGRhdGEgaXMgb2YgdGhlIGV4cGVjdGVkIHR5cGUuIFRoZXkgcmV0dXJuIEZjUmVzdWx0VHlwZU1pc21hdGNoIGlmCnRoaXMgaXMgbm90IHRoZSBjYXNlLiAgTm90ZSB0aGF0IHRoZXNlIChsaWtlIEZjUGF0dGVybkdldCkgZG8gbm90IG1ha2UgYQpjb3B5IG9mIGFueSBkYXRhIHN0cnVjdHVyZSByZWZlcmVuY2VkIGJ5IHRoZSByZXR1cm4gdmFsdWUuICBVc2UgdGhlc2UKaW4gcHJlZmVyZW5jZSB0byBGY1BhdHRlcm5HZXQgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUgdHlwZWNoZWNraW5nLgoKLlRQCkZjUGF0dGVybiAqRmNQYXR0ZXJuQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgLi4uKTsKLlRRCkZjUGF0dGVybiAqRmNQYXR0ZXJuVmFCdWlsZCAoRmNQYXR0ZXJuICpvcmlnLCB2YV9saXN0IHZhKQpCdWlsZHMgYSBwYXR0ZXJuIHVzaW5nIGEgbGlzdCBvZiBvYmplY3RzLCB0eXBlcyBhbmQgdmFsdWVzLiAgRWFjaAp2YWx1ZSB0byBiZSBlbnRlcmVkIGluIHRoZSBwYXR0ZXJuIGlzIHNwZWNpZmllZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKLklQCjEuIE9iamVjdCBuYW1lLCBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9wZXJ0eSB0byBiZSBhZGRlZC4KLklQCjIuIE9iamVjdCB0eXBlLCBvbmUgb2YgdGhlIEZjVHlwZSBlbnVtZXJhdGVkIHZhbHVlcwouSVAKMy4gVmFsdWUsIG5vdCBhbiBGY1ZhbHVlLCBidXQgdGhlIHJhdyB0eXBlIGFzIHBhc3NlZCB0byBhbnkgb2YgdGhlCkZjUGF0dGVybkFkZDx0eXBlPiBmdW5jdGlvbnMuICBNdXN0IG1hdGNoIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQuCi5JUApUaGUgYXJndW1lbnQgbGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBvYmplY3QgbmFtZSwgbm8gb2JqZWN0IHR5cGUgbm9yCnZhbHVlIG5lZWQgYmUgcGFzc2VkIGZvciB0aGlzLiAgVGhlIHZhbHVlcyBhcmUgYWRkZWQgdG8gYHBhdHRlcm4nLCBpZgpgcGF0dGVybicgaXMgbnVsbCwgYSBuZXcgcGF0dGVybiBpcyBjcmVhdGVkLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBwYXR0ZXJuIGlzCnJldHVybmVkLiBFeGFtcGxlOgouUlMKLklQCnBhdHRlcm4gPSBGY1BhdHRlcm5CdWlsZCAoMCwgRkNfRkFNSUxZLCBGdFR5cGVTdHJpbmcsICJUaW1lcyIsIChjaGFyICopIDApOwouUkUKLklQCkZjUGF0dGVyblZhQnVpbGQgaXMgdXNlZCB3aGVuIHRoZSBhcmd1bWVudHMgYXJlIGFscmVhZHkgaW4gdGhlIGZvcm0gb2YgYQp2YXJhcmdzIHZhbHVlLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5EZWwgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0KQpEZWxldGVzIGFsbCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBgb2JqZWN0JywgcmV0dXJuaW5nIAp3aGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdGVkIG9yIG5vdC4KCi5UUAp2b2lkIEZjUGF0dGVyblByaW50IChjb25zdCBGY1BhdHRlcm4gKnApClByaW50cyBhbiBlYXNpbHkgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgcGF0dGVybiB0byBzdGRvdXQuICBUaGVyZSBpcwpubyBwcm92aXNpb24gZm9yIHJlcGFyc2luZyBkYXRhIGluIHRoaXMgZm9ybWF0LCBpdCdzIGp1c3QgZm9yIGRpYWdub3N0aWNzCmFuZCBkZWJ1Z2dpbmcuCgouVFAKdm9pZCBGY0RlZmF1bHRTdWJzdGl0dXRlIChGY1BhdHRlcm4gKnBhdHRlcm4pClN1cHBsaWVzIGRlZmF1bHQgdmFsdWVzIGZvciB1bmRlcnNwZWNpZmllZCBmb250IHBhdHRlcm5zOgouUlMKLklQIFwoYnUgClBhdHRlcm5zIHdpdGhvdXQgYSBzcGVjaWZpZWQgc3R5bGUgb3Igd2VpZ2h0IGFyZSBzZXQgdG8gTWVkaXVtCi5JUCBcKGJ1ClBhdHRlcm5zIHdpdGhvdXQgYSBzcGVjaWZpZWQgc3R5bGUgb3Igc2xhbnQgYXJlIHNldCB0byBSb21hbgouSVAgXChidQpQYXR0ZXJucyB3aXRob3V0IGEgc3BlY2lmaWVkIHBpeGVsIHNpemUgYXJlIGdpdmVuIG9uZSBjb21wdXRlZCBmcm9tCmFueSBzcGVjaWZpZWQgcG9pbnQgc2l6ZSAoZGVmYXVsdCAxMiksIGRwaSAoZGVmYXVsdCA3NSkgYW5kIHNjYWxlIChkZWZhdWx0CjEpLgouUkUKCi5UUApGY1BhdHRlcm4gKkZjTmFtZVBhcnNlIChjb25zdCBjaGFyICpuYW1lKQpDb252ZXJ0cyAnbmFtZScgZnJvbSB0aGUgc3RhbmRhcmQgdGV4dCBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlIGludG8gYSBwYXR0ZXJuLgoKLlRQCkZjQ2hhcjggKkZjTmFtZVVucGFyc2UgKEZjUGF0dGVybiAqcGF0KQpDb252ZXJ0cyB0aGUgZ2l2ZW4gcGF0dGVybiBpbnRvIHRoZSBzdGFuZGFyZCB0ZXh0IGZvcm1hdCBkZXNjcmliZWQgYWJvdmUuClRoZSByZXR1cm4gdmFsdWUgaXMgbm90IHN0YXRpYywgYnV0IGluc3RlYWQgcmVmZXJzIHRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkKd2hpY2ggc2hvdWxkIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCgouU1MgRmNGb250U2V0CkFuIEZjRm9udFNldCBzaW1wbHkgaG9sZHMgYSBsaXN0IG9mIHBhdHRlcm5zOyB0aGVzZSBhcmUgdXNlZCB0byByZXR1cm4gdGhlCnJlc3VsdHMgb2YgbGlzdGluZyBhdmFpbGFibGUgZm9udHMuCi5UUApGY0ZvbnRTZXQgKkZjRm9udFNldENyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBmb250IHNldC4KCi5UUAp2b2lkIEZjRm9udFNldERlc3Ryb3kgKEZjRm9udFNldCAqcyk7CkRlc3Ryb3lzIGEgZm9udCBzZXQuICBOb3RlIHRoYXQgdGhpcyBkZXN0cm95cyBhbnkgcmVmZXJlbmNlZCBwYXR0ZXJucyBhcwp3ZWxsLgoKLlRQCkZjQm9vbCBGY0ZvbnRTZXRBZGQgKEZjRm9udFNldCAqcywgRmNQYXR0ZXJuICpmb250KQpBZGRzIGEgcGF0dGVybiB0byBhIGZvbnQgc2V0LiAgTm90ZSB0aGF0IHRoZSBwYXR0ZXJuIGlzIG5vdCBjb3BpZWQgYmVmb3JlCmJlaW5nIGluc2VydGVkIGludG8gdGhlIHNldC4KCi5TUyBGY09iamVjdFNldApBbiBGY09iamVjdFNldCBob2xkcyBhIGxpc3Qgb2YgcGF0dGVybiBwcm9wZXJ0eSBuYW1lczsgaXQgaXMgdXNlZCB0bwppbmRpY2lhdGUgd2hpY2ggcHJvcGVydGllcyBhcmUgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHBhdHRlcm5zIGZyb20KRmNGb250TGlzdC4KCi5UUApGY09iamVjdFNldCAqRmNPYmplY3RTZXRDcmVhdGUgKHZvaWQpCkNyZWF0ZXMgYW4gZW1wdHkgc2V0LgoKLlRQCkZjQm9vbCBGY09iamVjdFNldEFkZCAoRmNPYmplY3RTZXQgKm9zLCBjb25zdCBjaGFyICpvYmplY3QpCkFkZHMgYSBwcm9wcmV0eSBuYW1lIHRvIHRoZSBzZXQuCgouVFAKdm9pZCBGY09iamVjdFNldERlc3Ryb3kgKEZjT2JqZWN0U2V0ICpvcykKRGVzdHJveXMgYW4gb2JqZWN0IHNldC4KCgouVFAKRmNPYmplY3RTZXQgKkZjT2JqZWN0U2V0QnVpbGQgKGNvbnN0IGNoYXIgKmZpcnN0LCAuLi4pCi5UUQpGY09iamVjdFNldCAqRmNPYmplY3RTZXRWYUJ1aWxkIChjb25zdCBjaGFyICpmaXJzdCwgdmFfbGlzdCB2YSkKVGhlc2UgYnVpbGQgYW4gb2JqZWN0IHNldCBmcm9tIGEgbnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMuCgouU1MgRmNPYmplY3RUeXBlClByb3ZpZGVzIGZvciBhcHBsY2F0aW9uLXNwZWNpZmllZCBmb250IG5hbWUgb2JqZWN0IHR5cGVzIHNvIHRoYXQgbmV3CnBhdHRlcm4gZWxlbWVudHMgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIGZvbnQgbmFtZXMuCgouVFAKRmNCb29sIEZjTmFtZVJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZSkKUmVnaXN0ZXIgJ250eXBlJyBuZXcgb2JqZWN0IHR5cGVzLgoKLlRQCkZjQm9vbCBGY05hbWVVbnJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZSkKVW5yZWdpc3RlciAnbnR5cGUnIG9iamVjdCB0eXBlcy4KICAgIAouVFAKY29uc3QgRmNPYmplY3RUeXBlICpGY05hbWVHZXRPYmplY3RUeXBlIChjb25zdCBjaGFyICpvYmplY3QpClJldHVybiB0aGUgb2JqZWN0IHR5cGUgZm9yIHRoZSBwYXR0ZXJuIGVsZW1lbnQgbmFtZWQgJ29iamVjdCcuCgouU1MgRmNDb25zdGFudApQcm92aWRlcyBmb3IgYXBwbGljYXRpb24tc3BlY2lmaWVkIHN5bWJvbGljIGNvbnN0YW50cyBmb3IgZm9udCBuYW1lcy4KCi5UUApGY0Jvb2wgRmNOYW1lUmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpClJlZ2lzdGVyICduY29uc3RzJyBuZXcgc3ltYm9saWMgY29uc3RhbnRzLgoKLlRQCkZjQm9vbCBGY05hbWVVbnJlZ2lzdGVyQ29uc3RhbnRzIChjb25zdCBGY0NvbnN0YW50ICpjb25zdHMsIGludCBuY29uc3RzKQpVbnJlZ2lzdGVyICduY29uc3RzJyBzeW1ib2xpYyBjb25zdGFudHMuCiAgICAKLlRQCmNvbnN0IEZjQ29uc3RhbnQgKkZjTmFtZUdldENvbnN0YW50IChGY0NoYXI4ICpzdHJpbmcpClJldHVybiB0aGUgRmNDb25zdGFudCBzdHJ1Y3R1cmUgcmVsYXRlZCB0byBzeW1ib2xpYyBjb25zdGFudCAnc3RyaW5nJy4KCi5UUApGY0Jvb2wgRmNOYW1lQ29uc3RhbnQgKEZjQ2hhcjggKnN0cmluZywgaW50ICpyZXN1bHQpOwpSZXR1cm5zIHdoZXRoZXIgYSBzeW1ib2xpYyBjb25zdGFudCB3aXRoIG5hbWUgJ3N0cmluZycgaXMgcmVnaXN0ZXJlZCwKcGxhY2luZyB0aGUgdmFsdWUgb2YgdGhlIGNvbnN0YW50IGluICdyZXN1bHQnIGlmIHByZXNlbnQuCgouU1MgRmNCbGFua3MKQW4gRmNCbGFua3Mgb2JqZWN0IGhvbGRzIGEgbGlzdCBvZiBVbmljb2RlIGNoYXJzIHdoaWNoIGFyZSBleHBlY3RlZCB0bwpiZSBibGFuayB3aGVuIGRyYXduLiAgV2hlbiBzY2FubmluZyBuZXcgZm9udHMsIGFueSBnbHlwaHMgd2hpY2ggYXJlCmVtcHR5IGFuZCBub3QgaW4gdGhpcyBsaXN0IHdpbGwgYmUgYXNzdW1lZCB0byBiZSBicm9rZW4gYW5kIG5vdCBwbGFjZWQgaW4KdGhlIEZjQ2hhclNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGZvbnQuICBUaGlzIHByb3ZpZGVzIGEgc2lnbmlmaWNhbnRseSBtb3JlCmFjY3VyYXRlIENoYXJTZXQgZm9yIGFwcGxpY2F0aW9ucy4KCi5UUApGY0JsYW5rcyAqRmNCbGFua3NDcmVhdGUgKHZvaWQpCkNyZWF0ZXMgYW4gZW1wdHkgRmNCbGFua3Mgb2JqZWN0LgoKLlRQCnZvaWQgRmNCbGFua3NEZXN0cm95IChGY0JsYW5rcyAqYikKRGVzdHJveXMgYW4gRmNCbGFua3Mgb2JqZWN0LCBmcmVlaW5nIGFueSBhc3NvY2lhdGVkIG1lbW9yeS4KCi5UUApGY0Jvb2wgRmNCbGFua3NBZGQgKEZjQmxhbmtzICpiLCBGY0NoYXIzMiB1Y3M0KQpBZGRzIGEgc2luZ2xlIGNoYXJhY3RlciB0byBhbiBGY0JsYW5rcyBvYmplY3QsIHJldHVybmluZyBGY0ZhbHNlCmlmIHRoaXMgcHJvY2VzcyByYW4gb3V0IG9mIG1lbW9yeS4KCi5UUApGY0Jvb2wgRmNCbGFua3NJc01lbWJlciAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpClJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIEZjQmxhbmtzIG9iamVjdCBjb250YWlucyB0aGUgaW5kaWNhdGVkIFVuaWNvZGUKdmFsdWUuCgouU1MgRmNDb25maWcKQW4gRmNDb25maWcgb2JqZWN0IGhvbGRzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24uClRoZXJlIGlzIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdoaWNoIGFwcGxpY2F0aW9ucyBtYXkgdXNlIGJ5IHBhc3NpbmcgMCB0bwphbnkgZnVuY3Rpb24gdXNpbmcgdGhlIGRhdGEgd2l0aGluIGFuIEZjQ29uZmlnLgoKLlRQCkZjQ29uZmlnICpGY0NvbmZpZ0NyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBjb25maWd1cmF0aW9uLgoKLlRQCnZvaWQgRmNDb25maWdEZXN0cm95IChGY0NvbmZpZyAqY29uZmlnKQpEZXN0cm95cyBhIGNvbmZpZ3VyYXRpb24gYW5kIGFueSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4gIE5vdGUgdGhhdCBjYWxsaW5nCnRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcmV0dXJuIGZyb20gRmNDb25maWdHZXRDdXJyZW50IHdpbGwgcGxhY2UgdGhlIGxpYnJhcnkKaW4gYW4gaW5kZXRlcm1pbmF0ZSBzdGF0ZS4KCi5UUApGY0Jvb2wgRmNDb25maWdTZXRDdXJyZW50IChGY0NvbmZpZyAqY29uZmlnKQpTZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byAnY29uZmlnJy4gIEltcGxpY2l0bHkgY2FsbHMKRmNDb25maWdCdWlsZEZvbnRzIGlmIG5lY2Vzc2FyeSwgcmV0dXJuaW5nIEZjRmFsc2UgaWYgdGhhdCBjYWxsIGZhaWxzLgoKLlRQCkZjQ29uZmlnICpGY0NvbmZpZ0dldEN1cnJlbnQgKHZvaWQpClJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb25maWd1cmF0aW9uLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ1VwdG9EYXRlIChGY0NvbmZpZyAqY29uZmlnKQpDaGVja3MgYWxsIG9mIHRoZSBmaWxlcyByZWxhdGVkIHRvICdjb25maWcnIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlCmluLW1lbW9yeSB2ZXJzaW9uIGlzIGluIHN5bmMgd2l0aCB0aGUgZGlzayB2ZXJzaW9uLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ0J1aWxkRm9udHMgKEZjQ29uZmlnICpjb25maWcpCkJ1aWxkcyB0aGUgc2V0IG9mIGF2YWlsYWJsZSBmb250cyBmb3IgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uICBOb3RlIHRoYXQKYW55IGNoYW5nZXMgdG8gdGhlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhpcyBjYWxsIGhhdmUgaW5kZXRlcm1pbmF0ZSBlZmZlY3RzLgpSZXR1cm5zIEZjRmFsc2UgaWYgdGhpcyBvcGVyYXRpb24gcnVucyBvdXQgb2YgbWVtb3J5LgoKLlRQCkZjU3RyTGlzdCAqRmNDb25maWdHZXRDb25maWdEaXJzIChGY0NvbmZpZyAqY29uZmlnKQpSZXR1cm5zIHRoZSBsaXN0IG9mIGZvbnQgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCmZvciAnY29uZmlnJy4gIERvZXMgbm90IGluY2x1ZGUgYW55IHN1YmRpcmVjdG9yaWVzLgoKLlRQCkZjU3RyTGlzdCAqRmNDb25maWdHZXRGb250RGlycyAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgbGlzdCBvZiBmb250IGRpcmVjdG9yaWVzIGluICdjb25maWcnLiBUaGlzIGluY2x1ZGVzIHRoZQpjb25maWd1cmVkIGZvbnQgZGlyZWN0b3JpZXMgYWxvbmcgd2l0aCBhbnkgZGlyZWN0b3JpZXMgYmVsb3cgdGhvc2UgaW4gdGhlCmZpbGVzeXN0ZW0uCgouVFAKRmNTdHJMaXN0ICpGY0NvbmZpZ0dldENvbmZpZ0ZpbGVzIChGY0NvbmZpZyAqY29uZmlnKQpSZXR1cm5zIHRoZSBsaXN0IG9mIGtub3duIGNvbmZpZ3VyYXRpb24gZmlsZXMgdXNlZCB0byBnZW5lcmF0ZSAnY29uZmlnJy4KTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgaW5jbHVkZSBhbnkgY29uZmlndXJhdGlvbiBkb25lIHdpdGggRmNDb25maWdQYXJzZS4KCi5UUApjaGFyICpGY0NvbmZpZ0dldENhY2hlIChGY0NvbmZpZyAqY29uZmlnKQpSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHVzZWQgdG8gc3RvcmUgcGVyLXVzZXIgZm9udCBpbmZvcm1hdGlvbi4KCi5UUApGY0ZvbnRTZXQgKkZjQ29uZmlnR2V0Rm9udHMgKEZjQ29uZmlnICpjb25maWcsIEZjU2V0TmFtZSBzZXQpClJldHVybnMgb25lIG9mIHRoZSB0d28gc2V0cyBvZiBmb250cyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGFzIHNwZWNpZmllZCAKYnkgJ3NldCcuCgouVFAKRmNCbGFua3MgKkZjQ29uZmlnR2V0QmxhbmtzIChGY0NvbmZpZyAqY29uZmlnKQpSZXR1cm5zIHRoZSBGY0JsYW5rcyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLCBpZiBubwpibGFua3Mgd2VyZSBwcmVzZW50IGluIHRoZSBjb25maWd1cmF0aW9uLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAuCgouVFAKaW50IEZjQ29uZmlnR2V0UmVzY2FuSW52ZXJ2YWwgKEZjQ29uZmlnICpjb25maWcpClJldHVybnMgdGhlIGludGVydmFsIGJldHdlZW4gYXV0b21hdGljIGNoZWNrcyBvZiB0aGUgY29uZmlndXJhdGlvbiAoaW4Kc2Vjb25kcykgc3BlY2lmaWVkIGluICdjb25maWcnLiAgVGhlIGNvbmZpZ3VyYXRpb24gaXMgY2hlY2tlZCBkdXJpbmcKYSBjYWxsIHRvIEZjRm9udExpc3Qgd2hlbiB0aGlzIGludGVydmFsIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCgouVFAKRmNCb29sIEZjQ29uZmlnU2V0UmVzY2FuSW52ZXJ2YWwgKEZjQ29uZmlnICpjb25maWcsIGludCByZXNjYW5JbnRlcnZhbCkKU2V0cyB0aGUgcmVzY2FuIGludGVydmFsOyByZXR1cm5zIEZjRmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCgouVFAKRmNCb29sIEZjQ29uZmlnQXBwRm9udEFkZEZpbGUgKEZjQ29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKmZpbGUpCkFkZHMgYW4gYXBwbGljYXRpb24tc3BlY2lmaWMgZm9udCB0byB0aGUgY29uZmlndXJhdGlvbi4KCi5UUApGY0Jvb2wgRmNDb25maWdBcHBGb250QWRkRGlyIChGY0NvbmZpZyAqY29uZmlnLCBjb25zdCBjaGFyICpkaXIpClNjYW5zIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZvciBmb250cywgYWRkaW5nIGVhY2ggb25lIGZvdW5kIHRvIHRoZQphcHBsaWNhdGlvbi1zcGVjaWZpYyBzZXQgb2YgZm9udHMuCgouVFAKdm9pZCBGY0NvbmZpZ0FwcEZvbnRDbGVhciAoRmNDb25maWcgKmNvbmZpZykKQ2xlYXJzIHRoZSBzZXQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgZm9udHMuCgouVFAKRmNCb29sIEZjQ29uZmlnU3Vic3RpdHV0ZVdpdGhQYXQgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcCwgRmNQYXR0ZXJuICpwX3BhdCBGY01hdGNoS2luZCBraW5kKQpQZXJmb3JtcyB0aGUgc2VxdWVuY2Ugb2YgcGF0dGVybiBtb2RpZmljYXRpb24gb3BlcmF0aW9ucywgaWYgJ2tpbmQnIGlzCkZjTWF0Y2hQYXR0ZXJuLCB0aGVuIHRob3NlIHRhZ2dlZCBhcyBwYXR0ZXJuIG9wZXJhdGlvbnMgYXJlIGFwcGxpZWQsIGVsc2UgCmlmICdraW5kJyBpcyBGY01hdGNoRm9udCwgdGhvc2UgdGFnZ2VkIGFzIGZvbnQgb3BlcmF0aW9ucyBhcmUgYXBwbGllZCBhbmQKcF9wYXQgaXMgdXNlZCBmb3IgPHRlc3Q+IGVsZW1lbnRzIHdpdGggdGFyZ2V0PXBhdHRlcm4uCgouVFAKRmNCb29sIEZjQ29uZmlnU3Vic3RpdHV0ZSAoRmNDb25maWcgKmNvbmZpZywgRmNQYXR0ZXJuICpwLCBGY01hdGNoS2luZCBraW5kKQpDYWxscyBGY0NvbmZpZ1N1YnN0aXR1dGVXaXRoUGF0IHNldHRpbmcgcF9wYXQgdG8gTlVMTC4KCi5UUApGY1BhdHRlcm4gKkZjRm9udE1hdGNoIChGY0NvbmZpZyAqY29uZmlnLCBGY1BhdHRlcm4gKnAsIEZjUmVzdWx0ICpyZXN1bHQpClJldHVybnMgdGhlIGZvbnQgaW4gJ2NvbmZpZycgbW9zdCBjbG9zZSBtYXRjaGluZyAncCcuICBUaGlzIGZ1bmN0aW9uCnNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlciBGY0NvbmZpZ1N1YnN0aXR1dGUgYW5kIEZjRGVmYXVsdFN1YnN0aXR1dGUgaGF2ZQpiZWVuIGNhbGxlZCBmb3IgJ3AnOyBvdGhlcndpc2UgdGhlIHJlc3VsdHMgd2lsbCBub3QgYmUgY29ycmVjdC4KCi5UUApGY0ZvbnRTZXQgKkZjRm9udFNvcnQgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcCwgRmNCb29sIHRyaW0sIEZjQ2hhclNldCAqKmNzcCwgRmNSZXN1bHQgKnJlc3VsdCkgUmV0dXJucyB0aGUgbGlzdCBvZiBmb250cyBzb3J0ZWQgYnkKY2xvc2VuZXNzIHRvICdwJy4gIElmICd0cmltJyBpcyBGY1RydWUsIGVsZW1lbnRzIGluIHRoZSBsaXN0IHdoaWNoIGRvbid0CmluY2x1ZGUgVW5pY29kZSBjb3ZlcmFnZSBub3QgcHJvdmlkZWQgYnkgZWFybGllciBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcmUKZWxpZGVkLiAgVGhlIHVuaW9uIG9mIFVuaWNvZGUgY292ZXJhZ2Ugb2YgYWxsIG9mIHRoZSBmb250cyBpcyByZXR1cm5lZAppbiAnY3NwJywgaWYgJ2NzcCcgaXMgbm90IE5VTEwuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlcgpGY0NvbmZpZ1N1YnN0aXR1dGUgYW5kIEZjRGVmYXVsdFN1YnN0aXR1dGUgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgJ3AnOwpvdGhlcndpc2UgdGhlIHJlc3VsdHMgd2lsbCBub3QgYmUgY29ycmVjdC4KLlAKVGhlIHJldHVybmVkIEZjRm9udFNldCByZWZlcmVuY2VzIEZjUGF0dGVybiBzdHJ1Y3R1cmVzIHdoaWNoIG1heSBiZSBzaGFyZWQKYnkgdGhlIHJldHVybiB2YWx1ZSBmcm9tIG11bHRpcGxlIEZjRm9udFNvcnQgY2FsbHMsIGFwcGxpY2F0aW9ucyBtdXN0IG5vdAptb2RpZnkgdGhlc2UgcGF0dGVybnMuICBJbnN0ZWFkLCB0aGV5IHNob3VsZCBiZSBwYXNzZWQsIGFsb25nIHdpdGggJ3AnIHRvCkZjRm9udFJlbmRlclByZXBhcmUgd2hpY2ggY29tYmluZXMgdGhlbSBpbnRvIGEgY29tcGxldGUgcGF0dGVybi4KLlAKVGhlIEZjRm9udFNldCByZXR1cm5lZCBieSBGY0ZvbnRTb3J0IGlzIGRlc3Ryb3llZCBieSBjYWxpbmcgRmNGb250U2V0RGVzdHJveS4KCi5UUApGY1BhdHRlcm4gKkZjRm9udFJlbmRlclByZXBhcmUgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcGF0LCBGY1BhdHRlcm4gKmZvbnQpCkNyZWF0ZXMgYSBuZXcgcGF0dGVybiBjb25zaXN0aW5nIG9mIGVsZW1lbnRzIG9mICdmb250JyBub3QgYXBwZWFyaW5nCmluICdwYXQnLCBlbGVtZW50cyBvZiAncGF0JyBub3QgYXBwZWFyaW5nIGluICdmb250JyBhbmQgdGhlIGJlc3QgbWF0Y2hpbmcKdmFsdWUgZnJvbSAncGF0JyBmb3IgZWxlbWVudHMgYXBwZWFyaW5nIGluIGJvdGguICBUaGUgcmVzdWx0IGlzIHBhc3NlZCB0bwpGY0NvbmZpZ1N1YnN0aXR1dGUgd2l0aCAna2luZCcgRmNNYXRjaEZvbnQgYW5kIHRoZW4gcmV0dXJuZWQuCgouVFAKRmNGb250U2V0ICpGY0ZvbnRMaXN0IChGY0NvbmZpZyAqY29uZmlnLCBGY1BhdHRlcm4gKnAsIEZjT2JqZWN0U2V0ICpvcykKU2VsZWN0cyBmb250cyBtYXRjaGluZyAncCcsIGNyZWF0ZXMgcGF0dGVybnMgZnJvbSB0aG9zZSBmb250cyBjb250YWluaW5nCm9ubHkgdGhlIG9iamVjdHMgaW4gJ29zJyBhbmQgcmV0dXJucyB0aGUgc2V0IG9mIHVuaXF1ZSBzdWNoIHBhdHRlcm5zLgoKLlRQCmNoYXIgKkZjQ29uZmlnRmlsZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCkdpdmVuIHRoZSBzcGVjaWZpZWQgZXh0ZXJuYWwgZW50aXR5IG5hbWUsIHJldHVybiB0aGUgYXNzb2NpYXRlZCBmaWxlbmFtZS4KVGhpcyBwcm92aWRlcyBhcHBsaWNhdGlvbnMgYSB3YXkgdG8gY29udmVydCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gZmlsZQpyZWZlcmVuY2VzIGludG8gZmlsZW5hbWUgZm9ybS4gCi5QCkEgbnVsbCBvciBlbXB0eSAnbmFtZScgaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIHNob3VsZApiZSB1c2VkOyB3aGljaCBmaWxlIHRoaXMgcmVmZXJlbmNlcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZQpGQ19DT05GSUdfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIE5leHQsIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoICd+JywgaXQKcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudCB1c2VycyBob21lIGRpcmVjdG9yeS4gIE90aGVyd2lzZSBpZiB0aGUgbmFtZQpkb2Vzbid0IHN0YXJ0IHdpdGggJy8nLCBpdCByZWZlcnMgdG8gYSBmaWxlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KZGlyZWN0b3J5OyB0aGUgYnVpbHQtaW4gZGVmYXVsdCBkaXJlY3RvcnkgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUKRkNfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KCi5TUyBJbml0aWFsaXphdGlvbgpUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgdGhlIGxpYnJhcnkgaXMgaW5pdGlhbGl6ZWQuCgouVFAKRmNDb25maWcgKkZjSW5pdExvYWRDb25maWcgKHZvaWQpCkxvYWRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24uCkRvZXMgbm90IGxvYWQgYW55IGZvbnQgaW5mb3JtYXRpb24uCgouVFAKRmNDb25maWcgKkZjSW5pdExvYWRDb25maWdBbmRGb250cyAodm9pZCkKTG9hZHMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBidWlsZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCmF2YWlsYWJsZSBmb250cy4gIFJldHVybnMgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uLgoKLlRQCkZjQm9vbCBGY0luaXQgKHZvaWQpCkxvYWRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgdGhlIGZvbnRzIHJlZmVyZW5jZWQgdGhlcmVpbiBhbmQKc2V0cyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIHRoYXQgcmVzdWx0LiAgUmV0dXJucyB3aGV0aGVyIHRoaXMKcHJvY2VzcyBzdWNjZWVkZWQgb3Igbm90LiAgSWYgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBoYXMgYWxyZWFkeQpiZWVuIGxvYWRlZCwgdGhpcyByb3V0aW5lIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBGY1RydWUuCgouVFAKaW50IEZjR2V0VmVyc2lvbiAodm9pZCkKUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuCgouVFAKRmNCb29sIEZjSW5pdFJlaW5pdGlhbGl6ZSAodm9pZCkKRm9yY2VzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSByZWxvYWRlZCBhbmQgcmVzZXRzIHRoZSBkZWZhdWx0CmNvbmZpZ3VyYXRpb24uCgouVFAKRmNCb29sIEZjSW5pdEJyaW5nVXB0b0RhdGUgKHZvaWQpCkNoZWNrcyB0aGUgcmVzY2FuIGludGVydmFsIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNoZWNraW5nIHRoZQpjb25maWd1cmF0aW9uIGlmIHRoZSBpbnRlcnZhbCBoYXMgcGFzc2VkIGFuZCByZWxvYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaWYKd2hlbiBhbnkgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuCgouU1MgRmNBdG9taWMKVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgYSBzYWZlIHdheSB0byB1cGRhdGUgY29uZmlnIGZpbGVzLCBhbGxvd2luZyBvbmdvaW5nCnJlYWRpbmcgb2YgdGhlIG9sZCBjb25maWcgZmlsZSB3aGlsZSBsb2NrZWQgZm9yIHdyaXRpbmcgYW5kIGVuc3VyaW5nIHRoYXQgYQpjb25zaXN0ZW50IGFuZCBjb21wbGV0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgZmlsZSBpcyBhbHdheXMgYXZhaWxhYmxlLgoKLlRQCkZjQXRvbWljICogRmNBdG9taWNDcmVhdGUgKGNvbnN0IEZjQ2hhcjggICAqZmlsZSkKQ3JlYXRlcyBhIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgZGF0YSBuZWVkZWQgdG8gY29udHJvbCBhY2Nlc3MgdG8gJ2ZpbGUnLgpXcml0aW5nIGlzIGRvbmUgdG8gYSBzZXBhcmF0ZSBmaWxlLiAgT25jZSB0aGF0IGZpbGUgaXMgY29tcGxldGUsIHRoZSBvcmlnaW5hbApjb25maWd1cmF0aW9uIGZpbGUgaXMgYXRvbWljYWxseSByZXBsYWNlZCBzbyB0aGF0IHJlYWRpbmcgcHJvY2VzcyBhbHdheXMgc2VlCmEgY29uc2lzdGVudCBhbmQgY29tcGxldGUgZmlsZSB3aXRob3V0IHRoZSBuZWVkIHRvIGxvY2sgZm9yIHJlYWRpbmcuCgouVFAKRmNCb29sIEZjQXRvbWljTG9jayAoRmNBdG9taWMgKmF0b21pYykKQXR0ZW1wdHMgdG8gbG9jayB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5ICdhdG9taWMnLiAgUmV0dXJucyBGY0ZhbHNlIGlmIHRoZQpmaWxlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MsIGVsc2UgcmV0dXJucyBGY1RydWUgYW5kIGxlYXZlcyB0aGUgZmlsZQpsb2NrZWQuCgouVFAKRmNDaGFyOCAqRmNBdG9taWNOZXdGaWxlIChGY0F0b21pYyAqYXRvbWljKQpSZXR1cm5zIHRoZSBmaWxlbmFtZSBmb3Igd3JpdGluZyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBmaWxlIHJlZmVyZW5jZWQKYnkgJ2F0b21pYycuCgouVFAKRmNDaGFyOCAqRmNBdG9taWNPcmlnRmlsZSAoRmNBdG9taWMgKmF0b21pYykKUmV0dXJucyB0aGUgZmlsZSByZWZlcm5jZWQgYnkgJ2F0b21pYycuCgouVFAKRmNCb29sIEZjQXRvbWljUmVwbGFjZU9yaWcgKEZjQXRvbWljICphdG9taWMpClJlcGxhY2VzIHRoZSBvcmlnaW5hbCBmaWxlIHJlZmVyZW5jZWQgYnkgJ2F0b21pYycgd2l0aCB0aGUgbmV3IGZpbGUuCgouVFAKdm9pZCBGY0F0b21pY0RlbGV0ZU5ldyAoRmNBdG9taWMgKmF0b21pYykKRGVsZXRlcyB0aGUgbmV3IGZpbGUuCgouVFAKdm9pZCBGY0F0b21pY1VubG9jayAoRmNBdG9taWMgKmF0b21pYykKVW5sb2NrcyB0aGUgZmlsZS4KCi5UUAp2b2lkIEZjQXRvbWljRGVzdHJveSAoRmNBdG9taWMgKmF0b21pYykKRGVzdHJveXMgJ2F0b21pYycuCgouU1MgRnJlZVR5cGUgc3BlY2lmaWMgZnVuY3Rpb25zCi5uZgouQiAjaW5jbHVkZSA8Zm9udGNvbmZpZy9mY2ZyZWV0eXBlLmg+Ci5maQpXaGlsZSB0aGUgZm9udGNvbmZpZyBsaWJyYXJ5IGRvZXNuJ3QgaW5zaXN0IHRoYXQgRnJlZVR5cGUgYmUgdXNlZCBhcyB0aGUKcmFzdGVyaXphdGlvbiBtZWNoYW5pc20gZm9yIGZvbnRzLCBpdCBkb2VzIHByb3ZpZGUgc29tZSBjb252ZW5pZW5jZQpmdW5jdGlvbnMuCgouVFAKRlRfVUludCBGY0ZyZWVUeXBlQ2hhckluZGV4IChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQpCk1hcHMgYSBVbmljb2RlIGNoYXIgdG8gYSBnbHlwaCBpbmRleC4gIFRoaXMgZnVuY3Rpb24gdXNlcyBpbmZvcm1hdGlvbiBmcm9tCnNldmVyYWwgcG9zc2libGUgdW5kZXJseWluZyBlbmNvZGluZyB0YWJsZXMgdG8gd29yayBhcm91bmQgYnJva2VuIGZvbnRzLgpBcyBhIHJlc3VsdCwgdGhpcyBmdW5jdGlvbiBpc24ndCBkZXNpZ25lZCB0byBiZSB1c2VkIGluIHBlcmZvcm1hbmNlCnNlbnNpdGl2ZSBhcmVhczsgcmVzdWx0cyBmcm9tIHRoaXMgZnVuY3Rpb24gYXJlIGludGVuZGVkIHRvIGJlIGNhY2hlZCBieQpoaWdoZXIgbGV2ZWwgZnVuY3Rpb25zLgoKLlRQCkZjQ2hhclNldCAqRmNGcmVlVHlwZUNoYXJTZXQgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcykgU2NhbnMgYQpGcmVlVHlwZSBmYWNlIGFuZCByZXR1cm5zIHRoZSBzZXQgb2YgZW5jb2RlZCBVbmljb2RlIGNoYXJzLiAgVGhpcyBzY2FucwpzZXZlcmFsIGVuY29kaW5nIHRhYmxlcyB0byBidWlsZCBhcyBjb21wbGV0ZSBhIGxpc3QgYXMgcG9zc2libGUuICAKSWYgJ2JsYW5rcycgaXMgbm90IDAsIHRoZSBnbHlwaHMgaW4gdGhlIGZvbnQgYXJlIGV4YW1pbmVkIGFuZCBhbnkgYmxhbmsgZ2x5cGhzCm5vdCBpbiAnYmxhbmtzJyBhcmUgbm90IHBsYWNlZCBpbiB0aGUgcmV0dXJuZWQgRmNDaGFyU2V0LgoKLlRQCkZjUGF0dGVybiAqRmNGcmVlVHlwZVF1ZXJ5IChjb25zdCBjaGFyICpmaWxlLCBpbnQgaWQsIEZjQmxhbmtzICpibGFua3MsIGludCAqY291bnQpCkNvbnN0cnVjdHMgYSBwYXR0ZXJuIHJlcHJlc2VudGluZyB0aGUgJ2lkJ3RoIGZvbnQgaW4gJ2ZpbGUnLiAgVGhlIG51bWJlcgpvZiBmb250cyBpbiAnZmlsZScgaXMgcmV0dXJuZWQgaW4gJ2NvdW50Jy4KCi5TUyBYTUwgc3BlY2lmaWMgZnVuY3Rpb25zCi5UUApGY0Jvb2wgRmNDb25maWdQYXJzZUFuZExvYWQgKEZjQ29uZmlnICpjb25maWcsIGNvbnN0IEZjQ2hhcjggKmZpbGUsIEZjQm9vbCBjb21wbGFpbikKV2Fsa3MgdGhlIGNvbmZpZ3VyYXRpb24gaW4gJ2ZpbGUnIGFuZCBjb25zdHJ1Y3RzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgppbiAnY29uZmlnJy4gIEFueSBpbmNsdWRlIGZpbGVzIHJlZmVyZW5jZWQgZnJvbSB3aXRoaW4gJ2ZpbGUnIHdpbGwgYmUgbG9hZGVkCndpdGggRmNDb25maWdMb2FkIGFuZCBhbHNvIHBhcnNlZC4gIElmICdjb21wbGFpbicgaXMgRmNGYWxzZSwgbm8gd2FybmluZwp3aWxsIGJlIGRpc3BsYXllZCBpZiAnZmlsZScgZG9lcyBub3QgZXhpc3QuCgouU1MgRmlsZSBhbmQgRGlyZWN0b3J5IHJvdXRpbmVzCgouVFAKRmNCb29sIEZjRmlsZVNjYW4gKEZjRm9udFNldCAqc2V0LCBGY1N0clNldCAqZGlycywgRmNGaWxlQ2FjaGUgKmNhY2hlLCBGY0JsYW5rcyAqYmxhbmtzLCBjb25zdCBjaGFyICpmaWxlLCBGY0Jvb2wgZm9yY2UpClNjYW5zIGEgc2luZ2xlIGZpbGUgYW5kIGFkZHMgYWxsIGZvbnRzIGZvdW5kIHRvICdzZXQnLiAgSWYgJ2ZvcmNlJyBpcyBGY1RydWUsCnRoZW4gdGhlIGZpbGUgaXMgc2Nhbm5lZCBldmVuIGlmIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gaXMgZm91bmQgaW4gJ2NhY2hlJy4KSWYgJ2ZpbGUnIGlzIGEgZGlyZWN0b3J5LCBpdCBpcyBhZGRlZCB0byAnZGlycycuCgouVFAKRmNCb29sIEZjRGlyU2NhbiAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBGY0ZpbGVDYWNoZSAqY2FjaGUsIEZjQmxhbmtzICpibGFua3MsIGNvbnN0IGNoYXIgKmRpciwgRmNCb29sIGZvcmNlKQpTY2FucyBhbiBlbnRpcmUgZGlyZWN0b3J5IGFuZCBhZGRzIGFsbCBmb250cyBmb3VuZCB0byAnc2V0Jy4gIElmICdmb3JjZScgaXMKRmNUcnVlLCB0aGVuIHRoZSBkaXJlY3RvcnkgYW5kIGFsbCBmaWxlcyB3aXRoaW4gaXQgYXJlIHNjYW5uZWQgZXZlbiBpZgppbmZvcm1hdGlvbiBpcyBwcmVzZW50IGluIHRoZSBwZXItZGlyZWN0b3J5IGNhY2hlIGZpbGUgb3IgJ2NhY2hlJy4gIEFueQpzdWJkaXJlY3RvcmllcyBmb3VuZCBhcmUgYWRkZWQgdG8gJ2RpcnMnLgoKLlRQCkZjQm9vbCBGY0RpclNhdmUgKEZjRm9udFNldCAqc2V0LCBGY1N0clNldCAqZGlycywgY29uc3QgY2hhciAqZGlyKQpDcmVhdGVzIHRoZSBwZXItZGlyZWN0b3J5IGNhY2hlIGZpbGUgZm9yICdkaXInIGFuZCBwb3B1bGF0ZXMgaXQgd2l0aCB0aGUKZm9udHMgaW4gJ3NldCcgYW5kIHN1YmRpcmVjdG9yaWVzIGluICdkaXJzJy4KCi5UUApGY0Jvb2wgRmNEaXJDYWNoZVZhbGlkIChjb25zdCBGY0NoYXI4ICpjYWNoZV9maWxlKQpSZXR1cm5zIEZjVHJ1ZSBpZiAnY2FjaGVfZmlsZScgaXMgbm8gb2xkZXIgdGhhbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaXQsCmVsc2UgRmNGYWxzZS4KCi5TUyBGY1N0clNldCBhbmQgRmNTdHJMaXN0CkEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVudW1lcmF0aW5nIHN0cmluZ3MsIHVzZWQgdG8gbGlzdCBkaXJlY3RvcmllcyB3aGlsZQpzY2FubmluZyB0aGUgY29uZmlndXJhdGlvbiBhcyBkaXJlY3RvcmllcyBhcmUgYWRkZWQgd2hpbGUgc2Nhbm5pbmcuCgouVFAKRmNTdHJTZXQgKkZjU3RyU2V0Q3JlYXRlICh2b2lkKQpDcmVhdGUgYW4gZW1wdHkgc2V0LgoKLlRQCkZjQm9vbCBGY1N0clNldE1lbWJlciAoRmNTdHJTZXQgKnNldCwgY29uc3QgRmNDaGFyOCAqcykKUmV0dXJucyB3aGV0aGVyICdzJyBpcyBhIG1lbWJlciBvZiAnc2V0Jy4KCi5UUApGY0Jvb2wgRmNTdHJTZXRBZGQgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpCkFkZHMgYSBjb3B5IG9mICdzJyB0byAnc2V0Jy4KCi5UUApGY0Jvb2wgRmNTdHJTZXRBZGRGaWxlbmFtZSAoRmNTdHJTZXQgKnNldCwgY29uc3QgRmNDaGFyOCAqcykKQWRkcyBhIGNvcHkgJ3MnIHRvICdzZXQnLCBUaGUgY29weSBpcyBjcmVhdGVkIHdpdGggRmNTdHJDb3B5RmlsZW5hbWUKc28gdGhhdCBsZWFkaW5nICd+JyB2YWx1ZXMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBIT01FCmVudmlyb25tZW50IHZhcmlhYmxlLgoKLlRQCkZjQm9vbCBGY1N0clNldERlbCAoRmNTdHJTZXQgKnNldCwgY29uc3QgRmNDaGFyOCAqcykKUmVtb3ZlcyAncycgZnJvbSAnc2V0JywgcmV0dXJuaW5nIEZjVHJ1ZSBpZiAncycgd2FzIGEgbWVtYmVyIGVsc2UgRmNGYWxzZS4KCi5UUAp2b2lkIEZjU3RyU2V0RGVzdHJveSAoRmNTdHJTZXQgKnNldCkKRGVzdHJveXMgJ3NldCcuCgouVFAKRmNTdHJMaXN0ICpGY1N0ckxpc3RDcmVhdGUgKEZjU3RyU2V0ICpzZXQpCkNyZWF0ZXMgYW4gZW51bWVyYXRvciB0byBsaXN0IHRoZSBzdHJpbmdzIGluICdzZXQnLgoKLlRQCkZjQ2hhcjggKkZjU3RyTGlzdE5leHQgKEZjU3RyTGlzdCAqbGlzdCkKUmV0dXJucyB0aGUgbmV4dCBzdHJpbmcgaW4gJ3NldCcuCgouVFAKdm9pZCBGY1N0ckxpc3REb25lIChGY1N0ckxpc3QgKmxpc3QpCkRlc3Ryb3lzIHRoZSBlbnVtZXJhdG9yICdsaXN0Jy4KCi5TUyBTdHJpbmcgdXRpbGl0aWVzCgouVFAKaW50IEZjVXRmOFRvVWNzNCAoRmNDaGFyOCAqc3JjLCBGY0NoYXIzMiAqZHN0LCBpbnQgbGVuKQpDb252ZXJ0cyB0aGUgbmV4dCBVbmljb2RlIGNoYXIgZnJvbSAnc3JjJyBpbnRvICdkc3QnIGFuZCByZXR1cm5zIHRoZSBudW1iZXIKb2YgYnl0ZXMgY29udGFpbmluZyB0aGUgY2hhci4gICdzcmMnIG51c3QgYmUgYXQgbGVhc3QgJ2xlbicgYnl0ZXMgbG9uZy4KCi5UUAppbnQgRmNVY3M0VG9VdGY4IChGY0NoYXIzMiBzcmMsIEZjQ2hhcjggZHN0W0ZDX1VURjhfTUFYX0xFTl0pCkNvbnZlcnRzIHRoZSBVbmljb2RlIGNoYXIgZnJvbSAnc3JjJyBpbnRvICdkc3QnIGFuZCByZXR1cm5zIHRoZQpudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZSB0aGUgY2hhci4KCi5UUApGY0Jvb2wgRmNVdGY4TGVuIChGY0NoYXI4ICpzcmMsIGludCBsZW4sIGludCAqbmNoYXIsIGludCAqd2NoYXIpCkNvdW50cyB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY2hhcnMgaW4gJ2xlbicgYnl0ZXMgb2YgJ3NyYycuICBQbGFjZXMgdGhhdApjb3VudCBpbiAnbmNoYXInLiAgJ3djaGFyJyBjb250YWlucyAxLCAyIG9yIDQgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YKYnl0ZXMgbmVlZGVkIHRvIGhvbGQgdGhlIGxhcmdlc3QgdW5pY29kZSBjaGFyIGNvdW50ZWQuICBUaGUgcmV0dXJuIHZhbHVlCmluZGljYXRlcyB3aGV0aGVyICdzcmMnIGlzIGEgd2VsbC1mb3JtZWQgVVRGOCBzdHJpbmcuCgouVFAKaW50IEZjVXRmMTZUb1VjczQgKEZjQ2hhcjggKnNyYywgRmNFbmRpYW4gZW5kaWFuLCBGY0NoYXIzMiAqZHN0LCBpbnQgbGVuKQpDb252ZXJ0cyB0aGUgbmV4dCBVbmljb2RlIGNoYXIgZnJvbSAnc3JjJyBpbnRvICdkc3QnIGFuZCByZXR1cm5zIHRoZQpudW1iZXIgb2YgYnl0ZXMgY29udGFpbmluZyB0aGUgY2hhci4gJ3NyYycgbXVzdCBiZSBhdCBsZWFzdCAnbGVuJyBieXRlcwpsb25nLiAgQnl0ZXMgb2YgJ3NyYycgYXJlIGNvbWJpbmVkIGludG8gMTYtYml0IHVuaXRzIGFjY29yZGluZyB0byAnZW5kaWFuJy4KCi5UUApGY0Jvb2wgRmNVdGYxNkxlbiAoRmNDaGFyOCAqc3JjLCBGY0VuZGlhbiBlbmRpYW4sIGludCBsZW4sIGludCAqbmNoYXIsIGludCAqd2NoYXIpCkNvdW50cyB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY2hhcnMgaW4gJ2xlbicgYnl0ZXMgb2YgJ3NyYycuICBCeXRlcyBvZiAnc3JjJwphcmUgY29tYmluZWQgaW50byAxNi1iaXQgdW5pdHMgYWNjb3JkaW5nIHRvICdlbmRpYW4nLiAgUGxhY2VzIHRoYXQKY291bnQgaW4gJ25jaGFyJy4gICd3Y2hhcicgY29udGFpbnMgMSwgMiBvciA0IGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mCmJ5dGVzIG5lZWRlZCB0byBob2xkIHRoZSBsYXJnZXN0IHVuaWNvZGUgY2hhciBjb3VudGVkLiAgVGhlIHJldHVybiB2YWx1ZQppbmRpY2F0ZXMgd2hldGhlciAnc3RyaW5nJyBpcyBhIHdlbGwtZm9ybWVkIFVURjE2IHN0cmluZy4KCi5UUApGY0NoYXI4ICpGY1N0ckNvcHkgKGNvbnN0IEZjQ2hhcjggKnMpCkFsbG9jYXRlcyBtZW1vcnksIGNvcGllcyAncycgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBidWZmZXIuICBZZXMsIHRoaXMKaXMgJ3N0cmR1cCcsIGJ1dCB0aGF0IGZ1bmN0aW9uIGlzbid0IGF2YWlsYWJsZSBvbiBldmVyeSBwbGF0Zm9ybS4KCi5UUApGY0NoYXI4ICpGY1N0ckNvcHlGaWxlbmFtZSAoY29uc3QgRmNDaGFyOCAqcykKSnVzdCBsaWtlIEZjU3RyQ29weSBleGNlcHQgdGhhdCBpdCBjb252ZXJ0cyBhbnkgbGVhZGluZyAnficgY2hhcmFjdGVycyAKaW4gJ3MnIHRvIHRoZSB2YWx1ZSBvZiB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KICAgIAouVFAKaW50IEZjU3RyQ21wSWdub3JlQ2FzZSAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQpSZXR1cm5zIHRoZSB1c3VhbCA8MCwgMCwgPjAgcmVzdWx0IG9mIGNvbXBhcmluZyAnczEnIGFuZCAnczInLiAgVGhpcyB0ZXN0CmlzIGNhc2UtaW5zZW5zaXRpdmUgaW4gdGhlIEFTQ0lJIHJhbmdlIGFuZCB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBVVEY4CmVuY29kZWQgc3RyaW5ncywgYWx0aG91Z2ggaXQgZG9lcyBub3QgY2hlY2sgZm9yIHdlbGwgZm9ybWVkIHN0cmluZ3MuCgouVFAKRmNDaGFyOCAqRmNTdHJEaXJuYW1lIChjb25zdCBGY0NoYXI4ICpmaWxlKQpSZXR1cm5zIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyAnZmlsZScuCgouVFAKRmNDaGFyOCAqRmNTdHJCYXNlbmFtZSAoY29uc3QgRmNDaGFyOCAqZmlsZSkKUmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgJ2ZpbGUnIHN0cmlwcGVkIG9mIGFueSBsZWFkaW5nIGRpcmVjdG9yeSBuYW1lcy4KCi5TSCBDT05GSUdVUkFUSU9OIEZJTEUgRk9STUFUCkNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGZvbnRjb25maWcgYXJlIHN0b3JlZCBpbiBYTUwgZm9ybWF0OyB0aGlzCmZvcm1hdCBtYWtlcyBleHRlcm5hbCBjb25maWd1cmF0aW9uIHRvb2xzIGVhc2llciB0byB3cml0ZSBhbmQgZW5zdXJlcyB0aGF0CnRoZXkgd2lsbCBnZW5lcmF0ZSBzeW50YWN0aWNhbGx5IGNvcnJlY3QgY29uZmlndXJhdGlvbiBmaWxlcy4gIEFzIFhNTApmaWxlcyBhcmUgcGxhaW4gdGV4dCwgdGhleSBjYW4gYWxzbyBiZSBtYW5pcHVsYXRlZCBieSB0aGUgZXhwZXJ0IHVzZXIgdXNpbmcKYSB0ZXh0IGVkaXRvci4KLlAKVGhlIGZvbnRjb25maWcgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIHJlc2lkZXMgaW4gdGhlIGV4dGVybmFsIGVudGl0eQoiZm9udHMuZHRkIjsgdGhpcyBpcyBub3JtYWxseSBzdG9yZWQgaW4gdGhlIGRlZmF1bHQgZm9udCBjb25maWd1cmF0aW9uCmRpcmVjdG9yeSAoL2V0Yy9mb250cykuICBFYWNoIGNvbmZpZ3VyYXRpb24gZmlsZSBzaG91bGQgY29udGFpbiB0aGUKZm9sbG93aW5nIHN0cnVjdHVyZToKLnNwCi5uZgoJPD94bWwgdmVyc2lvbj0iMS4wIj8+Cgk8IURPQ1RZUEUgZm9udGNvbmZpZyBTWVNURU0gImZvbnRzLmR0ZCI+Cgk8Zm9udGNvbmZpZz4KCS4uLgoJPC9mb250Y29uZmlnPgouZmkKLlAKLlNTIDxmb250Y29uZmlnPgpUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBmb3IgYSBmb250IGNvbmZpZ3VyYXRpb24gYW5kIGNhbiBjb250YWluCjxkaXI+LCA8Y2FjaGU+LCA8aW5jbHVkZT4sIDxtYXRjaD4gYW5kIDxhbGlhcz4gZWxlbWVudHMgaW4gYW55IG9yZGVyLgoKLlNTIDxkaXI+ClRoaXMgZWxlbWVudCBjb250YWlucyBhIGRpcmVjdG9yeSBuYW1lIHdoaWNoIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZm9udCBmaWxlcwp0byBpbmNsdWRlIGluIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZvbnRzLgoKLlNTIDxjYWNoZT4KVGhpcyBlbGVtZW50IGNvbnRhaW5zIGEgZmlsZSBuYW1lIGZvciB0aGUgcGVyLXVzZXIgY2FjaGUgb2YgZm9udAppbmZvcm1hdGlvbi4gIElmIGl0IHN0YXJ0cyB3aXRoICd+JywgaXQgcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgdXNlcnMKaG9tZSBkaXJlY3RvcnkuICBUaGlzIGZpbGUgaXMgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGZvbnRzIHRoYXQKaXNuJ3QgcHJlc2VudCBpbiB0aGUgcGVyLWRpcmVjdG9yeSBjYWNoZSBmaWxlcy4gIEl0IGlzIGF1dG9tYXRpY2FsbHkKbWFpbnRhaW5lZCBieSB0aGUgZm9udGNvbmZpZyBsaWJyYXJ5LiAgVGhlIGRlZmF1bHQgZm9yIHRoaXMgZmlsZSAKaXMgYGB+Ly5mb250cy5jYWNoZS08dmVyc2lvbj4nJywgd2hlcmUgPHZlcnNpb24+IGlzIHRoZSBmb250IGNvbmZpZ3VyYXRpb24KZmlsZSB2ZXJzaW9uIG51bWJlciAoY3VycmVudGx5IDEpLgoKLlNTIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJubyI+ClRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFdoZW4KdGhlIFhNTCBkYXRhdHlwZSBpcyB0cmF2ZXJzZWQgYnkgRmNDb25maWdQYXJzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlCndpbGwgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgY29uZmlndXJhdGlvbiBieSBwYXNzaW5nIHRoZSBmaWxlbmFtZSB0bwpGY0NvbmZpZ0xvYWRBbmRQYXJzZS4gIElmICdpZ25vcmVfbWlzc2luZycgaXMgc2V0IHRvICJ5ZXMiIGluc3RlYWQgb2YgdGhlCmRlZmF1bHQgIm5vIiwgYSBtaXNzaW5nIGZpbGUgd2lsbCBlbGljaXQgbm8gd2FybmluZyBtZXNzYWdlIGZyb20gdGhlIGxpYnJhcnkuCgouU1MgPGNvbmZpZz4KVGhpcyBlbGVtZW50IHByb3ZpZGVzIGEgcGxhY2UgdG8gY29uc29sb2RhdGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uCmluZm9ybWF0aW9uLiAgPGNvbmZpZz4gY2FuIGNvbnRhaW4gPGJsYW5rPiBhbmQgPHJlc2Nhbj4gZWxlbWVudHMgaW4gYW55Cm9yZGVyLgoKLlNTIDxibGFuaz4KRm9udHMgb2Z0ZW4gaW5jbHVkZSAiYnJva2VuIiBnbHlwaHMgd2hpY2ggYXBwZWFyIGluIHRoZSBlbmNvZGluZyBidXQgYXJlCmRyYXduIGFzIGJsYW5rcyBvbiB0aGUgc2NyZWVuLiAgV2l0aGluIHRoZSA8Ymxhbms+IGVsZW1lbnQsIHBsYWNlIGVhY2gKVW5pY29kZSBjaGFyYWN0ZXJzIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGJsYW5rIGluIGFuIDxpbnQ+IGVsZW1lbnQuCkNoYXJhY3RlcnMgb3V0c2lkZSBvZiB0aGlzIHNldCB3aGljaCBhcmUgZHJhd24gYXMgYmxhbmsgd2lsbCBiZSBlbGlkZWQgZnJvbQp0aGUgc2V0IG9mIGNoYXJhY3RlcnMgc3VwcG9ydGVkIGJ5IHRoZSBmb250LiAgPGIKCi5TUyA8cmVzY2FuPgpUaGUgPHJlc2Nhbj4gZWxlbWVudCBob2xkcyBhbiA8aW50PiBlbGVtZW50IHdoaWNoIGluZGljYXRlcyB0aGUgZGVmYXVsdAppbnRlcnZhbCBiZXR3ZWVuIGF1dG9tYXRpYyBjaGVja3MgZm9yIGZvbnQgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgpGb250Y29uZmlnIHdpbGwgdmFsaWRhdGUgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhbmQKYXV0b21hdGljYWxseSByZWJ1aWxkIHRoZSBpbnRlcm5hbCBkYXRhc3RydWN0dXJlcyB3aGVuIHRoaXMgaW50ZXJ2YWwgcGFzc2VzLgoKLlNTIDxtYXRjaCB0YXJnZXQ9InBhdHRlcm4iPgpUaGlzIGVsZW1lbnQgaG9sZHMgZmlyc3QgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgPHRlc3Q+IGVsZW1lbnRzIGFuZCB0aGVuCmEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIDxlZGl0PiBlbGVtZW50cy4gIFBhdHRlcm5zIHdoaWNoIG1hdGNoIGFsbCBvZiB0aGUKdGVzdHMgYXJlIHN1YmplY3RlZCB0byBhbGwgdGhlIGVkaXRzLiAgSWYgJ3RhcmdldCcgaXMgc2V0IHRvICJmb250IiBpbnN0ZWFkCm9mIHRoZSBkZWZhdWx0ICJwYXR0ZXJuIiwgdGhlbiB0aGlzIGVsZW1lbnQgYXBwbGllcyB0byB0aGUgZm9udCBuYW1lCnJlc3VsdGluZyBmcm9tIGEgbWF0Y2ggcmF0aGVyIHRoYW4gYSBmb250IHBhdHRlcm4gdG8gYmUgbWF0Y2hlZC4KCi5TUyA8dGVzdCBxdWFsPSJhbnkiIG5hbWU9InByb3BlcnR5IiBjb21wYXJlPSJlcSI+ClRoaXMgZWxlbWVudCBjb250YWlucyBhIHNpbmdsZSB2YWx1ZSB3aGljaCBpcyBjb21wYXJlZCB3aXRoIHRoZSBwYXR0ZXJuCnByb3BlcnR5ICJwcm9wZXJ0eSIgKHN1YnN0aXR1dGUgYW55IG9mIHRoZSBwcm9wZXJ0eSBuYW1lcyBzZWVuIAphYm92ZSkuICdjb21wYXJlJyBjYW4gYmUgb25lIG9mICJlcSIsICJub3RfZXEiLCAibGVzcyIsICJsZXNzX2VxIiwgIm1vcmUiLCBvcgoibW9yZV9lcSIuICAncXVhbCcgbWF5IGVpdGhlciBiZSB0aGUgZGVmYXVsdCwgImFueSIsIGluIHdoaWNoIGNhc2UgdGhlIG1hdGNoCnN1Y2NlZWRzIGlmIGFueSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG1hdGNoZXMgdGhlIHRlc3QgdmFsdWUsIG9yCiJhbGwiLCBpbiB3aGljaCBjYXNlIGFsbCBvZiB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbXVzdAptYXRjaCB0aGUgdGVzdCB2YWx1ZS4KCi5TUyA8ZWRpdCBuYW1lPSJwcm9wZXJ0eSIgbW9kZT0iYXNzaWduIiBiaW5kaW5nPSJ3ZWFrIj4KVGhpcyBlbGVtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiBleHByZXNzaW9uIGVsZW1lbnRzIChhbnkgb2YgdGhlIHZhbHVlIG9yCm9wZXJhdG9yIGVsZW1lbnRzKS4gIFRoZSBleHByZXNzaW9uIGVsZW1lbnRzIGFyZSBldmFsdWF0ZWQgYXQgcnVuLXRpbWUgYW5kCm1vZGlmeSB0aGUgcHJvcGVydHkgInByb3BlcnR5Ii4gIFRoZSBtb2RpZmljYXRpb24gZGVwZW5kcyBvbiB3aGV0aGVyCiJwcm9wZXJ0eSIgd2FzIG1hdGNoZWQgYnkgb25lIG9mIHRoZSBhc3NvY2lhdGVkIDx0ZXN0PiBlbGVtZW50cywgaWYgc28sIHRoZQptb2RpZmljYXRpb24gbWF5IGFmZmVjdCB0aGUgZmlyc3QgbWF0Y2hlZCB2YWx1ZS4gIEFueSB2YWx1ZXMgaW5zZXJ0ZWQgaW50bwp0aGUgcHJvcGVydHkgYXJlIGdpdmVuIHRoZSBpbmRpY2F0ZWQgYmluZGluZy4gJ21vZGUnIGlzIG9uZSBvZjoKLm5mCi5SUwoudGEgMWkgM2kgNWkKTW9kZQlPcGVyYXRpb24gd2l0aCBtYXRjaAlPcGVyYXRpb24gd2l0aG91dCBtYXRjaAoBAQEKImFzc2lnbiIJUmVwbGFjZSBtYXRjaGluZyB2YWx1ZQlSZXBsYWNlIGFsbCB2YWx1ZXMKImFzc2lnbl9yZXBsYWNlIglSZXBsYWNlIGFsbCB2YWx1ZXMJUmVwbGFjZSBhbGwgdmFsdWVzCiJwcmVwZW5kIglJbnNlcnQgYmVmb3JlIG1hdGNoaW5nIHZhbHVlCUluc2VydCBhdCBoZWFkIG9mIGxpc3QKInByZXBlbmRfZmlyc3QiCUluc2VydCBhdCBoZWFkIG9mIGxpc3QJSW5zZXJ0IGF0IGhlYWQgb2YgbGlzdAoiYXBwZW5kIglBcHBlbmQgYWZ0ZXIgbWF0Y2hpbmcgdmFsdWUJQXBwZW5kIGF0IGVuZCBvZiBsaXN0CiJhcHBlbmRfbGFzdCIJQXBwZW5kIGF0IGVuZCBvZiBsaXN0CUFwcGVuZCBhdCBlbmQgb2YgbGlzdAouUkUKLkRUCi5maQouU1MgPGludD4KLlNTIDxkb3VibGU+Ci5TUyA8c3RyaW5nPgouU1MgPGJvb2w+ClRoZXNlIGVsZW1lbnRzIGhvbGQgYSBzaW5nbGUgdmFsdWUgb2YgdGhlIGluZGljYXRlZCB0eXBlLiAgPGJvb2w+IGVsZW1lbnRzCmhvbGQgZWl0aGVyIHRydWUgb3IgZmFsc2UuCi5TUyA8bWF0cml4PgpUaGlzIGVsZW1lbnQgaG9sZHMgdGhlIGZvdXIgPGRvdWJsZT4gZWxlbWVudHMgb2YgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uLgouU1MgPG5hbWU+CkhvbGRzIGEgcHJvcGVydHkgbmFtZS4gIEV2YWx1YXRlcyB0byB0aGUgZmlyc3QgdmFsdWUgZnJvbSB0aGUgcHJvcGVydHkgb2YKdGhlIGZvbnQsIG5vdCB0aGUgcGF0dGVybi4KLlNTIDxjb25zdD4KSG9sZHMgdGhlIG5hbWUgb2YgYSBjb25zdGFudDsgdGhlc2UgYXJlIGFsd2F5cyBpbnRlZ2VycyBhbmQgc2VydmUgYXMKc3ltYm9saWMgbmFtZXMgZm9yIGNvbW1vbiBmb250IHZhbHVlczoKLlJTCi5zcAoubmYKLnRhIDFpIDJpIDNpCi5sYyBcKGVtCkNvbnN0YW50CVByb3BlcnR5CUNQUCBzeW1ib2wKAQEBCmxpZ2h0CXdlaWdodAlGQ19XRUlHSFRfTElHSFQKbWVkaXVtCXdlaWdodAlGQ19XRUlHSFRfTUVESVVNCmRlbWlib2xkCXdlaWdodAlGQ19XRUlHSFRfREVNSUJPTEQKYm9sZAl3ZWlnaHQJRkNfV0VJR0hUX0JPTEQKYmxhY2sJd2VpZ2h0CUZDX1dFSUdIVF9CTEFDSwpyb21hbglzbGFudAlGQ19TTEFOVF9ST01BTgppdGFsaWMJc2xhbnQJRkNfU0xBTlRfSVRBTElDCm9ibGlxdWUJc2xhbnQJRkNfU0xBTlRfT0JMSVFVRQpwcm9wb3J0aW9uYWwJc3BhY2luZwlGQ19QUk9QT1JUSU9OQUwKbW9ubwlzcGFjaW5nCUZDX01PTk8KY2hhcmNlbGwJc3BhY2luZwlGQ19DSEFSQ0VMTAp1bmtub3duCXJnYmEJRkNfUkdCQV9VTktOT1dOCnJnYglyZ2JhCUZDX1JHQkFfUkdCCmJncglyZ2JhCUZDX1JHQkFfQkdSCnZyZ2IJcmdiYQlGQ19SR0JBX1ZSR0IKdmJncglyZ2JhCUZDX1JHQkFfVkJHUgpub25lCXJnYmEJRkNfUkdCQV9OT05FCi5EVAouZmkKLlJFCi5TUyA8b3I+Ci5TUyA8YW5kPgouU1MgPHBsdXM+Ci5TUyA8bWludXM+Ci5TUyA8dGltZXM+Ci5TUyA8ZGl2aWRlPgpUaGVzZSBlbGVtZW50cyBwZXJmb3JtIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIG9uIGEgbGlzdCBvZiBleHByZXNzaW9uCmVsZW1lbnRzLiAgPG9yPiBhbmQgPGFuZD4gYXJlIGJvb2xlYW4sIG5vdCBiaXR3aXNlLgouU1MgPGVxPgouU1MgPG5vdF9lcT4KLlNTIDxsZXNzPgouU1MgPGxlc3NfZXE+Ci5TUyA8bW9yZT4KLlNTIDxtb3JlX2VxPgpUaGVzZSBlbGVtZW50cyBjb21wYXJlIHR3byB2YWx1ZXMsIHByb2R1Y2luZyBhIGJvb2xlYW4gcmVzdWx0LgouU1MgPG5vdD4KSW52ZXJ0cyB0aGUgYm9vbGVhbiBzZW5zZSBvZiBpdHMgb25lIGV4cHJlc3Npb24gZWxlbWVudAouU1MgPGlmPgpUaGlzIGVsZW1lbnQgdGFrZXMgdGhyZWUgZXhwcmVzc2lvbiBlbGVtZW50czsgaWYgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpcwp0cnVlLCBpdCBwcm9kdWNlcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCwgb3RoZXJ3aXNlIGl0IHByb2R1Y2VzIHRoZSB2YWx1ZQpvZiB0aGUgdGhpcmQuCi5TUyA8YWxpYXM+CkFsaWFzIGVsZW1lbnRzIHByb3ZpZGUgYSBzaG9ydGhhbmQgbm90YXRpb24gZm9yIHRoZSBzZXQgb2YgY29tbW9uIG1hdGNoCm9wZXJhdGlvbnMgbmVlZGVkIHRvIHN1YnN0aXR1dGUgb25lIGZvbnQgZmFtaWx5IGZvciBhbm90aGVyLiAgVGhleSBjb250YWluIGEKPGZhbWlseT4gZWxlbWVudCBmb2xsb3dlZCBieSBvcHRpb25hbCA8cHJlZmVyPiwgPGFjY2VwdD4gYW5kIDxkZWZhdWx0PgplbGVtZW50cy4gIEZvbnRzIG1hdGNoaW5nIHRoZSA8ZmFtaWx5PiBlbGVtZW50IGFyZSBlZGl0ZWQgdG8gcHJlcGVuZCB0aGUKbGlzdCBvZiA8cHJlZmVyPmVkIGZhbWlsaWVzIGJlZm9yZSB0aGUgbWF0Y2hpbmcgPGZhbWlseT4sIGFwcGVuZCB0aGUKPGFjY2VwdD5hYmxlIGZhbWlseXMgYWZ0ZXIgdGhlIG1hdGNoaW5nIDxmYW1pbHk+IGFuZCBhcHBlbmQgdGhlIDxkZWZhdWx0PgpmYW1pbGllcyB0byB0aGUgZW5kIG9mIHRoZSBmYW1pbHkgbGlzdC4KLlNTIDxmYW1pbHk+CkhvbGRzIGEgc2luZ2xlIGZvbnQgZmFtaWx5IG5hbWUKLlNTIDxwcmVmZXI+Ci5TUyA8YWNjZXB0PgouU1MgPGRlZmF1bHQ+ClRoZXNlIGhvbGQgYSBsaXN0IG9mIDxmYW1pbHk+IGVsZW1lbnRzIHRvIGJlIHVzZWQgYnkgdGhlIDxhbGlhcz4gZWxlbWVudC4KLlNIIEVYQU1QTEUgQ09ORklHVVJBVElPTiBGSUxFCi5TUyBTeXN0ZW0gY29uZmlndXJhdGlvbiBmaWxlClRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZQouc3AKLm5mCjw/eG1sIHZlcnNpb249IjEuMCI/Pgo8IURPQ1RZUEUgZm9udGNvbmZpZyBTWVNURU0gImZvbnRzLmR0ZCI+CjwhLS0gL2V0Yy9mb250cy9mb250cy5jb25mIGZpbGUgdG8gY29uZmlndXJlIHN5c3RlbSBmb250IGFjY2VzcyAtLT4KPGZvbnRjb25maWc+CjwhLS0gCglGaW5kIGZvbnRzIGluIHRoZXNlIGRpcmVjdG9yaWVzCi0tPgo8ZGlyPi91c3IvWDExUjYvbGliL1gxMS9mb250cy90cnVldHlwZTwvZGlyPgo8ZGlyPi91c3IvWDExUjYvbGliL1gxMS9mb250cy9UeXBlMTwvZGlyPgoKPCEtLQoJQWNjZXB0IGRlcHJlY2F0ZWQgJ21vbm8nIGFsaWFzLCByZXBsYWNpbmcgaXQgd2l0aCAnbW9ub3NwYWNlJwotLT4KPG1hdGNoIHRhcmdldD0icGF0dGVybiI+Cgk8dGVzdCBxdWFsPSJhbnkiIG5hbWU9ImZhbWlseSI+PHN0cmluZz5tb25vPC9zdHJpbmc+PC90ZXN0PgoJPGVkaXQgbmFtZT0iZmFtaWx5IiBtb2RlPSJhc3NpZ24iPjxzdHJpbmc+bW9ub3NwYWNlPC9zdHJpbmc+PC9lZGl0Pgo8L21hdGNoPgoKPCEtLQoJTmFtZXMgbm90IGluY2x1ZGluZyBhbnkgd2VsbCBrbm93biBhbGlhcyBhcmUgZ2l2ZW4gJ3NhbnMnCi0tPgo8bWF0Y2ggdGFyZ2V0PSJwYXR0ZXJuIj4KCTx0ZXN0IHF1YWw9ImFsbCIgbmFtZT0iZmFtaWx5IiBtb2RlPSJub3RfZXEiPnNhbnM8L3Rlc3Q+Cgk8dGVzdCBxdWFsPSJhbGwiIG5hbWU9ImZhbWlseSIgbW9kZT0ibm90X2VxIj5zZXJpZjwvdGVzdD4KCTx0ZXN0IHF1YWw9ImFsbCIgbmFtZT0iZmFtaWx5IiBtb2RlPSJub3RfZXEiPm1vbm9zcGFjZTwvdGVzdD4KCTxlZGl0IG5hbWU9ImZhbWlseSIgbW9kZT0iYXBwZW5kX2xhc3QiPjxzdHJpbmc+c2Fuczwvc3RyaW5nPjwvZWRpdD4KPC9tYXRjaD4KCjwhLS0KCUxvYWQgcGVyLXVzZXIgY3VzdG9taXphdGlvbiBmaWxlLCBidXQgZG9uJ3QgY29tcGxhaW4KCWlmIGl0IGRvZXNuJ3QgZXhpc3QKLS0+CjxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPn4vLmZvbnRzLmNvbmY8L2luY2x1ZGU+Cgo8IS0tCglBbGlhcyB3ZWxsIGtub3duIGZvbnQgbmFtZXMgdG8gYXZhaWxhYmxlIFRydWVUeXBlIGZvbnRzLgoJVGhlc2Ugc3Vic3RpdHV0ZSBUcnVlVHlwZSBmYWNlcyBmb3Igc2ltaWxhciBUeXBlMQoJZmFjZXMgdG8gaW1wcm92ZSBzY3JlZW4gYXBwZWFyYW5jZS4KLS0+CjxhbGlhcz4KCTxmYW1pbHk+VGltZXM8L2ZhbWlseT4KCTxwcmVmZXI+PGZhbWlseT5UaW1lcyBOZXcgUm9tYW48L2ZhbWlseT48L3ByZWZlcj4KCTxkZWZhdWx0PjxmYW1pbHk+c2VyaWY8L2ZhbWlseT48L2RlZmF1bHQ+CjwvYWxpYXM+CjxhbGlhcz4KCTxmYW1pbHk+SGVsdmV0aWNhPC9mYW1pbHk+Cgk8cHJlZmVyPjxmYW1pbHk+VmVyZGFuYTwvZmFtaWx5PjwvcHJlZmVyPgoJPGRlZmF1bHQ+PGZhbWlseT5zYW5zPC9mYW1pbHk+PC9kZWZhdWx0Pgo8L2FsaWFzPgo8YWxpYXM+Cgk8ZmFtaWx5PkNvdXJpZXI8L2ZhbWlseT4KCTxwcmVmZXI+PGZhbWlseT5Db3VyaWVyIE5ldzwvZmFtaWx5PjwvcHJlZmVyPgoJPGRlZmF1bHQ+PGZhbWlseT5tb25vc3BhY2U8L2ZhbWlseT48L2RlZmF1bHQ+CjwvYWxpYXM+Cgo8IS0tCglQcm92aWRlIHJlcXVpcmVkIGFsaWFzZXMgZm9yIHN0YW5kYXJkIG5hbWVzCglEbyB0aGVzZSBhZnRlciB0aGUgdXNlcnMgY29uZmlndXJhdGlvbiBmaWxlIHNvIHRoYXQKCWFueSBhbGlhc2VzIHRoZXJlIGFyZSB1c2VkIHByZWZlcmVudGlhbGx5Ci0tPgo8YWxpYXM+Cgk8ZmFtaWx5PnNlcmlmPC9mYW1pbHk+Cgk8cHJlZmVyPjxmYW1pbHk+VGltZXMgTmV3IFJvbWFuPC9mYW1pbHk+PC9wcmVmZXI+CjwvYWxpYXM+CjxhbGlhcz4KCTxmYW1pbHk+c2FuczwvZmFtaWx5PgoJPHByZWZlcj48ZmFtaWx5PlZlcmRhbmE8L2ZhbWlseT48L3ByZWZlcj4KPC9hbGlhcz4KPGFsaWFzPgoJPGZhbWlseT5tb25vc3BhY2U8L2ZhbWlseT4KCTxwcmVmZXI+PGZhbWlseT5BbmRhbGUgTW9ubzwvZmFtaWx5PjwvcHJlZmVyPgo8L2FsaWFzPgo8L2ZvbnRjb25maWc+Ci5maQouU1MgVXNlciBjb25maWd1cmF0aW9uIGZpbGUKVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgbGl2ZXMgaW4Kfi8uZm9udHMuY29uZgouc3AKLm5mCjw/eG1sIHZlcnNpb249IjEuMCI/Pgo8IURPQ1RZUEUgZm9udGNvbmZpZyBTWVNURU0gImZvbnRzLmR0ZCI+CjwhLS0gfi8uZm9udHMuY29uZiBmb3IgcGVyLXVzZXIgZm9udCBjb25maWd1cmF0aW9uIC0tPgo8Zm9udGNvbmZpZz4KCjwhLS0KCVByaXZhdGUgZm9udCBkaXJlY3RvcnkKLS0+CjxkaXI+fi9taXNjL2ZvbnRzPC9kaXI+Cgo8IS0tCgl1c2UgcmdiIHN1Yi1waXhlbCBvcmRlcmluZyB0byBpbXByb3ZlIGdseXBoIGFwcGVhcmFuY2Ugb24KCUxDRCBzY3JlZW5zLiAgQ2hhbmdlcyBhZmZlY3RpbmcgcmVuZGVyaW5nLCBidXQgbm90IG1hdGNoaW5nCglzaG91bGQgYWx3YXlzIHVzZSB0YXJnZXQ9ImZvbnQiLgotLT4KPG1hdGNoIHRhcmdldD0iZm9udCI+Cgk8ZWRpdCBuYW1lPSJyZ2JhIiBtb2RlPSJhc3NpZ24iPjxjb25zdD5yZ2I8L2NvbnN0PjwvZWRpdD4KPC9tYXRjaD4KPC9mb250Y29uZmlnPgouZmkKLlNIIEZJTEVTCi5CIGZvbnRzLmNvbmYKY29udGFpbnMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZvbnRjb25maWcgbGlicmFyeQpjb25zaXN0aW5nIG9mIGRpcmVjdG9yaWVzIHRvIGxvb2sgYXQgZm9yIGZvbnQgaW5mb3JtYXRpb24gYXMgd2VsbCBhcwppbnN0cnVjdGlvbnMgb24gZWRpdGluZyBwcm9ncmFtIHNwZWNpZmllZCBmb250IHBhdHRlcm5zIGJlZm9yZSBhdHRlbXB0aW5nIHRvCm1hdGNoIHRoZSBhdmFpbGFibGUgZm9udHMuICBJdCBpcyBpbiB4bWwgZm9ybWF0LgoKLkIgZm9udHMuZHRkIAppcyBhIERURCB0aGF0IGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLgoKLkIgfi8uZm9udHMuY29uZgppcyB0aGUgY29udmVudGlvbmFsIGxvY2F0aW9uIGZvciBwZXItdXNlciBmb250IGNvbmZpZ3VyYXRpb24sIGFsdGhvdWdoIHRoZQphY3R1YWwgbG9jYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBnbG9iYWwgZm9udHMuY29uZiBmaWxlLgoKLkIgfi8uZm9udHMuY2FjaGUtKgppcyB0aGUgY29udmVudGlvbmFsIHJlcG9zaXRvcnkgb2YgZm9udCBpbmZvcm1hdGlvbiB0aGF0IGlzbid0IGZvdW5kIGluIHRoZQpwZXItZGlyZWN0b3J5IGNhY2hlcy4gIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IG1haW50YWluZWQgYnkgZm9udGNvbmZpZy4KCi5TSCBBVVRIT1IKS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIHRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4K