U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCklzc3VlICMgbnVtYmVycyBtZW50aW9uZWQgYmVsb3cgY2FuIGJlIGZvdW5kIG9uIEdpdGh1Yi4gRm9yIG1vcmUgZGV0YWlscywgYWRkCnRoZSBpc3N1ZSBudW1iZXIgdG8gdGhlIGVuZCBvZiB0aGUgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vc3dpZy9zd2lnL2lzc3Vlcy8KClZlcnNpb24gNC4wLjAgKDI3IEFwciAyMDE5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTktMDQtMjQ6IHZhZHoKICAgICAgICAgICAgIzE1MTcgRml4IGNyYXNoIGlmICJAcmV0dXJuIiBEb3h5Z2VuIHRhZyB3YXMgdXNlZCBvbiBhIG5vZGUgd2l0aG91dCBhbnkgcmV0dXJuIHR5cGUuCgoyMDE5LTA0LTI0OiB2YWR6CiAgICAgICAgICAgICMxNTE1IEZpeCBwYXJzaW5nIG9mIGVudW1zIHdpdGggdHJhaWxpbmcgY29tbWEgd2hlbiB1c2luZyAtZG94eWdlbi4KCjIwMTktMDQtMTk6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gIzEwNTUgV2hlbiBnZW5lcmF0aW5nIEdvIGNvZGUsIG1ha2UgLWNnbyB0aGUgZGVmYXVsdC4gQWRkIG5ldyAtbm8tY2dvIG9wdGlvbgogICAgICAgICAgICB0byBkaXNhYmxlIHRoZSBkZWZhdWx0LgoKMjAxOS0wNC0xOTogcGJlY2hlcmVyCiAgICAgICAgICAgIFtUY2xdICMxNTA4IEZpeCBWaXN1YWwgU3R1ZGlvIDIwMTUgYW5kIGxhdGVyIGNvbXBpbGF0aW9uIGVycm9ycyBkdWUgdG8gc25wcmludGYgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbi4KCjIwMTktMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IEZ4Q29wIHdhcm5pbmcgQ0EyMDAyIGluIFNXSUdQZW5kaW5nRXhjZXB0aW9uIC0gYSBsb2NrIG9uIGEgcmVmZXJlbmNlIG9mCiAgICAgICAgICAgIHR5cGUgJ1R5cGUnLgoKMjAxOS0wMy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIERdIEFkZCB0aGUgcGFyYW1ldGVycyB0eXBlbWFwIGF0dHJpYnV0ZSB0byB0aGUgamF2YWRlc3RydWN0LAogICAgICAgICAgICBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCwgZGRpc3Bvc2UsIGRkaXNwb3NlX2Rlcml2ZWQgdHlwZW1hcHMgdG8gbWlycm9yIGVuaGFuY2VkCiAgICAgICAgICAgIGZsZXhpYmlsaXR5IGluIHRoZSBjc2Rpc3Bvc2luZyBhbmQgY3NkaXNwb3NpbmdfZGVyaXZlZCAoQyMpIHR5cGVtYXBzLiBJZiBwcm92aWRlZAogICAgICAgICAgICB0aGUgY29udGVudHMgYXJlIGdlbmVyYXRlZCBhcyB0aGUgZGVsZXRlL2Rpc3Bvc2UgbWV0aG9kJ3MgcGFyYW1ldGVycyBkZWNsYXJhdGlvbi4KCjIwMTktMDMtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gIzQyMSBGaXggRnhDb3Agd2FybmluZyBDQTEwNjMgYnkgaW1wbGVtZW50aW5nIHRoZSByZWNvbW1lbmRlZCBEaXNwb3NlIG1ldGhvZHMgZm9yCiAgICAgICAgICAgIHRoZSBJRGlzcG9zYWJsZSBpbnRlcmZhY2UuIFByZXZpb3VzbHkganVzdCB0aGUgRGlzcG9zZSgpIG1ldGhvZCB3YXMgZ2VuZXJhdGVkLgogICAgICAgICAgICBOb3cgdGhlIERpc3Bvc2UoKSBhbmQgRGlzcG9zZShib29sIGRpc3Bvc2luZykgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkLgogICAgICAgICAgICBDaGFuZ2VzIGFyZSByZXF1aXJlZCBpZiBjdXN0b20gImNzZmluYWxpemUiLCAiY3NkZXN0cnVjdCIgb3IgImNzZGVzdHJ1Y3RfZGVyaXZlZCIKICAgICAgICAgICAgdHlwZW1hcHMgYXJlIGJlaW5nIHVzZWQuIERldGFpbHMgaW4gIzQyMSBvbiBHaXRodWIuIFNXSUcgd2lsbCBlcnJvciBvdXQgaWYgb25lIG9mCiAgICAgICAgICAgIHRoZSAiY3NmaW5hbGl6ZSwgImNzZGVzdHJ1Y3QiIG9yICJjc2Rlc3RydWN0X2Rlcml2ZWQiIHR5cGVtYXBzIGFyZSBmb3VuZC4gRXhhbXBsZQogICAgICAgICAgICBlcnJvciBtZXNzYWdlOgoKICAgICAgICAgICAgICBmb28uaDo2MDogRXJyb3I6IEEgZGVwcmVjYXRlZCBjc2ZpbmFsaXplIHR5cGVtYXAgd2FzIGZvdW5kIGZvciBGb28sIHBsZWFzZSByZW1vdmUKICAgICAgICAgICAgICBpdCBhbmQgcmVwbGFjZSBhbGwgY3NkZXN0cnVjdCwgY3NkZXN0cnVjdF9kZXJpdmVkIGFuZCBjc2ZpbmFsaXplIHR5cGVtYXBzIGJ5IHRoZQogICAgICAgICAgICAgIGNzZGlzcG9zZSwgY3NkaXNwb3NlX2Rlcml2ZWQsIGNzZGlzcG9zaW5nIGFuZCBjc2Rpc3Bvc2luZ19kZXJpdmVkIHR5cGVtYXBzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTAzLTI1OiBMaXJ5bmEKICAgICAgICAgICAgW0MjXSAjMTE0MyBBZGQgc3RkX2xpc3QuaSBmb3Igc3RkOjpsaXN0IHN1cHBvcnQuCiAgICAgICAgICAgIFRoZSBDIyBzdGQ6Omxpc3Q8VD4gd3JhcHBlcnMgYXJlIG1hZGUgdG8gbG9vayBhbmQgZmVlbCBsaWtlIGEgQyMKICAgICAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlua2VkTGlzdDw+IGNvbGxlY3Rpb24uCiAgICAgICAgICAgIFRoZSBJRW51bWVyYWJsZTw+IGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgcHJveHkgY2xhc3MuCiAgICAgICAgICAgIFRoZSBJQ29sbGVjdGlvbjw+IGludGVyZmFjZSBjYW4gYWxzbyBiZSBpbXBsZW1lbnRlZCB0byBwcm92aWRlIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkKICAgICAgICAgICAgd2hlbmV2ZXIgYSBDKysgb3BlcmF0b3I9PSBpcyBhdmFpbGFibGUuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIHdoZW4gVCBpcyBhCiAgICAgICAgICAgIHByaW1pdGl2ZSB0eXBlIG9yIGEgcG9pbnRlci4gSWYgVCBkb2VzIGRlZmluZSBhbiBvcGVyYXRvcj09LCB0aGVuIHVzZSB0aGUKICAgICAgICAgICAgU1dJR19TVERfTElTVF9FTkhBTkNFRCBtYWNybyB0byBvYnRhaW4gdGhpcyBlbmhhbmNlZCBmdW5jdGlvbmFsaXR5LCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19TVERfTElTVF9FTkhBTkNFRChTb21lTmFtZXNwYWNlOjpLbGFzcykKICAgICAgICAgICAgICAldGVtcGxhdGUoTGlzdEtsYXNzKSBzdGQ6Omxpc3Q8U29tZU5hbWVzcGFjZTo6S2xhc3M+OwoKMjAxOS0wMy0xODogcmljaGFyZGJlYXJlCiAgICAgICAgICAgIFtSXSAjMTMyOCBOb24tdHJpdmlhbCBlbnVtcyBhcmUgd29ya2luZyBub3cuIFRoZSBlbnVtIHZhbHVlcyBhcmUgbm93IG9idGFpbmVkIGZyb20KICAgICAgICAgICAgdGhlIEMvQysrIGxheWVyLiBjb25zdCByZWZlcmVuY2UgZW51bXMgYW5kIEMrKzExIGVudW0gY2xhc3NlcyBhcmUgYWxzbyBub3cgd29ya2luZy4KCjIwMTktMDMtMTQ6IG1vY2hpemsKICAgICAgICAgICAgW0phdmFzY3JpcHRdICMxNTAwIEZpeCBjb21waWxhdGlvbiBlcnJvcnMgZHVlIHRvIGRlcHJlY2F0aW5nIFY4IEFQSSBpbiBOb2RlLmpzLgogICAgICAgICAgICBOZXcgVjggQVBJIGlzIHVzZWQgaWYgbm9kZS5qcyA+PSB2MTAuMTIsIG9yIGlmIFY4ID49IHY3LjAuCgoyMDE5LTAzLTEyOiB2YWR6CiAgICAgICAgICAgIFtDI10gIzE0OTUgQWRkIHN0ZF9zZXQuaSBmb3Igc3RkOjpzZXQgc3VwcG9ydC4KCjIwMTktMDMtMTE6IGRpcnRlYXQsb3BvcGxhd3NraQogICAgICAgICAgICBbT2N0YXZlXSBGaXggY29tcGlsYXRpb24gZXJyb3JzIGluIE9jdGF2ZSA1LjEuCgogICAgICAgICAgICAgIGVycm9yOiBmb3JtYXQgbm90IGEgc3RyaW5nIGxpdGVyYWwgYW5kIG5vIGZvcm1hdCBhcmd1bWVudHMgWy1XZXJyb3I9Zm9ybWF0LXNlY3VyaXR5XQoKMjAxOS0wMi0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6dmVjdG9yIGltcHJvdmVtZW50cyBmb3IgdHlwZXMgdGhhdCBkbyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCgogICAgICAgICAgICBUaGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gd29yayBieSBkZWZhdWx0IGZvciBlbGVtZW50cyB0aGF0IGFyZQogICAgICAgICAgICBub3QgZGVmYXVsdCBpbnNlcnRhYmxlLCBpLmUuIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4gVGhpcyBoYXMgYmVlbiBhY2hpZXZlZCBieQogICAgICAgICAgICBub3Qgd3JhcHBpbmc6CgogICAgICAgICAgICAgIHZlY3RvcihzaXplX3R5cGUgbik7CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSBhYm92ZSBoYWQgdG8gYmUgaWdub3JlZCB2aWEgJWlnbm9yZS4KCiAgICAgICAgICAgIElmIHRoZSBhYm92ZSBjb25zdHJ1Y3RvciBpcyBzdGlsbCByZXF1aXJlZCBpdCBjYW4gYmUgYWRkZWQgYmFjayBpbiBhZ2FpbiB2aWEgJWV4dGVuZDoKCiAgICAgICAgICAgICAgJWV4dGVuZCBzdGQ6OnZlY3RvciB7CiAgICAgICAgICAgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIGNvdW50KSB7IHJldHVybiBuZXcgc3RkOjp2ZWN0b3I8IFQgPihjb3VudCk7IH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgZm9sbG93aW5nIHdyYXBwZWQgY29uc3RydWN0b3IgY291bGQgYmUgdXNlZCBhcyBpdCBwcm92aWRlcyBuZWFyLWVub3VnaAogICAgICAgICAgICBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHk6CgogICAgICAgICAgICAgIHZlY3RvcihqaW50IGNvdW50LCBjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSk7CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTktMDItMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBjb21waWxlIGVycm9ycyB3cmFwcGluZyBvdmVybG9hZGVkIGZ1bmN0aW9ucy9jb25zdHJ1Y3RvcnMgd2hlcmUgYSB2YXJhcmcKICAgICAgICAgICAgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYWZ0ZXIgYSBub24tdmFyYXJnIGZ1bmN0aW9uLgoKMjAxOS0wMi0yMzogenBoZW5zbGV5NDIKICAgICAgICAgICAgVXNlIGZ1bGx5IHF1YWxpZmllZCBuYW1lICdqYXZhLmxhbmcuT2JqZWN0JyBpbnN0ZWFkIG9mICdPYmplY3QnIGluIGdlbmVyYXRlZCBjb2RlIHRvCiAgICAgICAgICAgIGF2b2lkIGNsYXNoZXMgd2l0aCB3cmFwcGVkIEMrKyBjbGFzc2VzIGNhbGxlZCAnT2JqZWN0Jy4KCjIwMTktMDItMjM6IGd0YlgKICAgICAgICAgICAgW0phdmFdICMxMDM1IEFkZCAoY29uc3QgY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcyBpbiBhZGRpdGlvbiB0byB0aGUgbm9uLWNvbnN0CiAgICAgICAgICAgIHR5cGVtYXBzIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHdoaWNoIGRvZXMgbm90IGF0dGVtcHQgdG8gd3JpdGUgYmFjayB0byB0aGUgY29uc3QKICAgICAgICAgICAgc3RyaW5nLgoKMjAxOS0wMi0yMjogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTg0IEFkZCBzdXBwb3J0IGZvciBSVHlwZWREYXRhIGludHJvZHVjZWQgaW4gUnVieSAxLjkuMy4KCjIwMTktMDItMjI6IFphY2tlcnlTcHl0egogICAgICAgICAgICAjMTQ4MyBGaXggY29tcGlsYXRpb24gZmFpbHVyZXMgd2hlbiBhIGRpcmVjdG9yIGNsYXNzIGhhcyBmaW5hbCBtZXRob2RzLgoKMjAxOS0wMi0yMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMxMjQwIFN1cHByZXNzIEphdmEgOSBkZXByZWNhdGlvbiB3YXJuaW5ncyBvbiBmaW5hbGl6ZSBtZXRob2QuCgoyMDE5LTAyLTIxOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgIzE0ODAgRml4IHNvbWUgcmVqZWN0aW9ucyBvZiB2YWxpZCBmbG9hdGluZy1wb2ludCBsaXRlcmFscy4KCjIwMTktMDItMTk6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNDc1IEZpeCByZWdyZXNzaW9uIHBhcnNpbmcgZ2NjIHByZXByb2Nlc3NvciBsaW5lbWFya2VycyBpbiB0aGUgZm9ybToKCiAgICAgICAgICAgICMgbGluZW51bSBmaWxlbmFtZSBmbGFncwoKMjAxOS0wMi0xODogamFrZWNvYmIKICAgICAgICAgICAgW1B5dGhvbl0gIzk0NSAjMTIzNCBFbGVtZW50cyBpbiBzdGQ6OnZlY3RvciBtZW1vcnkgYWNjZXNzIGZpeC4KCiAgICAgICAgICAgIEFjY2Vzc2luZyBhbiBlbGVtZW50IGluIGEgc3RkOjp2ZWN0b3Igb2J0YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB2aWEgYW4KICAgICAgICAgICAgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4gSWYgdGhlIHZlY3RvciBpcyBnYXJiYWdlIGNvbGxlY3RlZCwKICAgICAgICAgICAgdGhlIFNXSUcgd3JhcHBlciBjb250YWluaW5nIHRoZSBwb2ludGVyIHRvIHRoZSBlbGVtZW50IGJlY29tZXMgaW52YWxpZC4gVGhlIGZpeCBpcwogICAgICAgICAgICB0byBvYnRhaW4gYSBiYWNrLXJlZmVyZW5jZSB0byB0aGUgY29udGFpbmVyIGJ5IHRoZSB3cmFwcGVyIHRvIHRoZSBlbGVtZW50IGluIHRoZSBQeXRob24KICAgICAgICAgICAgbGF5ZXIgdG8gcHJldmVudCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgZnJvbSBkZXN0cm95aW5nIHRoZSB1bmRlcmx5aW5nIGNvbnRhaW5lci4KCjIwMTktMDItMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlbWFwIG1hdGNoaW5nIHRvIGV4cGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdoZW4gdGhlIG5hbWUgY29udGFpbnMKICAgICAgICAgICAgdGVtcGxhdGUgcGFyYW1ldGVycy4gSW4gdGhlICV0eXBlbWFwIGJlbG93IHRoZSB0eXBlIGlzIFQgYW5kIHRoZSBuYW1lIGlzIFg8VD46Om1ha2UKICAgICAgICAgICAgYW5kIHRoZSBuYW1lIG5vdyBleHBhbmRzIGNvcnJlY3RseSB0byBYPCBpbnQgPjo6bWFrZQoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFQgWDxUPjo6bWFrZSAiLi4uIgogICAgICAgICAgICAgICAgVCBtYWtlKCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFhpbnQpIFg8aW50PjsKCjIwMTktMDItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzZXIgZXJyb3IgY29udGFpbmluZyBtdWx0aXBsZSAjZGVmaW5lIHN0YXRlbWVudHMgaW5zaWRlIGFuIGVudW0uCgogICAgICAgICAgICBUaGUgc2Vjb25kICNkZWZpbmUgZmFpbHMgdG8gcGFyc2U6CgogICAgICAgICAgICAgIGVudW0gRm9vRW51bSB7CiAgICAgICAgICAgICAgICBFTlVNMSA9IDAsCiAgICAgICAgICAgICAgICBFTlVNMiA9IDEsCgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk9fREVGMSAiSGVsbG8iCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNST19ERUYyICJXb3JsZCEiCgogICAgICAgICAgICAgICAgRU5VTTMgPSAyLAogICAgICAgICAgICAgICAgRU5VTTQgPSAzLAogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBCdWcgbWVudGlvbmVkIGF0IGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9wYXRjaGVzLzMzMy8KCjIwMTktMDItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzb21lIG1pc3NpbmcgY29weSBjb25zdHJ1Y3RvcnMgaW50byBTVEwgY29udGFpbmVycy4KCjIwMTktMDItMTQ6IGJrb3R6egogICAgICAgICAgICBbSmF2YV0gIzEzNTYgQWRkIFNUTCBjb250YWluZXJzOgogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldAogICAgICAgICAgICAgIHN0ZDo6c2V0CgoyMDE5LTAyLTE0OiBia290enoKICAgICAgICAgICAgW0phdmFdICMxMzU2IHN0ZDo6bWFwIHdyYXBwZXJzIGhhdmUgYmVlbiBtb2RpZmllZC4gTm93IHRoZSBKYXZhIHByb3h5IGNsYXNzCiAgICAgICAgICAgIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0TWFwLiBUaGUgc3RkOjptYXAgY29udGFpbmVyIGxvb2tzIGFuZCBmZWVscyBtdWNoIGxpa2UKICAgICAgICAgICAgYSBqYXZhLnV0aWwuSGFzaE1hcCBmcm9tIEphdmEuCgogICAgICAgICAgICBBIGZldyBtZW1iZXJzIGhhdmUgY2hhbmdlZCB0aGVpciBuYW1lcy4gSWYgdGhlIG9sZCBtZXRob2Qgc2lnbmF0dXJlcyBhcmUgbmVlZGVkLAogICAgICAgICAgICB0aGVuIGNvcHkgc3RkX21hcC5pIGZyb20gc3dpZy0zLjAuMTIgYW5kIHVzZSB0aGF0IGluc3RlYWQuIEFsdGVybmF0aXZlbHksCiAgICAgICAgICAgIGFkZCB0aGUgb2xkIG1pc3NpbmcgbWV0aG9kcyB0byB0aGUgbmV3IG1ldGhvZHMgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyAlcHJveHljb2RlOgoKICAgICAgICAgICAgICAlZXh0ZW5kIHN0ZDo6bWFwIHsKICAgICAgICAgICAgICAlcHJveHljb2RlICV7CiAgICAgICAgICAgICAgICAvLyBPbGQgQVBJCiAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRW1wdHkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldCgkdHlwZW1hcChqYm94dHlwZSwgSykga2V5LCAkdHlwZW1hcChqYm94dHlwZSwgVCkgeCkgewogICAgICAgICAgICAgICAgICBwdXQoa2V5LCB4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlbCgkdHlwZW1hcChqYm94dHlwZSwgSykga2V5KSB7CiAgICAgICAgICAgICAgICAgIHJlbW92ZShrZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzX2tleSgkdHlwZW1hcChqYm94dHlwZSwgSykga2V5KSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc0tleShrZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTAyLTEzOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgIzE0NjkgQWRkIHN1cHBvcnQgZm9yIEMrKzE3IGhleGFkZWNpbWFsIGZsb2F0aW5nIGxpdGVyYWxzLgoKMjAxOS0wMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW09DYW1sXSAjMTQzNyBPQ2FtbCBoYXMgYmVlbiBnaXZlIHRoZSAnRXhwZXJpbWVudGFsJyBsYW5ndWFnZSBzdGF0dXMuIFRoZSBleGFtcGxlcyB3b3JrCiAgICAgICAgICAgIGFuZCBtb3N0IG9mIHRoZSB0ZXN0LXN1aXRlIGlzIGFsc28gd29ya2luZywgc28gaXQgaXMgcXVpdGUgY2xvc2UgdG8gYmVpbmcgYSAnU3VwcG9ydGVkJyBsYW5ndWFnZS4KCjIwMTktMDItMTA6IFphY2tlcnlTcHl0egoJICAgICMxNDY0IEFkZCBzdXBwb3J0IGZvciBDKysxNCBiaW5hcnkgaW50ZWdlciBsaXRlcmFscy4KCjIwMTktMDItMTA6IFphY2tlcnlTcHl0egoJICAgICMxNDUwIEFkZCBzdXBwb3J0IGZvciBDKysxMSBVQ1MtMiBhbmQgVUNTLTQgY2hhcmFjdGVyIGxpdGVyYWxzLiBBbHNvLCBhZGQgc3VwcG9ydCBmb3IKICAgICAgICAgICAgQysrMTcgVVRGLTggY2hhcmFjdGVyIGxpdGVyYWxzLgoKMjAxOS0wMi0xMDogd3NmdWx0b24KCSAgICBbTXpTY2hlbWVdICMxNDM3IE16U2NoZW1lL1JhY2tldCBpcyBub3cgYW4gJ0V4cGVyaW1lbnRhbCcgbGFuZ3VhZ2UuIFRoZSBleGFtcGxlcyB3b3JrCiAgICAgICAgICAgIGFuZCBhIGxhcmdlIHBvcnRpb24gb2YgdGhlIHRlc3Qtc3VpdGUgaXMgYWxzbyB3b3JraW5nLgoKMjAxOS0wMi0xMDogd3NmdWx0b24KCSAgICBbTXpTY2hlbWVdIERlc3RydWN0b3Igd3JhcHBlcnMgd2VyZSBub3QgYmVpbmcgZ2VuZXJhdGVkLgoKMjAxOS0wMi0xMDogd3NmdWx0b24KCSAgICBbTXpTY2hlbWVdIFN0YXRpYyB2YXJpYWJsZSB3cmFwcGVycyBmaXhlZCAtICRhcmdudW0gd2FzIG5vdCBleHBhbmRlZC4KCjIwMTktMDItMTA6IHNldGhyagoJICAgICMxNDUyIEZpeCAlYXBwbHkgZm9yIGFub255bW91cyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucwoKMjAxOS0wMi0wOTogb2xseQoJICAgIFtQSFBdIEZpeCBhY2Nlc3MgdG8gYWxyZWFkeSByZWxlYXNlZCBtZW1vcnkgZHVyaW5nIFBIUCBtb2R1bGUKCSAgICBzaHV0ZG93biwgd2hpY2ggb2Z0ZW4gZGlkbid0IGNhdXNlIHZpc2libGUgcHJvYmxlbXMsIGJ1dCBjb3VsZAoJICAgIHJlc3VsdCBpbiBzZWdtZW50YXRpb24gZmF1bHRzLCBidXMgZXJyb3JzLCBldGMuICBGaXhlcyAjMTE3MCwKCSAgICByZXBvcnRlZCBieSBKaXRrYSBQbGVzbu1rb3bhLgoKMjAxOS0wMi0wOTogb2xseQoJICAgIFtQSFBdIEEgcmVuYW1lZCBjb25zdHJ1Y3RvciBpcyBub3cgd3JhcHBlZCBhcyBhIHN0YXRpYyBtZXRob2QgaW4KCSAgICBQSFAuCgoyMDE5LTAyLTA4OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgZ2VuZXJhdGUgY29kZSB3aGljaCByZWZlcmVuY2VzICRyIHdoZW4gJHIgaGFzbid0IGJlZW4KCSAgICBkZWZpbmVkLiAgVGhpcyBjb3VsZCBoYXBwZW4gaW4gb3ZlcmxvYWRlZCBtZXRob2RzIHdoaWNoIHJldHVybmVkCgkgICAgdm9pZCBhbmQgdG9vayBhdCBsZWFzdCBvbmUgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlci4KCjIwMTktMDItMDg6IG9sbHkKCSAgICBbUEhQXSBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgbm93IGNvbXBhdGlibGUgd2l0aCBQSFAgNy4zLCBhbmQgdGhlCgkgICAgdGVzdHN1aXRlIG5vdyBydW5zIGNsZWFubHkgd2l0aCB0aGlzIHZlcnNpb24gdG9vLgoKMjAxOS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgIzE0MzcgU1dJRyBub3cgY2xhc3NpZmllcyB0aGUgc3RhdHVzIG9mIHRhcmdldCBsYW5ndWFnZXMgaW50byBlaXRoZXIgJ0V4cGVyaW1lbnRhbCcgb3IKICAgICAgICAgICAgJ1N1cHBvcnRlZCcuIFRoaXMgc3RhdHVzIGlzIHByb3ZpZGVkIHRvIGluZGljYXRlIHRoZSBsZXZlbCBvZiBtYXR1cml0eSB0byBleHBlY3Qgd2hlbiB1c2luZwogICAgICAgICAgICBhIHBhcnRpY3VsYXIgdGFyZ2V0IGxhbmd1YWdlIGFzIG5vdCBhbGwgdGFyZ2V0IGxhbmd1YWdlcyBhcmUgZnVsbHkgZGV2ZWxvcGVkLiBEZXRhaWxzIGFyZQogICAgICAgICAgICBpbiB0aGUgSW50cm9kdWN0aW9uLmh0bWwgY2hhcHRlciBvZiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW0NGRkldICMxNDQ3IENvbW1vbiBMaXNwIENGRkkgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbQWxsZWdyb2NsXSAjMTQ0NyBBbGxlZ3JvIENvbW1vbiBMaXNwIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW0NoaWNrZW5dICMxNDQ3IENISUNLRU4gaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbQ0xJU1BdICMxNDQ3IEdOVSBDb21tb24gTGlzcCBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtTLUVYUF0gIzE0NDcgQ29tbW9uIExpc3AgUy1FeHAgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbVUZGSV0gIzE0NDcgQ29tbW9uIExpc3AgVUZGSSBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtQaWtlXSAjMTQ0NyBQaWtlIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW01vZHVsYTNdICMxNDQ3IE1vZHVsYTMgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wMjogYWhub2xkcwoJICAgIFtQeXRob25dIERvY3VtZW50YXRpb24gZW5oYW5jZW1lbnRzIGZvciBQeXRob246CgogICAgICAgICAgICAjNzI4IEZpeGVkIHRoZSBoYW5kbGluZyBvZiBhdXRvZG9jIHdoZW4gdXNpbmcgLWZhc3Rwcm94eS4KCiAgICAgICAgICAgICMxMzY3IEFkZGVkIGRvY3VtZW50YXRpb24gdG8gd3JhcHBlZCBtZW1iZXIgdmFyaWFibGVzIHVzaW5nIHRoZQogICAgICAgICAgICBwcm9wZXJ0eSguLi4gZG9jPSIuLi4iKSBjb25zdHJ1Y3QuCgogICAgICAgICAgICBPbmx5IHNob3cgYSBzaW5nbGUgZG9jdW1lbnRhdGlvbiBlbnRyeSBmb3IgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgd2hlbgogICAgICAgICAgICB1c2luZyBhdXRvZG9jLgoKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2hlcmUgYSBjYWNoZWQgZG94eWdlbiBkb2NzdHJpbmcgY291bGQgYmUgZGVsZXRlZCB3aGlsZSBzdGlsbCBpbiB1c2UsCiAgICAgICAgICAgIGNhdXNpbmcgc3dpZyB0byBzZWdmYXVsdC4KCjIwMTktMDEtMzE6IG9sbHkKCSAgICBTV0lHIG5vdyByZXF1aXJlcyBhIHRhcmdldCBsYW5ndWFnZSB0byBiZSBzcGVjaWZpZWQgaW5zdGVhZCBvZgoJICAgIGRlZmF1bHRpbmcgdG8gd3JhcHBpbmcgZm9yIFRjbC4gIFNwZWNpZnlpbmcgc3dpZyAtLWhlbHAgd2l0aG91dAoJICAgIGEgdGFyZ2V0IGxhbmd1YWdlIG5vdyBqdXN0IHNob3dzIHRoZSBnZW5lcmljIGhlbHAuICBUaGUgLW5vbGFuZwoJICAgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLgoKMjAxOS0wMS0yODogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtPQ2FtbF0gIzE0MjkgUmVtb3ZlIHN1cHBvcnQgZm9yIE9DYW1sIHZlcnNpb25zIDwgMy4xMi4wLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTAxLTIyOiB2YWR6CiAgICAgICAgICAgIFtSdWJ5LCBPY3RhdmVdICMxNDI0IEltcHJvdmUgYXV0b2RvYyBwYXJhbWV0ZXIgbmFtaW5nLgoKMjAxOS0wMS0yMjogdmFkegogICAgICAgICAgICBbUHl0aG9uXSAjMTI3MSAjMTQyMyBBbHdheXMgaW5jbHVkZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgaW4gYXV0b2RvYyBzdHJpbmdzLgoKMjAxOS0wMS0xOTogdmFkegogICAgICAgICAgICAjMTI3MiwgIzE0MjEgV2hlbiBhIGZ1bmN0aW9uJ3MgcGFyYW1ldGVyIGlzIGEga2V5d29yZCwgdGhlIG5hbWUgb2YgdGhlIHBhcmFtYXRlciBpcwogICAgICAgICAgICBubyBsb25nZXIgc2ltcGx5IGNoYW5nZWQgdG8gYXJnTiwgd2hlcmUgTiBpcyB0aGUgYXJndW1lbnQgbnVtYmVyLiBJbnN0ZWFkIHRoZQogICAgICAgICAgICBwYXJhbWV0ZXIgbmFtZSBpcyBjaGFuZ2VkIHRvIHRoZSByZW5hbWluZyBydWxlcyBmb3Iga2V5d29yZHMgdGhhdCBub3JtYWxseSBhcHBseSB0bwogICAgICAgICAgICBzeW1ib2xzIHN1Y2ggYXMgY2xhc3Nlcy9mdW5jdGlvbnMgZXRjLiBOb3RlIHRoYXQgdW5saWtlIG90aGVyIHN5bWJvbCByZW5hbWluZywKICAgICAgICAgICAgcGFyYW1ldGVyIHJlbmFtaW5nIGRvZXMgbm90IGlzc3VlIGEgd2FybmluZyB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgcmVuYW1lZC4gVGhpcwogICAgICAgICAgICBjaGFuZ2Ugb25seSBhZmZlY3RzIGxhbmd1YWdlcyB3aGVyZSB0aGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBhY3R1YWxseSB1c2VkLCBmb3IgZXhhbXBsZSwKICAgICAgICAgICAgSmF2YSBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdHMgaW4gdGhlIHByb3h5IGNsYXNzIG9yIFB5dGhvbiBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLgoKMjAxOS0wMS0xODogd3NmdWx0b24KICAgICAgICAgICAgIzE0MjAgRml4IGdkYiBkZWJ1Z2dlciBmdW5jdGlvbnMgJ3N3aWdwcmludCcgYW5kICdsb2Nzd2lncHJpbnQnIGZyb20gc3dpZy5nZGIgdG8KICAgICAgICAgICAgd29yayB3aXRoIG5ld2VyIHZlcnNpb25zIG9mIGdkYi04LiBGaXhlcyBlcnJvcnMgd2hlbiBkZWJ1Z2dpbmcgU1dJRyBzb3VyY2Ugd2l0aCBnZGI6CgogICAgICAgICAgICAgIChnZGIpIHN3aWdwcmludCBuCiAgICAgICAgICAgICAgVW5kZWZpbmVkIGNvbW1hbmQ6ICJQcmludGYiLiAgVHJ5ICJoZWxwIi4KCjIwMTktMDEtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFB5dGhvbiBzdGF0aWMgbWV0aG9kIHdyYXBwZXIgY2hhbmdlcwoKICAgICAgICAgICAgLSBTdGF0aWMgbWV0aG9kIHdyYXBwZXJzIHdlcmUgdXNpbmcgdGhlICdmYXN0cHJveHknIGFwcHJvYWNoIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgICAgVGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBpbnN0YW5jZSBtZXRob2Qgd3JhcHBlcnMuIFRoZSBmYXN0cHJveHkgYXBwcm9hY2gKICAgICAgICAgICAgICBpcyBub3cgdHVybmVkIG9mZiBieSBkZWZhdWx0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBpbnN0YW5jZSBtZXRob2RzLgogICAgICAgICAgICAgIFN0YXRpYyBtZXRob2Qgd3JhcHBlcnMgY2FuIG5vdyBhbHNvIGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIC1mYXN0cHJveHkgYW5kCiAgICAgICAgICAgICAgLW9sZGRlZnMgb3B0aW9ucy4KCiAgICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3MgewogICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IHN0YXRtZXRob2QoaW50IGEgPSAyKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIGdlbmVyYXRlcyBieSBkZWZhdWx0OgoKICAgICAgICAgICAgICBjbGFzcyBLbGFzcyhvYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAogICAgICAgICAgICAgICAgICBkZWYgc3RhdG1ldGhvZChhPTIpOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leGFtcGxlLktsYXNzX3N0YXRtZXRob2QoYSkKCiAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nICh3aGljaCBjYW4gYmUgcmVzdG9yZWQgYnkgdXNpbmcgLWZhc3Rwcm94eSk6CgogICAgICAgICAgICAgICAgY2xhc3MgS2xhc3Mob2JqZWN0KToKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHN0YXRtZXRob2QgPSBzdGF0aWNtZXRob2QoX2V4YW1wbGUuS2xhc3Nfc3RhdG1ldGhvZCkKCiAgICAgICAgICAgICAgLSBNb2Rlcm5pc2Ugd3JhcHBlcnMgZm9yIHN0YXRpYyBtZXRob2RzIHRvIHVzZSBkZWNvcmF0b3Igc3ludGF4IC0gQHN0YXRpY21ldGhvZC4KCiAgICAgICAgICAgICAgLSBBZGQgbWlzc2luZyBydW50aW1lIHRlc3QgZm9yIHN0YXRpYyBjbGFzcyBtZXRob2RzIGFuZCB1c2luZyB0aGUgYWN0dWFsIGNsYXNzIG1ldGhvZC4KCjIwMTktMDEtMTI6IFphY2tlcnlTcHl0egogICAgICAgICAgICBbT0NhbWxdICMxNDAzICMxMTk0IEZpeCBjb21waWxhdGlvbiBwcm9ibGVtcyBmb3IgT0NhbWwgPj0gNC4wMy4wIGR1ZSB0byBPQ2FtbCB1c2luZwogICAgICAgICAgICBpbnQ2NF90IGluc3RlYWQgb2YgaW50NjQuCgoyMDE5LTAxLTExOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTQwMCBGaXggdGhlIGdldHRlcnMgYW5kIHNldHRlcnMgb2Ygbm9uLXN0YXRpYyBtZW1iZXIgdmFyaWFibGVzLgoKMjAxOS0wMS0wNzogd3NmdWx0b24KICAgICAgICAgICAgIzM1OCBBZGQgVk9JRCB0byB3aW5kb3dzLmkKCjIwMTktMDEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICM5NDggIzEwMTkgIzEyNzMgRml4IGZvciBDKysxMSByYXcgc3RyaW5ncyB3aGVyZSB0aGUgZGVsaW1pdGVycyB3ZXJlIG1pc3Rha2VubHkgbGVmdAogICAgICAgICAgICBpbiB0aGUgc3RyaW5nIGNvbnRlbnRzIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cmluZyB3YXMgY29waWVkIGludG8gZ2VuZXJhdGVkIGNvZGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlLCAlY29uc3RhbnQsIHRoZSAiZG9jc3RyaW5nIiBmZWF0dXJlIGFuZCBmb3IgQyMvSmF2YS9EIGNvbnN0YW50cyB0dXJuZWQgb24KICAgICAgICAgICAgd2l0aCAlamF2YWNvbnN0LyVjc2NvbnN0LyVkbWFuaWZlc3Rjb25zdC4KCjIwMTktMDEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSAjNTM4LiBGaXggUnVieSBzdXBwb3J0IGZvciAlZmVhdHVyZSgiZG9jc3RyaW5nIikuCgoyMDE5LTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTIwMiBGaXggb3ZlcmxvYWRpbmcgb2Ygbm9uLXBvaW50ZXIgY2xhc3MgdHlwZXMgaW4gc2NyaXB0aW5nIGxhbmd1YWdlcyB3aGVuIG92ZXJsb2FkZWQKICAgICAgICAgICAgd2l0aCBhIHBvaW50ZXIgYW5kIGEgTlVMTCBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXF1aXZhbGVudCBpcyB1c2VkLCBlZyBOb25lIGluIFB5dGhvbi4KCiAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIHRoZSBTV0lHVFlQRSwgU1dJR1RZUEUmIGFuZCBTV0lHVFlQRSYmIHR5cGVjaGVjayB0eXBlbWFwcyB0bwogICAgICAgICAgICBwcmV2ZW50IGFjY2VwdGluZyBhIGNvbnZlcnNpb24gdG8gYSBOVUxMIHBvaW50ZXIuCgoyMDE5LTAxLTAzOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTM4NiBGaXggdGhlIE9DYW1sIGV4YW1wbGVzIGFuZCB0ZXN0IHN1aXRlIGZvciBvdXQtb2Ytc291cmNlIGJ1aWxkcy4KCjIwMTktMDEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM2MzkgcmVtb3ZlIGR1cGxpY2F0ZSBwcm94eSBtZXRob2QgZGVmaW5pdGlvbnMgZm9yIGdsb2JhbCBmdW5jdGlvbiB3cmFwcGVycy4KCiAgICAgICAgICAgIEdsb2JhbCBmdW5jdGlvbnMgcHJldmlvdXNseSBnZW5lcmF0ZWQgdHdvIGRlZmluaXRpb25zLCBlZzoKCiAgICAgICAgICAgICAgZGVmIGZvbygpOgogICAgICAgICAgICAgICAgICByZXR1cm4gX2V4YW1wbGUuZm9vKCkKICAgICAgICAgICAgICBmb28gPSBfZXhhbXBsZS5mb28KCiAgICAgICAgICAgIFRoZSBmaXJzdCBkZWZpbml0aW9uIGlzIHJlcGxhY2VkIGJ5IHRoZSBzZWNvbmQgZGVmaW5pdGlvbiBhbmQgc28gdGhlIHNlY29uZCBkZWZpbml0aW9uCiAgICAgICAgICAgIGlzIHRoZSBvbmUgdXNlZCB3aGVuIHRoZSBtZXRob2QgaXMgYWN0dWFsbHkgY2FsbGVkLiBOb3cganVzdCB0aGUgZmlyc3QgZGVmaW5pdGlvbiBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBhbmQgaWYgdGhlIC1mYXN0cHJveHkgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyB1c2VkLCBqdXN0IHRoZSBzZWNvbmQKICAgICAgICAgICAgZGVmaW5pdGlvbiBpcyBnZW5lcmF0ZWQuIFRoZSBzZWNvbmQgZGVmaW5pdGlvbiBpcyBmYXN0ZXIgYXMgaXQgYXZvaWRzIHRoZSBwcm94eSBQeXRob24KICAgICAgICAgICAgbWV0aG9kIGFzIGl0IGNhbGxzIHRoZSBsb3ctbGV2ZWwgQyB3cmFwcGVyIGRpcmVjdGx5LiBVc2luZyBib3RoIC1mYXN0cHJveHkgYW5kIC1vbGRkZWZzCiAgICAgICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb25zIHdpbGwgcmVzdG9yZSB0aGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgY29kZSBhcyBpdCB3aWxsIGdlbmVyYXRlIGJvdGgKICAgICAgICAgICAgbWV0aG9kIGRlZmluaXRpb25zLgoKICAgICAgICAgICAgV2l0aCB0aGlzIGNoYW5nZSwgdGhlIHdyYXBwZXJzIGZvciBnbG9iYWwgQy9DKysgZnVuY3Rpb25zIGFuZCBDKysgY2xhc3MgbWV0aG9kcyBub3cgd29yawogICAgICAgICAgICBpbiB0aGUgc2FtZSB3YXkgd3J0IHRvIGdlbmVyYXRpbmcganVzdCBhIHByb3h5IG1ldGhvZCBieSBkZWZhdWx0IGFuZCBjb250cm9sIHZpYQogICAgICAgICAgICAtZmFzdHByb3h5Ly1vbGRkZWZzIG9wdGlvbnMuCgoyMDE4LTEyLTIwOiBoYXNpbm9mZix3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzEzMzQgU2V0IEphdmEgdGhyZWFkIG5hbWUgdG8gbmF0aXZlIHRocmVhZCBuYW1lIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKICAgICAgICAgICAgRGVmYXVsdCBpcyB0byB1c2UgbmFtZSAiVGhyZWFkLVhYWCIgYW5kIGlzIHN0aWxsIHdvcmtzIGxpa2UgdGhpcyBieSBkZWZhdWx0LiBIb3dldmVyLAogICAgICAgICAgICBhZGRpbmcgdGhlIGZvbGxvd2luZyB3aWxsIHR1cm4gb24gdGhlIHRocmVhZCBuYW1lIHNldHRpbmcgKHdvcmtzIGZvciBtb3JlIHJlY2VudAogICAgICAgICAgICB2ZXJzaW9ucyBvZiBMaW51eCBhbmQgTWFjT1MpOgoKICAgICAgICAgICAgJWJlZ2luICV7CiAgICAgICAgICAgICNkZWZpbmUgU1dJR19KQVZBX1VTRV9USFJFQURfTkFNRQogICAgICAgICAgICAlfQoKMjAxOC0xMi0yMDogY2hsYW5kc2kKICAgICAgICAgICAgW1B5dGhvbl0gIzEzNTcuIEZpeCBvdmVycmlkaW5nIF9fbmV3X18gaW4gUHl0aG9uIDMuNi4KCiAgICAgICAgICAgIEZpeGVzIFN5c3RlbUVycm9yOiBPYmplY3RzL3R1cGxlb2JqZWN0LmM6ODE6IGJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiIKCjIwMTgtMTItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM4NDggIzEzNDMgVGhlIG1vZHVsZSBpbXBvcnQgbG9naWMgaGFzIGNoYW5nZWQgdG8gc3RvcCBvYmZ1c2NhdGluZyByZWFsIEltcG9ydEVycm9yCiAgICAgICAgICAgIHByb2JsZW1zLiBPbmx5IG9uZSBpbXBvcnQgb2YgdGhlIGxvdy1sZXZlbCBDL0MrKyBtb2R1bGUgZnJvbSB0aGUgcHVyZSBQeXRob24gbW9kdWxlIGlzCiAgICAgICAgICAgIGF0dGVtcHRlZCBub3cuIFByZXZpb3VzbHkgYSBzZWNvbmQgaW1wb3J0IG9mIHRoZSBsb3ctbGV2ZWwgQy9DKysgbW9kdWxlIHdhcyBhdHRlbXB0ZWQKICAgICAgICAgICAgYWZ0ZXIgYW4gSW1wb3J0RXJyb3Igb2NjdXJyZWQgYW5kIHdhcyBkb25lIHRvIHN1cHBvcnQgJ3NwbGl0IG1vZHVsZXMnLiBBICdzcGxpdCBtb2R1bGUnIGlzCiAgICAgICAgICAgIGEgY29uZmlndXJhdGlvbiB3aGVyZSB0aGUgcHVyZSBQeXRob24gbW9kdWxlIGlzIGEgbW9kdWxlIHdpdGhpbiBhIFB5dGhvbiBwYWNrYWdlIGFuZCB0aGUKICAgICAgICAgICAgbG93LWxldmVsIEMvQysrIG1vZHVsZSBpcyBhIGdsb2JhbCBQeXRob24gbW9kdWxlLiBOb3cgYSAnc3BsaXQgbW9kdWxlJyBjb25maWd1cmF0aW9uIGlzCiAgICAgICAgICAgIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4gVGhpcyBjb25maWd1cmF0aW9uIGNhbiBiZSBzdXBwb3J0ZWQgd2l0aCBhIHNpbXBsZQogICAgICAgICAgICBjdXN0b21pemF0aW9uLCBzdWNoIGFzOgoKICAgICAgICAgICAgICAlbW9kdWxlKHBhY2thZ2U9Im15cGFja2FnZSIsIG1vZHVsZWltcG9ydD0iaW1wb3J0ICRtb2R1bGUiKSBmb28KCiAgICAgICAgICAgIG9yIGlmIHVzaW5nIC1idWlsdGluOgoKICAgICAgICAgICAgICAlbW9kdWxlKHBhY2thZ2U9Im15cGFja2FnZSIsIG1vZHVsZWltcG9ydD0iZnJvbSAkbW9kdWxlIGltcG9ydCAqIikgZm9vCgogICAgICAgICAgICBpbnN0ZWFkIG9mCgogICAgICAgICAgICAgICVtb2R1bGUocGFja2FnZT0ibXlwYWNrYWdlIikgZm9vCgogICAgICAgICAgICBTZWUgdGhlIHVwZGF0ZWQgUHl0aG9uIGNoYXB0ZXIgdGl0bGVkICJMb2NhdGlvbiBvZiBtb2R1bGVzIiBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMTgtMTItMTE6IHRsYnkKICAgICAgICAgICAgW1BlcmxdICMxMzc0IHJlcGFpciBFWFRFTkQoKSBoYW5kbGluZyBpbiB0eXBlbWFwcwoKMjAxOC0xMi0wNjogdmFkegogICAgICAgICAgICAjMTM1OSAjMTM2NCBBZGQgbWlzc2luZyBuZXN0ZWQgY2xhc3MgZGVzdHJ1Y3RvciB3cmFwcGVyIHdoZW4gdGhlIG5lc3RlZCBjbGFzcyBpcwogICAgICAgICAgICBpbnNpZGUgYSB0ZW1wbGF0ZS4gUmVtb3ZlcyBhc3NvY2lhdGVkIGJvZ3VzICdJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZScgd2FybmluZy4gT25seQogICAgICAgICAgICBvY2N1cnJlZCB3aGVuIHRoZSBuZXN0ZWQgY2xhc3MnIGRlc3RydWN0b3IgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCgoyMDE4LTEyLTA0OiBhZHIyNgogICAgICAgICAgICBbUHl0aG9uXSAjMTM2OCAjMTM2OSBBY2Nlc3MgVmlvbGF0aW9uIGluIHRwX3ByaW50IGNhdXNlZCBieSBtaXNtYXRjaGVkIFB5dGhvbi9leHRlbnNpb24KICAgICAgICAgICAgQ1JUIHVzYWdlCgogICAgICAgICAgICBSZW1vdmUgYWxsIHVzZSBvZiB0cF9wcmludCwgYXMgdGhpcyBBUEkgdXNlcyBhIEZJTEUqLCB3aGljaCBjYW4gYmUKICAgICAgICAgICAgbWlzbWF0Y2hlZCB3aGVuIG1vZHVsZXMgYXJlIGJ1aWx0IHdpdGggZGlmZmVyZW50IEMgbGlicmFyaWVzIGZyb20KICAgICAgICAgICAgdGhlIG1haW4gcHl0aG9uIGV4ZWN1dGFibGUuCgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGJyaW5ncyBjb25zaXN0ZW50IG91dHB1dCBiZXR3ZWVuIFB5dGhvbiAyIGFuZCAzIGZvciB0aGUgJ2N2YXInIFNXSUcKICAgICAgICAgICAgb2JqZWN0ICh0aGF0IGNvbnRhaW5zIHRoZSBnbG9iYWwgdmFyaWFibGVzKSBhbmQgU1dJRyBwYWNrZWQgb2JqZWN0cyAoc3VjaCBhcyBjYWxsYmFjawogICAgICAgICAgICBjb25zdGFudHMpLgoKMjAxOC0xMi0wNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEyODIgRml4IHJ1bm5pbmcgJ3B5dGhvbiAtbScgIHdoZW4gdXNpbmcgJ3N3aWcgLWJ1aWx0aW4nCgogICAgICAgICAgICBTaW1pbGFyIHRvIHRoZSBlYXJsaWVyIFBFUCAzNjYgY29uZm9ybWluZyBmaXggZm9yIG5vbi1idWlsdGluLgoKMjAxOC0xMS0yOTogYWRyMjYKICAgICAgICAgICAgW1B5dGhvbl0gIzEzNjAgTGVhayBvZiBTV0lHIHZhciBsaW5rIG9iamVjdAoKICAgICAgICAgICAgRml4IHJlZmVyZW5jZSBjb3VudGluZyBvbiBfU1dJR19nbG9iYWxzIHRvIGFsbG93IHZhciBsaW5rIHRvIGJlIGZyZWVkIG9uIG1vZHVsZSB1bmxvYWQuCgoyMDE4LTExLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBXaGVuIHVzaW5nIC1idWlsdGluLCB0aGUgdHdvIHN0ZXAgQy1leHRlbnNpb24gbW9kdWxlIGltcG9ydCBpcyBub3cKICAgICAgICAgICAgb25lIHN0ZXAgYW5kIHRoZSB3cmFwcGVkIEFQSSBpcyBvbmx5IGF2YWlsYWJsZSBvbmNlIGFuZCBub3QgaW4gYW4gdW5kZXJseWluZwogICAgICAgICAgICBtb2R1bGUgYXR0cmlidXRlIGxpa2UgaXQgaXMgd2l0aG91dCAtYnVpbHRpbi4gVG8gdW5kZXJzdGFuZCB0aGlzLCBjb25zaWRlciBhCiAgICAgICAgICAgIG1vZHVsZSBuYW1lZCAnZXhhbXBsZScgKHVzaW5nOiAlbW9kdWxlIGV4YW1wbGUpLiBUaGUgQy1leHRlbnNpb24gaXMgY29tcGlsZWQgaW50bwogICAgICAgICAgICBhIFB5dGhvbiBtb2R1bGUgY2FsbGVkICdfZXhhbXBsZScgYW5kIGEgcHVyZSBQeXRob24gbW9kdWxlIHByb3ZpZGVzIHRoZSBhY3R1YWwKICAgICAgICAgICAgQVBJIGZyb20gdGhlIG1vZHVsZSBjYWxsZWQgJ2V4YW1wbGUnLiBJdCB3YXMgcHJldmlvdXNseSBwb3NzaWJsZSB0byBhZGRpdGlvbmFsbHkKICAgICAgICAgICAgYWNjZXNzIHRoZSBBUEkgZnJvbSB0aGUgbW9kdWxlIGF0dHJpYnV0ZSAnZXhhbXBsZS5fZXhhbXBsZScuIFRoZSBsYXR0ZXIgd2FzIGFuCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGRldGFpbCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gSXQgc2hvdWxkbid0IGhhdmUgYmVlbiB1c2VkLCBidXQKICAgICAgICAgICAgaWYgbmVjZXNzYXJ5IGl0IGNhbiBiZSByZXN1cnJlY3RlZCB1c2luZyB0aGUgbW9kdWxlaW1wb3J0IGF0dHJpYnV0ZSBkZXNjcmliZWQgaW4gdGhlCiAgICAgICAgICAgIFB5dGhvbiBjaGFwdGVyIG9mIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBib3RoIG1vZHVsZXMgYXJlIHByb3ZpZGVkIGluIGEgUHl0aG9uCiAgICAgICAgICAgIHBhY2thZ2UsIHRyeToKCiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImZyb20gLiBpbXBvcnQgX2V4YW1wbGVcbmZyb20gLl9leGFtcGxlIGltcG9ydCAqIikgZXhhbXBsZQogICAgICAgICAgICBvciBtb3JlIGdlbmVyaWNhbGx5OgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJmcm9tIC4gaW1wb3J0ICRtb2R1bGVcbmZyb20gLiRtb2R1bGUgaW1wb3J0ICoiKSBleGFtcGxlCgogICAgICAgICAgICBhbmQgaWYgYm90aCBhcmUgcHJvdmlkZWQgYXMgZ2xvYmFsIG1vZHVsZXMsIHRyeToKCiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImltcG9ydCBfZXhhbXBsZVxuZnJvbSBfZXhhbXBsZSBpbXBvcnQgKiIpIGV4YW1wbGUKICAgICAgICAgICAgb3IgbW9yZSBnZW5lcmljYWxseToKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iaW1wb3J0ICRtb2R1bGVcbmZyb20gJG1vZHVsZSBpbXBvcnQgKiIpIGV4YW1wbGUKCiAgICAgICAgICAgIFRoZSBtb2R1bGUgaW1wb3J0IGNvZGUgc2hvd24gd2lsbCBhcHBlYXIgaW4gdGhlIGV4YW1wbGUucHkgZmlsZS4KCjIwMTgtMTEtMjQ6IHZhZHoKICAgICAgICAgICAgIzEzNTggRml4IGhhbmRsaW5nIG9mIGFic3RyYWN0IGJhc2UgY2xhc3NlcyBuZXN0ZWQgaW5zaWRlIHRlbXBsYXRlcwoKICAgICAgICAgICAgQ29ycmVjdCBkZXRlY3Rpbmcgb2Ygd2hldGhlciBhIGRlcml2ZWQgY2xhc3MgbWV0aG9kIG92ZXJyaWRlcyBhIHB1cmUgdmlydHVhbAogICAgICAgICAgICBiYXNlIGNsYXNzIG1ldGhvZCB3aGVuIGJvdGggY2xhc3NlcyBhcmUgbmVzdGVkIGluc2lkZSBhIHRlbXBsYXRlIGNsYXNzOiB0aGlzCiAgICAgICAgICAgIG5vdGFibHkgZGlkbid0IHdvcmsgY29ycmVjdGx5IGZvciBtZXRob2RzIHRha2luZyBwYXJhbWV0ZXJzIG9mIHRoZSBiYXNlIGNsYXNzCiAgICAgICAgICAgIHR5cGUuCgoyMDE4LTExLTIyOiBydXBlcnRuYXNoCiAgICAgICAgICAgIFtQeXRob25dICMxMjgyIE1ha2UgZ2VuZXJhdGVkIG1vZHVsZSBydW5uYWJsZSB2aWEgcHl0aG9uIC1tIChQRVAgMzY2IGNvbmZvcm1pbmcpCgogICAgICAgICAgICBQcmV2aW91c2x5IGFueSBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIGluIGEgcGFja2FnZSB3b3VsZCBmYWlsIHdpdGggYW4gSW1wb3J0RXJyb3IKICAgICAgICAgICAgd2hlbiB1c2luZyAncHl0aG9uIC1tJyBmb3IgZXhhbXBsZSAncHl0aG9uIC1tIG15cGtnLm15bW9kdWxlJy4KCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gYWxsb3dzIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUgdG8gYmUgcGxhY2VkIGludG8gYSBkaXJlY3RvcnkgYW5kCiAgICAgICAgICAgIHRoZW4gcmVuYW1lZCBfX2luaXRfXy5weSB0byBjb252ZXJ0IHRoZSBtb2R1bGUgaW50byBhIHBhY2thZ2UgYWdhaW4uIFRoaXMgYWJpbGl0eQogICAgICAgICAgICBzdG9wcGVkIHdvcmtpbmcgaW4gc3dpZy0zLjAuOS4gSG93ZXZlciwgb25seSBQeXRob24gMi43IG9yIDMuMyBhbmQgbGF0ZXIgd29yay4gSWYKICAgICAgICAgICAgUHl0aG9uIDMuMiBzdXBwb3J0IGlzIG5lZWRlZCwgdXNlIG1vZHVsZWltcG9ydCBpbiAlbW9kdWxlIHRvIGN1c3RvbWlzZSB0aGUgaW1wb3J0CiAgICAgICAgICAgIGNvZGUuCgoyMDE4LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTM0MCBSZW1vdmUgLWNwcGNhc3QgYW5kIC1ub2NwcGNhc3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgKHRoaXMgd2FzIGFuIG9wdGlvbgogICAgICAgICAgICBhdmFpbGFibGUgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSB0YXJnZXRzKS4KCiAgICAgICAgICAgIFRoZSAtY3BwY2FzdCBvcHRpb24gaXMgc3RpbGwgdHVybmVkIG9uIGJ5IGRlZmF1bHQuIFRoZSAtbm9jcHBjYXN0IG9wdGlvbgogICAgICAgICAgICB0byB0dXJuIG9mZiB0aGUgdXNlIG9mIGMrKyBjYXN0cyAoY29uc3RfY2FzdCwgc3RhdGljX2Nhc3QgZXRjKSBoYXMgYmVlbgogICAgICAgICAgICByZW1vdmVkLiBIb3dldmVyLCBkZWZpbmluZyBTV0lHX05PX0NQTFVTUExVU19DQVNUIHdpbGwgc3RpbGwgZ2VuZXJhdGUgQyBjYXN0cwogICAgICAgICAgICBpbnN0ZWFkIG9mIEMrKyBjYXN0cyBmb3IgQysrIHdyYXBwZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTM0MCBSZW1vdmUgLW91dHB1dHR1cGxlIGFuZCAtbm9vdXRwdXR0dXBsZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KCiAgICAgICAgICAgIEJvdGggdGhlIGNvbW1hbmQgbGluZSBhbmQgJW1vZHVsZSBvcHRpb25zIG9mIHRoZSBzYW1lIG5hbWUgaGF2ZSBiZWVuCiAgICAgICAgICAgIHJlbW92ZWQuIFRoZXNlIHdlcmUgdW5kb2N1bWVudGVkLiBUaGUgLW91dHB1dHR1cGxlIG9wdGlvbiByZXR1cm5lZCBhCiAgICAgICAgICAgIFB5dGhvbiB0dXBsZSBpbnN0ZWFkIG9mIGEgbGlzdCwgbW9zdGx5IHR5cGljYWxseSBpbiB0aGUgT1VUUFVUCiAgICAgICAgICAgIHR5cGVtYXAgaW1wbGVtZW50YXRpb25zLgoKICAgICAgICAgICAgSXQgdW5jbGVhciB3aHkgYSB0dXBsZSBpbnN0ZWFkIG9mIGEgbGlzdCByZXR1cm4gdHlwZSBpcyBuZWVkZWQgYW5kCiAgICAgICAgICAgIGhlbmNlIHRoaXMgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYXMgcGFydCBvZiB0aGUgc2ltcGxpZmljYXRpb24gb2YKICAgICAgICAgICAgdGhlIFNXSUcgUHl0aG9uIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBTV0lHIDQuCgoyMDE4LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTM0MCBSZW1vdmUgLW5vcHJveHlpbXBvcnQgY29tbWFuZCBsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgIFRoaXMgb3B0aW9uIHR1cm5lZCBvZmYgdGhlIGluc2VydGlvbiBvZiBQeXRob24gaW1wb3J0IHN0YXRlbWVudHMKICAgICAgICAgICAgZGVyaXZlZCBmcm9tIGEgJWltcG9ydCBkaXJlY3RpdmUuIEZvciBleGFtcGxlIGdpdmVuOgoKICAgICAgICAgICAgICAlbW9kdWxlIG1vZHVsZV9iCiAgICAgICAgICAgICAgJWltcG9ydCAibW9kdWxlX2EuaSIKCiAgICAgICAgICAgIHRoZW4gbW9kdWxlX2IucHkgd2lsbCBjb250YWluOgoKICAgICAgICAgICAgICBpbXBvcnQgbW9kdWxlX2EKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0xMC0yOTogQWxleGFuZGVyR2FicmllbAoJICAgIFtQSFBdIFRoZSBmb2xsb3dpbmcgUEhQNyByZXNlcnZlZCBrZXl3b3JkcyBhcmUgbm93IG9ubHkgcmVuYW1lZCBieQoJICAgIFNXSUcgd2hlbiB1c2VkIGFzIGZ1bmN0aW9uIG5hbWVzIGluIHRoZSBBUEkgYmVpbmcgd3JhcHBlcjoKCSAgICBfX2hhbHRfY29tcGlsZXIgYXJyYXkgZGllIGVjaG8gZW1wdHkgZXZhbCBleGl0IGluY2x1ZGUgaW5jbHVkZV9vbmNlCgkgICAgaXNzZXQgbGlzdCBwcmludCByZXF1aXJlIHJlcXVpcmVfb25jZSByZXR1cm4gdW5zZXQKCjIwMTgtMTAtMjI6IG9sbHksd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEyNjEgIzEzNDAgVHVybiBvbiBtYW55IG9wdGltaXNhdGlvbiBvcHRpb25zIGJ5IGRlZmF1bHQgYW5kIHJhdGlvbmFsaXNlIHRoZQogICAgICAgICAgICBudW1iZXIgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMuCgogICAgICAgICAgICBUaGVyZSB3ZXJlIGFuIHVubmVjZXNzYXJ5IG51bWJlciBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgbWFueSBvZiB0aGVzZSBoYXZlIG5vdwogICAgICAgICAgICBiZWVuIHJlbW92ZWQgaW4gYSBkcml2ZSBmb3Igc2ltcGxpZmljYXRpb24uIFNvbWUgd2VyZSBuZWVkZWQgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucwogICAgICAgICAgICBvZiBQeXRob24gKDIuNiBhbmQgZWFybGllcikuCgogICAgICAgICAgICBNYW55IG9mIHRoZSBvcHRpb25zIGNvdWxkIGJlIHR1cm5lZCBvbiBpbmRpdmlkdWFsbHkgYW5kIHdoZW4gdXNpbmcgLU8uIFByZXZpb3VzbHkgLU8KICAgICAgICAgICAgcmVzdWx0ZWQgaW4gdHVybmluZyBvbiBhIHNldCBvZiBvcHRpb25zOgoKICAgICAgICAgICAgICAtbW9kZXJuIC1mYXN0ZGlzcGF0Y2ggLW5vc2FmZWNzdHJpbmdzIC1mdmlydHVhbCAtbm9wcm94eWRlbAogICAgICAgICAgICAgIC1mYXN0cHJveHkgLWZhc3Rpbml0IC1mYXN0dW5wYWNrIC1mYXN0cXVlcnkgLW1vZGVybmFyZ3MgLW5vYnVpbGRub25lCgogICAgICAgICAgICBOb3cgLU8gcmVzdWx0cyBpbiB0dXJuaW5nIG9uIHRoaXMgcmVkdWNlZCBzZXQ6CgogICAgICAgICAgICAgIC1mYXN0ZGlzcGF0Y2ggLWZhc3Rwcm94eSAtZnZpcnR1YWwKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgbm93IG9uIGJ5IGRlZmF1bHQsIGEgZGVwcmVjYXRlZCB3YXJuaW5nIGlzIGRpc3BsYXllZCBpZiB0aGV5CiAgICAgICAgICAgIGFyZSB1c2VkOgogICAgICAgICAgICAgIC1mYXN0aW5pdCAgICAgQ2xhc3MgaW5pdGlhbGlzYXRpb24gY29kZSBkb25lIGluIEMvQysrIHJhdGhlciB0aGFuIGluIFB5dGhvbiBjb2RlLgogICAgICAgICAgICAgIC1mYXN0cXVlcnkgICAgUHl0aG9uIGRpY3Rpb25hcnkgdXNlZCBmb3IgbG9va3VwIG9mIHR5cGVzLgogICAgICAgICAgICAgIC1mYXN0dW5wYWNrICAgRmFzdGVyIHVucGFja2luZyBvZiBmdW5jdGlvbiBhcmd1bWVudHMgaW4gQy9DKysgd3JhcHBlcnMuCiAgICAgICAgICAgICAgLW1vZGVybiAgICAgICBVc2UgUHl0aG9uIDIuMyBmZWF0dXJlcyBzdWNoIGFzIG9iamVjdCBhbmQgcHJvcGVydHkuCiAgICAgICAgICAgICAgLW1vZGVybmFyZ3MgICBVc2UgUHl0aG9uIDIuMyBDIEFQSXMgZm9yIHVucGFja2luZyBhcmd1bWVudHMgaW4gdHVwbGVzLgogICAgICAgICAgICAgIC1ub3Byb3h5ZGVsICAgU3RvcCBnZW5lcmF0aW5nIGEgcHJveHkgX19kZWxfXyBtZXRob2QgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmxpdHkuCiAgICAgICAgICAgICAgLXNhZmVjc3RyaW5ncyBObyBkaXNjZXJuYWJsZSBkaWZmZXJlbmNlCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQgYWx0b2dldGhlcjoKICAgICAgICAgICAgICAtYWxpYXNvYmowCiAgICAgICAgICAgICAgLWJ1aWxkbm9uZQogICAgICAgICAgICAgIC1jbGFzc3B0cgogICAgICAgICAgICAgIC1uZXdfcmVwcgogICAgICAgICAgICAgIC1uZXdyZXByCiAgICAgICAgICAgICAgLW5vYWxpYXNvYmowCiAgICAgICAgICAgICAgLW5vYnVpbGRub25lCiAgICAgICAgICAgICAgLW5vY2FzdG1vZGUKICAgICAgICAgICAgICAtbm9kaXJ2dGFibGUKICAgICAgICAgICAgICAtbm9leHRyYW5hdGl2ZQogICAgICAgICAgICAgIC1ub2Zhc3Rpbml0CiAgICAgICAgICAgICAgLW5vZmFzdHByb3h5CiAgICAgICAgICAgICAgLW5vZmFzdHF1ZXJ5CiAgICAgICAgICAgICAgLW5vbW9kZXJuCiAgICAgICAgICAgICAgLW5vbW9kZXJuYXJncwogICAgICAgICAgICAgIC1ub291dHB1dHR1cGxlCiAgICAgICAgICAgICAgLW5vc2FmZWNzdHJpbmdzCiAgICAgICAgICAgICAgLW9sZF9yZXByCiAgICAgICAgICAgICAgLW9sZHJlcHIKICAgICAgICAgICAgICAtcHJveHlkZWwKCiAgICAgICAgICAgIC1uZXdfdndtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSB0aGUgLW5ld3Z3bSBhbGlhcyBpbnN0ZWFkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTEwLTIyOiBvbGx5CiAgICAgICAgICAgIFtQeXRob25dICMxMjYxIFJlbW92ZSBjb21tYW5kIGxpbmUgb3B0aW9uIG5vIGxvbmdlciBuZWVkZWQgYXMgUHl0aG9uIDIuMyBhbmQgZWFybGllcgogICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZDoKCiAgICAgICAgICAgICAgLWNsYXNzaWMKCjIwMTgtMTAtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtELCBHbywgR3VpbGUsIEx1YSwgTXpzY2hlbWUsIE9jYW1sLCBQZXJsNSwgUGhwLCBTY2lsYWIsIFRjbF0KICAgICAgICAgICAgQWxsb3cgd3JhcHBpbmcgb2Ygc3RkOjptYXAgdXNpbmcgbm9uLWRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbi4KCjIwMTgtMTAtMDk6IHZhZHoKICAgICAgICAgICAgW0phdmFdICMxMjc0IEFsbG93IHdyYXBwaW5nIG9mIHN0ZDo6bWFwIHVzaW5nIG5vbi1kZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb24uCgoyMDE4LTEwLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTEyNiBGaXggQyBkZWZhdWx0IGFyZ3VtZW50cyB3aXRoIC1idWlsdGluIGFuZCAtZmFzdHVucGFjayBhbmQgLW1vZGVybmFyZ3MuCiAgICAgICAgICAgIFByb2JsZW0gb2NjdXJyZWQgd2hlbiB0aGVyZSBpcyBqdXN0IG9uZSAoZGVmYXVsdGVkKSBwYXJhbWV0ZXIgaW4gdGhlIHBhcmFtZXRlciBsaXN0LgoKMjAxOC0wOS0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzMTkgQysrMTEgaGFzaCB0YWJsZXMgaW1wbGVtZW50YXRpb24gaXMgZmluaXNoZWQgbm93IChpbmNsdWRpbmcgZm9yIC1idWlsdGluKToKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0CgoyMDE4LTA5LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggd2hlbiB1c2luZyAtYnVpbHRpbiBhbmQgd3JhcHBpbmcgc3RkOjptYXAsIHN0ZDo6c2V0LCBzdGQ6OnVub3JkZXJlZF9tYXAgb3IKICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0IHRvIGVuc3VyZSBfX2NvbnRhaW5zX18gaXMgY2FsbGVkLiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgdGhlIFNUTAogICAgICAgICAgICBjb250YWluZXIncyBmaW5kIG1ldGhvZC4gV2l0aG91dCBpdCwgUHl0aG9uIHdpbGwgZG8gaXRzIG93biBzbG93ZXIgc2VxdWVuY2Ugc2VhcmNoLgoKMjAxOC0wOS0xOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGZ1bmN0b3JzICh3cmFwcGVkIGFzIF9fY2FsbF9fKSB3aGVuIHVzaW5nIC1idWlsdGluIC1tb2Rlcm4gLWZhc3R1bnBhY2suCgoyMDE4LTA5LTAyOiBhbmRyZWFzLmdhZWVyLHRrcmFzbnVraGEKICAgICAgICAgICAgW1B5dGhvbl0gIzEzMjEgRml4IGFzc2VydCBpbiBQeVR1cGxlX0dFVF9TSVpFIGluIGRlYnVnIGludGVycHJldGVyIGJ1aWxkcyBvZiBweXRob24tMy43CiAgICAgICAgICAgIHdoZW4gY2FsbGluZyB0cF9uZXcuCgoyMDE4LTA5LTAxOiBDaHJpc3RvcGhlckhvZ2FuCiAgICAgICAgICAgIFtHdWlsZV0gIzEyODggRml4IGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgZ3VpbGUgPj0gMi4wLjEyLgoKMjAxOC0wOC0zMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzMTkgQysrMTEgaGFzaCB0YWJsZXMgc3VwcG9ydDoKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0CiAgICAgICAgICAgIGlzIG5vdyBjb21waWxpbmcgYW5kIHdvcmtpbmcgKHNvcnRpbmcgdXNpbmcgLWJ1aWx0aW4gbm90IGZ1bGx5IGZ1bmN0aW9uYWwgeWV0IHRob3VnaCkuCgoyMDE4LTA4LTIwOiB3a2FsaW5pbgogICAgICAgICAgICAjMTMwNSBGaXggbmVzdGVkIHN0cnVjdHVyZSBzeW1ib2wgdGFibGVzIGluIEMgbW9kZSB0byBmaXggbWVtYmVyIG5hbWUgY29uZmxpY3RzCiAgICAgICAgICAgIGluIGRpZmZlcmVudCBzdHJ1Y3RzIHdpdGggdGhlIHNhbWUgbmVzdGVkIHN0cnVjdCBtZW1iZXIgbmFtZS4KCjIwMTgtMDgtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM2ODggRml4IG1ha2VmaWxlIHJlY3Vyc2lvbiB3aGVuIHJ1bm5pbmcgcHl0aG9uIHRlc3Qtc3VpdGUuCgoyMDE4LTA4LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTMxMCBSZS1pbXBsZW1lbnQgUHl0aG9uIC1mYXN0cHJveHkgb3B0aW9uLgoKICAgICAgICAgICAgVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZhaWxlZCB3aXRoIFB5dGhvbiAzIGFuZCBhYnN0cmFjdCBiYXNlIGNsYXNlcy4KICAgICAgICAgICAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiByZXBsYWNlcyB0aGUgUHl0aG9uIDIgaW1wbGVtZW50YXRpb24gdXNpbmcKICAgICAgICAgICAgbmV3Lmluc3RhbmNlbWV0aG9kIHdpdGggdGhlIEMgQVBJIFB5TWV0aG9kX05ldyB0byBtYXRjaCB0aGUgZXF1aXZhbGVudCBQeXRob24gMwogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGljaCB1c2VzIFB5SW5zdGFuY2VNZXRob2RfTmV3LgoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBydW5zIHNsaWdodGx5IGZhc3Rlci4gU2VlICMxMzEwLgoKMjAxOC0wOC0xMjogZ21henphbXV0bwogICAgICAgICAgICBbUHl0aG9uXSAjMTI4MyBVcGRhdGUgcHlidWZmZXIuaSBsaWJyYXJ5IHRvIHVzZSBuZXctc3R5bGUgUHl0aG9uIGJ1ZmZlciBDIEFQSS4KCjIwMTgtMDgtMTI6IGJyaWFuaGF0d29vZCx3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzEzMDMgIzEzMDQgRml4IGNyYXNoIGluIGRpcmVjdG9ycyB3aGVuIHVzaW5nIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBhbmQKICAgICAgICAgICAgcGFzc2luZyBOVUxMIHBvaW50ZXJzIGluIEMrKyB0byBkaXJlY3RvciBtZXRob2Qgb3ZlcmxvYWRlZCBhbmQgaW1wbGVtZW50ZWQgaW4gSmF2YS4KCjIwMTgtMDgtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjkzIEltcHJvdmUgVHlwZUVycm9yIG1lc3NhZ2UgaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gZGVmYXVsdCBhbmQgZmFzdGRpc3BhdGNoCiAgICAgICAgICAgIG1vZGUgd2hlbiBoYW5kbGluZyBvdmVybG9hZGVkIEMrKyBmdW5jdGlvbnMuIFByZXZpb3VzbHkgdGhlIGVycm9yIG1lc3NhZ2UgZGlkIG5vdCBhbHdheXMKICAgICAgICAgICAgZGlzcGxheSB0aGUgcG9zc2libGUgQy9DKysgcHJvdG90eXBlcyBpbiBmYXN0ZGlzcGF0Y2ggbW9kZS4KCjIwMTgtMDgtMDI6IGZ1cnlseW54LGphY29id2dpbGxlc3BpZSxwMmsKICAgICAgICAgICAgW0phdmFzY3JpcHRdICMxMjkwLCAjOTY4LiBBZGQgc3VwcG9ydCBmb3IgTm9kZUpTIHZlcnNpb25zIDItMTAuCgoyMDE4LTA3LTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTI5MyBPdmVybG9hZGVkIEMrKyBmdW5jdGlvbiB3cmFwcGVycyBub3cgcmFpc2UgYSBUeXBlRXJyb3IgaW5zdGVhZAogICAgICAgICAgICBvZiBOb3RJbXBsZW1lbnRlZEVycm9yIHdoZW4gdGhlIHR5cGVzIHBhc3NlZCBhcmUgaW5jb3JyZWN0LiBUaGlzIGNoYW5nZSBtZWFucwogICAgICAgICAgICB0aGVyZSBpcyBub3cgY29uc2lzdGVuY3kgd2l0aCBub24tb3ZlcmxvYWRlZCBmdW5jdGlvbiB3cmFwcGVycyB3aGljaCBoYXZlIGFsd2F5cwogICAgICAgICAgICByYWlzZWQgVHlwZUVycm9yIHdoZW4gdGhlIGluY29ycmVjdCB0eXBlcyBhcmUgcGFzc2VkLiBUaGUgZXJyb3IgbWVzc2FnZSByZW1haW5zCiAgICAgICAgICAgIHRoZSBzYW1lIGFuZCBpcyBmb3IgZXhhbXBsZSBub3c6CgogICAgICAgICAgICAgIFR5cGVFcnJvcjogV3JvbmcgbnVtYmVyIG9yIHR5cGUgb2YgYXJndW1lbnRzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9uICdmJy4KICAgICAgICAgICAgICAgIFBvc3NpYmxlIEMvQysrIHByb3RvdHlwZXMgYXJlOgogICAgICAgICAgICAgICAgICBmKGludCkKICAgICAgICAgICAgICAgICAgZihjaGFyIGNvbnN0ICopCgogICAgICAgICAgICBpbnN0ZWFkIG9mOgoKICAgICAgICAgICAgICBOb3RJbXBsZW1lbnRlZEVycm9yOiBXcm9uZyBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ2YnLgogICAgICAgICAgICAgICAgUG9zc2libGUgQy9DKysgcHJvdG90eXBlcyBhcmU6CiAgICAgICAgICAgICAgICAgIGYoaW50KQogICAgICAgICAgICAgICAgICBmKGNoYXIgY29uc3QgKikKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wNi0yMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzcxOCBGaXggcHl0aG9ubm9uZHluYW1pYyBmZWF0dXJlIGZvciBtb2Rlcm4gY2xhc3NlcwoKICAgICAgICAgICAgRml4ZXMgbm9uZHluYW1pYyBtb2RlIHdoZW4gYW4gaW5zdGFuY2UgdmFyaWFibGUgaXMgc2V0IHdpdGggdGhlIHNhbWUKICAgICAgICAgICAgbmFtZSBhcyBhIGNsYXNzIHZhcmlhYmxlIGluIGEgY2xhc3MgZGVyaXZlZCBmcm9tIGEgU1dJRyBwcm94eSBjbGFzcy4KICAgICAgICAgICAgVGhpcyBjb3JuZXIgY2FzZSBzZXQgYW4gaW5zdGFuY2UgdmFyaWFibGUgaW5zdGVhZCBvZiByYWlzaW5nIGFuIEF0dHJpYnV0ZUVycm9yLgoKICAgICAgICAgICAgQWxzbyBmaXggJXB5dGhvbm5vbmR5bmFtaWMgaW4gUHl0aG9uIDMgd2l0aCAtbW9kZXJuLiBUaGUgbWV0YWNsYXNzCiAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uIHdhcyBwcmV2aW91c2x5IG5vdCBiZWluZyBhcHBsaWVkIGluIFB5dGhvbiAzLgoKMjAxOC0wNy0xNzogcGV0cm1pdHJpY2hldix3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTI3NSAjMTI3OSBJbml0aWFsaXplIGZ1bmN0aW9uLWxvY2FsIHN0YXRpY3MgKHNpbmdsZXRvbnMpIHRoYXQgY2FsbCBQeXRob24KICAgICAgICAgICAgY29kZSBkdXJpbmcgUHl0aG9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiBpbiBvcmRlciB0byBhdm9pZCBkZWFkbG9ja3Mgd2l0aCBzdWJzZXF1ZW50CiAgICAgICAgICAgIG11bHRpLXRocmVhZGVkIHVzYWdlLgoKMjAxOC0wNi0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNlZyBmYXVsdCB1c2luZyBQeXRob24gMiB3aGVuIHBhc3NpbmcgYSBQeXRob24gc3RyaW5nLCBjb250YWluaW5nCiAgICAgICAgICAgIGludmFsaWQgdXRmLTggY29udGVudCwgdG8gYSB3c3RyaW5nIG9yIHdjaGFyICogcGFyYW1ldGVyLiBBIFR5cGVFcnJvciBpcyB0aHJvd24gaW5zdGVhZCwgZWc6CgogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfd3N0cmluZy5pPgogICAgICAgICAgICAgIHZvaWQgaW5zdHJpbmcoY29uc3Qgc3RkOjp3c3RyaW5nJiBzKTsKCiAgICAgICAgICAgICAgaW5zdHJpbmcoYiJoXHhlOWxsb29vIikgIyBQeXRob24KCjIwMTgtMDYtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAzLjcgc3VwcG9ydDogUmVwbGFjZSB1c2Ugb2YgZGVwcmVjYXRlZCBQeVVuaWNvZGVfR2V0U2l6ZSB3aXRoCiAgICAgICAgICAgIFB5VW5pY29kZV9HZXRMZW5ndGggdG8gcmVtb3ZlIGRlcHJlY2F0ZWQgd2FybmluZ3MgY29tcGlsaW5nIHRoZSBDL0MrKyB3cmFwcGVycy4KCjIwMTgtMDYtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAzLjcgc3VwcG9ydDogVGhlICVweXRob25hYmMgZmVhdHVyZSBpbiBweWFiYy5pIG5vdyB1c2VzIGJhc2UgY2xhc3NlcwogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZU1hcHBpbmcKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNldAogICAgICAgICAgICBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuTXV0YWJsZVNlcXVlbmNlCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5NdXRhYmxlU2V0CiAgICAgICAgICAgIGFzIHRoZSBsYXR0ZXIgYXJlIGRlcHJlY2F0ZWQgaW4gUHl0aG9uIDMuNyBhbmQgYXJlIGR1ZSB0byBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjguCiAgICAgICAgICAgIFRoZSBjbGFzc2VzIGluIGNvbGxlY3Rpb25zLmFiYy4qIGFyZSBhdmFpbGFibGUgZnJvbSBQeXRob24gMy4zIG9ud2FyZHMuIElmIHlvdQogICAgICAgICAgICByZXF1aXJlIHN1cHBvcnQgZm9yIFB5dGhvbiAzLjIsIHRoZW4gY29weSB0aGUgcHlhYmMuaSBmaWxlIGFuZCBtb2RpZnkgYnkgcmVtb3ZpbmcKICAgICAgICAgICAgdGhlIGZldyBpbnN0YW5jZXMgb2YgdGhlIC5hYmMgc3ViLW1vZHVsZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wNi0xMjogb2xseSx3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNzAxIFJlbW92ZSBzdXBwb3J0IGZvciBQeXRob24gdmVyc2lvbnMgPCAyLjcgYW5kIDMuMCBhbmQgMy4xLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTExOiBvbGx5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBuZXcgR0NDOCB3YXJuaW5ncyBpbiBnZW5lcmF0ZWQgY29kZSBieSBhdm9pZGluZyBjYXN0cwogICAgICAgICAgICBiZXR3ZWVuIGluY29tcGF0aWJsZSBmdW5jdGlvbiB0eXBlcyB3aGVyZSBwb3NzaWJsZSwgYW5kIGJ5CiAgICAgICAgICAgIHN1cHByZXNzaW5nIHRoZSB3YXJuaW5nIHdoZW4gaXQncyBkdWUgdG8gdGhlIGRlc2lnbiBvZiBQeXRob24ncyBDCiAgICAgICAgICAgIEFQSS4gIEZpeGVzICMxMjU5LgoKMjAxOC0wNi0wODogcGhpbGlwcGtyYWZ0CgkgICAgW1B5dGhvbl0gU3RvcCBleHBvc2luZyA8Q0xBU1M+X3N3aWdyZWdpc3RlciB0byBQeXRob24uICBJdCdzIG5vdAoJICAgIHVzZWZ1bCBmb3IgdXNlciBQeXRob24gY29kZSB0byBjYWxsIHRoaXMsIGFuZCBpdCBqdXN0IGNsdXR0ZXJzIHRoZQoJICAgIEFQSSB1bm5lY2Vzc2FyaWx5LiAgRml4ZXMgIzEyMjUuCgoyMDE4LTA2LTA3OiBjbWZvaWwsIGthYmJpLCBKYW1pZSBLaXJrcGF0cmljaywgbWFya29rMzE0LCB2YWR6LCB3c2Z1bHRvbiwgWWFubiBEaW9yY2V0CiAgICAgICAgICAgICMxNzAgRG94eWdlbiBkb2N1bWVudGF0aW9uIHN1cHBvcnQgYWRkZWQuIFRoaXMgYWxsb3dzIHRyYW5zbGF0aW9uIG9mIERveHlnZW4gY29tbWVudHMKICAgICAgICAgICAgaW50byBKYXZhRG9jIGFuZCBQeURvYyBkb2N1bWVudGF0aW9uLiBJdCBpcyBlbmFibGVkIHZpYSB0aGUgLWRveHlnZW4gY29tbWFuZCBsaW5lCiAgICAgICAgICAgIG9wdGlvbi4gU2VlIHRoZSBEb3h5Z2VuLmh0bWwgY2hhcHRlciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KCjIwMTgtMDYtMDc6IG9sbHkKCSAgICBbUEhQXSBXZSd2ZSBmaW5hbGx5IHJlbW92ZWQgc3VwcG9ydCBmb3IgJXByYWdtYShwaHA0KSB3aGljaCB3YXMKCSAgICBkZXByZWNhdGVkIGJhY2sgaW4gMjAwOC4gIFVzZSAlcHJhZ21hKHBocCkgaW5zdGVhZCwgd2hpY2ggaGFzIGJlZW4KCSAgICBzdXBwb3J0ZWQgc2luY2UgYXQgbGVhc3QgMjAwNS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wNi0wNzogb2xseQoJICAgIFtQSFA1XSBTdXBwb3J0IGZvciBQSFA1IGhhcyBiZWVuIHJlbW92ZWQuICBQSFA1IGlzIG5vIGxvbmdlcgoJICAgIGFjdGl2ZWx5IHN1cHBvcnRlZCBieSB0aGUgUEhQIGRldmVsb3BlcnMgYW5kIHNlY3VyaXR5IHN1cHBvcnQgZm9yCgkgICAgaXQgZW5kcyBjb21wbGV0ZWx5IGF0IHRoZSBlbmQgb2YgMjAxOCwgc28gaXQgZG9lc24ndCBtYWtlIHNlbnNlCgkgICAgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBpdCBpbiB0aGUgdXBjb21pbmcgU1dJRyA0LjAuMCByZWxlYXNlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTA2OiBvbGx5CgkgICAgW0x1YV0gSW1wcm92ZSBjb25maWd1cmUgcHJvYmVzIGZvciBMdWEgaGVhZGVycyBhbmQgbGlicyB1c2VkIGluIHRlc3RzdWl0ZS4KCjIwMTgtMDUtMTU6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gYWRkIHN1cHBvcnQgZm9yIHZlcnNpb24gNC40CiAgICAgICAgICAgIC0gU2hvdWxkIG5vdCBpbnRyb2R1Y2UgYW55IHVzZXItdmlzaWJsZSBpbmNvbXBhdGliaWxpdGllcwoKMjAxOC0wNS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBELCBKYXZhXSBGaXggbG9va3VwIG9mIGNzY29uc3RydWN0LCBkY29uc3RydWN0IGFuZCBqYXZhY29uc3RydWN0IHR5cGVtYXBzLgogICAgICAgICAgICBUaGUgQysrIG5hbWVzcGFjZSB3YXMgcHJldmlvdXNseSBpZ25vcmVkIHdoZW4gbG9va2luZyB1cCB0aGUgdHlwZW1hcC4KCjIwMTgtMDUtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBGaXggZ2VuZXJhdGVkIEMrKyBjb2RlIHdoZW4gdXNpbmcgJW5zcGFjZSBvbiBuYW1lc3BhY2VzIHRoYXQgYXJlIG1vcmUKICAgICAgICAgICAgdGhhbiB0d28gbGV2ZWxzIGRlZXAuCgoyMDE4LTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTI1MSBBZGQgc3VwcG9ydCBmb3IgQysrMTcgbmVzdGVkIG5hbWVzcGFjZSBkZWZpbml0aW9ucywKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgbmFtZXNwYWNlIEE6OkIgeyAuLi4gfQoKMjAxOC0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBELCBKYXZhXSBBZGQgc3VwcG9ydCBzbyB0aGF0IHRoZSAlY3NtZXRob2Rtb2RpZmllcnMsICVkbWV0aG9kbW9kaWZpZXJzLAogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyBjYW4gbW9kaWZ5IHRoZSBtZXRob2QgbW9kaWZpZXJzIGZvciB0aGUgZGVzdHJ1Y3RvciB3cmFwcGVycwogICAgICAgICAgICBpbiB0aGUgcHJveHkgY2xhc3M6IGRpc3Bvc2UsIERpc3Bvc2UsIGRlbGV0ZS4gV2l0aCB0aGlzIGZlYXR1cmUsIGl0IGlzIG5vdyBwb3NzaWJsZQogICAgICAgICAgICB0byBtYWtlIGEgQyMgcHJveHkgY2xhc3Mgc2VhbGVkLCBlZyB3aGVuIHdyYXBwaW5nIGEgY2xhc3MgWCwgdGhlIHZpcnR1YWwgbWV0aG9kIG1vZGlmaWVycwogICAgICAgICAgICBjYW4gYmUgcmVtb3ZlZCB1c2luZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgWCAicHVibGljIHNlYWxlZCBjbGFzcyIKICAgICAgICAgICAgICAlY3NtZXRob2Rtb2RpZmllcnMgWDo6flggInB1YmxpYyAvKnZpcnR1YWwqLyI7CgoyMDE4LTA0LTE4OiBvbGx5CgkgICAgW1B5dGhvbl0gU3VwcHJlc3MgbmV3IHB5Y29kZXN0eWxlIHdhcm5pbmc6CgkgICAgRTI1MiBtaXNzaW5nIHdoaXRlc3BhY2UgYXJvdW5kIHBhcmFtZXRlciBlcXVhbHMKCjIwMTgtMDQtMDc6IGdvYXRzaHJpZWsKICAgICAgICAgICAgW1J1YnldICMxMjEzIEZpeCBydWJ5ICVhbGlhcyBkaXJlY3RpdmUgZm9yIGdsb2JhbCBDL0MrKyBmdW5jdGlvbnMuCgoyMDE4LTA0LTAzOiBvbGx5CgkgICAgW1J1YnldIEZpeCB0byBwYXNzIFFuaWwgaW5zdGVhZCBvZiBOVUxMIHRvIHJiX2Z1bmNhbGwoKSwgd2hpY2ggc2lsZW5jZXMgR0NDCgkgICAgLVdjb252ZXJzaW9uLW51bGwgd2FybmluZyAob24gYnkgZGVmYXVsdCB3aXRoIHJlY2VudCBHQ0MpLgoKMjAxOC0wMy0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMxMTg0IEZpeCBzd2lnUmVsZWFzZU93bmVyc2hpcCgpIGFuZCBzd2lnVGFrZU93bmVyc2hpcCgpIHJlZ3Jlc3Npb24KICAgICAgICAgICAgZm9yIG5vbi1kaXJlY3RvciBjbGFzc2VzLiBSZXN0b3JlcyBhIGR5bmFtaWNfY2FzdCB3aGljaCB3YXMgcHJldmlvdXNseSByZW1vdmVkLgoKMjAxOC0wMy0wNzogbGxvbmdpCgkgICAgR2l0aHViIFBSICMxMTY2IC0gRml4IHByZXByb2Nlc3NvciBoYW5kbGluZyBvZiBtYWNyb3Mgd2l0aCBjb21tYXMKCSAgICBpbiBhIC8vIGNvbW1lbnQuCgoyMDE4LTAyLTE4OiBKUEVXZGV2CiAgICAgICAgICAgIFBhdGNoICMxMTY0IC0gQWRkIHN1cHBvcnQgZm9yIGEgY29tbWFuZC1saW5lIG9wdGlvbnMgZmlsZSwgYWxzbyBzb21ldGltZXMKICAgICAgICAgICAgY2FsbGVkIGEgcmVzcG9uc2UgZmlsZS4gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGV4Y2VlZAogICAgICAgICAgICB0aGUgc3lzdGVtIGNvbW1hbmQtbGluZSBsZW5ndGggbGltaXQuIFRvIHVzZSwgcHV0IHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucwogICAgICAgICAgICBpbnRvIGEgZmlsZSwgdGhlbiBwcm92aWRlIHRoZSBmaWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBALCBmb3IgZXhhbXBsZSB1c2luZwogICAgICAgICAgICBhIGZpbGUgY2FsbGVkIGFyZ3MudHh0OgoKICAgICAgICAgICAgICBzd2lnIEBhcmdzLnR4dAoKMjAxOC0wMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHRdICMxMTg3IEZpeCBjb21waWxhdGlvbiBlcnJvciB3cmFwcGluZyBzdGQ6OmNvbXBsZXggdmlhCiAgICAgICAgICAgIHN0ZF9jb21wbGV4LmkuCgoyMDE4LTAxLTMwOiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIGFkZCB0eXBlIG5hbWUgYXJndW1lbnQgaW4gU1dJR19wdHIoKSBmdW5jdGlvbiB0byBjYXN0IGZyb20gcG9pbnRlciBhZGRyZXNzIHRvIHR5cGVkIHBvaW50ZXJzCgoyMDE4LTAxLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBFeHByZXNzaW9ucyBmb2xsb3dpbmcgYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIG11c3Qgbm93IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlCiAgICAgICAgICAgIG9yIG5vbi1udW1lcmljIGNoYXJhY3RlcnMuIFRoaXMgc3ludGF4IGNoYW5nZSBtYWtlcyB0aGUgU1dJRyBwcmVwcm9jZXNzb3Igd29yayBsaWtlCiAgICAgICAgICAgIHRoZSBDIHByZXByb2Nlc3NvciBpbiB0aGlzIGFyZWEuCgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHVzZWQgYmUgYWNjZXB0ZWQgYXMgdmFsaWQgc3ludGF4OgogICAgICAgICAgICAgICNpZjEKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAxMjMKICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIE5vdyB5b3UgZ2V0IGFuIGVycm9yOgogICAgICAgICAgICAgIGV4YW1wbGUuaDoxOiBFcnJvcjogVW5rbm93biBTV0lHIHByZXByb2Nlc3NvciBkaXJlY3RpdmU6IGlmMSAoaWYgdGhpcyBpcyBhIGJsb2NrIG9mCiAgICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIGNvZGUsIGRlbGltaXQgaXQgd2l0aCAleyBhbmQgJX0pCiAgICAgICAgICAgICAgZXhhbXBsZS5oOjM6IEVycm9yOiBFeHRyYW5lb3VzICNlbmRpZi4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGNvcnJlY3Qgc3ludGF4OgogICAgICAgICAgICAgICNpZiAxCiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMTIzCiAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG9mIGNvdXJzZSBhbHNvIHdvcmtzOgogICAgICAgICAgICAgICNpZigxKQogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDEyMwogICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaXNzdWUgIzExODMuIEZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBldmFsdWF0aW5nIHByZXByb2Nlc3NvciBleHByZXNzaW9ucwogICAgICAgICAgICByZXN1bHRpbmcgaW4gZGl2aXNpb24gYnkgemVyby4KCjIwMTgtMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpc3N1ZSAjMTE3Mi4gU2VnIGZhdWx0IHBhcnNpbmcgaW52YWxpZCBleHBvbmVudHMgaW4gdGhlIHByZXByb2Nlc3Nvci4KCjIwMTgtMDEtMTI6IExpcnluYQogICAgICAgICAgICBbQyNdIFBhdGNoICMxMTI4LiBBZGQgVG9BcnJheSBmdW5jdGlvbiB0byBzdGQ6OnZlY3RvciB3cmFwcGVycy4KCjIwMTgtMDEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggaXNzdWUgIzExNTYuIEFkZCBtaXNzaW5nIHRocm93cyBjbGF1c2UgZm9yIGludGVyZmFjZXMgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICAgJWludGVyZmFjZSBmYW1pbHkgb2YgbWFjcm9zLgoKMjAxOC0wMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRlZmF1bHQgYXJndW1lbnRzIHVzaW5nIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgLT4gc3ludGF4IGVycm9yLiBQcm9ibGVtIHJlcG9ydGVkIG9uCiAgICAgICAgICAgIHN3aWctdXNlciBtYWlsaW5nIGxpc3QuCgoyMDE3LTEyLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZXBsYWNlIHBlcDggd2l0aCBweWNvZGVzdHlsZSBmb3IgY2hlY2tpbmcgdGhlIFB5dGhvbiBjb2RlIHN0eWxlIHdoZW4KICAgICAgICAgICAgcnVubmluZyBQeXRob24gdGVzdHMuCgoyMDE3LTEyLTMwOiBkYXZlZGlzc2lhbgogICAgICAgICAgICBGaXhlZCBhIHN5bWJvbCBsb29rdXAgaXNzdWUgd2hlbiBlbmNvdW50ZXJpbmcgYSB0eXBlZGVmIG9mIGEgc3ltYm9sIGZyb20gdGhlIHRhZwogICAgICAgICAgICBuYW1lc3BhY2UgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2Ugd2hlbiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCwgc3VjaCBhcyAndHlwZWRlZgogICAgICAgICAgICBzdHJ1Y3QgRm9vIEZvbzsnLgoKMjAxNy0xMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIGFkZCBtaXNzaW5nIHN1cHBvcnQgZm9yIGRpcmVjdG9yZnJlZSB0eXBlbWFwcy4KCjIwMTctMTItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMTY3IEZpeCBkaXJlY3Rvcm91dCB0eXBlbWFwcyB3aGljaCB3ZXJlIGNhdXNpbmcgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuCiAgICAgICAgICAgIHJldHVybmluZyBwb2ludGVycyBieSByZWZlcmVuY2UuCgoyMDE3LTEyLTA4OiBvbGx5CgkgICAgW1BIUF0gVXNlIFpFTkRfTU9EVUxFX0dMT0JBTFNfQUNDRVNTT1IgdG8gYWNjZXNzIGdsb2JhbHMgc28gdGhlCgkgICAgZ2VuZXJhdGVkIGNvZGUgYnVpbGRzIHdoZW4gUEhQIHdhcyBidWlsdCB3aXRoIFpUUyBlbmFibGVkLgoKMjAxNy0xMi0wNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIG1pc3NpbmcgY2hlY2tzIGZvciBmYWlsdXJlcyBpbiBjYWxscyB0byBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nLiBQcmV2aW91c2x5IGEKICAgICAgICAgICAgc2VnIGZhdWx0IGNvdWxkIG9jY3VyIHdoZW4gcGFzc2luZyBpbnZhbGlkIFVURjggc3RyaW5ncyAobG93IHN1cnJvZ2F0ZXMpLCBlZyBwYXNzaW5nCiAgICAgICAgICAgIHUiXHVkY2ZmIiB0byB0aGUgQyBsYXllciAoUHl0aG9uIDMpLgoKMjAxNy0xMS0yNDogam9lcXVhbnQKCSAgICBbUl0gRml4ICMxMTI0IGFuZCByZXR1cm4gUl9OaWxWYWx1ZSBmb3IgbnVsbCBwb2ludGVycwoKMjAxNy0xMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIGRpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBpbXByb3ZlbWVudHMuCgogICAgICAgICAgICBXaGVuIGEgZGlyZWN0b3IgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gYW5kIGl0IGlzIGNhdWdodCBieSBEaXJlY3RvckV4Y2VwdGlvbgogICAgICAgICAgICBhbmQgcGFzc2VkIGJhY2sgdG8gSmF2YSB1c2luZyBTd2lnOjpEaXJlY3RvckV4Y2VwdGlvbjo6dGhyb3dFeGNlcHRpb24sIHRoZSBKYXZhCiAgICAgICAgICAgIHN0YWNrIHRyYWNlIG5vdyBjb250YWlucyB0aGUgb3JpZ2luYWwgc291cmNlIGxpbmUgdGhhdCB0aHJldyB0aGUgZXhjZXB0aW9uLgoKICAgICAgICAgICAgRGVwcmVjYXRlIFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uOjpyYWlzZUphdmFFeGNlcHRpb24sIHBsZWFzZSByZXBsYWNlIHVzYWdlIHdpdGgKICAgICAgICAgICAgU3dpZzo6RGlyZWN0b3JFeGNlcHRpb246OnRocm93RXhjZXB0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgQysrMTEgcmVmLXF1YWxpZmllcnMgd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoyMDE3LTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2VuZXJhdGVkIGNvZGUgd2hlbiB1c2luZyBkaXJlY3RvcnMgYW5kIG1ldGhvZHMgcmV0dXJuaW5nIGNvbnN0IHJlZiBwb2ludGVycy4KCjIwMTctMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRCwgSmF2YSwgT2N0YXZlLCBSLCBTY2lsYWJdIFBvcnQgZGlyZWN0b3IgdHlwZW1hcHMgdG8gdGhlc2UgYWRkaXRpb25hbCBsYW5ndWFnZXMuCiAgICAgICAgICAgIElzc3VlICM3MDAuCgoyMDE3LTEwLTI2OiByYWRhcnNhdDEKICAgICAgICAgICAgW1J1YnkgUHl0aG9uXSBQYXRjaCAjMTAyOSAtIENvcnJlY3QgaGFuZGxpbmcgb2YgbnVsbCB1c2luZyBkaXJlY3RvcnMgYW5kIHNoYXJlZF9wdHIuCgoyMDE3LTEwLTEwOiBqb2VxdWFudAoJICAgIFtSXSBwYXNzIGVudW0gZXhwcmVzc2lvbnMgdG8gUi4gIFRoaXMgd2lsbCBnZW5lcmF0ZQoJICAgIGluY29ycmVjdCBmaWxlcyB3aGVuIHRoZXJlIGlzIGFuIGFyaXRobWV0aWMgZXhwcmVzc2lvbgoJICAgIGluIHRoZSBlbnVtLCBidXQgdGhpcyBpcyBiZXR0ZXIgdGhhbiBzaWxlbnRseSBnZW5lcmF0aW5nCgkgICAgaW5jb3JyZWN0IGNvZGUKCjIwMTctMTAtMDk6IG9sbHkKCSAgICBbUEhQXSBGaXggaW5jb3JyZWN0IHdyYXBwZXIgY29kZSBnZW5lcmF0ZWQgd2hlbiB0aGVyZSdzIGEKCSAgICBjb21iaW5hdGlvbiBvZiBvdmVybG9hZGluZywgcGFyYW1ldGVycyB3aXRoIGEgZGVmYXVsdCB2YWx1ZQoJICAgIGFuZCAlbmV3b2JqZWN0LiAgRml4ZXMgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTM1MC8KCjIwMTctMTAtMDk6IG9sbHkKCSAgICBSZW1vdmUgR0NKIHN1cHBvcnQuICBJdCBpc24ndCBpbiBhIGdvb2Qgc3RhdGUgYW5kIGRvZXNuJ3Qgc2VlbSB0bwoJICAgIGJlIHVzZWQsIGFuZCBHQ0M3IGRyb3BwZWQgR0NKLiAgQ2xvc2VzCgkgICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvODIzLwoKMjAxNy0xMC0wNzogb2xseQoJICAgIEZpeCBwcmVwcm9jZXNzb3IgaGFuZGxpbmcgb2YgZW1wdHkgbWFjcm8gYXJndW1lbnRzIHRvIG1hdGNoIHRoYXQgb2YKCSAgICBDL0MrKyBjb21waWxlcnMuICBGaXhlcyBpc3N1ZSAjMTExMSBhbmQKCSAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy84MjYvCgoyMDE3LTEwLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjMTEwOC4gRml4IHBsYXRmb3JtIGluY29uc2lzdGVuY3kgaW4gUHl0aG9uIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcuCiAgICAgICAgICAgIDMyIGJpdCBhbmQgNjQgYml0IGNvbXBpbGVkIHZlcnNpb25zIG9mIFNXSUcgZ2VuZXJhdGVkIGRpZmZlcmVudCBQeXRob24gZmlsZXMKICAgICAgICAgICAgd2hlbiBkZWZhdWx0IGFyZ3VtZW50cyB3ZXJlIG91dHNpZGUgdGhlIHJhbmdlIG9mIDMyIGJpdCBzaWduZWQgaW50ZWdlcnMuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gUHl0aG9uIGFyZSBub3cgb25seSB0aG9zZSB0aGF0IGFyZSBpbiB0aGUKICAgICAgICAgICAgcmFuZ2Ugb2YgYSAzMiBiaXQgc2lnbmVkIGludGVnZXIsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBpcyBvYnRhaW5lZCBmcm9tIEMvQysrIGNvZGUuCgoyMDE3LTEwLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBzdGQ6OmNvbXBsZXggdHlwZXMgcGFzc2VkIGJ5IHZhbHVlLgoKMjAxNy0xMC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHQsIFB5dGhvbiwgUnVieV0gSXNzdWUgIzczMiAtIE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3Igc3RkOjpjb21wbGV4CiAgICAgICAgICAgIGluIHN0ZF9jb21wbGV4LmkgbWVhbnQgdGhhdCBwcmV2aW91c2x5IHN0ZDo6Y29tcGxleCBhbHdheXMgaGFkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZAogICAgICAgICAgICBpbiBvcmRlciB0byBiZSB3cmFwcGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHR5cGVtYXBzLgoKMjAxNy0xMC0wMTogam9lcXVhbnQKICAgICAgICAgICAgYWxsb3cgUiBwYWNrYWdlIG5hbWVzIHdpdGggZG9jcwoJICAgIGFsbG93aW5nIG11bHRpcGxlIGdldCBhY2Nlc3NvcnMgaW4gUgoJICAgIGZpeCBzbWFydC1wb2ludGVyIGFuZCBOQU1FU1BBQ0Ugc3VwcG9ydAoJICAgIGNvbnN0cnVjdG9ycyBub3cgcmV0dXJuaW5nIHNtYXJ0IHBvaW50ZXJzIChpZiBjbGFzcwoJICAgIGRlY2xhcmVkIGFzIHN1Y2gpCgkgICAgc21hcnQtcG9pbnRlciBjbGFzc2VzIGRlcml2aW5nIGZyb20gcGFyZW50IHNtYXJ0LXBvaW50ZXJzCgoyMDE3LTA5LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTEwMCAtIEFsbG93IGFuIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSBhcyB0aGUgQysrIHRlbXBsYXRlIG5hbWUsIGZvciBleGFtcGxlLCB0aGlzIGlzIG5vdyBwb3NzaWJsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFggeyAuLi4gfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoWCkgWDxpbnQ+OwoKMjAxNy0wOS0yMzogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzEwOTguIEZpeCBvdmVybG9hZGluZyBvZiBzaGFyZWRfcHRyIHdpdGggdW5kZXJseWluZyBwb2ludGVyIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgdm9pZCBtKHN0ZDo6c2hhcmVkX3B0cjxUPiBwKTsKICAgICAgICAgICAgICB2b2lkIG0oVCAmcCk7CiAgICAgICAgICAgICAgdm9pZCBtKFQgKnApOwoKICAgICAgICAgICAgT25seSB0aGUgZmlyc3QgbWV0aG9kIGlzIHdyYXBwZWQgYW5kIHRoZSBvdGhlcnMgYXJlIGlnbm9yZWQvc2hhZG93ZWQuCiAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkb25lIHZpYSBhIG5ldyBhdHRyaWJ1dGUgaW4gdGhlICd0eXBlY2hlY2snIHR5cGVtYXAgY2FsbGVkCiAgICAgICAgICAgICdlcXVpdmFsZW50Jy4gSWYgc3BlY2lmaWVkLCBpdCBtdXN0IGNvbnRhaW4gdGhlIGVxdWl2YWxlbnQgcG9pbnRlciB0eXBlIGZvciBvdmVybG9hZGluZwogICAgICAgICAgICBhbmQgY2FuIG9ubHkgYmUgdXNlZCBmb3IgdGhlIHNwZWNpYWwgU1dJR19UWVBFQ0hFQ0tfUE9JTlRFUiBwcmVjZWRlbmNlIGxldmVsLgogICAgICAgICAgICBUaGUgc2hhcmVkX3B0ciAndHlwZWNoZWNrJyB0eXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgYWNjb3JkaW5nbHkuCiAgICAgICAgICAgIEhlcmUgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb246CgogICAgICAgICAgICAgICV0eXBlbWFwKHR5cGVjaGVjaywgcHJlY2VkZW5jZT1TV0lHX1RZUEVDSEVDS19QT0lOVEVSLCBlcXVpdmFsZW50PSJUICoiKQogICAgICAgICAgICAgICAgVCwKICAgICAgICAgICAgICAgIFQgQ09OU1QgJiwKICAgICAgICAgICAgICAgIFQgQ09OU1QgKiwKICAgICAgICAgICAgICAgIFQgKkNPTlNUJiwKICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjwgVCA+LAogICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPCBUID4gJiwKICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjwgVCA+ICosCiAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8IFQgPiAqJgogICAgICAgICAgICAgICAgeyAuLi4gfQoKICAgICAgICAgICAgT3ZlcmxvYWRpbmcgd2l0aCBhbnkgb2YgdGhlc2UgdHlwZXMgd2lsbCByZXN1bHQgaW4gU1dJRyBpZ25vcmluZyBhbGwgYnV0IHRoZSBmaXJzdAogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZCBieSBkZWZhdWx0LiBXaXRob3V0IHRoZSAnZXF1aXZhbGVudCcgYXR0cmlidXRlLCB3cmFwcGluZyB0aGUgb3ZlcmxvYWRlZAogICAgICAgICAgICBtZXRob2RzIHJlc3VsdGVkIGluIHR5cGVzIGJlaW5nIHNoYWRvd2VkIChzY3JpcHRpbmcgbGFuZ3VhZ2VzKSBvciBjb2RlIHRoYXQgZGlkIG5vdAogICAgICAgICAgICBjb21waWxlIChzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcykuCgoyMDE3LTA5LTE5OiBmdXRhdHVraQogICAgICAgICAgICBbUHl0aG9uXSAjMTAwMyBBZGQgLS13aXRoLTJ0bzM9L3BhdGgvdG8vMnRvMyBvcHRpb24gdG8gY29uZmlndXJlLgoKMjAxNy0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGUgcHJvbW90aW9uIHdyYXBwaW5nIGNvbnN0YW50IGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtOgogICAgICAgICAgICAgICMgZGVmaW5lIEVYUFJfTUlYRUQxICAgICgweDgwICsgMTEuMSkgLSAxCiAgICAgICAgICAgIFRoaXMgd2FzIHByZXZpb3VzbHkgYW4gaW50ZWdyYWwgdHlwZSBpbnN0ZWFkIG9mIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4KCjIwMTctMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgY29uc3RhbnQgZXhwcmVzc2lvbnMgY29udGFpbmluZyB3Y2hhcl90IEwgbGl0ZXJhbHMgc3VjaCBhczoKICAgICAgICAgICAgICAjIGRlZmluZSBfX1dDSEFSX01BWCAgICAoMHg3ZmZmZmZmZiArIEwnXDAnKQogICAgICAgICAgICAgICMgZGVmaW5lIF9fV0NIQVJfTUlOICAgICgtX19XQ0hBUl9NQVggLSAxKQoKMjAxNy0wOS0xMDogbWxhbWFycmUKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzEwODMuIERlZmluZV9ERUJVRyB0byAxIHRvIGRvIGV4YWN0bHkgbGlrZSBWaXN1YWwgU3R1ZGlvCiAgICAgICAgICAgIC9MRGQsIC9NRGQgb3IgL01UZCBjb21waWxlciBvcHRpb25zLgoKMjAxNy0wOC0yNTogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzEwNTkuIEFkZCBzdXBwb3J0IGZvciBDKysxMSByZWYtcXVhbGlmaWVycyBvbiBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgIE1lbWJlcnMgd2l0aCBsdmFsdWUgcmVmLXF1YWxpZmllcnMgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFJRIHsKICAgICAgICAgICAgICAgIHZvaWQgbTEoaW50IHgpICY7CiAgICAgICAgICAgICAgICB2b2lkIG0yKGludCB4KSBjb25zdCAmOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBhcmUgd3JhcHBlZCBsaWtlIGFueSBvdGhlciBtZW1iZXIgZnVuY3Rpb24uIE1lbWJlciBmdW5jdGlvbnMgd2l0aCBydmFsdWUgcmVmLXF1YWxpZmllcnMKICAgICAgICAgICAgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdCwgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFJRIHsKICAgICAgICAgICAgICAgIHZvaWQgbTMoaW50IHgpICYmOwogICAgICAgICAgICAgICAgdm9pZCBtNChpbnQgeCkgY29uc3QgJiY7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjc6IFdhcm5pbmcgNDA1OiBNZXRob2Qgd2l0aCBydmFsdWUgcmVmLXF1YWxpZmllciBtMyhpbnQpICYmIGlnbm9yZWQuCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjg6IFdhcm5pbmcgNDA1OiBNZXRob2Qgd2l0aCBydmFsdWUgcmVmLXF1YWxpZmllciBtNChpbnQpIGNvbnN0ICYmIGlnbm9yZWQuCgogICAgICAgICAgICBUaGVzZSBjYW4gYmUgdW5pZ25vcmVkIGFuZCBleHBvc2VkIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIHNlZSBmdXJ0aGVyIGRvY3VtZW50YXRpb24gaW4KICAgICAgICAgICAgQ1BsdXNQbHVzMTEuaHRtbC4KCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA2My4gQWRkIHVzaW5nIGRlY2xhcmF0aW9ucyB0byB0ZW1wbGF0ZXMgaW50byB0eXBlZGVmIHRhYmxlLgoKICAgICAgICAgICAgVXNpbmcgZGVjbGFyYXRpb25zIHRvIHRlbXBsYXRlcyB3ZXJlIG1pc3NpbmcgaW4gU1dJRydzIGludGVybmFsIHR5cGVkZWYgdGFibGVzLgogICAgICAgICAgICBUaGlzIGxlZCB0byBhIGZldyBwcm9ibGVtcywgc3VjaCBhcywgdGVtcGxhdGVzIHRoYXQgZGlkIG5vdCBpbnN0YW50aWF0ZSBhbmQgZ2VuZXJhdGVkCiAgICAgICAgICAgIEMrKyBjb2RlIHRoYXQgZGlkIG5vdCBjb21waWxlIGFzIFNXSUcgZGlkIG5vdCBrbm93IHdoYXQgc2NvcGUgdGhlIHRlbXBsYXRlIHdhcwogICAgICAgICAgICBpbi4gVGhpcyBoYXBwZW5lZCBtb3N0bHkgd2hlbiBhIHVzaW5nIGRlY2xhcmF0aW9uIHdhcyB1c2VkIG9uIGEgdGVtcGxhdGUgdHlwZSBpbiBhCiAgICAgICAgICAgIGNvbXBsZXRlbHkgdW5yZWxhdGVkIG5hbWVzcGFjZS4KCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlIGxvb2t1cCBpbiB0aGUgcHJlc2VuY2Ugb2YgdXNpbmcgZGlyZWN0aXZlcyBhbmQgdXNpbmcgZGVjbGFyYXRpb25zLgoKICAgICAgICAgICAgRml4IHNvbWUgY2FzZXMgb2YgdHlwZSBsb29rdXAgZmFpbHVyZSB2aWEgYSBjb21iaW5hdGlvbiBvZiBib3RoIHVzaW5nIGRpcmVjdGl2ZXMgYW5kCiAgICAgICAgICAgIHVzaW5nIGRlY2xhcmF0aW9ucyByZXN1bHRpbmcgaW4gQysrIGNvZGUgdGhhdCBkaWQgbm90IGNvbXBpbGUgYXMgdGhlIGdlbmVyYXRlZCB0eXBlIHdhcwogICAgICAgICAgICBub3QgZnVsbHkgcXVhbGlmaWVkIGZvciB1c2UgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIEV4YW1wbGUgYmVsb3c6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTUgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFN1YlNwYWNlNSB7CiAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTdWJTdWJTcGFjZTUgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGIHt9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgU3ViU3BhY2U1OwogICAgICAgICAgICAgICAgdXNpbmcgU3ViU3ViU3BhY2U1OjpGOwogICAgICAgICAgICAgICAgdm9pZCBmdW5jKFN1YlN1YlNwYWNlNTo6RiBmKTsKICAgICAgICAgICAgICB9CgoyMDE3LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTA1MS4gJXRlbXBsYXRlIHNjb3BlIGVuZm9yY2VtZW50IGFuZCBjbGFzcyBkZWZpbml0aW9uIGZpeGVzLgoKICAgICAgICAgICAgVGhlIHNjb3BpbmcgcnVsZXMgYXJvdW5kICV0ZW1wbGF0ZSBoYXZlIGJlZW4gc3BlY2lmaWVkIGFuZCBlbmZvcmNlZC4KICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgZm9yIGEgY2xhc3MgdGVtcGxhdGUgaXMgdGhlIGVxdWl2YWxlbnQgdG8gYW4KICAgICAgICAgICAgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBhIEMrKyBjbGFzcyB0ZW1wbGF0ZS4gVGhlIHNjb3BlIGZvciBhIHZhbGlkCiAgICAgICAgICAgICV0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGlzIG5vdyB0aGUgc2FtZSBhcyB0aGUgc2NvcGUgcmVxdWlyZWQgZm9yIGEKICAgICAgICAgICAgdmFsaWQgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBhIEMrKyB0ZW1wbGF0ZS4gQSBkZWZpbml0aW9uIG9mIHRoZQogICAgICAgICAgICB0ZW1wbGF0ZSBmb3IgdGhlIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gbXVzdCBiZSBpbiBzY29wZSB3aGVyZSB0aGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbiBpcyBkZWNsYXJlZCBhbmQgbXVzdCBub3QgYmUgZW5jbG9zZWQgd2l0aGluIGEgZGlmZmVyZW50CiAgICAgICAgICAgIG5hbWVzcGFjZS4KCiAgICAgICAgICAgIEZvciBleGFtcGxlLCBhIGZldyAldGVtcGxhdGUgYW5kIEMrKyBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBvZiBzdGQ6OnZlY3RvcgogICAgICAgICAgICBhcmUgc2hvd24gYmVsb3c6CgogICAgICAgICAgICAgIC8vIHZhbGlkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gdmFsaWQKICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICAvLyB2YWxpZAogICAgICAgICAgICAgIHVzaW5nIHN0ZDo6dmVjdG9yOwogICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICAvLyBpbGwtZm9ybWVkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHVucmVsYXRlZCB7CiAgICAgICAgICAgICAgICB1c2luZyBzdGQ6OnZlY3RvcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBpbGwtZm9ybWVkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHVucmVsYXRlZCB7CiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIGlsbC1mb3JtZWQKICAgICAgICAgICAgICBuYW1lc3BhY2UgdW5yZWxhdGVkIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBpbGwtZm9ybWVkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHVucmVsYXRlZCB7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSBzdGQ6OnZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3Mgc3RkOjp2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBXaGVuIHRoZSBzY29wZSBpcyBpbmNvcnJlY3QsIGFuIGVycm9yIG5vdyBvY2N1cnMgc3VjaCBhczoKCiAgICAgICAgICAgICAgY3BwX3RlbXBsYXRlX3Njb3BlLmk6MzQ6IEVycm9yOiAndmVjdG9yJyByZXNvbHZlcyB0byAnc3RkOjp2ZWN0b3InIGFuZAogICAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBpbnN0YW50aWF0ZWQgaW4gc2NvcGUgJ3VucmVsYXRlZCcgaW5zdGVhZCBvZiB3aXRoaW4gc2NvcGUgJ3N0ZCcuCgogICAgICAgICAgICBQcmV2aW91c2x5IFNXSUcgYWNjZXB0ZWQgdGhlIGlsbC1mb3JtZWQgZXhhbXBsZXMgYWJvdmUgYnV0IHRoaXMgbGVkIHRvCiAgICAgICAgICAgIG51bWVyb3VzIHN1YnRsZSB0ZW1wbGF0ZSBzY29wZSBwcm9ibGVtcyBlc3BlY2lhbGx5IGluIHRoZSBwcmVzZW5jZSBvZgogICAgICAgICAgICB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIHVzaW5nIGRpcmVjdGl2ZXMgYXMgd2VsbCBhcyB3aXRoICVmZWF0dXJlIGFuZCAldHlwZW1hcC4KCiAgICAgICAgICAgIEFjdHVhbGx5LCBhIHZhbGlkIGluc3RhbnRpYXRpb24gaXMgb25lIHdoaWNoIGNvbmZvcm1zIHRvIHRoZSBDKyswMwogICAgICAgICAgICBzdGFuZGFyZCBhcyBDKysxMSBtYWRlIGEgY2hhbmdlIHRvIGRpc2FsbG93IHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICAgdXNpbmcgZGlyZWN0aXZlcyB0byBmaW5kIGEgdGVtcGxhdGUuCgogICAgICAgICAgICAgIC8vIHZhbGlkIEMrKzAzLCBpbGwtZm9ybWVkIEMrKzExCiAgICAgICAgICAgICAgdXNpbmcgc3RkOjp2ZWN0b3I7CiAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CgogICAgICAgICAgICBTaW1pbGFyIGZpeGVzIGZvciBkZWZpbmluZyBjbGFzc2VzIHVzaW5nIGZvcndhcmQgY2xhc3MgcmVmZXJlbmNlcyBoYXZlCiAgICAgICAgICAgIGFsc28gYmVlbiBwdXQgaW4gcGxhY2UuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UxIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBBOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBTcGFjZTE6OkEgewogICAgICAgICAgICAgICAgICB2b2lkIHgoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aWxsIG5vdyBlcnJvciBvdXQgd2l0aDoKCiAgICAgICAgICAgICAgY3BwX2NsYXNzX2RlZmluaXRpb24uaTo1OiBFcnJvcjogJ1NwYWNlMTo6QScgcmVzb2x2ZXMgdG8gJ1NwYWNlMTo6QScgYW5kCiAgICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IGluc3RhbnRpYXRlZCBpbiBzY29wZSAnU3BhY2UyJyBpbnN0ZWFkIG9mIHdpdGhpbiBzY29wZSAnU3BhY2UxJy4KCiAgICAgICAgICAgIFByZXZpb3VzbHkgc29tZSBzeW1ib2xzIHdvdWxkIGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQgaW4gdGhlIHdyb25nIHNjb3BlIGFuZCBsZWQKICAgICAgICAgICAgdG8gbG90cyBvZiBzY29wZSBwcm9ibGVtcyBpbnZvbHZpbmcgU1dJRyB0eXBlbWFwcywgZmVhdHVyZXMsIHJlbmFtZXMgZXRjLgogICAgICAgICAgICBZb3Ugd2lsbCBuZWVkIHRvIGNvcnJlY3QgdGhlIHNjb3BlIHVzZWQgaW4gb3RoZXIgU1dJRyBkaXJlY3RpdmVzIHdoaWNoIGRvIG5vdAogICAgICAgICAgICBzdXBwb3J0ICd1c2luZyBkZWNsYXJhdGlvbnMnIGFuZCAndXNpbmcgZGlyZWN0aXZlcycuIEZvciBleGFtcGxlLCBpZiB5b3UgcHJldmlvdXNseSBoYWQ6CgogICAgICAgICAgICAgICVyZW5hbWUoWmFwKSB2ZWN0b3I8aW50Pjo6Y2xlYXI7CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdG9ySW50KSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFByaW9yIHZlcnNpb25zIG9mIFNXSUcgaW5jb3JyZWN0bHkgaW5zdGFudGlhdGVkIHZlY3RvcjxpbnQ+IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlCiAgICAgICAgICAgIGFuZCBzbyB0aGUgJXJlbmFtZSBtYXRjaGVkLiBOb3cgdGhlIHRlbXBsYXRlIGlzIGluc3RhbnRpYXRlZCBpbiB0aGUgY29ycmVjdCBuYW1lc3BhY2UsCiAgICAgICAgICAgIHNvIGlzIGZ1bGx5IHF1YWxpZmllZCBhcyBzdGQ6OnZlY3RvcjxpbnQ+LiBUaGUgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIG5lZWQgY29ycmVjdGluZyBhcwogICAgICAgICAgICB0aGV5IGRvIG5vdCBmb2xsb3cgJ3VzaW5nIGRlY2xhcmF0aW9ucycgYW5kICd1c2luZyBkaXJlY3RpdmVzJy4gQ2hhbmdlIGl0IHRvOgoKICAgICAgICAgICAgICAlcmVuYW1lKFphcCkgc3RkOjp2ZWN0b3I8aW50Pjo6Y2xlYXI7CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzY29wZSBsb29rdXAgZm9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgY29udGFpbmluZyB1bmFyeSBzY29wZSBvcGVyYXRvcnMuCgogICAgICAgICAgICBGaXhlcyBjYXNlcyBsaWtlOgoKICAgICAgICAgICAgbmFtZXNwYWNlIEFsbG9jIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmViaW5kIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAldGVtcGxhdGUoUmViaW5kQnVja2V0KSBBbGxvYzo6UmViaW5kPCBCdWNrZXQgPjsKICAgICAgICAgICAgT1IKICAgICAgICAgICAgJXRlbXBsYXRlKFJlYmluZEJ1Y2tldCkgQWxsb2M6OlJlYmluZDwgOjpCdWNrZXQgPjsKCiAgICAgICAgICAgIEFsbG9jOjpSZWJpbmQ8IEJ1Y2tldCA+OjpJbnRlZ2VyIEJ1Y2tldDEoKTsKICAgICAgICAgICAgQWxsb2M6OlJlYmluZDwgOjpCdWNrZXQgPjo6SW50ZWdlciBCdWNrZXQyKCk7CiAgICAgICAgICAgIEFsbG9jOjpSZWJpbmQ8Ojp0ZW1wbGF0ZSBUZW1wbGF0ZUJ1Y2tldDxkb3VibGU+Pjo6SW50ZWdlciBCdWNrZXQzKCk7CgoyMDE3LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGb3IgdGVtcGxhdGVzIG9ubHksIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBmdWxseSByZXNvbHZlZCB3aGVuCiAgICAgICAgICAgIGhhbmRsaW5nIHR5cGVtYXBzLiBXaXRob3V0IHRoaXMsIGl0IGlzIHRvbyBoYXJkIHRvIGhhdmUgZGVjZW50IHJ1bGVzCiAgICAgICAgICAgIHRvIGFwcGx5IHR5cGVtYXBzIHdoZW4gcGFyYW1ldGVyIHR5cGVzIGFyZSB0eXBlZGVmJ2QgYW5kIHRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlcnMgaGF2ZSBkZWZhdWx0IHZhbHVlcy4KCiAgICAgICAgICAgIEZpeGVzICVjbGVhciBmb3IgdHlwZWRlZnMgaW4gdGVtcGxhdGVzLCBlZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoImluIikgWFhYPGludD46OkxvbmcgIi4uLiIKICAgICAgICAgICAgICB0ZW1wbGF0ZSB0eXBlbmFtZTxUPiBzdHJ1Y3QgWFhYIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgbG9uZyBMb25nOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJWNsZWFyIFhYWDxpbnQ+OjpMb25nOwoKICAgICAgICAgICAgYXMgdGhlIHR5cGVtYXAgd2FzIHByZXZpb3VzbHkgaW5jb3JyZWN0bHkgc3RvcmVkIGFzIGEgdHlwZW1hcCBmb3IgbG9uZwogICAgICAgICAgICBpbnN0ZWFkIG9mIFhYWDxpbnQ+OjpMb25nLgoKMjAxNy0wOC0wNTogb2xseQoJICAgIFtDKysxMV0gQWxsb3cgc3RhdGljX2Fzc2VydCBhdCB0aGUgdG9wIGxldmVsIChhbmQgZGlzYWxsb3cgaXQgcmlnaHQKCSAgICBhZnRlciB0ZW1wbGF0ZTxUPikuICBGaXhlcyBpc3N1ZSAxMDMxIHJlcG9ydGVkIGJ5IEFydGVtIFYgTC4KCjIwMTctMDgtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3RseSBzaG93biB3YXJuaW5nIHdoZW4gYW4gZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB3YXMgdXNlZCBvbiBhCiAgICAgICAgICAgIGNsYXNzIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGFuZCB0aGF0IGJhc2UgY2xhc3Mgd2FzIGV4cGxpY2l0bHkgaWdub3JlZCB3aXRoICVpZ25vcmUuCiAgICAgICAgICAgIEV4YW1wbGUgb2YgdGhlIHdhcm5pbmcgd2hpY2ggd2lsbCBubyBsb25nZXIgYXBwZWFyOgoKICAgICAgICAgICAgICBXYXJuaW5nIDQwMTogQmFzZSBjbGFzcyAnRnVuY3RvcjwgaW50LGludCA+JyBoYXMgbm8gbmFtZSBhcyBpdCBpcyBhbiBlbXB0eQogICAgICAgICAgICAgIHRlbXBsYXRlIGluc3RhbnRpYXRlZCB3aXRoICcldGVtcGxhdGUoKScuIElnbm9yZWQuCgoyMDE3LTA3LTE3OiBmZmxleG8KICAgICAgICAgICAgW0phdmFdICM2NzQgQWRkIHN0ZF9saXN0LmkgdG8gYWRkIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCBjb250YWluZXJzLiBUaGUgSmF2YSBwcm94eQogICAgICAgICAgICBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNlcXVlbnRpYWxMaXN0IGFuZCBtYWtlcyB0aGUgQysrIHN0ZDo6bGlzdCBjb250YWluZXIgbG9vawogICAgICAgICAgICBhbmQgZmVlbCBtdWNoIGxpa2UgYSBqYXZhLnV0aWwuTGlua2VkTGlzdCBmcm9tIEphdmEuCgoyMDE3LTA3LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggZGlzcGxheSBvZiBkb2N1bWVudGVkIHRlbXBsYXRlIHR5cGVzIHdoZW4gdXNpbmcgdGhlIGF1dG9kb2MKICAgICAgICAgICAgZmVhdHVyZS4gRm9yIGV4YW1wbGUgd2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImF1dG9kb2MiKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYPiBzdHJ1Y3QgVCB7fTsKICAgICAgICAgICAgICAldGVtcGxhdGUoVEludGVnZXIpIFQ8aW50PjsKCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBjb250YWluczoKICAgICAgICAgICAgICAiIiJQcm94eSBvZiBDKysgVDwgaW50ID4gY2xhc3MuIiIiCiAgICAgICAgICAgIGluc3RlYWQgb2Y6CiAgICAgICAgICAgICAgIiIiUHJveHkgb2YgQysrIFQ8KGludCk+IGNsYXNzLiIiIgogICAgICAgICAgICBhbmQKICAgICAgICAgICAgICAiIiJfX2luaXRfXyhUSW50ZWdlciBzZWxmKSAtPiBUSW50ZWdlciIiIgogICAgICAgICAgICBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgIiIiX19pbml0X18oVDwoaW50KT4gc2VsZikgLT4gVEludGVnZXIiIiIKCjIwMTctMDYtMjc6IG5paGFsbgoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgT1VUUFVUIFR5cGVtYXAgdG8gYWRkIHJldHVybiBzdGF0ZW1lbnQgdG8gdGhlCgkgICAgUEhQIFdyYXBwZXIuCgoyMDE3LTA2LTI3OiBuaWhhbG4KCSAgICBbUEhQXSBVcGRhdGUgdGhlIGVudW0gYW5kIHZhbHVlIGV4YW1wbGVzIHRvIHVzZSB0aGUgT08gd3JhcHBlcnMKCSAgICByYXRoZXIgdGhhbiB0aGUgZmxhdCBmdW5jdGlvbnMgcHJvZHVjZWQgd2l0aCAtbm9wcm94eS4gIFRoZXJlJ3MKCSAgICBub3QgYmVlbiBhIGdvb2QgcmVhc29uIHRvIHVzZSAtbm9wcm94eSBmb3Igc2luY2UgUEhQNSBPTyB3cmFwcGluZwoJICAgIHdhcyBmaXhlZCBiYWNrIGluIDIwMDUuCgoyMDE3LTA2LTIzOiBtN3Rob24KICAgICAgICAgICAgW1B5dGhvbl0gZml4IGFuZCBpbXByb3ZlIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmc6CgogICAgICAgICAgICAxLiBGaXggbmVnYXRpdmUgb2N0YWxzLiBDdXJyZW50bHkgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IGAtcHkzYAogICAgICAgICAgICAgICAodW51c3VhbCBjYXNlLCBidXQgaW5jb3JyZWN0KS4KICAgICAgICAgICAgMi4gRml4IGFyZ3VtZW50cyBvZiB0eXBlICJvY3RhbCArIHNvbWV0aGluZyIgKGUuZy4gYDA2NDAgfCAwNGApLgogICAgICAgICAgICAgICBDdXJyZW50bHkgZHJvcHMgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3Qgb2N0YWwuIE5hc3R5IQogICAgICAgICAgICAzLiBGaXggYm9vbCBhcmd1bWVudHMgIjAgKyBzb21ldGhpbmciIChlLmcuIGAwIHwgMWApIGFyZSBhbHdheXMKICAgICAgICAgICAgICAgIkZhbHNlIiAodW51c3VhbCBjYXNlLCBidXQgaW5jb3JyZWN0KS4KICAgICAgICAgICAgNC4gUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgIlRSVUUiIGFuZCAiRkFMU0UiIGZyb20KICAgICAgICAgICAgICAgYGNvbnZlcnRWYWx1ZWAgc2luY2UgdGhlcmUncyBubyByZWFzb24gdGhlc2UgaGF2ZSB0byBtYXRjaAogICAgICAgICAgICAgICAidHJ1ZSIgYW5kICJmYWxzZSIuCiAgICAgICAgICAgIDUuIFJlbW92ZSB0aGUgUHl0aG9uIDIgdnMuIFB5dGhvbiAzIGRpc3RpbmN0aW9uIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICBgLXB5M2AgZmxhZy4gTm93IHRoZSBzYW1lIHB5dGhvbiBjb2RlIGlzIHByb2R1Y2VkIGZvciBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50cyBmb3IgUHl0aG9uIDIgYW5kIFB5dGhvbiAzLiBGb3IgdGhpcywgb2N0YWwgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudHMsIGUuZy4gMDY0NCwgYXJlIG5vdyB3cmFwcGVkIGFzIGBpbnQoJzY0NCcsIDgpYC4gVGhpcwogICAgICAgICAgICAgICBpcyByZXF1aXJlZCwgYXMgUHl0aG9uIDIgYW5kIFB5dGhvbiAzIGhhdmUgaW5jb21wYXRpYmxlIHN5bnRheAogICAgICAgICAgICAgICBmb3Igb2N0YWwgbGl0ZXJhbHMuCgogICAgICAgICAgICBGaXhlcyAjNzA3CgoyMDE3LTA2LTIxOiBmdXRhdHVraQogICAgICAgICAgICAjMTAwNCAtIEZpeCBjY2FjaGUtc3dpZyBleGVjdXRhYmxlIG5hbWUgdG8gcmVzcGVjdCBjb25maWd1cmUncyAtLXByb2dyYW0tcHJlZml4IGFuZAogICAgICAgICAgICAtLXByb2dyYW0tc3VmZml4IHZhbHVlcyBpZiB1c2VkLgoKMjAxNy0wNi0yMTogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTExIC0gQWRkIHN0ZDo6d3N0cmluZyBzdXBwb3J0LgoKMjAxNy0wNi0xOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGhhbmRsaW5nIG9mIHJpY2ggY29tcGFyaXNvbnMgd2hlbiB3cmFwcGluZyBvdmVybG9hZGVkIG9wZXJhdG9yczoKCiAgICAgICAgICAgICAgb3BlcmF0b3I8ICBvcGVyYXRvcjw9ICBvcGVyYXRvcj4gIG9wZXJhdG9yPj0gIG9wZXJhdG9yPT0gIG9wZXJhdG9yIT0KCiAgICAgICAgICAgIFByZXZpb3VzbHkgYSBUeXBlRXJyb3Igd2FzIGFsd2F5cyB0aHJvd24gaWYgdGhlIHR5cGUgd2FzIG5vdCBjb3JyZWN0LiBOb3RJbXBsZW1lbnRlZAogICAgICAgICAgICBpcyBub3cgcmV0dXJuZWQgZnJvbSB0aGVzZSB3cmFwcGVkIGZ1bmN0aW9ucyBpZiB0aGUgdHlwZSBiZWluZyBjb21wYXJlZCB3aXRoIGlzCiAgICAgICAgICAgIG5vdCBjb3JyZWN0LiBUaGUgc3Vic2VxdWVudCBiZWhhdmlvdXIgdmFyaWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIFB5dGhvbgogICAgICAgICAgICBhbmQgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gYmVpbmcgdXNlZCwgYnV0IGlzIG5vdyBjb25zaXN0ZW50IHdpdGggbm9ybWFsIFB5dGhvbgogICAgICAgICAgICBiZWhhdmlvdXIuIEZvciBleGFtcGxlLCBmb3IgdGhlIGZpcnN0IDQgb3BlcmF0b3Igb3ZlcmxvYWRzIGFib3ZlLCBhIFR5cGVFcnJvcgogICAgICAgICAgICAndW5vcmRlcmFibGUgdHlwZXMnIGlzIHRocm93biBpbiBQeXRob24gMywgYnV0IFB5dGhvbiAyIHdpbGwgcmV0dXJuIFRydWUgb3IgRmFsc2UuCiAgICAgICAgICAgIE5vdEltcGxlbWVudGVkIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZSBjb21wYXJpc29uIGNhbm5vdCBiZSBkb25lLCBzZWUgUEVQIDIwNyBhbmQKICAgICAgICAgICAgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L2NvbnN0YW50cy5odG1sI05vdEltcGxlbWVudGVkCgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGJ1ZyB3YXMgb25seSBwcmVzZW50IHdoZW4gb3ZlcmxvYWRlZCBvcGVyYXRvcnMgZGlkIG5vdCBhbHNvIGhhdmUgYQogICAgICAgICAgICBmdW5jdGlvbiBvdmVybG9hZC4KCiAgICAgICAgICAgIEZpeGVzIFNGIGJ1ZyAjMTIwOCAoMzQ0MTI2MikgYW5kIFNGIHBhdGNoICMzMDMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMDYtMTc6IGZhYnJpY2UxMDIKICAgICAgICAgICAgW0dvXSBGaXggR28gY2FsbGJhY2sgZXhhbXBsZS4gIEZpeGVzIGdpdGh1YiAjNjAwLCAjOTU1LCAjMTAwMC4KCjIwMTctMDYtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIE1ha2Ugc3VyZSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyBhcmUgbm90IHNwbGl0IHVwIGJ5IG90aGVyIHByb2Nlc3NlcyB3cml0aW5nIHRvCiAgICAgICAgICAgIHN0ZG91dCBhdCB0aGUgc2FtZSB0aW1lLgoKMjAxNy0wNi0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCB3cmFwcGluZyBmdW5jdGlvbiBwb2ludGVycyBjb250YWluaW5nIHJ2YWx1ZSBhbmQgbHZhbHVlIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgoKMjAxNy0wNi0xMzogb2xseQoJICAgIFtQZXJsXSBGaXggdGVzdHN1aXRlIHRvIHdvcmsgd2l0aG91dCAuIGluIEBJTkMgLSBpdCB3YXMgcmVtb3ZlZCBpbgoJICAgIFBlcmwgNS4yNiBmb3Igc2VjdXJpdHkgcmVhc29ucywgYW5kIGhhcyBhbHNvIGJlZW4gcmVtb3ZlZCBmcm9tCgkgICAgb2xkZXIgdmVyc2lvbnMgaW4gc29tZSBkaXN0cm9zLiAgRml4ZXMgIzk5NyByZXBvcnRlZCBieSBsZmFtLgoKMjAxNy0wNi0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpbXBvcnQgb24gYSBmaWxlIGNvbnRhaW5pbmcgYSBmaWxlIHNjb3BlICVmcmFnbWVudCBmb3JjZWQgaW5jbHVzaW9uIHRvIG5vdAogICAgICAgICAgICBnZW5lcmF0ZSB0aGUgZnJhZ21lbnQgY29udGVudHMgYXMgJWltcG9ydCBzaG91bGQgbm90IHJlc3VsdCBpbiBjb2RlIGJlaW5nIGdlbmVyYXRlZC4KICAgICAgICAgICAgVGhlIGJlaGF2aW91ciBpcyBub3cgdGhlIHNhbWUgYXMgaW1wb3J0aW5nIGNvZGUgaW5zZXJ0aW9uIGJsb2Nrcy4KICAgICAgICAgICAgV3JhcHBpbmcgRmlsZUMuaSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2lsbCByZXN1bHQgaW4gbm8gZ2VuZXJhdGVkIGNvZGUsIHdoZXJlYXMKICAgICAgICAgICAgcHJldmlvdXNseSAiI2luY2x1ZGUgPGxpbWl0cy5oPiIgd2FzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgLy8gRmlsZUEuaQogICAgICAgICAgICAgICVmcmFnbWVudCgiPGxpbWl0cy5oPiIsICJoZWFkZXIiKSAlewogICAgICAgICAgICAgICAgI2luY2x1ZGUgPGxpbWl0cy5oPgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICVmcmFnbWVudCgiPGxpbWl0cy5oPiIpOwoKICAgICAgICAgICAgICAvLyBGaWxlQy5pCiAgICAgICAgICAgICAgJWltcG9ydCAiRmlsZUEuaSIKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wNS0yNjogVm9sa2VyIERpZWxzLUdyYWJzY2gsIHZhZHoKICAgICAgICAgICAgW0phdmFdICM4NDIgRXh0ZW5kIGZyb20gamF2YS51dGlsLkFic3RyYWN0TGlzdDw+IGFuZCBpbXBsZW1lbnQgamF2YS51dGlsLlJhbmRvbUFjY2VzcyBmb3IKICAgICAgICAgICAgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoaXMgbm90YWJseSBhbGxvd3MgdG8gaXRlcmF0ZSBvdmVyIHdyYXBwZWQgdmVjdG9ycyBpbiBhIG5hdHVyYWwgd2F5LgogICAgICAgICAgICBOb3RlIHRoYXQgYm94ZWQgdHlwZXMgYXJlIG5vdyB1c2VkIGluIHRoZSBKYXZhIGxheWVyIHdoZW4gd3JhcHBpbmcgdmVjdG9yIG9mIEMgcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzLCBmb3IgZXhhbXBsZS4gVGhpcyBtYXkgaW50cm9kdWNlIHNvbWUgc3VidGxlIGluY29tcGF0aWJpbGl0aWVzIGR1ZSB0byBzb21lCiAgICAgICAgICAgIGRpZmZlcmVuY2VzIGluIGhvdyBKYXZhIGNvbnZlcnRzIGJveGVkIHR5cGVzIGFuZCB1bmJveGVkIHR5cGVzLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgaW50IGk9MDsKICAgICAgICAgICAgICBkb3VibGUgZDEgPSBpOyAvLyBvawogICAgICAgICAgICAgIERvdWJsZSBkMiA9IGk7IC8vIGVycm9yOiBpbmNvbXBhdGlibGUgdHlwZXM6IGludCBjYW5ub3QgYmUgY29udmVydGVkIHRvIERvdWJsZQoKICAgICAgICAgICAgVGhpcyBjYW4gYmUgYSBwcm9ibGVtIHdoZW4gY2FsbGluZyB0aGUgYWRkIGFuZCBzZXQgZnVuY3Rpb25zLiBBIHN1Z2dlc3RlZCBiYWNrd2FyZHMKICAgICAgICAgICAgY29tcGF0aWJsZSB3b3JrYXJvdW5kIGlzIHRvIHVzZSBzb21ldGhpbmcgbGlrZSAoc2hvd24gZm9yIHN0ZDo6dmVjdG9yPGRvdWJsZT46CgogICAgICAgICAgICAgICNpZiBkZWZpbmVkKFNXSUdKQVZBKQogICAgICAgICAgICAgIC8vIEFkZCBpbiBvbGQgYXBpIHRoYXQgdXNlcyBub24tYm94ZWQgdHlwZXMKICAgICAgICAgICAgICAlZXh0ZW5kIHN0ZDo6dmVjdG9yPGRvdWJsZT4gewogICAgICAgICAgICAgICVwcm94eWNvZGUgJXsKICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChkb3VibGUgeCkgewogICAgICAgICAgICAgICAgICBhZGQoRG91YmxlLnZhbHVlT2YoeCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KGludCBpLCBkb3VibGUgdmFsKSB7CiAgICAgICAgICAgICAgICAgIHNldChpLCBEb3VibGUudmFsdWVPZih2YWwpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdG9yRG91YmxlKSBzdGQ6OnZlY3Rvcjxkb3VibGU+OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTA1LTMwOiBkYXZpZGNsCiAgICAgICAgICAgIFtTY2lsYWJdICM5OTQgVW5kZWZpbmVkIHN5bWJvbCBlcnJvciB3aGVuIGxvYWRpbmcgaW4gU2NpbGFiIDYKCjIwMTctMDUtMjU6IGFzaWJyb3NzCiAgICAgICAgICAgIFtKYXZhXSAjMzcwICM0MTcgTWlzc2luZyBzbWFydCBwb2ludGVyIGhhbmRsaW5nIGluIEphdmEgZGlyZWN0b3IgZXh0cmEgbWV0aG9kcwogICAgICAgICAgICBzd2lnUmVsZWFzZU93bmVyc2hpcCgpIGFuZCBzd2lnVGFrZU93bmVyc2hpcCgpLgoKMjAxNy0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMyMzAgIzc1OSBGaXggSmF2YSBzaGFyZWRfcHRyIGFuZCBkaXJlY3RvcnMgZm9yIGRlcml2ZWQgY2xhc3NlcyBqYXZhIGNvbXBpbGF0aW9uCiAgICAgICAgICAgIGVycm9yLgoKICAgICAgICAgICAgRm9yIHNoYXJlZF9wdHIgcHJveHkgcHJveHkgY2xhc3NlcywgYWRkIGEgcHJvdGVjdGVkIG1ldGhvZCBzd2lnU2V0Q01lbU93biBmb3IgbW9kaWZ5aW5nCiAgICAgICAgICAgIHRoZSBzd2lnQ01lbU93biBhbmQgc3dpZ0NNZW1Pd25EZXJpdmVkIG1lbWJlciB2YXJpYWJsZXMgd2hpY2ggYXJlIHVzZWQgYnkgdmFyaW91cyBvdGhlcgogICAgICAgICAgICBtZXRob2RzIGZvciBjb250cm9sbGluZyBtZW1vcnkgb3duZXJzaGlwLgoKMjAxNy0wNS0yMTogU2doaXJhdGUKICAgICAgICAgICAgW0phdmEsIEMjLCBEXSAjNDQ5IFJlbW92ZSB1bm5lY2Vzc2FyeSB1c2Ugb2YgZHluYW1pY19jYXN0IGluIGRpcmVjdG9ycyB0byBlbmFibGUKICAgICAgICAgICAgbm9uLVJUVEkgY29tcGlsYXRpb24uCgoyMDE3LTA1LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjOTkzIEZpeCBoYW5kbGluZyBvZiBkZWZhdWx0IC12ZSB1bnNpZ25lZCB2YWx1ZXMsIHN1Y2ggYXM6CiAgICAgICAgICAgICAgdm9pZCBmKHVuc2lnbmVkID0gLTFVKTsKCjIwMTctMDUtMjA6IGpzY2h1ZWxsZXIKICAgICAgICAgICAgW1B5dGhvbl0gIzk5MSBGaXggRTczMSBQRVA4IHdhcm5pbmc6IGRvIG5vdCBhc3NpZ24gYSBsYW1iZGEgZXhwcmVzc2lvbgoKMjAxNy0wNS0xNjogbmloYWw5NQogICAgICAgICAgICBbUEhQXSBBZGQgJXByYWdtYSB2ZXJzaW9uIGRpcmVjdGl2ZSB0byBhbGxvdyB0aGUgdmVyc2lvbiBvZiB0aGUKICAgICAgICAgICAgZXh0ZW5zaW9uIHRvIGJlIHNldC4gIFBhdGNoICM5NzAsIGZpeGVzICMzNjAuCgoyMDE3LTA1LTEzOiB5YWcwMAogICAgICAgICAgICBQYXRjaCAjOTc1IC0gQWRkIHN1cHBvcnQgZm9yIG5vZXhjZXB0IG9uIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDE3LTA0LTI3OiByZWRicmFpbgogICAgICAgICAgICBJc3N1ZSAjOTc0LCBQYXRjaCAjOTc2IC0gRml4IHByZXByb2Nlc3NvciBoYW5kbGluZyBvZiBtYWNyb3Mgd2l0aCBjb21tYXMgaW4gYSBjb21tZW50LgoKMjAxNy0wNC0yNTogamxldmVxdWUKICAgICAgICAgICAgW0x1YV0gIzk1OSAtIEZpeCBWaXN1YWwgU3R1ZGlvIEM0MjQ0IGNvbnZlcnNpb24gd2FybmluZ3MgaW4gTHVhIHdyYXBwZXJzLgoKMjAxNy0wNC0yMTogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTY0IC0gQWRkIHNoYXJlZF9wdHIgZGlyZWN0b3IgdHlwZW1hcHMuCgoyMDE3LTA0LTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gIzU4NiwgIzkzNSBBZGQgYXNzZXJ0IGZvciBpbnZhbGlkIE5VTEwgdHlwZSBwYXJhbWV0ZXIgd2hlbiBjYWxsaW5nIFNXSUdfUnVieV9OZXdQb2ludGVyT2JqLgoKMjAxNy0wNC0yMDogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTMwLCAjOTM3IC0gRml4IGNvbnRhaW5lcnMgb2Ygc3RkOjpzaGFyZWRfcHRyLgogICAgICAgICAgICBVcGNhc3RpbmcsIGNvbnN0IHR5cGVzIChlZyB2ZWN0b3I8c2hhcmVkX3B0cjxjb25zdCBUPj4pIGFuZCBOVUxML251bGxwdHIgc3VwcG9ydCBhZGRlZC4KCjIwMTctMDQtMTI6IHNtYXJjaGV0dG8KICAgICAgICAgICAgW1NjaWxhYl0gTmV3IHBhcmFtZXRlciB0YXJnZXR2ZXJzaW9uIHRvIHNwZWNpZnkgdGhlIFNjaWxhYiB0YXJnZXQgdmVyc2lvbiAoNSwgNiwgLi4pIGZvciBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICAgV2l0aCBTY2lsYWIgNiB0YXJnZXQgc3BlY2lmaWVkLCBpZGVudGlmaWVyIG5hbWVzIHRydW5jYXRpb24gaXMgZGlzYWJsZWQgKG5vIGxvbmdlciBuZWNlc3NhcnkpCgoyMDE3LTAzLTI0OiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldIEZpeCAjOTM5IC0gV3JhcHBpbmcgc3RkOjp2ZWN0b3I8Ym9vbD4gZml4IGR1ZSB0byBpbmNvcnJlY3QgbnVsbCBjaGVja3MKICAgICAgICAgICAgb24gVkFMVUUgb2JqLgoKMjAxNy0wMy0xNzogdmFkegogICAgICAgICAgICBbQyNdICM5NDcgQWRkIHN1cHBvcnQgZm9yIHN0ZDo6Y29tcGxleDxUPgoKMjAxNy0wMy0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0dvXSBGaXggaGFuZGxpbmcgb2YgdHlwZWRlZidkIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCB0eXBlZGVmJ2QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzCiAgICAgICAgICAgIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqRm5QdHJfdGQpKGludCwgaW50KTsKICAgICAgICAgICAgICBpbnQgZG9fb3AoaW50IHgsIGludCB5LCBGblB0cl90ZCBvcCk7CgoyMDE3LTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgbWVtYmVyIGNvbnN0IGZ1bmN0aW9uIHBvaW50ZXJzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGludCBmbihzaG9ydCAoRnVuY3M6OiogcGFybSkoYm9vbCkpIGNvbnN0OwoKICAgICAgICAgICAgQWxzbyBmaXggcGFyc2luZyBvZiByZWZlcmVuY2VzL3BvaW50ZXJzIGFuZCBxdWFsaWZpZXJzIHRvIG1lbWJlcgogICAgICAgICAgICBwb2ludGVycyBzdWNoIGFzOgoKICAgICAgICAgICAgICBpbnQgZm4oc2hvcnQgKEZ1bmNzOjoqIGNvbnN0IHBhcm0pKGJvb2wpKTsKICAgICAgICAgICAgICBpbnQgZm4oc2hvcnQgKEZ1bmNzOjoqICYgcGFybSkoYm9vbCkpOwoKMjAxNy0wMy0xMDogd3NmdWx0b24KICAgICAgICAgICAgRXh0ZW5kIEMrKzExIGFsdGVybmF0ZSBmdW5jdGlvbiBzeW50YXggcGFyc2luZyB0byBzdXBwb3J0IGNvbnN0IGFuZCBub2V4Y2VwdCwgc3VjaCBhczoKCiAgICAgICAgICAgICAgYXV0byBzdW0xKGludCB4LCBpbnQgeSkgY29uc3QgLT4gaW50IHsgcmV0dXJuIHggKyB5OyB9CiAgICAgICAgICAgICAgYXV0byBzdW0yKGludCB4LCBpbnQgeSkgbm9leGNlcHQgLT4gaW50IHsgcmV0dXJuIHggKyB5OyB9CgoyMDE3LTAyLTI5OiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5MTcgLSBBZGQgRW51bWVyYWJsZSBtb2R1bGUgdG8gYWxsIGNvbnRhaW5lciBjbGFzcyB3cmFwcGVycy4gSXQgd2FzIG1pc3NpbmcKICAgICAgICAgICAgZm9yIHN0ZDo6bGlzdCwgc3RkOjptdWx0aXNldCwgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQgYW5kIHN0ZDo6dW5vcmRlcmVkX21hcC4KCjIwMTctMDItMjc6IGFzc2FtYmFyCiAgICAgICAgICAgIFtDKysxMV0gRXh0ZW5kIHBhcnNlciB0byBzdXBwb3J0IHRocm93IHNwZWNpZmllciBpbiBjb21iaW5hdGlvbgogICAgICAgICAgICB3aXRoIG92ZXJyaWRlIGFuZC9vciBmaW5hbC4KCjIwMTctMDItMTA6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzg4MyAtIEFkZCBzdXBwb3J0IGZvciBDKysxMSBoYXNoIHRhYmxlczoKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0CgoyMDE3LTAyLTA4OiBqY3NoYXJwCiAgICAgICAgICAgIFtDI10gIzg4NyBJbXByb3ZlIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXIgY29uc3RydWN0b3JzIC0KICAgICAgICAgICAgUmVwbGFjZSBjb25zdHJ1Y3RvciB0YWtpbmcgSUNvbGxlY3Rpb24gd2l0aCBJRW51bWVyYWJsZSBhbmQgYWxzbyBhZGQgSUVudW1lcmFibGU8VD4KICAgICAgICAgICAgY29uc3RydWN0b3IgdG8gYXZvaWQgdGhlIGJveGluZyBhbmQgdW5ib3hpbmcgb3ZlcmhlYWQgb2YgdGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yLAogICAgICAgICAgICB3aGVuIHRoZSB0eXBlIHBhcmFtZXRlciBpcyBhIHZhbHVlIHR5cGUuCgpWZXJzaW9uIDMuMC4xMiAoMjcgSmFuIDIwMTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTctMDEtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gIzg4MiBGaXggbWlzc2luZyBmaWxlbmFtZSBpbiBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbQogICAgICAgICAgICB3cml0aW5nIG91dCBDIyBmaWxlcy4KCjIwMTctMDEtMjc6IGJyaWFuY2FpbmUKICAgICAgICAgICAgW0d1aWxlXSAjNzQ0IEZpeCBjb21waWxhdGlvbiBlcnJvcnMgaW4gR3VpbGUgd3JhcHBlcnMgLSByZWdyZXNzaW9uCiAgICAgICAgICAgIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuMTEuCgoyMDE3LTAxLTI0OiBhbmRyZXktc3Rhcm9kdWJ0c2V2CiAgICAgICAgICAgIFtKYXZhXSBBcHBseSAjNzA0IC0gZGlyZWN0b3IgdHlwZW1hcCBpbXByb3ZlbWVudHMuCiAgICAgICAgICAgIE1lbW9yeSBsZWFrIGZpeGVzLCBhZGQgc3VwcG9ydCBmb3IgImRpcmVjdG9yYXJnb3V0IiB0eXBlbWFwIGFuZAogICAgICAgICAgICBhZGQgZGlyZWN0b3Igc3VwcG9ydCB0byB0eXBlbWFwcy5pLgoKMjAxNy0wMS0yNDogd3NmdWx0b24KICAgICAgICAgICAgRW5oYW5jZSAlZXh0ZW5kIHRvIGV4dGVuZCBhIGNsYXNzIHdpdGggdGVtcGxhdGUgY29uc3RydWN0b3JzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICAgRm9vKGludCBhLCBUIGIpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvbykgRm9vOjpGb288ZG91YmxlPjsKCjIwMTctMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICM4NzYgRW5oYW5jZSAlZXh0ZW5kIHRvIGV4dGVuZCBhIGNsYXNzIHdpdGggdGVtcGxhdGUgbWV0aG9kcywgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgICAgICAgICAgIHZvaWQgZG9fc3R1ZmYoaW50IGEsIFQgYikgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoZG9fc3R1ZmZfaW5zdCkgRm9vOjpkb19zdHVmZjxkb3VibGU+OwoKICAgICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0YXRpYyB0ZW1wbGF0ZSBtZXRob2RzLgoKMjAxNy0wMS0yMjoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBhZGQgc3VwcG9ydCBmb3IgdmVyc2lvbiA0LjIKICAgICAgICAgICAgLSBUaGUgT2N0YXZlIEFQSSBub3cgdXNlcyBzb21lIEMrKzExIGZlYXR1cmVzLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKICAgICAgICAgICAgICB0aGUgbWtvY3RmaWxlIHByb2dyYW0gc3VwcGxpZWQgYnkgT2N0YXZlIHRvIGNvbXBpbGUgdGhlIFNXSUctZ2VuZXJhdGVkCiAgICAgICAgICAgICAgd3JhcHBlciBjb2RlLCBhcyBta29jdGZpbGUgd2lsbCBlbnN1cmUgdGhlIGNvcnJlY3QgQysrIGNvbXBpbGVyL29wdGlvbnMKICAgICAgICAgICAgICBhcmUgdXNlZC4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgYG1rb2N0ZmlsZSAtcCBDWFhgIHNob3VsZCBiZSBwYXJzZWQKICAgICAgICAgICAgICBmb3IgYW55IC1zdGQ9KiBmbGFncyB3aGljaCBtaWdodCBiZSBwcmVzZW50LgogICAgICAgICAgICAtIE9jdGF2ZSBoYXMgZHJvcHBlZCBzdXBwb3J0IGZvciA8PCBhbmQgPj4gb3BlcmF0b3JzLCBzbyBTV0lHIG5vdwogICAgICAgICAgICAgIGlnbm9yZXMgdGhlbS4KICAgICAgICAgICAgLSBUaGUgT2N0YXZlIGVycm9yKCkgZnVuY3Rpb24gbm93IHJhaXNlcyBDKysgZXhjZXB0aW9ucyB0byBwcm9wYWdhdGUKICAgICAgICAgICAgICBPY3RhdmUgZXJyb3JzLCBzbyAlZXhjZXB0aW9uIGRpcmVjdGl2ZXMgbWF5IG5lZWQgdG8gYmUgbW9kaWZpZWQuCiAgICAgICAgICAgICAgRm9yIGNvbnZlbmllbmNlIHRoZSBTV0lHX1JFVEhST1dfT0NUQVZFX0VYQ0VQVElPTlMgbWFjcm8gY2FuIGJlIHVzZWQKICAgICAgICAgICAgICB0byByZXRocm93IGFueSBPY3RhdmUgZXhjZXB0aW9ucyBmb3IgT2N0YXZlIGl0c2VsZiB0byBoYW5kbGUsIGUuZy46CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgJGFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBjYWxsIGVycm9yKCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFNXSUdfUkVUSFJPV19PQ1RBVkVfRVhDRVBUSU9OUyAgIC8vIGVycm9yKCkgZXhjZXB0aW9ucyBhcmUgcmV0aHJvd24KICAgICAgICAgICAgICAgIGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGV4Y2VwdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wMS0xNjogd2thbGluaW4KICAgICAgICAgICAgW0MjXSBGaXggIzczMyByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuOS4KICAgICAgICAgICAgTWlzc2luZyB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlIGluIEMjIGxheWVyIHdoZW4gdXNpbmcgJWltcG9ydC4KCjIwMTctMDEtMTY6IGZzY2hsaW1iCiAgICAgICAgICAgIEZpeCAjODEzIHRlbXBsYXRlIHN5bWJvbCBuYW1lIGxvb2t1cCBidWcgd2hlbiB0eXBlZGVmIG5hbWVzIGFyZSB0aGUgc2FtZSBidXQgaW4gZGlmZmVyZW50CiAgICAgICAgICAgIG5hbWVzcGFjZXMuCgoyMDE3LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgRCBKYXZhXQogICAgICAgICAgICBUaGUgU1dJRyBsaWJyYXJ5IG5vIGxvbmdlciB1c2VzIHRoZSBqYXZhdHlwZSwgZHR5cGUgb3IgY3N0eXBlIHR5cGVtYXBzLCB0aGVyZWJ5CiAgICAgICAgICAgIGNvbXBsZXRlbHkgZnJlZWluZyB0aGVtIHVwIGZvciB1c2VycyB0byB1c2Ugd2l0aG91dCBoYXZpbmcgdG8gcmVwbGljYXRlIHRoZSBsaWJyYXJ5CiAgICAgICAgICAgIGNvZGUgdGhhdCB0aGV5IHByZXZpb3VzbHkgYWRkZWQuIFRoZSBjb2RlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGJ5IHRoZXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBuZXcgJXByb3h5Y29kZSBkaXJlY3RpdmUuIFRoZWlyIHVzZSBpbiB0aGUgbGlicmFyeSBjb2RlCiAgICAgICAgICAgIHdhcyBmYWlybHkgbWluaW1hbDoKCiAgICAgICAgICAgICAgQyMgICBjc3R5cGU6ICAgc3RkX2FycmF5Lmkgc3RkX21hcC5pIHN0ZF92ZWN0b3IuaQogICAgICAgICAgICAgIEQgICAgZHR5cGU6ICAgIHN0ZF92ZWN0b3IuaQogICAgICAgICAgICAgIEphdmEgamF2YXR5cGU6IGFycmF5c19qYXZhLmkKCjIwMTctMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSAlZXh0ZW5kIGRpcmVjdGl2ZSBjYW4gbm93IG9wdGlvbmFsbHkgc3VwcG9ydCBvbmUgb2YgdGhlICdjbGFzcycsICdzdHJ1Y3QnIG9yICd1bmlvbicKICAgICAgICAgICAga2V5d29yZHMgYmVmb3JlIHRoZSBpZGVudGlmaWVyIG5hbWUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7IC4uLiB9OwogICAgICAgICAgICAgICVleHRlbmQgc3RydWN0IFggeyAuLi4gfQoKICAgICAgICAgICAgUHJldmlvdXNseSB0aGlzIGhhZCB0byBzcGVjaWZpZWQgYXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHsgLi4uIH07CiAgICAgICAgICAgICAgJWV4dGVuZCBYIHsgLi4uIH0KCjIwMTctMDEtMTM6IHdzZnVsdG9uCgkgICAgW0MjIEQgSmF2YV0gQWRkIG5ldyAlcHJveHljb2RlIGRpcmVjdGl2ZSB3aGljaCBpcyBhIG1hY3JvIGZvciAlaW5zZXJ0KCJwcm94eWNvZGUiKS4KICAgICAgICAgICAgVGhpcyBpcyBhIHdheSBvZiBhZGRpbmcgcHVyZSBDIy9EL0phdmEgY29kZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBwcm94eSBjbGFzcywgZWc6CgogICAgICAgICAgICAgICVleHRlbmQgUHJveHkyIHsKICAgICAgICAgICAgICAlcHJveHljb2RlICV7CiAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHByb3h5Y29kZTIoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGkrMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIHN0cnVjdCBQcm94eTIge307CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZXJlIHdpbGwgdGhlbiBiZSBhIHB1cmUgSmF2YS9DIy9EIG1ldGhvZCBjYWxsZWQgcHJveHljb2RlMiBpbiB0aGUgUHJveHkyIGNsYXNzLgoKMjAxNi0xMi0zMTogYWpyaGVhZGluZzEKCSAgICBJc3N1ZSAjODYwIC0gUmVtb3ZlIHVzZSBvZiBzdGQ6OnVuYXJ5X2Z1bmN0aW9uIGFuZCBzdGQ6OmJpbmFyeV9mdW5jdGlvbgogICAgICAgICAgICB3aGljaCBpcyBkZXByZWNhdGVkIGluIEMrKzExLgoKMjAxNi0xMi0zMDogb2xseQoJICAgIFtQSFA3XSBSZWdpc3RlciBpbnRlcm5hbCAnc3dpZ19ydW50aW1lX2RhdGFfdHlwZV9wb2ludGVyJyBjb25zdGFudAoJICAgIGFzICJDT05TVF9QRVJTSVNURU5UIiB0byBhdm9pZCBzZWdtZW50YXRpb24gZmF1bHQgb24gbW9kdWxlIHVubG9hZC4KCSAgICBGaXhlcyAjODU5IHJlcG9ydGVkIGJ5IFRpbW90aGV1cyBQb2tvcnJhLiBUaGFua3MgYWxzbyB0byBKYXZpZXIgVG9ycmVzCgkgICAgZm9yIGEgbWluaW1hbCByZXByb2R1Y2VyLgoKVmVyc2lvbiAzLjAuMTEgKDI5IERlYyAyMDE2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE2LTEyLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCAlZmVhdHVyZSgiY3NkaXJlY3RvcmRlbGVnYXRlbW9kaWZpZXJzIikgdG8gZW5hYmxlIGN1c3RvbWl6YXRpb24KICAgICAgICAgICAgb2YgdGhlIGRlbGVnYXRlIGFjY2VzcyBtb2RpZmllcnMgZ2VuZXJhdGVkIGluIGRpcmVjdG9yIGNsYXNzZXMuCiAgICAgICAgICAgIEZpeGVzIGlzc3VlICM3NDguCgoyMDE2LTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggYnVpbHRpbiAicHl0aG9uOnNsb3QiIGZlYXR1cmUgZmFpbGluZyBmb3IgdHBfaGFzaCB3aGVuIHVzaW5nCiAgICAgICAgICAgIGhhc2hmdW5jIGNsb3N1cmUgd2l0aCBhICJXcm9uZyB0eXBlIGZvciBoYXNoIGZ1bmN0aW9uIiBmb3IgUHl0aG9uIDIuCiAgICAgICAgICAgIElzc3VlICM4NDMuCgoyMDE2LTEyLTIxOiBqb2VxdWFtdAogICAgICAgICAgICBDaGFuZ2VkIGdlbmVyYXRpb24gb2YgZnVuY3Rpb25zIHNvIHRoYXQgb25seSBmdW5jdGlvbnMKICAgICAgICAgICAgdGhhdCBlbmQgaW4gX3NldCBnZW5lcmF0ZSBhY2Nlc3NvciBmdW5jdGlvbnMgcmF0aGVyIHRoYW4KCSAgICBsb29raW5nIGZvciAic2V0Ii4KCSAgICBDaGFuZ2UgZ2VuZXJhdGlvbiBvZiBvcGVyYXRvcnMgdG8gbm90IGhhdmUgdW5kZXJzY29yZXMKCSAgICB0byBzdGFydCBpbiBSLiBVc2VycyBuZWVkIHRvIHByb3ZpZGUgY3VzdG9tIG5hbWVzIGZvciB0aGVzZSBvcGVyYXRvciBvdmVybG9hZHMuCgoyMDE2LTEyLTIxOiBvbGx5CgkgICAgRml4IGlzZmluaXRlKCkgY2hlY2tzIHRvIHdvcmsgd2l0aCBhbGwgQysrMTEgY29tcGlsZXJzLgoJICAgIEZpeGVzIGlzc3VlcyAjNjE1LCAjNzg4IGFuZCAjODQ5LgoKMjAxNi0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgJW5hbWV3YXJuIHVubmVjZXNzYXJpbHkgY2F1c2VkIGtleXdvcmQgd2FybmluZ3MgZm9yIG5vbi1pbnN0YW50aWF0ZWQgdGVtcGxhdGUgY2xhc3NlcwogICAgICAgICAgICBhbmQgZHVwbGljYXRlIHdhcm5pbmdzIGZvciBpbnN0YW50aWF0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aGVuIGtleXdvcmRzIHdlcmUgdXNlZC4KICAgICAgICAgICAgSXNzdWUgIzg0NS4KCjIwMTYtMTItMTg6IGV6cmFsYW5nbG9pcyAKICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2N0YXZlXSBNZW1vcnkgbGVhayBmaXggb24gZXJyb3IgaW4gc3RkOjpwYWlyIHdyYXBwZXJzLgogICAgICAgICAgICBJc3N1ZSAjODUxLgoKMjAxNi0xMi0xODogd3NmdWx0b24KICAgICAgICAgICAgWmVybyBpbml0aWFsaXplIGFycmF5cyB3aGVuIHVzaW5nICVhcnJheV9jbGFzcyBhbmQgJWFycmF5X2Z1bmN0aW9ucy4KCjIwMTYtMTItMTg6IHQtaWtlZ2FtaQogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzQ0NgogICAgICAgICAgICBQeXRob24gJWFycmF5X2NsYXNzIG9mIGNhcnJheXMuaSBmYWlsZWQgd2l0aCAtYnVpbHRpbiBvcHRpb24uCgoyMDE2LTEyLTE2OiBicmlhbmNhaW5lCiAgICAgICAgICAgIFtHdWlsZV0gUGF0Y2ggIzc0NCBBZGRlZCBzdXBwb3J0IGZvciBHdWlsZSdzIG5hdGl2ZSBwb2ludGVyIGZ1bmN0aW9uYWxpdHkKCjIwMTYtMTItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICM3NjkuCiAgICAgICAgICAgIEFkZCBvcHRpb25hbCBtb2R1bGVpbXBvcnQgYXR0cmlidXRlIHRvICVtb2R1bGUgc28gdGhhdCB0aGUKICAgICAgICAgICAgZGVmYXVsdCBtb2R1bGUgaW1wb3J0IGNvZGUgY2FuIGJlIG92ZXJyaWRkZW4uIFNlZSB0aGUgIlNlYXJjaGluZyBmb3IgdGhlIHdyYXBwZXIgbW9kdWxlIgogICAgICAgICAgICBkb2N1bWVudGF0aW9uIGluIFB5dGhvbi5odG1sLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iaW1wb3J0IF9mb28iKSBmb28KCiAgICAgICAgICAgICRtb2R1bGUgYWxzbyBleHBhbmRzIHRvIHRoZSBsb3ctbGV2ZWwgQy9DKysgbW9kdWxlIG5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgaXMgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgYWJvdmUKCiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImltcG9ydCAkbW9kdWxlIikgZm9vCgoyMDE2LTExLTMwOiBvbGx5CgkgICAgW1BIUF0gQWRkIHN1cHBvcnQgZm9yIFBIUDcuICBQSFA1J3MgQyBleHRlbnNpb24gQVBJIGhhcyBjaGFuZ2VkCgkgICAgc3Vic3RhbnRpYWxseSBzbyB5b3UgbmVlZCB0byB1c2UgLXBocDcgdG8gc3BlY2lmeSB5b3Ugd2FudCBQSFA3CgkgICAgY29tcGF0aWJsZSB3cmFwcGVycy4gIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgZ2VuZXJhdGVkIHdyYXBwZXJzCgkgICAgaXMgbm93IC5jeHggKHRvIG1hdGNoIFNXSUcncyBkZWZhdWx0IGZvciBldmVyeSBvdGhlciBsYW5ndWFnZSAtIHRvCgkgICAgZ2VuZXJhdGUgZm9vX3dyYXAuY3BwIHlvdSBjYW4gcnVuIFNXSUcgd2l0aCAtY3BwZXh0IGNwcCkuICBGaXhlcwoJICAgIGlzc3VlICM1NzEuCgoJICAgIEFzIHBhcnQgb2YgdGhpcyBjaGFuZ2UsIHRoZSBsYW5ndWFnZSBzdWJkaXJlY3RvcnkgZm9yIFBIUDUgaGFzCgkgICAgY2hhbmdlZCBmcm9tICJwaHAiIHRvICJwaHA1IiAtIGlmIHlvdSBhcmUgbWFraW5nIHVzZSBvZiB0aGUgc2VhcmNoCgkgICAgcGF0aCBmZWF0dXJlIHdoZXJlIHRoZSBsYW5ndWFnZSBzdWJkaXJlY3Rvcnkgb2YgZWFjaCBkaXJlY3RvcnkKCSAgICBpcyBhbHNvIHNlYXJjaGVkLCB5b3UnbGwgbmVlZCB0byB1cGRhdGUgeW91ciBiaW5kaW5ncy4gIEEgc2ltcGxlCgkgICAgZml4IHdoaWNoIHdvcmtzIGZvciBvbGRlciBhbmQgbmV3ZXIgU1dJRyBpcyB0byBhZGQgYSBzeW1saW5rOgoJICAgIGxuIC1zIHBocCBwaHA1CgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNi0xMS0zMDogb2xseQoJICAgIFtQSFBdIE9ubHkgZW1pdCBvbmUgY29weSBvZiBlYWNoIGRpc3RpbmN0IGFyZ2luZm8uICBQcmV2aW91c2x5IHdlCgkgICAgZW1pdHRlZCBhIHNlcGFyYXRlIG9uZSBmb3IgZXZlcnkgd3JhcHBlZCBmdW5jdGlvbiwgYnV0IHR5cGljYWxseQoJICAgIG1hbnkgZnVuY3Rpb25zIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIGNvbWJpbmF0aW9ucwoJICAgIG9mIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBvciBub3QuCgoJICAgIFRoaXMgY2hhbmdlIHNpZ25pZmljYW50bHkgcmVkdWNlcyBib3RoIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQKCSAgICB3cmFwcGVyLCBhbmQgb2YgdGhlIGNvbXBpbGVkIFBIUCBleHRlbnNpb24gbW9kdWxlIChlLmcuIGJ5IH42JSBmb3IKCSAgICB0aGUgc3RyaXBwZWQgZXh0ZW5zaW9uIG1vZHVsZSBmb3IgWGFwaWFuJ3MgUEhQNyBiaW5kaW5ncykuCgoyMDE2LTExLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXJlbmFtZSBvdmVycmlkZSBvZiB3aWxkY2FyZCAlcmVuYW1lIGZvciB0ZW1wbGF0ZXMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKEdsb2JhbEludE9wZXJhdG9yKSAqOjpvcGVyYXRvciBib29sOyAvLyB3aWxkY2FyZCAlcmVuYW1lCgogICAgICAgICAgICAgICVyZW5hbWUoWEludE9wZXJhdG9yKSBYOjpvcGVyYXRvciBib29sOyAvLyBmaXggbm93IG92ZXJyaWRlcyBmaXJzdCAlcmVuYW1lIGFib3ZlCiAgICAgICAgICAgICAgT1IKICAgICAgICAgICAgICAlcmVuYW1lKFhJbnRPcGVyYXRvcikgWDxpbnQ+OjpvcGVyYXRvciBib29sOyAvLyBmaXggbm93IG92ZXJyaWRlcyBmaXJzdCAlcmVuYW1lIGFib3ZlCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yIGJvb2woKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFhpbnQpIFg8aW50PjsKCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyAlcmVuYW1lIG92ZXJyaWRlIG9mIGdsb2JhbCAlcmVuYW1lIGZvciB0ZW1wbGF0ZXMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAvLyBHbG9iYWwgcmVuYW1lIHRvIG1ha2UgYWxsIGZ1bmN0aW9ucyBzdGFydCB3aXRoIGEgbG93ZXIgY2FzZSBsZXR0ZXIKICAgICAgICAgICAgICAlcmVuYW1lKCIlKGZpcnN0bG93ZXJjYXNlKXMiLCAlJGlzZnVuY3Rpb24gKSAiIjsKICAgICAgICAgICAgICAlcmVuYW1lKHdvb2hvbykgVzo6V29vOyAvLyBmaXggbm93IG92ZXJyaWRlcyBhYm92ZSAlcmVuYW1lCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBXIHsKICAgICAgICAgICAgICAgIFcgV29vKCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShXaW50KSBXPGludD47CgogICAgICAgICAgICBUaGUgYWJvdmUgYWxzbyBpbnRyb2R1Y2VzIGEgcG9zc2libHkgdW5leHBlY3RlZCBjaGFuZ2UuIE1hbnkgb2YgdGhlIFNUTCBjb250YWluZXJzCiAgICAgICAgICAgIHByb3ZpZGVkIGJ5IFNXSUcgdXNlICVyZW5hbWUgdG8gcmVuYW1lIHNvbWUgbWV0aG9kcywgZWcgaW4gc3RkOjp2ZWN0b3IsIHB1c2hfYmFjawogICAgICAgICAgICBpcyByZW5hbWVkIHRvIGFkZCBpbiBKYXZhLiBQcmV2aW91c2x5IHRoaXMgaW50ZW5kZWQgcmVuYW1lIGRpZCBub3QgaGFwcGVuIHdoZW4gdXNpbmcKICAgICAgICAgICAgdXNpbmcgZ2xvYmFsICVyZW5hbWUgcnVsZXMgYW5kIHRoZSBtZXRob2Qgd291bGQgcmVtYWluIGFzIHB1c2hfYmFjaywgYnV0IGlzIG5vdwogICAgICAgICAgICByZW5hbWVkIHRvIGFkZC4gU29tZSBtb3JlIGluZm8gaW4gaXNzdWUgIzg1Ni4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTExLTI2OiBtN3Rob24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzcwOSAtIGltcHJvdmVkIHdyYXBwaW5nIG9mIGRpdmlzaW9uIG9wZXJhdG9ycwogICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbicgbm93IHdvcmtzIGluIFB5dGhvbiAyIHdoZXRoZXIgb3Igbm90IHRoZQogICAgICAgICAgICAtcHkzIGZsYWcgaXMgdXNlZC4KCjIwMTYtMTEtMTI6IGpvZXF1YW50CiAgICAgICAgICAgIFtSXSBJc3N1ZSAjNjk3IC0gZml4IGNvbW1hIGlzc3VlIHdpdGggb3ZlcmxvYWQgbWV0aG9kcwoKMjAxNi0xMS0xMjogam9lcXVhbnQKCSAgICBbUl0gSXNzdWUgIzU1NSAtIFIgcnVudGltZSBuZWVkcyBzdGRpby5oCgoyMDE2LTExLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjODE2IC0gZml4IGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gdXNpbmcgLWV4dHJhbmF0aXZlIGFuZCAtYnVpbHRpbi4KCjIwMTYtMTEtMDI6IGxpb3Jnb2xkCiAgICAgICAgICAgIFBhdGNoICM3NDEgLSBBZGQgc3VwcG9ydCBmb3IgQysrMTEgYWxpYXMgdGVtcGxhdGVzLCBzZWUgdXBkYXRlZCBDUGx1c1BsdXMxMS5odG1sCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCgoyMDE2LTEwLTMwOiBteWQ3MzQ5CiAgICAgICAgICAgIFtDI10gUGF0Y2ggIzc0MCBBZGQgc3RkX2FycmF5LmkgZm9yIEMjIGZvciB3cmFwcGluZyBzdGQ6OmFycmF5LgoKICAgICAgICAgICAgUGF0Y2ggYWxzbyBlbmhhbmNlcyBzdGQ6OnZlY3RvcjxzdGQ6OndzdHJpbmc+IEMjIHdyYXBwZXJzIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbnMKICAgICAgICAgICAgKENvbnRhaW5zLCBJbmRleE9mLCBMYXN0SW5kZXhPZiBhbmQgUmVtb3ZlKS4KCjIwMTYtMTAtMzA6IHRvYmlsYXUKICAgICAgICAgICAgW0phdmFdIEZpeCB3cmFwcGVycyBmb3Igd3N0cmluZyBwYXJhbWV0ZXJzIGluIGRpcmVjdG9yIG1ldGhvZHMgdG8gY2xlYW51cCBsb2NhbAogICAgICAgICAgICByZWYgYWZ0ZXIgZGlyZWN0b3IgY2FsbGJhY2sgaGFzIGZpbmlzaGVkLgoKMjAxNi0xMC0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgbWlzc2luZyBjc2RpcmVjdG9yaW4gVk9JRF9JTlRfUFRSIGFuZCBjc2RpcmVjdG9yb3V0IFZPSURfSU5UX1BUUiB0eXBlbWFwcy4KCjIwMTYtMTAtMjM6IGppdWxvbmd3CiAgICAgICAgICAgIFBhdGNoICM3ODEgLSBGaXggd3JhcHBpbmcgb2YgQyBjb21wb3VuZCBleHByZXNzaW9ucyBjb250YWluaW5nIGNoYXIgY29uc3RhbnRzCiAgICAgICAgICAgIGluIHF1b3RlcyBzdWNoIGFzOgoKICAgICAgICAgICAgICAjZGVmaW5lIEhfU1VQUFJFU1NfU0NBTElOR19NQUdJQyAoKCdzJzw8MjQpIHwgKCd1Jzw8MTYpIHwgKCdwJzw8OCkgfCAncCcpCgogICAgICAgICAgICAgIGVudW0gRGlmZmVyZW50VHlwZXMgewogICAgICAgICAgICAgICAgdHlwZWNoYXJjb21wb3VuZD0nQScrMSwKICAgICAgICAgICAgICAgIHR5cGVjaGFyY29tcG91bmQyPSdCJyA8PCAyCiAgICAgICAgICAgICAgfTsKCjIwMTYtMTAtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICM4MDggLSBmaXggUHl0aG9uIHBpY2tsaW5nIGFuZCBtZXRhY2xhc3MgZm9yIGJ1aWx0aW4gd3JhcHBlcnMuCgogICAgICAgICAgICBUaGUgbWV0YWNsYXNzIChTd2lnUHlPYmplY3RUeXBlKSBmb3IgU1dJRyBvYmplY3RzIHdhcyBub3QgZGVmaW5lZCBpbgogICAgICAgICAgICBhIHdheSB0aGF0IGxldCBpbXBvcnRsaWIgc3VjY2Vzc2Z1bGx5IGltcG9ydCB0aGUgUHl0aG9uIHdyYXBwZXJzLgogICAgICAgICAgICBUaGUgcGlja2xlIG1vZHVsZSBwcmV2aW91c2x5IGZhaWxlZCB0byBwaWNrbGUgb2JqZWN0cyBiZWNhdXNlIGl0IGNvdWxkbid0CiAgICAgICAgICAgIGRldGVybWluZSB3aGF0IG1vZHVsZSB0aGUgU1dJRyB3cmFwcGVkIG9iamVjdHMgd2VyZSBpbi4KCjIwMTYtMDktMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtBbGxlZ3JvY2wsIENGRkksIEdPLCBKYXZhc2NyaXB0LCBPY2FtbCwgUiwgU2NpbGFiXQogICAgICAgICAgICBBZGQgbWlzc2luZyBzdXBwb3J0IGZvciB0aGUgInJldCIgdHlwZW1hcCBpbiBhIGZldyB0YXJnZXQgbGFuZ3VhZ2VzLgogICAgICAgICAgICBUaGUgZG9jdW1lbnRhdGlvbiBhbHNvIG5vdyBoYXMgaW5mbyBvbiB0aGUgInJldCIgdHlwZW1hcC4KCjIwMTYtMDktMjc6IGFobWVkLXVzbWFuCiAgICAgICAgICAgIFt4bWxdIEhhbmRsZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGNvcnJlY3RseS4KCjIwMTYtMDktMjc6IGRvbnRwYW5pYzkyCiAgICAgICAgICAgIFtHb10gRml4IGFyZ3VtZW50IG5hbWVzIGluIGluaGVyaXRlZCBmdW5jdGlvbnMgdGFraW5nIG1vcmUgdGhhbiA4CiAgICAgICAgICAgIHBhcmFtZXRlcnMuICBGaXhlcyAjNzk1LgoKMjAxNi0wOS0yNjogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSBtbGlzdHMgdGhhdCBtYXAgcG9pbnRlcnMgY2FuIGJlIGdpdmVuIGEgY3VzdG9tIHR5cGUgbmFtZS4KCjIwMTYtMDktMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM3OTMgZnJvbSBxLXAgdG8gZXhwYW5kIGV4Y2VwdGlvbiBoYW5kbGluZyB0byBpbmNsdWRlIHN0ZDo6YmFkX2Nhc3QKICAgICAgICAgICAgaW4gc3RkX2V4Y2VwdC5pLgoKMjAxNi0wOS0yNDogb2xseQogICAgICAgICAgICBbUEhQXSBGaXggY29kZSBnZW5lcmF0ZWQgZm9yIGZlYXR1cmUoImRpcmVjdG9yOmV4Y2VwdCIpIC0KICAgICAgICAgICAgcHJldmlvdXNseSB0aGUgcmV0dXJuIHZhbHVlIG9mIGNhbGxfdXNlcl9mdW5jdGlvbigpIHdhcyBpZ25vcmVkIGFuZAogICAgICAgICAgICB3ZSBjaGVja2VkIGFuIHVuaW5pdGlhbGlzZWQgdmFsdWUgaW5zdGVhZC4gIEZpeGVzICM2MjcuICBCYXNlZCBvbgogICAgICAgICAgICBwYXRjaCBmcm9tIFNlcmdleSBTZXJvc2h0YW4uCgoyMDE2LTA5LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBNb3JlIGZsZXhpYmxlIHB5dGhvbiBidWlsdGluIHNsb3RzIGZvciBvdmVybG9hZGVkIEMrKyBmdW5jdGlvbi4KCiAgICAgICAgICAgIFRoZSBjbG9zdXJlIG5hbWVzIHVzZWQgZm9yIGJ1aWx0aW4gc2xvdHMgYXJlIG1hbmdsZWQgd2l0aCB0aGVpciBmdW5jdHlwZSBzbwogICAgICAgICAgICB0aGF0IG92ZXJsb2FkZWQgQysrIG1ldGhvZCBuYW1lcyBjYW4gYmUgdXNlZCBmb3IgbXVsdGlwbGUgc2xvdHMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOnNsb3QiLCAibXBfc3Vic2NyaXB0IiwgZnVuY3R5cGU9ImJpbmFyeWZ1bmMiKSBTaW1wbGVBcnJheTo6X19nZXRpdGVtX187CiAgICAgICAgICAgICAgJWZlYXR1cmUoInB5dGhvbjpzbG90IiwgInNxX2l0ZW0iLCBmdW5jdHlwZT0ic3NpemVhcmdmdW5jIikgU2ltcGxlQXJyYXk6Ol9fZ2V0aXRlbV9fKFB5X3NzaXplX3Qgbik7CgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGNsb3N1cmVzOgoKICAgICAgICAgICAgICBTV0lHUFlfU1NJWkVBUkdGVU5DX0NMT1NVUkUoX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX18pIC8qIGRlZmluZXMgX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX19fc3NpemVhcmdmdW5jX2Nsb3N1cmUgKi8KICAgICAgICAgICAgICBTV0lHUFlfQklOQVJZRlVOQ19DTE9TVVJFKF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fKSAvKiBkZWZpbmVzIF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fX2JpbmFyeWZ1bmNfY2xvc3VyZSAqLwoKICAgICAgICAgICAgUHJldmlvdXNseSBvbmx5IG9uZSBuYW1lIHdhcyBkZWZpbmVkOiBfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fX19jbG9zdXJlLgogICAgICAgICAgICBIZW5jZSB0aGUgb3ZlcmxvYWRlZCBfX2dldGl0ZW1fXyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc3VwcG9ydCBib3RoIG1wX3N1YnNjcmlwdCBhbmQgc3FfaXRlbSBzbG90cy4KCjIwMTYtMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBpdGVyYXRvcnMgZm9yIGNvbnRhaW5lcnMgb2YgTlVMTCBwb2ludGVycyAob3IgUHl0aG9uIE5vbmUpIHdoZW4gdXNpbmcKICAgICAgICAgICAgLWJ1aWx0aW4uIFByZXZpb3VzbHkgaXRlcmF0aW9uIHdvdWxkIHN0b3AgYXQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCB3YXMgTlVMTC4KCjIwMTYtMDktMTY6IG9sbHkKICAgICAgICAgICAgW0phdmFzY3JpcHRdIEZpeCBTV0lHX2V4Y2VwdGlvbigpIG1hY3JvIHRvIHJldHVybiBmcm9tIHRoZSBjdXJyZW50CiAgICAgICAgICAgIGZ1bmN0aW9uLiAgRml4ZXMgIzc4OSwgcmVwb3J0ZWQgYnkgSnVsaWVuIER1dHJpYXV4LgoKMjAxNi0wOS0xNjogb2xseQogICAgICAgICAgICBbUEhQXSBGaXggU1dJR19leGNlcHRpb24oKSBtYWNybyB0byByZXR1cm4gZnJvbSB0aGUgY3VycmVudCBmdW5jdGlvbi4KICAgICAgICAgICAgRml4ZXMgIzI0MCwgcmVwb3J0ZWQgYnkgU2VyZ2V5IFNlcm9zaHRhbi4KCjIwMTYtMDktMTI6IHh5cHJvbgogICAgICAgICAgICBbQyNdIFBhdGNoICM3ODYgS2V5d29yZCByZW5hbWUgdG8gYmUgQ0xTIGNvbXBsaWFudCBieSBhZGRpbmcgYW4gdW5kZXJzY29yZQogICAgICAgICAgICBzdWZmaXggaW5zdGVhZCBvZiBhbiB1bmRlcnNjb3JlIHByZWZpeCB0byB0aGUgQyBzeW1ib2wgbmFtZS4gUGxlYXNlIHVzZSBhbiBleHBsaWNpdAogICAgICAgICAgICAlcmVuYW1lIHRvIHJlbmFtZSB0aGUgc3ltYm9sIHdpdGggYSBfIHByZWZpeCBpZiB5b3Ugd2FudCB0aGUgb2xkIHN5bWJvbCBuYW1lLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTA5LTA5OiBvbGx5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBpbXBvcnQgaGFuZGxpbmcgZm9yIFB5dGhvbiAyLjYgdG8gd29yayBpbiBhIGZyb3plbgogICAgICAgICAgICBhcHBsaWNhdGlvbi4gIEZpeGVzICMxNDUsIHJlcG9ydGVkIGJ5IFRob21hcyBLbHV5dmVyLgoKMjAxNi0wOS0wMjogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSBQb2ludGVycyBhcmUgbWFwcGVkIHRvIG1saXN0IGluc3RlYWQgb2YgdGxpc3QKICAgICAgICAgICAgKG1saXN0IGJldHRlciBmb3Igc2NpbGFiIG92ZXJsb2FkaW5nKQoKMjAxNi0wOS0wMjogb2xseQogICAgICAgICAgICBbUEhQXSBGaXggIm91dCIgdHlwZW1hcCBmb3IgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCAiaW4iCiAgICAgICAgICAgIHR5cGVtYXAgZm9yIGNoYXIgSU5QVVRbQU5ZXS4KCjIwMTYtMDktMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1vcmUgZWZmaWNpZW50IFB5dGhvbiBzbGljaW5nLgogICAgICAgICAgICBDYWxsIHJlc2VydmUgZm9yIGNvbnRhaW5lciB0eXBlcyB0aGF0IHN1cHBvcnQgaXQgdG8gYXZvaWQgcmVwZWF0ZWQKICAgICAgICAgICAgbWVtb3J5IHJlYWxsb2NhdGlvbnMgZm9yIG5ldyBzbGljZXMgb3Igc2xpY2VzIHRoYXQgZ3JvdyBpbiBzaXplLgoKMjAxNi0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzc3MSAtIE1ha2UgYnVpbHRpbiB0eXBlcyBoYXNoYWJsZSBieSBkZWZhdWx0LgogICAgICAgICAgICBEZWZhdWx0IGhhc2ggaXMgdGhlIHVuZGVybHlpbmcgQy9DKysgcG9pbnRlci4gVGhpcyBtYXRjaGVzIHVwIHdpdGggdGVzdGluZyBmb3IKICAgICAgICAgICAgZXF1aXZhbGVuY2UgKFB5X0VRIGluIFN3aWdQeU9iamVjdF9yaWNoY29tcGFyZSkgd2hpY2ggY29tcGFyZXMgdGhlIHBvaW50ZXJzLgoKMjAxNi0wOC0yMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gVGhlIGZvbGxvd2luZyBidWlsdGluIHNsb3RzIGNhbiBiZSBjdXN0b21pemVkIGxpa2Ugb3RoZXIgc2xvdHMgdmlhIHRoZQogICAgICAgICAgICAicHl0aG9uOjx4PiIgYW5kICJweXRob246c2xvdCIgZmVhdHVyZXMgd2hlcmUgPHg+IGlzIHRoZSBhcHByb3ByaWF0ZSBzbG90IG5hbWU6CiAgICAgICAgICAgICAgdHBfYWxsb2NzCiAgICAgICAgICAgICAgdHBfYmFzZXMKICAgICAgICAgICAgICB0cF9iYXNpY3NpemUKICAgICAgICAgICAgICB0cF9jYWNoZQogICAgICAgICAgICAgIHRwX2RlbAogICAgICAgICAgICAgIHRwX2RlYWxsb2MKICAgICAgICAgICAgICB0cF9mbGFncwogICAgICAgICAgICAgIHRwX2ZyZWVzCiAgICAgICAgICAgICAgdHBfZ2V0c2V0CiAgICAgICAgICAgICAgdHBfaXNfZ2MKICAgICAgICAgICAgICB0cF9tYXhhbGxvYwogICAgICAgICAgICAgIHRwX21ldGhvZHMKICAgICAgICAgICAgICB0cF9tcm8KICAgICAgICAgICAgICB0cF9uZXcKICAgICAgICAgICAgICB0cF9uZXh0CiAgICAgICAgICAgICAgdHBfcHJldgogICAgICAgICAgICAgIHRwX3JpY2hjb21wYXJlCiAgICAgICAgICAgICAgdHBfc3ViY2xhc3NlcwogICAgICAgICAgICAgIHRwX3dlYWtsaXN0CiAgICAgICAgICAgICAgd2FzX3NxX2Fzc19zbGljZQogICAgICAgICAgICAgIHdhc19zcV9zbGljZQoKICAgICAgICAgICAgQSBmZXcgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgZm9yIHNsb3QgY3VzdG9taXphdGlvbi4KCjIwMTYtMDgtMDk6IGpvZXF1YW50CiAgICAgICAgICAgIFtSXSBQYXRjaCAjNzY1IEZpeCBleHRlcm4gIkMiIGhlYWRlciBpbmNsdWRlcyBmb3IgQysrIGNvZGUuCgoyMDE2LTA4LTA1OiBvbGx5CiAgICAgICAgICAgIFt4bWxdIEZpeCBob3cgdGhlIG91dHB1dCBmaWxlbmFtZSBpcyBidWlsdCB0byBhdm9pZCBwcm9ibGVtcyB3aGVuCiAgICAgICAgICAgIGl0IGNvbnRhaW5zIHRoZSBlbWJlZGRlZCBzdHJpbmdzICIuYyIsICIuY3BwIiBvciAiLmN4eCIuCiAgICAgICAgICAgIEZpeGVzICM1NDAgcmVwb3J0ZWQgYnkgZGphY2s0Mi4KCjIwMTYtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjb3JuZXIgY2FzZSBvZiB3cmFwcGluZyBzdGQ6OnZlY3RvciBvZiBUIHBvaW50ZXJzIHdoZXJlIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgb2YgVAogICAgICAgICAgICBhbHNvIGV4aXN0cyBpbiB0aGUgd3JhcHBlZCBjb2RlLiBTRiBCdWcgMjM1OTQxNyAoOTY3KS4KCjIwMTYtMDYtMjY6IHdrYWxpbmluCiAgICAgICAgICAgIFtKYXZhLCBDI10gUGF0Y2ggIzY4MSBGaXggc2VnIGZhdWx0IHdoZW4gaWdub3JpbmcgbmVzdGVkIGNsYXNzZXMuCgoyMDE2LTA2LTI1OiBtcm9tYmVyZwogICAgICAgICAgICBbUHl0aG9uXSAjNzExIEZpeCAtY2FzdG1vZGUgYW5kIGNvbnZlcnNpb24gb2Ygc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGVzLgogICAgICAgICAgICBTZWUgMjAxNS0xMi0yMyBDSEFOR0VTIGVudHJ5IGZvciBkZXRhaWxzIG9mIHRoZXNlIGltcHJvdmVtZW50cyB3aGVuIHRoZXkgd2VyZQogICAgICAgICAgICBpbXBsZW1lbnRlZCBmb3IgdGhlIGRlZmF1bHQgb3B0aW9ucyAoaWUgbm90IHVzaW5nIC1jYXN0bW9kZSkuCgoyMDE2LTA2LTI1OiBhaG5vbGRzCiAgICAgICAgICAgIFBhdGNoICM3MzAgLSBGaXggJWltcGxpY2l0Y29udiBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2hlbiB1c2luZwogICAgICAgICAgICAtY2FzdG1vZGUgb3IgLWZhc3RkaXNwYXRjaCBvcHRpb25zLgoKICAgICAgICAgICAgVGhlIHJlc3VsdCBpcyB0aGF0IGluIGFsbCBvdmVybG9hZCBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGUgcG9zc2liaWxpdGllcwogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMsIHRoZSBkaXNwYXRjaCBmdW5jdGlvbiB3aWxsIGZpcnN0IGNoZWNrIGZvcgogICAgICAgICAgICBleGFjdCAoYWthIG5vbiBpbXBsaWNpdCkgbWF0Y2hlcywgYW5kIHRoZW4gc3Vic2VxdWVudGx5IGNoZWNrIGZvciBpbXBsaWNpdAogICAgICAgICAgICBjYXN0aW5nIG1hdGNoZXMuIFRoaXMgd2FzIGFscmVhZHkgaGFwcGVuaW5nIGluIHRoZSBub3JtYWwgZGlzcGF0Y2ggc2l0dWF0aW9uLAogICAgICAgICAgICBhbmQgaW4gdGhlIC1mYXN0ZGlzcGF0Y2ggY2FzZSB0d28gcGFzc2VzIHRocm91Z2ggdGhlIGNhbmRpZGF0ZXMgd2VyZSBoYXBwZW5pbmcsCiAgICAgICAgICAgIGp1c3Qgd2l0aCBTV0lHX1BPSU5URVJfSU1QTElDSVRfQ09OViBhbHdheXMgc2V0LiBBZnRlciB0aGlzIHBhdGNoLCBpdCBpcyBub3Qgc2V0CiAgICAgICAgICAgIG9uIHRoZSBmaXJzdCBwYXNzLCBhbmQgdGhlbiBzZXQgb24gdGhlIHNlY29uZCBwYXNzLgoKMjAxNi0wNi0yNTogbGlvcmdvbGQKICAgICAgICAgICAgUGF0Y2ggIzcyNyAtIEFkZCBzdXBwb3J0IGZvciBDKysxMSB0eXBlIGFsaWFzaW5nLgoKVmVyc2lvbiAzLjAuMTAgKDEyIEp1biAyMDE2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE2LTA2LTA2OiBtcm9tYmVyZwogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjNjk4LiBBZGQgc3VwcG9ydCBmb3IgLXJlbGF0aXZlaW1wb3J0IGZvciBweXRob24gMi43LCBzbyAtcHkzIGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBhbHNvIHJlcXVpcmVkIGZvciByZWxhdGl2ZSBpbXBvcnQgc3VwcG9ydC4KCjIwMTYtMDYtMDU6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2OTQgLSBGaXggcGFja2FnZSBpbXBvcnQgcmVncmVzc2lvbnMgaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgoKICAgICAgICAgICAgMSkgVGhlIGNvZGUgaW4gMy4wLjkgZGlkIG5vdCBmYWxsIGJhY2sgdG8gJ2ltcG9ydCBfZm9vJyBpZiAnaW1wb3J0IGJhci5fZm9vJyBmYWlsZWQKICAgICAgICAgICAgKGFzc3VtaW5nIGJhci5mb28gd2FzIHRoZSBtYWluIG1vZHVsZSkuIEV2ZXJ5IHBsYWNlIF9mb28gaXMgaW1wb3J0ZWQgbm93IGZpcnN0IHRyaWVzCiAgICAgICAgICAgIGl0IGZyb20gdGhlIHBhY2thZ2Ugd2hlcmUgZm9vIHdhcyBmb3VuZCBhbmQgaWYgdGhhdCBmYWlscyB0cmllcyBfZm9vIGFzIGEgZ2xvYmFsIG1vZHVsZS4KCiAgICAgICAgICAgIDIpIFRoZSBzZXBhcmF0ZSBibG9jayBvZiBQeXRob24gY29kZSB0aGF0IGluamVjdGVkIGNvZGUgdG8gcHVsbCBpbiB0aGUgYXR0cmlidXRlcwogICAgICAgICAgICBmcm9tIF9mb28gd2hlbiAtYnVpbHRpbiBpcyB1c2VkIG1hZGUgdXNlIG9mIHRoZSAtcHkzIHN3aXRjaCB0byBlaXRoZXIgZG8KICAgICAgICAgICAgJ2Zyb20gLl9mb28gaW1wb3J0IConIG9yICJmcm9tIF9mb28gaW1wb3J0ICoiLiBUaGlzIGJsb2NrIG9mIGNvZGUgbm8gbG9uZ2VyIGRvZXMgdGhpcwogICAgICAgICAgICBhbmQgaW5zdGVhZCBjaGVja3MgdGhlIFB5dGhvbiB2ZXJzaW9uIGF0IHJ1bnRpbWUgdG8gc3dpdGNoIGJldHdlZW4gdGhlIHR3byBzeW50YXhlcy4KCiAgICAgICAgICAgIEluIHN1bW1hcnksIHN3aWctMy4wLjEwIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVhc2UgdGhlIGNyZWF0aW9uIG9mIHdyYXBwZXIgbW9kdWxlcwogICAgICAgICAgICB0aGF0IGNhbiBiZSBmdWxseSBtYWRlIHBhcnQgb2YgYSBQeXRob24gcGFja2FnZS4gIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgIGFzc3VtZXMgdGhlIGR5bmFtaWNhbGx5IGxpbmtlZCBDIG1vZHVsZSBpcyBhIGdsb2JhbCBtb2R1bGUuCiAgICAgICAgICAgIFRoZSBkeW5hbWljIG1vZHVsZSBjYW4gbm93IGJlIHBsYWNlZCBpbnRvIGVpdGhlciB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSBwdXJlIFB5dGhvbgogICAgICAgICAgICBtb2R1bGUgb3IgYXMgYSBnbG9iYWwgbW9kdWxlLiAgQm90aCBsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIFB5dGhvbiB3cmFwcGVyIHRvCiAgICAgICAgICAgIGxvY2F0ZSB0aGUgQyBtb2R1bGUuCgogICAgICAgICAgICBIb3dldmVyLCB0aGlzIGNvdWxkIGNhdXNlIGEgYmFja3dhcmRzIGluY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgY29kZQogICAgICAgICAgICB0aGF0IHdhcyByZWx5aW5nIG9uIHRoZSBhYmlsaXR5IG9mICJmcm9tIHBhY2thZ2UgaW1wb3J0IF9tb2R1bGUiIHRvCiAgICAgICAgICAgIHB1bGwgYXR0cmlidXRlcyBvdXQgb2YgdGhlIHBhY2thZ2UgZGlyZWN0bHkuICBJZiB5b3VyIGNvZGUgcG9wdWxhdGVzIGEKICAgICAgICAgICAgbW9kdWxlICh3aGljaCBpcyBhbHNvIGEgcGFja2FnZSkgd2l0aCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFNXSUcKICAgICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMgd2hpY2ggd2VyZSBub3QgbG9hZGVkIGluIGEgY29udmVudGlvbmFsIHdheSwKICAgICAgICAgICAgc3dpZy0zLjAuOCBhbmQgZWFybGllciBtYXkgaGF2ZSB3b3JrZWQgZHVlIHRvICdmcm9tIHBhY2thZ2UgaW1wb3J0CiAgICAgICAgICAgIF9tb2R1bGUnIGJ5cGFzc2luZyBhIHJlYWwgaW1wb3J0IGFuZCBwdWxsaW5nIHlvdXIgbW9kdWxlIGluIGFzIGFuCiAgICAgICAgICAgIGF0dHJpYnV0ZS4gVGhpcyB3aWxsIG5vIGxvbmdlciB3b3JrLiAgU2luY2UgdGhpcyBpcyBub3QgYSBjb21tb24gKG9yCiAgICAgICAgICAgIGV2ZW4gcmVjb21tZW5kZWQpIHByYWN0aWNlLCBtb3N0IGZvbGsgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNi0wNS0zMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM2OTAgLSBTbWFydCBwb2ludGVyIHRvICVpZ25vcmVkIGNsYXNzIGRvZXNuJ3QgZXhwb3NlIGluaGVyaXRlZCBtZXRob2RzLgogICAgICAgICAgICBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuOS4KClZlcnNpb24gMy4wLjkgKDI5IE1heSAyMDE2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMDUtMjQ6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2MTIgLSBBZGQgc3VwcG9ydCBmb3IgUHl0aG9uJ3MgaW1wbGljaXQgbmFtZXNwYWNlIHBhY2thZ2VzLgoKMjAxNi0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjNjAyIC0gRXJyb3IgaGFuZGxpbmcgcmVncmVzc2lvbiBvZiBvcGFxdWUgcG9pbnRlcnMgaW50cm9kdWNlZAogICAgICAgICAgICBpbiBzd2lnLTMuMC44IHdoZW4gQyBmdW5jdGlvbnMgZXhwbGljaXRseSByZXNldCBhIHBvaW50ZXIgdXNpbmcgJ0RBVEFfUFRSKHNlbGYpID0gMCcuCiAgICAgICAgICAgIEFuIE9iamVjdFByZXZpb3VzbHlEZWxldGVkIGVycm9yIHdhcyBpbmNvcnJlY3RseSB0aHJvd24gd2hlbiB0aGUgcG9pbnRlciB3YXMgdXNlZAogICAgICAgICAgICBhcyBhIHBhcmFtZXRlci4KCjIwMTYtMDUtMTc6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gUGF0Y2ggIzY1MSAtIENvcnJlY3Qgb3ZlcmxvYWRlZCBmdW5jdGlvbiBlcnJvciBtZXNzYWdlIHdoZW4gZnVuY3Rpb24gaXMKICAgICAgICAgICAgdXNpbmcgJW5ld29iamVjdC4KCjIwMTYtMDUtMTc6IGF1cmVsagogICAgICAgICAgICBbUnVieV0gUGF0Y2ggIzU4MiAtIGFkZCBzdXBwb3J0IGZvciBkb2NzdHJpbmcgb3B0aW9uIGluICVtb2R1bGUoKQoKMjAxNi0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0MzQgLSBQYXNzaW5nIGNsYXNzZXMgYnkgdmFsdWUgYXMgcGFyYW1ldGVycyBpbiBkaXJlY3RvciBtZXRob2RzIGRpZCBub3QgY3JlYXRlCiAgICAgICAgICAgIGEgY29weSBvZiB0aGUgYXJndW1lbnQgbGVhZGluZyB0byBpbnZhbGlkIG1lbW9yeSBhY2Nlc3NlcyBpZiB0aGUgb2JqZWN0IHdhcyB1c2VkCiAgICAgICAgICAgIGFmdGVyIHRoZSB1cGNhbGwgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBQYXNzaW5nIGFyZ3VtZW50cyBieSB2YWx1ZSBzaG91bGRuJ3QgZ2l2ZQogICAgICAgICAgICByaXNlIHRvIHRoZXNlIHNvcnRzIG9mIG1lbW9yeSBwcm9ibGVtcyBhbmQgc28gdGhlIG9iamVjdHMgYXJlIG5vdyBjb3BpZWQgYW5kIG93bmVyc2hpcAogICAgICAgICAgICBvZiB0aGVpciBsaWZldGltZSBpcyBjb250cm9sbGVkIGJ5IHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgoyMDE2LTA1LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzYxMS4gRml4IGFzc2VydGlvbiBoYW5kbGluZyBkZWZhdWx0YXJncyB3aGVuIHVzaW5nICVleHRlbmQgZm9yIGEgdGVtcGxhdGUKICAgICAgICAgICAgY2xhc3MgYW5kIHRoZSBleHRlbmRlZCBtZXRob2RzIGNvbnRhaW4gZGVmYXVsdCBhcmd1bWVudHMuCgoyMDE2LTA1LTA1OiBlanVsaWFuCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2MTcuIEZpeCBvcGVyYXRvci8gd3JhcHBlcnMuCgoyMDE2LTA1LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzY2OS4gRG9uJ3QgaXNzdWUgd2FybmluZyBhYm91dCBpZ25vcmluZyBiYXNlIGNsYXNzZXMgd2hlbiB0aGUgZGVyaXZlZCBjbGFzcyBpcwogICAgICAgICAgICBpdHNlbGYgaWdub3JlZC4KCjIwMTYtMDQtMTg6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBGaXggdXNlIG9mIGdvb3V0IHR5cGVtYXAgd2hlbiBjYWxsaW5nIGJhc2UgbWV0aG9kIGJ5CgkgICAgZm9yY2luZyB0aGUgInR5cGUiIGF0dHJpYnV0ZSB0byB0aGUgdmFsdWUgd2UgbmVlZC4KCjIwMTYtMDQtMTc6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBGaXhlcyBmb3IgR28gMS42OiBhdm9pZCByZXR1cm5pbmcgR28gcG9pbnRlcnMgZnJvbQoJICAgIGRpcmVjdG9ycyB0aGF0IHJldHVybiBzdHJpbmcgdmFsdWVzOyBhZGQgYSB0cmFpbGluZyAwIGJ5dGUKCSAgICB3aGVuIHRyZWF0aW5nIEdvIHN0cmluZyBhcyBDIGNoYXIqLgoKMjAxNi0wNC0wNjogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSAjNTUyIE1ha2UgU2NpbGFiIHJ1bnRpbWUga2VlcCB0cmFjayBvZiBwb2ludGVyIHR5cGVzCiAgICAgICAgICAgIEluc3RlYWQgb2YgYSBTY2lsYWIgcG9pbnRlciB3aGljaCBoYXMgbm8gdHlwZSwgU1dJRyBTY2lsYWIgbWFwcyBhCiAgICAgICAgICAgIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgdGxpc3QgY29udGFpbmluZyB0aGUgcG9pbnRlciBhZHJlc3MgYW5kIGl0cyB0eXBlLgoKMjAxNi0wNC0wMjogYWhub2xkcwogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSAjNTk4LiBGaXggbWlzbGVhZGluZyBlcnJvciBtZXNzYWdlIHdoZW4gYXR0ZW1wdGluZyB0byByZWFkIGEgbm9uLWV4aXN0ZW50CiAgICAgICAgICAgIGF0dHJpYnV0ZS4gVGhlIHByZXZpb3VzIGNyeXB0aWMgZXJyb3IgbWVzc2FnZToKICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvcjogdHlwZSBvYmplY3QgJ29iamVjdCcgaGFzIG5vIGF0dHJpYnV0ZSAnX19nZXRhdHRyX18nCiAgICAgICAgICAgIGlzIG5vdyByZXBsYWNlZCB3aXRoIG9uZSBtZW50aW9uaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZSwgZWc6CiAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3I6ICdGb28nIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdiYXInCgoyMDE2LTA0LTAyOiBkZXJrdWNpCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2MTAgdG8gZml4ICM2MDcuCiAgICAgICAgICAgIEZpeCBzaW5nbGUgYXJndW1lbnRzIHdoZW4gdXNpbmcgcHl0aG9uIC1idWlsdGluIC1PIHdpdGggJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpCgoyMDE2LTAzLTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyAjNTk0LiBGaXggYXNzZXJ0aW9uIGZvciBzb21lIGxhbmd1YWdlcyB3aGVuIHdyYXBwaW5nIGEgQysrMTEgZW51bSBjbGFzcyB0aGF0CiAgICAgICAgICAgIGlzIHByaXZhdGUgaW4gYSBjbGFzcy4KCiAgICAgICAgICAgIEFsc28gZG9uJ3Qgd3JhcCBwcml2YXRlIGVudW1zIGZvciBhIGZldyBsYW5ndWFnZXMgdGhhdCBhdHRlbXB0ZWQgdG8gZG8gc28uCgoyMDE2LTAzLTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gdW5zaWduZWQgbG9uZyBsb25nIG1hcnNoYWxsaW5nIGltcHJvdmVtZW50cyB3aGVuIGEgbmVnYXRpdmUgbnVtYmVyCiAgICAgICAgICAgIGlzIHBhc3NlZCBmcm9tIEphdmEgdG8gQy4gQSBjYXN0IHRvIHNpZ25lZCBsb25nIGxvbmcgaW4gdGhlIEMgbGF5ZXIgd2lsbCBub3cKICAgICAgICAgICAgcmVzdWx0IGluIHRoZSBleHBlY3RlZCB2YWx1ZS4gTm8gY2hhbmdlIGZvciBwb3NpdGl2ZSBudW1iZXJzIHBhc3NlZCB0byBDLgogICAgICAgICAgICBGaXhlcyAjNjIzLgoKMjAxNi0wMy0yMjogYWxleHdhcmcKCSAgICBbTHVhXSAjMzk4IEZpeCBsdWEgX19nZXRpdGVtICsgaW5oZXJpdGFuY2UKICAgICAgICAgICAgVGhlIG5ldyBoYW5kbGluZyBvZiBjbGFzc2VzIGluIEx1YSAobm90IG1lcmdpbmcgbWV0aG9kcyBpbnRvIHRoZSBkZXJpdmVkIGNsYXNzZXMpCiAgICAgICAgICAgIGJyZWFrcyBmb3IgY2xhc3NlcyB0aGF0IHByb3ZpZGUgYSBfX2dldGl0ZW0gZnVuY3Rpb24uIFRoZSBfX2dldGl0ZW0gZnVuY3Rpb24KICAgICAgICAgICAgcHJldmVudHMgbWV0aG9kIGNhbGxzIHRvIGFueSBtZXRob2QgZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MuIFRoaXMgZml4IGNhbGxzCiAgICAgICAgICAgIF9fZ2V0aXRlbSBvbmx5IGlmIHRoZSBtZW1iZXIgaXMgbm90IGZvdW5kIHVzaW5nIHJlY3Vyc2l2ZSBsb29rdXAuCgoyMDE2LTAzLTE4OiBwdG9tdWxpawoJICAgIFtQeXRob25dICM1NjMgU3RvcCBnZW5lcmF0aW5nIHVubmVjZXNzYXJ5IF9zd2lnY29uc3RhbnQgaGVscGVycy4KCjIwMTYtMDMtMTY6IHJpY2hhcmRiZWFyZQoJICAgIFtSXSAjNjM2IEFkZCBleHRyYSBzdGQ6OnZlY3RvciBudW1lcmljIHR5cGVzCgoyMDE2LTAzLTE0OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBBZGQgc3RkX2FycmF5LmkgZm9yIEMrKzExIHN0ZDo6YXJyYXkgc3VwcG9ydC4KCjIwMTYtMDMtMTI6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjLCBEXSBGaXggc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcyB3cmFwcGVycyB3aXRoICVqYXZhY29uc3QoMSkKICAgICAgICAgICAgJWNzY29uc3QoMSkgb3IgJWRtYW5pZmVzdGNvbnN0LgogICAgICAgICAgICBUaGlzIGZpeGVzIHRoZSBjYXNlIHdoZW4gYW4gaW50ZWdlciBpcyB1c2VkIGFzIHRoZSBpbml0aWFsaXplciwgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFcgeyBzdGF0aWMgY29uc3QgY2hhciB3ID0gMTAwOyB9OwoKCSAgICBGaXggZ2VuZXJhdGVkIGNvZGUgcGFyc2luZyBlbnVtIHZhbHVlcyB1c2luZyBjaGFyIGVzY2FwZSBzZXF1ZW5jZXMKICAgICAgICAgICAgd2hlbiB0aGVzZSB2YWx1ZXMgYXBwZWFyIGluIHRoZSBKYXZhIGNvZGUgKHVzdWFsbHkgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpKQogICAgICAgICAgICBzdWNoIGFzOgoKICAgICAgICAgICAgICBlbnVtIFggeyB4MSA9ICdcbicsIHgyID0gJ1wxJyB9OwoKICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBzdGF0aWMgY29uc3QgbWVtYmVyIGNoYXIgdmFyaWFibGVzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHN0cnVjdCBZIHsgc3RhdGljIGNvbnN0IGNoYXIgeSA9ICdcbic7IH0KCiAgICAgICAgICAgIExpa2V3aXNlIGZvciBEIGFuZCAlZG1hbmlmZXN0Y29uc3RhbnQuIEZvciBDIyBhbmQgJWNzY29uc3QoMSksIGNoYXIKICAgICAgICAgICAgdmFsdWVzIGluIEMjIGFyZSBub3cgaGV4IGVzY2FwZWQgYXMgQyMgZG9lc24ndCBzdXBwb3J0IEMgb2N0YWwgZXNjYXBpbmcuCgoyMDE2LTAzLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gQWRkIHN1cHBvcnQgZm9yIHRyZWF0aW5nIEMrKyBiYXNlIGNsYXNzZXMgYXMgSmF2YSBpbnRlcmZhY2VzCiAgICAgICAgICAgIGluc3RlYWQgb2YgSmF2YSBwcm94eSBjbGFzc2VzLiBUaGlzIGVuYWJsZSBzb21lIHNvcnQgb2Ygc3VwcG9ydCBmb3IKICAgICAgICAgICAgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBzd2lnaW50ZXJmYWNlLmkgYW5kCiAgICAgICAgICAgIHByb3ZpZGVzIGFkZGl0aW9uYWwgbWFjcm9zIChzZWUgSmF2YS5odG1sIGZvciBmdWxsIGRvY3VtZW50YXRpb24pOgoKICAgICAgICAgICAgICAlaW50ZXJmYWNlKENUWVBFKQogICAgICAgICAgICAgICVpbnRlcmZhY2VfaW1wbChDVFlQRSkKICAgICAgICAgICAgICAlaW50ZXJmYWNlX2N1c3RvbSgiUFJPWFkiLCAiSU5URVJGQUNFIiwgQ1RZUEUpCgoyMDE2LTAzLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgcnN0cmlwIGVuY29kZXIgZm9yIHVzZSBpbiAlcmVuYW1lLiBUaGlzIGlzIGxpa2UgdGhlIHN0cmlwIGVuY29kZXIgYnV0CiAgICAgICAgICAgIHN0cmlwcyB0aGUgc3ltYm9sJ3Mgc3VmZml4IGluc3RlYWQgb2YgdGhlIHByZWZpeC4gVGhlIGV4YW1wbGUgYmVsb3cKICAgICAgICAgICAgd2lsbCByZW5hbWUgU29tZVRoaW5nQ2xzIHRvIFNvbWVUaGluZyBhbmQgQW5vdGhlclRoaW5nQ2xzIHRvIEFub3RoZXJUaGluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShyc3RyaXA6W0Nsc10pcyIpICIiOwoKICAgICAgICAgICAgICBjbGFzcyBTb21lVGhpbmdDbHMge307CiAgICAgICAgICAgICAgc3RydWN0IEFub3RoZXJUaGluZ0NscyB7fTsKCjIwMTYtMDMtMDE6IG9sbHkKCSAgICBGaXggaXNmaW5pdGUoKSBjaGVjayB0byB3b3JrIHdpdGggR0NDNi4gIEZpeGVzCgkgICAgaXNzdWUgIzYxNSByZXBvcnRlZCBieSBqcGxlc25pay4KCjIwMTYtMDItMTc6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBrZXl3b3JkcyAnYXMnIGFuZCAnd2l0aCcgdG8gcHl0aG9ua3cuc3dnLgoKMjAxNi0wMi0wNzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSByZWNvZ25pc2UgdmFyaW91cyB1bmFyeSBmdW5jdGlvbnMKICAgICAgICAgICAgKiBVc2UgX19mbG9hdF9fKCkgZm9yIG51bWVyaWMgY29udmVyc2lvbnMsIGUuZy4gd2hlbiBjYWxsaW5nIGRvdWJsZSgpCiAgICAgICAgICAgICogTWFwIHZhcmlvdXMgdW5hcnkgZnVuY3Rpb25zLCBlLmcuIGFicygpIHRvIF9fYWJzX18oKSwgc2VlIGZ1bGwgbGlzdAogICAgICAgICAgICAgIGluIHNlY3Rpb24gMzIuMy4xMCBvZiBtYW51YWw7IG9ubHkgYXZhaWxhYmxlIGluIE9jdGF2ZSAzLjguMCBvciBsYXRlcgoKMjAxNi0wMi0wNzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBleHBvcnQgZnVuY3Rpb24gc3dpZ19vY3RhdmVfcHJlcmVxKCkgZm9yIHRlc3RpbmcgT2N0YXZlIHZlcnNpb24KCjIwMTYtMDItMDY6IHBqb2hhbmd1c3RhdnNzb24KICAgICAgICAgICAgW0MjXSBGaXggZHVwbGljYXRlIHN5bWJvbCBwcm9ibGVtcyB3aGVuIGxpbmtpbmcgdGhlIHNvdXJjZSBnZW5lcmF0ZWQKICAgICAgICAgICAgZnJvbSBtdWx0aXBsZSBTV0lHIG1vZHVsZXMgaW50byBvbmUgc2hhcmVkIGxpYnJhcnkgZm9yIHRoZSAtbmFtZXNwYWNlCiAgICAgICAgICAgIG9wdGlvbi4gVGhlIG5hbWVzcGFjZSBpcyBub3cgbWFuZ2xlZCBpbnRvIHRoZSBnbG9iYWwgUEludm9rZSBmdW5jdGlvbgogICAgICAgICAgICBuYW1lcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNi0wMS0yNzogYWhub2xkcwogICAgICAgICAgICBbUHl0aG9uXSBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBQeXRob24gQnl0ZXMKICAgICAgICAgICAgYW5kIFVuaWNvZGUgb2JqZWN0cyB1c2luZyBieSBkZWZpbmluZyBTV0lHX1BZVEhPTl9TVFJJQ1RfQllURV9DSEFSCiAgICAgICAgICAgIGFuZCBTV0lHX1BZVEhPTl9TVFJJQ1RfVU5JQ09ERV9XQ0hBUi4KCjIwMTYtMDEtMjc6IHN0ZWV2ZQogICAgICAgICAgICBbR29dIEVuc3VyZSBzdHJ1Y3RzIGFyZSBwcm9wZXJseSBwYWNrZWQgYmV0d2VlbiBnYyBhbmQgR0NDL2NsYW5nLgoKMjAxNi0wMS0yNTogYWhub2xkcwogICAgICAgICAgICBbUHl0aG9uXSBTdXBwb3J0IHRoZSBmdWxsIFB5dGhvbiB0ZXN0IHN1aXRlIGluIC1jbGFzc2ljIG1vZGUKICAgICAgICAgICAgKiBDb252ZXJ0IGxvbmcvdW5zaWduZWQgbG9uZy9sb25nIGxvbmcvdW5zaWduZWQgbG9uZyBsb25nIHRvIFB5SW50CiAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gUHlMb25nIHdoZW4gcG9zc2libGUuIENlcnRhaW4gcHl0aG9uIGZ1bmN0aW9ucyBsaWtlCiAgICAgICAgICAgICAgbGVuKCkgcmVxdWlyZSBhIFB5SW50IHdoZW4gb3BlcmF0aW5nIG9uIG9sZC1zdHlsZSBjbGFzc2VzLgogICAgICAgICAgICAqIEFkZCBzdXBwb3J0IGZvciBzdGF0aWMgbWV0aG9kcyBpbiBjbGFzc2ljIG1vZGUsIGluY2x1ZGluZyBzdXBwb3J0CiAgICAgICAgICAgICAgZm9yIHB5dGhvbmFwcGVuZCwgcHl0aG9ucHJlcGVuZCwgYW5kIGRvY3N0cmluZ3MuCiAgICAgICAgICAgICogUmVtb3ZpbmcgdGhlIHVzZSBvZiBfX3N3aWdfZ2V0bWV0aG9kc19fIGZvciBzdGF0aWMgbWVtYmVyIG1ldGhvZHMKICAgICAgICAgICAgICBzaW5jZSB0aGV5IHdpbGwgYWx3YXlzIGJlIGZvdW5kIGJ5IHRoZSBzdGFuZGFyZCBhcmd1bWVudCBsb29rdXAKICAgICAgICAgICAgKiBGaXggYSBidWcgd2hlcmUgdGhlIHdyb25nIHR5cGUgb2YgZXhjZXB0aW9uIHdhcyBjYXVnaHQgd2hlbgogICAgICAgICAgICAgIGNoZWNraW5nIGZvciBuZXctc3R5bGUgY2xhc3Mgc3VwcG9ydAoKMjAxNi0wMS0yMzogYWhub2xkcwogICAgICAgICAgICBbR29dIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgR28gdGVzdC1zdWl0ZSBvbiBPU1g6CiAgICAgICAgICAgICogVGhlIGxpbmtlciBvbiBPU1ggcmVxdWlyZXMgdGhhdCBhbGwgc3ltYm9scyAoZXZlbiB3ZWFrIHN5bWJvbHMpCiAgICAgICAgICAgICAgYXJlIGRlZmluZWQgYXQgbGluayB0aW1lLiBCZWNhdXNlIHRoZSBmdW5jdGlvbiBfY2dvX3RvcG9mc3RhY2sgaXMKICAgICAgICAgICAgICBvbmx5IGRlZmluZWQgc3RhcnRpbmcgaW4gR28gdmVyc2lvbiAxLjQsIHdlIGV4cGxpY2l0bHkgbWFyayBpdCBhcwogICAgICAgICAgICAgIHVuZGVmaW5lZCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgR28gb24gT1NYLgogICAgICAgICAgICAqIEF2b2lkIHdyaXRpbmcgZW1wdHkgc3dpZ2FyZ3Mgc3RydWN0cywgc2luY2UgZW1wdHkgc3RydWN0cyBhcmUgbm90CiAgICAgICAgICAgICAgYWxsb3dlZCBpbiBleHRlcm4gIkMiIGJsb2Nrcy4KCjIwMTYtMDEtMTI6IG9sbHkKCSAgICBbSmF2YXNjcmlwdF0gTG9vayBmb3IgIm5vZGVqcyIgYXMgd2VsbCBhcyAibm9kZSIsIGFzIGl0J3MgcGFja2FnZWQKCSAgICBhcyB0aGUgZm9ybWVyIG9uIERlYmlhbi4KCjIwMTYtMDEtMTI6IG9sbHkKCSAgICBbSmF2YXNjcmlwdF0gRm9yIHY4ID49IDQuMy4wLCB1c2UgVjhfTUFKT1JfVkVSU0lPTi4KCSAgICBGaXhlcyBpc3N1ZSA1NjEuCgoyMDE2LTAxLTEwOiBhaG5vbGRzCiAgICAgICAgICAgIEltcHJvdmVkIHNpemVfdCBhbmQgcHRyZGlmZl90IHR5cGVtYXBzIHRvIHN1cHBvcnQgbGFyZ2UgdmFsdWVzCiAgICAgICAgICAgIG9uIHBsYXRmb3JtcyB3aGVyZSBzaXplb2Yoc2l6ZV90KSA+IHNpemVvZih1bnNpZ25lZCBsb25nKSBhbmQKICAgICAgICAgICAgc2l6ZW9mKHB0cmRpZmZfdCkgPiBzaXplb2YobG9uZykuCgpWZXJzaW9uIDMuMC44ICgzMSBEZWMgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTEyLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgcGRmIGRvY3VtZW50YXRpb24gaXMgbm93IGdlbmVyYXRlZCBieSB3a2h0bWx0b3BkZiBhbmQgaGFzIGNvbG91cgogICAgICAgICAgICBmb3IgdGhlIGNvZGUgc25pcHBldHMganVzdCBsaWtlIHRoZSBodG1sIGRvY3VtZW50YXRpb24hCgoyMDE1LTEyLTIzOiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEZpeGVzIGZvciBjb252ZXJzaW9uIG9mIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlciB0eXBlczoKCiAgICAgICAgICAgIE5vIGxvbmdlciBjaGVjayBmb3IgUHlJbnQgb2JqZWN0cyBpbiBQeXRob24zLiBCZWNhdXNlIFB5SW50X0NoZWNrCiAgICAgICAgICAgIGFuZCBmcmllbmRzIGFyZSAjZGVmaW5lZCB0byB0aGUgY29ycmVzcG9uZGluZyBQeUxvbmcgbWV0aG9kcywgdGhpcwogICAgICAgICAgICBoYWQgY2F1c2VkIGVycm9ycyBpbiBQeXRob24zIHdoZXJlIHZhbHVlcyBncmVhdGVyIHRoYW4gd2hhdCBjb3VsZCBiZQogICAgICAgICAgICBzdG9yZWQgaW4gYSBsb25nIHdlcmUgaW5jb3JyZWN0bHkgaW50ZXJwcmV0ZWQgYXMgdGhlIHZhbHVlIC0xIHdpdGgKICAgICAgICAgICAgdGhlIFB5dGhvbiBlcnJvciBpbmRpY2F0b3Igc2V0IHRvIE92ZXJmbG93RXJyb3IuIFRoaXMgYXBwbGllcyB0bwogICAgICAgICAgICBib3RoIHRoZSBjb252ZXJzaW9ucyBQeUxvbmctPmxvbmcgYW5kIFB5TG9uZy0+ZG91YmxlLgoKICAgICAgICAgICAgQ29udmVyc2lvbiBmcm9tIFB5TG9uZyB0byBsb25nLCB1bnNpZ25lZCBsb25nLCBsb25nIGxvbmcsIGFuZAogICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbm93IHJhaXNlIE92ZXJmbG93RXJyb3IgaW5zdGVhZCBvZiBUeXBlRXJyb3IgaW4KICAgICAgICAgICAgYm90aCBQeXRob24yIGFuZCBQeXRob24zIGZvciBQeUxvbmcgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlCiAgICAgICAgICAgIGV4cHJlc3NpYmxlIGJ5IHRoZSBjb3JyZXNwb25kaW5nIEMgdHlwZS4gVGhpcyBtYXRjaGVzIHRoZSBleGlzdGluZwogICAgICAgICAgICBiZWhhdmlvciBmb3Igb3RoZXIgaW50ZWdyYWwgdHlwZXMgKHNpZ25lZCBhbmQgdW5zaWduZWQgaW50cywgc2hvcnRzLAogICAgICAgICAgICBhbmQgY2hhcnMpLCBhcyB3ZWxsIGFzIHRoZSBjb252ZXJzaW9uIGZvciBQeUludCB0byBhbGwgbnVtZXJpYwogICAgICAgICAgICB0eXBlcy4gVGhpcyBhbHNvIGluZGlyZWN0bHkgYXBwbGllcyB0byB0aGUgc2l6ZV90IGFuZCBwdHJkaWZmX3QKICAgICAgICAgICAgdHlwZXMsIHdoaWNoIGRlcGVuZCBvbiB0aGUgY29udmVyc2lvbnMgZm9yIHVuc2lnbmVkIGxvbmcgYW5kIGxvbmcuCgoyMDE1LTEyLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMiBVbmljb2RlIFVURi04IHN0cmluZ3MgY2FuIGJlIHVzZWQgYXMgaW5wdXRzIHRvIGNoYXIgKiBvcgogICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlcyBpZiB0aGUgZ2VuZXJhdGVkIEMvQysrIGNvZGUgaGFzIFNXSUdfUFlUSE9OXzJfVU5JQ09ERSBkZWZpbmVkLgoKMjAxNS0xMi0xNzogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWVzICMyODYsICMxMjgKICAgICAgICAgICAgUmVtb3ZlIGNjYWNoZS1zd2lnLjEgbWFuIHBhZ2UgLSBwbGVhc2UgdXNlIHRoZSBDQ2FjaGUuaHRtbCBkb2NzIGluc3RlYWQuCiAgICAgICAgICAgIFRoZSB5b2RsMm1hbiBhbmQgeW9kbDJodG1sIHRvb2xzIGFyZSBubyBsb25nZXIgdXNlZCBhbmQgc28gU1dJRyBubwogICAgICAgICAgICBsb25nZXIgaGFzIGEgZGVwZW5kZW5jeSBvbiB0aGVzZSBwYWNrYWdlcyB3aGljaCB3ZXJlIHJlcXVpcmVkIHdoZW4KICAgICAgICAgICAgYnVpbGRpbmcgZnJvbSBnaXQuCgoyMDE1LTEyLTE2OiB6dHVybmVyL2NvbGViCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24zLjUgaW50ZXJwcmV0ZXIgYXNzZXJ0aW9ucyB3aGVuIG9iamVjdHMgYXJlIGJlaW5nCiAgICAgICAgICAgIGRlbGV0ZWQgZHVlIHRvIGFuIGV4aXN0aW5nIGV4Y2VwdGlvbi4gTW9zdCBub3RhYmx5IGluIGdlbmVyYXRvcnMKICAgICAgICAgICAgd2hpY2ggdGVybWluYXRlIHVzaW5nIGEgU3RvcEl0ZXJhdGlvbiBleGNlcHRpb24uIEZpeGVzICM1NTkgIzU2MCAjNTczLgogICAgICAgICAgICBJZiBhIGZ1cnRoZXIgZXhjZXB0aW9uIGlzIHJhaXNlZCBkdXJpbmcgYW4gb2JqZWN0IGRlc3RydWN0aW9uLAogICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUgaXMgdXNlZCBvbiB0aGlzIHNlY29uZCBleGNlcHRpb24gYW5kIHRoZQogICAgICAgICAgICBvcmlnaW5hbCBleGNlcHRpb24gYnViYmxlcyB0aHJvdWdoLgoKMjAxNS0xMi0xNDogYWhub2xkcy93c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgaW4gbWlzc2luZyBpbml0aWFsaXplcnMgZm9yIHRwX2ZpbmFsaXplLAogICAgICAgICAgICBuYl9tYXRyaXhfbXVsdGlwbHksIG5iX2lucGxhY2VfbWF0cml4X211bHRpcGx5LCBodF9xdWFsbmFtZQogICAgICAgICAgICBodF9jYWNoZWRfa2V5cyBhbmQgdHBfcHJldi4KCjIwMTUtMTItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTVEwgd3JhcHBlcnMgdG8gbm90IGdlbmVyYXRlIDw6IGRpZ3JhcGhzLgogICAgICAgICAgICBGb3IgZXhhbXBsZSBzdGQ6OnZlY3Rvcjw6Olg6Olk+IHdhcyBzb21ldGltZXMgZ2VuZXJhdGVkLCBub3cKICAgICAgICAgICAgY29ycmVjdGVkIHRvIHN0ZDo6dmVjdG9yPCA6Olg6OlkgPi4KCjIwMTUtMTEtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBTVEwgcmFuZ2VzIGFuZCBzbGljZXMgZml4ZXMuCgogICAgICAgICAgICBSdWJ5IFNUTCBjb250YWluZXIgc2V0dGluZyBzbGljZXMgZml4ZXM6CgogICAgICAgICAgICBTZXR0aW5nIGFuIFNUTCBjb250YWluZXIgd3JhcHBlciBzbGljZSBiZXR0ZXIgbWF0Y2hlcyB0aGUgd2F5IFJ1YnkKICAgICAgICAgICAgYXJyYXlzIHdvcmsuIFRoZSBiZWhhdmlvdXIgaXMgbm93IHRoZSBzYW1lIGFzIFJ1YnkgYXJyYXlzLiBUaGUgb25seQogICAgICAgICAgICBleGNlcHRpb24gaXMgdGhlIGRlZmF1bHQgdmFsdWUgdXNlZCB3aGVuIGV4cGFuZGluZyBhIGNvbnRhaW5lcgogICAgICAgICAgICBjYW5ub3QgYmUgbmlsIGFzIHRoaXMgaXMgbm90IGEgdmFsaWQgdHlwZS92YWx1ZSBmb3IgQysrIGNvbnRhaW5lcgogICAgICAgICAgICBlbGVtZW50cy4KCiAgICAgICAgICAgIE9idGFpbmluZyBhIFJ1YnkgU1RMIGNvbnRhaW5lciByYW5nZXMgYW5kIHNsaWNlcyBmaXhlczoKCiAgICAgICAgICAgIEFjY2VzcyB2aWEgcmFuZ2VzIGFuZCBzbGljZXMgbm93IGJlaGF2ZSBpZGVudGljYWxseSB0byBSdWJ5IGFycmF5cy4KICAgICAgICAgICAgVGhlIGZpeGVzIGFyZSBtb3N0bHkgZm9yIG91dCBvZiByYW5nZSBpbmRpY2VzIGFuZCBsZW5ndGhzLgogICAgICAgICAgICAtIFplcm8gbGVuZ3RoIHNsaWNlIHJlcXVlc3RzIHJldHVybiBhbiBlbXB0eSBjb250YWluZXIgaW5zdGVhZCBvZiBuaWwuCiAgICAgICAgICAgIC0gU2xpY2VzIHdoaWNoIHJlcXVlc3QgYSBsZW5ndGggZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIKICAgICAgICAgICAgICBubyBsb25nZXIgY2hvcCBvZmYgdGhlIGxhc3QgZWxlbWVudC4KICAgICAgICAgICAgLSBSYW5nZXMgd2hpY2ggdXNlZCB0byByZXR1cm4gbmlsIG5vdyByZXR1cm4gYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUKICAgICAgICAgICAgICB0aGUgc3RhcnQgZWxlbWVudCBpcyBhIHZhbGlkIGluZGV4LgoKICAgICAgICAgICAgUnVieSBTVEwgY29udGFpbmVyIG5lZ2F0aXZlIGluZGV4aW5nIHN1cHBvcnQgaW1wcm92ZWQuCgogICAgICAgICAgICBVc2luZyBuZWdhdGl2ZSBpbmRleGVzIHRvIHNldCB2YWx1ZXMgd29ya3MgdGhlIHNhbWUgYXMgUnVieSBhcnJheXMsIGVnCgogICAgICAgICAgICAldGVtcGxhdGUoSW50VmVjdG9yKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgaXYgPSBJbnRWZWN0b3IubmV3KFsxLDIsMyw0XSkKICAgICAgICAgICAgaXZbLTRdID0gOSAjID0+IFsxLDIsMyw5XQogICAgICAgICAgICBpdlstNV0gPSA5ICMgPT4gSW5kZXhFcnJvcgoKMjAxNS0xMS0yMTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gQWRkIHN0ZDo6YXJyYXkgY29udGFpbmVyIHdyYXBwZXJzLgoKICAgICAgICAgICAgVGhlc2Ugd29yayBtdWNoIGxpa2UgYW55IG9mIHRoZSBvdGhlciBTVEwgY29udGFpbmVycyBleGNlcHQgUHl0aG9uL1J1Ynkgc2xpY2luZwogICAgICAgICAgICBpcyBzb21ld2hhdCBsaW1pdGVkIGJlY2F1c2UgdGhlIGFycmF5IGlzIGEgZml4ZWQgc2l6ZS4gT25seSBzbGljZXMgb2YKICAgICAgICAgICAgdGhlIGZ1bGwgc2l6ZSBhcmUgc3VwcG9ydGVkLgoKMjAxNS0xMC0xMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzUzOSAtIFN1cHBvcnQgUHl0aG9uIDMuNSBhbmQgLWJ1aWx0aW4uICBQeUFzeW5jTWV0aG9kcyBpcyBhIG5ldwogICAgICAgICAgICBtZW1iZXIgaW4gUHlIZWFwVHlwZU9iamVjdC4KCjIwMTUtMTAtMDY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBEb24ndCBlbWl0IGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGEgZGlyZWN0b3IKCSAgICBjbGFzcyB3aXRoIGFuIGFic3RyYWN0IG1ldGhvZCwgc2luY2UgdGhlIGZ1bmN0aW9uIHdpbGwKCSAgICBhbHdheXMgcGFuaWMuCgoyMDE1LTEwLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXNoYXJlZF9wdHIgc3VwcG9ydCBmb3IgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIGluaGVyaXRhbmNlLgogICAgICAgICAgICAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBXYXJuaW5nIDUyMDogRGVyaXZlZCBjbGFzcyAnRGVyaXZlZCcgb2YgJ0Jhc2UnCiAgICAgICAgICAgICAgaXMgbm90IHNpbWlsYXJseSBtYXJrZWQgYXMgYSBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIC0gRG8gbm90IGdlbmVyYXRlIGNvZGUgdGhhdCBhdHRlbXB0cyB0byBjYXN0IHVwIHRoZSBpbmhlcml0YW5jZSBjaGFpbiBpbiB0aGUKICAgICAgICAgICAgICB0eXBlIHN5c3RlbSBydW50aW1lIGluIHN1Y2ggY2FzZXMgYXMgaXQgZG9lc24ndCBjb21waWxlIGFuZCBjYW4ndCBiZSB1c2VkLgogICAgICAgICAgICBSZW1vdmUgdW5uZWNlc3Nhcnkgd2FybmluZyA1MjAgZm9yICVzaGFyZWRfcHRyIHdoZW4gdGhlIGJhc2UgY2xhc3MgaXMgaWdub3JlZC4KCjIwMTUtMTAtMDE6IHZrYWxpbmluCiAgICAgICAgICAgIEZpeCAjNTA4OiBGaXggc2VnZmF1bHQgcGFyc2luZyBhbm9ueW1vdXMgdHlwZWRlZiBuZXN0ZWQgY2xhc3Nlcy4KCjIwMTUtMDktMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBZGQgc2hhcmVkX3B0ciBzdXBwb3J0CgoyMDE1LTA5LTEzOiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBSZXNvbHZlIHRyYWNraW5nIGJ1ZyAtIGlzc3VlICMyMjUuCiAgICAgICAgICAgIFRoZSBidWcgaXMgdGhhdCB0aGUgdHJhY2tpbmcgY29kZSB1c2VzIGEgcnVieSBoYXNoIGFuZCB0aHVzIG1heQogICAgICAgICAgICBhbGxvY2F0ZSBvYmplY3RzIChCaWdudW0pIHdoaWxlIHJ1bm5pbmcgdGhlIEdDLiBUaGlzIHdhcyB0b2xlcmF0ZWQgaW4KICAgICAgICAgICAgMS44IGJ1dCBpcyBpbnZhbGlkIChyYWlzZXMgYW4gZXhjZXB0aW9uKSBpbiAxLjkuCiAgICAgICAgICAgIFRoZSBwYXRjaCB1c2VzIGEgQyBoYXNoIChhbHNvIHVzZWQgYnkgcnVieSkgaW5zdGVhZC4KCjIwMTUtMDktMDk6IGx5emUKICAgICAgICAgICAgW0NGRkldIEV4dGVuZCB0aGUgImV4cG9ydCIgZmVhdHVyZSBpbiB0aGUgQ0ZGSSBtb2R1bGUgdG8gc3VwcG9ydAogICAgICAgICAgICBleHBvcnRpbmcgdG8gYSBzcGVjaWZpZWQgcGFja2FnZS4KCjIwMTUtMDktMDQ6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZG9jc3RyaW5ncyBmb3IgJWNhbGxiYWNrIGZ1bmN0aW9ucy4KCjIwMTUtMDktMDM6IGRlbWktcmx1ZGR5CiAgICAgICAgICAgIFtHb10gUmVtb3ZlZCBnb2xhbmcgc3RyaW5naW5nIGZvciBzaWduZWQvdW5zaWduZWQgY2hhcgoKICAgICAgICAgICAgQ2hhbmdlZCBkZWZhdWx0IGhhbmRsaW5nIG9mIHNpZ25lZCBjaGFyKiBhbmQgdW5zaWduZWQgY2hhciogdG8gYmUKICAgICAgICAgICAgb3BhcXVlIHBvaW50ZXJzIHJhdGhlciB0aGFuIHN0cmluZ3MsIHNpbWlsYXJseSB0byBob3cgb3RoZXIKICAgICAgICAgICAgbGFuZ3VhZ2VzIHdvcmsuCgogICAgICAgICAgICBBbnkgZXhpc3RpbmcgY29kZSByZWx5aW5nIG9uIHRyZWF0aW5nIHNpZ25lZCBjaGFyKiBvciB1bnNpZ25lZAogICAgICAgICAgICBjaGFyKiBhcyBhIHN0cmluZyBjYW4gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW9yIHdpdGggdHlwZW1hcHMuaSBieQogICAgICAgICAgICB1c2luZyAlYXBwbHkgdG8gY29weSB0aGUgW3VuY2hhbmdlZF0gY2hhciogYmVoYXZpb3IuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTUtMDgtMDc6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSB0aWR5IC1XdGF1dG9sb2dpY2FsLWNvbnN0YW50LW91dC1vZi1yYW5nZS1jb21wYXJlIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgZ2VuZXJhdGVkIGNvZGUgdW5kZXIgY2xhbmcKCjIwMTUtMDgtMDc6IHhhbnRhcmVzCiAgICAgICAgICAgIFtQeXRob25dIHBlcDI1NyAmIG51bXB5ZG9jIGNvbmZvcm1pbmcgZG9jc3RyaW5nczoKICAgICAgICAgICAgLSBNb25vLWxpbmUgbW9kdWxlIGRvY3NzdHJpbmcKICAgICAgICAgICAgLSBSZXdyaXRlIGF1dG9kb2MgcGFyYW1ldGVycyBzZWN0aW9uIGluIG51bXB5ZG9jIHN0eWxlOgogICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9udW1weS9udW1weS9ibG9iL21hc3Rlci9kb2MvSE9XVE9fRE9DVU1FTlQucnN0LnR4dAogICAgICAgICAgICAtIE9uZSBsaW5lIHN1bW1hcnkgc2hvdWxkIGVuZCB3aXRoICIuIgogICAgICAgICAgICAtIEFkZHMgYSBibGFuayBsaW5lIGFmdGVyIGNsYXNzIGRvY3N0cmluZwoKMjAxNS0wOC0wNTogdmFkegogICAgICAgICAgICBbSmF2YV0gTWFrZSAoY2hhciogU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcyB1c2FibGUgZm9yCiAgICAgICAgICAgIHN0cmluZ3Mgb2Ygb3RoZXIgdHlwZXMsIGUuZy4gInVuc2lnbmVkIGNoYXIqIi4KClZlcnNpb24gMy4wLjcgKDMgQXVnIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTA4LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHBvdGVudGlhbCBzZWN1cml0eSBleHBsb2l0IGluIGdlbmVyYXRlZCBKYXZhIGNsYXNzZXMuCiAgICAgICAgICAgIFRoZSBzd2lnQ1B0ciBhbmQgc3dpZ0NNZW1Pd24gbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIEphdmEKICAgICAgICAgICAgY2xhc3NlcyBhcmUgbm93IGRlY2xhcmVkICd0cmFuc2llbnQnIGJ5IGRlZmF1bHQuIEZ1cnRoZXIgZGV0YWlscyBvZiB0aGUgZXhwbG9pdAogICAgICAgICAgICBpbiBBbmRyb2lkIGlzIGJlaW5nIHB1Ymxpc2hlZCBpbiBhbiBhY2FkZW1pYyBwYXBlciBhcyBwYXJ0IG9mIFVTRU5JWCBXT09UICcxNToKICAgICAgICAgICAgaHR0cHM6Ly93d3cudXNlbml4Lm9yZy9jb25mZXJlbmNlL3dvb3QxNS93b3Jrc2hvcC1wcm9ncmFtL3ByZXNlbnRhdGlvbi9wZWxlcy4KCiAgICAgICAgICAgIEluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IHlvdSBhcmUgcmVseWluZyBvbiB0aGVzZSBtZW1iZXJzIGJlaW5nIHNlcmlhbGl6YWJsZSwKICAgICAgICAgICAgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGphdmFib2R5IGFuZCBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXBzCiAgICAgICAgICAgIHRvIGdlbmVyYXRlIHRoZSBvbGQgZ2VuZXJhdGVkIGNvZGUuIFRoZSByZWxldmFudCB0eXBlbWFwcyBhcmUgaW4gdGhlIExpYiBkaXJlY3RvcnkKICAgICAgICAgICAgaW4gdGhlIGphdmEuc3dnLCBib29zdF9zaGFyZWRfcHRyLmkgYW5kIGJvb3N0X2ludHJ1c2l2ZV9wdHIuaSBmaWxlcy4gQ29weSB0aGUKICAgICAgICAgICAgcmVsZXZhbnQgZGVmYXVsdCB0eXBlbWFwcyBpbnRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgYW5kIHJlbW92ZSB0aGUgJ3RyYW5zaWVudCcga2V5d29yZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNS0wOC0wMTogdmFkegogICAgICAgICAgICBNYWtlIGNvbmZpZ3VyZSAtLXdpdGhvdXQtYWxsbGFuZyBvcHRpb24gbW9yZSB1c2VmdWw6IGl0IGNhbiBub3cgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIC0td2l0aC14eHggb3B0aW9ucywgYWxsb3dpbmcgdG8gZWFzaWx5IGVuYWJsZSBqdXN0IG9uZSBvciB0d28gbGFuZ3VhZ2VzLgoKMjAxNS0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0NDAgLSBJbml0aWFsaXNlIGFsbCBuZXdseSBjcmVhdGVkIGFycmF5cyB3aGVuIHVzaW5nICVhcnJheV9mdW5jdGlvbnMgYW5kICVhcnJheV9jbGFzcwogICAgICAgICAgICBpbiB0aGUgY2FycmF5cy5pIGxpYnJhcnkgLSBidWcgaXMgb25seSByZWxldmFudCB3aGVuIHVzaW5nIEMrKy4KCjIwMTUtMDctMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEltcHJvdmUgaW5kZW50YXRpb24gd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMgZm9yIGNvZGUgaW4gdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICAgICVweXRob25hcHBlbmQKICAgICAgICAgICAgICAlcHl0aG9uY29kZQogICAgICAgICAgICAgICVweXRob25iZWdpbgogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKQoKICAgICAgICAgICAgT2xkIGVycm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgRXJyb3I6IExpbmUgaW5kZW50ZWQgbGVzcyB0aGFuIGV4cGVjdGVkIChsaW5lIDMgb2YgcHl0aG9uY29kZSkKCiAgICAgICAgICAgIE5ldyBlcnJvciBleGFtcGxlOgogICAgICAgICAgICAgIEVycm9yOiBMaW5lIGluZGVudGVkIGxlc3MgdGhhbiBleHBlY3RlZCAobGluZSAzIG9mICVweXRob25jb2RlIG9yICVpbnNlcnQoInB5dGhvbiIpIGJsb2NrKQogICAgICAgICAgICAgIGFzIG5vIGxpbmUgc2hvdWxkIGJlIGluZGVudGVkIGxlc3MgdGhhbiB0aGUgaW5kZW50YXRpb24gaW4gbGluZSAxCgogICAgICAgICAgICBPbGQgd2FybmluZyBleGFtcGxlOgogICAgICAgICAgICAgIFdhcm5pbmcgNzQwOiBXaGl0ZXNwYWNlIHByZWZpeCBkb2Vzbid0IG1hdGNoIChsaW5lIDIgb2YgJXB5dGhvbmNvZGUgb3IgJWluc2VydCgicHl0aG9uIikgYmxvY2spCgogICAgICAgICAgICBOZXcgd2FybmluZyBleGFtcGxlOgogICAgICAgICAgICAgIFdhcm5pbmcgNzQwOiBXaGl0ZXNwYWNlIGluZGVudGF0aW9uIGlzIGluY29uc2lzdGVudCBjb21wYXJlZCB0byBlYXJsaWVyIGxpbmVzIChsaW5lIDMgb2YKICAgICAgICAgICAgICAlcHl0aG9uY29kZSBvciAlaW5zZXJ0KCJweXRob24iKSBibG9jaykKCiAgICAgICAgICAgIAoyMDE1LTA3LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzQ3NS4gSW1wcm92ZSBkb2NzdHJpbmcgaW5kZW50YXRpb24gaGFuZGxpbmcuCiAgICAgICAgICAgIAogICAgICAgICAgICBTV0lHLTMuMC41IGFuZCBlYXJsaWVyIHNvbWV0aW1lcyB0cnVuY2F0ZWQgdGV4dCBwcm92aWRlZCBpbiB0aGUgZG9jc3RyaW5nIGZlYXR1cmUuCiAgICAgICAgICAgIFRoaXMgb2NjdXJyZWQgd2hlbiB0aGUgaW5kZW50YXRpb24gKHdoaXRlc3BhY2UpIGluIHRoZSBkb2NzdHJpbmcgd2FzIGxlc3MgaW4gdGhlCiAgICAgICAgICAgIHNlY29uZCBvciBsYXRlciBsaW5lcyB3aGVuIGNvbXBhcmVkIHRvIHRoZSBmaXJzdCBsaW5lLgogICAgICAgICAgICBTV0lHLTMuMC42IGdhdmUgYSAnTGluZSBpbmRlbnRlZCBsZXNzIHRoYW4gZXhwZWN0ZWQnIGVycm9yIGluc3RlYWQgb2YgdHJ1bmNhdGluZwogICAgICAgICAgICB0aGUgZG9jc3RyaW5nIHRleHQuCiAgICAgICAgICAgIE5vdyB0aGUgaW5kZW50YXRpb24gZm9yIHRoZSAnZG9jc3RyaW5nJyBmZWF0dXJlIGlzIHNtYXJ0ZXIgYW5kIGlzIGFwcHJvcHJpYXRlbHkKICAgICAgICAgICAgYWRqdXN0ZWQgc28gdGhhdCBubyB0cnVuY2F0aW9uIG9jY3Vycy4KCjIwMTUtMDctMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uIGluIHR5cGVtYXAgYXR0cmlidXRlcy4gRXhhbXBsZSB1c2FnZSBleHBhbnNpb24KICAgICAgICAgICAgaW4gdGhlICdvdXQnIGF0dHJpYnV0ZSAoQyMgc3BlY2lmaWMpOgoKICAgICAgICAgICAgICAldHlwZW1hcChjdHlwZSwgb3V0PSIkKjFfbHR5cGUiKSB1bnNpZ25lZCBpbnQmICIkKjFfbHR5cGUiCgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgYXMgJCoxX2x0eXBlIGV4cGFuZHMgdG8gJ3Vuc2lnbmVkIGludCc6CgogICAgICAgICAgICAgICV0eXBlbWFwKGN0eXBlLCBvdXQ9InVuc2lnbmVkIGludCIpIHVuc2lnbmVkIGludCYgInVuc2lnbmVkIGludCIKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGVzIGNhbiBiZSB1c2VkIHdpdGhpbiBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcyB0b28uIEV4YW1wbGUgdXNhZ2UgZXhwYW5zaW9uOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIHVuc2lnbmVkIGludCAidWludCIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0iJHR5cGVtYXAoY3N0eXBlLCAkKjFfbHR5cGUpIikgdW5zaWduZWQgaW50JiAiJHR5cGVtYXAoY3N0eXBlLCAkKjFfbHR5cGUpIgoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZXMgYXJlIGV4cGFuZGVkIGZpcnN0IGFuZCBoZW5jZSB0aGUgYWJvdmUgaXMgZXF1aXZhbGVudCB0bzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9IiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIpIHVuc2lnbmVkIGludCYgIiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIKCiAgICAgICAgICAgIHdoaWNoIHRoZW4gZXhwYW5kcyB0bzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9InVpbnQiKSB1bnNpZ25lZCBpbnQmICJ1aW50IgoKMjAxNS0wNy0yMjogbGluZGxleWYKCSAgICBBcHBseSBwYXRjaCAjNDM5IC0gc3VwcG9ydCBmb3IgJHR5cGVtYXAoKSAoYWthIGVtYmVkZGVkIHR5cGVtYXBzIG9yIHNwZWNpYWwgdmFyaWFibGUKICAgICAgICAgICAgbWFjcm9zKSBpbiB0eXBlbWFwIGF0dHJpYnV0ZXMuIEEgc2ltcGxlIGV4YW1wbGUgd2hlcmUgJHR5cGVtYXAoKSBpcyBleHBhbmRlZCBpbiB0aGUKICAgICAgICAgICAgJ291dCcgYXR0cmlidXRlIChDIyBzcGVjaWZpYyk6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgdW5zaWduZWQgaW50ICJ1aW50IgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiKSB1bnNpZ25lZCBpbnQmICIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiCgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0idWludCIpIHVuc2lnbmVkIGludCYgInVpbnQiCgoyMDE1LTA3LTE4OiBtN3Rob24KCSAgICBbUHl0aG9uXSBEb2NzdHJpbmdzIHByb3ZpZGVkIHZpYSAlZmVhdHVyZSgiZG9jc3RyaW5nIikgYXJlIG5vdyBxdW90ZWQgYW5kIGFkZGVkIHRvCiAgICAgICAgICAgIHRoZSB0cF9kb2Mgc2xvdCB3aGVuIHVzaW5nIHB5dGhvbiBidWlsdGluIGNsYXNzZXMgKC1idWlsdGluKS4gV2hlbiBubyBkb2NzdHJpbmcgaXMKICAgICAgICAgICAgcHJvdmlkZWQsIHRoZSB0cF9kb2Mgc2xvdCBpcyBzZXQgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBjbGFzcyBuYW1lLgogICAgICAgICAgICBHaXRodWIgaXNzdWVzICM0NDUgYW5kICM0NjEuCgoyMDE1LTA3LTE3OiBrd3dldHRlCiAgICAgICAgICAgIFtvY3RhdmVdIFN1cHBvcnQgT2N0YXZlIHZlcnNpb24gNC4wLjAgKHRoYW5rcyB0byBwYXRjaGVzIGZyb20gT3Jpb24gUG9wbGF3c2tpKS4KCjIwMTUtMDctMDc6IHdzZnVsdG9uCgkgICAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIGEgd3JhcHBlciBmb3IgYSBjbGFzcycgY29uc3RydWN0b3IgaWYgdGhhdCBjbGFzcyBoYXMKICAgICAgICAgICAgYW55IGJhc2UgY2xhc3Mgd2l0aCBhIHByaXZhdGUgZGVzdHJ1Y3Rvci4gVGhpcyBpcyBiZWNhdXNlIHlvdXIgY29tcGlsZXIgc2hvdWxkCiAgICAgICAgICAgIG5vdCBhbGxvdyBhIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZCBpZiBhIGJhc2UgaGFzIGEgcHJpdmF0ZSBkZXN0cnVjdG9yLiBTb21lCiAgICAgICAgICAgIGNvbXBpbGVycyBkbywgc28gaWYgeW91IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIsIHVzZSB0aGUgIm5vdGFic3RyYWN0IiBmZWF0dXJlLCBlZzoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGFic3RyYWN0IikgRGVyaXZlZDsKICAgICAgICAgICAgICBjbGFzcyBCYXNlIHsKICAgICAgICAgICAgICAgIH5CYXNlKCkge30KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7fTsKClZlcnNpb24gMy4wLjYgKDUgSnVsIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTA3LTAyOiB3c2Z1bHRvbgoJICAgIEZpeCBzeW50YXggZXJyb3Igd2hlbiB0aGUgdGVtcGxhdGUga2V5d29yZCBpcyB1c2VkIGluIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgc3RkOjp0ZW1wbGF0ZSB2ZWN0b3I8aW50PiB2OwoKMjAxNS0wNy0wMjogbmdsYWRpdHoKCSAgICBbTHVhXSBQdXNoIGNoYXJhY3RlcnMgYXMgdW5mb3JtYXR0ZWQgMS1jaGFyYWN0ZXIgc3RyaW5ncyB0byBhdm9pZAoJICAgIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgc3VjaCBhcyAoY2hhcikxMjcgYmVpbmcgY29udmVydGVkIHRvCgkgICAgIjxcMTI3PiIgd2l0aCBMdWEgNS4zIGFuZCBsYXRlci4gIChnaXRodWIgUFIgIzQ1MikKCjIwMTUtMDYtMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXByb3ZlIGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UgaW4gJXB5dGhvbmNvZGUuCgoJICAgIFByZXZpb3VzbHkgU1dJRyBsb29rZWQgYXQgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBmaXJzdCBsaW5lIGFuZAoJICAgIHJlbW92ZWQgdGhhdCBtYW55IGNoYXJhY3RlcnMgZnJvbSBlYWNoIHN1YnNlcXVlbnQgbGluZSwgcmVnYXJkbGVzcwoJICAgIG9mIHdoYXQgdGhvc2UgY2hhcmFjdGVycyB3ZXJlLiAgVGhpcyB3YXMgbWFkZSB3b3JzZSBiZWNhdXNlIFNXSUcncwoJICAgIHByZXByb2Nlc3NvciByZW1vdmVzIGFueSB3aGl0ZXNwYWNlIGJlZm9yZSBhICcjJy4gIEZpeGVzIGdpdGh1YgoJICAgIGlzc3VlICMzNzksIHJlcG9ydGVkIGJ5IEpvZSBPcnRvbi4KCjIwMTUtMDYtMTI6IHdzZnVsdG9uCgkgICAgW1JdIEZpeCAjNDMwIC0gY2FsbCB0byBTV0lHX2NyZWF0ZU5ld1JlZiBpbiBjb3B5VG9DIHdhcyBpbmNvcnJlY3RseSBuYW1lZC4KCjIwMTUtMDYtMTE6IHNnaGlyYXRlCgkgICAgW0MjXSBQYXRjaCAjNDI3IGFkZHMgaW4gbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLW91dGZpbGUgdG8gY29tYmluZSBhbGwgdGhlCiAgICAgICAgICAgIGdlbmVyYXRlZCBDIyBjb2RlIGludG8gYSBzaW5nbGUgZmlsZS4KCjIwMTUtMDYtMDk6IHdzZnVsdG9uCgkgICAgRml4IHNlZyBmYXVsdCBwcm9jZXNzaW5nIEMrKzExIHR5cGUgYWxpYXNpbmcuIElzc3VlICM0MjQuCgoyMDE1LTA1LTI4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEFkZCBuZXcgZmVhdHVyZSAicHl0aG9uOmNkZWZhdWx0YXJncyIgdG8gY29udHJvbCBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbi4gQnkgZGVmYXVsdCwgU1dJRyBhdHRlbXB0cyB0byBjb252ZXJ0IEMvQysrIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzCiAgICAgICAgICAgIGludG8gUHl0aG9uIHZhbHVlcyBhbmQgZ2VuZXJhdGVzIGNvZGUgaW50byB0aGUgUHl0aG9uIGxheWVyIHdpdGggdGhlc2UgdmFsdWVzLgogICAgICAgICAgICBSZWNlbnQgdmVyc2lvbnMgb2YgU1dJRyBhcmUgYWJsZSB0byBjb252ZXJ0IG1vcmUgb2YgdGhlc2UgdmFsdWVzLCBob3dldmVyLCB0aGUKICAgICAgICAgICAgbmV3IGJlaGF2aW91ciBjYW4gYmUgY2lyY3VtdmVudGVkIGlmIGRlc2lyZWQgdmlhIHRoaXMgbmV3IGZlYXR1cmUsIHN1Y2ggdGhhdAogICAgICAgICAgICB0aGUgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIEMgbGF5ZXIgYW5kIG5vdCB0aGUgUHl0aG9uIGxheWVyLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IENEQSB7CiAgICAgICAgICAgICAgICBpbnQgZmZmKGludCBhID0gMSwgYm9vbCBiID0gZmFsc2UpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZGVmYXVsdCBjb2RlIGdlbmVyYXRpb24gaW4gdGhlIFB5dGhvbiBsYXllciBpczoKCiAgICAgICAgICAgICAgY2xhc3MgQ0RBKF9vYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZGVmIGZmZihzZWxmLCBhPTEsIGI9RmFsc2UpOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0X2FyZ3MuQ0RBX2ZmZihzZWxmLCBhLCBiKQoKICAgICAgICAgICAgQWRkaW5nIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOmNkZWZhdWx0YXJncyIpIENEQTo6ZmZmOwoKICAgICAgICAgICAgUmVzdWx0cyBpbjoKCiAgICAgICAgICAgICAgY2xhc3MgQ0RBKF9vYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZGVmIGZmZihzZWxmLCAqYXJncyk6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRfYXJncy5DREFfZmZmKHNlbGYsICphcmdzKQoKICAgICAgICAgICAgU29tZSBjb2RlIGdlbmVyYXRpb24gbW9kZXMsIGVnIC1idWlsdGluIGFuZCAtZmFzdHByb3h5LCBhcmUgdW5hZmZlY3RlZCBieSB0aGlzIGFzCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYWx3YXlzIG9idGFpbmVkIGZyb20gdGhlIEMgbGF5ZXIuCgoyMDE1LTA1LTI3OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIERlYWwgd2l0aCBhbiBpbnRlZ2VyIGFzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgdHlwZWRlZiB0byBib29sCgkgICAgcGFyYW1ldGVyIGluIHRoZSBDKysgcHJvdG90eXBlLiAgU2VlICMzMjcuIFJlZ3Jlc3Npb24gZnJvbSAzLjAuMCBvbndhcmRzLgoKMjAxNS0wNS0xOTogb2xseQoJICAgIFtQeXRob25dIEZpeCB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlIHdpdGggTVNWQy4KCSAgICAoRml4ZXMgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL3BhdGNoZXMvMzUxLyByZXBvcnRlZCBieQoJICAgIE1hdGV1c3ogU3p5bWG/c2tpKS4KCjIwMTUtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc2hhcmVkX3B0ciBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiAKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIHRoZSAidW5yZWYiIGZlYXR1cmUgd2hlbiB1c2VkIG9uIGNsYXNzZXMgd2l0aCBwcml2YXRlIGRlc3RydWN0b3JzLgoKMjAxNS0wNS0xMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcyAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKQogICAgICAgICAgICBzbyB0aGF0IHRoZXkgY2FuIGJlIGFwcGxpZWQgdG8gYSB3aWRlciByYW5nZSBvZiB0eXBlcy4gRml4ZXMgIzM4NS4KCjIwMTUtMDUtMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBEZWFsIHdpdGggYW4gaW50ZWdlciBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGJvb2wKCSAgICBwYXJhbWV0ZXIgaW4gdGhlIEMrKyBwcm90b3R5cGUuICBGaXhlcyBnaXRodWIgIzMyNywgcmVwb3J0ZWQgYnkKCSAgICBHcmVnIEFsbGVuLgoKMjAxNS0wNS0wNzogTGluZGxleUYKCSAgICBbSmF2YV0gQWxsb3cgZmVhdHVyZSgiZGlyZWN0b3IiKSBhbmQgZmVhdHVyZSgicmVmIikgdG8gYmUgdXNlZAoJICAgIHRvZ2V0aGVyLiAgR2l0aHViIFBSIzQwMy4KCjIwMTUtMDUtMDU6IG9sbHkKCSAgICBTdXBwcmVzcyB3YXJuaW5nIDMyNSAiTmVzdGVkIGNsYXNzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChGb28KCSAgICBpZ25vcmVkKSIgd2hlbiBGb28gaGFzIGFscmVhZHkgYmVlbiBleHBsaWNpdGx5IGlnbm9yZWQgd2l0aCAiJWlnbm9yZSIuCgoyMDE1LTA1LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgZnJpZW5kIHRlbXBsYXRlcywgaW5jbHVkaW5nIG9wZXJhdG9yIG92ZXJsb2FkaW5nIC0gZml4ZXMgIzE5Ni4gQ29uc2lkZXJpbmcKICAgICAgICAgICAgdGhlIGV4YW1wbGUgYmVsb3csIHByZXZpb3VzbHkgdGhlIG9wZXJhdG9yIGdhdmUgYSBzeW50YXggZXJyb3IgYW5kIGZyaWVuZGZ1bmMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgd2FybmVkIHdpdGg6CgogICAgICAgICAgICAgIldhcm5pbmcgNTAzOiBDYW4ndCB3cmFwICdmcmllbmRmdW5jPChUeXBlKT4nIHVubGVzcyByZW5hbWVkIHRvIGEgdmFsaWQgaWRlbnRpZmllci4iCgogICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPiBjbGFzcyBNeUNsYXNzIHsKICAgICAgICAgICAgICAgIGZyaWVuZCBpbnQgZnJpZW5kZnVuYyA8VHlwZT4oZG91YmxlIGlzLCBNeUNsYXNzIDxUeXBlPiAmIHgpOwogICAgICAgICAgICAgICAgZnJpZW5kIGludCBvcGVyYXRvcjw8IDxUeXBlPihkb3VibGUgdW4sIGNvbnN0IE15Q2xhc3MgPFR5cGU+ICZ4KTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBhbHNvIHByZXZpb3VzbHkgaW5jb3JyZWN0bHkgd2FybmVkIHdpdGg6CgogICAgICAgICAgICAgICJXYXJuaW5nIDMwMjogSWRlbnRpZmllciAndGVtcGxhdGVfZnJpZW5kJyByZWRlZmluZWQgKGlnbm9yZWQpLCIKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCB0ZW1wbGF0ZV9mcmllbmQoVCk7CiAgICAgICAgICAgICAgc3RydWN0IE15VGVtcGxhdGUgewogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gZnJpZW5kIFQgdGVtcGxhdGVfZnJpZW5kKFQpOwogICAgICAgICAgICAgIH07CgoyMDE1LTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaGFuZGxpbmcgb2YgY29udmVyc2lvbiBvcGVyYXRvcnMgd2hlcmUgdGhlIG9wZXJhdG9yIGlzIHNwbGl0IG92ZXIgbXVsdGlwbGUKICAgICAgICAgICAgbGluZXMgb3IgaGFzIGNvbW1lbnRzIHdpdGhpbiB0aGUgb3BlcmF0b3IgdHlwZS4gRml4ZXMgIzQwMS4KCiAgICAgICAgICAgIEFsc28gZml4IHNpbWlsYXIgcHJvYmxlbSB3aXRoIG5vcm1hbCBvcGVyYXRvcnMgd2hpY2ggZ2F2ZSBhIHN5bnRheCBlcnJvciBpZiBzcGxpdCBvdmVyCiAgICAgICAgICAgIG11bHRpcGxlIGxpbmVzIG9yIGhhZCBhIGNvbW1lbnQgd2l0aGluIHRoZSBvcGVyYXRvciBkZWNsYXJhdGlvbi4KCjIwMTUtMDQtMzA6IG9sbHkKCSAgICBJZ25vcmUgdW5rbm93biBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB3aGljaCBhcmUgaW5zaWRlIGFuIGluYWN0aXZlCgkgICAgY29uZGl0aW9uYWwgKGdpdGh1YiBpc3N1ZSAjMzk0LCByZXBvcnRlZCBieSBEYW4gV2lsY294KS4KCSAgICBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMy4wLjMuCgoyMDE1LTA0LTI3OiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAiZGVmYXVsdCIgdHlwZW1hcCB1c2VkIGFmdGVyIGFuIGFyZ3VtZW50IHdpdGggIm51bWlucHV0cz0wIiAoIzM3NykuCgoyMDE1LTA0LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI1Ni4gQ29kZSBnZW5lcmF0ZWQgd2l0aCAnLWJ1aWx0aW4gLW1vZGVybmFyZ3MnIHNlZ2ZhdWx0cyBmb3IgYW55CiAgICAgICAgICAgIG1ldGhvZCB0YWtpbmcgemVybyBhcmd1bWVudHMuCgogICAgICAgICAgICBBbHNvIGZpeGVzOiAiU3lzdGVtRXJyb3I6IGVycm9yIHJldHVybiB3aXRob3V0IGV4Y2VwdGlvbiBzZXQiIGR1cmluZyBlcnJvciBjaGVja2luZwogICAgICAgICAgICB3aGVuIHVzaW5nIGp1c3QgLWJ1aWx0aW4gYW5kIHRoZSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBwYXNzZWQgdG8gYSBjbGFzcwogICAgICAgICAgICBtZXRob2QgZXhwZWN0aW5nIHplcm8gYXJndW1lbnRzLgoKMjAxNS0wNC0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEJ1ZyAjMzg2IC0gTWVtb3J5IGxlYWsgZml4IGluIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzLgoKMjAxNS0wNC0yMzogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBNYWtlICJkZWZhdWx0IiB0eXBlbWFwIHdvcmsgYWdhaW4gKCMzMzAsICMzNzcpLgoKMjAxNS0wNC0yMzogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHVzZSBvZiBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHBvaW50ZXIgdHlwZXMgKCMzNjUsICMzNzYpLgoKMjAxNS0wNC0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICdtYWtlIGNoZWNrLWNjYWNoZScgd2hpY2ggaXMgcGFydCBvZiAnbWFrZSBjaGVjaycgd2hlbiBvbmUgb2YgdGhlIENDQUNIRV8KICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBmb3IgZXhhbXBsZSBDQ0FDSEVfRElTQUJMRSwgaXMgc2V0LgoKMjAxNS0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgQ2xlYXJlciB3YXJuaW5nIG1lc3NhZ2UgZm9yIGJhZGx5IGNvbnN0cnVjdGVkIHR5cGVjaGVjayB0eXBlbWFwcy4gRm9yIGV4YW1wbGUsIHdhczoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM6IFdhcm5pbmcgNDY3OiBPdmVybG9hZGVkIGZvbyhpbnQpIG5vdCBzdXBwb3J0ZWQgKG5vIHR5cGUgY2hlY2tpbmcKICAgICAgICAgICAgICBydWxlIGZvciAnaW50JykuCgogICAgICAgICAgICBOb3c6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozOiBXYXJuaW5nIDQ2NzogT3ZlcmxvYWRlZCBmb28oaW50KSBub3Qgc3VwcG9ydGVkIChpbmNvbXBsZXRlIHR5cGUgY2hlY2tpbmcKICAgICAgICAgICAgICBydWxlIC0gbm8gcHJlY2VkZW5jZSBsZXZlbCBpbiB0eXBlY2hlY2sgdHlwZW1hcCBmb3IgJ2ludCcpLgoKMjAxNS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCAjMzUzIC0gTGlua2VyIG11bHRpcGxlIGRlZmluaXRpb24gb2YgJ0V4Y2VwdGlvbk1hdGNoZXMnIHdoZW4KICAgICAgICAgICAgdXNpbmcgZGlyZWN0b3JzIGFuZCBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxNS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgTWVyZ2UgIzMyMCAtIE1ha2UgX19kaWN0X18gYWNjZXNzaWJsZSBmb3IgUHl0aG9uIGJ1aWx0aW4gY2xhc3Nlcy4KCjIwMTUtMDQtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzc1IC0gcGFyc2luZyBvZiBleHRlcm4gIkMiIGFuZCB0eXBlZGVmIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGV4dGVybiAiQyIgdHlwZWRlZiB2b2lkICgqSG9vazJfdCkoaW50LCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgIGV4dGVybiAiQyIgdHlwZWRlZiBpbnQgSW50ZWdlcjsKCjIwMTUtMDMtMTI6IG9sbHkKCSAgICAtRFNXSUdfRElSRUNUT1JfU1RBVElDIGlzIG5vdyBzdXBwb3J0ZWQgZm9yIGFsbCBsYW5ndWFnZXMgd2l0aAoJICAgIGRpcmVjdG9yIHN1cHBvcnQsIG5vdCBvbmx5IFB5dGhvbiBhbmQgUEhQLgoKMjAxNS0wMy0wMjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAtY2dvIG9wdGlvbiwgcmVxdWlyZWQgZm9yIEdvIHZlcnNpb25zIDEuNSBhbmQKCSAgICBsYXRlci4KCjIwMTUtMDItMjY6IG9sbHkKCSAgICBGaXggc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gdG9wPT1OVUxMLCBpbnRyb2R1Y2VkIGJ5IG5lc3RlZCBjbGFzcwoJICAgIGhhbmRsaW5nIChyZXBvcnRlZCBpbiBpc3N1ZSMzNDYgYnkgUGF3Zb8gVG9tdWxpaykuCgoyMDE1LTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbR3VpbGVdIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3Igc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcyB3aGVuCiAgICAgICAgICAgIGRlZmluZWQgYW5kIGRlY2xhcmVkIGlubGluZS4KCjIwMTUtMDItMDk6IG1pc2hhcwogICAgICAgICAgICBbR29dIEZpeCAlaW1wb3J0IG9mIGZpbGVzIGluIHN1YiBkaXJlY3Rvcmllcy4KCjIwMTUtMDItMDU6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gSWdub3JlIEdvIHNwZWNpZmljIHR5cGUgbWFwcyAoZ29pbiwgZ29vdXQsIGV0Yy4pIGlmIHRoZXkgYXJlIGVtcHR5LgoKMjAxNS0wMi0wNTogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBHZW5lcmF0ZWQgR28gY29kZSBubyBsb25nZXIgY2FsbHMgX3N3aWdfZ29hbGxvY2F0ZSBvcgogICAgICAgICAgICBfc3dpZ19tYWtlZ29zdHJpbmcsIGFzIHRoZXkgd2lsbCBubyBsb25nZXIgd29yayBhcyBvZiBHbyAxLjUuCgpWZXJzaW9uIDMuMC41ICgzMSBKYW4gMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTAxLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggUHl0aG9uIC1jbGFzc2ljIGFuZCBwcm9wZXJ0eSBzZXR0aW5nLiBTZXR0aW5nIHByb3BlcnRpZXMgb24gY2xhc3NpYyBjbGFzc2VzCiAgICAgICAgICAgIHdhcyBicm9rZW4gaW4gc3dpZy0zLjAuMyBieSBhdHRlbXB0aW5nIHRvIHVzZSBfX3NldGF0dHJfXy4gVGhpcyByZWdyZXNzaW9uIGlzIGZpeGVkIG5vdwogICAgICAgICAgICBieSB1c2luZyBfX2RpY3RfXyBhZ2FpbiB3aGVuIHVzaW5nIC1jbGFzc2ljLgogICAgICAgICAgICBGaXhlcyBwYXRjaCAjMjMyLgoKMjAxNS0wMS0yNzogc21hcmNoZXR0bwoJICAgIFtTY2lsYWJdIFN1cHBvcnQgZm9yIHRoZSBTY2lsYWIgbGFuZ3VhZ2UgaGFzIGJlZW4gYWRkZWQKCjIwMTUtMDEtMjM6IG9sbHkKCSAgICBbUEhQXSBXaGVuIHdyYXBwaW5nIGEgcmV0dXJuZWQgcmVzb3VyY2UgYXMgYW4gb2JqZWN0LCBjaGVjayBpZiBhbGwKCSAgICBjYXNlcyB3cmFwIGl0IGluIHRoZSBzYW1lIGNsYXNzLCBhbmQgaWYgc28gZWxpbWluYXRlIHRoZSBwb2ludGxlc3MKCSAgICBzd2l0Y2ggc3RhdGVtZW50IHdyYXBwZXIgd2UgcHJldmlvdXNseSBnZW5lcmF0ZWQuCgoyMDE1LTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBNZXJnZSBwYXRjaCAjMjk3IGZvciBTRiBidWcgIzEyNzcgLSBPY3RhdmUgc2hhcmVkX3B0ciBzdXBwb3J0CgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBNZXJnZSBwYXRjaCAjMjUwIC0gRml4ZXMgZm9yIHVzaW5nICVjb25zdGFudCBhbmQgb2JqZWN0cyAobm9uLXByaW1pdGl2ZSB0eXBlcykKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBHb10gTWVyZ2UgcGF0Y2ggIzMwOCBhbmQgZml4ICMzMDcgLSBDKysxMSBzdHJvbmdseSB0eXBlZCBlbnVtIHN1cHBvcnQKICAgICAgICAgICAgaW4gZGlyZWN0b3JzCgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBTZWNvbmQgZml4IGZvciAjMjk0ICMyOTYgLSBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gU1dJRy0zLjAuMyB3aGVuCiAgICAgICAgICAgIHdyYXBwaW5nIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLCB0aGlzIHRpbWUgd2hlbiB1c2luZyBrd2FyZ3MuCgpWZXJzaW9uIDMuMC40ICgxNCBKYW4gMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTAxLTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ2ZhdWx0IGluIGRpcmVjdG9yIHVwY2FsbCBjaGVjayB3aGVuIHVzaW5nIFBIUCBidWlsdCB3aXRoCgkgICAgWlRTIGVuYWJsZWQuICBGaXhlcyAjMTU1LCByZXBvcnRlZCBieSBQaWVycmUgTGFiYXN0aWUuCgoyMDE1LTAxLTEyOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjk0ICMyOTYgLSBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gU1dJRy0zLjAuMyB3aGVuCiAgICAgICAgICAgIHdyYXBwaW5nIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLiBJbnZhbGlkIG9yIG1pc3NpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgd2VyZSBzb21ldGltZXMgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlIHB5dGhvbiBsYXllci4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBBbGxvdyBDKysxMSAiZXhwbGljaXQgY29uc3RleHByIi4gIEZpeGVzIGdpdGh1YiBpc3N1ZSAjMjg0IHJlcG9ydGVkCgkgICAgYnkgUGF3ZWwgVG9tdWxpay4gIEFsc28gaGFuZGxlICJjb25zdGV4cHIgZXhwbGljaXQiIGFuZCAiY29uc3RleHByCgkgICAgc3RhdGljIi4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBXaGVuIHJlcG9ydGluZyBhbiBlcnJvciBmb3IgYSBjb25zdHJ1Y3Qgd2hpY2ggaGFzbid0IGJlZW4KCSAgICB0ZXJtaW5hdGVkIHdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkLCByZXBvcnQgaXQgYXQgdGhlCgkgICAgc3RhcnQgbGluZSByYXRoZXIgdGhhbiAiRU9GIiBhcyB0aGVuIHRvb2xzIGxpa2UgZWRpdG9ycyBhbmQgSURFcwoJICAgIHdpbGwgdGFrZSB5b3UgdG8gYSBnZW5lcmFsbHkgbW9yZSB1c2VmdWwgcGxhY2UgZm9yIGZpeGluZyB0aGUKCSAgICBwcm9ibGVtLgoKMjAxNS0wMS0wODogb2xseQoJICAgIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgZm9yIGEgZmV3IGNhc2VzIHdoaWNoIHByZXZpb3VzbHkgZ2F2ZSB0aGUKCSAgICBvbmUgb2YgdGhlIGNyeXB0aWMgY2F0Y2gtYWxsIGVycm9ycyAiU3ludGF4IGVycm9yIGluIGlucHV0Ii4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBQcm92aWRlIC1jcHBleHQgYXMgYSBnZW5lcmFsIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHNldHRpbmcgdGhlCgkgICAgZXh0ZW5zaW9uIHVzZWQgZm9yIGdlbmVyYXRlZCBDKysgZmlsZXMgKHByZXZpb3VzbHkgaXQgd2FzIHNwZWNpZmljCgkgICAgdG8gdGhlIFBIUCBiYWNrZW5kKS4gIERlcHJlY2F0ZSB0aGUgZXF1aXZhbGVudCAtc3VmZml4IG9wdGlvbgoJICAgIHByb3ZpZGVkIGJ5IHRoZSBPY2FtbCBiYWNrZW5kLCBidXQgY29udGludWUgdG8gc3VwcG9ydCB0aGF0IGZvcgoJICAgIG5vdy4KClZlcnNpb24gMy4wLjMgKDMwIERlYyAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMTItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjgwIC0gYWJvcnQgdXNpbmcgYWxsIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoaW4gb3RoZXIgdGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycy4KCjIwMTQtMTItMjc6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBJc3N1ZSAjMjgyIHBlcmw1IGFyY2hsaWIgdnMgYXJjaGxpYmV4cAogICAgICAgICAgICBbUGVybF0gdGlkeSAid2FybmluZzogZHVwbGljYXRlICdleHRlcm4nIGRlY2xhcmF0aW9uIHNwZWNpZmllciIgd2hlbiBidWlsZGluZyBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICB1bmRlciBjbGFuZwoKMjAxNC0xMi0xODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yICVjb25zdGFudCBhbmQgc3RydWN0cy9jbGFzc2VzIC0gaXNzdWUgIzI3MgoKMjAxNC0xMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNDUgLSByZWdyZXNzaW9uIChzaW5jZSBzd2lnLTMuMC4wKSBpbiB0ZW1wbGF0ZWQgY29uc3RydWN0b3JzLgogICAgICAgICAgICBUZW1wbGF0ZWQgY29uc3RydWN0b3JzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgLSB0aGV5IHdlcmUgaW5jb3JyZWN0bHkgaWdub3JlZCB3aXRoIGEgd2FybmluZyA1MDQ6CiAgICAgICAgICAgICJGdW5jdGlvbjogeHl6IG11c3QgaGF2ZSBhIHJldHVybiB0eXBlLiBJZ25vcmVkLiIKCjIwMTQtMTItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBDKysxMSBzdHJvbmdseSB0eXBlZCBlbnVtZXJhdGlvbnMuCgoyMDE0LTExLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRml4IG11bHRpcGx5IGRlZmluZWQgZXJyb3Igd2hlbiB1c2luZyAlcmVuYW1lIG9mIGVudW0gaXRlbXMgd2hlbiB1c2luZyB0aGUgInNpbXBsZSBlbnVtIgogICAgICAgICAgICB3cmFwcGVycy4KCjIwMTQtMTAtMjg6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIwMSBUaGUgZ2VuZXJhdGVkIC5weSBmaWxlIG5vIGxvbmdlciB1c2VzICphcmdzIGZvciBhbGwgUHl0aG9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIEluc3RlYWQsIHRoZSBwYXJhbWV0ZXJzIGFyZSBuYW1lZCB1c2luZyB0aGUgQysrIHBhcmFtZXRlciBuYW1lcy4KCiAgICAgICAgICAgICJjb21wYWN0ZGVmYXVsdGFyZ3MiIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgdG8gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW91ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNC0xMC0yNDogdGltb3RoZWVjb3VyCiAgICAgICAgICAgIFtEXSBQYXRjaCAjMjA0IFVzZSBjb3JlLmF0b21pYy5hdG9taWNPcCB0byBtdXRhdGUgc2hhcmVkIHZhcmlhYmxlcwoKMjAxNC0xMC0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGlzc3VlICMyNDIgLSBVc2Ugb2YgdGhlICJrd2FyZ3MiIGZlYXR1cmUgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgdHVybnMgb24gdGhlCiAgICAgICAgICAgICJjb21wYWN0ZGVmYXVsdGFyZ3MiIGZlYXR1cmUgaWYgdGhlIHRhcmdldCBsYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IGt3YXJncy4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWZmZWN0cyBhbGwgbGFuZ3VhZ2VzIGV4Y2VwdCBQeXRob24gYW5kIFJ1YnkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTEwLTEwOiBkaW9yY2V0eQogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMjMyIEZpeCBwcm9wZXJ0eSBhY2Nlc3MgdXNpbmcgZGlyZWN0b3JzCgoyMDE0LTEwLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXhlcyB3aGVuIHVzaW5nIC1idWlsdGluIGFuZCBzdGQ6OnZlY3Rvci9zdGQ6Omxpc3Qgd3JhcHBlcnMgdG8gYWxsb3cgZGVsZXRpb24KICAgICAgICAgICAgb2Ygc2luZ2xlIGVsZW1lbnRzLCBzdWNoIGFzICdkZWwgdmVjWzBdJy4KCjIwMTQtMDktMzA6IG9saXZlcmIKICAgICAgICAgICAgW0phdmFzY3JpcHRdIE1lcmdlIHBhdGNoICMyMTYgYnkgUmljaGllNzY1IC0gQWRkZWQgc3VwcG9ydCBmb3IgbWFueSB2ZXJzaW9ucyBvZiB2OCBqYXZhc2NyaXB0LgoKMjAxNC0wOS0zMDogb2xpdmVyYgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gTWVyZ2UgcGF0Y2ggIzE5NSBieSB6aXR0aXggLSBGaXhlZCBKU0NsYXNzUmVmIGRlY2xhcmF0aW9uIG5vdCB1c2luZyB0aGUgc3RhdGljIG9uZS4KCjIwMTQtMDktMzA6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBJbiBjb25maWd1cmUgc2NyaXB0LCByZXF1aXJlIEdvIDEuMSBvciBsYXRlci4KCjIwMTQtMDktMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMDcgLSBGaXggTm8gbW9kdWxlIGVycm9yIHdpdGggLXJlbGF0aXZlaW1wb3J0IHdoZW4gdXNpbmcgc2luZ2xlCiAgICAgICAgICAgIGhlYWRlciBmaWxlIGltcG9ydC4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICMyMDggLSBJbml0aWFsaXNlIG5ld2x5IGNyZWF0ZWQgYXJyYXkgd2hlbiB1c2luZyBhcnJheV9mdW5jdGlvbnMgaW4gdGhlCiAgICAgICAgICAgIGNhcnJheXMuaSBsaWJyYXJ5IChDKysgdXNhZ2UpLgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFBhdGNoICMxODcgLSBGaXggY3Jhc2ggb24gc2h1dGRvd24gb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgaWYgbW9yZSB0aGFuIG9uZQogICAgICAgICAgICBtb2R1bGUgd2FzIGxvYWRlZCBhdCBhIHRpbWUgd2hlbiBkYXRhIGlzIGJlaW5nIHNoYXJlZCBiZXR3ZWVuIG1vZHVsZXMuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzE2OCAtIEZpeCBsZWFrIGluIEphdmEgZGlyZWN0b3Igc3RyaW5nIGhhbmRsaW5nIGFmdGVyIHRoZSBKYXZhCiAgICAgICAgICAgIHVwY2FsbCB3aGVuIGNhbGxlZCBmcm9tIGEgbmF0aXZlIHRocmVhZC4KCjIwMTQtMDktMjU6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGp1c3QgZ2VuZXJhdGVkIGNvZGUgdG8gd29yayB3aXRoIHVwY29taW5nIEdvIDEuNAoJICAgIHJlbGVhc2UuCgoyMDE0LTA5LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgcGF0Y2ggZnJvbSBUaG9tYXMgTWFzbGFjaCB0byBmaXggY3Jhc2ggaW4gd3JhcHBlcnMgd2hlbiB1c2luZyAtdGhyZWFkcyBpbgogICAgICAgICAgICB0aGUgU1RMIGl0ZXJhdG9ycyAoU3dpZ1B5SXRlcmF0b3IgZGVzdHJ1Y3RvcikuCgoyMDE0LTA5LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1lcmdlIHBhdGNoICMyMjkgZnJvbSBjb250cmUgLSBBZGQgYm9vbCBhcnJheSB0eXBlcyB0byBhcnJheXNfY3NoYXJwLmkKCjIwMTQtMDktMTI6IG9sbHkKCSAgICBbUEhQXSBBZGQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyBhbnkgUEhQIGludGVyZmFjZXMgYSB3cmFwcGVkIGNsYXNzCgkgICAgaW1wbGVtZW50cywgZS5nLjogJXR5cGVtYXAoInBocGludGVyZmFjZXMiKSBNeUl0ZXJhdG9yICJJdGVyYXRvciI7CgoyMDE0LTA5LTExOiBvbGx5CgkgICAgW1BIUF0gRml4IHRocm93aW5nIGEgUEhQIGV4Y2VwdGlvbiB0aHJvdWdoIEMrKyBmcm9tIGEgc3ViY2xhc3NlZAoJICAgIGRpcmVjdG9yIG1ldGhvZCAtIFBIUCBOVUxMIGdldHMgcmV0dXJuZWQgYnkgdGhlIHN1YmNsYXNzZWQgbWV0aG9kCgkgICAgaW4gdGhpcyBjYXNlLCBzbyB0aGUgZGlyZWN0b3JvdXQgdHlwZW1hcCBuZWVkcyB0byBhbGxvdyB0aGF0IChhdAoJICAgIGxlYXN0IGlmIGFuIGV4Y2VwdGlvbiBpcyBhY3RpdmUpLgoKMjAxNC0wOS0wOTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBnb2FyZ291dCB0eXBlbWFwLgoKMjAxNC0wOS0wOTogb2xseQoJICAgIFtQSFBdIEZpeCBzZWdtZW50YXRpb24gZmF1bHRzIHdpdGggZGlyZWN0b3JzIGluIFBIUCA+PSA1LjQsIGFuZAoJICAgIHJlZW5hYmxlIHJ1bm1lIHRlc3RzIGZvciBkaXJlY3Rvcl9iYXNpYyB0ZXN0Y2FzZS4gIEZpeCBmcm9tCgkgICAgcGF2ZWwtY2hhcnZhdCBpbiBpc3N1ZSMxNjQuCgoyMDE0LTA5LTA1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIGltdHlwZSwgZ29pbiwgZ29vdXQsIGdvZGlyZWN0b3JpbiwgYW5kCgkgICAgZ29kaXJlY3Rvcm91dCB0eXBlbWFwcywgdG8gc3VwcG9ydCB3cml0aW5nIEdvIGNvZGUgdG8KCSAgICBjb252ZXJ0IGJldHdlZW4gdHlwZXMuCgoyMDE0LTA5LTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHJlZ3Jlc3Npb24gaW4gaW5kZW50YXRpb24gb2YgcHl0aG9uIGNvZGUgcHJvZHVjZWQgd2l0aAoJICAgIC1tb2Rlcm4sIGludHJvZHVjZWQgYnkgY2hhbmdlcyBpbiAjMTg4LiAgUmVwb3J0ZWQgYnkgZmFiaWVuY2FzdGFuCgkgICAgaW4gIzIxOC4KCjIwMTQtMDktMDE6IG9sbHkKCSAgICBJc3N1ZSBhbiBlcnJvciBmb3IgdW5rbm93biBTV0lHIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLCByYXRoZXIKCSAgICB0aGFuIHF1aWV0bHkgaWdub3JpbmcgdGhlbS4gIFJlcG9ydGVkIGJ5IGpyaGVsc2V5IGluIGlzc3VlIzIxNy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDgtMTU6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBJbmNsdWRlIGd1YXJkIGZpeCBmb3IgbmVzdGVkIG1vZHVsZXMgZnJvbSBBbnRob255IEhlYWRpbmcgKFNGIFBhdGNoICMzNTApLgoKMjAxNC0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNZXJnZSBwYXRjaCAjMjAwIGZyb20gZ3BldHJvdSAtIENoYW5nZWQgQ1NoYXJwIGxpY2Vuc2UgaGVhZGVyIHRvIGluY2x1ZGUgYXV0by1nZW5lcmF0ZWQKICAgICAgICAgICAgdGFnIHNvIHRoYXQgU3R5bGVDb3AgaWdub3JlcyB0aGUgZmlsZXMuCgoyMDE0LTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTWVyZ2UgcGF0Y2ggIzE5OCBmcm9tIFl1dmFsIEthc2h0YW4gLSBTdXBwb3J0IGZvciBqYXZhLm5pby5CeXRlQnVmZmVyIG1hcHBpbmcgdG8KICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIGluIHZhcmlvdXMuaSBpbiBOSU9CVUZGRVIgdHlwZW1hcHMuCgoyMDE0LTA3LTE0OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQ2hhbmdlIHN0cnVjdCBkZWZpbml0aW9uIHRvIHVzZSB2b2lkICosIG5vdCB1aW50OCwgc28KCSAgICB0aGF0IHRoZSB0eXBlIGlzIHJlY29yZGVkIGFzIHBvc3NpYmx5IGNvbnRhaW5pbmcKCSAgICBwb2ludGVycy4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSAxLjMgZ2FyYmFnZSBjb2xsZWN0b3IKCSAgICBkb2VzIG5vdCBjb2xsZWN0IHBvaW50ZXJzIHBhc3NlZCB0byBDKysgY29kZS4KCjIwMTQtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiBCdWcgIzEzNzUgLSBFeHBhbnNpb24gb2YgdGhlICRwYXJlbnRjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZSBpbmNvcnJlY3RseSBjb250YWlucwogICAgICAgICAgICBicmFja2V0cyBpbiB0aGUgZXhwYW5kZWQgbmFtZS4KClZlcnNpb24gMy4wLjIgKDQgSnVuIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTA2LTAyOiB2LWZvci12YW5kYWwKICAgICAgICAgICAgW0x1YV0gUHVsbCByZXF1ZXN0ICMxNzY6CiAgICAgICAgICAgIElmIGNsYXNzIGhhcyBubyBfX2VxIGltcGxlbWVudGVkLCB0aGVuIGRlZmF1bHQgX19lcSBpcyBnZW5lcmF0ZWQuIAogICAgICAgICAgICBEZWZhdWx0IF9fZXEgY29tcGFyZXMgYWN0dWFsIHBvaW50ZXJzIHN0b3JlZCBpbnNpZGUgTHVhIHVzZXJkYXRhLgoKMjAxNC0wNi0wMjogdmthbGluaW4KICAgICAgICAgICAgRml4ICMxODMgLSAlZXh0ZW5kIGFuZCB1bm5hbWVkIG5lc3RlZCBzdHJ1Y3RzCgoyMDE0LTA1LTI4OiBrd3dldHRlCiAgICAgICAgICAgIEZpeCBpbnN0YWxsIGZhaWx1cmUgd2hlbiB1c2luZyBhbiAnb3V0IG9mIHNvdXJjZScgYnVpbGQgdXNpbmcgdGhlIHNoaXBwZWQKICAgICAgICAgICAgdGFyYmFsbCAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC4xLgoKMjAxNC0wNS0yNDoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBSZW1vdmUgZGVwcmVjYXRlZCAtZ2xvYmFsLy1ub2dsb2JhbCBjb21tYW5kLWxpbmUgYXJndW1lbnRzCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgpWZXJzaW9uIDMuMC4xICgyNyBNYXkgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTA1LTI1OiBoZmFsY2ljCgkgICAgW1B5dGhvbl0gUHl0aG9uIDMgYnl0ZSBzdHJpbmcgb3V0cHV0OiB1c2UgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiCiAgICAgICAgICAgIGlmIGF2YWlsYWJsZSBvbiB0aGUgdmVyc2lvbiBvZiBQeXRob24gdGhhdCdzIGluIHVzZS4gVGhpcyBhbGxvd3MKICAgICAgICAgICAgb2J0YWluaW5nIHRoZSBvcmlnaW5hbCBieXRlIHN0cmluZyAoYW5kIHBvdGVudGlhbGx5IHRyeWluZyBhIGZhbGxiYWNrCiAgICAgICAgICAgIGVuY29kaW5nKSBpZiB0aGUgYnl0ZXMgY2FuJ3QgYmUgZGVjb2RlZCBhcyBVVEYtOC4KCiAgICAgICAgICAgIFByZXZpb3VzbHksIGEgVW5pY29kZURlY29kZUVycm9yIHdvdWxkIGJlIHJhaXNlZCB3aXRoIG5vIHdheSB0byB0cmVhdAogICAgICAgICAgICB0aGUgZGF0YSBhcyBieXRlcyBvciB0cnkgYW5vdGhlciBjb2RlYy4KCjIwMTQtMDUtMTg6IHZrYWxpbmluCgkgICAgQnVnICMxNzUgLSBSZXN0b3JlICVleHRlbmQgdG8gd29yayBmb3IgdW5uYW1lZCBuZXN0ZWQgc3RydWN0dXJlcyBieSB1c2luZyBhIEMKICAgICAgICAgICAgc3ltYm9sIGNvbXByaXNpbmcgdGhlIG91dGVyIHN0cnVjdHVyZSBuYW1lIGFuZCB1bm5hbWVkIHZhcmlhYmxlIGluc3RhbmNlIG5hbWUuCgoyMDE0LTA1LTE1OiBrd3dldHRlCgkgICAgQWRkICMxNjYgLSAnbWFrZSBjaGVjaycgbm93IHdvcmtzIG91dCBvZiBzb3VyY2UuIFRoaXMgcmVxdWlyZWQgdGhlIGV4YW1wbGVzIHRvIGJ1aWxkCiAgICAgICAgICAgIG91dCBvZiBzb3VyY2UuIFRoZSBtYWluIGxhbmd1YWdlcyBoYXZlIGJlZW4gdGVzdGVkIC0gQyMsIEdvLCBHdWlsZSwgSmF2YSwgSmF2YXNjcmlwdCwKICAgICAgICAgICAgTHVhLCBPY3RhdmUsIFBlcmwsIFBIUCwgUHl0aG9uLCBSdWJ5IGFuZCBUY2wuCgoyMDE0LTA1LTAxOiBPbGl2ZXIgQnVjaHRhbGEKCSAgICBKYXZhc2NyaXB0IHN1cHBvcnQgYWRkZWQsIHNlZSBKYXZhc2NyaXB0IGNoYXB0ZXIgaW4gdGhlIGRvY3VtZW50YXRpb24uCgoyMDE0LTA1LTAxOiBvbGx5CgkgICAgW1BIUF0gVGhlIGdlbmVyYXRlZCBfX2lzc2V0KCkgbWV0aG9kIG5vdyByZXR1cm5zIHRydWUgZm9yIHJlYWQtb25seSBwcm9wZXJ0aWVzLgoKMjAxNC0wNC0yNDoga3d3ZXR0ZQogICAgICAgICAgICBbR29dIEZpeCBnbyAuL2NvbmZpZ3VyZSBwYXJzaW5nIG9mIGdjY2dvIC0tdmVyc2lvbiwgYW5kCiAgICAgICAgICAgIGdvcnVudGltZS5zd2cgdHlwbyBpbiBfX0dOVUNfUEFUQ0hMRVZFTF9fIChTRiBCdWcgIzEyOTgpCgoyMDE0LTA0LTI0OiBrd3dldHRlCiAgICAgICAgICAgIEZpeCB7cHl0aG9ufHBlcmw1fHJ1Ynl8dGNsfS9qYXZhIGV4YW1wbGVzCgogICAgICAgICAgICBJbiBMaWIvZ2NqL2NuaS5pLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5ld2VyIGdjaiB2ZXJzaW9uczoKCiAgICAgICAgICAgIC0gcmVtb3ZlIEp2QWxsb2NPYmplY3QoKSB3aGljaCBnY2ogbm8gbG9uZ2VyIGRlZmluZXMsIGZyb20gZ2NqIENoYW5nZWxvZzoKICAgICAgICAgICAgICAyMDA0LTA0LTE2ICBCcnljZSBNY0tpbmxheSAgPG1ja2lubGF5QHJlZGhhdC5jb20+CiAgICAgICAgICAgICAgICAqIGdjai9jbmkuaCAoSnZBbGxvY09iamVjdCk6IFJlbW92ZSB0aGVzZSBvYnNvbGV0ZSwKICAgICAgICAgICAgICAgIHVuZG9jdW1lbnRlZCBDTkkgY2FsbHMuCgogICAgICAgICAgICAtIGNoYW5nZSBKdkNyZWF0ZUphdmFWTSgpIGFyZ3VtZW50IGZyb20gdm9pZCogdG8gSnZWTUluaXRBcmdzKiwgZnJvbSBnY2ogQ2hhbmdlbG9nOgogICAgICAgICAgICAgIDIwMDUtMDItMjMgIFRob21hcyBGaXR6c2ltbW9ucyAgPGZpdHpzaW1AcmVkaGF0LmNvbT4KICAgICAgICAgICAgICBQUiBsaWJnY2ovMTY5MjMKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAoSnZDcmVhdGVKYXZhVk0pOiBEZWNsYXJlIHZtX2FyZ3MgYXMgSnZWTUluaXRBcmdzKiByYXRoZXIgdGhhbiB2b2lkKi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDQtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGIEJ1ZyAjMTM2NiAtIFJlbW92ZSBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIG9mIHN0cnRvaW1heCBhbmQgc3RydG91bWF4IGluIGludHR5cGVzLmkKCjIwMTQtMDQtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBFbnVtcyB3aGljaCBoYXZlIGJlZW4gaWdub3JlZCB2aWEgJWlnbm9yZSBhbmQgYXJlIHN1YnNlcXVlbnRseQogICAgICAgICAgICB1c2VkIGFyZSBoYW5kbGVkIHNsaWdodGx5IGRpZmZlcmVudGx5LiBUeXBlIHdyYXBwZXIgY2xhc3NlcyBhcmUgbm93IGdlbmVyYXRlZAogICAgICAgICAgICB3aGljaCBhcmUgZWZmZWN0aXZlbHkgYSB3cmFwcGVyIG9mIGFuIGVtcHR5IGVudW0uIFByZXZpb3VzbHkgaW4gSmF2YSB1bmNvbXBpbGFibGUKICAgICAgICAgICAgY29kZSB3YXMgZ2VuZXJhdGVkIGFuZCBpbiBDIyBhbiBpbnQgd2FzIHVzZWQuCgoyMDE0LTA0LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcmVncmVzc2lvbiBpbiAzLjAuMCB3aGVyZSBsZWdhbCBjb2RlIGZvbGxvd2luZyBhbiBvcGVyYXRvcjw8IGRlZmluaXRpb24gbWlnaHQKICAgICAgICAgICAgZ2l2ZSBhIHN5bnRheCBlcnJvci4gU0YgQnVnICMxMzY1LgoKMjAxNC0wNC0wMzogb2xseQoJICAgIFtQSFBdIEZpeCB3cmFwcGluZyBkaXJlY3RvciBjb25zdHJ1Y3RvcnMgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMKCSAgICB3aXRoIGEgWlRTLWVuYWJsZWQgYnVpbGQgb2YgUEhQLgoKMjAxNC0wNC0wMjogb2xseQoJICAgIFtQSFBdIFBhc3MgdGhlIFpUUyBjb250ZXh0IHdlIGFscmVhZHkgaGF2ZSB0byBhdm9pZCBuZWVkaW5nIHRvCgkgICAgY2FsbCBUU1JNTFNfRkVUQ0gsIHdoaWNoIGlzIHJlbGF0aXZlbHkgZXhwZW5zaXZlLgoKMjAxNC0wNC0wMjogb2xseQoJICAgIFtQSFBdIFBhc3MgWlRTIGNvbnRleHQgdGhyb3VnaCB0byB0X291dHB1dF9oZWxwZXIoKSBzbyBpdCB3b3JrcwoJICAgIHdpdGggYSBaVFMtZW5hYmxlZCBidWlsZCBvZiBQSFAuICBSZXBvcnRlZCBieSBQaWVycmUgTGFiYXN0aWUgaW4KCSAgICBnaXRodWIgUFIjMTU1LgoKMjAxNC0wMy0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyMgRCBHb10gRml4ZXMgZm9yIEMgZW51bXMgdXNlZCBpbiBhbiBBUEkgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBlbnVtCiAgICAgICAgICAgIGhhcyBub3QgYmVlbiBwYXJzZWQuIEZvciBELCB0aGlzIGZpeGVzIGEgc2VnZmF1bHQgaW4gU1dJRy4gVGhlIG90aGVyIGxhbmd1YWdlcwogICAgICAgICAgICBub3cgcHJvZHVjZSBjb2RlIHRoYXQgY29tcGlsZXMsIGFsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBlbnVtIGlzIG5lZWRlZAogICAgICAgICAgICBpbiBvcmRlciB0byB1c2UgdGhlIGVudW0gcHJvcGVybHkgZnJvbSB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKMjAxNC0wMy0yMzogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIEZpeCBmb3IgdXNhZ2Ugb2Ygc25wcmludGYgaW4gTHVhIHJ1bnRpbWUgd2hpY2ggVmlzdWFsIFN0dWRpbyBkb2VzIG5vdCBoYXZlLgoKVmVyc2lvbiAzLjAuMCAoMTYgTWFyIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQysrMTEgc3VwcG9ydCBpbml0aWFsbHkgZGV2ZWxvcGVkIGFzIEMrKzB4IHN1cHBvcnQgYnkgTWF0ZXZ6IEpla292ZWMgYXMgYSBHb29nbGUgU3VtbWVyIG9mIENvZGUKICAgICAgICAgICAgcHJvamVjdCBoYXMgYmVlbiBmdXJ0aGVyIGV4dGVuZGVkLiBUaGUgQysrMTEgc3VwcG9ydCBpcyBjb21wcmVoZW5zaXZlLCBidXQgYnkgbm8gbWVhbnMgY29tcGxldGUKICAgICAgICAgICAgb3Igd2l0aG91dCBsaW1pdGF0aW9ucy4gRnVsbCBkZXRhaWxzIGZvciBlYWNoIG5ldyBmZWF0dXJlIGluIEMrKzExIGlzIGNvdmVyZWQgaW4gdGhlCiAgICAgICAgICAgIENQbHVzUGx1czExLmh0bWwgY2hhcHRlciBpbiB0aGUgZG9jdW1lbnRhdGlvbiB3aGljaCBpcyBpbmNsdWRlZCBpbiBTV0lHIGFuZCBhbHNvIGF2YWlsYWJsZQogICAgICAgICAgICBvbmxpbmUgYXQgaHR0cDovL3d3dy5zd2lnLm9yZy9Eb2MzLjAvQ1BsdXNQbHVzMTEuaHRtbC4KCjIwMTQtMDMtMTQ6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBOdW1lcm91cyBMdWEgaW1wcm92ZW1lbnRzOgogICAgICAgICAgICAxLiAlbnNwYWNlIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuIE5hbWVzcGFjZXMgYXJlIG1hcHBlZCB0byB0YWJsZXMgaW4gdGhlIG1vZHVsZSwgd2l0aCB0aGUgc2FtZQogICAgICAgICAgICAgICBuYW1lIGFzIHRoZSBDKysgbmFtZXNwYWNlLgogICAgICAgICAgICAyLiBJbmhlcml0YW5jZSBpcyBub3cgaGFuZGxlZCBkaWZmZXJlbnRseS4gRWFjaCBjbGFzcyBtZXRhdGFibGUga2VlcHMgYSBsaXN0IG9mIGNsYXNzIGJhc2VzIGluc3RlYWQKICAgICAgICAgICAgICAgb2YgbWVyZ2luZyBhbGwgbWVtYmVycyBvZiBhbGwgYmFzZXMgaW50byB0aGUgZGVyaXZlZCBjbGFzcy4KICAgICAgICAgICAgMy4gVGhlIG5ldyBtZXRhdGFibGVzIHJlc3VsdCBpbiBkaWZmZXJlbmNlcyBpbiBhY2Nlc3NpbmcgY2xhc3MgbWVtYmVycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgIHN0cnVjdCBUZXN0IHsKICAgICAgICAgICAgICAgICAgICAgZW51bSB7IFRFU1QxID0gMTAsIFRFU1QyID0gMjAgfTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBJQ09OU1QgPSAxMjsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBOb3cgdGhpcyBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0LlRFU1QxKQogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0LklDT05TVCkKICAgICAgICAgICAgICAgICBUaGUgb2xkIHdheSB3YXM6CiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3RfVEVTVDEpCiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3RfSUNPTlNUKQoKICAgICAgICAgICAgNC4gVGhlIHNwZWNpYWwgY2xhc3MgbWV0YXRhYmxlIG1lbWJlciAiLmNvbnN0cnVjdG9yIiB3YXMgcmVtb3ZlZC4gTm93IFNXSUcgZ2VuZXJhdGVzIHRoZSBwcm94eQogICAgICAgICAgICAgICBmdW5jdGlvbiBieSBpdHNlbGYgYW5kIGFzc2lnbnMgaXQgZGlyZWN0bHkgdG8gdGhlIGNsYXNzIHRhYmxlICJfX2NhbGwiIG1ldGhvZC4KICAgICAgICAgICAgNS4gZUx1YSBzaG91bGQgYWxzbyBub3cgc3VwcG9ydCBpbmhlcml0YW5jZS4KICAgICAgICAgICAgNi4gJ2NvbnN0JyBzdWJ0YWJsZSBpbiBlTHVhIGlzIGNvbnNpZGVyZWQgZGVwcmVjYXRlZC4KCiAgICAgICAgICAgIENoYW5nZXMgaW4gYmVoYXZpb3VyOgogICAgICAgICAgICBhLiBZb3UgY2FuIG5vIGxvbmdlciBhc3NpZ24gdG8gbm9uLWV4aXN0aW5nIGNsYXNzIG1lbWJlcnMgaW4gY2xhc3NlcyB3aXRob3V0IGEgX19zZXRpdGVtX18gbWV0aG9kLgogICAgICAgICAgICAgICBJdCB3aWxsIGNhdXNlIGEgTHVhIGVycm9yLgogICAgICAgICAgICBiLiBZb3UgY2FuIG5vIGxvbmdlciBpdGVyYXRlIG92ZXIgYSBtb2R1bGUgdGFibGUgYW5kIGNvcHkgZXZlcnl0aGluZyBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgogICAgICAgICAgICAgICBBY3R1YWxseSwgdGhpcyB3YXMgbmV2ZXIgdGhlIGNhc2UsIGJ1dCBpdCBpcyBub3cgZXhwbGljaXRseSBwcm9oaWJpdGVkLgogICAgICAgICAgICBjLiBOb3cgY2hhbmdpbmcgYSBiYXNlIGNsYXNzIHdpbGwgaW1tZWRpYXRlbHkgYWZmZWN0IGFsbCBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIGQuIFRoZXJlIG1pZ2h0IGJlIHNvbWUgaXNzdWVzIHdpdGggaW5oZXJpdGFuY2UuIEFsdGhvdWdoIHRoZSBiYXNlcyBpdGVyYXRpb24gc2NoZW1lIGlzIHRoZSBzYW1lCiAgICAgICAgICAgICAgIGFzIHdhcyB1c2VkIGZvciBtZXJnaW5nIGJhc2UgY2xhc3NlcyBpbnRvIGRlcml2ZWQgb25lLCBzb21lIHVua25vd24gaXNzdWVzIG1heSBhcmlzZS4KCiAgICAgICAgICAgIFRoZSBvbGQgbWV0YXRhYmxlIGJlaGF2aW91ciBjYW4gYmUgcmVzdG9yZWQgYnkgdXNpbmcgdGhlIC1uby1vbGQtbWV0YXRhYmxlLWJpbmRpbmdzIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIENoYW5nZSBpbiBkZWZhdWx0IGJlaGF2aW91ciB3cmFwcGluZyBDKysgYm9vbC4gT25seSBhIFB5dGhvbiBUcnVlIG9yIEZhbHNlCiAgICAgICAgICAgIHdpbGwgbm93IHdvcmsgZm9yIEMrKyBib29sIHBhcmFtZXRlcnMuIFRoaXMgZml4ZXMgb3ZlcmxvYWRpbmcgYm9vbCB3aXRoIG90aGVyIHR5cGVzLgogICAgICAgICAgICBQeXRob24gMi4zIG1pbmltdW0gaXMgbm93IHJlcXVpcmVkIGZvciB3cmFwcGluZyBib29sLgoKICAgICAgICAgICAgV2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY29uc3QgY2hhciogb3ZlcmxvYWRlZChib29sIHZhbHVlKSB7IHJldHVybiAiYm9vbCI7IH0KICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdmVybG9hZGVkKGludCB2YWx1ZSkgeyByZXR1cm4gImludCI7IH0KCiAgICAgICAgICAgIFByZXZpb3VzIGJlaGF2aW91cjoKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZChGYWxzZSkKICAgICAgICAgICAgICAnaW50JwogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKFRydWUpCiAgICAgICAgICAgICAgJ2ludCcKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZCgwKQogICAgICAgICAgICAgICdpbnQnCgogICAgICAgICAgICBOb3cgd2UgZ2V0IHRoZSBleHBlY3RlZCBiZWhhdmlvdXI6CiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoRmFsc2UpCiAgICAgICAgICAgICAgJ2Jvb2wnCiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoMCkKICAgICAgICAgICAgICAnaW50JwoKICAgICAgICAgICAgVGhlIGNvbnNlcXVlbmNlIGlzIHdoZW4gd3JhcHBpbmcgYm9vbCBpbiBub24tb3ZlcmxvYWRlZCBmdW5jdGlvbnM6CgogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJvb2xmdW5jdGlvbihib29sIHZhbHVlKSB7IHJldHVybiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7IH0KCiAgICAgICAgICAgIFRoZSBwcmV2aW91cyBiZWhhdmlvdXIgd2FzIHZlcnkgUHl0aG9uaWM6CiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigiIikKICAgICAgICAgICAgICAnZmFsc2UnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigiaGkiKQogICAgICAgICAgICAgICd0cnVlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMTIuMzQpCiAgICAgICAgICAgICAgJ3RydWUnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigwKQogICAgICAgICAgICAgICdmYWxzZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDEpCiAgICAgICAgICAgICAgJ3RydWUnCgogICAgICAgICAgICBOb3cgdGhlIG5ldyBiZWhhdmlvdXIgbW9yZSBhbG9uZyB0aGUgbGluZXMgb2YgQysrIGR1ZSB0byBzdHJpY3RlciB0eXBlIGNoZWNraW5nLiBUaGUKICAgICAgICAgICAgYWJvdmUgY2FsbHMgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbiBhbmQgbmVlZCB0byBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCBpbnRvIGEgYm9vbCBhcwogICAgICAgICAgICBmb2xsb3dzOgogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMCkKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgICAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgICAgICAgICAgIFR5cGVFcnJvcjogaW4gbWV0aG9kICdib29sZnVuY3Rpb24nLCBhcmd1bWVudCAxIG9mIHR5cGUgJ2Jvb2wnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbihib29sKDApKQogICAgICAgICAgICAgICdmYWxzZScKCiAgICAgICAgICAgIFRoZSBvbGQgYmVoYXZpb3VyIGNhbiBiZSByZXN1cnJlY3RlZCBieSBwYXNzaW5nIHRoZSAtRFNXSUdfUFlUSE9OX0xFR0FDWV9CT09MIGNvbW1hbmQgbGluZQogICAgICAgICAgICBwYXJhbWV0ZXIgd2hlbiBleGVjdXRpbmcgU1dJRy4gVHlwZW1hcHMgY2FuIG9mIGNvdXJzZSBiZSB3cml0dGVuIHRvIGN1c3RvbWlzZSB0aGUgYmVoYXZpb3VyCiAgICAgICAgICAgIGZvciBzcGVjaWZpYyBwYXJhbWV0ZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wNjogd3NmdWx0b24KCSAgICBGaXggU0YgQnVnICMxMzYzIC0gUHJvYmxlbSB3aXRoIG1ldGhvZCBvdmVybG9hZGluZyB3aGVuIHNvbWUgbWV0aG9kcyBhcmUgYWRkZWQgYnkgJWV4dGVuZAogICAgICAgICAgICBhbmQgb3RoZXJzIGFyZSByZWFsIG1ldGhvZHMgYW5kIHVzaW5nIHRlbXBsYXRlIGRlZmF1bHQgcGFyYW1ldGVycyB3aXRoIHNtYXJ0IHBvaW50ZXJzLgogICAgICAgICAgICBUaGlzIGlzIG5vdGljZWFibGUgYXMgYSByZWdyZXNzaW9uIHNpbmNlIDIuMC4xMiB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgaGFuZGxpbmcgZm9yIHNvbWUgbGFuZ3VhZ2VzIHdoZW4gdGhlIHNtYXJ0IHBvaW50ZXIgd3JhcHMgc3RkOjptYXAgYW5kIG90aGVyIFNUTCBjb250YWluZXJzLgoKMjAxNC0wMy0wMjogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBTRiBQYXRjaCAjMzQ2IGZyb20gSmVucyBLcnVlZ2VyLiBDb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gYXR0ZW1wdGluZyB0bwogICAgICAgICAgICBhY2Nlc3MgYSBub24tZXhpc3RlbnQgQy9DKysgZ2xvYmFsIHZhcmlhYmxlIG9uIHRoZSAnY3Zhcicgb2JqZWN0LiBUaGUgZXhjZXB0aW9uIHRocm93bgogICAgICAgICAgICB1c2VkIHRvIGJlIGEgTmFtZUVycm9yLiBIb3dldmVyLCBhcyB0aGlzIGFjY2VzcyBpcyB2aWEgYSBwcmltYXJ5LCBhbiBBdHRyaWJ1dGVFcnJvcgogICAgICAgICAgICBpcyBtb3JlIGNvcnJlY3QgYW5kIHNvIHRoZSBleGNlcHRpb24gdGhyb3duIG5vdyBpcyBhbiBBdHRyaWJ1dGVFcnJvci4gUmVmZXJlbmNlOgogICAgICAgICAgICBodHRwOi8vZG9jcy5weXRob24ub3JnLzIvcmVmZXJlbmNlL2V4cHJlc3Npb25zLmh0bWwjYXR0cmlidXRlLXJlZmVyZW5jZXMKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDMtMDE6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gUGF0Y2ggIzE0MyBGaXggdHlwZSBzaG93biB3aGVuIHVzaW5nIHR5cGUoKSB0byBpbmNsdWRlIHRoZSBtb2R1bGUgYW5kIHBhY2thZ2UKICAgICAgICAgICAgbmFtZSB3aGVuIHVzaW5nIC1idWlsdGluLgoKMjAxNC0wMy0wMTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBTRiBwYXRjaCAjMzQ3IEZpeCBtaXNzaW5nIGFyZ3VtZW50IGNvdW50IGNoZWNraW5nIHdpdGggLW1vZGVybi4KICAgICAgICAgICAgRml4ZXMgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIHdoZW4gYnVpbHRpbiBjaGFuZ2VzIHdlcmUgaW50cm9kdWNlZCBpbiBTV0lHLTIuMC4zLgoKMjAxNC0wMi0yMTogd3NmdWx0b24KCSAgICBbUEhQXSBGaXggd2FybmluZyBzdXBwcmVzc2lvbiB1c2luZyAld2FybmZpbHRlciBmb3IgUEhQIHJlc2VydmVkIGNsYXNzIG5hbWVzLgoKMjAxNC0wMi0xOTogb2xseQoJICAgIFtMdWFdIEFkZCBrZXl3b3JkIHdhcm5pbmdzIGZvciBMdWEga2V5d29yZHMgYW5kIEJhc2ljIEZ1bmN0aW9ucy4KCjIwMTQtMDItMTk6IG9sbHkKCSAgICAtV2FsbGt3IG5vdyBpbmNsdWRlcyBrZXl3b3JkcyBmb3IgYWxsIGxhbmd1YWdlcyB3aXRoIGtleXdvcmQKCSAgICB3YXJuaW5ncyAocHJldmlvdXNseSBHbyBhbmQgUiB3ZXJlIG1pc3NpbmcpLgoKMjAxNC0wMi0xOTogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgbGlzdHMgb2YgUEhQIGtleXdvcmRzIHdpdGggbmV3IG9uZXMgZnJvbSBQSFAgNS40CgkgICAgYW5kIG5ld2VyIChhbmQgc29tZSBtaXNzaW5nIG9uZXMgZnJvbSA1LjMpLiAgUmVzZXJ2ZWQgUEhQIGNvbnN0YW50cwoJICAgIG5hbWVzIGFyZSBub3cgY2hlY2tlZCBhZ2FpbnN0IGVudW0gdmFsdWVzIGFuZCBjb25zdGFudHMsIGluc3RlYWQKCSAgICBvZiBhZ2FpbnN0IGZ1bmN0aW9uIGFuZCBtZXRob2QgbmFtZXMuICBCdWlsdC1pbiBQSFAgZnVuY3Rpb24gbmFtZXMKCSAgICBubyBsb25nZXIgbWF0Y2ggbWV0aG9kcyBhZGRlZCBieSAlZXh0ZW5kLiAgRnVuY3Rpb25zIGFuZCBtZXRob2RzCgkgICAgbmFtZWQgJ19fc2xlZXAnLCAnX193YWtldXAnLCAnbm90JywgJ3BhcmVudCcsIG9yICd2aXJ0dWFsJyBhcmUgbm8KCSAgICBsb25nZXIgbmVlZGxlc3NseSByZW5hbWVkLgoKMjAxNC0wMi0xNTogd3NmdWx0b24KCSAgICBGaXggdGhlICUkaXNtZW1iZXIgJXJlbmFtZSBwcmVkaWNhdGVzIHRvIGFsc28gYXBwbHkgdG8gbWVtYmVycyBhZGRlZCB2aWEgJWV4dGVuZC4KCiAgICAgICAgICAgIEFkZCAlJGlzZXh0ZW5kbWVtYmVyIGZvciAlcmVuYW1lIG9mIG1lbWJlcnMgYWRkZWQgdmlhICVleHRlbmQuIFRoaXMgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBub3JtYWwgY2xhc3Mvc3RydWN0IG1lbWJlcnMgYW5kICVleHRlbmQgbWVtYmVycy4gRm9yIGV4YW1wbGUKICAgICAgICAgICAgJyUkaXNtZW1iZXIsICUkbm90ICUkaXNleHRlbmRtZW1iZXInIHdpbGwgbm93IGlkZW50aWZ5IGp1c3QgY2xhc3Mvc3RydWN0IG1lbWJlcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAyLTE2OiBoZmFsY2ljCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMxMzcgLSBmaXggY3Jhc2hlcy9leGNlcHRpb25zIGluIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBQeXRob24gMy4zCgoyMDE0LTAyLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIHN1cHBvcnQgZm9yIHRoZSBjZGF0YSBsaWJyYXJ5LgoKMjAxNC0wMi0wODogdmthbGluaW4KICAgICAgICAgICAgTmVzdGVkIGNsYXNzIHN1cHBvcnQgYWRkZWQuIFRoaXMgcHJpbWFyaWx5IGFsbG93cyBTV0lHIHRvIHByb3Blcmx5IHBhcnNlIG5lc3RlZAogICAgICAgICAgICBjbGFzc2VzIGFuZCBrZWVwIHRoZSBuZXN0ZWQgY2xhc3MgaW5mb3JtYXRpb24gaW4gdGhlIHBhcnNlIHRyZWUuIEphdmEgYW5kIEMjCiAgICAgICAgICAgIGhhdmUgdXRpbGlzZWQgdGhpcyBpbmZvcm1hdGlvbiB3cmFwcGluZyB0aGUgQysrIG5lc3RlZCBjbGFzc2VzIGFzIEphdmEvQyMKICAgICAgICAgICAgbmVzdGVkIGNsYXNzZXMuIFRoZSByZW1haW5pbmcgdGFyZ2V0IGxhbmd1YWdlcyBpZ25vcmUgbmVzdGVkIGNsYXNzZXMgYXMgaW4KICAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMuIEhlbHAgaXMgbmVlZGVkIGJ5IHVzZXJzIG9mIHRoZXNlIHJlbWFpbmluZyBsYW5ndWFnZXMgdG8KICAgICAgICAgICAgZGVzaWduIGhvdyBDKysgbmVzdGVkIGNsYXNzZXMgY2FuIGJlIGJlc3Qgd3JhcHBlZC4gUGxlYXNlIHRhbGsgdG8gdXMgb24gdGhlCiAgICAgICAgICAgIHN3aWctZGV2ZWwgbWFpbGluZyBsaXN0IGlmIHlvdSB0aGluayB5b3UgY2FuIGhlbHAuCgogICAgICAgICAgICBQcmV2aW91c2x5LCB0aGVyZSB3YXMgbGltaXRlZCBuZXN0ZWQgY2xhc3Mgc3VwcG9ydC4gTmVzdGVkIGNsYXNzZXMgd2VyZSB0cmVhdGVkCiAgICAgICAgICAgIGFzIG9wYXF1ZSBwb2ludGVycy4gSG93ZXZlciwgdGhlICJuZXN0ZWR3b3JrYXJvdW5kIiBmZWF0dXJlIHByb3ZpZGVkIGEgd2F5IHRvCiAgICAgICAgICAgIHdyYXAgYSBuZXN0ZWQgY2xhc3MgYXMgaWYgaXQgd2FzIGEgZ2xvYmFsIGNsYXNzLiBUaGlzIGZlYXR1cmUgbm8gbG9uZ2VyIGV4aXN0cwogICAgICAgICAgICBhbmQgaXMgcmVwbGFjZWQgYnkgdGhlIG5ldyAiZmxhdG5lc3RlZCIgZmVhdHVyZS4gVGhpcyBlZmZlY3RpdmVseSBkb2VzIHRoZSBzYW1lCiAgICAgICAgICAgIHRoaW5nIHdpdGggbGVzcyBtYW51YWwgY29kZSB0byBiZSB3cml0dGVuLiBQbGVhc2Ugc2VlIHRoZSAnTmVzdGVkIGNsYXNzZXMnCiAgICAgICAgICAgIHNlY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gaW4gU1dJR1BsdXMuaHRtbCBpZiB5b3Ugd2VyZSBwcmV2aW91c2x5IHVzaW5nIHRoaXMKICAgICAgICAgICAgZmVhdHVyZS4KCiAgICAgICAgICAgIFNXSUcgbm93IHBhcnNlcyB0aGUgY29udGVudHMgb2YgbmVzdGVkIGNsYXNzZXMgd2hlcmUgcHJldmlvdXNseSBpdCBkaWQgbm90LiBZb3UKICAgICAgICAgICAgbWF5IGZpbmQgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIG1ha2UgYWRqdXN0bWVudHMgdG8geW91ciBpbnRlcmZhY2UgZmlsZSBhcwogICAgICAgICAgICBlZmZlY3RpdmVseSBleHRyYSBjb2RlIGlzIGJlaW5nIHdyYXBwZWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAyLTA2OiBnamFuc3NlbnMKICAgICAgICAgICAgW0d1aWxlXSBQYXRjaCAjMTMzLiBNYWtlIHNjbSB0byBzdHJpbmcgY29udmVyc2lvbiB3b3JrIHdpdGggbm9uLWFzY2lpIHN0cmluZ3MuCiAgICAgICAgICAgIEd1aWxlIDIgaGFzIGEgY29tcGxldGVseSByZXdyaXR0ZW4gc3RyaW5nIGltcGxlbWVudGF0aW9uLiBTV0lHIG1hZGUgc29tZSBhc3N1bXB0aW9ucwogICAgICAgICAgICB0aGF0IGFyZSBubyBsb25nZXIgdmFsaWQgYXMgdG8gdGhlIGludGVybmFscyBvZiBndWlsZSdzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KCjIwMTQtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIG5ldyBzd2lndHlwZV9pbm91dC5pIGxpYnJhcnkgY29udGFpbmluZyBTV0lHVFlQRSAqJiBPVVRQVVQgdHlwZW1hcHMuCgogICAgICAgICAgICBFeGFtcGxlIHVzYWdlIHdyYXBwaW5nOgoKICAgICAgICAgICAgICB2b2lkIGYoWFhYIComIHgpIHsgeCA9IG5ldyBYWFgoMTExKTsgfQoKICAgICAgICAgICAgd291bGQgYmU6CgogICAgICAgICAgICAgIFhYWCB4ID0gbnVsbDsKICAgICAgICAgICAgICBmKG91dCB4KTsKICAgICAgICAgICAgICAvLyB1c2UgeAogICAgICAgICAgICAgIHguRGlzcG9zZSgpOyAvLyBtYW51YWxseSBjbGVhciBtZW1vcnkgb3Igb3RoZXJ3aXNlIGxlYXZlIG91dCBhbmQgbGVhdmUgaXQgdG8gdGhlIGdhcmJhZ2UgY29sbGVjdG9yCgoyMDE0LTAxLTIxOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkICVnb19pbXBvcnQgZGlyZWN0aXZlLgoKMjAxNC0wMS0yMTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBzdXBwb3J0IGZvciBHbyAxLjMsIG5vdCB5ZXQgcmVsZWFzZWQuCgoyMDE0LTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvciBleGNlcHRpb25zIChTd2lnOjpEaXJlY3RvckV4Y2VwdGlvbikgbm93IGRlcml2ZSBmcm9tIHN0ZDo6ZXhjZXB0aW9uCiAgICAgICAgICAgIGFuZCBoZW5jZSBwcm92aWRlIHRoZSB3aGF0KCkgbWV0aG9kLiBJbiBQeXRob24gYW5kIFJ1YnksIHRoaXMgcmVwbGFjZXMgdGhlIG5vdwogICAgICAgICAgICBkZXByZWNhdGVkIERpcmVjdG9yRXhjZXB0aW9uOjpnZXRNZXNzYWdlKCkgbWV0aG9kLgoKMjAxNC0wMS0xNDogZGlvcmNldHkKICAgICAgICAgICAgUGF0Y2ggIzExMiAtIEZpeCBzeW1ib2wgcmVzb2x1dGlvbiBpbnZvbHZpbmcgc2NvcGVzIHRoYXQgaGF2ZSBtdWx0aXBsZSBsZXZlbHMKICAgICAgICAgICAgb2YgdHlwZWRlZnMgLSBmaXhlcyBzb21lIHRlbXBsYXRlIHJlc29sdXRpb25zIGFzIHdlbGwgYXMgc29tZSB0eXBlbWFwIHNlYXJjaGVzLgoKMjAxNC0wMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGFuZCBkb2N1bWVudCB0aGUgbmF0dXJhbHZhciBmZWF0dXJlIG92ZXJyaWRlIGJlaGF2aW91ciAtIHRoZSBuYXR1cmFsdmFyCiAgICAgICAgICAgIGZlYXR1cmUgYXR0YWNoZWQgdG8gYSB2YXJpYWJsZSBuYW1lIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG5hdHVyYWx2YXIKICAgICAgICAgICAgZmVhdHVyZSBhdHRhY2hlZCB0byB0aGUgdmFyaWFibGUncyB0eXBlLiBUaGUgb3ZlcnJpZGluZyB3YXMgbm90IHdvcmtpbmcKICAgICAgICAgICAgd2hlbiB0dXJuaW5nIHRoZSBmZWF0dXJlIG9mZiBvbiB0aGUgdmFyaWFibGUncyBuYW1lLgoKICAgICAgICAgICAgRml4IHNvIHRoYXQgYW55IHVzZSBvZiB0aGUgbmF0dXJhbHZhciBmZWF0dXJlIHdpbGwgb3ZlcnJpZGUgdGhlIGdsb2JhbAogICAgICAgICAgICBzZXR0aW5nLiBQcmV2aW91c2x5IHdoZW4gc2V0IGdsb2JhbGx5IGJ5IC1uYXR1cmFsdmFyIG9yICVtb2R1bGUobmF0dXJhbHZhcj0xKSwKICAgICAgICAgICAgdXNlIG9mIHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgd2FzIG5vdCBhbHdheXMgaG9ub3VyZWQuCgoyMDE0LTAxLTA2OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRml4IGJ1ZyB0aGF0IGJyb2tlIHVzaW5nIGRpcmVjdG9ycyBmcm9tIGEgdGhyZWFkIG5vdAoJICAgIGNyZWF0ZWQgYnkgR28uCgoyMDEzLTEyLTI0OiBwdG9tdWxpawogICAgICAgICAgICBbUHl0aG9uXSBTRiBCdWcgIzEyOTcKCiAgICAgICAgICAgIFJlc29sdmUgc2V2ZXJhbCBpc3N1ZXMgcmVsYXRlZCB0byBweXRob24gaW1wb3J0cy4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGl0J3Mgbm93IHBvc3NpYmxlIHRvIGltcG9ydCBtb2R1bGVzIGhhdmluZyB0aGUgc2FtZSBtb2R1bGUKICAgICAgICAgICAgbmFtZXMsIGJ1dCBiZWxvbmdpbmcgaW4gZGlmZmVyZW50IHBhY2thZ2VzLgogICAgICAgICAgICAKICAgICAgICAgICAgRnJvbSB0aGUgdXNlcidzIHZpZXdwb2ludCwgdGhpcyBwYXRjaCBnaXZlcyBhIGxpdHRsZSBiaXQgbW9yZSBjb250cm9sIG9uCiAgICAgICAgICAgIGltcG9ydCBzdGF0ZW1lbnRzIGdlbmVyYXRlZCBieSBTV0lHLiBUaGUgdXNlciBtYXkgY2hvb3NlIHRvIHVzZSByZWxhdGl2ZQogICAgICAgICAgICBvciBhYnNvbHV0ZSBpbXBvcnRzLgogICAgICAgICAgICAKICAgICAgICAgICAgU29tZSBkZXRhaWxzOgogICAgICAgICAgICAgIC0gd2UgKHN0aWxsKSBnZW5lcmF0ZSBpbXBvcnQgc3RhdGVtZW50cyBpbiB0aGUgZm9ybSAnaW1wb3J0IGEuYi5jJyB3aGljaAogICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gYWJzb2x1dGUgaW1wb3J0cyBpbiBweXRob24zIGFuZCAodGhlIG9ubHkgYXZhaWxhYmxlKQogICAgICAgICAgICAgICAgYW1iaWd1b3VzIG9uZSBpbiBweXRob24yLgogICAgICAgICAgICAgIC0gYWRkZWQgLXJlbGF0aXZlaW1wb3J0IG9wdGlvbiB0byB1c2UgZXhwbGljaXQgcmVsYXRpdmUgaW1wb3J0IHN5bnRheAogICAgICAgICAgICAgICAgKHB5dGhvbjMpLAoKICAgICAgICAgICAgVGhlICJQeXRob24gUGFja2FnZXMiIHNlY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gZGlzY3Vzc2VzIGhvdyB0byB3b3JrCiAgICAgICAgICAgIHdpdGggaW1wb3J0aW5nIHBhY2thZ2VzIGluY2x1ZGluZyB0aGUgbmV3IC1yZWxhdGl2ZWltcG9ydCBjb21tYW5kIGxpbmUgb3B0aW9uLgoKMjAxMy0xMi0yMzogdmFkegogICAgICAgICAgICBbT2N0YXZlLCBQZXJsLCBQeXRob24sIFIsIFJ1YnksIFRjbF0gQ2hhbmdlIHRoZSBsZW5ndGggb2Ygc3RyaW5ncyBjcmVhdGVkIGZyb20gZml4ZWQtc2l6ZSBjaGFyCiAgICAgICAgICAgIGJ1ZmZlcnMgaW4gQyBjb2RlLgoKICAgICAgICAgICAgVGhpcyBpcyBhIHBvdGVudGlhbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBicmVhazogYSAiY2hhciBidWZbNV0iIGNvbnRhaW5pbmcgImhvXDBsYSIgd2FzCiAgICAgICAgICAgIHJldHVybmVkIGFzIGEgc3RyaW5nIG9mIGxlbmd0aCA1IGJlZm9yZSwgYnV0IGlzIHJldHVybmVkIGFzIGEgc3RyaW5nIG9mIGxlbmd0aCAyIG5vdy4gQWxzbywKICAgICAgICAgICAgaXQgd2FzIHBvc3NpYmxlIHRvIGFzc2lnbiBhIChub24tTlVMLXRlcm1pbmF0ZWQpIHN0cmluZyAiaGVsbG8iIHRvIHN1Y2ggYSBidWZmZXIgYmVmb3JlIGJ1dAogICAgICAgICAgICBub3cgdGhpcyBmYWlscyBhbmQgb25seSAiaGVsbyIgY2FuIGZpdC4KCiAgICAgICAgICAgIEFwcGx5ICJjaGFyIEZJWFNJWkVbQU5ZXSIgdHlwZW1hcHMgdG8gZXhwbGljaXRseSBjaG9vc2UgdGhlIG9sZCBiZWhhdmlvdXIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTEyLTIzOiB0YWxieQogICAgICAgICAgICBbUGVybF0gQWRkIHN1cHBvcnQgZm9yIGRpcmVjdG9ycy4KCjIwMTMtMTItMTg6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBEb24ndCByZXF1aXJlIHRoYXQgR28gZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlIHNldAoJICAgIHdoZW4gcnVubmluZyBleGFtcGxlcyBvciB0ZXN0c3VpdGUgd2hlbiB1c2luZyBHbyAxIG9yCgkgICAgbGF0ZXIuCgoyMDEzLTEyLTE3OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gUmVtb3ZlIC1sb25nc2l6ZSBvcHRpb24gKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAoJICAgIGlnbm9yZSBpdCBpZiBzZWVuKS4KCjIwMTMtMTItMTc6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgLWdvLXBrZ3BhdGggb3B0aW9uLgoKMjAxMy0xMi0xNjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIFVwZGF0ZSBmb3IgR28gMS4yIHJlbGVhc2UuICBBZGQgc3VwcG9ydCBmb3IgbGlua2luZwoJICAgIFNXSUcgY29kZSBkaXJlY3RseSBpbnRvIGV4ZWN1dGFibGUsIHJhdGhlciB0aGFuIHVzaW5nIGEKCSAgICBzaGFyZWQgbGlicmFyeS4KCjIwMTMtMTItMTM6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgU1dJRyBzb3VyY2UgZmlsZSBuYW1lIGFzIGNvbW1lbnRzIGluIGdlbmVyYXRlZAoJICAgIGZpbGVzLiAgVGhpcyBjYW4gYmUgdXNlZCBieSBHbyBkb2N1bWVudGF0aW9uIHRvb2xzLgoKMjAxMy0xMi0xMjogamxldmVxdWUKCSAgICBbTHVhXSBGaXggdHlwbyAod2NoYXIgaW5zdGVhZCBvZiB3Y2hhcl90KSB3aGljaCBtYWRlIHdjaGFyLmkKCSAgICBmb3IgTHVhIHVzZWxlc3MuCgoyMDEzLTEyLTEyOiB2bWlrbG9zCgkgICAgW1BIUF0gUEhQJ3MgcGVjdWxpYXIgY2FsbC10aW1lIHBhc3MtYnktcmVmZXJlbmNlIGZlYXR1cmUgd2FzCgkgICAgZGVwcmVjYXRlZCBpbiBQSFAgNS4zIGFuZCByZW1vdmVkIGluIFBIUCA1LjQsIHNvIHVwZGF0ZSB0aGUgUkVGCgkgICAgdHlwZW1hcHMgaW4gcGhwcG9pbnRlcnMuaSB0byBzcGVjaWZ5IHBhc3MtYnktcmVmZXJlbmNlIGluIHRoZQoJICAgIGZ1bmN0aW9uIGRlZmluaXRpb24uICBFeGFtcGxlcy9waHAvcG9pbnRlciBoYXMgYmVlbiB1cGRhdGVkCgkgICAgYWNjb3JkaW5nbHkuCgoyMDEzLTEyLTEyOiBvbGx5CgkgICAgW1BIUF0gVGhlIHVzYWdlIG9mICRpbnB1dCBpbiBQSFAgZGlyZWN0b3JvdXQgdHlwZW1hcHMgaGFzIGJlZW4KCSAgICBjaGFuZ2VkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBsYW5ndWFnZXMuICBUaGUgdHlwZW1hcHMKCSAgICBwcm92aWRlZCBieSBTV0lHIGhhdmUgYmVlbiB1cGRhdGVkIGFjY29yZGluZ2x5LCBidXQgaWYgeW91CgkgICAgaGF2ZSB3cml0dGVuIHlvdXIgb3duIGRpcmVjdG9yb3V0IHR5cGVtYXBzLCB5b3UnbGwgbmVlZCB0bwoJICAgIHVwZGF0ZSAkaW5wdXQgdG8gJiRpbnB1dCAob3IgbWFrZSBlcXVpdmFsZW50IGNoYW5nZXMpLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0xMS0yNzogdmFkegogICAgICAgICAgICBbQyMsIEphdmEsIFB5dGhvbl0gQWRkIHN0ZF9hdXRvX3B0ci5pIGRlZmluaW5nIHR5cGVtYXBzIGZvciByZXR1cm5pbmcgc3RkOjphdXRvX3B0cjw+LgoKMjAxMy0xMS0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBcHBseSBwYXRjaCAjNzkgZnJvbSBCcmFudCBLeXNlcgogICAgICAgICAgICAgIC0gUmVtb3ZlIHVzaW5nIGRpcmVjdGl2ZXMgZnJvbSB0aGUgZ2VuZXJhdGVkIEMjIGNvZGUgYW5kIGZ1bGx5IHF1YWxpZnkgdGhlIHVzZSBvZiBhbGwgLk5FVAogICAgICAgICAgICAgICAgZnJhbWV3b3JrIHR5cGVzIGluIG9yZGVyIHRvIG1pbmltaXplIHBvdGVudGlhbCBuYW1lIGNvbGxpc2lvbnMgZnJvbSBpbnB1dCBmaWxlcyBkZWZpbmluZwogICAgICAgICAgICAgICAgdHlwZXMsIG5hbWVzcGFjZSwgZXRjIHdpdGggdGhlIHNhbWUgbmFtZSBhcyAuTkVUIGZyYW1ld29yayBtZW1iZXJzLgogICAgICAgICAgICAgIC0gR2xvYmFsbHkgcXVhbGlmeSB0aGUgdXNlIG9mIC5ORVQgZnJhbWV3b3JrIHR5cGVzIGluIHRoZSBTeXN0ZW0gbmFtZXNwYWNlCiAgICAgICAgICAgICAgLSBSZW1vdmUgLk5FVCAxLjEgc3VwcG9ydCwgLk5FVCAyIGlzIHRoZSBtaW5pbXVtIGZvciB0aGUgQyMgbW9kdWxlCgogICAgICAgICAgICBUaGlzIGlzIGEgcG90ZW50aWFsIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJyZWFrIGlmIGNvZGUgaGFzIGJlZW4gYWRkZWQgcmVseWluZyBvbiB0aGVzZSB1c2luZwogICAgICAgICAgICBzdGF0ZW1lbnRzIHRoYXQgdXNlZCB0byBiZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHVzaW5nIFN5c3RlbTsKICAgICAgICAgICAgICB1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CgogICAgICAgICAgICBUaGUgcXVpY2sgZml4IHRvIGFkZCB0aGVzZSBiYWNrIGluIGlzIHRvIGFkZCB0aGUgLURTV0lHMl9DU0hBUlAgY29tbWFuZCBsaW5lIG9wdGlvbiB3aGVuCiAgICAgICAgICAgIGV4ZWN1dGluZyBTV0lHLiBTZWUgQ1NoYXJwLmh0bWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0xMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBzb21lIGNvcm5lciBjYXNlcyBmb3IgdGhlICRwYWNrYWdlcGF0aC8kamF2YWNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KCjIwMTMtMTEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjOTEgZnJvbSBNYXJ2aW4gR3JlZW5iZXJnIC0gQWRkIGRpcmVjdG9yOmV4Y2VwdCBmZWF0dXJlIGZvciBpbXByb3ZlZAogICAgICAgICAgICBleGNlcHRpb24gaGFuZGxpbmcgaW4gZGlyZWN0b3IgbWV0aG9kcyBmb3IgSmF2YS4KCjIwMTMtMTAtMTU6IHZhZHoKICAgICAgICAgICAgQWxsb3cgdXNpbmcgXGwsIFxMLCBcdSwgXFUgYW5kIFxFIGluIHRoZSBzdWJzdGl0dXRpb24gcGFydCBvZiAlKHJlZ2V4Oi9wYXR0ZXJuL3N1YnN0LykKICAgICAgICAgICAgaW5zaWRlICVyZW5hbWUgdG8gY2hhbmdlIHRoZSBjYXNlIG9mIHRoZSB0ZXh0IGJlaW5nIHJlcGxhY2VkLgoKMjAxMy0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEFwcGx5ICM5NiAtIHN1cGVyY2xhc3Mgbm90IGxpc3BpZnkKCjIwMTMtMTAtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lcmdlIGluIEMrKzExIHN1cHBvcnQgZnJvbSB0aGUgZ3NvYzIwMDktbWF0ZXZ6IGJyYW5jaCB3aGVyZSBNYXRldnogSmVrb3ZlYyBmaXJzdAogICAgICAgICAgICBzdGFydGVkIHRoZSBDKysweCBhZGRpdGlvbnMuIERvY3VtZW50YXRpb24gb2YgdGhlIEMrKzExIGZlYXR1cmVzIHN1cHBvcnRlZCBpcyBpbiBhCiAgICAgICAgICAgIG5ldyBDaGFwdGVyIG9mIHRoZSBkb2N1bWVudGF0aW9uLCAiU1dJRyBhbmQgQysrMTEiIGluIERvYy9NYW51YWwvQ1BsdXNQbHVzMTEuaHRtbC4KCjIwMTMtMTAtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlbmF0dXJhbHZhciBub3QgaGF2aW5nIGFueSBhZmZlY3Qgb24gdGVtcGxhdGVkIGNsYXNzZXMgaW5zdGFudGlhdGVkIHdpdGggYW4KICAgICAgICAgICAgZW51bSBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgVmFkaW0gWmVpdGxpbi4KCjIwMTMtMDktMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggYSBtZW1vcnkgbGVhayBmb3IgdGhlIGphdmEgY2hhciAqKlNUUklOR19BUlJBWSB0eXBlbWFwcy4KClZlcnNpb24gMi4wLjEyICg5IEZlYiAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDEtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQSFBdIEZpeCBjb21waWxhdGlvbiBlcnJvciBpbiBaVFMgbW9kZSAoNjQgYml0IHdpbmRvd3MpIGR1ZSB0byBpbmNvcnJlY3QgcGxhY2VtZW50CiAgICAgICAgICAgIG9mIFRTUk1MU19GRVRDSCgpIGluIFNXSUdfUGhwX0dldE1vZHVsZSgpIGFzIHJlcG9ydGVkIGJ5IE1hcmsgRGF3c29uLUJ1dHRlcndvcnRoLgoKMjAxNC0wMS0xMzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSB1cGRhdGUgc3VwcG9ydCB0byBPY3RhdmUgdmVyc2lvbiAzLjguMAoKICAgICAgICAgICAgLSBPY3RhdmUgMy44LjAgbm8gbG9uZ2VyIGRlZmluZXMgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUiwgYnV0IDMuOC4xCiAgICAgICAgICAgICAgd2lsbCBkZWZpbmUgT0NUQVZFX3tNQUpPUixNSU5PUixQQVRDSH1fVkVSU0lPTiBpbnN0ZWFkOiBzZWUKICAgICAgICAgICAgICAgIGh0dHA6Ly9oZy5zYXZhbm5haC5nbnUub3JnL2hnd2ViL29jdGF2ZS9yZXYvYjZiNmUwZGM3MDBlCiAgICAgICAgICAgICAgU28gd2Ugbm93IHVzZSBhIG5ldyBtYWNybyBTV0lHX09DVEFWRV9QUkVSRVEobWFqb3IsbWlub3IscGF0Y2gpIHRvCiAgICAgICAgICAgICAgZW5hYmxlIGZlYXR1cmVzIHJlcXVpcmluZyBPY3RhdmUgdmVyc2lvbiBtYWpvci5taW5vci5wYXRjaCBvciBsYXRlci4KCiAgICAgICAgICAgICAgRm9yIE9jdGF2ZSB2ZXJzaW9ucyBwcmlvciB0byAzLjguMSwgd2UgcmVjb25zdHJ1Y3QgdmFsdWVzIGZvcgogICAgICAgICAgICAgIE9DVEFWRV97TUFKT1IsTUlOT1IsUEFUQ0h9X1ZFUlNJT04gYmFzZWQgb24gT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUiwKICAgICAgICAgICAgICBleHRyYWN0ZWQgZnJvbSBPY3RhdmUncyBDaGFuZ2VMb2dzLiBBbiBhZGRpdGlvbmFsIGhhY2sgaXMgbmVlZGVkIHRvCiAgICAgICAgICAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBPY3RhdmUgPD0gMy4yLnggYW5kIDMuOC4wLCBuZWl0aGVyIG9mIHdoaWNoIGRlZmluZQogICAgICAgICAgICAgIE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIuCgogICAgICAgICAgICAtIE9jdGF2ZSAzLjguMCBkZXByZWNhdGVzIHN5bWJvbF90YWJsZTo6dmFycmVmKCksIHNvIHJlbW92ZSBpdHMgdXNlCiAgICAgICAgICAgICAgZm9yIHRoaXMgYW5kIGZ1dHVyZSB2ZXJzaW9ucyBvZiBPY3RhdmUuCgogICAgICAgICAgICAtIE9jdGF2ZSAzLjguMCByZW1vdmVzIG9jdGF2ZV92YWx1ZTo6aXNfcmVhbF9uZF9hcnJheSgpLCB1c2VkIGluCiAgICAgICAgICAgICAgb2N0YXZlX3N3aWdfdHlwZTo6ZGltcygpLiBJdHMgdXNlIGlzIG5vdCByZXF1aXJlZCBoZXJlLCBzbyByZW1vdmUgaXQuCgogICAgICAgICAgICAtIFJldGVzdGVkIGFnYWluc3QgT2N0YXZlIHZlcnNpb25zIDMuMC41LCAzLjIuNCwgMy40LjMsIDMuNi40LCBhbmQgMy44LjAuCgogICAgICAgICAgICAtIFVwZGF0ZWQgT2N0YXZlIGRvY3VtZW50YXRpb24gd2l0aCB0ZXN0ZWQgT2N0YXZlIHZlcnNpb25zLCBhbmQgYWRkZWQgYQogICAgICAgICAgICAgIHdhcm5pbmcgYWdhaW5zdCB1c2luZyB2ZXJzaW9ucyA8PSAzLngueCwgd2hpY2ggYXJlIG5vIGxvbmdlciB0ZXN0ZWQuCgoyMDEzLTEyLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBDKysxMSBzdXBwb3J0IGZvciBuZXcgdmVyc2lvbnMgb2YgZXJhc2UgYW5kIGluc2VydCBpbiB0aGUgU1RMIGNvbnRhaW5lcnMuCgogICAgICAgICAgICBUaGUgZXJhc2UgYW5kIGluc2VydCBtZXRob2RzIGluIHRoZSBjb250YWluZXJzIHVzZSBjb25zdF9pdGVyYXRvciBpbnN0ZWFkCiAgICAgICAgICAgIG9mIGl0ZXJhdG9yIGluIEMrKzExLiAgVGhlcmUgYXJlIHRpbWVzIHdoZW4gdGhlIG1ldGhvZHMgd3JhcHBlZCBtdXN0IG1hdGNoCiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXJzIGV4YWN0bHkuIFNwZWNpZmljYWxseSB3aGVuIGZ1bGwgdHlwZSBpbmZvcm1hdGlvbiBmb3IKICAgICAgICAgICAgdGVtcGxhdGUgdHlwZXMgaXMgbWlzc2luZyBvciBTV0lHIGZhaWxzIHRvIGxvb2sgdXAgdGhlIHR5cGUgY29ycmVjdGx5LAogICAgICAgICAgICBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF92ZWN0b3IuaT4KICAgICAgICAgICAgICB0eXBlZGVmIGZsb2F0IFJlYWw7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFJlYWxWZWN0b3IpIHN0ZDo6dmVjdG9yPFJlYWw+OwoKICAgICAgICAgICAgU1dJRyBkb2VzIG5vdCBmaW5kIHN0ZDo6dmVjdG9yPFJlYWw+OjppdGVyYXRvciBiZWNhdXNlICV0ZW1wbGF0ZSB1c2luZwogICAgICAgICAgICB0eXBlZGVmcyBkb2VzIG5vdCBhbHdheXMgd29yayBhbmQgc28gU1dJRyBkb2Vzbid0IGtub3cgaWYgdGhlIHR5cGUgaXMKICAgICAgICAgICAgY29weWFibGUgYW5kIHNvIHVzZXMgU3dpZ1ZhbHVlV3JhcHBlcjxpdGVyYXRvcj4gd2hpY2ggZG9lcwogICAgICAgICAgICBub3Qgc3VwcG9ydCBjb252ZXJzaW9uIHRvIGFub3RoZXIgdHlwZSAoY29uc3RfaXRlcmF0b3IpLiBUaGlzIHJlc3VsdGVkCiAgICAgICAgICAgIGluIGNvbXBpbGF0aW9uIGVycm9ycyB3aGVuIHVzaW5nIHRoZSBDKysxMSB2ZXJzaW9uIG9mIHRoZSBjb250YWluZXJzLgoKICAgICAgICAgICAgQ2xvc2VzICM3MwoKMjAxMy0xMC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCBTRiAjMTM0MCAtIFZpc3VhbCBTdHVkaW8gY29tcGlsZSBlcnJvciBpbiBDKysgd3JhcHBlcnMgZHVlIHRvICNpbmNsdWRlIDxleGNlcHRpb24+CiAgICAgICAgICAgIHdpdGhpbiBleHRlcm4gIkMiIGJsb2NrLgoKMjAxMy0xMC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGICMxMzQ1IC0gTWlzc2luZyAjaW5jbHVkZSA8c3RkZGVmLmg+IGZvciBvZmZzZXRvZiB3aGVuIHVzaW5nIC1idWlsdGluLgoKMjAxMy0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQXBwbHkgIzkyIC0gbWlzc2luZyByZXR1cm4gc3RhdGVtZW50cyBmb3IgU1dJR19MdWFfYWRkX25hbWVzcGFjZV9kZXRhaWxzKCkKICAgICAgICAgICAgYW5kIFNXSUdfTHVhX25hbWVzcGFjZV9yZWdpc3RlcigpLgoKVmVyc2lvbiAyLjAuMTEgKDE1IFNlcCAyMDEzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEzLTA5LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IGF0dGVtcHQgdG8gZnJlZSBhIG5vbi1oZWFwIG9iamVjdCBpbiBPVVRQVVQgdHlwZW1hcHMgZm9yOgogICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpPVVRQVVQKICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpPVVRQVVQKICAgICAgICAgICAgICBzaWduZWQgbG9uZyBsb25nICpPVVRQVVQKICAgICAgICAgICAgICBjaGFyICpPVVRQVVQKICAgICAgICAgICAgICBzaWduZWQgY2hhcipPVVRQVVQKICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKk9VVFBVVAoKMjAxMy0wOS0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUHVsbCBHaXQgcGF0Y2ggIzYyLgogICAgICAgICAgICAgIDEpIFN0YXRpYyBtZW1iZXJzIGFuZCBzdGF0aWMgZnVuY3Rpb25zIGluc2lkZSBjbGFzcyBjYW4gYmUgYWNjZXNzZWQgYXMKICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lLkNsYXNzTmFtZS5GdW5jdGlvbk5hbWUgKE1lbWJlck5hbWUgcmVzcGVjdGl2ZWx5KS4gT2xkIHdheSBzdWNoIGFzCiAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZS5DbGFzc05hbWVfRnVuY3Rpb25OYW1lIHN0aWxsIHdvcmtzLgogICAgICAgICAgICAgIDIpIFNhbWUgZ29lcyBmb3IgZW51bXMgaW5zaWRlIGNsYXNzZXM6IE1vZHVsZU5hbWUuQ2xhc3NOYW1lLkVudW1WYWx1ZTEgZXRjLgoKMjAxMy0wOS0xMjogd3NmdWx0b24KICAgICAgICAgICAgW1VUTF0gSW5maW5pdHkgaXMgbm93IGJ5IGRlZmF1bHQgYW4gYWNjZXB0YWJsZSB2YWx1ZSBmb3IgdHlwZSAnZmxvYXQnLiBUaGlzIGZpeCBtYWtlcwogICAgICAgICAgICB0aGUgaGFuZGxpbmcgb2YgdHlwZSAnZmxvYXQnIGFuZCAnZG91YmxlJyB0aGUgc2FtZS4gVGhlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoZQogICAgICAgICAgICBDOTkgaXNmaW5pdGUoKSBtYWNybywgb3Igb3RoZXJ3aXNlIHNvbWUgcGxhdGZvcm0gZGVwZW5kZW50IGVxdWl2YWxlbnRzLCB0byBiZSBhdmFpbGFibGUuCgogICAgICAgICAgICBVc2VycyByZXF1aXJpbmcgdGhlIG9sZCBiZWhhdmlvdXIgb2Ygbm90IGFjY2VwdGluZyBpbmZpbml0eSwgY2FuIGRlZmluZSBhICdjaGVjaycgdHlwZW1hcAogICAgICAgICAgICB3aGVyZXZlciBhIGZsb2F0IGlzIHVzZWQsIHN1Y2ggYXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNoZWNrLGZyYWdtZW50PSI8ZmxvYXQuaD4iKSBmbG9hdCwgY29uc3QgZmxvYXQgJiAlewogICAgICAgICAgICAgICAgaWYgKCQxIDwgLUZMVF9NQVggfHwgJDEgPiBGTFRfTUFYKSB7CiAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsICJPdmVyZmxvdyBpbiB0eXBlIGZsb2F0Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMDgtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFB1bGwgR2l0IHBhdGNoICM4MTogSW5jbHVkZSBMdWEgZXJyb3IgbG9jdXMgaW4gU1dJRyBlcnJvciBtZXNzYWdlcy4gIAogICAgICAgICAgICBUaGlzIGlzIHN0YW5kYXJkIGluZm9ybWF0aW9uIGluIEx1YSBlcnJvciBtZXNzYWdlcywgYW5kIG1ha2VzIGl0IG11Y2gKICAgICAgICAgICAgZWFzaWVyIHRvIGZpbmQgYnVncy4KCjIwMTMtMDgtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFB1bGwgR2l0IHBhdGNoICM3NTogSGFuZGxlIFVURi04IGZpbGVzIHdpdGggQk9NIGF0IGJlZ2lubmluZyBvZiBmaWxlLiBXYXMgZ2l2aW5nIGFuCiAgICAgICAgICAgICdJbGxlZ2FsIHRva2VuJyBzeW50YXggZXJyb3IuCgoyMDEzLTA4LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFB1bGwgR2l0IHBhdGNoICM3NzogQWxsb3cgZXhwb3J0aW5nIHN0ZDo6bWFwIHVzaW5nIG5vbi1kZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb24uCgoyMDEzLTA4LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAlaW1wbGljaXRjb252IGlzIGltcHJvdmVkIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucy4gTGlrZSBpbiBDKyssIHRoZSBtZXRob2RzCiAgICAgICAgICAgIHdpdGggdGhlIGFjdHVhbCB0eXBlcyBhcmUgY29uc2lkZXJlZCBiZWZvcmUgdHJ5aW5nIGltcGxpY2l0IGNvbnZlcnNpb25zLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAlaW1wbGljaXRjb252IEE7CiAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgQShpbnQgaSk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBjbGFzcyBDQ0MgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnQgeHgoaW50IGkpIHsgcmV0dXJuIDExOyB9CiAgICAgICAgICAgICAgICAgIGludCB4eChjb25zdCBBJiBpKSB7IHJldHVybiAyMjsgfQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIHB5dGhvbiBjb2RlOgoKICAgICAgICAgICAgICBDQ0MoKS54eCgtMSkKCiAgICAgICAgICAgIHdpbGwgbm93IHJldHVybiAxMSBpbnN0ZWFkIG9mIDIyIC0gdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgbm90IGRvbmUuCgoyMDEzLTA4LTIzOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGNsYW5nKysgd2FybmluZyBpbiBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlLgoKMjAxMy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gJWltcGxpY2l0Y29udiB3aWxsIG5vdyBhY2NlcHQgTm9uZSB3aGVyZSB0aGUgaW1wbGljaXQgY29udmVyc2lvbiB0YWtlcyBhIEMvQysrIHBvaW50ZXIuCiAgICAgICAgICAgIFByb2JsZW0gaGlnaGxpZ2h0ZWQgYnkgQm8gUGVuZy4gQ2xvc2VzIFNGIHBhdGNoICMyMzAuCgoyMDEzLTA4LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBTRiBQYXRjaCAjMzI2IGZyb20gS3JpcyBUaGllbGVtYW5zIC0gUmVtb3ZlIFN3aWdQeU9iamVjdF9wcmludCBhbmQgU3dpZ1B5T2JqZWN0X3N0ciBhbmQKICAgICAgICAgICAgbWFrZSB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgdXNlIHRoZSBkZWZhdWx0IHB5dGhvbiBpbXBsZW1lbnRhdGlvbnMsIHdoaWNoIHdpbGwgZmFsbCBiYWNrIHRvIHJlcHIKICAgICAgICAgICAgKGZvciAtYnVpbHRpbiBvcHRpb24pLgoKICAgICAgICAgICAgQWR2YW50YWdlczoKICAgICAgICAgICAgLSBpdCBhdm9pZHMgdGhlIHN3aWcgdXNlciBoYXZpbmcgdG8ganVtcCB0aHJvdWdoIGhvb3BzIHRvIGdldCBwcmludCB0byB3b3JrIGFzIGV4cGVjdGVkIHdoZW4KICAgICAgICAgICAgICByZWRlZmluaW5nIHJlcHIvc3RyIHNsb3RzLgogICAgICAgICAgICAtIHR5cGluZyB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlIG9uIHRoZSBweXRob24gcHJvbXB0IG5vdyBwcmludHMgdGhlIHJlc3VsdCBvZiBhIChwb3NzaWJseSByZWRlZmluZWQpCiAgICAgICAgICAgICAgcmVwciwgd2l0aG91dCB0aGUgc3dpZyB1c2VyIGhhdmluZyB0byBkbyBhbnkgZXh0cmEgd29yay4KICAgICAgICAgICAgLSB3aGVuIHJlZGVmaW5pbmcgcmVwciwgdGhlIHN3aWcgdXNlciBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgdG8gcmVkZWZpbmUgc3RyIGFzIGl0IHdpbGwgY2FsbCB0aGUKICAgICAgICAgICAgICByZWRlZmluZWQgcmVwcgogICAgICAgICAgICAtIHRoZSBiZWhhdmlvdXIgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB3aXRob3V0IHRoZSAtYnVpbHRpbiBvcHRpb24gd2hpbGUgcmVxdWlyaW5nIG5vIGV4dHJhIHdvcmsKICAgICAgICAgICAgICBieSB0aGUgdXNlciAoYXNpZGUgZnJvbSBhZGRpbmcgdGhlICVmZWF0dXJlKCJweXRob246c2xvdC4uLikgc3RhdGVtZW50cyBvZiBjb3Vyc2UpCgogICAgICAgICAgICBEaXNhZHZhbnRhZ2U6CiAgICAgICAgICAgIC0gZGVmYXVsdCBzdHIoKSB3aWxsIGdpdmUgZGlmZmVyZW50IChidXQgY2xlYXJlcj8pIG91dHB1dCBvbiBzd2lnZ2VkIGNsYXNzZXMKCjIwMTMtMDctMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnldIEZpeCAjNjQgIzY1OiBNaXNzaW5nIGNvZGUgaW4gc3RkOjptdWx0aW1hcCB3cmFwcGVycy4gUHJldmlvdXNseSBhbiBpbnN0YW50aWF0aW9uCiAgICAgICAgICAgIG9mIGEgc3RkOjptYXAgd2FzIGVycm9uZW91c2x5IHJlcXVpcmVkIGluIGFkZGl0aW9uIHRvIGFuIGluc3RhbnRpYXRpb24gb2Ygc3RkOjptdWx0aW1hcCB3aXRoIHRoZQogICAgICAgICAgICBzYW1lIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gcHJldmVudCBjb21waWxhdGlvbiBlcnJvcnMgZm9yIHRoZSB3cmFwcGVycyBvZiBhIHN0ZDo6bXVsdGltYXAuCgoyMDEzLTA3LTE0OiBqb2VxdWFudAogICAgICAgICAgICBbUl0gQ2hhbmdlIHR5cGVzIGZpbGUgdG8gYWxsb3cgZm9yIFNFWFAgcmV0dXJuIHZhbHVlcwoKMjAxMy0wNy0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkICVweXRob25iZWdpbiBkaXJlY3RpdmUgd2hpY2ggd29ya3MgbGlrZSAlcHl0aG9uY29kZSwgZXhjZXB0IHRoZSBzcGVjaWZpZWQgY29kZSBpcwogICAgICAgICAgICBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnZW5lcmF0ZWQgLnB5IGZpbGUuIFRoaXMgaXMgcHJpbWFyaWx5IG5lZWRlZCBmb3IgaW1wb3J0aW5nIGZyb20KICAgICAgICAgICAgX19mdXR1cmVfXyBzdGF0ZW1lbnRzIHJlcXVpcmVkIHRvIGJlIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gRXhhbXBsZToKCiAgICAgICAgICAgICAgJXB5dGhvbmJlZ2luICV7CiAgICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogICAgICAgICAgICAgIHByaW50KCJMb2FkaW5nIiwgIldoaXp6IiwgIkJhbmciLCBzZXA9JyAuLi4gJykKICAgICAgICAgICAgICAlfQoKMjAxMy0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgU0YgcGF0Y2ggIzM0MCAtIFVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgZml4IGluIFNXSUdfUHl0aG9uX05vbkR5bmFtaWNTZXRBdHRyCiAgICAgICAgICAgIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY2FtbF0gQXBwbHkgU0YgcGF0Y2ggIzM0MSAtIGZpeCBhIGNvbnN0X2Nhc3QgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCB3YXMgZ2VuZXJhdGluZwogICAgICAgICAgICBhIDw6OiBkaWdyYXBoIHdoZW4gdXNpbmcgdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgKGdsb2JhbCBzY29wZSkgaW4gYSB0ZW1wbGF0ZSB0eXBlLgoKMjAxMy0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIFNGIHBhdGNoICMzNDIgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgdG8gZml4IHNvbWUgZGlyZWN0b3IgY2xhc3NlcyBjcmFzaGluZyBvbgogICAgICAgICAgICBvYmplY3QgZGVsZXRpb24gd2hlbiB1c2luZyAtYnVpbHRpbi4gRml4ZXMgU0YgYnVnICMxMzAxLgoKMjAxMy0wNi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIFNXSUdfUFlUSE9OX0lOVEVSUFJFVEVSX05PX0RFQlVHIG1hY3JvIHdoaWNoIGNhbiBiZSBkZWZpbmVkIHRvIHVzZSB0aGUgUmVsZWFzZSB2ZXJzaW9uCiAgICAgICAgICAgIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaW4gRGVidWcgYnVpbGRzIG9mIHRoZSB3cmFwcGVycy4gVGhlIFZpc3VhbCBTdHVkaW8gLmRzcCBleGFtcGxlCiAgICAgICAgICAgIGZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZCB0byB1c2UgdGhpcyBzbyB0aGF0IERlYnVnIGJ1aWxkcyB3aWxsIG5vdyB3b3JrIHdpdGhvdXQgaGF2aW5nCiAgICAgICAgICAgIHRvIGluc3RhbGwgb3IgYnVpbGQgYSBEZWJ1ZyBidWlsZCBvZiB0aGUgaW50ZXJwcmV0ZXIuCgoyMDEzLTA2LTA3OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBHaXQgaXNzdWUgIzUyLiBGaXggcmVncmVzc2lvbiB3aXRoIG1pc3NpbmcgcmJfY29tcGxleF9uZXcgZnVuY3Rpb24gZm9yIFJ1YnkKICAgICAgICAgICAgdmVyc2lvbnMgcHJpb3IgdG8gMS45IHVzaW5nIHN0ZDo6Y29tcGxleCB3cmFwcGVycyBpZiBqdXN0IHVzaW5nIHN0ZDo6Y29tcGxleCBhcyBhbiBvdXRwdXQgdHlwZS4KICAgICAgICAgICAgQWxzbyBmaXggdGhlIENvbXBsZXggaGVscGVyIGZ1bmN0aW9ucyBleHRlcm5hbCB2aXNpYmlsaXR5ICh0byBzdGF0aWMgYnkgZGVmYXVsdCkuCgoyMDEzLTA2LTA0OiBvbGx5CgkgICAgW1BIUF0gRml4IFNXSUdfWlRTX0NvbnZlcnRSZXNvdXJjZVB0cigpIG5vdCB0byBkZXJlZmVyZW5jZSBOVUxMCgkgICAgaWYgdGhlIHR5cGUgbG9va3VwIGZhaWxzLgoKVmVyc2lvbiAyLjAuMTAgKDI3IE1heSAyMDEzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEzLTA1LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggUHl0aG9uIDMgaW5jb25zaXN0ZW5jeSB3aGVuIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHBhc3NlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBleHBlY3RzIGFuIHVuc2lnbmVkIEMgdHlwZS4gQW4gT3ZlckZsb3cgZXJyb3IgaXMKICAgICAgICAgICAgbm93IGNvbnNpc3RlbnRseSB0aHJvd24gaW5zdGVhZCBvZiBhIFR5cGVFcnJvci4KCjIwMTMtMDUtMjU6IEFydGVtIFNlcmVicml5c2tpeQogICAgICAgICAgICBTVk4gUGF0Y2ggdGlja2V0ICMzMzggLSBmaXhlcyB0byAlYXR0cmlidXRlIG1hY3JvcyBmb3IgdGVtcGxhdGUgdXNhZ2UKICAgICAgICAgICAgd2l0aCAlYXJnLgoKMjAxMy0wNS0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNjYWNoZS1zd2lnIGludGVybmFsIGVycm9yIGJ1ZyBkdWUgdG8gcHJlbWF0dXJlIGZpbGUgY2xlYW51cC4KCiAgICAgICAgICAgIEZpeGVzIFNGIGJ1ZyAxMzE5IHdoaWNoIHNob3dzIHVwIGFzIGEgZmFpbHVyZSBpbiB0aGUgY2NhY2hlIHRlc3RzIG9uCiAgICAgICAgICAgIERlYmlhbiA2NCBiaXQgV2hlZXp5LCBwb3NzaWJseSBiZWNhdXNlIEVOQUJMRV9aTElCIGlzIGRlZmluZWQuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29ybmVyIGNhc2Ugd2hpY2ggd2lsbCBiZSBoaXQgd2hlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMKICAgICAgICAgICAgaW4gdGhlIGNhY2hlIGlzIHNldCB0byBiZSBxdWl0ZSBsb3cgKC1GIG9wdGlvbiksIHJlc3VsdGluZyBpbiBhIGNhY2hlIG1pc3MuCgoyMDEzLTA1LTA5OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBidWdzIGluIE9jdGF2ZSBtb2R1bGUgbG9hZGluZzoKICAgICAgICAgICAgLSBmaXggYSBtZW1vcnkgbGVhayBpbiBzZXR0aW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgICAgLSBpbnN0YWxsIGZ1bmN0aW9ucyBvbmx5IG9uY2UsIHRvIHNwZWVkIHVwIG1vZHVsZSBsb2FkcwoKMjAxMy0wNC0yODogZ2phbnNzZW5zCiAgICAgICAgICAgIFtHdWlsZV0gVXBkYXRlcyBpbiBndWlsZSBtb2R1bGU6CiAgICAgICAgICAgIC0gQWRkIHN1cHBvcnQgZm9yIGd1aWxlIDIuMAogICAgICAgICAgICAtIERyb3Agc3VwcG9ydCBmb3IgZ3VpbGUgMS42CiAgICAgICAgICAgIC0gRHJvcCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHdyYXBwZXJzIHVzaW5nIGd1aWxlJ3MgZ2ggaW50ZXJmYWNlLgogICAgICAgICAgICAgIEFsbCBnZW5lcmF0ZWQgd3JhcHBlcnMgd2lsbCB1c2UgdGhlIHNjbSBpbnRlcmZhY2UgZnJvbSBub3cgb24uCiAgICAgICAgICAgIC0gRGVwcmVjYXRlIC1naCBhbmQgLXNjbSBvcHRpb25zLiBUaGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLgogICAgICAgICAgICAgIEEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCB3aGVuIHRoZXNlIG9wdGlvbnMgYXJlIHN0aWxsIHVzZWQuCiAgICAgICAgICAgIC0gRml4IGFsbCB0ZXN0cyBhbmQgZXhhbXBsZXMgdG8gaGF2ZSBhIHN1Y2Nlc3NmdWwgdHJhdmlzIHRlc3QKCjIwMTMtMDQtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IFBhdGNoICMzNiBmcm9tIEplc3VzIExvcGV6IHRvIGFkZCBzdXBwb3J0IGZvciAkZGVzY3JpcHRvcigpIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8gZXhwYW5zaW9uIAogICAgICAgICAgICBpbiBmcmFnbWVudHMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWVEZXNjcmlwdG9yIiwgImhlYWRlciIpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lRGVzY3JpcHRvciA9ICIkZGVzY3JpcHRvcihOYW1lKSI7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIHdoaWNoIHdpbGwgZ2VuZXJhdGUgaW50byB0aGUgd3JhcHBlciBpZiB0aGUgZnJhZ21lbnQgaXMgdXNlZDoKCiAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVEZXNjcmlwdG9yID0gIlNXSUdUWVBFX05hbWUiOwoKMjAxMy0wNC0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGIEJ1ZyAjNDI4IC0gU3ludGF4IGVycm9yIHdoZW4gcHJlcHJvY2Vzc29yIG1hY3JvcyBhcmUgZGVmaW5lZCBpbnNpZGUgb2YgZW51bSBsaXN0cywgc3VjaCBhczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtIHsKICAgICAgICAgICAgICAgIGVaZXJvID0gMAogICAgICAgICAgICAgICNkZWZpbmUgT05FIDEKICAgICAgICAgICAgICB9IEVGb287CgogICAgICAgICAgICBUaGUgbWFjcm9zIGFyZSBzaWxlbnRseSBpZ25vcmVkLgoKMjAxMy0wNC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBQdWxsIHBhdGNoICMzNCBmcm9tIEJyYW50S3lzZXIgdG8gZml4IHNtYXJ0IHBvaW50ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggZGlyZWN0b3JzLgoKMjAxMy0wNC0xNToga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBGaXggYnVncyBpbiBvdXRwdXQgb2YgY2xlYW51cCBjb2RlLgogICAgICAgICAgICAtIENsZWFudXAgY29kZSBpcyBub3cgd3JpdHRlbiBhbHNvIGFmdGVyIHRoZSAiZmFpbDoiIGxhYmVsLCBzbyBpdCB3aWxsIGJlIGNhbGxlZCBpZgogICAgICAgICAgICAgIGEgU1dJR19leGNlcHRpb24gaXMgcmFpc2VkIGJ5IHRoZSB3cmFwcGluZyBmdW5jdGlvbiwgY29uc2lzdGVudCB3aXRoIG90aGVyIG1vZHVsZXMuCiAgICAgICAgICAgIC0gT2N0YXZlIG1vZHVsZSBub3cgYWxzbyByZWNvZ25pc2VzIHRoZSAiJGNsZWFudXAiIHNwZWNpYWwgdmFyaWFibGUsIGlmIG5lZWRlZC4KCjIwMTMtMDQtMDg6IGt3d2V0dGUKICAgICAgICAgICAgQWRkIC1NUCBvcHRpb24gdG8gU1dJRyBmb3IgZ2VuZXJhdGluZyBwaG9ueSB0YXJnZXRzIGZvciBhbGwgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAtIFByZXZlbnRzIG1ha2UgZnJvbSBjb21wbGFpbmluZyBpZiBoZWFkZXIgZmlsZXMgaGF2ZSBiZWVuIGRlbGV0ZWQgYmVmb3JlCiAgICAgICAgICAgICAgdGhlIGRlcGVuZGVuY3kgZmlsZSBoYXMgYmVlbiB1cGRhdGVkLgogICAgICAgICAgICAtIE1vZGVsbGVkIG9uIHNpbWlsYXIgb3B0aW9uIGluIEdDQy4KCjIwMTMtMDQtMDk6IG9sbHkKCSAgICBbUEhQXSBBZGQgbWlzc2luZyBkaXJlY3RvcmluIHR5cGVtYXAgZm9yIGNoYXIqIGFuZCBjaGFyW10gd2hpY2gKCSAgICBmaXhlcyBkaXJlY3Rvcl9zdHJpbmcgdGVzdGNhc2UgZmFpbHVyZS4KCjIwMTMtMDQtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBTRiBCdWcgIzEyOTIgLSBSdW50aW1lIGZpeGVzIGZvciBQcm9jIGNoYW5nZXMgaW4gcnVieS0xLjkgd2hlbiB1c2luZyBTVEwKICAgICAgICAgICAgd3JhcHBlcnMgdGhhdCBvdmVycmlkZSB0aGUgZGVmYXVsdCBwcmVkaWNhdGUsIHN1Y2ggYXM6CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShNYXApIHN0ZDo6bWFwPHN3aWc6OkxBTkdVQUdFX09CSiwgc3dpZzo6TEFOR1VBR0VfT0JKLCBzd2lnOjpCaW5hcnlQcmVkaWNhdGU8PiA+OwoKMjAxMy0wNC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNGIEJ1ZyAjMTE1OSAtIENvcnJlY3RseSBjaGVjayByYl9yZXNwb25kX3RvIGNhbGwgcmV0dXJuIHZhbHVlcyB0byBmaXggc29tZQogICAgICAgICAgICBmdXJ0aGVyIDEuOSBwcm9ibGVtcyB3aXRoIGZ1bmN0b3JzIGFuZCB1c2Ugb2YgQ29tcGxleCB3cmFwcGVycy4KCjIwMTMtMDQtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBSdW50aW1lIGZpeGVzIGZvciBzdGQ6OmNvbXBsZXggd3JhcHBlcnMgZm9yIHJ1YnktMS45IC0gbmV3IG5hdGl2ZSBSdWJ5IGNvbXBsZXggbnVtYmVycyBhcmUgdXNlZC4KCjIwMTMtMDMtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggc2VnIGZhdWx0IHdoZW4gdXNpbmcgU1RMIGNvbnRhaW5lcnMgb2YgZ2VuZXJpYyBSdWJ5IHR5cGVzLCBHQ19WQUxVRSBvciBMQU5HVUFHRV9PQkpFQ1QsCiAgICAgICAgICAgIG9uIGV4aXQgb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIuIE1vcmUgZnJlcXVlbnRseSBvYnNlcnZlZCBpbiBydWJ5LTEuOS4KCjIwMTMtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggZGVsZXRlX2lmIChyZWplY3QhKSBmb3IgdGhlIFNUTCBjb250YWluZXIgd3JhcHBlcnMgd2hpY2ggcHJldmlvdXNseSB3b3VsZAogICAgICAgICAgICBzb21ldGltZXMgc2VnIGZhdWx0IG9yIG5vdCB3b3JrLgoKMjAxMy0wMy0yNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNvbWUgdW5kZWZpbmVkIGJlaGF2aW91ciBkZWxldGluZyBzbGljZXMgaW4gdGhlIFNUTCBjb250YWluZXJzLgoKMjAxMy0wMy0xOTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhLCBEXSBGaXggc2VnIGZhdWx0IGluIFNXSUcgdXNpbmcgZGlyZWN0b3JzIHdoZW4gY2xhc3MgYW5kIHZpcnR1YWwgbWV0aG9kIG5hbWVzIGFyZQogICAgICAgICAgICB0aGUgc2FtZSBleGNlcHQgYmVpbmcgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMgd2hlbiB0aGUgJW5zcGFjZSBmZWF0dXJlIGlzIG5vdCBiZWluZyB1c2VkLgoKMjAxMy0wMi0xOToga3d3ZXR0ZQogICAgICAgICAgICBGaXggYnVnIGluIFNXSUcncyBoYW5kbGluZyBvZiBxdWFsaWZpZWQgKGUuZy4gY29uc3QpIHZhcmlhYmxlcyBvZiBhcnJheSB0eXBlLiBHaXZlbiB0aGUgdHlwZWRlZgogICAgICAgICAgICAgIGEoNykucSh2b2xhdGlsZSkuZG91YmxlIG15YXJyYXkgICAgIC8vIHR5cGVkZWYgdm9sYXRpbGUgZG91YmxlWzddIG15YXJyYXk7CiAgICAgICAgICAgIHRoZSB0eXBlCiAgICAgICAgICAgICAgcShjb25zdCkubXlhcnJheSAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgbXlhcnJheQogICAgICAgICAgICBiZWNvbWVzCiAgICAgICAgICAgICAgYSg3KS5xKGNvbnN0IHZvbGF0aWxlKS5kb3VibGUgICAgICAgLy8gY29uc3Qgdm9sYXRpbGUgZG91YmxlWzddCiAgICAgICAgICAgIFByZXZpb3VzbHksIFN3aWdUeXBlX3R5cGVkZWZfcmVzb2x2ZSgpIHByb2R1Y2VzIHRoZSB0eXBlCiAgICAgICAgICAgICAgcShjb25zdCkuYSg3KS5xKHZvbGF0aWxlKS5kb3VibGUgICAgLy8gbm9uLXNlbnNpY2FsIHR5cGUKICAgICAgICAgICAgd2hpY2ggd291bGQgbmV2ZXIgbWF0Y2ggJXR5cGVtYXAgZGVjbGFyYXRpb25zLCB3aG9zZSB0eXBlcyB3ZXJlIHBhcnNlZCBjb3JyZWN0bHkuCiAgICAgICAgICAgIEFkZCB0eXBlbWFwX2FycmF5X3F1YWxpZmllcnMuaSB0byB0aGUgdGVzdCBzdWl0ZSB3aGljaCBjaGVja3MgZm9yIHRoZSBjb3JyZWN0IGJlaGF2aW91ci4KCjIwMTMtMDItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSB0eXBlZGVmIG5hbWVzIHVzZWQgYXMgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbmFtZXMgaW4gJWV4dGVuZC4gVGhlIHJlYWwKICAgICAgICAgICAgY2xhc3Mvc3RydWN0IG5hbWUgc2hvdWxkIGJlIHVzZWQuCgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHRhZ0VTdHJ1Y3QgewogICAgICAgICAgICAgICAgaW50IGl2YXI7CiAgICAgICAgICAgICAgfSBFU3RydWN0OwoKICAgICAgICAgICAgICAlZXh0ZW5kIHRhZ0VTdHJ1Y3QgewogICAgICAgICAgICAgICAgRVN0cnVjdCgpIC8vIGlsbGVnYWwgbmFtZSwgc2hvdWxkIGJlIHRhZ0VTdHJ1Y3QoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBFU3RydWN0ICpzID0gbmV3IEVTdHJ1Y3QoKTsKICAgICAgICAgICAgICAgICAgcy0+aXZhciA9IGl2YXIwOwogICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH5FU3RydWN0KCkgLy8gaWxsZWdhbCBuYW1lLCBzaG91bGQgYmUgfnRhZ0VTdHJ1Y3QoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBkZWxldGUgJHNlbGY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRm9yIG5vdyB0aGVzZSB0cmlnZ2VyIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgZXh0ZW5kX2NvbnN0cnVjdG9yX2Rlc3RydWN0b3IuaToxMDc6IFdhcm5pbmcgNTIyOiBVc2Ugb2YgYW4gaWxsZWdhbCBjb25zdHJ1Y3RvciBuYW1lICdFU3RydWN0JyBpbgogICAgICAgICAgICAgICVleHRlbmQgaXMgZGVwcmVjYXRlZCwgdGhlIGNvbnN0cnVjdG9yIG5hbWUgc2hvdWxkIGJlICd0YWdFU3RydWN0Jy4KICAgICAgICAgICAgICBleHRlbmRfY29uc3RydWN0b3JfZGVzdHJ1Y3Rvci5pOjExMTogV2FybmluZyA1MjM6IFVzZSBvZiBhbiBpbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSAnRVN0cnVjdCcgaW4KICAgICAgICAgICAgICAlZXh0ZW5kIGlzIGRlcHJlY2F0ZWQsIHRoZSBkZXN0cnVjdG9yIG5hbWUgc2hvdWxkIGJlICd0YWdFU3RydWN0Jy4KCiAgICAgICAgICAgIFRoZXNlICVleHRlbmQgZGVzdHJ1Y3RvciBhbmQgY29uc3RydWN0b3IgbmFtZXMgd2VyZSB2YWxpZCB1cCB0byBzd2lnLTIuMC40LCBob3dldmVyIHN3aWctMi4wLjUgaWdub3JlZAogICAgICAgICAgICB0aGVtIGFsdG9nZXRoZXIgZm9yIEMgY29kZSBhcyByZXBvcnRlZCBpbiBTRiBidWcgIzEzMDYuIFRoZSBvbGQgYmVoYXZpb3VyIG9mIHVzaW5nIHRoZW0gaGFzIGJlZW4KICAgICAgICAgICAgcmVzdG9yZWQgZm9yIG5vdywgYnV0IGlzIG9mZmljaWFsbHkgZGVwcmVjYXRlZC4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byBhbm9ueW1vdXNseSBkZWZpbmVkIHR5cGVkZWYKICAgICAgICAgICAgY2xhc3Nlcy9zdHJ1Y3RzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsuLi59IFg7CgoyMDEzLTAyLTE3OiBrd3dldHRlCiAgICAgICAgICAgIFdoZW4gZ2VuZXJhdGluZyBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgJWV4dGVuZCwgdXNlICIodm9pZCkiIGZvciBuby1hcmd1bWVudCBmdW5jdGlvbnMKICAgICAgICAgICAgaW5zdGVhZCBvZiAiKCkiLiBUaGlzIHByZXZlbnRzIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggImdjYyAtV3N0cmljdC1wcm90b3R5cGVzIi4KCjIwMTMtMDItMTc6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gTWlub3IgZml4IHRvIGF1dG9kb2MgZ2VuZXJhdGlvbjogZ2V0IHRoZSByaWdodCB0eXBlIGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIHN0cnVjdHMuCgoyMDEzLTAyLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgdHlwZWRlZiBuYW1lcyB1c2VkIGluICVleHRlbmQgdGhhdCBhcmUgbm90IHRoZSByZWFsIGNsYXNzL3N0cnVjdCBuYW1lLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgU3RydWN0Qk5hbWUgewogICAgICAgICAgICAgICAgaW50IG15aW50OwogICAgICAgICAgICAgIH0gU3RydWN0QjsKCiAgICAgICAgICAgICAgJWV4dGVuZCBTdHJ1Y3RCIHsKICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKCkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aWxsIG5vdyB0cmlnZ2VyIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgc3dpZ19leHRlbmQuaToxOTogV2FybmluZyAzMjY6IERlcHJlY2F0ZWQgJWV4dGVuZCBuYW1lIHVzZWQgLSB0aGUgc3RydWN0IG5hbWUgU3RydWN0Qk5hbWUKICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB0eXBlZGVmIG5hbWUgU3RydWN0Qi4KCiAgICAgICAgICAgIFRoaXMgaXMgb25seSBwYXJ0aWFsbHkgd29ya2luZyBhbnl3YXkgKHRoZSAlZXh0ZW5kIG9ubHkgd29ya2VkIGlmIHBsYWNlZCBhZnRlciB0aGUgY2xhc3MKICAgICAgICAgICAgZGVmaW5pdGlvbikuIAoKMjAxMy0wMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEFwcGx5IHBhdGNoICMyMiAtIEZpeCBtaXNzaW5nIHBhY2thZ2UgYmVmb3JlICZib2R5CgoyMDEzLTAxLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRW5zdXJlICdqYXZhcGFja2FnZScgdHlwZW1hcCBpcyB1c2VkIGFzIGl0IHN0b3BwZWQgd29ya2luZyBmcm9tIHZlcnNpb24gMi4wLjUuCgoyMDEzLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCBTRiAjMzM0IC0gRml4IGRlZmF1bHQgdmFsdWUgY29udmVyc2lvbnMgIlRSVUUiLT5UcnVlLCAiRkFMU0UiLT5GYWxzZS4KCjIwMTMtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCBTRiAjMzM1IC0gVHJ1bHkgaWdub3JlIGNvbnN0cnVjdG9ycyBpbiBkaXJlY3RvcnMgd2l0aCAlaWdub3JlLgoKMjAxMy0wMS0xODogQnJhbnQgS3lzZXIKICAgICAgICAgICAgW0phdmFdIFBhdGNoICMxNSAtIEFsbG93IHRoZSB1c2Ugb2YgdGhlIG5zcGFjZSBmZWF0dXJlIHdpdGhvdXQgdGhlIC1wYWNrYWdlIGNvbW1hbmRsaW5lIG9wdGlvbi4KICAgICAgICAgICAgVGhpcyB3b3JrcyBhcyBsb25nIGFuZCB0aGUgbmV3IGpuaWNsYXNzcGFja2FnZSBwcmFnbWEgaXMgdXNlZCB0byBwbGFjZSB0aGUgSk5JIGludGVybWVkaWF0ZSBjbGFzcwogICAgICAgICAgICBpbnRvIGEgcGFja2FnZSBhbmQgdGhlIG5zcGFjZSBmZWF0dXJlIGlzIHVzZWQgdG8gcGxhY2UgYWxsIGV4cG9zZWQgdHlwZXMgaW50byBhIHBhY2thZ2UuCgoyMDEzLTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggVmlzdWFsIFN0dWRpbyBleGFtcGxlcyB0byB3b3JrIHdoZW4gU1dJRyBpcyB1bnppcHBlZCBpbnRvIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc3BhY2VzLgoKMjAxMy0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggY3N0eXBlIHR5cGVtYXAgbG9va3VwIGZvciBtZW1iZXIgdmFyaWFibGVzIHNvIHRoYXQgYSBmdWxseSBxdWFsaWZpZWQgdmFyaWFibGUgbmFtZQogICAgICAgICAgICBtYXRjaGVzLiBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIGJvb2wgTVZhcjo6bXZhciAiTXlCb29sIgogICAgICAgICAgICAgIHN0cnVjdCBNVmFyIHsKICAgICAgICAgICAgICAgIGJvb2wgbXZhcjsKICAgICAgICAgICAgICB9OwoKMjAxMy0wMS0xMTogQnJhbnQgS3lzZXIKCSAgICBbSmF2YSwgQyMsIERdIFNGIEJ1ZyAjMTI5OSAtIEZpeCBnZW5lcmF0ZWQgbmFtZXMgZm9yIHdoZW4gJW5zcGFjZSBpcyB1c2VkIG9uCiAgICAgICAgICAgIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHR3byBkaWZmZXJlbnQgbmFtZXNwYWNlcy4KCjIwMTMtMDEtMTE6IFZsYWRpbWlyIEthbGluaW4KCSAgICBbQyNdIEFkZCBzdXBwb3J0IGZvciBjc2RpcmVjdG9yaW4gJ3ByZScsICdwb3N0JyBhbmQgJ3Rlcm1pbmF0b3InIGF0dHJpYnV0ZXMuCgoyMDEzLTAxLTA4OiBvbGx5CgkgICAgW1BIUF0gRml4IHRvIHdvcmsgd2l0aCBhIFpUUyBidWlsZCBvZiBQSFAgKGJyb2tlbiBpbiAyLjAuNykuCgoyMDEzLTAxLTA3OiBvbGx5CgkgICAgRml4IGJhc2hpc20gaW4gY29uZmlndXJlLCBpbnRyb2R1Y2VkIGluIDIuMC45LgoKMjAxMy0wMS0wNjogd3NmdWx0b24KICAgICAgICAgICAgUHVsbCBwYXRjaCAjNCBmcm9tIHB0b211bGlrIHRvIGZpeCBTRiBCdWcgIzEyOTYgLSBGaXggaW5jb3JyZWN0IHdhcm5pbmcgZm9yIHZpcnR1YWwgZGVzdHJ1Y3RvcnMKICAgICAgICAgICAgaW4gdGVtcGxhdGVzLCBzdWNoIGFzOgogICAgICAgICAgICAgV2FybmluZyA1MjE6IElsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lIEI8IEEgPjo6fkIoKS4gSWdub3JlZC4KCjIwMTMtMDEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB1bGwgcGF0Y2ggIzMgZnJvbSBwdG9tdWxpayB0byBmaXggU0YgQnVnICMxMjk1IC0gc3RhbmRhcmQgZXhjZXB0aW9ucyBhcwogICAgICAgICAgICBjbGFzc2VzIHVzaW5nIHRoZSBTV0lHX1NURF9FWENFUFRJT05TX0FTX0NMQVNTRVMgbWFjcm8uCgoyMDEzLTAxLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUHVsbCBwYXRjaCAjMiBmcm9tIEJyYW50S3lzZXIgdG8gZml4IFNGIEJ1ZyAjMTI4MyAtIGZpeCBzbWFydCBwb2ludGVycyBpbiBjb25qdWN0aW9uCiAgICAgICAgICAgIHdpdGggZGlyZWN0b3JzLgoKMjAxMy0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFB1bGwgcGF0Y2ggIzEgZnJvbSBCcmFudEt5c2VyIHRvIGZpeCBTRiBCdWcgIzEyNzggLSBmaXggZGlyZWN0b3JzIGFuZCBuc3BhY2UgZmVhdHVyZSB3aGVuCiAgICAgICAgICAgIG11bHRpbGV2ZWwgbmFtZXNwYWNlcyBhcmUgdXNlZC4KClZlcnNpb24gMi4wLjkgKDE2IERlY2VtYmVyIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTEyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2FyYmFnZSBsaW5lIG51bWJlciAvIGVtcHR5IGZpbGUgbmFtZSByZXBvcnRpbmcgZm9yIHNvbWUgbWlzc2luZwogICAgICAgICAgICAnfScgb3IgJyknIGVycm9yIG1lc3NhZ2VzLgoKMjAxMi0xMi0xNToga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggMzUzMDQ0NCwgQ2xhc3MjbWV0aG9kcyBhbmQgQ2xhc3MjY29uc3RhbnRzIHJldHVybnMgYXJyYXkgb2YKICAgICAgICAgICAgc3ltYm9scyBpbiBSdWJ5IDEuOSsKCjIwMTItMTItMTQ6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIDM1MzA0MzkgYW5kIGZpbmFsbHkgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIFNUUjJDU1RSKCkgbWFjcm8KICAgICAgICAgICAgd2l0aCBTdHJpbmdWYWx1ZVB0cigpLiBTVFIyQ1NUUiB3YXMgZGVwcmVjYXRlZCBzaW5jZSB5ZWFycyBhbmQgZ290IHJlbW92ZWQgaW4gUnVieSAxLjkKCjIwMTItMTItMTQ6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIEFwcGxpZWQgcGF0Y2hlcyAjMzUzMDQ0MiBhbmQgMzUzMDQ0MyB0byBhZGFwdCBjb21waWxlIGFuZCBydW50aW1lIGluY2x1ZGUKICAgICAgICAgICAgcGF0aHMgdG8gbWF0Y2ggUnVieSAxLjkrCgoyMDEyLTEyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gRml4ICMzMTYxNjE0IC0gU29tZSBzdHJpbmcgY29uc3RhbnRzIGFyZSBpbmNvcnJlY3QKCjIwMTItMTItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBGaXggIzM1Mjk2OTAgLSBGaXggaW5jb3JyZWN0IGNvbnN0YW50IG5hbWVzLgoKMjAxMi0xMi0xMjogZHJqb2UKCSAgICBbUl0gYWRkIGZpeCB0byBmaW5hbGl6ZXIgdGhhdCB3YXMgbWlzc2VkIGVhcmxpZXIKCjIwMTItMTItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMzNTkwNTIyIC0gZnVsbHkgcXVhbGlmaWVkIHBhY2thZ2UgcGF0aHMgZm9yIFB5dGhvbiAzIGV2ZW4gaWYgYSBtb2R1bGUgaXMgaW4gdGhlCiAgICAgICAgICAgIHNhbWUgcGFja2FnZS4KCjIwMTItMTItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEJ1ZyAjMzU2MzY0NyAtIFB5SW50X0Zyb21TaXplX3QgdW5hdmFpbGFibGUgcHJpb3IgdG8gUHl0aG9uIDIuNSBmb3IgdW5zaWduZWQgaW50IHR5cGVzLgoKMjAxMi0xMi0wODogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBidWcgIzM1NzEzNjEgLSBDKysgY29tbWVudCBpbiBDIHdyYXBwZXJzLgoKMjAxMi0xMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBcHBseSBwYXRjaCAjMzU3MTAyOSB3aGljaCBhZGRzIG1pc3NpbmcgZGlyZWN0b3Igc3VwcG9ydCBmb3IgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYuCgoyMDEyLTExLTI4OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIFNpbXBsaWZpZWQgbW9kdWxlIGxvYWRpbmc6IG5vdyBqdXN0IHRoZSBzeW50YXgKICAgICAgICAgICAgJCBleGFtcGxlOwogICAgICAgICAgICBpcyBhY2NlcHRlZCwgd2hpY2ggbG9hZHMgZnVuY3Rpb25zIGdsb2JhbGx5IGJ1dCBjb25zdGFudHMgYW5kIHZhcmlhYmxlcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzY29wZS4KICAgICAgICAgICAgVGhpcyBtYWtlIG1vZHVsZSBsb2FkaW5nIGJlaGF2aW91ciByZWxpYWJseSBjb25zaXN0ZW50LCBhbmQgcmVkdWNlcyBwcm9ibGVtcyB3aGVuIGxvYWRpbmcgbW9kdWxlcyB3aGljaAogICAgICAgICAgICBkZXBlbmQgb24gb3RoZXIgbW9kdWxlcyB3aGljaCBtYXkgbm90IGhhdmUgYmVlbiBwcmV2aW91c2x5IGxvYWRlZC4KCjIwMTItMTEtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtjZmZpXSBGaXgganVuayBvdXRwdXQgd2hlbiB3cmFwcGluZyBzaW5nbGUgY2hhcmFjdGVyIGxpdGVyYWwgY29uc3RhbnRzLgoKMjAxMi0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1RjbCwgTW9kdWxhM10gQWRkIG1pc3Npbmcgc3VwcG9ydCBmb3IgLW91dGRpci4KCjIwMTItMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWdmYXVsdHMgd2hlbiB1c2luZyBmaWxlbmFtZSBwYXRocyBncmVhdGVyIHRoYW4gMTAyNCBjaGFyYWN0ZXJzIGluIGxlbmd0aC4KCjIwMTItMTEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtjY2FjaGUtc3dpZ10gQXBwbHkgcGF0Y2ggIzM1ODYzOTIgZnJvbSBGcmVkZXJpayBEZXdlZXJkdCB0byBmaXggc29tZSBlcnJvciBjYXNlcyAtIGluY29ycmVjdGx5IHVzaW5nCiAgICAgICAgICAgIG1lbW9yeSBhZnRlciBpdCBoYXMgYmVlbiBkZWxldGVkLgoKMjAxMi0xMS0wOTogdnplaXRsaW4KICAgICAgICAgICAgW1B5dGhvbl0gRml4IG92ZXJmbG93IHdoZW4gcGFzc2luZyB2YWx1ZXMgZ3JlYXRlciB0aGFuIExPTkdfTUFYIGZyb20gUHl0aG9uIDMgZm9yIHBhcmFtZXRlcnMgd2l0aCB1bnNpZ25lZCBsb25nIEMgdHlwZS4KCjIwMTItMTEtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIGZlYXR1cmUgbWF0Y2hpbmcgaXNzdWVzIGZvciBpbXBsaWNpdCBkZXN0cnVjdG9ycyBhbmQgaW1wbGljaXQgY29uc3RydWN0b3JzIGFuZCBpbXBsaWNpdAogICAgICAgICAgICBjb3B5IGNvbnN0cnVjdG9ycyBhZGRlZCB3aXRoICVjb3B5Y3Rvci4gUHJldmlvdXNseSBhIGZlYXR1cmUgZm9yIHRoZXNlIGhhZCB0byBiZSBmdWxseSBxdWFsaWZpZWQKICAgICAgICAgICAgaW4gb3JkZXIgdG8gbWF0Y2guIE5vdyB0aGUgZm9sbG93aW5nIHdpbGwgYWxzbyBtYXRjaDoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInh5eiIpIH5YWFgoKTsKICAgICAgICAgICAgICBzdHJ1Y3QgWFhYIHt9OwoKMjAxMi0xMS0wOTogd3NmdWx0b24KICAgICAgICAgICAgRnVydGhlciBjb25zaXN0ZW5jeSBpbiBuYW1lZCBvdXRwdXQgdHlwZW1hcCBsb29rdXBzIGZvciBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZAogICAgICAgICAgICBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9ycyBhZGRlZCB3aXRoICVjb3B5Y3Rvci4gUHJldmlvdXNseSBvbmx5IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSB3YXMgYmVpbmcKICAgICAgICAgICAgdXNlZCwgbm93IHRoZSB1bnF1YWxpZmllZCBuYW1lIHdpbGwgYWxzbyBiZSB1c2VkLiBGb3IgZXhhbXBsZSwgcHJldmlvdXNseToKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM4OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkCgogICAgICAgICAgICBOb3cgdGhlIHVucXVhbGlmaWVkIG5hbWUgaXMgYWxzbyB1c2VkOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6Mzg6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgfk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkCgoyMDEyLTExLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSBzdWJ0bGUgbmFtZWQgb3V0cHV0IHR5cGVtYXAgbG9va3VwIG1pc3NlcywgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHdhcyBub3QgYWx3YXlzIGJlaW5nCiAgICAgICAgICAgIHVzZWQgZm9yIHZhcmlhYmxlcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBHbG9iIHsKICAgICAgICAgICAgICAgIGludCBNeVZhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJldmlvdXNseSB0aGUgc2VhcmNoIHJ1bGVzIChhcyBzaG93biBieSAtZGVidWctdG1zZWFyY2gpIGZvciB0aGUgZ2V0dGVyIHdyYXBwZXIgd2VyZToKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IGludCBNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludAoKICAgICAgICAgICAgTm93IHRoZSBzY29wZSBpcyBuYW1lZCBjb3JyZWN0bHk6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTo0NDogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiBpbnQgR2xvYjo6TXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQgR2xvYjo6TXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQgTXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQKCjIwMTItMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXJlY3RvciB0eXBlbWFwIHNlYXJjaGluZyBzbyB0aGF0IGEgdHlwZW1hcCBzcGVjaWZpZWQgd2l0aCBhIG5hbWUgd2lsbCBiZSBjb3JyZWN0bHkgbWF0Y2hlZC4gUHJldmlvdXNseQogICAgICAgICAgICB0aGUgbmFtZSB3YXMgaWdub3JlZCBkdXJpbmcgdGhlIHR5cGVtYXAgc2VhcmNoLiBBcHBsaWVzIHRvIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiB0eXBlbWFwczogCiAgICAgICAgICAgIGRpcmVjdG9yb3V0LCBjc2RpcmVjdG9yb3V0LCBjc3R5cGUsIGltdHlwZSwgY3R5cGUsIGRkaXJlY3Rvcm91dCwgZHR5cGUsIGdvdHlwZSwganR5cGUsIGpuaSwgamF2YWRpcmVjdG9yb3V0LgoKMjAxMi0xMC0xMTogd3NmdWx0b24KICAgICAgICAgICAgTW9zdCBvZiB0aGUgc3BlY2lhbCB2YXJpYWJsZXMgYXZhaWxhYmxlIGZvciB1c2UgaW4gJWV4Y2VwdGlvbiBhcmUgbm93IGFsc28gYXZhaWxhYmxlIGZvciBleHBhbnNpb24gaW4KICAgICAgICAgICAgJWV4dGVuZCBibG9ja3MuIFRoZXNlIGFyZTogJG5hbWUgJHN5bW5hbWUgJG92ZXJuYW1lICRkZWNsICRmdWxsZGVjbCAkcGFyZW50Y2xhc3NuYW1lICRwYXJlbnRjbGFzc3N5bW5hbWUsIHNlZSBkb2NzCiAgICAgICAgICAgIG9uICJDbGFzcyBleHRlbnNpb24iIGluIFNXSUdQbHVzLmh0bWwuIFBhdGNoIGJhc2VkIG9uIHN1Ym1pc3Npb24gZnJvbSBLcmlzIFRoaWVsZW1hbnMuCgoyMDEyLTEwLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRpdGlvbmFsIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBpbiAlZXhjZXB0aW9uIGFyZSBleHBhbmRlZCBhcyBmb2xsb3dzOgogICAgICAgICAgICAgICRwYXJlbnRjbGFzc25hbWUgLSBUaGUgcGFyZW50IGNsYXNzIG5hbWUgKGlmIGFueSkgZm9yIGEgbWV0aG9kLgogICAgICAgICAgICAgICRwYXJlbnRjbGFzc3N5bW5hbWUgLSBUaGUgdGFyZ2V0IGxhbmd1YWdlIHBhcmVudCBjbGFzcyBuYW1lIChpZiBhbnkpIGZvciBhIG1ldGhvZC4KCjIwMTItMTAtMDg6IGlhbnQKCSAgICBbR29dIEdlbmVyYXRpbmcgR28gY29kZSBub3cgcmVxdWlyZXMgdXNpbmcgdGhlIC1pbnRnb3NpemUgb3B0aW9uIHRvCgkgICAgaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhlICdpbnQnIHR5cGUgaW4gR28uICBUaGlzIGlzIGJlY2F1c2UgdGhlCgkgICAgc2l6ZSBvZiB0aGUgdHlwZSBpcyBjaGFuZ2luZyBmcm9tIEdvIDEuMCB0byBHbyAxLjEgZm9yIHg4Nl82NC4gCgoyMDEyLTA5LTE0OiB3c2Z1bHRvbgoJICAgIEFkZCBuZXcgd2FybmluZyBpZiB0aGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBCYXNlIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIEJhc2U8aW50PjsKICAgICAgICAgICAgICBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2U8aW50PiB7fTsKCiAgICAgICAgICAgIGdpdmVzIHRoZSBmb2xsb3dpbmcgd2FybmluZyBpbnN0ZWFkIG9mIHNpbGVudGx5IGlnbm9yaW5nIHRoZSBiYXNlOgoKICAgICAgICAgICAgY3BwX2luaGVyaXQuaTo1MjogV2FybmluZyA0MDE6IEJhc2UgY2xhc3MgJ0Jhc2U8IGludCA+JyBoYXMgbm8gbmFtZSBhcyBpdCBpcyBhbiBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgd2l0aCAnJXRlbXBsYXRlKCknLiBJZ25vcmVkLgogICAgICAgICAgICBjcHBfaW5oZXJpdC5pOjUxOiBXYXJuaW5nIDQwMTogVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSB3cml0dGVuIGJlZm9yZSAnQmFzZTwgaW50ID4nIGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGFuZCBiZSBkZWNsYXJlZCB3aXRoIGEgbmFtZS4KCgoyMDEyLTA5LTExOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzM1MzUzMDQgLSBEaXJlY3QgdXNlIG9mIGEgd2VhayBnbG9iYWwgcmVmZXJlbmNlIGluIGRpcmVjdG9ycwogICAgICAgICAgICBzb21ldGltZXMgY2F1c2luZyBzZWcgZmF1bHRzIGVzcGVjaWFsbHkgb24gQW5kcm9pZC4KCjIwMTItMDktMDY6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcyB0byBhY2NlcHQgTlVMTCBzdHJpbmcuCgoyMDEyLTA4LTI2OiBkcmpvZQoJICAgIFtSXSBtYWtlIEV4dGVybmFsUmVmZXJlbmNlIHNsb3QgcmVmIHRvIGNvbnRhaW4gcmVmZXJlbmNlCgoyMDEyLTA4LTI2OiBkcmpvZQoJICAgIFtSXSBmaXggRXhhbXBsZXMvTWFrZWZpbGUgdG8gdXNlIEMgaW4gJChDQykgcmF0aGVyIHRoYW4gJChDWFgpCgpWZXJzaW9uIDIuMC44ICgyMCBBdWd1c3QgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQWRkIHNpemVfdHlwZSwgdmFsdWVfdHlwZSwgY29uc3RfcmVmZXJlbmNlIHRvIHRoZSBTVEwgY29udGFpbmVycy4KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBkaXNjYXJkIGFuZCBhZGQgbWV0aG9kcyB0byBzdGQ6OnNldCB3cmFwcGVycyBzbyB0aGF0IHB5YWJjLmkgY2FuIGJlIHVzZWQgZW5zdXJpbmcKICAgICAgICAgICAgTXV0YWJsZVNldCBpcyBhIHZhbGlkIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHN0ZDo6c2V0LiBBcyByZXBvcnRlZCBieSBBbGV4ZXkgU29rb2xvdi4KICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBzdGQ6Om11bHRpc2V0LgoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMzNTQxNzQ0IC0gTWlzc2luZyBQeUludF9Gcm9tU2l6ZV90IGNhbGxzIGZvciBQeXRob24gMy4KCjIwMTItMDgtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIERhdmlkIEJhdW0gdG8gYWRkIHRoZSBhc3N1bWVvdmVycmlkZSBmZWF0dXJlIGZvciBKYXZhIGRpcmVjdG9ycyB0bwogICAgICAgICAgICBpbXByb3ZlIHBlcmZvcm1hbmNlIHdoZW4gYWxsIG92ZXJyaWRkZW4gbWV0aG9kcyBjYW4gYmUgYXNzdW1lZCB0byBiZSBvdmVycmlkZGVuLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzM1MzAwMjEgRml4IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggIzM1MzYzNjAgLSBJbnZhbGlkIGNvZGUgc29tZXRpbWVzIGJlaW5nIGdlbmVyYXRlZCBmb3IgZGlyZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB3aXRoIG1hbnkgYXJndW1lbnRzLgoKMjAxMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdICMzNTQ1ODc3IC0gRG9uJ3QgdW5kZWZpbmUgYm9vbCBpZiBkZWZpbmVkIGJ5IEM5OSBzdGRib29sLmggLSBwcm9ibGVtIHVzaW5nIAogICAgICAgICAgICBQZXJsIDUuMTYgYW5kIGxhdGVyLgoKMjAxMi0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGluY29ycmVjdCB3YXJuaW5nICgzMTQpIGFib3V0IHRhcmdldCBsYW5ndWFnZSBrZXl3b3JkcyB3aGljaCB3ZXJlIHRyaWdnZXJlZAogICAgICAgICAgICBieSB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIHVzaW5nIGRpcmVjdGl2ZXMuIEZvciBleGFtcGxlICdzdHJpbmcnIGlzIGEga2V5d29yZCBpbiBDIzoKICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsgY2xhc3Mgc3RyaW5nOyB9CiAgICAgICAgICAgICAgdXNpbmcgc3RkOjpzdHJpbmc7CgoyMDEyLTA3LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlzcGxheSBvZiBwb2ludGVycyBpbiB2YXJpb3VzIHBsYWNlcyBvbiA2NCBiaXQgc3lzdGVtcyAtIG9ubHkgMzIgYml0cyB3ZXJlIGJlaW5nIHNob3duLgoKMjAxMi0wNy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdkYiBkZWJ1Z2dlciBmdW5jdGlvbnMgJ3N3aWdwcmludCcgYW5kICdsb2Nzd2lncHJpbnQnIHRvIGRpc3BsYXkgdG8gdGhlIGdkYiBvdXRwdXQgd2luZG93CiAgICAgICAgICAgIHJhdGhlciB0aGFuIHN0ZG91dC4gVGhpcyBmaXhlcyBkaXNwbGF5IHByb2JsZW1zIGluIGdkYnR1aSBhbmQgdGhlIGVuc3VyZXMgdGhlIG91dHB1dAogICAgICAgICAgICBhcHBlYXJzIHdoZXJlIGV4cGVjdGVkIGluIG90aGVyIGdkYiBiYXNlZCBkZWJ1Z2dlcnMgc3VjaCBhcyBFY2xpcHNlIENEVC4KCjIwMTItMDctMjA6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gc2VnZmF1bHQtb24tZXhpdCBwcmV2ZW50aW9uIGhhY2sgbm93IHByZXNlcnZlcyBleGl0IHN0YXR1cywgYW5kIHVzZXMgQzk5IF9FeGl0KCkuCgoyMDEyLTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggRGViaWFuIGJ1ZyBodHRwOi8vYnVncy5kZWJpYW4ub3JnLzY3MjAzNSwgdHlwZW1hcCBjb3B5IGZhaWx1cmUgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgCiAgICAgICAgICAgIGluIHN3aWctMi4wLjU6CiAgICAgICAgICAgICAgJWluY2x1ZGU8c3RsLmk+CiAgICAgICAgICAgICAgdXNpbmcgc3RkOjpwYWlyOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShTdHJQYWlyKSBwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz47CgoyMDEyLTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIHNvIHRoYXQKICAgICAgICAgICAgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZSBmb3IgdGVtcGxhdGVzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaGluZzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBPdXRlcjI7CiAgICAgICAgICAgICAgdXNpbmcgU3BhY2UyOjpUaGluZzI7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgIC8vIFNUSUxMIEJST0tFTiB2b2lkIHVzZWl0MihUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYShPdXRlcjI6OlNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmIoOjpPdXRlcjI6OlNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmMoU3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgdm9pZCB1c2VpdDJkKFNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShUaGluZzJJbnQpIFRoaW5nMjxpbnQ+OwoKCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0ZW1wbGF0ZSBuYW1lc3BhY2UgcHJvYmxlbXMgZm9yIHN5bWJvbHMgZGVjbGFyZWQgd2l0aCBhIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UxIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWVlZOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFNwYWNlMjo6WVlZIHsKICAgICAgICAgICAgICAgICAgVCB5eXkoVCBoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgIH0gICAgCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMShTcGFjZTE6OlNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkyKFNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkzKDo6U3BhY2UxOjpTcGFjZTI6OllZWTxpbnQ+IHl5KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFlZWUludCkgU3BhY2UxOjpTcGFjZTI6OllZWTxpbnQ+OwoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IG5hbWVzcGFjZSBwcm9ibGVtcyBmb3Igc3ltYm9scyBkZWNsYXJlZCB3aXRoIGEgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBYWFg7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBZWVk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3RydWN0IFNwYWNlMjo6WVlZIHt9OwogICAgICAgICAgICAgICAgc3RydWN0IFNwYWNlMTo6U3BhY2UyOjpYWFgge307CgogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WFhYMihTcGFjZTI6OlhYWCB4eCkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTIoU3BhY2UyOjpZWVkgeXkpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hlcmUgeHggYW5kIHl5IHdlcmUgbm90IHJlY29nbmlzZWQgYXMgdGhlIHByb3h5IGNsYXNzZXMgWFhYIGFuZCBZWVkuCgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIHNvIHRoYXQKICAgICAgICAgICAgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZS4gCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIGNsYXNzIFRoaW5nMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsKICAgICAgICAgICAgICBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgLy8gTm9uZSBvZiB0aGUgbWV0aG9kcyBiZWxvdyBjb3JyZWN0bHkgdXNlZCB0aGUgVGhpbmcyIHByb3h5IGNsYXNzCiAgICAgICAgICAgICAgdm9pZCB1c2VpdDIoVGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJhKE91dGVyMjo6U3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmIoOjpPdXRlcjI6OlNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJjKFNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICB2b2lkIHVzZWl0MmQoU3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB9CgoyMDEyLTA2LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNpbmcgZGVjbGFyYXRpb25zIGNvbWJpbmVkIHdpdGggdXNpbmcgZGlyZWN0aXZlcyBzbyB0aGF0IHR5cGVzIGFyZSBjb3JyZWN0bHkgZm91bmQgaW4gc2NvcGUuCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsgLy8gdXNpbmcgZGlyZWN0aXZlCiAgICAgICAgICAgICAgdXNpbmcgU3BhY2UyOjpUaGluZzI7IC8vIHVzaW5nIGRlY2xhcmF0aW9uCiAgICAgICAgICAgICAgdm9pZCB1c2VpdDIoVGhpbmcyIHQpIHt9CgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHRlbXBsYXRlZCBjbGFzc2VzLgoKMjAxMi0wNS0yOTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNTI5NjAxIC0gc2VnIGZhdWx0IHdoZW4gYSBwcm90ZWN0ZWQgbWV0aG9kIGhhcyB0aGUgImRpcmVjdG9yIgogICAgICAgICAgICBmZWF0dXJlIGJ1dCB0aGUgcGFyZW50IGNsYXNzIGRvZXMgbm90LiBBbHNvIGZpeCBzaW1pbGFyIHByb2JsZW1zIHdpdGgKICAgICAgICAgICAgdGhlIGFsbHByb3RlY3RlZCBmZWF0dXJlLgoKMjAxMi0wNS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gd2FybiBhYm91dCBhbiBpbGxlZ2FsIGRlc3RydWN0b3IgLSAjMzUzMDA1NSwgMzUzMDA3OCBhbmQgIzM1MzAxMTguCgpWZXJzaW9uIDIuMC43ICgyNiBNYXkgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09CjIwMTItMDUtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVtYXAgbW9kaWZpY2F0aW9ucyBzbyB0aGV5IGNhbiBiZSB1c2VkIHdpdGggJWFwcGx5IGZvciBvdGhlciBzdHJpbmcKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMTItMDUtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeGVzIGZvciAtZXh0ZXJuYWwtcnVudGltZSB0byB3b3JrIGFnYWluLgoKMjAxMi0wNS0yMjogc3phZ2VyCgkgICAgW3B5dGhvbl0gRGlzYW1iaWd1YXRlIFNXSUdfRnJvbV91bnNpZ25lZF9TU19pbnQgYW5kIFNXSUdfRnJvbV91bnNpZ25lZF9TU19sb25nLgoKMjAxMi0wNS0xODogb2xseQoJICAgIFtQSFBdIEZpeCBnZXR0ZXJzIGZvciB0ZW1wbGF0ZSBtZW1iZXJzLiAoU0YjMzQyODgzMywgU0YjMzUyODAzNSkKCjIwMTItMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIGxhbmd1YWdlJ3Mgc3RkOjptYXAgd3JhcHBlcnMgdG8gcmVjb2duaXNlIGRpZmZlcmVuY2VfdHlwZSwgc2l6ZV90eXBlLCBrZXlfdHlwZQogICAgICAgICAgICBhbmQgbWFwcGVkX3R5cGUuCgoyMDEyLTA1LTE0OiBrd3dldHRlIChzaWduZWQgb2ZmIGJ5IHhhdmllcjk4KQogICAgICAgICAgICBbT2N0YXZlXSBQcmV2ZW50IE9jdGF2ZSBmcm9tIHNlZy1mYXVsdGluZyBhdCBleGl0IHdoZW4gU1dJRwogICAgICAgICAgICBtb2R1bGVzIGFyZSBsb2FkZWQsIGR1ZSB0byBidWdzIGluIE9jdGF2ZSdzIGNsZWFudXAgY29kZToKICAgICAgICAgICAgKiBXcmFwcGluZyBmdW5jdGlvbnMgbm93IGRlY2xhcmVkIHdpdGggT2N0YXZlIERFRlVOX0RMRCBtYWNybywKICAgICAgICAgICAgICBhbmQgbG9hZGVkIHRocm91Z2ggT2N0YXZlJ3MgZHluYW1pYyBtb2R1bGUgbG9hZGVyCiAgICAgICAgICAgICogR2xvYmFsIHZhcmlhYmxlcyBvZiBzd2lncmVmIHR5cGUgYXJlIG5vdyBhc3NpZ25lZCBhIG5ldygpCiAgICAgICAgICAgICAgY29weSBvZiB0aGUgc3dpZ3JlZiBjbGFzcywgdG8gcHJldmVudCBkb3VibGUtZnJlZSBlcnJvcnMKICAgICAgICAgICAgKiBTV0lHIG1vZHVsZSBhdC1leGl0IGNsZWFudXAgZnVuY3Rpb24gbm93IGNyZWF0ZWQgaW4gT2N0YXZlCiAgICAgICAgICAgICAgdGhyb3VnaCBldmFsKCksIHNvIG5vdCBkZXBlbmRlbnQgb24gbG9hZGVkIC5vY3QgbGlicmFyeQogICAgICAgICAgICAqIEZvciBPY3RhdmUgdmVyc2lvbnMgMy4xLiogdG8gMy4zLiosIHJlZ2lzdGVyIEMtbGV2ZWwgYXQtZXhpdAogICAgICAgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHRlcm1pbmF0ZXMgT2N0YXZlIGltbWVkaWF0ZWx5ICh3aXRoIGNvcnJlY3QKICAgICAgICAgICAgICBzdGF0dXMgY29kZSkgd2l0aG91dCBwZXJmb3JtaW5nIG1lbW9yeSBjbGVhbnVwLiBUaGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCBtYWNyb3MgaW4gTGliL29jdGF2ZS9vY3RydW50aW1lLnN3ZwoKICAgICAgICAgICAgW09jdGF2ZV0gTmV3IHN5bnRheCBmb3IgZGV0ZXJtaW5nIHdoZXRoZXIgU1dJRyBtb2R1bGUgc2hvdWxkIGJlCiAgICAgICAgICAgIGxvYWRlZCBnbG9iYWxseSBvciBub24tZ2xvYmFsbHkuIFRvIGxvYWQgbW9kdWxlICJleGFtcGxlIiBnbG9iYWxseSwKICAgICAgICAgICAgdHlwZSB0aGUgbW9kdWxlIG5hbWUKICAgICAgICAgICAgJCBleGFtcGxlOwogICAgICAgICAgICBhcyBiZWZvcmU7IHRvIGxvYWQgbW9kdWxlIG5vbi1nbG9iYWxseSwgYXNzaWduIGl0IHRvIGEgdmFyaWFibGU6CiAgICAgICAgICAgICQgZXhhbXBsZSA9IGV4YW1wbGU7CiAgICAgICAgICAgIG9yCiAgICAgICAgICAgICQgZXggPSBleGFtcGxlOwogICAgICAgICAgICBmb3IgYSBzaG9ydGVyIChsb2NhbCkgbW9kdWxlIG5hbWUuIC1nbG9iYWwvLW5vZ2xvYmFsIGNvbW1hbmQtbGluZQogICAgICAgICAgICBvcHRpb25zIGFuZCBtb2R1bGUgY29tbWFuZCBsaW5lIGFyZSBkZXByZWNhdGVkLiBBZGRlZCB1c2FnZSBpbmZvCiAgICAgICAgICAgIHRvIG1vZHVsZSwgc28gdHlwaW5nCiAgICAgICAgICAgICQgaGVscCBleGFtcGxlCiAgICAgICAgICAgIG9yIGluY29ycmVjdCB1c2FnZSBzaG91bGQgZGlzcGxheSBwcm9wZXIgdXNhZ2UsIHdpdGggZXhhbXBsZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEyLTA1LTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIGNvZGUgZ2VuZXJhdGVkIGZvciBhIGNhbGxiYWNrLiAgUGF0Y2ggZnJvbQoJICAgIFNGIGJ1ZyAjMzUxMDgwNi4KCjIwMTItMDUtMTI6IG9sbHkKCSAgICBbUEhQXSBBdm9pZCB1c2luZyB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgYXMgaXQgZG9lc24ndCB3b3JrIHdpdGggYWxsCgkgICAgYnVpbGRzIG9mIFBIUCAoU0YgYnVnICMzMTY2NDIzKS4gIEluc3RlYWQgd2Ugbm93IHdyYXAgaXQgaW4gYQoJICAgIFNXSUdfRkFJTCgpIGZ1bmN0aW9uIHdoaWNoIHdlIGFubm90YXRlIGFzICJub3JldHVybiIgZm9yIEdDQyB0bwoJICAgIGF2b2lkcyB3YXJuaW5ncy4gIFRoaXMgYWxzbyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb21waWxlZAoJICAgIHdyYXBwZXIgKGUuZy4gdGhlIHN0cmlwcGVkIHNpemUgaXMgcmVkdWNlZCBieSA2JSBmb3IgWGFwaWFuJ3MgUEhQCgkgICAgYmluZGluZ3MpLgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGIHBhdGNoICMzNTIyODU1IEZpeCB1bmludGVuZGVkIHVuaW5pdGlhbGlzZWQgbWVtb3J5IGFjY2VzcyBpbiBPVVRQVVQgdHlwZW1hcHMuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI2NzQgRml4IHBvc3NpYmxlIHVuaW5pdGlhbGlzZWQgbWVtb3J5IGFjY2VzcyBpbiBjaGFyICoqU1RSSU5HX09VVAogICAgICAgICAgICB0eXBlbWFwLgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGIHBhdGNoICMzNTIyNjExIEZpeCB1bmluaXRpYWxpc2VkIHNpemUgcmVncmVzc2lvbiBpbiBjaGFyICoqU1RSSU5HX0FSUkFZCiAgICAgICAgICAgIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuNi4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGIGJ1ZyAjMzUyNTA1MCAtIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuNSB3aGVyZWJ5IGRlZmluaW5nIG9uZSB0eXBlbWFwCiAgICAgICAgICAgIG1ldGhvZCBzdWNoIGFzIGFuICdvdXQnIHR5cGVtYXAgbWF5IGhpZGUgYW5vdGhlciB0eXBlbWFwIG1ldGhvZCBzdWNoIGFzIGFuICdpbicgdHlwZW1hcCAtCiAgICAgICAgICAgIG9ubHkgb2NjdXJzIHdoZW4gdGhlIHR5cGUgaXMgYSB0ZW1wbGF0ZSB0eXBlIHdoZXJlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZQogICAgICAgICAgICB2aWEgYSB0eXBlZGVmLgoKMjAxMi0wNS0xMDogb2xseQoJICAgIFtQSFBdIEZpeCB0aGUgY29uc3RhbnQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFLCBldGMgLSBwcmV2aW91c2x5CgkgICAgdGhlc2UgdXNlZCB0aGUgd3JvbmcgbmFtZSBmb3IgcmVuYW1lZCBjb25zdGFudHMuICBBZGQKCSAgICBhdXRvZG9jX3J1bm1lLnBocCB0byB0aGUgdGVzdHN1aXRlIGFzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGlzLgoKMjAxMi0wNS0wMjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIFJlbW92ZSBjb21wYXRpYmlsaXR5IHN1cHBvcnQgZm9yIGdjY2dvIDQuNi4gIFVzaW5nCgkgICAgU1dJRyB3aXRoIGdjY2dvIHdpbGwgbm93IHJlcXVpcmUgZ2NjZ28gNC43LiAgVXNpbmcgU1dJRwoJICAgIHdpdGggdGhlIG1vcmUgY29tbW9ubHkgdXNlZCBnYyBjb21waWxlciBpcyB1bmFmZmVjdGVkLgoKMjAxMi0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdlbmVyYXRlZCBjb2RlIGZvciBDIGZvcndhcmQgZW51bSBkZWNsYXJhdGlvbnMgaW4gc29tZSBsYW5ndWFnZXMuCgpWZXJzaW9uIDIuMC42ICgzMCBBcHJpbCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wNC0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgaW4gU1dJR1RZUEUgKipPVVRQVVQgdHlwZW1hcHMgYXMgcmVwb3J0ZWQgYnkgSmltIEFuZGVyc29uLgoKMjAxMi0wNC0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGNvbXBpbGF0aW9uIGVycm9ycyB3aGVuIHdyYXBwaW5nIFNUTCBjb250YWluZXJzIG9uIE1hYyBPUyBYIGFuZCBwb3NzaWJseSBvdGhlciBzeXN0ZW1zLgoKMjAxMi0wNC0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIDM1MjE4MTEgZnJvbSBMZW8gRGF2aXMgLSBjaGFyICoqU1RSSU5HX0FSUkFZIHR5cGVtYXBzIGZpeGVkIHRvIGhhbmRsZQogICAgICAgICAgICBudWxsIHBvaW50ZXJzLgoKVmVyc2lvbiAyLjAuNSAoMTkgQXByaWwgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFwcGx5IHBhdGNoICMzNTE3NDM1IGZyb20gTWlsZXMgQmFkZXIgLSBwcmVmZXIgdG8gdXNlIEx1YV9wdXNoZ2xvYmFsdGFibGUKCjIwMTItMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzUxNzc2OSBmcm9tIFJvYmluIFN0b2NrZXIgdG8gZml4IGNvbXBpbGUgZXJyb3Igb24gTWFjUnVieSB1c2luZyBSU1RSSU5HX1BUUi4KCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNTExMDA5IGZyb20gTGVpZiBNaWRkZWxzY2h1bHRlIGZvciBzbGlnaHRseSBvcHRpbWlzZWQgY2hhciAqIHZhcmlhYmxlIHdyYXBwZXJzLgoKMjAxMi0wNC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQXBwbHkgIzMyMTk2NzYgZnJvbSBTaGFuZSBMaWVzZWdhbmcgd2hpY2ggYWRkczoKICAgICAgICAgICAgLSBzdXBwb3J0IGZvciAlZmFjdG9yeQogICAgICAgICAgICAtIGEgX190b3N0cmluZyBtZXRob2QKICAgICAgICAgICAgLSBhIF9fZGlzb3duIG1ldGhvZAoKMjAxMi0wNC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gQXBwbHkgIzM1MTM1Njkgd2hpY2ggYWRkcyBhIGNhdGNobGlzdCB0byB0aGUgeG1sIG91dHB1dC4KCjIwMTItMDQtMDU6IG9sbHkKCSAgICBbTHVhXSBBZGQgc3VwcG9ydCBmb3IgTHVhIDUuMiAocGF0Y2ggU0YjMzUxNDU5MyBmcm9tIE1pbGVzIEJhZGVyKQoKMjAxMi0wMy0yNjogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBBcHBseSBwYXRjaCAjMzQyNTk5MyBmcm9tIGpnaWxsaXM6IGFkZCBleHRyYSBsb2dpYyB0byB0aGUgb2N0YXZlX3N3aWdfdHlwZTo6ZGltcyh2b2lkKSBtZXRob2Q6IGl0IGNoZWNrcyBpZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBhIF9fZGltc19fIG1ldGhvZCBhbmQgdXNlcyB0aGlzIGluIHN0ZWFkIG9mIHJldHVybmluZyAoMSwxKQoJICAgIFtvY3RhdmVdIEFwcGx5IHBhdGNoICMzNDI0ODMzIGZyb20gamdpbGxpczogbWFrZSBpc19vYmplY3QgcmV0dXJuIHRydWUgZm9yIHN3aWcgdHlwZXMKCjIwMTItMDMtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtEXSBBcHBseSAjMzUwMjQzMSB0byBmaXggZHVwbGljYXRlIHN5bWJvbHMgaW4gbXVsdGlwbGUgbW9kdWxlcy4KCjIwMTItMDMtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzQ5NDc5MSAtICUkaXNnbG9iYWwgZm9yICVyZW5hbWUgbWF0Y2hpbmcuCgoyMDEyLTAzLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0ODc3MDYgYW5kICMzMzkxOTA2IC0gbWlzc2luZyBzdGRkZWYuaCBpbmNsdWRlIGZvciBwdHJkaWZmX3Qgd2hlbiB1c2luZyAlaW1wb3J0CiAgICAgICAgICAgIGZvciBTVEwgY29udGFpbmVycyBhbmQgY29tcGlsaW5nIHdpdGggZysrLTQuNi4gQW4gaW5jbHVkZSBvZiBzdGRkZWYuaCBpcyBub3cgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBTV0lHIGdlbmVyYXRlcyBTVEwgaGVscGVyIHRlbXBsYXRlcyB3aGljaCByZXF1aXJlIHB0cmRpZmZfdC4gSWYgeW91IAogICAgICAgICAgICB3ZXJlIHByZXZpb3VzbHkgcmVseWluZyBvbiAiI2luY2x1ZGUgPHN0ZGRlZi5oPiIgYWx3YXlzIGJlaW5nIGdlbmVyYXRlZCB3aGVuIHVzaW5nIGEKICAgICAgICAgICAgJWluY2x1ZGUgb2YgYW4gU1RMIGhlYWRlciwgeW91IG1heSBub3cgbmVlZCB0byBhZGQgdGhpcyBpbiBtYW51YWxseS4KCjIwMTItMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMzkyMjY0IGZyb20gU2ViYXN0aWVuIEJpbmUgdG8gcGFyc2UgKHVuc2lnbmVkKSBsb25nIGxvbmcgdHlwZXMgaW4gZW51bSB2YWx1ZSBhc3NpZ25tZW50LgoKMjAxMi0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM1MDU1MzAgZnJvbSBLYXJsIFdldHRlIHRvIGFsbG93IGN1c3RvbSBhbGxvY2F0b3JzIGluIFNUTCBzdHJpbmcgY2xhc3NlcyBmb3IgdGhlIFVUTCBsYW5ndWFnZXMuCgoyMDEyLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzQ2ODM2MiBmcm9tIEthcmwgV2V0dGUgdG8gZml4ICVpbmNsdWRlIGluc2lkZSAlZGVmaW5lLgoKMjAxMi0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2N0YXZlLCBSXSBGaXggIzM0NzU0OTIgLSBpdGVyYXRpbmcgdGhyb3VnaCBzdGQ6OnZlY3RvciB3cmFwcGVycyBvZiBlbnVtZXJhdGlvbnMuCgoyMDEyLTAyLTI3OiB4YXZpZXI5OCAocGF0Y2hlcyBmcm9tIEthcmwgV2V0dGUpCgkgICAgW09jdGF2ZV0gVXNlIC1nbG9iYWxzIC4gdG8gbG9hZCBnbG9iYWwgdmFyaWFibGVzIGluIG1vZHVsZSBuYW1lc3BhY2UKCSAgICBbT2N0YXZlXSBDb21tZW50IGRlY2xhcmF0aW9uIG9mIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gc3dpZ19yZWdpc3Rlcl9kaXJlY3RvcgoJICAgIFtPY3RhdmVdIEZpeCBPQ1RBVkVfUEFUSCBpbiBvY3RhdmUgTWFrZWZpbGVzCgkgICAgW09jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCAtIGZpeCBsaV9zdGRfY29udGFpbmVyc19pbnQgdGVzdAoJICAgIFtPY3RhdmVdIEZpeCBpbXBvcnRzIHRlc3QKCjIwMTItMDItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBNYWtlIGdlbmVyYXRlZCBzdXBwb3J0IGZ1bmN0aW9ucyBpbiBhcnJheXNfamF2YS5pIHN0YXRpYyBzbyB0aGF0IGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIGZyb20gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIFNXSUcgY2FuIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgdG9nZXRoZXIgLSBwcm9ibGVtIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEV2YW4gS3JhdXNlLgoKMjAxMi0wMS0yNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNyYXNoIHdpdGggYmFkIHJlZ2V4IC0gYnVnICMzNDc0MjUwLgoKMjAxMi0wMS0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIFB5dGhvbiBzdGVwcGVkIHNsaWNpbmcgc3VwcG9ydCB0byB0aGUgU1RMIHdyYXBwZXJzIChzdGQ6OnZlY3Rvciwgc3RkOjpsaXN0KS4KICAgICAgICAgICAgQXNzaWduaW5nIHRvIGEgc2xpY2UsIHJlYWRpbmcgYSBzbGljZSBhbmQgZGVsZXRpbmcgYSBzbGljZSB3aXRoIHN0ZXBzIG5vdyB3b3JrLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PgoKICAgICAgICAgICAgICB2aSA9IHZlY3Rvcl9pKHJhbmdlKDEwKSkKICAgICAgICAgICAgICBwcmludCBsaXN0KHZpKQogICAgICAgICAgICAgIHZpWzE6NDoyXSA9IFsxMTEsIDMzM10KICAgICAgICAgICAgICBwcmludCBsaXN0KHZpKQogICAgICAgICAgICAgIGRlbCB2aVszOjEwOjNdCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICBwcmludCBsaXN0KHZpWzo6LTFdKQoKICAgICAgICAgICAgZ2l2ZXMgKHNhbWUgYmVoYXZpb3VyIGFzIG5hdGl2ZSBQeXRob24gc2VxdWVuY2VzIHN1Y2ggYXMgbGlzdCk6CgogICAgICAgICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgICAgICAgICAgIFswLCAxMTEsIDIsIDMzMywgNCwgNSwgNiwgNywgOCwgOV0KICAgICAgICAgICAgICBbMCwgMTExLCAyLCA0LCA1LCA3LCA4XQogICAgICAgICAgICAgIFs4LCA3LCA1LCA0LCAyLCAxMTEsIDBdCgoyMDEyLTAxLTIzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gQ29ycmVjdGx5IGFubm90YXRlIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggQyBsaW5rYWdlLgogICAgICAgICAgICBbRF0gRXhjZXB0aW9uIGFuZCBFcnJvciBoYXZlIGJlY29tZSBibGVzc2VkIG5hbWVzOyByZW1vdmVkIGRfZXhjZXB0aW9uX25hbWUgdGVzdCBjYXNlLgoKMjAxMi0wMS0yMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNvbWUgaW5kZXhpbmcgYnVncyBpbiBQeXRob24gU1RMIHdyYXBwZXJzIHdoZW4gdGhlIGluZGV4IGlzIG5lZ2F0aXZlLCBlZzoKCiAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PgoKICAgICAgICAgICAgICBpdj12ZWN0b3JfaShbMCwxLDIsMyw0LDVdKQogICAgICAgICAgICAgIGl2Wy03Ol0KCiAgICAgICAgICAgIG5vdyByZXR1cm5zIFswLCAxLCAyLCAzLCA0LCA1XSBpbnN0ZWFkIG9mIFs1XS4KCiAgICAgICAgICAgICAgdnZbNzo5XSA9IFsyMiwzM10KCiAgICAgICAgICAgIG5vdyByZXR1cm5zIFswLCAxLCAyLCAzLCA0LCA1LCAyMiwgMzNdIGluc3RlYWQgb2YgImluZGV4IG91dCByYW5nZSIgZXJyb3IuCgogICAgICAgICAgICBBbHNvIGZpeCBzb21lIHNlZ2ZhdWx0cyB3aGVuIHJlcGxhY2luZyByYW5nZXMsIGVnIHdoZW4gaWwgaXMgYSBzdGQ6Omxpc3Qgd3JhcHBlcjoKCiAgICAgICAgICAgICAgaWxbMDoyXSA9IFsxMV0KCjIwMTItMDEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHb10gRml4IGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb24gd2l0aGluIGEgY2xhc3Mgd2hlbiB1c2VkIGFzIGEgYmFzZS4KCjIwMTItMDEtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN1cHBvcnQgZm9yICVuc3BhY2Ugd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoyMDEyLTAxLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzM0NTI1NjAgZnJvbSBCcmFudCBLeXNlciAtIGFkZCBzdXBwb3J0IGZvciAlbnNwYWNlIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMjAxMS0xMi0yMTogd3NmdWx0b24KICAgICAgICAgICAgVGhlICdkaXJlY3RvcmluJyB0eXBlbWFwIG5vdyBhY2NlcHRzICQxLCAkMiBldGMgZXhwYW5zaW9ucyBpbnN0ZWFkIG9mIGhhdmluZyB0byB1c2Ugd29ya2Fyb3VuZHMgLQogICAgICAgICAgICAkMV9uYW1lLCAkMl9uYW1lIGV0Yy4KCjIwMTEtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgZGlyZWN0b3IgdHlwZW1hcHMuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEdvLCBKYXZhLCBEXSBBZGQgc3VwcG9ydCBmb3IgdGhlICdkaXJlY3RvcmFyZ291dCcgdHlwZW1hcC4KCjIwMTEtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY2FtbCwgT2N0YXZlLCBQSFAsIFB5dGhvbiwgUnVieV0gQ29ycmVjdCBzcGVjaWFsIHZhcmlhYmxlcyBpbiAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXAuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIHdpbGwgYnJlYWsgYW55ICdkaXJlY3RvcmFyZ291dCcgdHlwZW1hcHMgeW91IG1heSBoYXZlIHdyaXR0ZW4uIFBsZWFzZSBjaGFuZ2U6CiAgICAgICAgICAgICAgJHJlc3VsdCB0byAkMQogICAgICAgICAgICAgICRpbnB1dCB0byAkcmVzdWx0CgogICAgICAgICAgICBBbHNvIGZpeCB0aGUgbmFtZWQgJ2RpcmVjdG9yYXJnb3V0JyBESVJFQ1RPUk9VVCB0eXBlbWFwcyBmb3IgdGhlc2UgbGFuZ3VhZ2VzIHdoaWNoIGRpZG4ndAogICAgICAgICAgICBwcmV2aW91c2x5IGNvbXBpbGUgYW5kIGFkZCBpbiAkMSwgJDIgZXRjIGV4cGFuc2lvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTEtMTItMTA6IHRhbGJ5CiAgICAgICAgICAgIFtwZXJsNV0gU1dJR19lcnJvcigpIG5vdyBnZXRzIGRlY29yYXRlZCB3aXRoIHBlcmwgc291cmNlIGZpbGUvbGluZSBudW1iZXIuCiAgICAgICAgICAgIFtwZXJsNV0gZXJyb3IgaGFuZGxpbmcgbm93IGNvbmZvcm1zIHRvIHB1YmxpYyBYUyBhcGkgKGZpeGVzIHBlcmwgdjUuMTQgaXNzdWUpLgoKMjAxMS0xMi0xMDogd3NmdWx0b24KICAgICAgICAgICAgW0FuZHJvaWQvSmF2YV0gRml4IGRpcmVjdG9ycyB0byBjb21waWxlIG9uIEFuZHJvaWQuCgogICAgICAgICAgICBBZGRlZCBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyBmb3IgQW5kcm9pZC4KCjIwMTEtMTItMDg6IHZhZHoKCSAgICBCdWcgZml4OiBIYW5kbGUgbWV0aG9kcyByZW5hbWVkIG9yIGlnbm9yZWQgaW4gdGhlIGJhc2UgY2xhc3MgY29ycmVjdGx5IGluIHRoZSBkZXJpdmVkIGNsYXNzZXMKCSAgICAodGhleSBjb3VsZCBiZSBzb21ldGltZXMgbXlzdGVyaW91c2x5IG5vdCByZW5hbWVkIG9yIGlnbm9yZWQgdGhlcmUgYmVmb3JlKS4KCjIwMTEtMTItMDM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBGaXggZXhjZXB0aW9uIGdsdWUgY29kZSBmb3IgbmV3ZXIgRE1EIDIgdmVyc2lvbnMuCiAgICAgICAgICAgIFtEXSBEbyBub3QgZGVmYXVsdCB0byAzMiBiaXQgZ2x1ZSBjb2RlIGZvciBETUQgYW55bW9yZS4KICAgICAgICAgICAgW0RdIFVzZSBzdGRjLmNvbmZpZy5jX2xvbmcvY191bG9uZyB0byByZXByZXNlbnQgQyBsb25nIHR5cGVzLgoKMjAxMS0xMi0wMTogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4ZWQgYnVnIDM0NDc0MjY6IG1lbW9yeSBsZWFrIGluIHZlY3Rvci5fX2dldGl0ZW1fXy4KCjIwMTEtMTEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBSZW1vdmUgQysrIGNvbW1lbnRzIGZyb20gZ2VuZXJhdGVkIEMgY29kZS4KCjIwMTEtMTEtMjc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggc29tZSB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlcnMgd2l0aAoJICAgIGNlcnRhaW4gR0NDIHdhcm5pbmcgb3B0aW9ucyAoRGViaWFuIGJ1ZyAjNjUwMjQ2KS4KCjIwMTEtMTEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzQzMzU0MSAldHlwZW1hcChpbiwgbnVtaW5wdXRzPTApIHdpdGggMTArIGFyZ3VtZW50cy4KCjIwMTEtMTEtMjg6IG9sbHkKCSAgICBbUGVybF0gRml4IHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVycyB3aXRoIGNlcnRhaW4KCSAgICBHQ0Mgd2FybmluZyBvcHRpb25zIChEZWJpYW4gYnVnICM0MzY3MTEpLgoKMjAxMS0xMS0yODogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSBrZXl3b3JkIGxpc3QgdG8gaW5jbHVkZSBrZXl3b3JkcyBhZGRlZCBpbiBQSFAgcmVsZWFzZXMgdXAgdG8gNS4zLgoKMjAxMS0xMS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBQcm92aWRlIGFuIGVhc3kgd2F5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZpc2liaWxpdHkgZm9yIHRoZSBwcm94eSBjbGFzcyBwb2ludGVyCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZ2V0Q1B0cigpIG1ldGhvZC4gVGhlIHZpc2liaWxpdHkgaXMgJ2ludGVybmFsJyBieSBkZWZhdWx0IGFuZCBpZiBtdWx0aXBsZQogICAgICAgICAgICBTV0lHIG1vZHVsZXMgYXJlIGJlaW5nIHVzZWQgYW5kIGNvbXBpbGVkIGludG8gZGlmZmVyZW50IGFzc2VtYmxpZXMsIHRoZW4gdGhleSBuZWVkIHRvIGJlIAogICAgICAgICAgICAncHVibGljJyBpbiBvcmRlciB0byB1c2UgdGhlIGNvbnN0cnVjdG9yIG9yIGdldENQdHIoKSBtZXRob2QgZnJvbSBhIGRpZmZlcmVudCBhc3NlbWJseS4KICAgICAgICAgICAgVXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIGNoYW5nZSB0aGUgdmlzaWJpbGl0aWVzIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzOgoKICAgICAgICAgICAgICBTV0lHX0NTQk9EWV9QUk9YWShwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCiAgICAgICAgICAgICAgU1dJR19DU0JPRFlfVFlQRVdSQVBQRVIocHVibGljLCBwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCgogICAgICAgICAgICBbSmF2YV0gUHJvdmlkZSBhbiBlYXN5IHdheSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5IGZvciB0aGUgcHJveHkgY2xhc3MgcG9pbnRlcgogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGdldENQdHIoKSBtZXRob2QuIFRoZSB2aXNpYmlsaXR5IGlzICdwcm90ZWN0ZWQnIGJ5IGRlZmF1bHQgYW5kIGlmIG11bHRpcGxlCiAgICAgICAgICAgIFNXSUcgbW9kdWxlcyBhcmUgYmVpbmcgdXNlZCBhbmQgY29tcGlsZWQgaW50byBkaWZmZXJlbnQgcGFja2FnZXMsIHRoZW4gdGhleSBuZWVkIHRvIGJlIAogICAgICAgICAgICAncHVibGljJyBpbiBvcmRlciB0byB1c2UgdGhlIGNvbnN0cnVjdG9yIG9yIGdldENQdHIoKSBtZXRob2QgZnJvbSBhIGRpZmZlcmVudCBwYWNrYWdlLgogICAgICAgICAgICBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXRpZXMgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3M6CgogICAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfUFJPWFkocHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQogICAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfVFlQRVdSQVBQRVIocHVibGljLCBwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCgogICAgICAgICAgICBUaGUgZGVmYXVsdCBmb3IgSmF2YSBoYXMgY2hhbmdlZCBmcm9tIHB1YmxpYyB0byBwcm90ZWN0ZWQgZm9yIHRoZSBwcm94eSBjbGFzc2VzLiBVc2UgdGhlCiAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfUFJPWFkgbWFjcm8gYWJvdmUgdG8gcmVzdG9yZSB0byB0aGUgcHJldmlvdXMgdmlzaWJpbGl0aWVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMS0xMS0yMjogc3phZ2VyCgkgICAgW3B5dGhvbl0gQnVnIDM0NDAwNDQ6ICNpZmRlZiBvdXQgU1dJR19QeXRob25fTm9uRHluYW1pY1NldEF0dHIgaWYgLWJ1aWx0aW4KCSAgICBpc24ndCBiZWluZyB1c2VkLCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBiaW5hcnkgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbgoJICAgIHB5dGhvbiBpbnN0YWxsYXRpb25zLgoKMjAxMS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgQnVnIGZpeDogUmVtb3ZlIHJvb3QgZGlyZWN0b3J5IGZyb20gZGlyZWN0b3J5IHNlYXJjaCBsaXN0IGluIFdpbmRvd3MuCgoyMDExLTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzM0MjE4NzYgZnJvbSBSb2JpbiBTdG9ja2VyIHRvIGZpeCAjMzQxNjgxOCAtIHNhbWUgY2xhc3MgbmFtZSBpbiAKICAgICAgICAgICAgZGlmZmVyZW50IG5hbWVzcGFjZXMgY29uZnVzaW9uIHdoZW4gdXNpbmcgbXVsdGlwbGUgbW9kdWxlcy4KCjIwMTEtMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwY3JlLWJ1aWxkLnNoIHRvIHdvcmsgd2l0aCBub24tY29tcHJlc3NlZCB0YXJiYWxscyAtIHByb2JsZW0gcmVwb3J0ZWQgYnkgQWRyaWFuIEJsYWtlbHkuCgoyMDExLTExLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBFeHBhbmQgc3BlY2lhbCB2YXJpYWJsZXMgaW4gdHlwZW1hcCB3YXJuaW5ncywgZWc6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluLCB3YXJuaW5nPSIxMDAwOlRlc3Qgd2FybmluZyBmb3IgJ2luJyB0eXBlbWFwIGZvciAkMV90eXBlICQxX25hbWUiKSBpbnQgIi4uLiIKCjIwMTEtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBuYW1lZCBvdXRwdXQgdHlwZW1hcHMgbm90IGJlaW5nIHVzZWQgd2hlbiB0aGUgc3ltYm9sIHVzZXMgYSBxdWFsaWZpZXIgYW5kIGNvbnRhaW5zCiAgICAgICAgICAgIGEgbnVtYmVyLCBlZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBkb3VibGUgQUJDOjptMSAiLi4uIgoKMjAxMS0xMC0yNDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTRiBidWcgIzM0MjMxMTkgLSBvdmVybG9hZCBkaXNwYXRjaCBzdGFjayBjb3JydXB0aW9uIGZpeC4gIEJldHRlciwgYnV0IG1vcmUgcmVzZWFyY2gKICAgICAgICAgICAgaXMgbmVlZGVkIG9uIGEgc3RhYmxlIHBhdGggZm9yIHRhaWwgY2FsbHMgaW4gWFMuCgogICAgICAgICAgICBBbHNvLCBmaXggZm9yIGxhcmdlIGxvbmcgbG9uZ3MgaW4gMzIgYml0IHBlcmwuCgoyMDExLTEwLTEzOiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEFsbG93IE9jdGF2ZSBtb2R1bGVzIHRvIGJlIHJlLWxvYWRlZCBhZnRlciBhICJjbGVhciBhbGwiLgoKMjAxMS0wOS0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTIuMC4xIHJlcG9ydGVkIGJ5IFRlZW11IElrb25vbmUgbGVhZGluZyB0byB1bmNvbXBpbGFibGUgY29kZQogICAgICAgICAgICB3aGVuIHVzaW5nIHR5cGVkZWYgYW5kIGZ1bmN0aW9uIHBvaW50ZXIgcmVmZXJlbmNlcywgZm9yIGV4YW1wbGU6IAoKICAgICAgICAgICAgICB0eXBlZGVmIGludCBGTihjb25zdCBpbnQgJmEsIGludCBiKTsKICAgICAgICAgICAgICB2b2lkICp0eXBlZGVmX2NhbGwxKEZOIComIHByZWNhbGxiYWNrLCBGTiAqIHBvc3RjYWxsYmFjayk7CgoyMDExLTA5LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQYXRjaCAjMzQwODAxMiBmcm9tIFJhbWFuIEdvcGFsYW4gLSBhZGQgc3VwcG9ydCBmb3IgZW1iZWRkZWQgTHVhIChlTHVhKQogICAgICAgICAgICBpbmNsdWRpbmcgb3B0aW9ucyBmb3IgdGFyZ2V0aW5nIEx1YSBUaW55IFJBTSAoTFRSKS4KCjIwMTEtMDktMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIGJvb3N0X2ludHJ1c2l2ZV9wdHIuaSBsaWJyYXJ5IGNvbnRyaWJ1dGlvbiBmcm9tIHBhdGNoICMzNDAxNTcxLgoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHdhcm5pbmdzIGZvciBiYWRseSBuYW1lZCBkZXN0cnVjdG9ycywgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBLU3RydWN0IHsKICAgICAgICAgICAgICAgIH5OT1RfS1N0cnVjdCgpIHt9CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGNwcF9leHRlbmRfZGVzdHJ1Y3RvcnMuaTo5MjogV2FybmluZyA1MjE6IElsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lIH5OT1RfS1N0cnVjdC4gSWdub3JlZC4KCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZXh0ZW5kIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGVtcGxhdGVzLiBUaGUgZGVzdHJ1Y3RvciBpbiAlZXh0ZW5kIHdhcyBub3QgYWx3YXlzIHdyYXBwZWQsCiAgICAgICAgICAgIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXh0ZW5kIEZvb1QgewogICAgICAgICAgICAgICAgfkZvb1QoKSB7IGRlbGV0ZSAkc2VsZjsgfSAvLyB3YXMgbm90IHdyYXBwZWQgYXMgZXhwZWN0ZWQKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvb1Qge307CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb1RpKSBGb29UPGludD47CgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3BlY2lhbCB2YXJpYWJsZXMgc3VjaCBhcyAiJGRlY2wiIGFuZCAiJGZ1bGxkZWNsIiBpbiBkZXN0cnVjdG9ycyB0byBpbmNsdWRlIHRoZSB+IGNoYXJhY3Rlci4KCjIwMTEtMDktMTA6IHRhbGJ5CiAgICAgICAgICAgIFtwZXJsNV0gU0YgYnVnICMxNDgxOTU4IC0gSW1wcm92ZSByYW5nZSBjaGVja2luZyBmb3IgaW50ZWdlciB0eXBlcy4KICAgICAgICAgICAgRW5oYW5jZSBsaV90eXBlbWFwc19ydW5tZS5wbAoKMjAxMS0wOS0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVleHRlbmQgb24gdHlwZWRlZiBjbGFzc2VzIGluIGEgbmFtZXNwYWNlIHVzaW5nIHRoZSB0eXBlZGVmIG5hbWUsIGZvciBleGFtcGxlOgogICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICVleHRlbmQgQ1N0cnVjdCB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgdGFnQ1N0cnVjdCB7IC4uLiB9IENTdHJ1Y3Q7CiAgICAgICAgICAgIH0KCjIwMTEtMDgtMzE6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gcGF0Y2hlcyBmcm9tIEthcmwgV2V0dGU6IGltcHJvdmVtZW50cyB0byBtb2R1bGUgbG9hZGluZyBiZWhhdmlvcjsKCSAgICBhZGRlZCBleGFtcGxlIG9mIGZyaWVuZCBvcGVyYXRvciB0byBvcGVyYXRvciBleGFtcGxlOyBmaXhlZCBvY3RhdmUgcGFuaWMvY3Jhc2ggaW4gMy4wLjU7CgkgICAgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMKCjIwMTEtMDgtMzA6IHN6YWdlcgoJICAgIFtweXRob25dIEJ1ZyAzNDAwNDg2LCBmaXggZXJyb3Igc2lnbmFsbGluZyBmb3IgYnVpbHQtaW4gY29uc3RydWN0b3JzLgoKMjAxMS0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0dvXSBGaXggZmlsZS9saW5lIG51bWJlciBkaXNwbGF5IGZvciAiZ290eXBlIiB3aGVuIHVzaW5nIHR5cGVtYXAgZGVidWdnaW5nIG9wdGlvbnMKICAgICAgICAgICAgLXRtc2VhcmNoIGFuZCAtdG11c2VkLgoKMjAxMS0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBEXSBGaXggJWNhbGxiYWNrIHdoaWNoIHdhcyBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSBjb2RlLgoKMjAxMS0wOC0yNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNvbnN0cnVjdG9ycyBpbiBuYW1lZCB0eXBlZGVmIGNsYXNzIGRlY2xhcmF0aW9ucyBhcyByZXBvcnRlZCBieSBHcmVnb3J5IEJyb25uZXI6CgogICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBBIHsKICAgICAgICAgICAgICBBKCl7fSAvLyBDb25zdHJ1Y3RvciB3aGljaCB3YXMgbm90IGFjY2VwdGVkIGJ5IFNXSUcKICAgICAgICAgICAgICBCKCl7fSAvLyBOT1QgYSBjb25zdHJ1Y3RvciAtLWlsbGVnYWwsIGJ1dCB3YXMgYWNjZXB0ZWQgYnkgU1dJRwogICAgICAgICAgICB9IEI7CgogICAgICAgICAgICBGb3IgQyBjb2RlLCB0aGUgZml4IG5vdyByZXN1bHRzIGluIHRoZSB1c2Ugb2YgJ3N0cnVjdCBBIConIGluc3RlYWQgb2YganVzdCAnQiAqJyBpbgogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hlbiB3cmFwcGluZyBtZW1iZXJzIGluIEEsIGJ1dCB1bHRpbWF0ZWx5IHRoaXMgZG9lcyBub3QgbWF0dGVyLCBhcwogICAgICAgICAgICB0aGV5IGFyZSB0aGUgc2FtZSB0aGluZy4KCjIwMTEtMDgtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlbmV3b2JqZWN0IHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoICVmZWF0dXJlKCJyZWYiKSBhcyByZXBvcnRlZCBieSBKYW4gQmVja2VyLiBUaGUKICAgICAgICAgICAgY29kZSBmcm9tIHRoZSAicmVmIiBmZWF0dXJlIHdhcyBub3QgYWx3YXlzIGJlaW5nIGdlbmVyYXRlZCBmb3IgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSAlbmV3b2JqZWN0LgogICAgICAgICAgICBEb2N1bWVudGF0aW9uIGZvciAicmVmIiBhbmQgInVucmVmIiBtb3ZlZCBmcm9tIFB5dGhvbiB0byB0aGUgQysrIGNoYXB0ZXIuCgoyMDExLTA4LTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBtZW1vcnkgbGVhayB3aXRoIC0tYnVpbHRpbiBvcHRpb24gKGJ1ZyAzMzg1MDg5KS4KCjIwMTEtMDgtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFNGIHBhdGNoICMzMzk0MzM5IGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIC0gbmV3IG9wdGlvbiAtbm9tb2R1bGVnbG9iYWwgdG8gZGlzYWJsZSBpbnN0YWxsaW5nIAogICAgICAgICAgICB0aGUgbW9kdWxlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFJlcXVpcmUgY2FsbCBhbHNvIHJldHVybnMgdGhlIG1vZHVsZSB0YWJsZSBpbnN0ZWFkIAogICAgICAgICAgICBvZiBhIHN0cmluZy4KCjIwMTEtMDgtMDk6IHhhdmllcjk4CiAgICAgICAgICAgIEZpeCBidWcgMzM4NzM5NDsgT2N0YXZlIHBhdGNoZXMgZm9yIDMuNC4wIGNvbXBhdGliaWxpdHksIGV0Yy4gKGZyb20gS2FybCBXZXR0ZSkKCjIwMTEtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiAkc3ltbmFtZSBleHBhbnNpb24gZm9yIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDExLTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgZ2VuZXJhdGUgInJldHVybiAkcjsiIGluIGNhc2VzIHdoZXJlICRyIGhhc24ndCBiZWVuIHNldC4KCSAgICBUaGlzIHdhcyBiYXNpY2FsbHkgaGFybWxlc3MsIGV4Y2VwdCBpdCBnZW5lcmF0ZWQgYSBQSFAgRV9OT1RJQ0UgaWYKCSAgICB0aGUgY2FsbGluZyBjb2RlIGhhZCBlbmFibGVkIHRoZW0uCgoyMDExLTA3LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2NvcGluZyBvZiBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBuZXN0ZWQgd2l0aGluIGEgY2xhc3MgKGZvciBDKyspLiBQcmV2aW91c2x5IHRoZSBzeW1ib2wKICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IHB1dCBpbnRvIHRoZSBvdXRlciBuYW1lc3BhY2UsIGVnCgogICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQ+IHN0cnVjdCBtYXAgewogICAgICAgICAgICAgICAgY2xhc3MgaXRlcmF0b3I7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlcmF0b3Igd2FzIHNjb3BlZCBhcyBzdGQ6Oml0ZXJhdG9yLCBidXQgbm93IGl0IGlzIGNvcnJlY3RseSBzdGQ6Om1hcDxLZXksIFQ+OjppdGVyYXRvcjsKCiAgICAgICAgICAgIEFsc28gZml4ZWQgaXMgJXRlbXBsYXRlIGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIGEgdHlwZWRlZiB3aGVuIHRoZSB0ZW1wbGF0ZSBjb250YWlucwogICAgICAgICAgICBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGVnOgoKICAgICAgICAgICAgbmFtZXNwYWNlIFN0ZCB7CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBDID0gaW50PiBzdHJ1Y3QgTWFwIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgS2V5IGtleV90eXBlOwogICAgICAgICAgICAgICAgdHlwZWRlZiBUIG1hcHBlZF90eXBlOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRE9VQkxFOwogICAgICAgICAgICAldGVtcGxhdGUoTU0pIFN0ZDo6TWFwPGludCwgRE9VQkxFPjsKCiAgICAgICAgICAgIEFsbCBzeW1ib2xzIHdpdGhpbiBNYXAgd2lsbCBiZSByZXNvbHZlZCBjb3JyZWN0bHksIGVnIGtleV90eXBlIGFuZCBtYXBwZWRfdHlwZSBubyBtYXR0ZXIgaWYgdGhlCiAgICAgICAgICAgIHdyYXBwZWQgY29kZSB1c2VzIFN0ZDo6TWFwPGludCwgZG91YmxlPiBvciBzdGQ6Ok1hcDxpbnQsIERPVUJMRT4gb3IgU3RkOjpNYXA8aW50LCBkb3VibGUsIGludD4KCiAgICAgICAgICAgIEFsc28gZml4ZXMgYnVnICMzMzc4MTQ1IC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDIuMC40IC0gJXRlbXBsYXRlIHVzaW5nIHRyYWl0cy4KCjIwMTEtMDctMjAgIHN6YWdlcgoJICAgIFtweXRob25dIEZpeCBjbG9zdXJlIGZvciB0cF9jYWxsIHNsb3QuCgoyMDExLTA3LTE2OiB3c2Z1bHRvbgoJICAgIFtweXRob25dIEZpeCBkaXJlY3RvciB0eXBlbWFwIHVzaW5nIFB5T2JqZWN0ICouCgoyMDExLTA3LTEzOiBzemFnZXIKCSAgICBbcHl0aG9uXSBTRiBwYXRjaCAjMzM2NTkwOCAtIEFkZCBhbGwgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBtYXAgc3VwcG9ydCBjb2RlIGluIHN0ZF9tYXAuaQoKMjAxMS0wNy0xMzogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4IGZvciBidWcgMzMyNDc1MzogJXJlbmFtZSBtZW1iZXIgdmFyaWFibGVzIHdpdGggLWJ1aWx0aW4uCgoyMDExLTA3LTAxOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHNjb3BlIGFuZCBzeW1ib2wgbG9va3VwIHByb2JsZW1zIHdoZW4gdGVtcGxhdGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGFyZSBiZWluZwogICAgICAgICAgICB1c2VkIHdpdGggdHlwZWRlZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYWCwgdHlwZW5hbWUgVFQgPSBTb21lVHlwZT4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgdHlwZWRlZiBYWCBYOwogICAgICAgICAgICAgIHR5cGVkZWYgVFQgVDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFQ+IHN0cnVjdCBVc2VzRm9vIHsKICAgICAgICAgICAgICB2b2lkIHgodHlwZW5hbWUgRm9vPFRUPjo6VCwgdHlwZW5hbWUgRm9vPFRUPjo6WCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGZpeGVzIHVzZSBvZiBzdGQ6OnZlY3RvcjxpbnQ+OjpzaXplX3R5cGUgZm9yIFB5dGhvbiBhcyByZXBvcnRlZCBieSBBdWJyZXkgQmFybmFyZC4KCjIwMTEtMDYtMjM6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3IgY29kZSB0byB3b3JrIHdoZW4gUEhQIGlzIGJ1aWx0IHdpdGggWlRTIGVuYWJsZWQsCgkgICAgd2hpY2ggaXMgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gb24gTWljcm9zb2Z0IFdpbmRvd3MuCgoyMDExLTA2LTIxOiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSB2YXJpb3VzIHNtYWxsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzLgoJICAgIC0gQXZvaWQgbmFtZSBjb25mbGljdHMgYmV0d2VlbiBzbWFydCBwb2ludGVyIHdyYXBwZXJzIGFuZCB0aGUgd3JhcHBlcnMgZm9yCgkgICAgdGhlIGFjdHVhbCBjbGFzcy4KCSAgICAtIEZpeCBkZWZhdWx0IHR5cGVtYXBzIGZvciBDIGJpbmRpbmdzLCB3aGljaCB3ZXJlIGluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8KCSAgICBjYWxsIG5vbi1leGlzdGVudCBkZXN0cnVjdG9ycyBvbiB1c2VyLWRlZmluZWQgdHlwZXMuCgkgICAgLSBOZXcgZmVhdHVyZSwgZmVhdHVyZTphY2xtaXhpbnMsIGZvciBhZGRpbmcgc3VwZXJjbGFzcyB0byB0aGUgZm9yZWlnbiBjbGFzcwoJICAgIHdyYXBwZXJzLgoJICAgIC0gSW1wcm92ZSBsb25nbG9uZyB0eXBlbWFwcy4KCjIwMTEtMDYtMTk6IHdzZnVsdG9uCgkgICAgRml4IGluY29ycmVjdCB0eXBlbWFwcyBiZWluZyB1c2VkIGZvciBhIHN5bWJvbCB3aXRoaW4gYSB0ZW1wbGF0ZWQgdHlwZSwgZWc6CiAgICAgICAgICAgIEE8aW50Pjo6dmFsdWVfdHlwZSB3b3VsZCBpbmNvcnJlY3RseSB1c2UgYSB0eXBlbWFwIGZvciB0eXBlIEEuCgoyMDExLTA2LTE4OiBvbGx5CgkgICAgW1RjbF0gRml4IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBpbiBtaWRkbGUgb2YgYmxvY2tzIHdoaWNoIGlzbid0CgkgICAgcGVybWl0dGVkIGluIEM5MCAoaXNzdWUgcHJvYmFibHkgaW50cm9kdWNlZCBpbiAyLjAuMyBieSBwYXRjaCAjMzIyNDY2MykuCgkgICAgUmVwb3J0ZWQgYnkgUGF1bCBPYmVybWVpZXIgaW4gU0YjMzI4ODU4Ni4KCjIwMTEtMDYtMTc6IHdzZnVsdG9uCgkgICAgW0phdmFdIFNGICMzMzEyNTA1IC0gc2xpZ2h0bHkgZWFzaWVyIHRvIHdyYXAgY2hhcltdIG9yIGNoYXJbQU5ZXSB3aXRoIGEgSmF2YSBieXRlW10KICAgICAgICAgICAgdXNpbmcgYXJyYXlzX2phdmEuaS4KCjIwMTEtMDYtMTM6IHdzZnVsdG9uCgkgICAgW1J1YnksIE9jdGF2ZV0gU0YgIzMzMTA1MjggQXV0b2RvYyBmaXhlcyBzaW1pbGFyIHRvIHRob3NlIGRlc2NyaWJlZCBiZWxvdyBmb3IgUHl0aG9uLgoKMjAxMS0wNi0xMDogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGZXcgc3VidGxlIGJ1Z2ZpeGVzIGluIGF1dG9kb2MgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLAogICAgICAgICAgICAtIFVubmFtZWQgYXJndW1lbnQgbmFtZXMgZml4IGZvciBhdXRvZG9jIGxldmVscyA+IDAuCiAgICAgICAgICAgIC0gRGlzcGxheSBvZiB0ZW1wbGF0ZSB0eXBlcyBmaXhlZCBmb3IgYXV0b2RvYyBsZXZlbHMgPiAxLgogICAgICAgICAgICAtIEZpeCBTRiAjMzMxMDUyOCAtIGRpc3BsYXkgb2YgdHlwZWRlZiBzdHJ1Y3RzIGZvciBhdXRvZG9jIGxldmVscyA+IDEuCiAgICAgICAgICAgIC0gQWRkIG1pc3NpbmcgdHlwZSBmb3Igc2VsZiBmb3IgYXV0b2RvYyBsZXZlbHMgMSBhbmQgMy4KICAgICAgICAgICAgLSBhdXRvZG9jIGxldmVscyAyIGFuZCAzIGRvY3VtZW50ZWQuCiAgICAgICAgICAgIC0gTWlub3IgdHdlYWtzIHRvIGF1dG9kb2Mgc3R5bGUgdG8gY29uZm9ybSB3aXRoIFBFUDguCgoyMDExLTA1LTMwOiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIGRpcmVjdG9ycyB3aGVuIC1wcmVmaXggaXMgdXNlZC4KCjIwMTEtMDUtMjQ6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgbWV0aG9kcyBvZiBjbGFzc2VzIHdpdGggYSB2aXJ0dWFsIGJhc2UgY2xhc3MgKFNGIzMxMjQ2NjUpLgoKVmVyc2lvbiAyLjAuNCAoMjEgTWF5IDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbR3VpbGVdIFBhdGNoICMzMTkxNjI1IGZpeGluZyBvdmVybG9hZGluZyBvZiBpbnRlZ2VyIHR5cGVzLgoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbUGVybF0gUGF0Y2ggIzMyNjAyNjUgZml4aW5nIG92ZXJsb2FkaW5nIG9mIG5vbi1wcmltaXRpdmUgdHlwZXMgYW5kIGludGVnZXJzIGluIAogICAgICAgICAgICBQZXJsIDUuMTIgYW5kIGxhdGVyLgoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbUnVieV0gRml4ICVpbXBvcnQgd2hlcmUgb25lIG9mIHRoZSBpbXBvcnRlZCBmaWxlcyAlaW5jbHVkZSBvbmUgb2YgdGhlIFNUTCBpbmNsdWRlCiAgICAgICAgICAgIGZpbGVzIHN1Y2ggYXMgc3RkX3ZlY3Rvci5pLgoKMjAxMS0wNS0xNzogd3NmdWx0b24KCSAgICBbSmF2YV0gQXBwbHkgIzMyODk4NTEgZnJvbSBBbGFuIEhhcmRlciB0byBmaXggbWVtb3J5IGxlYWsgaW4gZGlyZWN0b3JzIHdoZW4gY2hlY2tpbmcKICAgICAgICAgICAgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucy4KCjIwMTEtMDUtMTc6IHdzZnVsdG9uCgkgICAgW1RjbF0gQXBwbHkgIzMzMDAwNzIgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgdG8gZml4IG11bHRpcGxlIG1vZHVsZSBsb2FkaW5nIG5vdAogICAgICAgICAgICBhbHdheXMgc2hhcmluZyB2YXJpYWJsZXMgYWNyb3NzIG1vZHVsZXMuCgoyMDExLTA1LTE2OiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEZpeCBhbiBpbmNvbXBhdGliaWxpdHkgd2l0aCBuZXZlciB2ZXJzaW9ucyBvZiBPY3RhdmUuIENhc2Ugb24gT2N0YXZlCgkgICAgQVBJID49IDQwIHRvIGhhbmRsZSByZW5hbWUgb2YgT2N0YXZlX21hcCB0byBvY3RhdmVfbWFwLgoJICAgIFtvY3RhdmVdIEFkZCBzdXBwb3J0IGZvciB5Ll9fcm9wX18oeCkgb3BlcmF0b3JzIHdoZW4geC5fX29wX18oeSkgZG9lc24ndCBleGlzdC4KCSAgICBbb2N0YXZlXSBBbGxvdyBnbG9iYWwgb3BlcmF0b3JzIHRvIGJlIGRlZmluZWQgYnkgU1dJRy13cmFwcGVkIGZ1bmN0aW9ucy4KCSAgICBbb2N0YXZlXSBGaXggc2V2ZXJhbCBidWdzIGFyb3VuZCBtb2R1bGUgbmFtZXNwYWNlczsgYWRkIC1nbG9iYWwsIC1ub2dsb2JhbCwKCSAgICAtZ2xvYmFscyA8bmFtZT4gY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gdGhlIG1vZHVsZS4KCjIwMTEtMDUtMTQ6IHdzZnVsdG9uCgkgICAgJXZhcmFyZ3Mgd2hlbiB1c2VkIHdpdGggYSBudW1lcmljIGFyZ3VtZW50IHVzZWQgdG8gY3JlYXRlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgCiAgICAgICAgICAgIHdoaWNoIHdhcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgZ3VhcmFudGVlZCBzZW50aW5lbCB2YWx1ZS4gVGhpcyBuZXZlciB3b3JrZWQgYW5kIG5vdwogICAgICAgICAgICB0aGUgYWRkaXRpb25hbCBhcmd1bWVudCBpcyBub3QgZ2VuZXJhdGVkLgoKMjAxMS0wNS0xMzogd3NmdWx0b24KCSAgICBbcHl0aG9uXSBBZGRpdGlvbmFsIGZpeGVzIGZvciBweXRob24zLjIgc3VwcG9ydC4KCjIwMTEtMDUtMDc6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIFB5R2V0U2V0RGVzY3IgZm9yIHB5dGhvbjMuMi4KCjIwMTEtMDUtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWEsIFB5dGhvbiwgVGNsXSBDL0MrKyBwcm90b3R5cGVzIHNob3duIGluIGVycm9yIG1lc3NhZ2Ugd2hlbiBjYWxsaW5nIGFuIG92ZXJsb2FkZWQKICAgICAgICAgICAgbWV0aG9kIHdpdGggaW5jb3JyZWN0IGFyZ3VtZW50cyBpbXByb3ZlZCB0byBzaG93IGFsd2F5cyBzaG93IGZ1bGx5IHF1YWxpZmllZCBuYW1lCiAgICAgICAgICAgIGFuZCBpZiBhIGNvbnN0IG1ldGhvZC4gCgogICAgICAgICAgICBBbHNvIGZpeGVkIG90aGVyIEx1YSBlcnJvciBtZXNzYWdlcyBpbiBnZW5lcmF0ZWQgY29kZSB3aGljaCB3ZXJlbid0IGNvbnNpc3RlbnRseQogICAgICAgICAgICB1c2luZyB0aGUgZnVsbHkgcXVhbGlmaWVkIEMrKyBuYW1lIC0gcmVxdWVzdGVkIGJ5IEdlZGFsaWEgUGFzdGVybmFrLgoKMjAxMS0wNC0yOTogc3phZ2VyCgkgICAgQnVnIDI2MzU5MTk6IENvbnZlbmllbmNlIG1ldGhvZCB0byBjb252ZXJ0IHN0ZDo6bWFwIHRvIGEgcHl0aG9uIGRpY3QuCgoyMDExLTA0LTI5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBidWcgMjgxMTU0OTogcmV0dXJuIG5vbi1jb25zdCBpdGVyYXRvcnMgZnJvbSBTVEwKCSAgICBtZXRob2RzIGJlZ2luKCksIGVuZCgpLCByYmVnaW4oKSwgcmVuZCgpLgoKMjAxMS0wNC0yNTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgYnVnIDE0OTg5Mjk6IEFjY2VzcyB0byBtZW1iZXIgZmllbGRzIGluIG1hcCBlbGVtZW50cwoKMjAxMS0wNC0yMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIG5zcGFjZTogQ29ycmVjdGx5IGdlbmVyYXRlIGlkZW50aWZpZXJzIGZvciBiYXNlIGNsYXNzZXMgd2hlbgogICAgICAgICAgICBub3QgaW4gc3BsaXQgcHJveHkgbW9kZS4KCjIwMTEtMDQtMTM6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAzMjg2MzMzOiBpbmZpbml0ZSByZWN1cnNpb24gd2l0aCBtdXR1YWwgJ3VzaW5nIG5hbWVzcGFjZScgY2xhdXNlcy4KCjIwMTEtMDQtMTI6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAxMTYzNDQwOiB2YXJhcmcgdHlwZW1hcHMuCgoyMDExLTA0LTEyOiBzemFnZXIKCSAgICBGaXhlZCBidWcgIzMyODUzODY6IHBhcnNlIGVycm9yIGZyb20gJ29wZXJhdG9yIFQqJigpJy4gIEFkZGVkIG9wZXJhdG9yX3BvaW50ZXJfcmVmCgkgICAgdGVzdCBjYXNlIHRvIGRlbW9uc3RyYXRlLgoKMjAxMS0wNC0xMTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgUHlWYXJPYmplY3RfSEVBRF9JTklUIHRvIGVsaW1pbmF0ZSBWQysrIGNvbXBpbGVyIGVycm9ycyBhYm91dAoJICAgIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3QgbWVtYmVycyB3aXRoIHBvaW50ZXJzLgoKMjAxMS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyODQzMjYgZnJvbSBDb2xpbiBNY0RvbmFsZCB0byBmaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KCjIwMTEtMDQtMTE6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIFB5VmFyT2JqZWN0X0hFQURfSU5JVCB0byBlbGltaW5hdGUgVkMrKyBjb21waWxlciBlcnJvcnMgYWJvdXQKCSAgICBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0IG1lbWJlcnMgd2l0aCBwb2ludGVycy4KCjIwMTEtMDQtMTA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBGaXhlZCB3cmFwcGluZyBvZiBlbnVtcyB0aGF0IGFyZSB0eXBlIGNoYXIsIGZvciBleGFtcGxlOgogICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfSAodGhpcyB3YXMgYWxyZWFkeSBpbiAyLjAuMyBmb3IgQyMgYW5kIEphdmEpCgoyMDExLTA0LTEwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gbnNwYWNlOiBGaXhlZCByZWZlcmVuY2luZyB0eXBlcyBpbiB0aGUgcm9vdCBuYW1lc3BhY2Ugd2hlbgogICAgICAgICAgICBub3QgaW4gc3BsaXQgcHJveHkgbW9kZS4KCjIwMTEtMDQtMDk6IHN6YWdlcgoJICAgIFtQeXRob25dIEFwcGxpZWQgcGF0Y2ggIzE5MzI0ODQ6IG1pZ3JhdGUgUHlDT2JqZWN0IHRvIFB5Q2Fwc3VsZS4KCjIwMTEtMDQtMDk6IHN6YWdlcgoJICAgIFtQeXRob25dIEFkZGVkIHByZXByb2Nlc3NvciBndWFyZHMgZm9yIHB5dGhvbiBmdW5jdGlvbnMgUHlVbmljb2RlX0FzV2lkZUNoYXIgYW5kCgkgICAgUHlTbGljZV9HZXRJbmRpY2VzLCB3aGljaCBjaGFuZ2VkIHNpZ25hdHVyZXMgaW4gcHl0aG9uMy4yLgoKMjAxMS0wNC0wNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGNvbnN0IGFycmF5IHR5cGVkZWZzIHdoaWNoIHdlcmUgZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgY29kZSBhcwogICAgICAgICAgICByZXBvcnRlZCBieSBLYXJsIFdldHRlLgoKMjAxMS0wNC0wMzogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgdGhlIGJlaGF2aW9yIG9mICVweXRob25ub25keW5hbWljIHRvIGNvbmZvcm0gdG8gdGhlIHNwZWMgaW4gTGliL3B5dXNlcmRpci5zd2cuCgoyMDExLTA0LTAzOiBzemFnZXIKCSAgICBbUHl0aG9uXSBNZXJnZWQgaW4gdGhlIHN6YWdlci1weXRob24tYnVpbHRpbiBicmFuY2gsIGFkZGluZyB0aGUgLWJ1aWx0aW4gZmVhdHVyZQoJICAgIGZvciBweXRob24uICBUaGUgLWJ1aWx0aW4gb3B0aW9uIG1heSBwcm92aWRlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgZ2FpbgoJICAgIGluIHB5dGhvbiB3cmFwcGVycy4gIEZvciBmdWxsIGRldGFpbHMgYW5kIGxpbWl0YXRpb25zLCByZWZlciB0byBEb2MvTWFudWFsL1B5dGhvbi5odG1sLgoJICAgIEEgc21hbGwgdGVzdCBzdWl0ZSBkZXNpZ25lZCB0byBkZW1vbnN0cmF0ZSB0aGUgcGVyZm9ybWFuY2UgZ2FpbiBpcyBpbgoJICAgIEV4YW1wbGVzL3B5dGhvbi9wZXJmb3JtYW5jZS4KCjIwMTEtMDQtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiBtaXNzaW5nIHdyYXBwZXJzIGZvciBmcmllbmQgZnVuY3Rpb25zIGZvciBzb21lIHRhcmdldCBsYW5ndWFnZXMsIG1vc3RseQogICAgICAgICAgICB0aGUgbm9uLXNjcmlwdGluZyBsYW5ndWFnZXMgbGlrZSBKYXZhIGFuZCBDIy4KClZlcnNpb24gMi4wLjMgKDI5IE1hcmNoIDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQXBwbHkgcGF0Y2ggIzMyMzkwNzYgZnJvbSBNYXJpZSBXaGl0ZSBmaXhpbmcgc3RyaW5ncyBmb3IgUiA+PSAyLjcuMAoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyNDgyODAgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgd2hpY2ggYWRkcyBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgd2hlbgogICAgICAgICAgICB0aGUgaW5jb3JyZWN0IG51bWJlciBvciB0eXBlIG9mIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIG92ZXJsb2FkZWQgbWV0aG9kcy4KCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjI0NjYzIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlLgogICAgICAgICAgICAxLiBGaXggd2hlbiBmdW5jdGlvbiByZXR1cm5zIGEgTlVMTCB2YWx1ZSwgYSAiTlVMTCIgY29tbWFuZCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIFRjbCBpbnRlcnByZXRlcgogICAgICAgICAgICBhbmQgY2FsbGluZyB0aGlzIGNvbW1hbmQgd2lsbCBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdC4gCgogICAgICAgICAgICAyLiBQcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgY2xhc3MgbWV0aG9kcyB1c2luZyBhIGxpbmVhciBzZWFyY2ggY2F1c2luZyBwZXJmb3JtYW5jZSBpc3N1ZXMKICAgICAgICAgICAgaW4gd3JhcHBlcnMgZm9yIGNsYXNzZXMgd2l0aCBtYW55IG1lbWJlciBmdW5jdGlvbnMuIFRoZSBwYXRjaCBhZGRzIGEgbWV0aG9kIGhhc2ggdGFibGUgdG8gY2xhc3NlcyBhbmQKICAgICAgICAgICAgY2hhbmdlcyBtZXRob2QgbmFtZSBsb29rdXAgdG8gdXNlIHRoZSBoYXNoIHRhYmxlIGluc3RlYWQgb2YgZG9pbmcgYSBsaW5lYXIgc2VhcmNoLgoKMjAxMS0wMy0yNjogd3NmdWx0b24KCSAgICBbQyMsIEphdmFdIFNGIGJ1ZyAjMzE5NTExMiAtIGZpeCB3cmFwcGluZyBvZiBlbnVtcyB0aGF0IGFyZSB0eXBlIGNoYXIsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGVudW0geyBYID0gJ1gnOyB9CgoyMDExLTAzLTIxOiB2YWR6CgkgICAgQWxsb3cgc2V0dGluZyBQQ1JFX0NGTEFHUyBhbmQgUENSRV9MSUJTIGR1cmluZyBjb25maWd1cmF0aW9uIHRvIG92ZXJyaWRlIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKCSAgICBwY3JlLWNvbmZpZywgZS5nLiB0byBhbGxvdyB1c2luZyBhIHN0YXRpYyB2ZXJzaW9uIG9mIFBDUkUgbGlicmFyeS4KCjIwMTEtMDMtMTc6IHdzZnVsdG9uCgkgICAgW1VUTF0gQWRkIG1pc3NpbmcgaGVhZGVycyBpbiBnZW5lcmF0ZWQgU1RMIHdyYXBwZXJzIHRvIGZpeCBjb21waWxhdGlvbiB3aXRoIGdjYy00LjYuCgoyMDExLTAzLTE3OiB3c2Z1bHRvbgoJICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuMiB3aGVyZSBmaWxlbmFtZXMgd2l0aCBzcGFjZXMgd2VyZSBub3QgZm91bmQKCSAgICB3aGVuIHVzZWQgd2l0aCAlaW5jbHVkZSBhbmQgJWltcG9ydC4gUmVwb3J0ZWQgYnkgU2hhbmUgTGllc2VnYW5nLgoKMjAxMS0wMy0xNTogd3NmdWx0b24KCSAgICBbVVRMXSBGaXggb3ZlcmxvYWRpbmcgd2hlbiB1c2luZyBjb25zdCBjaGFyW10sIHByb2JsZW0gcmVwb3J0ZWQgYnkgRGF2aWQgTWF4d2VsbC4KICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBjaGFyW0FOWV0gYW5kIGNvbnN0IGNoYXJbQU5ZXS4KCjIwMTEtMDMtMTU6IHdzZnVsdG9uCgkgICAgW0MjXSBBcHBseSBwYXRjaCAjMzIxMjYyNCBmaXhpbmcgc3RkOjptYXAgS2V5cyBwcm9wZXJ0eS4KCjIwMTEtMDMtMTQ6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzL2Z1bmN0aW9ucyB3aGVyZSBzb21lCgkgICAgcmV0dXJuIHZvaWQgYW5kIG90aGVycyBkb24ndCAtIHdoZXRoZXIgdGhpcyB3b3JrZWQgb3Igbm90IGRlcGVuZGVkCgkgICAgb24gdGhlIG9yZGVyIHRoZXkgd2VyZSBlbmNvdW50ZXJlZCBpbiAoU0YjMzIwODI5OSkuCgkKMjAxMS0wMy0xMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEV4dGVuZGVkIHN1cHBvcnQgZm9yIEMrKyBuYW1lc3BhY2VzIChuc3BhY2UgZmVhdHVyZSkuCgoyMDExLTAzLTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IHNoYXJpbmcgb2YgdHlwZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIG11bHRpcGxlIFNXSUctd3JhcHBlZAoJICAgIG1vZHVsZXMgKFNGIzMyMDI0NjMpLgoKMjAxMS0wMy0wOTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGaXggU0YgIzMxOTQyOTQgLSBjb3JuZXIgY2FzZSBidWcgd2hlbiAnTlVMTCcgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBmb3IgYSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXIgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24uCgoyMDExLTAzLTA3OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgdXNlIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBmb3IgY2FzZXMgd2hlcmUgdGhlIGZ1bmN0aW9uCgkgICAgcmV0dXJucyB2b2lkIC0gbm93IHRoaXMgaXNzdWUgY2FuIG9ubHkgbWF0dGVyIGlmIHlvdSBoYXZlIGEgZnVuY3Rpb24KCSAgICBvciBtZXRob2Qgd2hpY2ggaXMgZGlyZWN0ZWQgYW5kIHJldHVybnMgbm9uLXZvaWQuCgoyMDExLTAzLTA2OiBvbGx5CgkgICAgW1BIUF0gQWRkIGNhc3RzIHRvIHRoZSB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nCgkgICAgbG9uZyB0byBhdm9pZCBpc3N1ZXMgd2hlbiB0aGV5IGFyZSB1c2VkIHdpdGggc2hvcnRlciB0eXBlcyB2aWEKCSAgICAlYXBwbHkuCgoyMDExLTAzLTAyOiB3c2Z1bHRvbgoJICAgIFRlbXBsYXRlZCBzbWFydCBwb2ludGVycyBvdmVybG9hZGVkIHdpdGggYm90aCBjb25zdCBhbmQgbm9uIGNvbnN0IG9wZXJhdG9yLT4gZ2VuZXJhdGVkIHVuY29tcGlsYWJsZQoJICAgIGNvZGUgd2hlbiB0aGUgcG9pbnRlZSB3YXMgYSBjbGFzcyB3aXRoIGVpdGhlciBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBvciBzdGF0aWMgbWV0aG9kcy4KCSAgICBSZWdyZXNzaW9uIGluIDIuMC54IHJlcG9ydGVkIGFzIHdvcmtpbmcgaW4gMS4zLjQwIGJ5IHhhbnRhcmVzIG9uIHN3aWctdXNlciBtYWlsaW5nIGxpc3QuCgpWZXJzaW9uIDIuMC4yICgyMCBGZWJydWFyeSAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wMi0xOTogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgbWlzc2luZyBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0aGUgdHlwZW1hcHMuaSBsaWJyYXJ5CiAgICAgICAgICAgIGZvciBwcmltaXRpdmUgcmVmZXJlbmNlIHR5cGVzIGFzIHdlbGwgYXMgc2lnbmVkIGNoYXIgKiBhbmQgYm9vbCAqLgoKMjAxMS0wMi0xOTogb2xseQoJICAgIFtQSFBdIEFkZHJlc3MgYnVnIGluIFBIUCBvbiBzb21lIHBsYXRmb3Jtcy9hcmNoaXRlY3R1cmVzIHdoaWNoCgkgICAgcmVzdWx0cyBpbiB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgbm90IGJlaW5nIGF2YWlsYWJsZSB1c2luZwoJICAgIFNXSUdfWkVORF9FUlJPUl9OT1JFVFVSTiB3aGljaCBkZWZhdWx0cyB0byB6ZW5kX2Vycm9yX25vcmV0dXJuIGJ1dAoJICAgIGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gYnVpbGRpbmcgdGhlIG1vZHVsZSBieSBwYXNzaW5nCgkgICAgLURTV0lHX1pFTkRfRVJST1JfTk9SRVRVUk49emVuZF9lcnJvciB0byB0aGUgY29tcGlsZXIuICBUaGlzIG1heQoJICAgIHJlc3VsdCBpbiBjb21waWxlciB3YXJuaW5ncywgYnV0IHNob3VsZCBhdCBsZWFzdCBhbGxvdyBhIG1vZHVsZQoJICAgIHRvIGJlIGJ1aWx0IG9uIHRob3NlIHBsYXRmb3Jtcy9hcmNoaXRlY3R1cmVzIChTRiMzMTY2NDIzKS4KCjIwMTEtMDItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzE4NDU0OSAtIHZhcmFyZyBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHdoZW4gdXNpbmcgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uLgoKMjAxMS0wMi0xODogb2xseQoJICAgIFtQSFBdIEFuIG92ZXJsb2FkZWQgbWV0aG9kIHdoaWNoIGNhbiByZXR1cm4gYW4gb2JqZWN0IG9yIGEKCSAgICBwcmltaXRpdmUgdHlwZSBubyBsb25nZXIgY2F1c2VzIFNXSUcgdG8gc2VnZmF1bHQuICBSZXBvcnRlZCBieSBQYXVsCgkgICAgQ29sYnkgaW4gU0YjMzE2ODUzMS4KCjIwMTEtMDItMTg6IG9sbHkKCSAgICBbUEhQXSBGaXggaW52YWxpZCBlcmFzZSBkdXJpbmcgaXRlcmF0aW9uIG9mIHN0ZDo6bWFwIGluIGdlbmVyYXRlZAoJICAgIGRpcmVjdG9yIGNvZGUuICBSZXBvcnRlZCBieSBDb3J5IEJlbm5ldHQgaW4gU0YjMzE3NTgyMC4KCjIwMTEtMDItMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFByZXByb2Nlc3Npbmcgbm93IHdhcm5zIGlmIGV4dHJhIHRva2VucyBhcHBlYXIgYWZ0ZXIgI2Vsc2UgYW5kICNlbmQuCgoyMDExLTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE2NTMwOTIgUHJlcHJvY2Vzc29yIGRvZXMgbm90IGVycm9yIG91dCB3aGVuICNlbGlmIGlzIG1pc3NpbmcgYW4gZXhwcmVzc2lvbi4KICAgICAgICAgICAgVGhpcyBhbmQgb3RoZXIgY2FzZXMgb2YgbWlzc2luZyBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMgbm93IHJlc3VsdCBpbiBhbiBlcnJvci4KCjIwMTEtMDItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY2FtbF0gQXBwbHkgcGF0Y2ggIzMxNTE3ODggZnJvbSBKb2VsIFJleW1vbnQuIEJyaW5ncyBPY2FtbCBzdXBwb3J0IHVwIHRvIGRhdGUgCiAgICAgICAgICAgICh2ZXIgMy4xMSBhbmQgMy4xMiksIGluY2x1ZGluZyBzdGQ6OnN0cmluZy4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzE3NjI3NCBmcm9tIEphbWVzIE1hc3RlcnMgLSB0eXBlY2hlY2sgdHlwZW1hcCBmb3IgdGltZV90LgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMxNzE3OTMgZnJvbSBzemFnZXIgLSBwcm90ZWN0ZWQgZGlyZWN0b3IgbWV0aG9kcyBmYWlsaW5nIHdoZW4gLWZ2aXJ0dWFsIGlzIHVzZWQuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5Mjc4NTIgLSAjaW5jbHVkZSBkaXJlY3RpdmVzIGRvbid0IHByZXByb2Nlc3MgdGhlIGZpbGUgcGFzc2VkIHRvIGl0LiBUaGUgZml4IGlzIGZvcgogICAgICAgICAgICAjaW5jbHVkZSB3aXRoIC1pbXBvcnRhbGwgb3IgLWluY2x1ZGVhbGwsICVpbmNsdWRlIGFuZCAlaW1wb3J0LCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICAjZGVmaW5lIEZJTEVOQU1FICJhYmMuaCIKICAgICAgICAgICAgICAlaW5jbHVkZSBGSUxFTkFNRQoKMjAxMS0wMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTQwNTM2LCBvdmVyYWN0aXZlIHByZXByb2Nlc3NvciB3aGljaCB3YXMgZXhwYW5kaW5nIGRlZmluZWQoLi4uKSBvdXRzaWRlIG9mICNpZiBhbmQgI2VsaWYKICAgICAgICAgICAgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIFNGICMyOTQyODk5IEFkZCB1c2VyIHN1cHBsaWVkIGRvY3VtZW50YXRpb24gdG8gaGVscCBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBNelNjaGVtZS4KICAgICAgICAgICAgVXBkYXRlIGNoYXB0ZXIgbmFtZSB0byBNelNjaGVtZS9SYWNrZXQgYWNjb3VudGluZyBmb3IgdGhlIHJlbmFtZSBvZiBNelNjaGVtZSB0byBSYWNrZXQuCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFNGICMzMDg1OTA2IC0gUG9zc2libGUgZml4IHJ1bm5pbmcgdGVzdC1zdWl0ZSBvbiBNYWMgT1MgWC4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTczMzY3IEJldHRlciBpbmZvcm1hdGlvbiBkdXJpbmcgY29uZmlndXJlIGFib3V0IEJvb3N0IHByZXJlcXVpc2l0ZSBmb3IgcnVubmluZwogICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZS4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTI3NjMzIEZpeCBpbmZpbml0ZSBsb29wIGluIHJlY3Vyc2l2ZSB0eXBlZGVmIHJlc29sdXRpb24uCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gU0YgIzMxNjg2NzYgRml4ICVyZW5hbWUgbm90IHdvcmtpbmcgZm9yIG1lbWJlciB2YXJpYWJsZXMgYW5kIG1ldGhvZHMuCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2xpc3BdIFNGICMzMTQ4MjAwIEZpeCBzZWdmYXVsdCBwYXJzaW5nIG5lc3RlZCB1bmlvbnMuCgoyMDExLTAyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9ycyAtIGEgY2FsbCB0byBhIG1ldGhvZCBiZWluZyBkZWZpbmVkIGluIHRoZSBiYXNlIGNsYXNzLCBub3QKICAgICAgICAgICAgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzLCBidXQgYWdhaW4gb3ZlcnJpZGRlbiBpbiBhIGNsYXNzIGRlcml2ZWQgZnJvbQogICAgICAgICAgICB0aGUgZmlyc3Qgc3ViY2xhc3Mgd2FzIG5vdCBiZWluZyBkaXNwYXRjaGVkIGNvcnJlY3RseSB0byB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICBTZWUgZGlyZWN0b3JfYWx0ZXJuYXRpbmcuaSBmb3IgYW4gZXhhbXBsZS4KCjIwMTEtMDItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQW55ICd1c2luZycgc3RhdGVtZW50cyBpbiB0aGUgcHJvdGVjdGVkIHNlY3Rpb24gb2YgYSBjbGFzcyB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgaWdub3JlZCB3aXRoIGRpcmVjdG9yIHByb3RlY3RlZCAoZGlycHJvdCkgbW9kZS4KCjIwMTEtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvdmVybG9hZGluZyB3aXRoIGNvbnN0IHBvaW50ZXIgcmVmZXJlbmNlIChTV0lHVFlQRSAqY29uc3QmKSBwYXJhbWV0ZXJzIGZvciBhCiAgICAgICAgICAgIG51bWJlciBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLgoKMjAxMS0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHdhcm5pbmcgZm9yIHNtYXJ0IHBvaW50ZXJzIGlmIG9ubHkgc29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgaW5oZXJpdGFuY2UKICAgICAgICAgICAgY2hhaW4gYXJlIG1hcmtlZCBhcyBzbWFydCBwb2ludGVyLCBlZywgJXNoYXJlZF9wdHIgc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgc28gdGhpcyBuZXcgd2FybmluZyBoaWdobGlnaHRzIGNvZGUgd2hlcmUgdGhpcyBpcwogICAgICAgICAgICBub3QgdGhlIGNhc2UuCgogICAgICAgICAgICAgIGV4YW1wbGUuaToxMjogV2FybmluZyA1MjA6IEJhc2UgY2xhc3MgJ0EnIG9mICdCJyBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIuCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjE2OiBXYXJuaW5nIDUyMDogRGVyaXZlZCBjbGFzcyAnQycgb2YgJ0InIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlci4KCjIwMTEtMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHNvbWUgbWlzc2luZyBtdWx0aS1hcmd1bWVudCB0eXBlbWFwczogKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgYW5kIAogICAgICAgICAgICAoY2hhciAqU1RSSU5HLCBpbnQgTEVOR1RIKS4gRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyB1cGRhdGVkLiBKYXZhIHBhdGNoIGZyb20KICAgICAgICAgICAgVm9sa2VyIEdyYWJzY2guCgoyMDExLTAxLTExOiBpYW50CgkgICAgUmVxdWlyZSBHbyB2ZXJzaW9uIDcwNzcgb3IgbGF0ZXIuCgoyMDEwLTEyLTMwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbQyMsIEQsIEphdmFdIENoZWNrIGZvciBjb2xsaXNpb24gb2YgcGFyYW1ldGVyIG5hbWVzIHdpdGggdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlIGtleXdvcmRzIHdoZW4gZ2VuZXJhdGluZyB0aGUgZGlyZWN0b3IgZ2x1ZSBjb2RlLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIHNpdHVhdGlvbiBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIGNvdWxkIHdvdWxkIHByZXZpb3VzbHkgYmUKICAgICAgICAgICAgaW52YWxpZCBpcyBpbGx1c3RyYXRlZCBpbiB0aGUgbmV3ICdkaXJlY3Rvcl9rZXl3b3JkcycgdGVzdCBjYXNlLgoKMjAxMC0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggJGNzaW5wdXQgc3BlY2lhbCB2YXJpYWJsZSBub3QgYmVpbmcgZXhwYW5kZWQgZm9yIGNzdmFyaW4gdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMC0xMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRiYXNlbWFuZ2xlIGV4cGFuc2lvbiBpbiBhcnJheSB0eXBlbWFwcy4gRm9yIGV4YW1wbGUgaWYgdHlwZSBpcyBpbnQgKlszXSwKICAgICAgICAgICAgJGJhc2VtYW5nbGUgZXhwYW5kcyB0byBfcF9pbnQuCgoyMDEwLTEyLTA3OiBpYW50CgkgICAgQ2hlY2sgdGhhdCB3ZSBhcmUgdXNpbmcgYSBzdWZmaWNpZW50bHkgbmV3IHZlcnNpb24gb2YgdGhlCgkgICAgNmcgb3IgOGcgR28gY29tcGlsZXIgZHVyaW5nIGNvbmZpZ3VyZSB0aW1lLiBJZiBub3QsIGRpc2FibGUgR28uCiAgICAgICAgICAgIE1pbmltdW0gdmVyc2lvbiBpcyBub3cgNjcwNy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTEyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxMjczOTQgLSB1c2Ugb2YgbmV0d29yayBwYXRocyBvbiBXaW5kb3dzL01TeXMuCgoyMDEwLTExLTE4OiBrbGlja3ZlcmJvdAoJICAgIFtEXSBBZGRlZCB0aGUgRCBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTExLTEyOiB2YWR6CgkgICAgRml4IGhhbmRsaW5nIG9mIG11bHRpcGxlIHJlZ2V4LXVzaW5nICVyZW5hbWVzIGF0dGFjaGVkIHRvIHRoZSBzYW1lCgkgICAgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlLCBub3cKCgkgICAgICAlcmVuYW1lKCIlKHJlZ2V4Oi9eU2V0KC4qKS9wdXRcXDEvKXMiKSAiIjsKCSAgICAgICVyZW5hbWUoIiUocmVnZXg6L15HZXQoLiopL2dldFxcMS8pcyIpICIiOwoKCSAgICB3b3JrcyBhcyBleHBlY3RlZCB3aGVyZWFzIGJlZm9yZSBvbmx5IHRoZSBsYXN0IGFub255bW91cyByZW5hbWUgd2FzCgkgICAgdGFrZW4gaW50byBhY2NvdW50LgoKMjAxMC0xMC0xNzogZHJqb2UKCSAgICBbUl0gRml4IGZhaWx1cmUgaW4gb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2hpY2ggd2FzIGJyZWFraW5nCgkgICAgUXVhbnRMaWItU1dJRwoKMjAxMC0xMC0xNDogb2xseQoJICAgIFtQSFBdIEFsbG93IGNvbXBpbGF0aW9uIG9uIG5vbi1jb25mb3JtaW5nIE1pY3Jvc29mdCBDKysgY29tcGlsZXJzCgkgICAgd2hpY2ggZG9uJ3QgYWNjZXB0OiByZXR1cm4gZnVuY3Rpb25fcmV0dXJuaW5nX3ZvaWQoKTsKCSAgICBSZXBvcnRlZCBieSBGcmFuayBWYW5kZW4gQmVyZ2hlbiBvbiB0aGUgU1dJRyBtYWlsaW5nIGxpc3QuCgoyMDEwLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSAoZ2xvYmFsIHNjb3BlKSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMi4wLjAsIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJlbiBXYWxrZXIuIFRoZSBtYW5nbGVkIHN5bWJvbCBuYW1lcyB3ZXJlIGluY29ycmVjdCwgc29tZXRpbWVzIHJlc3VsdGluZyBpbiB0eXBlcyBiZWluZwogICAgICAgICAgICBpbmNvcnJlY3RseSB0cmVhdGVkIGFzIG9wYXF1ZSB0eXBlcy4KCiAgICAgICAgICAgIEFsc28gZml4ZXMgIzI5NTg3ODEgYW5kIHNvbWUgb3RoZXIgdHlwZSBwcm9ibGVtcyBkdWUgdG8gYmV0dGVyIHR5cGVkZWYgcmVzb2x1dGlvbiwgZWcgCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQgKj46OnZhbHVlX3R5cGUgZGlkbid0IHJlc29sdmUgdG8gVCAqIHdoZW4gaXQgc2hvdWxkIGhhdmUuIFRoZSBtYW5nbGVkIHR5cGUKICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IFNXSUdUWVBFX3N0ZF9fdmVjdG9yVF9UZXN0X3Bfc3RkX19hbGxvY2F0b3JUX1Rlc3RfcF90X3RfX3ZhbHVlX3R5cGUgYW5kIG5vdwogICAgICAgICAgICBpdCBpcyBjb3JyZWN0bHkgU1dJR1RZUEVfcF9UZXN0LgoKVmVyc2lvbiAyLjAuMSAoNCBPY3RvYmVyIDIwMTApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMC0xMC0wMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMwNjY5NTggZnJvbSBNaWthZWwgSm9oYW5zc29uIHRvIGZpeCBkZWZhdWx0IHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgaGFuZGxpbmcgd2hlbiB0aGUgc21hcnQgcG9pbnRlciBjb250YWlucyBib3RoIGEgY29uc3QgYW5kIG5vbi1jb25zdCBvcGVyYXRvci0+LgoKMjAxMC0xMC0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1wY3JldmVyc2lvbiBvcHRpb24gdG8gZGlzcGxheSBQQ1JFIHZlcnNpb24gaW5mb3JtYXRpb24uCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1J1YnldIEF2b2lkIHNlZ2ZhdWx0IHdoZW4gYSBtZXRob2Qgbm9kZSBoYXMgbm8gcGFyZW50Tm9kZQoJICAgIChTRiMzMDM0MDU0KS4KCjIwMTAtMTAtMDE6IG9sbHkKCSAgICBbUHl0aG9uXSBBbGxvdyByZWluaXRpYWxpc2F0aW9uIHRvIHdvcmsgd2l0aCBhbiBlbWJlZGRlZCBQeXRob24KCSAgICBpbnRlcnByZXRlciAocGF0Y2ggZnJvbSBKaW0gQ2Fycm9sbCBpbiBTRiMzMDc1MTc4KS4KCjIwMTAtMDktMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggZnJvbSBUb21hcyBEaXJ2YW5hdXNrYXMgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIHRvIGF2b2lkCiAgICAgICAgICAgIHRocm93aW5nIGV4Y2VwdGlvbnMgd2l0aCBub3JtYWwgdXNhZ2Ugb2YgaXRlcmF0b3JzLgoKMjAxMC0wOS0yNzogb2xseQoJICAgIFtQeXRob25dIEltcHJvdmUgZXJyb3IgbWVzc2FnZSBnaXZlbiB3aGVuIGEgcGFyYW1ldGVyIG9mIHRoZSB3cm9uZwoJICAgIHR5cGUgaXMgcGFzc2VkIHRvIGFuIG92ZXJsb2FkZWQgbWV0aG9kIChTRiMzMDI3MzU1KS4KCjIwMTAtMDktMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IFNGIHBhdGNoICMzMDc1MTUwIC0gSmF2YSBkaXJlY3RvcnMgdXNpbmcgc3RhdGljIHZhcmlhYmxlcyBpbgogICAgICAgICAgICBuYW1lZCBuYW1lc3BhY2UuCgoyMDEwLTA5LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGZpbGUgYW5kIGxpbmUgZXJyb3Ivd2FybmluZyByZXBvcnRpbmcgZml4ZXMgd2hlcmUgU1dJRyBtYWNyb3MKICAgICAgICAgICAgYXJlIHVzZWQgd2l0aGluIHt9IGJyYWNlcyAod2hlcmUgdGhlIHByZXByb2Nlc3NvciBleHBhbmRzIG1hY3JvcyksCiAgICAgICAgICAgIGZvciBleGFtcGxlIG1hY3JvcyB3aXRoaW4gJWlubGluZSB7Li4ufSBhbmQgJWZyYWdtZW50KC4uLikgey4uLn0KICAgICAgICAgICAgYW5kIG5lc3RlZCBzdHJ1Y3RzLgoKMjAxMC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIGZvciB2YXJpb3VzIGluaGVyaXRlZAogICAgICAgICAgICBjbGFzcyBwcm9ibGVtcy4KCjIwMTAtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEEgbXVjaCBpbXByb3ZlZCBkZWJ1Z2dpbmcgb2YgU1dJRyBzb3VyY2UgZXhwZXJpZW5jZSBpcyBub3cgYXZhaWxhYmxlIGFuZAogICAgICAgICAgICBkb2N1bWVudGVkIGluIHRoZSAiRGVidWdnaW5nIFNXSUciIHNlY3Rpb24gaW4gdGhlIERvYy9EZXZlbC9pbnRlcm5hbHMuaHRtbAogICAgICAgICAgICBmaWxlLCBpbmNsdWRpbmcgYSBzd2lnLmRiZyBzdXBwb3J0IGZpbGUgZm9yIHRoZSBnZGIgZGVidWdnZXIuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3Mgd2hlbiBhIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb24gZW5kcyB3aXRoICcvJyBhbmQgaXQgaXMgbm90IHRoZSBlbmQgb2YgYSBDIGNvbW1lbnQuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3MgYWZ0ZXIgcGFyc2luZwogICAgICAgICAgICBtYWNybyBpbnZvY2F0aW9ucyB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gb3ZlciBtb3JlIHRoYW4gb25lIGxpbmUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZXh0cmFuZW91cyBleHRyYSBsaW5lIGluIHByZXByb2Nlc3NlZCBvdXRwdXQgYWZ0ZXIgaW5jbHVkaW5nIGZpbGVzCiAgICAgICAgICAgIHdoaWNoIHdvdWxkIHNvbWV0aW1lcyBsZWFkIHRvIGVycm9yL3dhcm5pbmcgbWVzc2FnZXMgdHdvIGxpbmVzIGFmdGVyIHRoZQogICAgICAgICAgICBlbmQgb2YgdGhlIGZpbGUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIxNDk1MjMgLSBJbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycyBhZnRlciBwYXJzaW5nIG1hY3JvcwogICAgICAgICAgICBjb250YWluaW5nIEMrKyBjb21tZW50cy4KCjIwMTAtMDktMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgT1VUUFVUIHR5cGVtYXBzIChQYXRjaCBmcm9tIFJ5YW4gaW4gU0YjMzA1ODM5NCkuCgoyMDEwLTA5LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZXJyb25lb3VzIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBmb3IgbWFjcm8gZXhwYW5zaW9ucywgZm9yIGV4YW1wbGUsCiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlIG5vdyBwb2ludHMgdG8gaW5zdGFudGlhdGlvbiBvZiB0aGUgbWFjcm8sIGllIHRoZSBsYXN0IGxpbmUgaGVyZToKCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNSTzIoYSwgYikgCgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8xKE5BTUUpIE1BQ1JPMihOQU1FLDIsMykgCgogICAgICAgICAgICAgIE1BQ1JPMShhYmMpCgoyMDEwLTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGZvciBwcmVwcm9jZXNzb3IgbWVzc2FnZXMgd2l0aGluCiAgICAgICAgICAgICVpbmxpbmUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgI2RlZmluZSBGT09CQVIgMQogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSICJoaSIKICAgICAgICAgICAgICAlfQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyB3aGljaCB3ZXJlIGN1bXVsYXRpdmVseSBvbmUKICAgICAgICAgICAgbGVzcyB0aGFuIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiBhZnRlciBwYXJzaW5nIGVhY2ggJWluY2x1ZGUvJWltcG9ydCAtIGJ1ZwogICAgICAgICAgICBpbnRyb2R1Y2VkIGluIHN3aWctMS4zLjMyLiBBbHNvIGZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICAgd2hlbiBuZXcgbGluZSBjaGFyYWN0ZXJzIGFwcGVhciBiZXR3ZWVuIHRoZSAlaW5jbHVkZSAvICVpbXBvcnQgc3RhdGVtZW50IGFuZAogICAgICAgICAgICB0aGUgZmlsZW5hbWUuCgoyMDEwLTA4LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXIgYW5kIGZpbGUgbmFtZSByZXBvcnRpbmcgZm9yIHNvbWUgbWFjcm8gcHJlcHJvY2Vzc29yIHdhcm5pbmdzLgogICAgICAgICAgICBUaGUgbGluZSBudW1iZXIgb2YgdGhlIG1hY3JvIGFyZ3VtZW50IGhhcyBiZWVuIGNvcnJlY3RlZCBhbmQgdGhlIGxpbmUgbnVtYmVyCiAgICAgICAgICAgIG9mIHRoZSBzdGFydCBvZiB0aGUgbWFjcm8gaW5zdGVhZCBvZiBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBtYWNybyBpcyB1c2VkLgogICAgICAgICAgICBTb21lIGV4YW1wbGVzOgogICAgICAgICAgICAgIGZpbGUuaDoxMTogRXJyb3I6IElsbGVnYWwgbWFjcm8gYXJndW1lbnQgbmFtZSAnLi4nCiAgICAgICAgICAgICAgZmlsZS5oOjE5OiBFcnJvcjogTWFjcm8gJ0RVUExJQ0FURScgcmVkZWZpbmVkLAogICAgICAgICAgICAgIGZpbGUuaDoxNTogRXJyb3I6IHByZXZpb3VzIGRlZmluaXRpb24gb2YgJ0RVUExJQ0FURScuCiAgICAgICAgICAgICAgZmlsZS5oOjI1OiBFcnJvcjogVmFyaWFibGUtbGVuZ3RoIG1hY3JvIGFyZ3VtZW50IG11c3QgYmUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgICBmaWxlLmg6MzI6IEVycm9yOiBJbGxlZ2FsIGNoYXJhY3RlciBpbiBtYWNybyBhcmd1bWVudCBuYW1lCiAgICAgICAgICAgICAgZmlsZS5pOjM3OiBFcnJvcjogTWFjcm8gJ1NJVCcgZXhwZWN0cyAyIGFyZ3VtZW50cwoKMjAxMC0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IF9fTElORV9fIGFuZCBfX0ZJTEVfXyBleHBhbnNpb24gcmVwb3J0ZWQgYnkgQ2FtaWxsZSBHaWxsb3QuIE1vc3RseSB0aGlzCiAgICAgICAgICAgIGRpZCBub3Qgd29yayBhdCBhbGwuIEFsc28gZml4ZXMgU0YgIzI4MjI4MjIuCgoyMDEwLTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGNvcm5lciBjYXNlIG1hcnNoYWxsaW5nIG9mIGRvdWJsZXMgLSBlcnJubyB3YXMgbm90IGJlaW5nIGNvcnJlY3RseQogICAgICAgICAgICBzZXQgYmVmb3JlIGNhbGxpbmcgc3RydG9kIC0gcGF0Y2ggZnJvbSBKdXN0aW4gVmFsbG9uIC0gU0YgQnVnICMzMDM4OTM2LgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1ha2UgZGlzdGNsZWFuIHdoZW4gc29tZSBvZiB0aGUgbW9yZSBvYnNjdXJlIGxhbmd1YWdlcyBhcmUgZGV0ZWN0ZWQgYnkKICAgICAgICAgICAgY29uZmlndXJlIC0gZml4ZXMgZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDEwLTA3LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlIGNvbmZpZ3VyaW5nIG91dCBvZiBzb3VyY2UgZm9yIHRoZSB0ZXN0LXN1aXRlIHNpbmNlIGl0IGJyb2tlIGluIDEuMy4zNy4KICAgICAgICAgICAgQXMgcHJldmlvdXNseSwgaWYgcnVubmluZyAnbWFrZSBjaGVjay10ZXN0LXN1aXRlJyBvdXQgb2Ygc291cmNlLCBpdCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGJ5IGludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGEgcmVsYXRpdmUgcGF0aC4gSW52b2tpbmcgY29uZmlndXJlIHdpdGggYW4KICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCB3aWxsIG5vdCB3b3JrLiBSdW5uaW5nIHRoZSBmdWxsICdtYWtlIGNoZWNrJyBzdGlsbCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGluIHRoZSBzb3VyY2UgdHJlZS4KCjIwMTAtMDctMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbiBwb2ludGVycyBhbmQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIHJldHVybnMgYnkgcmVmZXJlbmNlLgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIHRoZSBvbGQgZXhwZXJpbWVudGFsICJyeHNwZW5jZXIiIGVuY29kZXIgYW5kCiAgICAgICAgICAgICJbbm90XXJ4c21hdGNoIiBpbiAlcmVuYW1lIChzZWUgdGhlIDAxLzE2LzIwMDYgZW50cnkpLiBUaGUgbmV3IGFuZAogICAgICAgICAgICBvZmZpY2lhbGx5IHN1cHBvcnRlZCAicmVnZXgiIGVuY29kZXIgYW5kICJbbm90XXJlZ2V4bWF0Y2giIGNoZWNrcwogICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIChzZWUgdGhlIHR3byBwcmV2aW91cyBlbnRyaWVzKS4gUGxlYXNlCiAgICAgICAgICAgIHJlcGxhY2UgIiUocnhzcGVuY2VyOltwYXRdW3N1YnN0XSlzIiB3aXRoICIlKHJlZ2V4Oi9wYXQvc3Vic3QvKXMiCiAgICAgICAgICAgIHdoZW4gdXBncmFkaW5nLiBOb3RpY2UgdGhhdCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcmVwbGFjZSB0aGUgYmFjay0KICAgICAgICAgICAgcmVmZXJlbmNlcyBvZiBmb3JtICJAMSIgd2l0aCB0aGUgbW9yZSBzdGFuZGFyZCAiXFwxIiBhbmQgbWF5IG5lZWQgdG8KICAgICAgICAgICAgYWRqdXN0IHlvdXIgcmVndWxhciBleHByZXNzaW9ucyBzeW50YXggYXMgdGhlIG5ldyByZWdleCBlbmNvZGVyIHVzZXMKICAgICAgICAgICAgUGVybC1jb21wYXRpYmxlIHN5bnRheCBhbmQgbm90IChleHRlbmRlZCkgUE9TSVggc3ludGF4IGFzIHRoZSBvbGQgb25lLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCAicmVnZXhtYXRjaCIsICJyZWdleHRhcmdldCIgYW5kICJub3RyZWdleG1hdGNoIiB3aGljaCBjYW4gYmUKICAgICAgICAgICAgdXNlZCB0byBhcHBseSAlcmVuYW1lIGRpcmVjdGl2ZXMgdG8gdGhlIGRlY2xhcmF0aW9ucyBtYXRjaGluZyB0aGUKICAgICAgICAgICAgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbmx5LiBUaGUgZmlyc3QgdHdvIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGludGVyY2hhbmdlYWJseSwgYm90aCBvZiB0aGUgJXJlbmFtZXMgYmVsb3cgZG8gdGhlIHNhbWUgdGhpbmc6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4bWF0Y2gkbmFtZT0iT2xkJCIpICIiOwogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4dGFyZ2V0PTEpICJPbGQkIjsKCiAgICAgICAgICAgIChuYW1lbHkgaWdub3JlIHRoZSBkZWNsYXJhdGlvbnMgaGF2aW5nICJPbGQiIHN1ZmZpeCkuCgogICAgICAgICAgICAibm90cmVnZXhtYXRjaCIgcmVzdHJpY3RzIHRoZSBtYXRjaCB0byBvbmx5IHRoZSBkZWNsYXJhdGlvbnMgd2hpY2gKICAgICAgICAgICAgZG8gbm90IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGUuZy4gaGVyZSBpcyBob3cgdG8gcmVuYW1lIHRvCiAgICAgICAgICAgIGxvd2VyIGNhc2UgdmVyc2lvbnMgYWxsIGRlY2xhcmF0aW9ucyBleGNlcHQgdGhvc2UgY29uc2lzdGluZyBmcm9tCiAgICAgICAgICAgIGNhcGl0YWwgbGV0dGVycyBvbmx5OgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiQobG93ZXJjYXNlKXMiLCBub3RyZWdleG1hdGNoJG5hbWU9Il5bQS1aXSskIikgIiI7CgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCB0aGUgbmV3ICJyZWdleCIgZW5jb2RlciB0aGF0IGNhbiBiZSB1c2VkIGluICVyZW5hbWUsIGUuZy4KCiAgICAgICAgICAgICAgICAlcmVuYW1lKCJyZWdleDovKFxcdyspXyguKikvXFwyLyIpICIiOwoKICAgICAgICAgICAgdG8gcmVtb3ZlIGFueSBhbHBoYWJldGljYWwgcHJlZml4IGZyb20gYWxsIGlkZW50aWZpZXJzLiBUaGUgc3ludGF4CiAgICAgICAgICAgIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGlzIFBlcmwtbGlrZSBhbmQgUENSRSBsaWJyYXJ5CiAgICAgICAgICAgIChodHRwOi8vd3d3LnBjcmUub3JnLykgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlIGJ1dCBub3RpY2UKICAgICAgICAgICAgdGhhdCBiYWNrc2xhc2hlcyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgdXN1YWwgaW5zaWRlIEMgc3RyaW5ncy4KCiAgICAgICAgICAgIE9yaWdpbmFsIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMDI0ODc1IC0gc2hhcmVkX3B0ciBvZiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4gVGhpcyBhbHNvIGZpeGVzCiAgICAgICAgICAgIHRoZSAidW5yZWYiIGZlYXR1cmUgd2hlbiB1c2VkIG9uIGNsYXNzZXMgd2l0aCBub24tcHVibGljIGRlc3RydWN0b3JzLgoKMjAxMC0wNi0xNzogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBBZGQgdGhlIEdvIGxhbmd1YWdlIG1vZHVsZS4KCjIwMTAtMDYtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCBTV0lHX2x1YV9pc25pbHN0cmluZyBtdWx0aXBseSBkZWZpbmVkIHdoZW4gdXNpbmcgbXVsdGlwbGUKICAgICAgICAgICAgbW9kdWxlcyBhbmQgd3JhcHBpbmcgc3RyaW5ncy4gUGF0Y2ggZnJvbSAnTnVtYmVyIENydW5jaGVyJy4KCjIwMTAtMDYtMTA6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3JzIHRvIGNvcnJlY3RseSBjYWxsIGEgbWV0aG9kIHdpdGggaGFzIGEKCSAgICBkaWZmZXJlbnQgbmFtZSBpbiBQSFAgdG8gQysrICh3ZSB3ZXJlIGFsd2F5cyB1c2luZyB0aGUgQysrIG5hbWUKCSAgICBpbiB0aGlzIGNhc2UpLgoKMjAxMC0wNi0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuY29tcGlsYWJsZSBjb2RlIHdoZW4gJXJlbmFtZSByZXN1bHRzIGluIHR3byBlbnVtIGl0ZW1zCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZS4gUmVwb3J0ZWQgYnkgVmFkaW0gWmVpdGxpbi4KClZlcnNpb24gMi4wLjAgKDIgSnVuZSAyMDEwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTAtMDYtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRCBtYWNybyB1c2VkIGluIHN0ZDo6dmVjdG9yIHRvIHdvcmsgd2l0aAogICAgICAgICAgICB0eXBlcyBjb250YWluaW5nIGNvbW1hcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRChzdGQ6OnBhaXI8IGRvdWJsZSwgc3RkOjpzdHJpbmcgPikKCjIwMTAtMDYtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiBzdGRfc2hhcmVkX3B0ci5pIGZvciB3cmFwcGluZyBzdGQ6OnNoYXJlZF9wdHIuIFJlcXVpcmVzIHRoZSAlc2hhcmVkX3B0cgogICAgICAgICAgICBtYWNybyBsaWtlIGluIHRoZSBib29zdF9zaGFyZWRfcHRyLmkgbGlicmFyeS4gc3RkOjp0cjE6OnNoYXJlZF9wdHIgY2FuIGFsc28gYmUKICAgICAgICAgICAgd3JhcHBlZCBpZiB0aGUgZm9sbG93aW5nIG1hY3JvIGlzIGRlZmluZWQ6CgogICAgICAgICAgICAgICNkZWZpbmUgU1dJR19TSEFSRURfUFRSX1NVQk5BTUVTUEFDRSB0cjEKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3NoYXJlZF9wdHIuaT4KCiAgICAgICAgICAgIHNoYXJlZF9wdHIgaXMgYWxzbyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbCBub3cuCgoyMDEwLTA1LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgZm9yICR0eXBlbWFwIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zIHRvIGNhbGwgb3RoZXIgJHR5cGVtYXAKICAgICAgICAgICAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIENDICJDQyIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIEJCICIkdHlwZW1hcChjc3R5cGUsIENDKSIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIEFBICIkdHlwZW1hcChjc3R5cGUsIEJCKSIKICAgICAgICAgICAgICB2b2lkIGhhaChBQSBhYSk7CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgQyMgc3RkOjp2ZWN0b3IgY29udGFpbmVycyBvZiBzaGFyZWRfcHRyIGFuZCAlc2hhcmVkX3B0ci4KCiAgICAgICAgICAgIEFsc28gYWRkZWQgZGlhZ25vc3RpY3MgZm9yICR0eXBlbWFwIHdpdGggLWRlYnVnLXRtc2VhcmNoLCBmb3IgZXhhbXBsZSwgdGhlCiAgICAgICAgICAgIGFib3ZlIGRpc3BsYXlzIGFkZGl0aW9uYWwgZGlhZ25vc3RpYyBsaW5lcyBzdGFydGluZyAiQ29udGFpbmluZzogIjoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IEFBIGFhCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQQogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQUEKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQkIpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjMxOiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IEJCCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQkIKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIEJCCiAgICAgICAgICAgICAgICBDb250YWluaW5nOiAkdHlwZW1hcChjc3R5cGUsIENDKQogICAgICAgICAgICAgIGV4YW1wbGUuaToyOTogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBDQwogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IENDCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBDQwoKMjAxMC0wNS0yNjogb2xseQoJICAgIEZpeCAlYXR0cmlidXRlMnJlZiBub3QgdG8gcHJvZHVjZSBhIHN5bnRheCBlcnJvciBpZiB0aGUgbGFzdAoJICAgIGFyZ3VtZW50IChBY2Nlc3Nvck1ldGhvZCkgaXMgb21pdHRlZC4gIFBhdGNoIGZyb20gRGF2aWQgUGllcGdyYXMKCSAgICBpbiBTRiMyMjM1NzU2LgoKMjAxMC0wNS0yNjogb2xseQoJICAgIFtQSFBdIFdoZW4gdXNpbmcgJXRocm93cyBvciAlY2F0Y2hlcywgU1dJRy1nZW5lcmF0ZWQgUEhQNSB3cmFwcGVycwoJICAgIG5vdyB0aHJvdyBQSFAgRXhjZXB0aW9uIG9iamVjdHMgaW5zdGVhZCBvZiBnaXZpbmcgYSBQSFAgZXJyb3Igb2YKCSAgICB0eXBlIEVfRVJST1IuCgoJICAgIFRoaXMgY2hhbmdlIHNob3VsZG4ndCBjYXVzZSBpbmNvbXBhdGliaWxpdHkgaXNzdWVzLCBzaW5jZSB5b3UgY2FuJ3QKCSAgICBzZXQgYW4gZXJyb3IgaGFuZGxlciBmb3IgRV9FUlJPUiwgc28gcHJldmlvdXNseSBQSFAgd291bGQganVzdCBleGl0CgkgICAgd2hpY2ggYWxzbyBoYXBwZW5zIGZvciB1bmhhbmRsZWQgZXhjZXB0aW9ucy4gIFRoZSBiZW5lZml0IGlzIHlvdSBjYW4KCSAgICBub3cgY2F0Y2ggdGhlbSBpZiB5b3Ugd2FudCB0by4KCgkgICAgRml4ZXMgU0YjMjU0NTU3OCBhbmQgU0YjMjk1NTUyMi4KCjIwMTAtMDUtMjU6IG9sbHkKCSAgICBbUEhQXSBBZGQgbWlzc2luZyBkaXJlY3RvcmluIHR5cGVtYXAgZm9yIGNvbnN0IHN0ZDo6c3RyaW5nICYuCgkgICAgRml4ZXMgU0YjMzAwNjQwNCByZXBvcnRlZCBieSB0LUxlZ2lhdy4KCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ICMyOTU3Mzc1IC0gU1dJR1N0cmluZ0hlbHBlciBhbmQgU1dJR0V4Y2VwdGlvbkhlbHBlciBub3QgYWx3YXlzIGJlaW5nCiAgICAgICAgICAgIGluaXRpYWxpemVkIGJlZm9yZSB1c2UgaW4gLk5FVCA0IGFzIHRoZSBjbGFzc2VzIHdlcmUgbm90IG1hcmtlZCBiZWZvcmVmaWVsZGluaXQuCiAgICAgICAgICAgIEEgc3RhdGljIGNvbnN0cnVjdG9yIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlcHJhZ21hKGNzaGFycCkgaW1jbGFzc2NvZGU9JXsKICAgICAgICAgICAgICAgIHN0YXRpYyAkaW1jbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIElmIHlvdSBoYWQgYWRkZWQgeW91ciBvd24gY3VzdG9tIHN0YXRpYyBjb25zdHJ1Y3RvciB0byB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzIGluCiAgICAgICAgICAgIHRoZSBzYW1lIHdheSBhcyBhYm92ZSwgeW91IHdpbGwgaGF2ZSB0byBtb2RpZnkgeW91ciBhcHByb2FjaCB0byB1c2Ugc3RhdGljIHZhcmlhYmxlCiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG9yIGRlZmluZSBTV0lHX0NTSEFSUF9OT19JTUNMQVNTX1NUQVRJQ19DT05TVFJVQ1RPUiAtIFNlZSBjc2hhcnBoZWFkLnN3Zy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI0MDgyMzIuIEltcHJvdmUgc2hhcmVkX3B0ciBhbmQgaW50cnVzaXZlX3B0ciB3cmFwcGVycyBmb3IgY2xhc3NlcyBpbiBhbgogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIE5vIHNwZWNpYWwgdHJlYXRtZW50IGlzIG5lZWRlZCBmb3IgZGVyaXZlZCBjbGFzc2VzLgogICAgICAgICAgICBUaGUgcHJveHkgY2xhc3MgYWxzbyBubyBsb25nZXIgbmVlZHMgdG8gYmUgc3BlY2lmaWVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICAgIGRlZHVjZWQuIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlc2hhcmVkX3B0cihUWVBFKQogICAgICAgICAgICBTaW1pbGFybHkgZm9yIGludHJ1c2l2ZV9wdHIgd3JhcHBlcnMsIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVwcmVjYXRlZDoKICAgICAgICAgICAgICBTV0lHX0lOVFJVU0lWRV9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgICBTV0lHX0lOVFJVU0lWRV9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQogICAgICAgICAgICBhbmQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgICAgJWludHJ1c2l2ZV9wdHIoVFlQRSkKCjIwMTAtMDUtMjE6IG9sbHkKCSAgICBbUEhQXSBTdG9wIGdlbmVyYXRpbmcgYSBib2d1cyBsaW5lIG9mIGNvZGUgaW4gY2VydGFpbiBjb25zdHJ1Y3RvcnMuCgkgICAgVGhpcyB3YXMgbW9zdGx5IGhhcm1sZXNzLCBidXQgY2F1c2VkIGEgUEhQIG5vdGljZSB0byBiZSBpc3N1ZWQsIGlmCgkgICAgZW5hYmxlZCAoU0YjMjk4NTY4NCkuCgoyMDEwLTA1LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMjAxMC0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIEMrKyBlbnVtIGJvb2xlYW4gdmFsdWVzIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZjoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0geyBQTEFZID0gdHJ1ZSwgU1RPUCA9IGZhbHNlIH0gcGxheV9zdGF0ZTsKCjIwMTAtMDUtMTQ6IG9sbHkKCSAgICBbUEhQXSBGaXggd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCB3YXMgcHJvZHVjaW5nCgkgICAgdW5jb21waWxhYmxlIGNvZGUgaW4gc29tZSBjYXNlcy4KCjIwMTAtMDUtMTI6IGRyam9lCgkgICAgW1JdIEFkZCB0d28gbW9yZSBjaGFuZ2VzIGZyb20gV2lsIE5vbGFuLiAgR2V0IGdhcmJhZ2UKCSAgICBjb2xsZWN0aW9uIHRvIHdvcmsuICBJbXBsZW1lbnQgbmV3ZnJlZQoKMjAxMC0wNS0wOTogZHJqb2UKICAgICAgICAgICAgRml4IGJ1ZyByZXBvcnRlZCBieSBXaWwgTm9sYW4gY2hhbmdlIGNyZWF0aW9uIG9mIHN0cmluZyBzbwogICAgICAgICAgICB0aGF0IFIgMi43LjArIGNhbiB1c2UgY2hhciBoYXNoZXMKCjIwMTAtMDUtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMyOTU1MTQ2IGZyb20gU2VyZ2V5IFNhdHNraXkgdG8gZml4IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgZGl2aWRlIGJ5CiAgICAgICAgICAgIG9wZXJhdG9yIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3RzLgoKMjAxMC0wNS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIE1lbW9yeSBsZWFrIGZpeCBoYW5kbGluZyBjb25zdCBzdGQ6OnN0cmluZyAmIGlucHV0cywgcmVwb3J0ZWQgYnkgV2lsbCBOb2xhbi4KCjIwMTAtMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFR5cGVtYXAgbWF0Y2hpbmcgZW5oYW5jZW1lbnQgZm9yIG5vbi1kZWZhdWx0IHR5cGVtYXBzLiBQcmV2aW91c2x5IGFsbAogICAgICAgICAgICBxdWFsaWZpZXJzIHdlcmUgc3RyaXBwZWQgaW4gb25lIHN0ZXAsIG5vdyB0aGV5IGFyZSBzdHJpcHBlZCBvbmUgYXQgYSB0aW1lCiAgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIGxlZnQgbW9zdCBxdWFsaWZpZXIuIEZvciBleGFtcGxlLCBpbnQgY29uc3QqY29uc3QgCiAgICAgICAgICAgIGlzIGZpcnN0IHN0cmlwcGVkIHRvIGludCAqY29uc3QgdGhlbiBpbnQgKi4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA0LTI1OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyOTg1NjU1IC0gYnJva2VuIGNvbnN0cnVjdG9yIHJlbmFtaW5nLgoKMjAxMC0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBmcmFnbWVudHMgYXJlIG5vdyBvZmZpY2lhbCBhbmQgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMjA0ODA2NCBhbmQgIzI0MDgwMjAuCiAgICAgICAgICAgIEFwcGx5IFVidW50dSBwYXRjaCB0byBmaXggUnVieSBhbmQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgd2l0aCAtbWluaGVyaXQuCiAgICAgICAgICAgIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3N3aWcxLjMvK2J1Zy81MjI4NzQKCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNenNjaGVtZV0gQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBzdGQ6Om1hcCB3cmFwcGVyczoKICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzIwMzg3NgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzI5NTIzNzQgLSBmaXggZGlyZWN0b3JzIGFuZCB0aGUgLW5vcnR0aSBvcHRpb24uCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggIzI4ODcyNTQgYW5kICMyOTQ2MDMyIC0gU1dJR19MdWFfdHlwZW5hbWUgdXNpbmcgd3Jvbmcgc3RhY2sgaW5kZXguCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggZXhjZXB0aW9ucyBiZWluZyB0aHJvd24gd2l0aCB0aGUgLXRocmVhZHMgb3B0aW9uIGJhc2VkIG9uIHBhdGNoIGZyb20gQXJ0byBWdW9yaS4KICAgICAgICAgICAgRml4ZXMgYnVnICMyODE4NDk5LgoKMjAxMC0wNC0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IE1ha2VmaWxlIHRhcmdldHM6IGRpc3RjbGVhbiBhbmQgbWFpbnRhaW5lci1jbGVhbgoKMjAxMC0wNC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IGNoYXIgcG9pbnRlcnMsIHdjaGFyX3QgcG9pbnRlcnMgYW5kIGNoYXIgYXJyYXlzIHNvIHRoYXQgbmlsIGNhbiBiZSBwYXNzZWQgYXMgYQogICAgICAgICAgICB2YWxpZCB2YWx1ZS4gQnVnIHJlcG9ydGVkIGJ5IEdlZGFsaWEgUGFzdGVybmFrLgoKMjAxMC0wNC0wMTogd3NmdWx0b24KICAgICAgICAgICAgTnVtZXJvdXMgc3VidGxlIHR5cGVtYXAgbWF0Y2hpbmcgcnVsZSBmaXhlcyB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlbWFwCiAgICAgICAgICAgIG1hdGNoaW5nIHJ1bGVzIGFyZSB0byB0YWtlIGEgdHlwZSBhbmQgZmluZCB0aGUgYmVzdCBkZWZhdWx0IHR5cGVtYXAgKFNXSUdUWVBFLCBTV0lHVFlQRSogZXRjKSwKICAgICAgICAgICAgdGhlbiBsb29rIGZvciB0aGUgbmV4dCBiZXN0IG1hdGNoIGJ5IHJlZHVjaW5nIHRoZSBjaG9zZW4gZGVmYXVsdCB0eXBlLiBUaGUgdHlwZSBkZWR1Y3Rpb24KICAgICAgICAgICAgbm93IGZvbGxvd3MgQysrIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gbWF0Y2hpbmcgcnVsZXMuCgogICAgICAgICAgICBCZWxvdyBhcmUgdGhlIHNldCBvZiBjaGFuZ2VzIG1hZGUgc2hvd2luZyB0aGUgZGVmYXVsdCB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBhbG9uZyB3aXRoIHRoZSBvbGQgcmVkdWNlZCB0eXBlIGFuZCB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIHJlZHVjZWQgdHlwZToKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAmW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICZbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCYpW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgY29uc3QgKltBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdCAmCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqJgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCAqCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAqCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqKgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCAmCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAmCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqJgoKICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhIGNvbnN0IFNXSUdUWVBFIGxvb2t1cCBpcyB1c2VkIG5vdyBmb3IgYW55IGNvbnN0YW50IHR5cGUuIFNvbWUgZXhhbXBsZXMsIHdoZXJlCiAgICAgICAgICAgIFQgaXMgc29tZSByZWR1Y2VkIHR5cGUsIGVnIGludCwgc3RydWN0IEZvbzoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdAogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICpjb25zdAogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqCgogICAgICAgICAgICAgICAgICAgVCBjb25zdFtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdFtdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRVtdCgogICAgICAgICAgICAgICAgICAgZW51bSBUIGNvbnN0CiAgICAgICAgICAgICAgbmV3OiBlbnVtIFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBlbnVtIFNXSUdUWVBFCgogICAgICAgICAgICAgICAgICAgVCAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKCpjb25zdCApW10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICgqKVtdCgogICAgICAgICAgICBSZW1pbmRlcjogdGhlIHR5cGVtYXAgbWF0Y2hpbmcgcnVsZXMgY2FuIG5vdyBiZSBzZWVuIGZvciBhbnkgdHlwZXMgYmVpbmcgd3JhcHBlZCBieSB1c2luZwogICAgICAgICAgICBlaXRoZXIgdGhlIC1kZWJ1Zy10bXNlYXJjaCBvciAtZGVidWctdG11c2VkIG9wdGlvbnMuCgogICAgICAgICAgICBJbiBwcmFjdGljZSB0aGlzIGxlYWRzIHRvIHNvbWUgc3VidGxlIG1hdGNoaW5nIHJ1bGUgY2hhbmdlcyBhbmQgdGhlIG1ham9yaXR5IG9mIHVzZXJzCiAgICAgICAgICAgIHdvbid0IG5vdGljZSBhbnkgY2hhbmdlcywgZXhjZXB0IGluIHRoZSBwcmltZSBhcmVhIG9mIG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlOiBJbXByb3ZlCiAgICAgICAgICAgIFNUTCBjb250YWluZXJzIG9mIGNvbnN0IHBvaW50ZXJzIGFuZCBwYXNzaW5nIGNvbnN0IHBvaW50ZXJzIGJ5IHJlZmVyZW5jZS4gVGhpcyBpcyBmaXhlZAogICAgICAgICAgICBiZWNhdXNlIG1hbnkgb2YgdGhlIFNUTCBjb250YWluZXJzIHVzZSBhIHR5cGUgJ1QgY29uc3QmJyBhcyBwYXJhbWV0ZXJzIGFuZCB3aGVuIFQgaXMgCiAgICAgICAgICAgIGEgY29uc3QgcG9pbnRlciwgZm9yIGV4YW1wbGUsICdLIGNvbnN0KicsIHRoZW4gdGhlIGZ1bGwgdHlwZSBpcyAnSyBjb25zdCpjb25zdCYnLiBUaGlzCiAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlICdTV0lHVFlQRSAqY29uc3QmJyB0eXBlbWFwcyBub3cgbWF0Y2ggd2hlbiBUIGlzIGVpdGhlciBhIG5vbi1jb25zdCBvcgogICAgICAgICAgICBjb25zdCBwb2ludGVyLiBGdXJ0aGVybW9yZSwgc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIGluY29ycmVjdGx5IGhhZCAnU1dJR1RZUEUgKiYnIHR5cGVtYXBzCiAgICAgICAgICAgIHdoZW4gdGhlc2Ugc2hvdWxkIGhhdmUgYmVlbiAnU1dJR1RZUEUgKmNvbnN0JicuIFRoZXNlIGhhdmUgYmVlbiBjb3JyZWN0ZWQgKEphdmEsIEMjLCBMdWEsIFBIUCkuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNvbWUgdmVyeSBvbGQgZGVwcmVjYXRlZCBwcmFnbWEgd2FybmluZ3MgYXJlIG5vdyBlcnJvcnMuCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBJbXByb3ZlIGhhbmRsaW5nIG9mIGZpbGUgbmFtZXMgYW5kIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZG91YmxlL211bHRpcGxlIHBhdGggc2VwYXJhdG9ycy4KCjIwMTAtMDMtMTA6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBVc2UgZnVsbHkgcXVhbGlmaWVkIHN5bWJvbCBuYW1lIG9mIGNsOjppZGVudGl0eSBpbiBlbWl0X2RlZnVuKCkuCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gVGhlIGludGVybWVkaWFyeSBKTkkgY2xhc3MgbW9kaWZpZXJzIGFyZSBub3cgcHVibGljIGJ5IGRlZmF1bHQgbWVhbmluZyB0aGVzZQogICAgICAgICAgICBpbnRlcm1lZGlhcnkgbG93IGxldmVsIGZ1bmN0aW9ucyBhcmUgbm93IGFjY2Vzc2libGUgYnkgZGVmYXVsdCBmcm9tIG91dHNpZGUgYW55IHBhY2thZ2UKICAgICAgICAgICAgdXNlZC4gVGhlIHByb3h5IGNsYXNzIHBvaW50ZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhbHNvIG5vdyBwdWJsaWMuCiAgICAgICAgICAgIFRoZXNlIGFyZSBuZWVkZWQgaW4gb3JkZXIgZm9yIHRoZSBuc3BhY2Ugb3B0aW9uIHRvIHdvcmsgd2l0aG91dCBhbnkgb3RoZXIgbW9kcy4KICAgICAgICAgICAgVGhlIHByZXZpb3VzIGRlZmF1bHQgb2YgcHJvdGVjdGVkIGFjY2VzcyBjYW4gYmUgcmVzdG9yZWQgdXNpbmc6CgogICAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfTUVUSE9EUyhwcm90ZWN0ZWQsIHByb3RlY3RlZCwgU1dJR1RZUEUpCiAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzID0gImNsYXNzIgoKMjAxMC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCB0aGUgbnNwYWNlIGZlYXR1cmUgZm9yIEMjLiBEb2N1bWVudGF0aW9uIGZvciB0aGUgbnNwYWNlIGZlYXR1cmUgaXMgbm93IGF2YWlsYWJsZS4KCjIwMTAtMDMtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZS4gVGhpcyBhZGRzIHNvbWUgaW1wcm92ZWQgbmFtZXNwYWNlIHN1cHBvcnQuIEN1cnJlbnRseSBvbmx5IEphdmEKICAgICAgICAgICAgaXMgc3VwcG9ydGVkIGZvciB0YXJnZXQgbGFuZ3VhZ2VzLCB3aGVyZSBDKysgbmFtZXNwYWNlcyBhcmUgYXV0b21hdGljYWxseSB0cmFuc2xhdGVkIGludG8KICAgICAgICAgICAgSmF2YSBwYWNrYWdlcy4gVGhlIGZlYXR1cmUgb25seSBhcHBsaWVzIHRvIGNsYXNzZXMsc3RydWN0LHVuaW9ucyBhbmQgZW51bXMgZGVjbGFyZWQgd2l0aGluCiAgICAgICAgICAgIGEgbmFtZXNwYWNlLiBNZXRob2RzIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gbmFtZXNwYWNlcyBzdGlsbCBlZmZlY3RpdmVseSBoYXZlIHRoZWlyCiAgICAgICAgICAgIG5hbWVzcGFjZXMgZmxhdHRlbmVkLiBFeGFtcGxlIHVzYWdlOgoKICAgICAgICAgICAgICAlZmVhdHVyZShuc3BhY2UpIE91dGVyOjpJbm5lcjE6OkNvbG9yOwogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMjo6Q29sb3I7CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlciB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgSW5uZXIxIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IENvbG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjIgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZvciBKYXZhLCB0aGUgLXBhY2thZ2Ugb3B0aW9uIGlzIGFsc28gcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgbnNwYWNlIGZlYXR1cmUuIFNheQogICAgICAgICAgICB3ZSB1c2UgLXBhY2thZ2UgY29tLm15Y28sIHRoZSB0d28gY2xhc3NlcyBjYW4gdGhlbiBiZSBhY2Nlc3NlZCBhcyBmb2xsb3dzIGZyb20gSmF2YToKCiAgICAgICAgICAgICAgY29tLm15Y28uT3V0ZXIuSW5uZXIxLkNvbG9yIGFuZCBjb20ubXljby5PdXRlci5Jbm5lcjIuQ29sb3IuCgoyMDEwLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgLWRpcnZ0YWJsZSBmcm9tIHRoZSBvcHRpbWl6YXRpb25zIGluY2x1ZGVkIGJ5IC1PIGFzIGl0IHRoaXMgb3B0aW9uCiAgICAgICAgICAgIGN1cnJlbnRseSBsZWFkcyB0byBtZW1vcnkgbGVha3MgYXMgcmVwb3J0ZWQgYnkgSm9oYW4gQmxha2UuCgoyMDEwLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBMaWNlbnNlIGNvZGUgY2hhbmdlczogU1dJRyBTb3VyY2UgaXMgR1BMLXYzIGFuZCBsaWJyYXJ5IGNvZGUgbGljZW5zZSBpcyBub3cgY2xlYXJlcgogICAgICAgICAgICBhbmQgaXMgcHJvdmlkZWQgdW5kZXIgYSB2ZXJ5IHBlcm1pc3NpdmUgbGljZW5zZS4gU2VlIGh0dHA6Ly93d3cuc3dpZy5vcmcvbGVnYWwuaHRtbC4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBIGZldyBmaXhlcyBmb3IgY29tcGlsaW5nIHVuZGVyIHJ1YnktMS45LnggaW5jbHVkaW5nIHBhdGNoIGZyb20gJ05pYmJsZScuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggZnJvbSBQYXRyaWNrIEJlbm5ldHQgdG8gZml4IFJBUlJBWV9MRU4gYW5kIFJBUlJBWV9QVFIgdXNhZ2UgZm9yIFJ1YnkgMS45LngKICAgICAgICAgICAgdXNlZCBpbiB2YXJpb3VzIFNUTCB3cmFwcGVycy4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IGluY29ycmVjdCBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbCBuYW1lIGVycm9yIHdoZW4gYW4gZW51bSBpdGVtCiAgICAgICAgICAgIGFuZCBjbGFzcyBuYW1lIGhhdmUgdGhlIHNhbWUgbmFtZSwgYXMgcmVwb3J0ZWQgYnkgTmF0aGFuIEtyaWVnZXIuIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFZlY3RvciB7fTsKICAgICAgICAgICAgICBuYW1lc3BhY2UgVGV4dCB7CiAgICAgICAgICAgICAgICBlbnVtIFByZWZlcmVuY2UgeyBWZWN0b3IgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgb3RoZXIgaW5jb3JyZWN0IGNvcm5lciBjYXNlIHRhcmdldCBsYW5ndWFnZSBzeW1ib2wgbmFtZSBjbGFzaGVzLgoKMjAxMC0wMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSAtZGVidWctbHN5bWJvbHMgb3B0aW9uIGZvciBkaXNwbGF5aW5nIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbGF5ZXIgc3ltYm9scy4KCjIwMTAtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAtTU0gYW5kIC1NTUQgb3B0aW9ucyBvbiBXaW5kb3dzLiBUaGV5IHdlcmUgbm90IG9taXR0aW5nIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkgYXMKICAgICAgICAgICAgdGhleSBzaG91bGQgYmUuCgoyMDEwLTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE4MDczMjkgLSBXaGVuIE1ha2VmaWxlIGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZ2VuZXJhdGVkIHVzaW5nIHRoZSAtTSBmYW1pbHkgb2Ygb3B0aW9ucwogICAgICAgICAgICBvbiBXaW5kb3dzLCB0aGUgZmlsZSBwYXRocyBoYXZlIGJlZW4gY29ycmVjdGVkIHRvIHVzZSBzaW5nbGUgYmFja3NsYXNoZXMgcmF0aGVyIHRoYW4gZG91YmxlCiAgICAgICAgICAgIGJhY2tzbGFzaGVzIGFzIHBhdGggc2VwYXJhdG9ycy4KCjIwMTAtMDItMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjkxODkwMiAtIGxhbmd1YWdlIHNwZWNpZmljIGZpbGVzIG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gY29ycmVjdCBkaXJlY3Rvcnkgb24KICAgICAgICAgICAgV2luZG93cyB3aGVuIHVzaW5nIGZvcndhcmQgc2xhc2hlcyBmb3IgLW8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtYysrIC1vIHN1YmRpcmVjdG9yeS90aGVpbnRlcmZhY2Vfd3JhcC5jcHAgc3ViZGlyZWN0b3J5L3RoZWludGVyZmFjZS5pCgoyMDEwLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI4OTQ0MDUgLSBhc3NlcnRpb24gd2hlbiB1c2luZyAteG1sb3V0LgoKMjAxMC0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVtYXAgbWF0Y2hpbmcgYnVnIHdoZW4gYSB0ZW1wbGF0ZWQgdHlwZSBoYXMgYSB0eXBlbWFwIGJvdGggc3BlY2lhbGl6ZWQgYW5kIG5vdAogICAgICAgICAgICBzcGVjaWFsaXplZC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYWCB7IC4uLiB9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYWCAmICIuLi4iCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFhYPCBpbnQgPiAmICIuLi4iCgogICAgICAgICAgICByZXN1bHRlZCBpbiB0aGUgMm5kIHR5cGVtYXAgYmVpbmcgYXBwbGllZCBmb3IgYWxsIFQgaW4gWFg8IFQgPi4KCjIwMTAtMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjkzMzEyOSAtIHR5cGVtYXBzIG5vdCBiZWluZyBmb3VuZCB3aGVuIHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGlzIHVzZWQgdG8gZGVub3RlCiAgICAgICAgICAgIGdsb2JhbCBzY29wZSwgdGhlIHR5cGVtYXAgaXMgbm93IHVzZWQgaW4gc2l0dWF0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYICYgIi4uLiIKICAgICAgICAgICAgICB2b2lkIG0oY29uc3QgOjpYICYpOwoKICAgICAgICAgICAgYW5kIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCA6OlggJiAiLi4uIgogICAgICAgICAgICAgIHZvaWQgbShjb25zdCBYICYpOwoKMjAxMC0wMS0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBkZW5vdGluZyBnbG9iYWwgc2NvcGUgcHJvYmxlbXMgaW4gdGhlIHR5cGVzIGdlbmVyYXRlZAogICAgICAgICAgICBpbnRvIHRoZSBDKysgbGF5ZXIuIFByZXZpb3VzbHkgdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yIHdhcyBkcm9wcGVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICBpZiB0aGUgdHlwZSBoYWQgYW55IHNvcnQgb2YgcXVhbGlmaWVyLCBmb3IgZXhhbXBsZSB3aGVuIHVzaW5nIHBvaW50ZXJzLCByZWZlcmVuY2VzLCBsaWtlCiAgICAgICAgICAgIDo6Zm9vKiwgOjpmb28mLCBiYXI8IDo6Zm9vKiA+LgoKMjAxMC0wMS0xMzogb2xseQoJICAgIFtQSFBdIEFkZCBkYXRldGltZSB0byB0aGUgbGlzdCBvZiBQSFAgcHJlZGVmaW5lZCBjbGFzc2VzIChwYXRjaAoJICAgIGZyb20gRGF2aWQgRmxldGNoZXIgaW4gU0YjMjkzMTA0MikuCgoyMDEwLTAxLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHdhcm5pbmcsIGVycm9yIGFuZCBkaWFnbm9zdGljIHJlcG9ydGluZy4gVGhlIHdhcm5pbmcgbnVtYmVyIGlzIG5vIAogICAgICAgICAgICBsb25nZXIgc2hvd24gd2l0aGluIGJyYWNrZXRzLiBUaGlzIGlzIHRvIGhlbHAgZGVmYXVsdCBwYXJzaW5nIG9mIHdhcm5pbmcgbWVzc2FnZXMgYnkKICAgICAgICAgICAgb3RoZXIgdG9vbHMsIHZpbSBvbiBVbml4IGluIHBhcnRpY3VsYXIuCgogICAgICAgICAgICBFeGFtcGxlIG9yaWdpbmFsIGRpc3BsYXkgdXNpbmcgLUZzdGFuZGFyZDoKICAgICAgICAgICAgICBleGFtcGxlLmk6MjA6IFdhcm5pbmcoNDAxKTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCJy4gSWdub3JlZC4KICAgICAgICAgICAgTmV3IGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pOjIwOiBXYXJuaW5nIDQwMTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCJy4gSWdub3JlZC4KCiAgICAgICAgICAgIEFsc28gc3VidGxlIGZpeCB0byAtRm1pY3Jvc29mdCBmb3JtYXQgYWRkaW5nIGluIG1pc3Npbmcgc3BhY2UuIEV4YW1wbGUgb3JpZ2luYWwgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmkoMjApOiBXYXJuaW5nKDQwMSk6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQmFzZScuIElnbm9yZWQuCiAgICAgICAgICAgIE5ldyBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaSgyMCkgOiBXYXJuaW5nIDQwMTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCYXNlJy4gSWdub3JlZC4KCjIwMTAtMDEtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBhIGZldyBpbmNvbnNpc3RlbmNpZXMgaW4gcmVwb3J0aW5nIG9mIGZpbGUvbGluZSBudW1iZXJpbmdzIGluY2x1ZGluZyBtb2RpZnlpbmcKICAgICAgICAgICAgdGhlIG92ZXJsb2FkIHdhcm5pbmdzIDUwOSwgNTEyLCA1MTYsIDQ3NCwgNDc1IHRvIG5vdyBiZSB0d28gbGluZSB3YXJuaW5ncy4KCjIwMTAtMDEtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSAtZGVidWctdGFncyBvdXRwdXQgdG8gdXNlIHN0YW5kYXJkIGZpbGUgbmFtZS9saW5lIHJlcG9ydGluZyBzbyB0aGF0IGVkaXRvcnMKICAgICAgICAgICAgY2FuIGVhc2lseSBuYXZpZ2F0ZSB0byB0aGUgYXBwcm9wcmlhdGUgbGluZXMuCiAgICAgICAgICAgIFdhcyB0eXBpY2FsbHk6CiAgICAgICAgICAgICAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAoL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWcuc3dnOjMxMikKICAgICAgICAgICAgICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlIC4gaW5jbHVkZSAoL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWd3YXJuaW5ncy5zd2c6MzkpCiAgICAgICAgICAgIG5vdzoKICAgICAgICAgICAgICAvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZy5zd2c6MzEyOiAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZQogICAgICAgICAgICAgIC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnd2FybmluZ3Muc3dnOjM5OiAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAuIGluY2x1ZGUKCjIwMTAtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBtaXNzaW5nIGZpbGUvbGluZSBudW1iZXJzIGZvciB0eXBlbWFwIHdhcm5pbmdzIGFuZCBpbiBvdXRwdXQgZnJvbSB0aGUKICAgICAgICAgICAtZGVidWctdG1zZWFyY2gvLWRlYnVnLXRtdXNlZCBvcHRpb25zLgoKMjAxMC0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHR5cGVtYXBzIHVzZWQgZGVidWdnaW5nIG9wdGlvbiAoLWRlYnVnLXRtdXNlZCkuIFdoZW4gdXNlZCBlYWNoIGxpbmUgZGlzcGxheXMKICAgICAgICAgICAgdGhlIHR5cGVtYXAgdXNlZCBmb3IgZWFjaCB0eXBlIGZvciB3aGljaCBjb2RlIGlzIGJlaW5nIGdlbmVyYXRlZCBpbmNsdWRpbmcgdGhlIGZpbGUKICAgICAgICAgICAgYW5kIGxpbmUgbnVtYmVyIHJlbGF0ZWQgdG8gdGhlIHR5cGUuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBjb25kZW5zZWQgZm9ybSBvZiB0aGUKICAgICAgICAgICAgLWRlYnVnLXRtc2VhcmNoIG9wdGlvbi4gRG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlamF2YWV4Y2VwdGlvbiBhbmQgZGlyZWN0b3JzIHNvIHRoYXQgYWxsIHRoZSBhcHByb3ByaWF0ZSB0aHJvd3MgY2xhdXNlcyAKICAgICAgICAgICAgYXJlIGdlbmVyYXRlZC4gUHJvYmxlbSByZXBvcnRlZCBieSBQZXRlciBHcmVlbndvb2QuCgoyMDA5LTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgLWRlYnVnLXRtc2VhcmNoIG9wdGlvbiBmb3IgZGVidWdnaW5nIHRoZSB0eXBlbWFwIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZXMuCiAgICAgICAgICAgIERvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMTItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIFJlbW92ZSB0aGUgLWFwaSBvcHRpb24gYW5kIHVzZSB0aGUgbmV3IE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIKICAgICAgICAgICAgbWFjcm8gcHJvdmlkZWQgaW4gdGhlIG9jdGF2ZSBoZWFkZXJzIGZvciBkZXRlcm1pbmluZyB0aGUgYXBpIHZlcnNpb24gaW5zdGVhZC4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBbUnVieV0gSW1wcm92ZSBzdXBwb3J0IGZvciBSdWJ5IDEuOSB1bmRlciBHQ0MuICBBZGRyZXNzZXMgcGFydCBvZgoJICAgIFNGIzI4NTk2MTQuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIG1vZHVsbyBvcGVyYXRvciAoJSkgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMKCSAgICAoU0YjMjgxODU2MikuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgW1BIUF0gImVtcHR5IiBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUEhQLCBzbyByZW5hbWUgZW1wdHkoKSBtZXRob2QKCSAgICBvbiBTVEwgY2xhc3NlcyB0byAiaXNfZW1wdHkoKSIgKHByZXZpb3VzbHkgdGhpcyB3YXMgYXV0b21hdGljYWxseQoJICAgIHJlbmFtZWQgdG8gImNfZW1wdHkoKSIpLgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0xMi0wMzogb2xseQoJICAgIFtQSFBdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcsIGFuZCBmb3IKCSAgICBwb2ludGVyIHRvIG1ldGhvZC4KCjIwMDktMTItMDI6IG9sbHkKCSAgICBbUEhQXSBGaXggd2FybmluZyBhbmQgcmVuYW1lIG9mIHJlc2VydmVkIGNsYXNzIG5hbWUgdG8gYmUgY2FzZQoJICAgIGluc2Vuc2l0aXZlLgoKMjAwOS0xMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgUmV2ZXJ0IHN1cHBvcnQgZm9yICVleHRlbmQgYW5kIG1lbWJlcmluIHR5cGVtYXBzIGFkZGVkIGluIHN3aWctMS4zLjM5LiBUaGUKCSAgICBtZW1iZXJpbiB0eXBlbWFwcyBhcmUgaWdub3JlZCBhZ2FpbiBmb3IgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gYSAlZXh0ZW5kIGJsb2NrLgogICAgICAgICAgICBEb2N1bWVudGF0aW9uIGluY29uc2lzdGVuY3kgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAwOS0xMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZ2VuZXJhdGVkIHF1b3Rpbmcgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpIGZvciAKICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBBOwogICAgICAgICAgICAgICVjc2NvbnN0KDEpIEE7CiAgICAgICAgICAgICAgc3RydWN0IFggewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgQSA9ICdBJzsgCiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4ICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkgZm9yIHN0YXRpYyBjb25zdCBtZW1iZXIgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIHVzZSB0aGUgYWN0dWFsIGNvbnN0YW50IHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCwgcmF0aGVyIHRoYW4gdGhlIEMrKyBjb2RlIHRvCiAgICAgICAgICAgIGFjY2VzcyB0aGUgbWVtYmVyLgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIEVOOwogICAgICAgICAgICAgICVjc2NvbnN0KDEpIEVOOwogICAgICAgICAgICAgIHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgRU4gPSAyOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBDKysgbmVzdGVkIHR5cGVkZWYgY2xhc3NlcyBjYW4gbm93IGJlIGhhbmRsZWQgdG9vLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgdHlwZWRlZiBGb28geyB9IEZvb1R5cGVkZWYxLCBGb29UeXBlZGVmMjsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0xODogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHdyYXBwZXJzIGZvciBDIG5lc3RlZCBzdHJ1Y3RzIGFyZSBub3cgZ2VuZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIGRlY2xhcmVkIAogICAgICAgICAgICBpbiB0aGUgcGFyc2VkIGNvZGUuCgoyMDA5LTExLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQ5MTQ3NiAtIG11bHRpcGxlIGRlY2xhcmF0aW9ucyBvZiBuZXN0ZWQgc3RydWN0cywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICB9IGlubmVyMSwgaW5uZXIyLCAqaW5uZXIzLCBpbm5lcjRbMV07CiAgICAgICAgICAgICAgfSBvdXRlcjsKCjIwMDktMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzaW5nIG9mIGVudW0gZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBBQkMgewogICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgIGIsCiAgICAgICAgICAgICAgICBjCiAgICAgICAgICAgICAgfSBBID0gYSwgKnBDID0gJkMsIGFycmF5WzNdID0ge2EsIGIsIGN9OwoKMjAwOS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNpbmcgb2Ygc3RydWN0IGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHsKICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICB9IGluc3RhbmNlID0geyAxMCB9OwoKMjAwOS0xMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTYwOTc3IC0gU3ludGF4IGVycm9yIHBhcnNpbmcgZGVyaXZlZCBuZXN0ZWQgY2xhc3MgZGVjbGFyYXRpb24gYW5kIG1lbWJlcgogICAgICAgICAgICB2YXJpYWJsZSBpbnN0YW5jZS4KCjIwMDktMTEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjMxMDQ4MyAtIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZiB3aXRoaW4gZXh0ZXJuICJDIiBibG9jay4KCjIwMDktMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2FnZSBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gdGVtcGxhdGVkIGNsYXNzZXMgc28gdGhhdCBjb21waWxhYmxlIGNvZGUgCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZC4KCjIwMDktMTEtMTM6IG9sbHkKCSAgICBbcGhwXSBGaXggcGxhY2Ugd2hlcmUgY2xhc3MgcHJlZml4IChhcyBzcGVjaWZpZWQgd2l0aCAtcHJlZml4KQoJICAgIHdhc24ndCBiZWluZyB1c2VkLiAgUGF0Y2ggZnJvbSBndmVyYnJ1Z2dlbiBpbiBTRiMyODkyNjQ3LgoKMjAwOS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHNvIHRoYXQgY29tcGlsYWJsZSBjb2RlIGlzIGdlbmVyYXRlZCAtIHRoZSBuZXN0ZWQKICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgaXMgbm93IHRyZWF0ZWQgbGlrZSBhIG5vcm1hbCBuZXN0ZWQgY2xhc3NlcywgdGhhdCBpcywgYXMgYW4gb3BhcXVlIHR5cGUKICAgICAgICAgICAgdW5sZXNzIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgaXMgdXNlZC4KCjIwMDktMTEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlcGxhY2UgU1dJR1dBUk5fUEFSU0VfTkVTVEVEX0NMQVNTIHdpdGggU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTIGFuZAogICAgICAgICAgICBTV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUyBmb3IgbmFtZWQgYW5kIHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgcmVzcGVjdGl2ZWx5LgoKICAgICAgICAgICAgTmFtZWQgbmVzdGVkIGNsYXNzIGlnbm9yZWQgd2FybmluZ3MgY2FuIG5vdyBiZSBzdXBwcmVzc2VkIGJ5IG5hbWUgdXNpbmcgJXdhcm5maWx0ZXIsIGVnOgoKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9QQVJTRV9OQU1FRF9ORVNURURfQ0xBU1MpIE91dGVyOjpJbm5lcjsKCiAgICAgICAgICAgIGJ1dCBjbGVhcmx5IHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgY2Fubm90IGFuZCB0aGUgZ2xvYmFsIHN1cHByZXNzaW9uIGlzIHN0aWxsIHJlcXVpcmVkLCBlZzoKCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj1TV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUwoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5lc3RlZHdvcmthcm91bmQgZmVhdHVyZSBhcyBhIHdheSB0byB1c2UgdGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiBhIG5lc3RlZCBjbGFzcyAKICAgICAgICAgICAgKEMrKyBtb2RlIG9ubHkpLiBJdCByZW1vdmVzIHRoZSBuZXN0ZWQgY2xhc3MgZnJvbSBTV0lHJ3MgdHlwZSBpbmZvcm1hdGlvbiBzbyBpdCBpcyBhcyBpZiBTV0lHCiAgICAgICAgICAgIGhhZCBuZXZlciBwYXJzZWQgdGhlIG5lc3RlZCBjbGFzcy4gVGhlIGRvY3VtZW50ZWQgbmVzdGVkIGNsYXNzIHdvcmthcm91bmRzIHVzaW5nIGEgZ2xvYmFsCiAgICAgICAgICAgIGZha2UgY2xhc3Mgc3RvcHBlZCB3b3JraW5nIHdoZW4gU1dJRyB0cmVhdGVkIHRoZSBuZXN0ZWQgY2xhc3MgYXMgYW4gb3BhcXVlIHBvaW50ZXIsIGFuZAogICAgICAgICAgICB0aGlzIGZlYXR1cmUgcmV2ZXJ0cyB0aGlzIGJlaGF2aW91ci4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB3aXRoIGRldGFpbHMgb2YgaG93CiAgICAgICAgICAgIHRvIHVzZSBhbmQgaW1wbGVtZW50IGl0LCBzZWUgdGhlICJOZXN0ZWQgY2xhc3NlcyIgc2VjdGlvbiBpbiBTV0lHUGx1cy5odG1sLgoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgVGhlcmUgd2VyZSBhIG51bWJlciBvZiBDKysgY2FzZXMgd2hlcmUgbmVzdGVkIGNsYXNzZXMvc3RydWN0cy91bmlvbnMgd2VyZSBiZWluZyBoYW5kbGVkCiAgICAgICAgICAgIGFzIGlmIEMgY29kZSB3YXMgYmVpbmcgcGFyc2VkIHdoaWNoIHdvdWxkIG9mdGVudGltZXMgbGVhZCB0byB1bmNvbXBpbGFibGUgY29kZSBhcyBhbgogICAgICAgICAgICBhdHRlbXB0IHdhcyBtYWRlIHRvIHdyYXAgdGhlIG5lc3RlZCBzdHJ1Y3RzIGxpa2UgaXQgaXMgZG9jdW1lbnRlZCBmb3IgQyBjb2RlLiBOb3cgYWxsCiAgICAgICAgICAgIG5lc3RlZCBzdHJ1Y3RzL2NsYXNzZXMvdW5pb25zIGFyZSBpZ25vcmVkIGluIEMrKyBtb2RlLCBhcyB3YXMgYWx3YXlzIGRvY3VtZW50ZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZXJlIGlzIGFuIGltcHJvdmVtZW50IGFzIHVzYWdlIG9mIG5lc3RlZCBzdHJ1Y3RzL2NsYXNzZXMvdW5pb25zIGlzIG5vdyBhbHdheXMgdHJlYXRlZAogICAgICAgICAgICBhcyBhbiBvcGFxdWUgdHlwZSBieSBkZWZhdWx0LCByZXN1bHRpbmcgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCBzaG91bGQgYWx3YXlzIGNvbXBpbGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMTEtMDk6IGRyam9lCgkgICAgRml4IFIgZm9yIC1mY29tcGFjdCBhbmQgYWRkIHN0ZF9tYXAuaQoKMjAwOS0xMS0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29uc2lzdGVuY3kgZm9yIG5lc3RlZCBzdHJ1Y3RzL3VuaW9ucy9jbGFzc2VzLiBVbmNvbXBpbGFibGUgY29kZSB3YXMgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5uZXIgc3RydWN0IGFuZCB1bmlvbiBkZWNsYXJhdGlvbnMgd2VyZSB1c2VkIGFzIHR5cGVzIHdpdGhpbiB0aGUKICAgICAgICAgICAgaW5uZXIgc3RydWN0LiBUaGUgaW5uZXIgc3RydWN0L3VuaW9uIGlzIG5vdyB0cmVhdGVkIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBtYWtpbmcgdGhlCiAgICAgICAgICAgIGJlaGF2aW91ciB0aGUgc2FtZSBhcyBhbiBpbm5lciBjbGFzcy4gKEMrKyBjb2RlKSwgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgSW5uZXJTdHJ1Y3QgeyBpbnQgeDsgfTsKICAgICAgICAgICAgICAgIElubmVyU3RydWN0KiBnZXRJbm5lclN0cnVjdCgpOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTA4OiB3c2Z1bHRvbgoJICAgIElnbm9yZWQgbmVzdGVkIGNsYXNzL3N0cnVjdCB3YXJuaW5ncyBub3cgZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgaWdub3JlZCBjbGFzcy9zdHJ1Y3QuCgoyMDA5LTExLTA3OiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMTUxNDY4MSAtIEZpeCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gYSBuYW1lc3BhY2UgZ2VuZXJhdGVkIHVuY29tcGlsYWJsZQogICAgICAgICAgICBjb2RlIGFuZCBpbnRyb2R1Y2VkIHN0cmFuZ2Ugc2lkZSBlZmZlY3RzIHRvIG90aGVyIHdyYXBwZXIgY29kZSBlc3BlY2lhbGx5IGNvZGUKICAgICAgICAgICAgYWZ0ZXIgdGhlIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzcy4gTm90ZSB0aGF0IG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIGFyZSBzdGlsbCBpZ25vcmVkLgoKMjAwOS0xMS0wNzogd3NmdWx0b24KCSAgICBBZGQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgLWRlYnVnLXN5bXRhYnMgICAgLSBEaXNwbGF5IHN5bWJvbCB0YWJsZXMgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAtZGVidWctc3ltYm9scyAgICAtIERpc3BsYXkgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZXMKICAgICAgICAgICAgICAtZGVidWctY3N5bWJvbHMgICAtIERpc3BsYXkgQyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCgoyMDA5LTExLTAzOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHVzYWdlIG9mIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIEFBIHsgLyogLi4uICovIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjpBQTsKCiAgICAgICAgICAgIGFuZCBidWcgIzE4MTY4MDIgLSBTd2lnVmFsdWVXcmFwcGVyIHNob3VsZCBiZSB1c2VkOgoKICAgICAgICAgICAgICBzdHJ1Y3QgQ0MgewogICAgICAgICAgICAgICAgQ0MoaW50KTsgLy8gbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgOjpDQyB4KCk7CgogICAgICAgICAgICBhbmQgaW4gdGVtcGxhdGUgcGFyYW1ldGVyIHNwZWNpYWxpemF0aW9uczoKCiAgICAgICAgICAgICAgc3RydWN0IFMge307CiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgWDxTPiB7IHZvaWQgYigpIHt9IH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKE15VENvbmNyZXRlKSBYPCA6OlMgPjsKCiAgICAgICAgICAgIHBsdXMgcHJvYmFibHkgc29tZSBvdGhlciBjb3JuZXIgY2FzZSB1c2FnZSBvZiA6Oi4KCjIwMDktMTEtMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrIGluIGluaXRpYWxpc2F0aW9uIGNvZGUgZm9yIHRoZQoJICAgIGdlbmVyYXRlZCBtb2R1bGUuCgoyMDA5LTEwLTIzOiB3c2Z1bHRvbgoJICAgIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBhIG5hbWVkIG5lc3RlZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHVzaW5nICV0ZW1wbGF0ZShuYW1lKSAKICAgICAgICAgICAgd2l0aGluIGEgY2xhc3MuIEEgd2FybmluZyB0aGF0IHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGlzIG5vdyBpc3N1ZWQgcGx1cyBwcm9jZXNzaW5nIAogICAgICAgICAgICBjb250aW51ZXMgYXMgaWYgbm8gbmFtZSB3YXMgZ2l2ZW4uCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZpeCBzdGQ6OnZlY3Rvcjxjb25zdCBUKj4uIFRoaXMgd291bGQgcHJldmlvdXNseSBjb21waWxlLCBidXQgbm90IHJ1biBjb3JyZWN0bHkuCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIEZpeGVkIHByZXZpb3VzbHkgZmFpcmx5IHBvb3IgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhbmQgZXhwbGljaXQgCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIHN1cHBvcnQuIE51bWVyb3VzIGJ1Z3MgaW4gdGhpcyBhcmVhIGhhdmUgYmVlbiBmaXhlZCBpbmNsdWRpbmc6CgogICAgICAgICAgICAtIFRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBpbXBsZW1lbnRlZCBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMsIGVnIHRoaXMgbm93CiAgICAgICAgICAgICAgd29ya3M6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYICAgICAge307CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYPFQgKj4ge307CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoWDEpIFg8Y29uc3QgaW50ICo+OyAvLyBDaG9vc2VzIFQgKiBzcGVjaWFsaXphdGlvbgoKICAgICAgICAgICAgICBhbmQgbW9yZSBjb21wbGV4IGNhc2VzIHdpdGggbXVsdGlwbGUgcGFyYW1ldGVycyBhbmQgYSBtaXggb2YgdGVtcGxhdGUgYXJndW1lbnQKICAgICAgICAgICAgICBkZWR1Y3Rpb24gYW5kIGV4cGxpY2l0bHkgc3BlY2lhbGlzZWQgcGFyYW1ldGVycywgZWc6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgVHdvUGFybSAgICAgICAgICAgICAgIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4gICAgICAgICAgICAgIHN0cnVjdCBUd29QYXJtPFQxICosIGludCAqPiAgeyB2b2lkIGUoKSB7fSB9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEUpIFR3b1Bhcm08aW50ICoqLCBpbnQgKj47CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHByaW1hcnkgdGVtcGxhdGUgbXVzdCBub3cgYmUgaW4gc2NvcGUsIGxpa2UgaW4gQysrLCB3aGVuCiAgICAgICAgICAgIGFuIGV4cGxpY2l0IG9yIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgaW5zdGFudGlhdGVkIHdpdGggJXRlbXBsYXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA5LTE0OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICVjc2F0dHJpYnV0ZXMgZm9yIGFkZGluZyBDIyBhdHRyaWJ1dGVzIHRvIGVudW0gdmFsdWVzLCBzZWUgZG9jcyBmb3IgZXhhbXBsZS4KCjIwMDktMDktMTE6IHdzZnVsdG9uCgkgICAgRml4IG1lbW1vdmUgcmVncmVzc2lvbiBpbiBjZGF0YS5pIGFzIHJlcG9ydGVkIGJ5IEFkcmlhYW4gUmVudGluZy4KCjIwMDktMDktMDc6IHdzZnVsdG9uCgkgICAgRml4IGNvbnN0YW50IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgPD0gb3IgPj0uCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIFRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gdHlwZSBib29sIGZvciBDKysgCiAgICAgICAgICAgIHdyYXBwZXJzIGFuZCByZW1haW4gYXMgdHlwZSBpbnQgZm9yIEMgd3JhcHBlcnMsIGFzIHBlciBlYWNoIHN0YW5kYXJkOiAKCiAgICAgICAgICAgICAgJiYgfHwgPT0gIT0gPCA+IDw9ID49IChBY3R1YWxseSB0aGUgbGFzdCA0IGFyZSBzdGlsbCBicm9rZW4pLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBBIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBCIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBBX0VRX0IgIEEgPT0gQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwogICAgICAgICAgICAgICNkZWZpbmUgQV9BTkRfQiBBICYmIEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgRml4ICMyODQ1NzQ2LiB0cnVlIGFuZCBmYWxzZSBhcmUgbm93IHJlY29nbmlzZWQga2V5d29yZHMgKG9ubHkgd2hlbiB3cmFwcGluZyBDKyspLgogICAgICAgICAgICBDb25zdGFudHMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBub3cgd3JhcHBlZCAoYXMgdHlwZSBib29sKToKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyB0cnVlCiAgICAgICAgICAgICAgI2RlZmluZSBCQVIgRk9PICYmIGZhbHNlCgpWZXJzaW9uIDEuMy40MCAoMTggQXVndXN0IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUGVybF0gQWRkICIjdW5kZWYgZG9fZXhlYyIgdG8gb3VyIGNsZWFuIHVwIG9mIFBlcmwgZ2xvYmFsCgkgICAgbmFtZXNwYWNlIHBvbGx1dGlvbi4KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd3JhcCBhIHJlc291cmNlIHJldHVybmVkIGJ5IF9fZ2V0KCkgaW4gYSBQSFAgb2JqZWN0IChTRiMyNTQ5MjE3KS4KCjIwMDktMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjc5NzQ4NSBBZnRlciBkb2luZyBhICdtYWtlIGNsZWFuJywgaW5zdGFsbCBmYWlscyBpZiB5b2RsMm1hbiBvciB5b2RsMmh0bWwgCiAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBDYXVnaHQgZXhjZXB0aW9ucyBkaXNwbGF5IHRoZSB0eXBlIG9mIHRoZSBDKysgZXhjZXB0aW9uIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgIGdlbmVyaWMgImMrKy1zaWRlIHRocmV3IGFuIGV4Y2VwdGlvbiIgbWVzc2FnZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBXaGVuICVjYXRjaGVzIGlzIHVzZWQsIGZpeCBzbyB0aGF0IGFueSBjbGFzc2VzIHNwZWNpZmllZCBpbiB0aGUgInRocm93cyIKICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoZSAidGhyb3dzIiB0eXBlbWFwIGFyZSBnZW5lcmF0ZWQgaW50byB0aGUgSmF2YSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZXhjZXB0aW9uIGhhbmRsaW5nIHdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgcmVwb3J0ZWQgYnkgSnVhbiBNYW51ZWwgQWx2YXJlei4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAldGVtcGxhdGUgc2VnIGZhdWx0IG9uIHNvbWUgY2FzZXMgb2Ygb3ZlcmxvYWRpbmcgdGhlIHRlbXBsYXRlZCBtZXRob2QuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBKYW4gS3VwZWMuCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBBZGQgbnVtZXJvdXMgbWlzc2luZyB3cmFwcGVkIG1ldGhvZHMgZm9yIHN0ZDo6dmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIGJ5IFlvdXNzZWYgSm9uZXMuCgoyMDA5LTA4LTE0OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBBZGQgU1dJR19Db252ZXJ0UHRyQW5kT3duKCkgbWV0aG9kIGludG8gdGhlIHJ1bnRpbWUgZm9yIHNtYXJ0IHBvaW50ZXIgCiAgICAgICAgICAgIG1lbW9yeSBvd25lcnNoaXAgY29udHJvbC4gc2hhcmVkX3B0ciBzdXBwb3J0IHN0aWxsIHRvIGJlIGFkZGVkLiBQYXRjaCBmcm9tIAogICAgICAgICAgICBEYXZpZCBGbGV0Y2hlci4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBQSFA1IG5vdyB3cmFwcyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcyBkb2N1bWVudGVkLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgUEhQICJjbGFzcyIgZXhhbXBsZSB0byB3b3JrIHdpdGggUEhQNSBhbmQgdXNlCgkgICAgbW9kZXJuIHdyYXBwaW5nIGZlYXR1cmVzLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBzdGQ6OnZlY3RvciB3cmFwcGVycyBvdmVyaGF1bC4gVGhleSBubyBsb25nZXIgcmVxdWlyZSB0aGUgCiAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX3ZlY3RvcigpIG1hY3JvLiBBZGRlZCB3cmFwcGVycyBmb3IgY2FwYWNpdHkoKSBhbmQgcmVzZXJ2ZSgpLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgY29uc3QgcmVmZXJlbmNlIHR5cGVtYXBzLiBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIGFyZQogICAgICAgICAgICBub3cgcGFzc2VkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIHBvaW50ZXIgbGlrZSB0aGUgb3RoZXIgdGFyZ2V0IGxhbmd1YWdlcy4KCSAgICBGaXhlcyBTRiMyNTI0MDI5LgoKMjAwOS0wOC0wODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBNb3JlIHVzZXIgZnJpZW5kbHkgQXR0cmlidXRlRXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlcmUgYXJlCiAgICAgICAgICAgIG5vIGNvbnN0cnVjdG9ycyBnZW5lcmF0ZWQgZm9yIHRoZSBwcm94eSBjbGFzcyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUKICAgICAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3QgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIC0gY2xhc3MgaXMgYWJzdHJhY3QiIHdoZXJlYXMgaWYgdGhlcmUgYXJlIG5vCiAgICAgICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcnMgZm9yIGFueSBvdGhlciByZWFzb24gYW5kIHRoZSBjbGFzcyBpcyBub3QgYWJzdHJhY3QsCiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlbWFpbnMKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiLgogICAgICAgICAgICBbdGNsXSBTaW1pbGFybHkgZm9yIHRjbCB3aGVuIHVzaW5nIC1pdGNsLgoKMjAwOS0wOC0wNDogb2xseQoJICAgIFtQSFBdIEZpeCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggUEhQIDUuMy4KCjIwMDktMDgtMDQ6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVmFyaW91cyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zICh3aGljaCB3b3VsZCBjb25mbGljdAogICAgICAgICAgICB3aXRoIHRoZSBidWlsdC1pbiBQSFAgb25lcykgYXJlIG5vdyBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgYnkKICAgICAgICAgICAgYWRkaW5nIGEgJ2NfJyBwcmVmaXguCgoyMDA5LTA4LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBzdGQ6OnZlY3RvcjxUPiBpbXBsZW1lbnRhdGlvbiBpcyBpbXByb3ZlZCBhbmQgbm93IHVzZXMgJHR5cGVtYXAgc3VjaAogICAgICAgICAgICB0aGF0IHRoZSBwcm94eSBjbGFzcyBmb3IgVCBubyBsb25nZXIgaGFzIHRvIGJlIHNwZWNpZmllZCBpbiBzb21lIG1hY3JvcwogICAgICAgICAgICBmb3IgY29ycmVjdCBDIyBjb21waWxhdGlvbjsgdGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQsIHdoZXJlCiAgICAgICAgICAgIENTVFlQRSB3YXMgdGhlIEMjIHR5cGUgZm9yIHRoZSBDKysgY2xhc3MgQ1RZUEU6CgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRV9NSU5JTVVNKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgdXNhZ2Ugc2hvdWxkIGJlIHJlbW92ZWQgYWx0b2dldGhlcgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkUoQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aDoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKENUWVBFKQoKICAgICAgICAgICAgU29tZSBtb3JlIGRldGFpbHMgaW4gY3NoYXJwL3N0ZF92ZWN0b3IuaQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA3LTMxOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGluZGVudGF0aW9uIHNvIHRoYXQgd2UgZ2l2ZSBhIHVzZWZ1bCBlcnJvciBpZiB0aGUKCSAgICBtb2R1bGUgY2FuJ3QgYmUgbG9hZGVkLiAgUGF0Y2ggZnJvbSBHYWV0YW4gTGVobWFubiBpbiBTRiMyODI5ODUzLgoKMjAwOS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgQWRkICR0eXBlbWFwKG1ldGhvZCwgdHlwZWxpc3QpIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8uIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiBhIHR5cGVtYXAgdG8gYmUgaW5zZXJ0ZWQgd2l0aGluIGFub3RoZXIgdHlwZW1hcC4KICAgICAgICAgICAgRnVsbHkgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0wNy0yOTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBTdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcmUgbm93IHByZWZpeGVkIHdpdGggdGhlCiAgICAgICAgICAgIGNsYXNzIG5hbWUuIFRoaXMgYWxsb3dzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgY2xhc3Nlcy4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBsb2NrcyB0byBzdGQ6Om1hcCB3cmFwcGVycy4gIFBhdGNoIGZyb20gCgkgICAgUGF1bCBIYW1wc29uIGluIFNGIzI4MTM4MzYuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCBPVVRQVVQgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBIaXRvc2hpCgkgICAgQW1hbm8gaW4gU0YjMjgyNjMyMi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIHJlc291cmNlIGRlc3RydWN0b3IgZm9yIGNsYXNzZXMKCSAgICB3aXRob3V0IGEgZGVzdHJ1Y3RvciBhbmQgbm9uLWNsYXNzIHR5cGVzLiAgUGF0Y2ggZnJvbSBIaXRvc2hpIEFtYW5vCgkgICAgaW4gU0YjMjgyNTMwMy4KCjIwMDktMDctMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgd2FybmluZ3MgYWJvdXQgY2xhc2hlcyBiZXR3ZWVuIGlkZW50aWZpZXJzIGFuZCBQSFAKCSAgICBrZXl3b3JkcyBhbmQgYXV0b21hdGljIHJlbmFtaW5nIHRvIHdvcmsgd2l0aCB0aGUgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXJzLiAgRml4ZXMgU0YjMTYxMzY3OS4KCjIwMDktMDctMjg6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gSWYgYSBtZW1iZXIgZnVuY3Rpb24gaXMgbm90IHB1YmxpYyBidXQgaXQgaGFzIGEgYmFzZQogICAgICAgICAgICB3aGljaCBpcyBwdWJsaWMsIHRoZW4gbm93IGEgd2FybmluZyBpcyBpc3N1ZWQgYW5kIHRoZSBtZW1iZXIKICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBiZSBwdWJsaWMsIGFzIFBIUCByZXF1aXJlcyB0aGlzLgoKMjAwOS0wNy0yMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkLgoKMjAwOS0wNy0xNTogb2xseQoJICAgIFtQZXJsXSBEb24ndCBzcGVjaWZ5IFBlcmwgcHJvdG90eXBlICIoKSIgZm9yIGEgY29uc3RydWN0b3Igd2l0aCBhCgkgICAgZGlmZmVyZW50IG5hbWUgdG8gdGhlIGNsYXNzLCBhcyBzdWNoIGNvbnN0cnVjdG9ycyBjYW4gc3RpbGwgdGFrZQoJICAgIHBhcmFtZXRlcnMuCgoyMDA5LTA3LTEyOiB4YXZpZXI5OAoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgMy4yIEFQSQoKMjAwOS0wNy0wNTogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgbGlzdCBvZiBQSFAga2V5d29yZHMgLSAiY2Z1bmN0aW9uIiBpcyBubyBsb25nZXIgYQoJICAgIGtleXdvcmQgaW4gUEhQNSBhbmQgUEhQIDUuMyBhZGRlZCAiZ290byIsICJuYW1lc3BhY2UiLCAiX19ESVJfXyIsCgkgICAgYW5kICJfX05BTUVTUEFDRV9fIi4KCjIwMDktMDctMDM6IG9sbHkKCSAgICBbVGNsXSBUbyBjb21wbGVtZW50IFVTRV9UQ0xfU1RVQlMsIGFkZCBzdXBwb3J0IGZvciBVU0VfVEtfU1RVQlMKCSAgICBhbmQgU1dJR19UQ0xfU1RVQlNfVkVSU0lPTi4gIERvY3VtZW50IGFsbCB0aHJlZSBpbiB0aGUgVGNsIGNoYXB0ZXIKCSAgICBvZiB0aGUgbWFudWFsLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBTRiMyODEwMzgwIGJ5IENocmlzdGlhbgoJICAgIEdvbGx3aXR6ZXIuCgoyMDA5LTA3LTAyOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZGVkIGZhY3RvcnkuaSBmb3IgUEhQLCBzZWUgdGhlIGxpX2ZhY3RvcnkgdGVzdGNhc2UKICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBvbiBob3cgdG8gdXNlIGl0LgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1XYWxsa3cgb3B0aW9uIGFzIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3ludGF4IGVycm9yIHdoZW4gYSBuZXN0ZWQgc3RydWN0IGNvbnRhaW5zIGEgY29tbWVudCBjb250YWluaW5nIGEgKiBmb2xsb3dlZCAKICAgICAgICAgICAgZXZlbnR1YWxseSBieSBhIC8uIFJlZ3Jlc3Npb24gZnJvbSAxLjMuMzcsIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFVua25vd24gcHJvcGVydGllcyBhcmUgbm8gbG9uZ2VyIGlnbm9yZWQgaW4gcHJveHkKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRml4ZWQgJW5ld29iamVjdCBiZWhhdmlvdXIsIHByZXZpb3VzbHkgYW55IG1ldGhvZAogICAgICAgICAgICBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IHdhcyBoYW5kbGVkIGFzIGEgY29uc3RydWN0b3IuCgoyMDA5LTA2LTMwOiBvbGx5CgkgICAgW1J1YnldIFVuZGVmaW5lIGNsb3NlIGFuZCBjb25uZWN0IG1hY3JvcyBkZWZpbmVkIGJ5IFJ1YnkgQVBJCgkgICAgaGVhZGVycyBhcyB3ZSBkb24ndCBuZWVkIHRoZW0gYW5kIHRoZXkgY2FuIGNsYXNoIHdpdGggQysrIG1ldGhvZHMKCSAgICBiZWluZyB3cmFwcGVkLiAgUGF0Y2ggZnJvbSBWaXQgT25kcnVjaCBpbiBTRiMyODE0NDMwLgoKMjAwOS0wNi0yNjogb2xseQoJICAgIFtSdWJ5XSBGaXggdG8gaGFuZGxlIEZJWE5VTSB2YWx1ZXMgZ3JlYXRlciB0aGFuIE1BWElOVCBwYXNzZWQgZm9yIGEKCSAgICBkb3VibGUgcGFyYW1ldGVyLgoKMjAwOS0wNi0yNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgdGhlIGNvbXBhY3RkZWZhdWx0YXJncyBmZWF0dXJlIAogICAgICAgICAgICB3aGVyZSBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhbmQgaXMgYXNzaWduZWQgYSBkZWZhdWx0IHZhbHVlLiBUaGUgU3dpZ1ZhbHVlV3JhcHBlcgogICAgICAgICAgICB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBhIG1pc3NpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSAKICAgICAgICAgICAgZ2VuZXJhdGVkIGRvZXMgbm90IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCgoyMDA5LTA2LTE2OiB3c2Z1bHRvbgoJICAgIFtKYXZhLEMjXSBGaXggZW51bSBtYXJzaGFsbGluZyB3aGVuICVpZ25vcmUgaXMgdXNlZCBvbiBvbmUgb2YgdGhlIGVudW0gaXRlbXMuCiAgICAgICAgICAgIEluY29ycmVjdCBlbnVtIHZhbHVlcyB3ZXJlIGJlaW5nIHBhc3NlZCB0byB0aGUgQysrIGxheWVyIG9yIGNvbXBpbGF0aW9uIGVycm9ycyByZXN1bHRlZC4KCjIwMDktMDYtMDI6IHRhbGJ5CgkgICAgW1BlcmxdIFJlc29sdmVkIHJlZmVyZW5jZS5pIG92ZXJsb2FkIHN1cHBvcnQgcHJvYmxlbQoJICAgIGlkZW50aWZpZWQgYnkgSm9obiBQb3Rvd3NreS4KCjIwMDktMDUtMjY6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6Om1hcCB3cmFwcGVycyBiYXNlZCBvbiBwYXRjaCBmcm9tIFl1dmFsIEJhcm9yLiBUaGUgQyMgcHJveHkKICAgICAgICAgICAgbm93IGltcGxlbWVudHMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnk8Pi4KCgkgICAgVGhlc2Ugc3RkOm1hcCB3cmFwcGVycyBoYXZlIGEgbm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIG92ZXJoYXVsIHRvIG1ha2UgdGhlbQogICAgICAgICAgICBsaWtlIGEgLk5FVCBJRGljdGlvbmFyeS4gU29tZSBtZXRob2QgbmFtZXMgaGF2ZSBjaGFuZ2VkIGFzIGZvbGxvd2luZzoKICAgICAgICAgICAgICBzZXQgLT4gc2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgZ2V0IC0+IGdldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGhhc19rZXkgLT4gQ29udGFpbnNLZXkKICAgICAgICAgICAgICBkZWwgLT4gUmVtb3ZlCiAgICAgICAgICAgICAgY2xlYXIgLT4gQ2xlYXIKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHVzZWQgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIG5vIGxvbmdlciB3b3JrOgogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9rZXkKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fdmFsdWUKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fYm90aAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA1LTIwOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZCB0aGUgJ3RoaXNvd24nIG1lbWJlciB0byBjbGFzc2VzLiBUaGUgdXNhZ2Ugb2YgaXQKICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIFB5dGhvbiB0aGlzb3duIG9uZTogaXQncyAxIGJ5IGRlZmF1bHQgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gc2V0IGl0IHRvIDAgaWYgeW91IHdhbnQgdG8gcHJldmVudCBmcmVlaW5nIGl0LiAoRm9yCiAgICAgICAgICAgIGV4YW1wbGUgdG8gcHJldmVudCBhIGRvdWJsZSBmcmVlLikKCjIwMDktMDUtMTQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHdyb25nIHBvaW50ZXIgdmFsdWUgcmV0dXJuZWQgYnkgU3dpZ1B5T2JqZWN0X3JlcHIoKS4KCjIwMDktMDUtMTM6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBNaW5vciB0d2VhayB3aGVuIHdyYXBwaW5nIGluIC1ub2N3cmFwIG1vZGUuCgoyMDA5LTA1LTExOiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb24gdGhlIEMjIHByb3h5IHNpZGUgZnJvbSBZdXZhbCBCYXJvci4gVGhlc2UKCSAgICBpbXBsZW1lbnQgSUxpc3Q8PiBpbnN0ZWFkIG9mIElFbnVtZXJhYmxlPD4gd2hlcmUgcG9zc2libGUuCgoyMDA5LTA0LTI5OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gQWRkIHRoZSAnbm90ZGVyaXZlZCcgYXR0cmlidXRlIHRvIHRoZSBqYXZhYmFzZSBhbmQgY3NiYXNlIHR5cGVtYXBzLgoJICAgIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgdHlwZW1hcCB3aWxsIG5vdCBhcHBseSB0byBjbGFzc2VzIHRoYXQgYXJlIGRlcml2ZWQKCSAgICBmcm9tIGEgQysrIGJhc2UgY2xhc3MsIGVnIAoJICAgICAgJXR5cGVtYXAoY3NiYXNlLCBub3RkZXJpdmVkPSIxIikgU1dJR1RZUEUgIkNvbW1vbkJhc2UiCgoyMDA5LTA0LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgYXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBHSUwgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZQoJICAgIGtub3cgdGhhdCBpdCB3aWxsIGFscmVhZHkgYmUgbG9ja2VkLiAgVGhpcyBhdm9pZHMgc29tZSBkZWFkLWxvY2tzCgkgICAgd2l0aCBtb2RfcHl0aG9uIChkdWUgdG8gbW9kX3B5dGhvbiBidWdzIHdoaWNoIGFyZSBhcHBhcmVudGx5CgkgICAgdW5saWtlbHkgdG8gZXZlciBiZSBmaXhlZCksIGFuZCByZXN1bHRzIGluIHNtYWxsZXIgd3JhcHBlcnMgd2hpY2gKCSAgICBydW4gYSBsaXR0bGUgZmFzdGVyIChpbiB0ZXN0cyB3aXRoIFhhcGlhbiBvbiB4ODYtNjQgVWJ1bnR1IDkuMDQsCgkgICAgdGhlIHN0cmlwcGVkIHdyYXBwZXIgbGlicmFyeSB3YXMgMTElIHNtYWxsZXIgYW5kIHJhbiAyLjclIGZhc3RlcikuCgoyMDA5LTA0LTIxOiB3c2Z1bHRvbgoJICAgIFtDI10gRml4ICMyNzUzNDY5IC0gYm9vbCAmT1VUUFVUIGFuZCBib29sICpPVVRQVVQgdHlwZW1hcHMgaW5pdGlhbGlzYXRpb24uCgoyMDA5LTA0LTA5OiB3c2Z1bHRvbgoJICAgIEZpeCAjMjc0Njg1OCAtIEMgbWFjcm8gZXhwcmVzc2lvbiB1c2luZyBmbG9hdGluZyBwb2ludCBudW1iZXJzCgoyMDA5LTAzLTMwOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlZmF1bHQgb3V0IHR5cGVtYXAgZm9yIGNoYXJbQU5ZXSBub3cgcmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGEKCSAgICB6ZXJvIGJ5dGUsIG9yIHRoZSBlbmQgb2YgdGhlIGFycmF5IGlmIHRoZXJlIGlzIG5vIHplcm8gYnl0ZS4gIFRoaXMKCSAgICBpcyB0aGUgc2FtZSBhcyBQeXRob24gZG9lcywgYW5kIHNlZW1zIG1vcmUgZ2VuZXJhbGx5IHVzZWZ1bCB0aGFuCgkgICAgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiByZXR1cm5pbmcgdGhlIHdob2xlIGNvbnRlbnRzIG9mIHRoZSBhcnJheQoJICAgIGluY2x1ZGluZyBhbnkgemVybyBieXRlcy4gIElmIHlvdSB3YW50IHRoZSBvbGQgYmVoYXZpb3VyLCB5b3UgY2FuIHByb3ZpZGUKCSAgICB5b3VyIG93biB0eXBlbWFwIHRvIGRvIHRoaXM6CgoJICAgICV0eXBlbWFwKG91dCkgY2hhciBbQU5ZXQoJICAgICV7CgkJUkVUVkFMX1NUUklOR0woJDEsICQxX2RpbTAsIDEpOwoJICAgICV9CgpWZXJzaW9uIDEuMy4zOSAoMjEgTWFyY2ggMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAzLTE5OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSBtZW1vcnkgbGVhayByZWxhdGVkIHRvIFB5dGhvbiAzIHVuaWNvZGUgYW5kIEMgY2hhciogY29udmVyc2lvbiwKICAgICAgICAgICAgd2hpY2ggY2FuIGJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBiZWZvcmUgdGhpcyBmaXg6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmcm9tIGxpX2NzdHJpbmcgaW1wb3J0ICoKICAgICAgICAgICAgICAgICAgaT0wCiAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdHIoaSkqMTAKICAgICAgICAgICAgICAgICAgICAgIHRlc3QzKG4pCgogICAgICAgICAgICBUaGlzIGZpeCBhZmZlY3RlZCBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBzbyB5b3UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoCiAgICAgICAgICAgIGEgbnVsbCBhbGxvYyBhbmQgbm9uLW51bGwgY3B0ciBhcmd1bWVudCBpbiBQeXRob24gMywgb3RoZXJ3aXNlIGEgcnVudGltZSBlcnJvcgogICAgICAgICAgICB3aWxsIGJlIHJhaXNlZC4KCjIwMDktMDMtMTg6IHdzZnVsdG9uCgkgICAgW0MjXSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVyIGltcHJvdmVtZW50cyBmb3IgLk5FVCAyIGFuZCBhbHNvIHByb3ZpZGluZyB0aGUKCSAgICBuZWNlc3NhcnkgbWFjaGluZXJ5IHRvIHVzZSB0aGUgc3RkOjp2ZWN0b3I8VD4gd3JhcHBlcnMgd2l0aCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2gKCSAgICBhcyBMSU5RIC0gdGhlIEMjIHByb3h5IGNsYXNzIG5vdyBkZXJpdmVzIGZyb20gSUVudW1lcmFibGU8Pi4gVGhlIGRlZmF1bHQgaXMgbm93IHRvIAoJICAgIGdlbmVyYXRlIGNvZGUgcmVxdWlyaW5nIC5ORVQgMiBhcyBhIG1pbmltdW0sIGFsdGhvdWdoIHRoZSBDIyBjb2RlIGNhbiBiZSBjb21waWxlZCAKCSAgICBmb3IgLk5FVCAxIGJ5IGRlZmluaW5nIHRoZSBTV0lHX0RPVE5FVF8xIEMjIHByZXByb2Nlc3NvciBjb25zdGFudC4gU2VlIHRoZSAKCSAgICBzdGRfdmVjdG9yLmkgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTAzLTEyOiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggIzI2NzY3MzggU1dJRyBnZW5lcmF0ZWQgc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBTb21lIGZpeGVzIGZvciBQeXRob24gMy4wLjEgYW5kIGhpZ2hlciBzdXBwb3J0LiBJbiAzLjAuMSwgdGhlIEMgQVBJIGZ1bmN0aW9uCiAgICAgICAgICAgIFB5T2JqZWN0X0NvbXBhcmUgaXMgcmVtb3ZlZCwgc28gUHlPYmplY3RfUmljaENvbXBhcmVCb29sIGlzIHVzZWQgZm9yIHJlcGxhY2VtZW50LgogICAgICAgICAgICBTdHJ1Y3QgaW5pdGlsaXphdGlvbiBvZiBTd2lnUHlPYmplY3QgYW5kIFN3aWdQeU9iamVjdF9hc19udW1iZXIgY2hhbmdlZCB0byByZWZsZWN0CiAgICAgICAgICAgIHRoZSBkcm9wIG9mIHRwX2NvbXBhcmUgYW5kIG5iX2xvbmcuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1ODMxNjAuIE5vdyB0aGUgaW1wb3J0ZXIgaW4gUHl0aG9uIHNoYWRvdyB3cmFwcGVyIHRha2UgY2FyZSBvZiB0aGUKICAgICAgICAgICAgY2FzZSB0aGF0IG1vZHVsZSBhbHJlYWR5IGltcG9ydGVkIGF0IG90aGVyIHBsYWNlLgoKMjAwOS0wMi0yODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNjM3MzUyLiBNb3ZlIHN0cnVjdCBkZWNsYXJhdGlvbiBvZiBTV0lHX21vZHVsZSBpbiBweWluaXQuc3dnIGJlZm9yZQogICAgICAgICAgICB0aGUgbWV0aG9kIGNhbGxzLCBzaW5jZSBzb21lIEMgY29tcGlsZXIgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb24gaW4gbWlkZGxlIG9mIGZ1bmN0aW9uCiAgICAgICAgICAgIGJvZHkuCgoyMDA5LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtBbGxlZ3JvY2xdIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc29tZSBjb25zdGFudCB2YXJpYWJsZSAoJWNvbnN0YW50KSB0eXBlcy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgW0NGRkldIEZpeCBzZWcgZmF1bHRzIHdoZW4gZm9yICVleHRlbmQgYW5kIHVzaW5nIHN0YXRlbWVudHMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIEZpeCBTRiAjMjYwNTk1NTogLWNvIG9wdGlvbiB3aGljaCBicm9rZSBpbiAxLjMuMzcuIAoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBOZXcgJWluc2VydCgiYmVnaW4iKSBzZWN0aW9uIGFkZGVkLiBBbHNvIGNhbiBiZSB1c2VkIGFzICViZWdpbi4gVGhpcyBpcyBhIG5ldwoJICAgIGNvZGUgc2VjdGlvbiByZXNlcnZlZCBlbnRpcmVseSBmb3IgdXNlcnMgYW5kIHRoZSBjb2RlIHdpdGhpbiB0aGUgc2VjdGlvbiBpcyBnZW5lcmF0ZWQKCSAgICBhdCB0aGUgdG9wIG9mIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUgYW5kIHNvIHByb3ZpZGVzIGEgbWVhbnMgdG8gcHV0IGN1c3RvbSBjb2RlCgkgICAgaW50byB0aGUgd3JhcHBlciBmaWxlIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCgoyMDA5LTAyLTE3OiB3c2Z1bHRvbgoJICAgICdtYWtlIGNsZWFuLXRlc3Qtc3VpdGUnIHdpbGwgbm93IHJ1biBjbGVhbiBvbiBBTEwgbGFuZ3VhZ2VzLiBQcmV2aW91c2x5IGl0IG9ubHkKCSAgICByYW4gdGhlIGNvcnJlY3RseSBjb25maWd1cmVkIGxhbmd1YWdlcy4gVGhpcyB3YXkgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGNsZWFuIHVwCgkgICAgcHJvcGVybHkgYWZ0ZXIgcnVubmluZyAnbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZScuCgoyMDA5LTAyLTE0OiB3c2Z1bHRvbgoJICAgIEV4dGVuZCBhdHRyaWJ1dGUgbGlicmFyeSBzdXBwb3J0IGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgdXNlCgkgICAgcGFzcy9yZXR1cm4gYnkgdmFsdWUgc2VtYW50aWNzLiBUd28gbmV3IG1hY3JvcyBhcmUgYXZhaWxhYmxlIGFuZCB1c2FnZSBpcyBpZGVudGljYWwKCSAgICB0byAlYXR0cmlidXRlLiBUaGVzZSBhcmUgJWF0dHJpYnV0ZXZhbCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCAlYXR0cmlidXRlc3RyaW5nIGZvcgoJICAgIHN0cmluZyBjbGFzc2VzLCBsaWtlIHN0ZDo6c3RyaW5nLiBTZWUgYXR0cmlidXRlLnN3ZyBmb3IgbW9yZSBkZXRhaWxzLgoKMjAwOS0wMi0xMzogd3NmdWx0b24KCSAgICBBZGQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMuIFByZXZpb3VzbHkgdGhlIG1lbWJlcmluIHR5cGVtYXBzIHdlcmUKCSAgICBpZ25vcmVkIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCgoyMDA5LTAyLTEyOiB3c2Z1bHRvbgoJICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZW1wb3JhcnkgdmFyaWFibGUgd2hlbiB3cmFwcGluZyByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIHJlZmVyZW5jZXMuIAoJICAgIEV4YW1wbGUgb2YgZ2VuZXJhdGVkIGNvZGUgZm9yIHdyYXBwaW5nOgoKCSAgICAgIHN0cnVjdCBYWVogewoJCXN0ZDo6c3RyaW5nJiByZWZSZXR1cm4oKTsKCSAgICAgIH07CgoJICAgIHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmX3Jlc3VsdF9yZWYgPSAoYXJnMSktPnJlZlJldHVybigpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICZfcmVzdWx0X3JlZjsKICAgICAgICAgICAgICB9CgoJICAgICBOb3cgaXQgaXM6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJihhcmcxKS0+cmVmUmV0dXJuKCk7CgoyMDA5LTAyLTA4OiBiaHkKICAgICAgICAgICAgQ2hhbmdlIHRoZSBTSVpFIG1hcHBlZCBieSAlcHlidWZmZXJfbXV0YWJsZV9iaW5hcnkgYW5kICVweWJ1ZmZlcl9iaW5hcnkgaW4gcHlidWZmZXIuaSBmcm9tCiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBidWZmZXIuCgoyMDA5LTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWZlYXR1cmUgbm90IHdvcmtpbmcgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCByZXBvcnRlZCBieSBNYXR0IFNwcmFndWUsIGZvciBleGFtcGxlOgoJICAgICAgJWZlYXR1cmUoImNzOm1ldGhvZG1vZGlmaWVycyIpIG9wZXJhdG9yIGJvb2wgInByb3RlY3RlZCI7CgoyMDA5LTAyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIEFwcGx5ICMyMDgxOTY3IGNvbmZpZ3VyZSBjaGFuZ2VzIGZvciBleGFtcGxlcyB0byBidWlsZCB3aXRoIHJlY2VudCBQTFQgdmVyc2lvbnMuCgkgICAgQWxzbyBmaXhlcyBNYWtlZmlsZSBlcnJvcnMgYnVpbGRpbmcgU1dJRyBleGVjdXRhYmxlIHdoZW4gbXpzY2hlbWUgcGFja2FnZSBpcyBpbnN0YWxsZWQgCgkgICAgKHZlcnNpb24gMy43MiBhcHByb3ggYW5kIGxhdGVyKS4KCjIwMDktMDItMDQ6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBGaXggU0YjMjU2NDE5MiByZXBvcnRlZCBieSBEYXZpZCBLb2xvdnJhdG5rLgogICAgICAgICAgICBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBub3cgaGFuZGxlcyAiZ2V0IiBtYWdpYy4KClZlcnNpb24gMS4zLjM4ICgzMSBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTI0ODggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIE5vdyAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICBhbmQgJXB5dGhvbmFwcGVuZCBoYXZlIGNvcnJlY3QgaW5kZW50YXRpb24uCgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTIwNDggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIFRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICBvZiBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGluIGdlbmVyYXRlZCBwcm94eSBjb2RlIHNob3VsZCBub3QgaGF2ZSB0aGUKICAgICAgICAgICAgJ3NlbGYnIHBhcmFtZXRlci4KCjIwMDktMDEtMjk6IHdzZnVsdG9uCgkgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAxLjMuMzcgd2hlcmUgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeQoJICAgIGZvciB0YXJnZXQgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgKGluIHRoZSBhYnNlbmNlIG9mIC1vdXRkaXIpIHdhcyBubwoJICAgIGxvbmdlciB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGdlbmVyYXRlZCBjL2MrKyBmaWxlLgoKMjAwOS0wMS0yODogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEZpeCBwcm94eSBjbGFzcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBnbG9iYWwgc2NvcGUgb3BlcmF0b3IKCSAgICB3YXMgdXNlZCBmb3IgcGFyYW1ldGVycyBwYXNzZWQgYnkgdmFsdWUuIFJlcG9ydGVkIGJ5IERhdmlkIFBpZXBncmFzcy4KCjIwMDktMDEtMTU6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBzZWcgZmF1bHQgd2hlbiBydW5uaW5nIHdpdGggLXYgb3B0aW9uLCByZXBvcnRlZCBieSBKb2huIEt5LgoKVmVyc2lvbiAxLjMuMzcgKDEzIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMTM6IG1nb3NzYWdlCgkgICAgW0x1YV0gQWRkZWQgY29udHJhY3Qgc3VwcG9ydCBmb3IgcmVxdWlyaW5nIHRoYXQgdW5zaWduZWQgbnVtYmVycyBhcmUgPj0wCgkgICAgUmV3cm90ZSBtdWNoIG9mIEV4YW1wbGVzL0x1YS9lbWJlZDMuIAoJICAgIEFkZGVkIGEgbG90IHRvIHRoZSBMdWEgZG9jdW1lbnRhdGlvbi4KCjIwMDktMDEtMTM6IHdzZnVsdG9uCgkgICAgRml4IGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gdXNpbmcgZGlyZWN0b3JzIG9uIHByb3RlY3RlZCB2aXJ0dWFsIG92ZXJsb2FkZWQgCgkgICAgbWV0aG9kcyByZXBvcnRlZCBieSBTYW0gSGVuZGxleS4KCjIwMDktMDEtMTI6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBoYW5kbGluZyBvZiBpbnRlZ2VyIGFycmF5cwoKMjAwOS0wMS0xMDogZHJqb2UKCSAgICBbUl0gRml4IGludGVnZXIgaGFuZGxpbmcgaW4gciB0byBkZWFsIGNvcnJlY3RseSB3aXRoIHNpZ25lZAoJICAgIGFuZCB1bnNpZ25lZCBpc3N1ZXMKCjIwMDktMDEtMTA6IHdzZnVsdG9uCgkgICAgUGF0Y2ggICMxOTkyNzU2IGZyb20gQ29saW4gTWNEb25hbGQgLSAlY29udHJhY3Qgbm90IHdvcmtpbmcgZm9yIGNsYXNzZXMgCgkgICAgaW4gbmFtZXNwYWNlCgoyMDA5LTAxLTA1OiBvbGx5CgkgICAgTWFyayBTV0lHUEVSTDUsIFNXSUdQSFA1LCBhbmQgU1dJR1RDTDggYXMgZGVwcmVjYXRlZCBpbiB0aGUgc291cmNlCgkgICAgY29kZSBhbmQgcmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgdGhlbS4KCjIwMDgtMTItMzA6IHdzZnVsdG9uCgkgICAgQnVnICMyNDMwNzU2LiBBbGwgdGhlIGxhbmd1YWdlcyBub3cgZGVmaW5lIGEgbWFjcm8gaW4gdGhlIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgZmlsZSBpbmRpY2F0aW5nIHdoaWNoIGxhbmd1YWdlIGlzIGJlaW5nIHdyYXBwZWQuIFRoZSBtYWNybyBuYW1lIGlzIHRoZQoJICAgIHNhbWUgYXMgdGhvc2UgZGVmaW5lZCB3aGVuIFNXSUcgaXMgcnVuLCBlZyBTV0lHSkFWQSwgU1dJR09DVEFWRSwgU1dJR0NTSEFSUCBldGMKCSAgICBhbmQgYXJlIGxpc3RlZCBpbiB0aGUgIkNvbmRpdGlvbmFsIENvbXBpbGF0aW9uIiBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAwOC0xMi0yMzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMyMTUzNzczIC0gJW5vamF2YWV4Y2VwdGlvbiB3YXMgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgIGluc3RlYWQgb2YgZGlzYWJsaW5nIGl0LiBDbGVhcmluZyBjaGVja2VkIEphdmEgZXhjZXB0aW9ucyBhbHNvIGRpZG4ndCB3b3JrLiAKCSAgICBUaGUgbmV3ICVjbGVhcmphdmFleGNlcHRpb24gY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZS4KCjIwMDgtMTItMjI6IHdzZnVsdG9uCgkgICAgRml4ICMyNDMyODAxIC0gTWFrZSBTd2lnVmFsdWVXcmFwcGVyIGV4Y2VwdGlvbiBzYWZlIGZvciB3aGVuIGNvcHkgY29uc3RydWN0b3JzCgkgICAgdGhyb3cgZXhjZXB0aW9ucy4KCjIwMDgtMTItMjE6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzI0NDAwNDYgd2hpY2ggZml4ZXMgcG9zc2libGUgc2VnIGZhdWx0cyBmb3IgbWVtYmVyIGFuZCBnbG9iYWwKCSAgICB2YXJpYWJsZSBjaGFyIGFycmF5cyB3aGVuIHRoZSBzdHJpbmdzIGFyZSBsYXJnZXIgdGhhbiB0aGUgc3RyaW5nIGFycmF5IHNpemUuCgoyMDA4LTEyLTIwOiB3c2Z1bHRvbgoJICAgIFRoZSBjY2FjaGUgY29tcGlsZXIgY2FjaGUgaGFzIGJlZW4gYWRhcHRlZCB0byB3b3JrIHdpdGggU1dJRyBhbmQKCSAgICBuYW1lZCBjY2FjaGUtc3dpZy4gSXQgbm93IHdvcmtzIHdpdGggQy9DKysgY29tcGlsZXJzIGFzIHdlbGwgYXMgU1dJRwoJICAgIGFuZCBjYW4gcmVzdWx0IGluIGltcHJlc3NpdmUgc3BlZWR1cHMgd2hlbiB1c2VkIHRvIHJlY29tcGlsZSB1bmNoYW5nZWQKCSAgICBjb2RlIHdpdGggZWl0aGVyIGEgQy9DKysgY29tcGlsZXIgb3IgU1dJRy4gRG9jdW1lbnRhdGlvbiBpcyBpbiBDQ2FjaGUuaHRtbAoJICAgIG9yIHRoZSBpbnN0YWxsZWQgY2NhY2hlLXN3aWcgbWFuIHBhZ2UuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoIGZyb20gS2FseWFub3YgRG1pdHJ5IHdoaWNoIGZpeGVzIHBhcnNpbmcgb2YgbmVzdGVkIHN0cnVjdHMKCSAgICBjb250YWluaW5nIGNvbW1lbnRzLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBGaXggZXJyb3IgbWVzc2FnZSBpbiBzb21lIG5lc3RlZCBzdHJ1Y3QgYW5kICVpbmxpbmUgcGFyc2luZyBlcnJvciBzaXR1YXRpb25zCgkgICAgc3VjaCBhcyB1bnRlcm1pbmF0ZWQgc3RyaW5ncyBhbmQgY29tbWVudHMuCgoyMDA4LTEyLTA3OiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVyIHdpdGggR0NDIDQuMy4KCjIwMDgtMTItMDY6IHdzZnVsdG9uCgkgICAgW1BIUF0gRGVwcmVjYXRlICVwcmFnbWEocGhwNCkuIFBsZWFzZSB1c2UgJXByYWdtYShwaHApIGluc3RlYWQuCgkgICAgVGhlIGZvbGxvd2luZyB0d28gd2FybmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQ6CgkgICAgV0FSTl9QSFA0X01VTFRJUExFX0lOSEVSSVRBTkNFIC0+IFdBUk5fUEhQX01VTFRJUExFX0lOSEVSSVRBTkNFCgkgICAgV0FSTl9QSFA0X1VOS05PV05fUFJBR01BICAgICAgIC0+IFdBUk5fUEhQX1VOS05PV05fUFJBR01BCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoIFNGIzIxNTg5Mzg6IGFsbCB0aGUgU1dJRyBzeW1ib2wgbmFtZXMgc3RhcnRlZCB3aXRoIFB5CiAgICAgICAgICAgIGFyZSBjaGFuZ2VkLCBzaW5jZSB0aGV5IGFyZSBpbmFwcHJvcHJpYXRlIGFuZCBkaXNjb3VyYWdlZCBpbiBQeXRob24KICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiAoZnJvbSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuNS4yL2FwaS9pbmNsdWRlcy5odG1sKToKCiAgICAgICAgICAgICJBbGwgdXNlciB2aXNpYmxlIG5hbWVzIGRlZmluZWQgYnkgUHl0aG9uLmggKGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGJ5CiAgICAgICAgICAgIHRoZSBpbmNsdWRlZCBzdGFuZGFyZCBoZWFkZXJzKSBoYXZlIG9uZSBvZiB0aGUgcHJlZml4ZXMgIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgTmFtZXMgYmVnaW5uaW5nIHdpdGggIl9QeSIgYXJlIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGV4dGVuc2lvbiB3cml0ZXJzLiBTdHJ1Y3R1cmUgbWVtYmVyIG5hbWVzIGRvCiAgICAgICAgICAgIG5vdCBoYXZlIGEgcmVzZXJ2ZWQgcHJlZml4LgoKICAgICAgICAgICAgSW1wb3J0YW50OiB1c2VyIGNvZGUgc2hvdWxkIG5ldmVyIGRlZmluZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGggIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgVGhpcyBjb25mdXNlcyB0aGUgcmVhZGVyLCBhbmQgamVvcGFyZGl6ZXMgdGhlIHBvcnRhYmlsaXR5IG9mIHRoZSB1c2VyCiAgICAgICAgICAgIGNvZGUgdG8gZnV0dXJlIFB5dGhvbiB2ZXJzaW9ucywgd2hpY2ggbWF5IGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIGJlZ2lubmluZwogICAgICAgICAgICB3aXRoIG9uZSBvZiB0aGVzZSBwcmVmaXhlcy4iCgogICAgICAgICAgICBIZXJlIGlzIGEgYnJpZWYgbGlzdCBvZiB3aGF0IGNoYW5nZWQ6CgogICAgICAgICAgICAgICAgUHlTd2lnKiAtPiBTd2lnUHkqCiAgICAgICAgICAgICAgICBQeU9iamVjdF9wdHIgLT4gU3dpZ1B0cl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlPYmplY3RfdmFyIC0+IFN3aWdWYXJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfQmFzZSwgUHlTZXF1ZW5jZV9Db250LCBQeVNlcXVlbmNlX1JlZiAtPgogICAgICAgICAgICAgICAgICAgICAgICBTd2lnUHlTZXF1ZW5jZV9CYXNlLCBTd2lnUHlTZXF1ZW5jZV9Db250LCBTd2lnUHlTZXF1ZW5jZV9SZWYKICAgICAgICAgICAgICAgIFB5TWFwKiAtPiBTd2lnUHlNYXAqCgogICAgICAgICAgICBXZSBwcm92aWRlZCBhIHB5bmFtZV9jb21wYXQuaSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVXNlcnMgd2hvc2UgY29kZSBoYXZpbmcKICAgICAgICAgICAgdGhlc2Ugc3ltYm9scyBhbmQgZG8gbm90IHdhbnQgdG8gY2hhbmdlIGl0IGNvdWxkIHNpbXBseSBpbmNsdWRlIHRoaXMgZmlsZQogICAgICAgICAgICBhdCBmcm9udCBvZiB5b3VyIGNvZGUuIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHJ1biB0aGUgY29udmVydGluZyB0b29sIG9uCiAgICAgICAgICAgIHlvdXIgY29kZSwgd2hpY2ggaGFzIGJlZW4gcHV0IGluIFNXSUcncyBTVk4gdHJ1bmsgKFRvb2xzL3B5bmFtZV9wYXRjaC5weSkgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gZG93bmxvYWQgaXQgaGVyZToKICAgICAgICAgICAgaHR0cHM6Ly9zd2lnLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9zd2lnL3RydW5rL1Rvb2xzL3B5bmFtZV9wYXRjaC5weSAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wMjogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjE0MzcyNyBmcm9tIFNlcmdlIE1vbmtld2l0eiB0byBmaXggaW1wb3J0aW5nIGJhc2UgY2xhc3NlcyAKCSAgICB3aGVuIHRoZSBwYWNrYWdlIG9wdGlvbiBpcyBzcGVjaWZpZWQgaW4gJW1vZHVsZSBhbmQgdGhhdCBtb2R1bGUgaXMgJWltcG9ydCdlZC4KCjIwMDgtMTEtMjg6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4ICMyMDgwNDk3LiBTb21lIGluY29ycmVjdCBhY2NlcHRhbmNlIG9mIHR5cGVzIGluIHRoZSBTVEwsIGVnIGEgZG91YmxlICogZWxlbWVudAoJICAgIHBhc3NlZCBpbnRvIGEgdmVjdG9yPGludCAqPiBjb25zdHJ1Y3RvciB3b3VsZCBiZSBhY2NlcHRlZCwgYnV0IHRoZSBlbnN1aW5nIGJlaGF2aW91cgoJICAgIHdhcyB1bmRlZmluZWQuIE5vdyB0aGUgdHlwZSBjb252ZXJzaW9uIGNvcnJlY3RseSByYWlzZXMgYW4gZXhjZXB0aW9uLgoKMjAwOC0xMS0yNDogd3NmdWx0b24KCSAgICBBZGQgLW91dGN1cnJlbnRkaXIgb3B0aW9uLiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB0byB0aGUgY3VycmVudCAKCSAgICBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGVuYWJsZXMKCSAgICBiZWhhdmlvdXIgc2ltaWxhciB0byBjL2MrKyBjb21waWxlcnMuIE5vdGUgdGhhdCB0aGlzIGNvbnRyb2xzIHRoZSBvdXRwdXQgZGlyZWN0b3J5LAoJICAgIGJ1dCBvbmx5IGluIHRoZSBhYnNlbmNlIG9mIHRoZSAtbyBhbmQvb3IgLW91dGRpciBvcHRpb25zLgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBbcnVieV0gQXBwbHkgcGF0Y2ggIzIyNjM4NTAgdG8gZml4IHJ1YnkvZmlsZS5pIC4uLiBydWJ5aW8uaCBmaWxlbmFtZSBjaGFuZ2UgaW4gCgkgICAgcnVieSAxLjkuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyMzE5NzkwIGZyb20gSm9oYW4gSGFrZSB0byBmaXggc2hhcmVkX3B0ciB1c2FnZSBpbiBzdGQ6OnRyMSBuYW1lc3BhY2UuCgoyMDA4LTExLTIxOiB3c2Z1bHRvbgoJICAgIFRoZSB1c2Ugb2YgdGhlIGluY2x1ZGUgcGF0aCB0byBmaW5kIHRoZSBpbnB1dCBmaWxlIGlzIG5vdyBkZXByZWNhdGVkLgoJICAgIFRoaXMgbWFrZXMgdGhlIGJlaGF2aW91ciBvZiBTV0lHIHRoZSBzYW1lIGFzIEMvQysrIGNvbXBpbGVycyBpbiBwcmVwYXJhdGlvbgoJICAgIGZvciB1c2Ugd2l0aCBjY2FjaGUuCgoyMDA4LTExLTE2OiB3c2Z1bHRvbgoJICAgIEZpeCAtbm9wcmVwcm9jZXNzIG9wdGlvbiB0bzoKCSAgICAtIGNvcnJlY3RseSByZXBvcnQgZmlsZSBuYW1lcyBpbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KCSAgICAtIHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgZmlsZW5hbWUgdGhhdCBjcmVhdGVkIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdoZW4gCgkgICAgICBkZXRlcm1pbmluZyB0aGUgQysrIHdyYXBwZXIgZmlsZSBuYW1lIChpbiB0aGUgYWJzZW5jZSBvZiAtbykuIFByZXZpb3VzbHkgCgkgICAgICB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBjb250YWluaW5nIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdhcyB1c2VkLgoKMjAwOC0xMS0xMTogd3NmdWx0b24KCSAgICBbSmF2YV0gQWRkIHBhdGNoICMyMTUyNjkxIGZyb20gTUFUU1VVUkEgVGFrYW5vcmkgd2hpY2ggZml4ZXMgY29tcGlsZXMgdXNpbmcgdGhlCgkgICAgSW50ZWwgY29tcGlsZXIKCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBwYXRjaCAjMjEyODI0OSBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrIHdoaWNoIGNvcnJlY3RzIHRoZSBDL0MrKyBwcm94eQogICAgICAgICAgICBjbGFzcyBiZWluZyByZXBvcnRlZCBmb3IgUHl0aG9uIGRvY3N0cmluZ3Mgd2hlbiAlcmVuYW1lIGlzIHVzZWQuCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIHN0cmlwIGVuY29kZXIgcGF0Y2ggZnJvbSBBbmF0b2x5IFRlY2h0b25payAjMjEzMDAxNi4gVGhpcyBlbmFibGVzIGFuIAogICAgICAgICAgICBlYXN5IHdheSB0byByZW5hbWUgc3ltYm9scyBieSBzdHJpcHBpbmcgYSBjb21tb25seSB1c2VkIHByZWZpeCBpbiBhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uL3N0cnVjdCBuYW1lcy4gSXQgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvdGhlciBlbmNvZGVycywgc3VjaCBhcwogICAgICAgICAgICB0aXRsZSwgbG93ZXIsIGNvbW1hbmQgZXRjIG91dGxpbmVkIGluIENIQU5HRVMgZmlsZSBkYXRlZCAxMi8zMC8yMDA1LiBFeGFtcGxlCiAgICAgICAgICAgIGJlbG93IHdpbGwgcmVuYW1lIHd4QW5vdGhlcldpZGdldCB0byBBbm90aGVyV2lkZ2V0IGFuZCB3eERvU29tZXRoaW5nIHRvIAogICAgICAgICAgICBEb1NvbWV0aGluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShzdHJpcDpbd3hdKXMiKSAiIjsgCgogICAgICAgICAgICAgIHN0cnVjdCB3eEFub3RoZXJXaWRnZXQgewogICAgICAgICAgICAgICAgICB2b2lkIHd4RG9Tb21ldGhpbmcoKTsKICAgICAgICAgICAgICB9OwoKMjAwOC0wOS0yNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIExvdHMgb2YgdGVzdC1zdWl0ZSB3b3JrLgoJICAgIC0gRml4IG9yZGVyaW5nIG9mIHdyYXBwZXIgb3V0cHV0IGFuZCAleyAlfSBoZWFkZXIgb3V0cHV0LgoJICAgIC0gRml4IGRlY2xhcmF0aW9ucyBvZiBsb2NhbCB2YXJzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgZGVmaW5lZCBjb25zdGFudHMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBFbnVtVmFsdWVzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBhZGQgc29tZSBjb25zdCB0eXBlbWFwcyB0byBhbGxlZ3JvY2wuc3dnCgkgICAgLSBhZGQgcmVuYW1lIGZvciBvcGVyYXRvciBib29sKCkgb3ZlcmxvYWRzLgoJCjIwMDgtMDktMjU6IG9sbHkKCSAgICBbUEhQNV0gRmlsbCBpbiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgYW5kIHZvaWQgKiAoU0YjMjA5NTE4NikuCgoyMDA4LTA5LTIyOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIFN1cHBvcnQgd3JhcHBpbmcgb2YgdHlwZXMgd2hvc2UgZGVmaW5pdGlvbnMgYXJlIG5vdCBzZWVuIGJ5CgkgICAgU1dJRy4gVGhleSBhcmUgdHJlYXRlZCBhcyBmb3J3YXJkLXJlZmVyZW5jZWQgY2xhc3NlcyBhbmQgaWYgYQoJICAgIGRlZmluaXRpb24gaXMgbm90IHNlZW4gYXJlIHRyZWF0ZWQgYXMgKCogOnZvaWQpLgoJICAgIC0gRG9uJ3Qgd3JhcCB0aGUgY29udGVudHMgb2YgdW5uYW1lZCBuYW1lc3BhY2VzLgoJICAgIC0gTW9yZSBjb2RlIGNsZWFudXAuIFJlbW92ZWQgc29tZSBleHRyYW5lb3VzIHdhcm5pbmdzLgoJICAgIC0gc3RhcnQgd29yayBvbiBoYXZpbmcgdGhlIGFsbGVncm9jbCBtb2QgcGFzcyB0aGUgY3BwIHRlc3Qtc3VpdGUuCgoyMDA4LTA5LTE5OiBvbGx5CgkgICAgW1BIUDVdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIEMjIGFycmF5IHR5cGVtYXBzIHByb3ZpZGVkIGJ5IEFudHRpIEthcmFudGEuCiAgICAgICAgICAgIFRoZSBhcnJheXMgcHJvdmlkZSBhIHdheSB0byB1c2UgTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBBcnJheSkKICAgICAgICAgICAgYW5kIHBpbm5pbmcgdGhlIGFycmF5IHVzaW5nICdmaXhlZCcuIFNlZSBhcnJheXNfY3NoYXJwLmkgbGlicmFyeSBmaWxlCiAgICAgICAgICAgIGZvciBkZXRhaWxzLgoKMjAwOC0wOS0xODogd3NmdWx0b24KCSAgICBEb2N1bWVudCB0aGUgb3B0aW9uYWwgbW9kdWxlIGF0dHJpYnV0ZSBpbiB0aGUgJWltcG9ydCBkaXJlY3RpdmUsCiAgICAgICAgICAgIHNlZSBNb2R1bGVzLmh0bWwuIEFkZCBhIHdhcm5pbmcgZm9yIFB5dGhvbiB3cmFwcGVycyB3aGVuIHRoZQogICAgICAgICAgICBtb2R1bGUgbmFtZSBmb3IgYW4gaW1wb3J0ZWQgYmFzZSBjbGFzcyBpcyBtaXNzaW5nLCByZXF1aXJpbmcgdGhlCiAgICAgICAgICAgIG1vZHVsZSBhdHRyaWJ1dGUgdG8gYmUgYWRkZWQgdG8gJWltcG9ydCwgZWcgCgogICAgICAgICAgICAgICVpbXBvcnQobW9kdWxlPSJGb29Nb2R1bGUiKSBmb28uaAoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBDaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZW1hcCBmb3IgY2hhciAqIHRvIHR1cm4gUEhQCgkgICAgTnVsbCBpbnRvIEMgTlVMTCAocHJldmlvdXNseSBpdCB3YXMgY29udmVydGVkIHRvIGFuIGVtcHR5IHN0cmluZykuCgkgICAgVGhlIG5ldyBiZWhhdmlvdXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKCSAgICB0eXBlbWFwIHdvcmtzIChTRiMyMDI1NzE5KS4KCgkgICAgSWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgYWRkIHRoZSBmb2xsb3dpbmcgdHlwZW1hcAoJICAgIHRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgKFBIUCdzIGNvbnZlcnRfdG9fc3RyaW5nX2V4KCkgZnVuY3Rpb24gZG9lcwoJICAgIHRoZSBjb252ZXJ0aW5nIGZyb20gUEhQIE51bGwgdG8gYW4gZW1wdHkgc3RyaW5nKToKCgkgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7CgkJY29udmVydF90b19zdHJpbmdfZXgoJGlucHV0KTsKCQkkMSA9IFpfU1RSVkFMX1BQKCRpbnB1dCk7CgkgICAgfQoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggZXh0cmEgY29kZSBhZGRlZCB0byBwcm94eSBjbGFzcyBjb25zdHJ1Y3RvcnMgaW4gdGhlIGNhc2UKCSAgICB3aGVyZSB0aGUgb25seSBjb25zdHJ1Y3RvciB0YWtlcyBubyBhcmd1bWVudHMuCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCB3cmFwcGluZyBvZiBhIHJlbmFtZWQgZW51bWVyYXRlZCB2YWx1ZSBvZiBhbiBlbnVtIGNsYXNzCgkgICAgbWVtYmVyIChTRiMyMDk1MjczKS4KCjIwMDgtMDktMTc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gRml4IGhvdyBmb3J3YXJkIHJlZmVyZW5jZSB0eXBlZGVmcyBhcmUgaGFuZGxlZCwgc28gYXMgbm90IHRvIGNvbmZsaWN0CgkgICAgd2l0aCBvdGhlciBsZWdpdCB0eXBlZGVmcy4KCSAgICAtIERvbid0IChmb3Igbm93KSBwZXJmb3JtIGFuIGZmaXR5cGUgdHlwZW1hcCBsb29rdXAgd2hlbiB0cnlpbmcgdG8KCSAgICB3aGVuIGNhbGxpbmcgY29tcG9zZV9mb3JlaWduX3R5cGUoKS4gVGhpcyBpcyBhY3R1YWxseSBhIHVzZWZ1bCB0aGluZwoJICAgIHRvIGRvIGluIGNlcnRhaW4gY2FzZXMsIHRoZSB0ZXN0IGNhc2VzIGZvciB3aGljaCBJIGNhbid0IGN1cnJlbnRseQoJICAgIGxvY2F0ZSA6Ly4gSXQncyBicmVha2luZyBzb21lIHdyYXBwaW5nIGJlaGF2aW9yIHRoYXQgaXMgbW9yZSBjb21tb25seQoJICAgIHNlZW4sIGhvd2V2ZXIuIEknbGwgcmVhZGQgaW4gYSBtb3JlIGFwcHJvcHJpYXRlIHdheSB3aGVuIEkgY2FuCgkgICAgcmVjcmVhdGUgdGhlIG5lZWRlZCB0ZXN0IGNhc2UsIG9yIGEgdXNlciBjb21wbGFpbnMgKHdoaWNoIG1lYW5zCgkgICAgdGhleSBwcm9iYWJseSBoYXZlIGEgdGVzdCBjYXNlKS4KCSAgICAtIGRvY3VtZW50IHRoZSAtaXNvbGF0ZSBjb21tYW5kLWxpbmUgYXJnIGluIHRoZSAnc3dpZyAtaGVscCcgb3V0cHV0LgoJICAgIEl0IHdhcyBpbiB0aGUgaHRtbCBkb2NzLCBidXQgbm90IHRoZXJlLgoJICAgIC0gc21hbGwgYW1vdW50IG9mIGNvZGUgY2xlYW51cCwgcmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgoJICAgIC0gc29tZSBtaW5vciBhZXN0aGV0aWMgY2hhbmdlcy4KCjIwMDgtMDktMTI6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMy4wIHN1cHBvcnQgYnJhbmNoIG1lcmdlZCBpbnRvIFNXSUcgdHJ1bmsuIFRoYW5rcyB0bwogICAgICAgICAgICBHb29nbGUgU3VtbWVyIG9mIENvZGUgMjAwOCBmb3Igc3VwcG9ydGluZyB0aGlzIHByb2plY3QhIEJ5IGRlZmF1bHQKICAgICAgICAgICAgU1dJRyB3aWxsIGdlbmVyYXRlIGludGVyZmFjZSBmaWxlcyBjb21wYXRpYmxlIHdpdGggYm90aCBQeXRob24gMi54CiAgICAgICAgICAgIGFuZCAzLjAuIEFuZCB0aGVyZSdzIGFsc28gc29tZSBQeXRob24gMyBuZXcgZmVhdHVyZXMgdGhhdCBjYW4gYmUKICAgICAgICAgICAgZW5hYmxlZCBieSBwYXNzaW5nIGEgIi1weTMiIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gU1dJRy4gVGhlc2UKICAgICAgICAgICAgZmVhdHVyZXMgYXJlOgoKICAgICAgICAgICAgICAtIEZ1bmN0aW9uIGFubm90YXRpb24gc3VwcG9ydAogICAgICAgICAgICAgICAgICBBbHNvLCB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgcHJveHkgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQsCiAgICAgICAgICAgICAgICAgIGV2ZW4gd2l0aG91dCB0aGUgIi1weTMiIG9wdGlvbi4gSG93ZXZlciwgdGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgICAgICAgIHdpbGwgZmFsbGJhY2sgdG8gKmFyZ3MgaWYgdGhlIGZ1bmN0aW9uIChvciBtZXRob2QpIGlzIG92ZXJsb2FkZWQuCiAgICAgICAgICAgICAgLSBCdWZmZXIgaW50ZXJmYWNlIHN1cHBvcnQKICAgICAgICAgICAgICAtIEFic3RyYWN0IGJhc2UgY2xhc3Mgc3VwcG9ydAoKICAgICAgICAgICAgRm9yIGRldGFpbHMgb2YgUHl0aG9uIDMgc3VwcG9ydCBhbmQgdGhlc2UgZmVhdHVyZXMsIHBsZWFzZSBzZWUgdGhlCiAgICAgICAgICAgICJQeXRob24gMyBTdXBwb3J0IiBzZWN0aW9uIGluIHRoZSAiU1dJRyBhbmQgUHl0aG9uIiBjaGFwdGVyIG9mIHRoZSBTV0lHCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgIi1hcHBseSIgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgc3VwcG9ydCBvZiBnZW5lcmF0aW5nIGNvZGVzCiAgICAgICAgICAgIHVzaW5nIGFwcGx5KCkgaXMgcmVtb3ZlZC4gU2luY2UgdGhpcyBpcyBvbmx5IHJlcXVpcmVkIGJ5IHZlcnkgb2xkCiAgICAgICAgICAgIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgbWVyZ2UgYWxzbyBwYXRjaGVkIFNXSUcncyBwYXJzZXIgdG8gc29sdmUgYSBidWcuIEJ5IHRoaXMgcGF0Y2gsCiAgICAgICAgICAgIFNXSUcgZmVhdHVyZXMgYWJsZSB0byBiZSBjb3JyZWN0bHkgYXBwbGllZCBvbiBDKysgY29udmVyc2lvbiBvcGVyYXRvciwKICAgICAgICAgICAgc3VjaCBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpICAqOjpvcGVyYXRvciBib29sICV7IC4uLiAlfQoKMjAwOC0wOS0wMjogcmljaGFyZGIKCSAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzIwODkxNDk6IERpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBtYW5nbGVzCgkgICAgcmV0dXJuZWQgZXhjZXB0aW9uLiAgRXhjZXB0aW9ucyByYWlzZWQgYnkgUHl0aG9uIGNvZGUgaW4gZGlyZWN0b3JzCgkgICAgYXJlIG5vdyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY2FsbGVyIHdpdGhvdXQgY2hhbmdlLiAgQWxzbywgcmVtb3ZlCgkgICAgdGhlICI6ICIgcHJlZml4IHdoaWNoIHVzZWQgdG8gYmUgYWRkZWQgdG8gb3RoZXIgZGlyZWN0b3IgZXhjZXB0aW9ucwoJICAgIChlZywgdGhvc2UgZHVlIHRvIGluY29ycmVjdCByZXR1cm4gdHlwZXMpLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMxOTg4Mjk2IEdDSXRlbSBtdWx0aXBsZSBtb2R1bGUgbGlua2luZyBpc3N1ZSB3aGVuIHVzaW5nIAogICAgICAgICAgICBkaXJlY3RvcnMuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yICd1c2luZycgYW5kICdmaXhlZCcgYmxvY2tzIGluIHRoZSAnY3NpbicgdHlwZW1hcCBpcyBub3cKICAgICAgICAgICAgcG9zc2libGUgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBwcmUgYXR0cmlidXRlIGFuZCB0aGUgbmV3IHRlcm1pbmF0b3IgYXR0cmlidXRlLCBlZwoKICAgICAgICAgICAgICAldHlwZW1hcChjc2luLCAKICAgICAgICAgICAgICAgICAgICAgICBwcmU9IiAgICB1c2luZyAoQ0RhdGUgdGVtcCRjc2lucHV0ID0gbmV3IENEYXRlKCRjc2lucHV0KSkgeyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRvcj0iICAgIH0gLy8gdGVybWluYXRlIHRlbXAkY3NpbnB1dCB1c2luZyBibG9jayIsCiAgICAgICAgICAgICAgICAgICAgICApIGNvbnN0IENEYXRlICYKICAgICAgICAgICAgICAgICAgICAgICAiJGNzY2xhc3NuYW1lLmdldENQdHIodGVtcCRjc2lucHV0KSIKCiAgICAgICAgICAgIFNlZSBDU2hhcnAuaHRtbCBmb3IgbW9yZSBpbmZvLgoKMjAwOC0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIENvbW1pdCBwYXRjaCAjMjA3OTM4MSBzdWJtaXR0ZWQgYnkgQm9yaXMgU21pbGdhIC0gY29uc3RhbnQgZXhwcnMgcHV0IGludG8gCiAgICAgICAgICAgIG5vLWV2YWwgY29udGV4dCBpbiBERUZDRU5VTQoKMjAwOC0wOC0wMjogd3V6emViCiAgICAgICAgICAgIFtDaGlja2VuLEFsbGVncm9dIENvbW1pdCBQYXRjaCAyMDE5MzE0CiAgICAgICAgICAgIEZpeGVzIGEgYnVpbGQgZXJyb3IgaW4gY2hpY2tlbiwgYW5kIHNldmVyYWwgYnVpbGQgZXJyb3JzIGFuZCBvdGhlciBlcnJvcnMKICAgICAgICAgICAgaW4gQWxsZWdybyBDTAoKMjAwOC0wNy0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1aWxkaW5nIG9mIFRjbCBleGFtcGxlcy90ZXN0LXN1aXRlIG9uIE1hYyBPUyBYIHJlcG9ydGVkIGJ5IEdpZGVvbiBTaW1wc29uLgoKMjAwOC0wNy0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGICMyMDE5MTU2IENvbmZpZ3VyaW5nIHdpdGggLS13aXRob3V0LW9jdGF2ZSBvciAtLXdpdGhvdXQtYWxsbGFuZwogICAgICAgICAgICBkaWQgbm90IGRpc2FibGUgb2N0YXZlLgoKMjAwOC0wNy0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZGlyZWN0b3IgdHlwZW1hcHMgZm9yIHBvaW50ZXJzIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgY29ycmVjdGx5IAogICAgICAgICAgICBtYXJzaGFsbGVkIHRvIEMjL0phdmEgbnVsbCBpbiBkaXJlY3RvciBtZXRob2RzLgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIEZvciBzdGRfdmVjdG9yLmkgYW5kIHN0ZF9tYXAuaSwgcmVuYW1lIGVtcHR5KCkgdG8gaXNfZW1wdHkoKQoJICAgIHNpbmNlICJlbXB0eSIgaXMgYSBQSFAgcmVzZXJ2ZWQgd29yZC4gIEJhc2VkIG9uIHBhdGNoIGZyb20gTWFyayBLbGVpbgoJICAgIGluIFNGIzE5NDM0MTcuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlcHJlY2F0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAiLW1ha2UiIGhhcyBiZWVuIHJlbW92ZWQuICAKCSAgICBTZWFyY2hlcyBvbiBHb29nbGUgY29kZXNlYXJjaCBzdWdnZXN0IHRoYXQgbm9ib2R5IGlzIHVzaW5nIGl0IG5vdwoJICAgIGFueXdheS4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgU1dJRyBjZGF0YS5pIGxpYnJhcnkgbW9kdWxlIGlzIG5vdyBzdXBwb3J0ZWQuCgoyMDA4LTA3LTAzOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlcHJlY2F0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXBocGZ1bGwiIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFdlIHJlY29tbWVuZCBidWlsZGluZyB5b3VyIGV4dGVuc2lvbiBhcyBhIGR5bmFtaWNhbGx5CgkgICAgbG9hZGFibGUgbW9kdWxlLgoKMjAwOC0wNy0wMjogb2xseQoJICAgIFtQSFA0XSBTdXBwb3J0IGZvciBQSFA0IGhhcyBiZWVuIHJlbW92ZWQuICBUaGUgUEhQIGRldmVsb3BlcnMgYXJlCgkgICAgbm8gbG9uZ2VyIG1ha2luZyBuZXcgUEhQNCByZWxlYXNlcywgYW5kIHdvbid0IGV2ZW4gYmUgcHJvdmlkaW5nCgkgICAgcGF0Y2hlcyBmb3IgY3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGFmdGVyIDIwMDgtMDgtMDguCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gSW1wb3J0IHRoZSBDIGV4dGVuc2lvbiBkaWZmZXJlbnRseSBmb3IgUHl0aG9uIDIuNiBhbmQKCSAgICBsYXRlciBzbyB0aGF0IGFuIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydCBkb2Vzbid0IHByb2R1Y2UgYQoJICAgIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yIDIuNiBhbmQgYSBmYWlsdXJlIGZvciAyLjcgYW5kIGxhdGVyLgoJICAgIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIFNGIzIwMDgyMjksIHBsdXMgZm9sbG93LXVwIHBhdGNoZXMKCSAgICBmcm9tIFJpY2hhcmQgYW5kIEhhb3l1IEJhaS4KClZlcnNpb24gMS4zLjM2ICgyNCBKdW5lIDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8yNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZGVwcmVjYXRlZCAtYyBjb21tYW5kbGluZSBvcHRpb24gKHJ1bnRpbWUgbGlicmFyeSBnZW5lcmF0aW9uKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgd2hlbiBoYW5kbGluZyAldHlwZW1hcChpbixudW1pbnB1dHM9MCkKCSAgICAodGVzdGNhc2UgaWdub3JlX3BhcmFtZXRlcikuCgowNi8yNC8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ2ZhdWx0IHdoZW4gd3JhcHBpbmcgYSBub24tY2xhc3MgZnVuY3Rpb24gbWFya2VkIHdpdGgKCSAgICAlbmV3b2JqZWN0ICh0ZXN0Y2FzZSBjaGFyX3N0cmluZ3MpLgoKMDYvMjIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBhIHdheSB0byB1c2UgQXR0YWNoQ3VycmVudFRocmVhZEFzRGFlbW9uIGluc3RlYWQgb2YgQXR0YWNoQ3VycmVudFRocmVhZAogICAgICAgICAgICBpbiBkaXJlY3RvciBjb2RlLiBEZWZpbmUgdGhlIFNXSUdfSkFWQV9BVFRBQ0hfQ1VSUkVOVF9USFJFQURfQVNfREFFTU9OIG1hY3JvLCBzZWUKICAgICAgICAgICAgTGliL2phdmEvZGlyZWN0b3Iuc3dnLgoKMDYvMjEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBjcmFzaGluZyBpbiB0aGUgU1RMIHdyYXBwZXJzIChyZWplY3QhIGFuZCBkZWxldGVfaWYgbWV0aG9kcykKCjA2LzE5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQyMgYW5kIEphdmEga2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGluc3RlYWQgb2YganVzdCBpc3N1aW5nIGEgd2FybmluZwogICAgICAgICAgICBhbmQgdGhlbiBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSBjb2RlLiBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIAogICAgICAgICAgICBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEtleXdvcmQgaGFuZGxpbmcgYWRkZWQuIFIgS2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGFzIG5lY2Vzc2FyeS4KICAgICAgICAgICAgV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBib29sJiBhbmQgYm9vbCouIEFkZGVkIHJ1bnRlc3QgZm9yIGxpX3R5cGVtYXBzIHRlc3RjYXNlLgogICAgICAgICAgICAoQnVnICMxOTM4MTQyKQoKMDYvMDcvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHRlc3QgY2FzZSBrZXl3b3JkX3JlbmFtZSwgdGhlbiBtYWRlIHRoZSBrZXl3b3JkIHJlbmFtaW5nIHdvcmtzIHByb3Blcmx5CiAgICAgICAgICAgIGJ5IGZpeGluZyBTd2lnX25hbWVfbWFrZSgpIGZvciBhIGluY29tcGxldGUgY29uZGl0aW9uIGNoZWNraW5nLgoKMDYvMDIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZW51bSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMzAvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHN0ZDo6d3N0cmluZyBpbnRvIExpYi90eXBlbWFwcy9wcmltdHlwZXMuc3dnLCBzaW5jZSBpdCBpcyBhbHNvIGEgcHJpbWl0aXZlIAogICAgICAgICAgICB0eXBlIGluIFNXSUcgLSBmaXhlZCBTRiAjMTk3Njk3OC4KCjA1LzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHZhcmlhYmxlIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8yOS8yMDA4OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgYSB0eXBvIG9mICUjaWZkZWYgaW4gTGliL3B5dGhvbi9weWNvbnRhaW5lci5zd2csIHdoaWNoIGlzIHJlbGF0ZWQgCiAgICAgICAgICAgIHRvIC1leHRyYW5hdGl2ZSBTV0lHIG9wdGlvbiAtIFNGICMxOTcxOTc3LgoKMDUvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHBhcnRpYWxjaGVjayBtYWtlZmlsZSB0YXJnZXRzIGZvciBwYXJ0aWFsIHRlc3Rpbmcgb2YgdGhlIHRlc3Qtc3VpdGUuIFRoZXNlCiAgICAgICAgICAgIGp1c3QgaW52b2tlIFNXSUcsIGllIG5vIGNvbXBpbGF0aW9uIGFuZCBubyBydW50aW1lIHRlc3RpbmcuIEl0IGNhbiBiZSBmYXN0ZXIKICAgICAgICAgICAgd2hlbiBkZXZlbG9waW5nIGJ5IGp1c3QgZG9pbmcgYSBkaXJlY3RvcnkgZGlmZiBvZiB0aGUgZmlsZXMgU1dJRyBnZW5lcmF0ZXMKICAgICAgICAgICAgYWdhaW5zdCB0aG9zZSBmcm9tIGEgcHJldmlvdXMgcnVuLiBFeGFtcGxlIHVzYWdlIGZyb20gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnk6CgogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay1qYXZhLXRlc3Qtc3VpdGUKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5jb21wYXNzZXMgbW9yZSBmbGV4aWJpbGl0eSBpbiBydW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBlZwogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBwcmVmaXggdGhlIGNvbW1hbmQgbGluZSB3aGljaCBydW5zIGFueSB0YXJnZXQgbGFuZ3VhZ2UgdGVzdAogICAgICAgICAgICB3aXRoIGEgdG9vbC4gU2VlIHRoZSBSVU5UT09MLCBDT01QSUxFVE9PTCBhbmQgU1dJR1RPT0wgdGFyZ2V0cyBpbiB0aGUgY29tbW9uLm1rCiAgICAgICAgICAgIGZpbGUgYW5kIG1ha2VmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZSBkaXJlY3RvcnkuIEZvciBleGFtcGxlIGl0IGlzIHBvc3NpYmxlIHRvIAogICAgICAgICAgICBydW4gdGhlIHJ1bnRpbWUgdGVzdHMgdGhyb3VnaCB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBSVU5UT09MPSJ2YWxncmluZCAtLWxlYWstY2hlY2s9ZnVsbCIKCiAgICAgICAgICAgIG9yIGludm9rZSBTV0lHIHVuZGVyIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFNXSUdUT09MPSJ2YWxncmluZCAtLXRvb2w9bWVtY2hlY2siCgowNS8xOS8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgZGVmaW5lIHRoYXQgd2FzIGJyZWFraW5nIHByZS0yLjcuICBDaGVja2VkIGluCiAgICAgICAgICAgIHBhdGNoIGZyb20gU29yZW4gU29ubmVuYnVyZyB0aGF0IGNyZWF0ZXMgc3RyaW5ncyBpbiAgCgkgICAgdmVyc2lvbiBpbmRlcGVuZGVudCB3YXkKCjA1LzE1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggdmFyaWFibGUgbmFtZSBjbGFzaCBpbiBkaXJlY3RvcnMgLSBTRiAjMTk2MzMxNiByZXBvcnRlZCBieSBUcmlzdGFuLgoKMDUvMTQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGFuIG9wdGltaXNhdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG9iamVjdHMgYnkgdmFsdWUsIHJlZHVjaW5nCiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBvYmplY3QgdGhhdCBhcmUgbWFkZS4gSW1wbGVtZW50ZWQgdXNpbmcgYW4KICAgICAgICAgICAgb3B0aW9uYWwgYXR0cmlidXRlIGluIHRoZSAib3V0IiB0eXBlbWFwIGNhbGxlZCAib3B0aW1hbCIuIERldGFpbHMgaW4gCiAgICAgICAgICAgIFR5cGVtYXBzLmh0bWwuCgowNS8xMS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gQ2hlY2sgZm9yICVmZWF0dXJlKCJub3RhYnN0cmFjdCIpIHdoZW4gZ2VuZXJhdGluZyBQSFA1IGNsYXNzCgkgICAgd3JhcHBlci4KCjA1LzExLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMTk0MzYwOCAtICRzZWxmIHN1YnN0aXR1dGlvbiBpbiAlY29udHJhY3QsIHBhdGNoIHN1Ym1pdHRlZCBieQogICAgICAgICAgICBUb29uIFZlcnN0cmFlbGVuLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBjaGFyICogdHlwZW1hcHMgdG8gd29yayB3aGVuIGFwcGxpZWQgdG8gc2lnbmVkIGNoYXIgKiBhbmQKCSAgICB1bnNpZ25lZCBjaGFyICogKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcHBseV9zdHJpbmdzKS4KCjA1LzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBjaGFyICogbWVtYmVyIHZhcmlhYmxlcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGJhZCBQSFAgY29kZSBnZW5lcmF0ZWQgd2hlbiB3cmFwcGluZyBhbiBlbnVtIGluIGEKCSAgICBuYW1lc3BhY2UgKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcnJheXNfc2NvcGUpLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIFNXSUcgbm93IHJ1bnMgdGhlIFBIUCB0ZXN0c3VpdGUgdXNpbmcgUEhQNSwgbm90IFBIUDQuICBQSFA0CgkgICAgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUgbm93LCBzbyB3ZSBjYXJlIG11Y2ggbW9yZSBhYm91dCBzb2xpZCBQSFA1CgkgICAgc3VwcG9ydC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFNUTCBmaXhlcyB3aGVuIHVzaW5nICVpbXBvcnQgcmF0aGVyIHRoYW4gJWluY2x1ZGUgYW5kIHRoZSBTb2xhcmlzIFdvcmtzaG9wCiAgICAgICAgICAgIGNvbXBpbGVyIGFuZCB0aGUgUm9ndWV3YXZlIFNUTC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBvdmVybG9hZGVkIHByb3RlY3RlZCBtZXRob2RzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzAzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIENvbW1pdCBwYXRjaCAjMTk1NjYwNyB0byBhZGQgLU1UIHN1cHBvcnQgZnJvbSBSaWNoYXJkIEJvdWx0b24uCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWlycm9ycyB0aGUgZ2NjIC1NVCBvcHRpb24gd2hpY2ggYWxsb3dzIG9uZSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgICAgICAgTWFrZWZpbGUgdGFyZ2V0IGJlaW5nIGdlbmVyYXRlZCB3aGVuIGdlbmVyYXRpbmcgbWFrZWZpbGVzIHdpdGggdGhlIC1NIGZhbWlseQogICAgICAgICAgICBvZiBvcHRpb25zLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJCBzd2lnIC1qYXZhIC1NTSAtTVQgb3ZlcnJpZGRlbm5hbWUgLWMrKyAgZXhhbXBsZS5pCiAgICAgICAgICAgICAgb3ZlcnJpZGRlbm5hbWU6IFwKICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKMDQvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBbTHVhXSBSZW1vdmVkIGdlbmVyYXRpb24gb2YgX3dyYXBfZGVsZXRlX1hYWFhYICh3cmFwcGVyZWQgZGVzdHJ1Y3RvcikKCSAgICB3aGljaCB3YXMgdW51c2VkIGFuZCBjYXVzaW5nIHdhcm5pbmcgd2l0aCBnKysgLVdhbGwuCgkgICAgUmVtb3ZlZCBvdGhlciB1bnVzZWQgd2FybmluZyBpbiB0eXBlbWFwcy5pIGFuZCBvdGhlciBwbGFjZXMuCgkgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2VtYmVkMywgYW5kIHJ1biB0ZXN0cyBhIGZldyB0ZXN0IGNhc2VzLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgSUJNJ3MgQysrIGNvbXBpbGVyIG9uIEFJWCAocGF0Y2gKCSAgICBmcm9tIEdvZXJhbiBVZGRlYm9yZyBpbiBTRiMxOTI4MDQ4KS4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBSZW5hbWUgQlNJWkUgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9hcnJheXNfc2NvcGUuaSB0byBCQlNJWkUgdG8KCSAgICBhdm9pZCBhIGNsYXNoIHdpdGggQlNJWkUgZGVmaW5lZCBieSBoZWFkZXJzIG9uIEFJWCB3aXRoIFBlcmwKCSAgICAocmVwb3J0ZWQgaW4gU0YjMTkyODA0OCkuCgowNC8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgdG8gd3JhcCBhbGwgcHJvdGVjdGVkIG1lbWJlcnMgd2hlbiB1c2luZyBkaXJlY3RvcnMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgb25seSB0aGUgdmlydHVhbCBtZXRob2RzIHdlcmUgYXZhaWxhYmxlIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgIE5vdyBhbGwgcHJvdGVjdGVkIG1lbWJlcnMsIChzdGF0aWMgYW5kIG5vbi1zdGF0aWMgdmFyaWFibGVzLCBub24tdmlydHVhbCBtZXRob2RzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWV0aG9kcykgYXJlIHdyYXBwZWQgd2hlbiB1c2luZyB0aGUgYWxscHJvdGVjdGVkIG1vZGUuIFRoZSBhbGxwcm90ZWN0ZWQKICAgICAgICAgICAgbW9kZSBpcyB0dXJuZWQgb24gaW4gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbjoKCiAgICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLCBhbGxwcm90ZWN0ZWQ9IjEiKSBtb2R1bGVuYW1lCgpWZXJzaW9uIDEuMy4zNSAoNyBBcHJpbCAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQWRkIG1pc3NpbmcgcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMKCjA0LzA2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzdGFjayBvdmVyZmxvdyB3aGVuIHVzaW5nIHR5cGVtYXAgd2FybmluZyBzdXBwcmVzc2lvbiwgZWcgCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fVFlQRU1BUF9DSEFSTEVBS19NU0cpCgowNC8wNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyBzbyB0aGF0ICVweXRob25ub25keW5hbWljIGNhbiBiZSB1c2VkLiBBbHNvIGNvcnJlY3RzCiAgICAgICAgICAgIGRpc3BsYXkgb2YgdGhlIHByb3h5IGNsYXNzIHR5cGUuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowNC8wNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkICVuZXdvYmplY3QgcmVmZXJlbmNlIHRvIHB5dGhvbiBtZW1vcnkgbWFuYWdlbWVudCBzdWJzZWN0aW9uIG9mIG1hbnVhbAoJICAgIChwYXRjaCBmcm9tIG1kYmVhY2h5IGluIFNGIzE4OTQ2MTApLgoKMDMvMjcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgd2hlcmUgdGhlIHBvaW50ZXIgdHlwZSBpcyBhIHRlbXBsYXRlZCB0eXBlIHdpdGgKICAgICAgICAgICAgd2l0aCBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjAzLzI3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgdHlwZW1hcCBESVNPV04gZm9yIFNXSUdUWVBFKiBhbmQgU1dJR1RZUEVbXSwgYW5kIHN1cHBvcnQgZm9yICVkZWxvYmplY3QgZmVhdHVyZS4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL293bmVyIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTg0NDMwMSBmcm9tIE1vbnR5IFRheWxvciB0byBzdXBwcmVzcyBlbnVtIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHVudXNlZCB3YXJuaW5ncy4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI0NTI0IGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCBlbnN1cmVzIHRoZQogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCIgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGNhbGwgYQogICAgICAgICAgICBjb25zdHJ1Y3RvciBvbiBhIGNsYXNzIHRoYXQgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igd3JhcHBlciwgZWcgaWYKICAgICAgICAgICAgdGhlIEMrKyBjbGFzcyBpcyBhYnN0cmFjdC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI1NzAyIGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCByZW1vdmVzIHdhcm5pbmcgNTEyCiAgICAgICAgICAgIGZvciBzdGQ6OnZlY3RvciB3cmFwcGVycy4KCjAzLzI2LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBcHBseSBHQ0MgNC4zIHdhcm5pbmdzIHBhdGNoIGZyb20gUGhpbGlwcCBUaG9tYXMKCSAgICAoU0YjMTkyNTEyMikuCgowMy8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBUaHJlYWQgc2FmZXR5IHBhdGNoIGZvciBTVEwgaXRlcmF0b3JzIGZyb20gQWJoaW5hbmRhbiBKYWluLgoKMDMvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgJWx1YWNvZGUgZmVhdHVyZSB0byBhZGQgc291cmNlIGNvZGUgaW50byB3cmFwcGVycy4KICAgICAgICAgICAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoaXMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9hcnJheXMgdG8gc2hvdyBpdHMgdXNlIChhbmQgdHlwZW1hcHMpCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG5vbnBvcnRhYmxlIHNlZCB1c2FnZSB3aGljaCBmYWlsZWQgb24gTWFjIE9TIFggKGFuZCBwcm9iYWJseQoJICAgIG90aGVyIHBsYXRmb3JtcykuICBGaXhlcyBTRiMxOTAzNjEyLgoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBtZW1vcnkgbGVhayBpbiBTV0lHJ3MgcGFyc2VyIChiYXNlZCBvbiBwYXRjaCBmcm9tIFJ1c3NlbGwKCSAgICBCcnlhbnQgaW4gU0YjMTkxNDAyMykuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxODc4Mjg1IC0gdW5uZWNlc3NhcnkgY2FzdCBmb3IgQyBzdHJ1Y3QgY3JlYXRpb24gd3JhcHBlcnMuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgZGVidWdnaW5nIGluZm8gd2hlbiB1c2luZyBzaGFyZWRfcHRyIHN1cHBvcnQKCjAzLzA2LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgTHVhIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9leGNlcHRpb24gYW5kIEV4YW1wbGVzL2x1YS9lbWJlZDIuCiAgICAgICAgICAgIFNtYWxsIHVwZGF0ZXMgdG8gdGhlIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBBZGQgY2hhciAqJiB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvY2Nhc2lvbmFsIHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVwb3J0IG92ZXJsb2FkZWQgbWV0aG9kcyBhcyBiZWluZyBpZ25vcmVkLgoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCAjMTkwNDUzNyBTd2lnIGNhdXNlcyBhIFBlcmwgd2FybmluZyAieCB1c2VkIG9ubHkgb25jZSIgaW4gUGVybCA1LjEwCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEFyaSBKb2xtYQoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHNoYXJlZF9wdHIgdmFyaW4vdmFyb3V0IHR5cGVtYXBzIGZvciB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGVzLgoKMDIvMjUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICR3cmFwbmFtZSB0byB3b3JrIGluICVleGNlcHRpb24gKGZpeGVzIHNvbWUgd3JhcDpuYW1lIGFzc2VydGlvbnMpCgpWZXJzaW9uIDEuMy4zNCAoMjcgRmVicnVhcnkgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCBmdW5jdGlvbiBwb2ludGVyIHZhcmlhYmxlcy4KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgZm9yIHVzZSB3aXRoaW4gJWV4Y2VwdGlvbjoKICAgICAgICAgICAgICAkd3JhcG5hbWUgLSBsYW5ndWFnZSBzcGVjaWZpYyB3cmFwcGVyIG5hbWUKICAgICAgICAgICAgICAkb3Zlcm5hbWUgLSBpZiBhIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgY29udGFpbnMgdGhlIGV4dHJhIG1hbmdsaW5nIHVzZWQgb24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG92ZXJsb2FkZWQgbWV0aG9kCiAgICAgICAgICAgICAgJGRlY2wgICAgIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgICAgICAkZnVsbGRlY2wgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIHJldHVybiB0eXBlCgowMi8xMi8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gTm93IHNldHRpbmcgUzQgZmxhZyBpbiBTV0lHIGNyZWF0ZWQgb2JqZWN0cy4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgUi1TV0lHIGZvciAyLjYgYW5kIHdhcm5pbmcgZm9yIDIuNiBmYWlsdXJlIGhhcyBiZWVuIHJlbW92ZWQuCgowMi8xMS8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHBhdGNoIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZiB0byBmaXggdGhlIHVuYXJ5IG1pbnVzIGlzc3VlCiAgICAgICAgICAgIFJhbiAnYXN0eWxlIC0tc3R5bGU9a3IgLTInIGFjcm9zcyBsdWEuY3h4IHRvIG5lYXRlbiBpdCB1cAoKMDIvMTAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQnVtcCBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byA0LiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgQVBJIAogICAgICAgICAgICBjaGFuZ2UgaW4gdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zLCBpZSBjaGFuZ2UgaW4gZGVmaW5pdGlvbiBvZiBzd2lnX2NvbnZlcnRlcl9mdW5jLgogICAgICAgICAgICBBbnlvbmUgY2FsbGluZyBTV0lHX1R5cGVDYXN0IG11c3QgcGFzcyBpbiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgbmV3IGFkZGl0aW9uYWwKICAgICAgICAgICAgKHRoaXJkKSBwYXJhbWV0ZXIgYW5kIHRoZW4gaGFuZGxlIHRoZSBuZXdseSBjcmVhdGVkIG1lbW9yeSBpZiB0aGUgcmV0dXJuZWQgdmFsdWUKICAgICAgICAgICAgaXMgc2V0IHRvIFNXSUdfQ0FTVF9ORVdfTUVNT1JZIGVsc2UgYSBtZW1vcnkgbGVhayB3aWxsIGVuc3VlLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQuIFVzYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSByZWNlbnRseQogICAgICAgICAgICBhZGRlZCBKYXZhIGFuZCBDIyBzaGFyZWRfcHRyIHR5cGVtYXBzLiBUd28gbWFjcm9zIGFyZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZXNlCiAgICAgICAgICAgIG1heSB3ZWxsIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgoKICAgICAgICAgICAgRm9yIGJhc2UgY2xhc3NlcyBvciBjbGFzc2VzIG5vdCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbjoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgRm9yIGRlcml2ZWQgY2xhc3NlczoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQoKICAgICAgICAgICAgVGhlIFBST1hZQ0xBU1MgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3h5IGNsYXNzLCBidXQgaXMgb25seSByZXF1aXJlZCBmb3IgSmF2YS9DIy4KICAgICAgICAgICAgRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJvb3N0X3NoYXJlZF9wdHIuaSIKCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKEtsYXNzLCBTcGFjZTo6S2xhc3MpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoS2xhc3NEZXJpdmVkLCBTcGFjZTo6S2xhc3MsIFNwYWNlOjpLbGFzc0Rlcml2ZWQpCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzc0Rlcml2ZWQgOiBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZ1cnRoZXIgZGV0YWlscyB0byBmb2xsb3cgaW4gZnV0dXJlIGRvY3VtZW50YXRpb24sIGJ1dCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzCiAgICAgICAgICAgIHNob3VsZCBiZSBub3RlZDoKCiAgICAgICAgICAgIC0gTm90IHJlc3RyaWN0ZWQgdG8gYm9vc3Q6OnNoYXJlZF9wdHIsIGVnIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlIHVzZWQuCiAgICAgICAgICAgIC0gQXZhaWxhYmxlIHR5cGVtYXAgZ3JvdXBzOgogICAgICAgICAgICAgIChhKSBUeXBlbWFwcyBmb3Igc2hhcmVkX3B0ciBwYXNzZWQgYnkgdmFsdWUsIHJlZmVyZW5jZSwgcG9pbnRlciBhbmQgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLgogICAgICAgICAgICAtIChiKSBUeXBlbWFwcyBmb3IgcGFzc2luZyBieSByYXcgdmFsdWUsIHJhdyBwb2ludGVyLCByYXcgcmVmZXJlbmNlLCByYXcgcG9pbnRlcgogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuIAogICAgICAgICAgICAtIFRoZSBjb2RlIGJlaW5nIHdyYXBwZWQgZG9lcyBub3QgZXZlbiBoYXZlIHRvIHVzZSBzaGFyZWRfcHRyLCBTV0lHIGNhbiB1c2UKICAgICAgICAgICAgICBzaGFyZWRfcHRyIGFzIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIGluc3RlYWQgb2YgYSByYXcgcG9pbnRlciBkdWUgdG8gCiAgICAgICAgICAgICAgdGhlIHR5cGVtYXBzIGluIGdyb3VwIChiKSBhYm92ZS4KICAgICAgICAgICAgLSBObyBhcnJheSBzdXBwb3J0IGFzIHNoYXJlZF9wdHIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheXMuCiAgICAgICAgICAgIC0gVGhpcyB3b3JrcyBxdWl0ZSBkaWZmZXJlbnRseSB0byB0aGUgdXN1YWwgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgd2hlbgogICAgICAgICAgICAgIG9wZXJhdG9yLT4gaXMgcGFyc2VkIGJ5IFNXSUc6CiAgICAgICAgICAgICAgLSBBbiBhZGRpdGlvbmFsIHNtYXJ0IHBvaW50ZXIgY2xhc3MgaXMgbm90IGdlbmVyYXRlZCByZWR1Y2luZyBjb2RlIGJsb2F0IGluCiAgICAgICAgICAgICAgICB0aGUgd3JhcHBlcnMuCiAgICAgICAgICAgICAgLSBVc2luZyBzbWFydCBwb2ludGVycyBhbmQgcmF3IHBvaW50ZXJzIGNhbiBiZSBtaXhlZCBzZWFtbGVzc2x5LgogICAgICAgICAgICAgIC0gTWlzc2luZyBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBzbWFydCBwb2ludGVycyBpcyBubyBsb25nZXIgYSBwcm9ibGVtIGFuZCBzbwogICAgICAgICAgICAgICAgc2VwYXJhdGUgZmFjdG9yeSB0eXBlIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSB0byBiZSB3cml0dGVuIGFuZCB3cmFwcGVkLgogICAgICAgICAgICAgIC0gVGhlIGltcGxpY2l0IEMrKyBzaGFyZWRfcHRyPCBkZXJpdmVkIGNsYXNzID4gdG8gc2hhcmVkX3B0cjwgYmFzZSBjbGFzcyA+CiAgICAgICAgICAgICAgICBjYXN0IGFsc28gd29ya3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhpcyBuZWdhdGVzIHRoZSBuZWNlc3NpdHkgdG8gd3JpdGUKICAgICAgICAgICAgICAgIGFuIGV4cGxpY2l0IGhlbHBlciBjYXN0IGZ1bmN0aW9uIHByb3ZpZGluZyB0aGUgdXBjYXN0IHdoaWNoIHdvdWxkIG5lZWQKICAgICAgICAgICAgICAgIGNhbGxpbmcgcHJpb3IgdG8gcGFzc2luZyBhIGRlcml2ZWQgY2xhc3MgdG8gYSBtZXRob2QgdGFraW5nIGEgc2hhcmVkX3B0ciB0bwogICAgICAgICAgICAgICAgYSBiYXNlIGNsYXNzLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHN1cHBvcnQgZm9yIG92ZXJyaWRpbmcgdGhlIGNsYXNzIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB2aWEgYSBuZXcKICAgICAgICAgICAgInNtYXJ0cHRyIiBmZWF0dXJlLiBUaGlzIGlzIGEgdmVyeSBsb3cgbGV2ZWwgb2YgY3VzdG9taXNhdGlvbiBtb3N0IHVzZXJzCiAgICAgICAgICAgIHdvdWxkIG5ldmVyIG5lZWQgdG8ga25vdy4gVGhlIGZlYXR1cmUgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgaW50cnVzaXZlIAogICAgICAgICAgICBzbWFydCBwb2ludGVycyBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgdHlwZW1hcHMuIEV4YW1wbGUgdXNhZ2Ugb2YgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9MSkgRm9vIHsgYm9vc3Q6OnNoYXJlZF9wdHI8IEZvbyA+IH0KICAgICAgICAgICAgICBjbGFzcyBGb28ge307CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIEZvb19zd2lncmVnaXN0ZXIgZnVuY3Rpb24gd2lsbCB0aGVuIHJlZ2lzdGVyIGJvb3N0OjpzaGFyZWQgPCBGb28gPgogICAgICAgICAgICAoU1dJR1RZUEVfcF9ib29zdF9fc2hhcmVkX3B0clRGb29fdCBpbnN0ZWFkIG9mIFNXSUdUWVBFX3BfRm9vKSBhcyB0aGUgdW5kZXJseWluZwogICAgICAgICAgICB0eXBlIGZvciBpbnN0YW50aWF0aW9ucyBvZiBGb28uCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGZWF0dXJlcyBub3cgc3VwcG9ydHMgdGhlIG9wdGlvbmFsICdub2Jsb2NrJyBhdHRyaWJ1dGUgZm9yIGFsbCB1c2FnZSBvZiAlZmVhdHVyZS4gCiAgICAgICAgICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgeyB9IGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmZWF0dXJlIGNvZGUuIFRoaXMgaXMgaWRlbnRpY2FsCiAgICAgICAgICAgIGluIGJlaGF2aW91ciB0byB1c2FnZSBvZiAnbm9ibG9jaycgaW4gdHlwZW1hcHMgYW5kIGlzIHVzZWQgd2hlbiB0aGUgcHJlcHJvY2Vzc29yCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9wZXJhdGUgb24gdGhlIGNvZGUgaW4gdGhlIGZlYXR1cmUgYW5kIHRoZSBlbmNsb3NpbmcgeyB9IGJyYWNlcwogICAgICAgICAgICBhcmUgbm90IHJlcXVpcmVkLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBmb28KICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPSIxIikgeyBGT086OmJhciB9CgogICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIHRoZW4gcmVkdWNlcyB0aGlzIGFzIGlmIHRoaXMgaGFkIGJlZW4gdXNlZCBpbnN0ZWFkOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiKSAiZm9vOjpiYXIiCgowMi8wMS8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGZvcm1hdCBzdHJpbmcgYnVnIChTRiMxODgyMjIwKS4KCjAxLzMxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9ucyB0byB0aGUgJXR5cGVzIGRpcmVjdGl2ZS4gTm93IHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGNhbiBiZQogICAgICAgICAgICBvdmVycmlkZGVuIHRvIHNvbWUgY3VzdG9tIGNvZGUgaW4gdGhlICV0eXBlcyBkaXJlY3RpdmUsIGxpa2Ugc286CgogICAgICAgICAgICAgICV0eXBlcyhmcm9tdHlwZSA9IHRvdHlwZSkgJXsKICAgICAgICAgICAgICAgIC4uLiBjb2RlIHRvIGNvbnZlcnQgZnJvbXR5cGUgdG8gdG90eXBlIGFuZCByZXR1cm4gLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBzcGVjaWFsIHZhcmlhYmxlICRmcm9tIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBvZiB0aGUKICAgICAgICAgICAgdHlwZSBiZWluZyBjb252ZXJ0ZWQgZnJvbS4gVGhlIGNvZGUgbXVzdCByZXR1cm4gdGhlIHRvdHlwZSBjYXN0IHRvIHZvaWQgKi4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVGltZTsKICAgICAgICAgICAgICBjbGFzcyBEYXRlOwogICAgICAgICAgICAgIERhdGUgJlRpbWU6OmRhdGVGcm9tVGltZSgpOwoKICAgICAgICAgICAgICAldHlwZXMoVGltZSA9IERhdGUpICV7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKikkZnJvbTsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgcmVzdWx0aW5nIGluIHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpfcF9UaW1lVG9fcF9EYXRlKHZvaWQgKngpIHsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKXg7CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBpcyBhZHZhbmNlZCB1c2FnZSwgcGxlYXNlIHVzZSBvbmx5IGlmIHlvdSB1bmRlcnN0YW5kIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLgoKMDEvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBTbWFsbCB1cGRhdGUgdG8gZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sLCB0byB3YXJuIGFib3V0IHVzZSBvZiBsb2NhbCAKCSAgICB2YXJpYWJsZXMgaW4gdHlwZW1hcHMgZm9yIG11bHRpcGxlIHR5cGVzLgoKMDEvMjUvMjAwODogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IGJ1ZyByZXBvcnRlZCBieSBLZXZpbiBNaWxscyBpbiBBUlJBWVNPRkNMQVNTRVMgdHlwZW1hcHMgd2hlcmUgYW55CiAgICAgICAgICAgIGNoYW5nZXMgbWFkZSB0byBhbiBhcnJheSBlbGVtZW50IHBhc3NlZCBmcm9tIEphdmEgdG8gQyBhcmUgbm90IHJlZmxlY3RlZCBiYWNrCiAgICAgICAgICAgIGludG8gSmF2YS4KCjAxLzI0LzIwMDg6IG1nb3NzYWdlCgkgICAgTW9yZSB1cGRhdGVzIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgIEFsc28gbG9va3MgaW4gL3Vzci9pbmNsdWRlL2x1YSoKCSAgICBBbHNvIGNoYW5nZWQgdHlwZW1hcHMuaSBub3QgdG8gY2hlY2sgZm9yIE5VTEwgYmVmb3JlIGZyZWVpbmcgYSBwb2ludGVyCgowMS8yMS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZvciBTVEwgY29udGFpbmVycywgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8gY29udmVydCBmcm9tIG9uZQogICAgICAgICAgICBTVEwgY29udGFpbmVyIHRvIGFub3RoZXIsIGVnIGZyb20gc3RkOjp2ZWN0b3I8aW50PiB0byBzdGQ6OnZlY3Rvcjxkb3VibGU+CiAgICAgICAgICAgIG9yIHN0ZDo6bGlzdDxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGludD4gb3IgZXZlbiBzdGQ6OnZlY3RvcjxGb28+IHRvCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJhcj4gYXMgaXQgcHJldmlvdXNseSBkaWQuIEluIGZhY3QgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8KICAgICAgICAgICAgY29udmVydCBhbnkgU1dJRyB3cmFwcGVkIEMrKyBwcm94eSBjbGFzcyB0aGF0IGlzIGFsc28gYSBQeXRob24gc2VxdWVuY2UsCiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZC4gQW55IG5vbi1TV0lHIFB5dGhvbiBzZXF1ZW5jZSB3aWxsIHN0aWxsIGJlCiAgICAgICAgICAgIGFjY2VwdGVkIHdoZXJldmVyIGFuIFNUTCBjb250YWluZXIgaXMgYWNjZXB0ZWQuIE92ZXJsb2FkZWQgbWV0aG9kcyB1c2luZwogICAgICAgICAgICBjb250YWluZXJzIHNob3VsZCBiZSBmYXN0ZXIuCgowMS8xOC8yMDA4OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICdkaXJlY3RvcmluYXR0cmlidXRlcycgYW5kICdkaXJlY3Rvcm91dGF0dHJpYnV0ZXMnIHR5cGVtYXAgYXR0cmlidXRlcwogICAgICAgICAgICBmb3IgdGhlIGltdHlwZSB0eXBlbWFwLiBUaGVzZSBzaG91bGQgY29udGFpbiBDIyBhdHRyaWJ1dGVzIHdoaWNoIHdpbGwKICAgICAgICAgICAgYmUgZ2VuZXJhdGVkIGludG8gdGhlIEMjIGRpcmVjdG9yIGRlbGVnYXRlIG1ldGhvZHMuCgowMS8xOC8yMDA4OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIGJ5dGUgdmFsdWUgMjU1IGluIGlucHV0IGZpbGVzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIGNoYXIgaXMgc2lnbmVkIChpdCB3YXMgZ2V0dGluZyBtYXBwZWQgdG8gRU9GKS4gIEZpeGVzIFNGIzE1MTgyMTkuCgowMS8xNi8yMDA4OiB3c2Z1bHRvbgoJICAgIEZpeCB0ZW1wbGF0ZSBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZWQgYnkgYSBzbWFydCBwb2ludGVyLiBCdWcgcmVwb3J0ZWQgCiAgICAgICAgICAgIGJ5IFJvYmVydCBMdXB0b24uCgowMS8xNC8yMDA4OiBtZ29zc2FnZQoJICAgIFN1YnN0YW50aWFsIGNoYW5nZXMgdG8gY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICAgIENvZGUgY2FuIG5vdyBsaW5rIHRvIGxpYmx1YS5hLCBsaWJsdWE1MC5hIG9yIGxpYmx1YTUxLmEKCSAgICAgIEl0J3MgYWxzbyBhIGxvdCBuZWF0ZXIgbm93LgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gQmFja2VkIG91dCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MzI2MTMgLSBUZW1wbGF0ZXMgYW5kIHNvbWUgdHlwZWRlZnMgaW52b2x2aW5nIHBvaW50ZXJzIG9yIGZ1bmN0aW9uIHBvaW50ZXJzCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzE2MzI2MjUgLSBDb21waWxhdGlvbiBlcnJvcnMgb24gVmlzdWFsIEMrKyA2IHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MTk4NDcgJXRlbXBsYXRlIHdpdGgganVzdCBvbmUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBpbnQ+IGNsYXNzIEZvbyB7Li4ufTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vRGVmYXVsdCkgRm9vPD47CgoxMi8xMi8yMDA3OiBtZ29zc2FnZQoJICAgIFtMdWFdIFNtYWxsIGNvcnJlY3Rpb24gb24gTHVhLmh0bWwKCjEyLzA5LzIwMDc6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzE4MzgyNDggZnJvbSBNb250eSBUYXlsb3IgZm9yIHZwYXRoIGJ1aWxkcyBvZiBTV0lHLgoKMTIvMDgvMjAwNzogd3NmdWx0b24KCSAgICBbTHVhXSBGaXhlcyB0byByZW1vdmUgZ2NjLTQuMiB3YXJuaW5ncwoKMTIvMDYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE3MzQ0MTUgLSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgdF9pdGVtLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgdF9hbGxvYyA9IHBmYzo6YWxsb2NfZmFzdCA+CiAgICAgICAgICAgICAgICBjbGFzcyBsaXN0X3QgOiBwdWJsaWMgbGlzdF9pbXBsX3Q8dF9pdGVtLHBmYzo6YXJyYXlfdDx0X2l0ZW0sdF9hbGxvYz4gPiB7IC4uLiB9OwoKMTIvMDQvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBGaXggYSBidWcgaW4gdGhlIGNsYXNzIGhpZXJhY2h5IGNvZGUsIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgbm90IHByb3BhZ2F0ZWQsIAoJICAgIGlmIHRoZSBuYW1lIG9yZGVyaW5nIHdhcyBpbiBhIGNlcnRhaW4gb3JkZXIuCgkgICAgQWRkZWQgbmV3IGV4YW1wbGUgcHJvZ3JhbXMgKGR1YWwsIGVtYmVkKSBhbmQgcnVudGltZSB0ZXN0cyBmb3IgdGVzdC1zdWl0ZS4KCjExLzMwLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4IHVzaW5nIHN0YXRlbWVudHMgdXNpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG92ZXJsb2FkZWQuCiAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlIHVzaW5nIHN0YXRlbWVudHMgYW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMsIHRoZXNlCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSB3cmFwcGVycywgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZnVuaygpOwogICAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6ZnVuazsKICAgICAgICAgICAgICB9OwoKVmVyc2lvbiAxLjMuMzMgKE5vdmVtYmVyIDIzLCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMS8yMDA3OiBtaWtlbAoJICAgIFthbGxlZ3JvY2xdIG9taXQgcHJpdmF0ZSBzbG90IHR5cGUgaW5mbyBpbiB0aGUgY2xhc3Nlcy90eXBlcwoJICAgIGRlZmluZWQgb24gdGhlIGxpc3Agc2lkZS4gRml4IGJ1ZyBpbiBtYXBwaW5nIG9mIEMvKysgdHlwZXMKCSAgICB0byBsaXNwIHR5cGVzLiBGaXggdHlwbyBpbiBtb2R1bGVzIGdlbmVyYXRlZCBkZWZwYWNrYWdlIGZvcm0uCgkgICAgSGF2ZSBzdGQ6OnN0cmluZyAqJ3MgYXV0b21hdGljYWxseSBtYXJzaGFsbGVkIGJldHdlZW4gZm9yZWlnbgoJICAgIGFuZCBsaXNwIHN0cmluZ3MuCgkKMTEvMjAvMjAwNzogb2xseQoJICAgIFtQeXRob25dIEZpbGwgaW4gUHl0aG9uIERpY3Rpb25hcnkgZnVuY3Rpb25zIGxpc3QgKHBhdGNoIGZyb20KCSAgICBKZWxtZXIgVmVybm9vaWogcG9zdGVkIHRvIHN3aWctZGV2ZWwpLgoKMTEvMjAvMjAwNzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgQyBzY2FubmVyIHJlbGF0ZWQgdG8gYmFja3NsYXNoIGNoYXJhY3RlcnMuCgoxMS8xOS8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggYnJva2VuIGNvbXBpbGF0aW9uIG9mIEMrKyB3cmFwcGVycyBvbiBzb21lIGNvbXBpbGVycy4KCjExLzE2LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBEb24ndCBwYXNzIFB5X3NzaXplX3QgZm9yIGEgJWQgcHJpbnRmLWxpa2UgZm9ybWF0IGFzCgkgICAgdGhhdCdzIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiBzaXplb2YoUHlfc3NpemVfdCkgIT0gc2l6ZW9mKGludCkuCgpWZXJzaW9uIDEuMy4zMiAoTm92ZW1iZXIgMTUsIDIwMDcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzE0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBQYWNrYWdlIG5hbWUgYW5kIGRsbCBuYW1lIGlzIG5vdyB0aGUgc2FtZSBhcyB0aGUgU1dJRyBtb2R1bGUKICAgICAgICAgICAgbmFtZS4gSXQgdXNlZCB0byBiZSB0aGUgbW9kdWxlIG5hbWUgd2l0aCBfd3JhcCBhcyBhIHN1ZmZpeC4gVGhlIHBhY2thZ2UKICAgICAgICAgICAgYW5kIGRsbCBuYW1lcyBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgdGhlIC1wYWNrYWdlIGFuZCAtZGxsIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzExLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBBZGQgc3VwcG9ydCBmb3IgV2luZG93cyAoVmlzdWFsIEMrKyA4IHRlc3RlZCkKCjExLzEwLzIwMDc6IG9sbHkKCSAgICBbcGhwXSBGaXggbWFrZWZpbGUgZ2VuZXJhdGVkIGJ5IC1tYWtlIChTRiMxNjMzNjc5KS4gIFVwZGF0ZQoJICAgIGRvY3VtZW50YXRpb24gdG8gbWFyayAiLW1ha2UiIGFzIGRlcHJlY2F0ZWQgKG5vbmUgb2YgdGhlIG90aGVyCgkgICAgU1dJRyBiYWNrZW5kcyBzZWVtIHRvIG9mZmVyIHN1Y2ggYSBmZWF0dXJlLCBpdCBjYW4ndCByZWFsaXN0aWNhbGx5CgkgICAgZ2VuZXJhdGUgYSBmdWxseSBwb3J0YWJsZSBtYWtlZmlsZSwgYW5kIHRoZSBjb21tYW5kcyB0byBidWlsZCBhbgoJICAgIGV4dGVuc2lvbiBhcmUgZWFzeSBlbm91Z2ggdG8gd3JpdGUgZm9yIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGJ1aWxkCgkgICAgdG9vbCkuICBBbHNvIHJlY29tbWVuZCBhZ2FpbnN0IHRoZSB1c2Ugb2YgIi1waHBmdWxsIiAoaXQncyBvbmx5CgkgICAgcmVhbGx5IHVzZWZ1bCB3aGVuIHN0YXRpYyBsaW5raW5nLCBhbmQgYSBkeW5hbWljYWxseSBsb2FkYWJsZQoJICAgIG1vZHVsZSBpcyB2aXJ0dWFsbHkgYWx3YXlzIHRoZSBiZXR0ZXIgYXBwcm9hY2gpLgoKMTEvMDkvMjAwNzogb2xseQoJICAgIEZpeCAtLWhlbHAgb3V0cHV0IHRvIG5vdGUgdGhhdCBgZXhwb3J0IFNXSUdfRkVBVFVSRVMnIGlzIHJlcXVpcmVkLgoKMTAvMjkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCBzZWcgZmF1bHQgb24gV2luZG93cwogICAgICAgICAgICBbUl0gRXhhbXBsZXMgUiBzY3JpcHRzIGFyZSBub3cgcGxhdGZvcm0gaW5kZXBlbmRlbnQKCjEwLzMwLzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gZml4ZWQgYnVnIGluIHRlbXBsYXRlIGNsYXNzZXMgd2hpY2ggY2FzZXMgdGVtcGxhdGVfZGVmYXVsdDIKCSAgICBhbmQgdGVtcGxhdGVfc3BlY2lhbGl6YXRpb25fZGVmYXJnIHRvIGZhaWwuCgkgICAgQWRkZWQgc2V2ZXJhbCB3YXJuaW5nIGZpbHRlcnMgaW50byB0aGUgb3ZlcmxvYWQncyB0ZXN0IGNhc2VzLgoJICAgIEFkZGVkIHJ1bnRpbWUgdGVzdHMgZm9yIHNldmVyYWwgY29kZXMuCgkgICAgWW91IGNhbiBub3cgbWFrZSBjaGVjay1sdWEtdGVzdC1zdWl0ZSB3aXRoIG5vIGVycm9ycyBhbmQgb25seSBhIGZldyB3YXJuaW5ncy4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgY29uZmlndXJlIHRlc3QgdG8gcHV0IEdVSUxFTElOSyBpbiBMSUJTIG5vdCBMREZMQUdTCgkgICAgKFNGIzE4MjI0MzApLgoKMTAvMzAvMjAwNzogb2xseQoJICAgIFtndWlsZV0gRml4IHRoZSBndWlsZSBleGFtcGxlcyBvbiA2NC1iaXQgcGxhdGZvcm1zLgoKMTAvMjkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggbWVtYmVyIHBvaW50ZXJzIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCgoxMC8yOC8yMDA3OiBvbGx5CgkgICAgW2x1YV0gRml4IHN3aWdfbHVhX2NsYXNzIGluc3RhbmNlcyB0byBiZSBzdGF0aWMgdG8gYWxsb3cgbXVsdGlwbGUKCSAgICBTV0lHIHdyYXBwZXJzIHRvIGJlIGNvbXBpbGVkIGludG8gdGhlIHNhbWUgZXhlY3V0YWJsZSBzdGF0aWNhbGx5LgoJICAgIFBhdGNoIGZyb20gQW5kcmVhcyBGcmVkcmlrc3NvbiAocG9zdGVkIHRvIHRoZSBzd2lnIG1haWxpbmcgbGlzdCkuCgoxMC8yOC8yMDA3OiBvbGx5CgkgICAgW2x1YV0gRml4IEV4YW1wbGVzL2x1YSB0byBwYXNzIFNSQ1MgZm9yIEMgdGVzdHMgcmF0aGVyIHRoYW4gQ1hYU1JDUy4KCSAgICBUaGUgY29kZSBhcyBpdCB3YXMgaGFwcGVuZWQgdG8gd29yayBvbiB4ODYsIGJ1dCBicm9rZSBvbiB4ODZfNjQgKGFuZAoJICAgIHByb2JhYmx5IGFueSBvdGhlciBwbGF0Zm9ybXMgd2hpY2ggcmVxdWlyZSAtZlBJQykuCgoxMC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE5ldyBhcHByb2FjaCBmb3IgZml4aW5nIHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgdXNhZ2Ugb24gZXJyb3IgaW4gZGlyZWN0b3IKICAgICAgICAgICAgbWV0aG9kcyB1c2luZyB0aGUgbmV3IHRlbXBsYXRlZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBTd2lnVmFsdWVJbml0KCkuCgoxMC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gVXNlIG1vcmUgZWZmaWNpZW50IFN2UFZfbm9sZW4oeCkgaW5zdGVhZCBvZiBTdlBWKHgsUExfbmEpIGlmIFN2UFZfbm9sZW4gaXMKICAgICAgICAgICAgc3VwcG9ydGVkLgoKMTAvMjYvMjAwNzogd3V6emViCgkgICAgW0NoaWNrZW5dIEZpeCBnbG9iYWwgdmFyaWFibGVzIG9mIGNsYXNzIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KCSAgICBPdGhlciBtaW5vciBmaXhlcywgc28gYWxsIHRlc3RzIGluIHRoZSBjaGlja2VuIHRlc3Qgc3VpdGUgbm93IHBhc3MKCjEwLzI1LzIwMDc6IG9sbHkKCSAgICBGaXggVVRMIHR5cGVjaGVjayBtYWNybyBmb3IgYSBmdW5jdGlvbiB0YWtpbmcgY2hhcltdIG9yIGNvbnN0CgkgICAgY2hhcltdIChTRiMxODIwMTMyKS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpbHRlciBvdXQgLWFuc2kgLXBlZGFudGljIGZyb20gQ0ZMQUdTIHdoaWxlIGNvbXBpbGluZyB0ZXN0IHByb2dyYW1zIGZvciBHdWlsZQoJICAgIGluIGNvbmZpZ3VyZS4gIFRoaXMgZW5hYmxlcyBydW5uaW5nIHRoZSB0ZXN0IHN1aXRlIGZvciBHdWlsZSBpZiBpdCBpcyBpbnN0YWxsZWQgYW5kCgkgICAgdXNhYmxlLgoKMTAvMjIvMjAwNzogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXSBGaXggdGVzdGNhc2VzIGFwcGx5X3NpZ25lZF9jaGFyIGFuZCBhcHBseV9zdHJpbmdzCgkgICAgYnkgYWRkaW5nIGV4cGxpY2l0IGNhc3RzIHRvIHRoZSBhcHByb3ByaWF0ZSAkbHR5cGUuCgoxMC8yMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yIG1ldGhvZHMuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEJ1ZyAjMTc5NDI0NyAtIGZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgZGVyaXZlZCBjbGFzc2VzIHdoZW4gY3NiYXNlIG9yIGphdmFiYXNlCiAgICAgICAgICAgIHR5cGVtYXBzIGFyZSB1c2VkIHdpdGggdGhlIHJlcGxhY2U9IjEiIGF0dHJpYnV0ZS4KCjEwLzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIERvY3MgdXBkYXRlZCB0byBzdWdnZXN0IHVzaW5nIGRpc3R1dGlscy4gUGF0Y2ggIzE3OTY2ODEgZnJvbSBDaHJpc3RvcGhlciBCYXJrZXIuCgoxMC8xOS8yMDA3OiBvbGx5CgkgICAgW3Blcmw1XSBDbGVhciBlcnJubyBiZWZvcmUgY2FsbHMgdG8gc3RydG9sKCksIHN0cnRvdWwoKSwgc3RydG9sbCgpCgkgICAgYW5kIHN0cnRvdWxsKCkgd2hpY2ggd2UgY2hlY2sgZXJybm8gYWZ0ZXIgdG8gYXZvaWQgc2VlaW5nIGEganVuawoJICAgIHZhbHVlIG9mIGVycm5vIGlmIHRoZXJlIGlzbid0IGFuIGVycm9yIGluIHRoZSBjYWxsLgoKMTAvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlICVhdHRyaWJ1dGVfcmVmIGFuZCByZXBsYWNlIHdpdGggJWF0dHJpYnV0ZXJlZi4gVGhlcmUgaXMganVzdCBhbiBhcmd1bWVudAogICAgICAgICAgICBvcmRlciBjaGFuZ2UgaW4gb3JkZXIgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCAlYXR0cmlidXRlLCBmcm9tOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlX3JlZihDbGFzcywgQXR0cmlidXRlVHlwZSwgQWNjZXNzb3JNZXRob2QsIEF0dHJpYnV0ZU5hbWUpCiAgICAgICAgICAgIHRvCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZXJlZihDbGFzcywgQXR0cmlidXRlVHlwZSwgQXR0cmlidXRlTmFtZSwgQWNjZXNzb3JNZXRob2QpCgoxMC8xNi8yMDA3OiBvbGx5CgkgICAgW1RjbF0gRml4IHNldmVyYWwgb2NjdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbgoJICAgIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysKCSAgICBjb2RlLgoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtQSFBdIEZpeCBtYW55IG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbQoJICAgIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrIGNvZGUKCSAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGEgbmV3IGVub3VnaCB2ZXJzaW9uIG9mIFBIUCA1ICh0ZXN0ZWQgd2l0aAoJICAgIFBIUCA1LjIuMywgYnV0IFBIUCA1LjIuMSBpcyBwcm9iYWJseSB0aGUgbWluaW11bSByZXF1aXJlbWVudCkuCgoxMC8xNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMTc5NzEzMyBmcm9tIERhdmlkIFBpZXBncmFzcyBmaXhlcyAlYXR0cmlidXRlIHdoZW4gdGhlIGdldHRlciBoYXMgdGhlIHNhbWUgbmFtZQogICAgICAgICAgICBhcyB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIG5vIGxvbmdlciBnZW5lcmF0ZSBub24tZnVuY3Rpb25hbCBzZXR0ZXIgZm9yIHJlYWQtb25seSBhdHRyaWJ1dGVzLgoKMTAvMTUvMjAwNzogb2xseQoJICAgIFtUY2xdIFByZXZlbnQgU1dJR19UY2xfQ29udmVydFB0ciBmcm9tIGNhbGxpbmcgdGhlIHVua25vd24gcHJvYy4KCSAgICBBZGQgRXhhbXBsZXMvdGNsL3N0ZF92ZWN0b3IvIHdoaWNoIHRoaXMgY2hhbmdlIGZpeGVzLiAgUGF0Y2gKCSAgICBpcyBmcm9tICJDbGlmZiBDIiBpbiBTRiMxODA5ODE5LgoKMTAvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBEZXRhY2hDdXJyZW50VGhyZWFkIGJhY2sgaW4gZm9yIGRpcmVjdG9ycy4gU2VlIGVudHJ5IGRhdGVkIDA4LzExLzIwMDYgYW5kCiAgICAgICAgICAgIHNlYXJjaCBmb3IgRGV0YWNoQ3VycmVudFRocmVhZCBvbiB0aGUgbWFpbGluZyBsaXN0cyBmb3IgZGV0YWlscy4gVGhlIGNyYXNoZXMgb24gU29sYXJpcwogICAgICAgICAgICBzZWVtIHRvIGJlIG9ubHkgcHJlc2VudCBpbiBqZGstMS40LjIgYW5kIGxvd2VyIChqZGstMS41LjAgYW5kIGpkay0xLjYuMCBhcmUgb2theSksIHNvCiAgICAgICAgICAgIGFueW9uZSB1c2luZyBkaXJlY3RvcnMgc2hvdWxkIHVzZSBhIHJlY2VudCBqZGsgb24gU29sYXJpcywgb3IgZGVmaW5lIChzZWUgZGlyZWN0b3Iuc3dnKQogICAgICAgICAgICBTV0lHX0pBVkFfTk9fREVUQUNIX0NVUlJFTlRfVEhSRUFEIHRvIHRoZSBDKysgY29tcGlsZXIgdG8gZ2V0IG9sZCBiZWhhdmlvdXIuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgQyBjb21tZW50cyBpbiB0aGUganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcy4KCjEwLzEyLzIwMDc6IHd1enplYgoJICAgIEFkZGVkIGEgdGVzdHN1aXRlIGVudHJ5IGZvciBCdWcgIzE3MzU5MzEKCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBdXRvbWF0aWNhbGx5IHJlcnVuIGF1dG9nZW4uc2ggaWYgY29uZmlndXJlLmluIGlzIG1vZGlmaWVkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEVuaGFuY2UgY2hlY2stJS10ZXN0LXN1aXRlIHJ1bGUgYW5kIGZyaWVuZHMgdG8gZ2l2ZSBhIG1vcmUgaGVscGZ1bAoJICAgIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0aGVtIGZvciBhIGxhbmd1YWdlIHdoaWNoIGRvZXNuJ3QgZXhpc3QKCSAgICAoZS5nLiAibWFrZSBjaGVjay1waHAtdGVzdC1zdWl0ZSIgcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKCSAgICAibWFrZSBjaGVjay1waHA0LXRlc3Qtc3VpdGUiKS4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBZGQgbWFrZSBydWxlIHRvIHJlZ2VuZXJhdGUgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5pbiBpZiBpdCBoYXMKCSAgICBjaGFuZ2VkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBsb25nLXN0YW5kaW5nIG1lbW9yeSBsZWFrIGluIHdyYXBwZWQgY29uc3RydWN0b3JzIGFuZAoJICAgIHdyYXBwZWQgZnVuY3Rpb25zL21ldGhvZHMgd2hpY2ggcmV0dXJuIGFuIG9iamVjdC4KCjEwLzA4LzIwMDc6IG9sbHkKCSAgICBGaXggTWFrZWZpbGUuaW4gdG8gcmVhZCBjaGVjay5saXN0IGZpbGVzIGNvcnJlY3RseSBpbiBhIFZQQVRICgkgICAgYnVpbGQuCgoxMC8wNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkCgowOS8yNy8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGFkZGVkIG1vcmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IHR5cGVjaGVja3MuCgkgICAgQWRkZWQgYSByb3V0aW5lIHdoaWNoIGNoZWNrcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGEgZnVuY3Rpb24KCSAgICAoYnJlYWtzIG9wZXJhdG9yX292ZXJsb2FkaW5nIGZvciB1bmFyeSBtaW51cyBvcGVyYXRvciwgY3VycmVudGx5IGRpc2FibGVkKS4KCSAgICBSZW9yZ2FuaXNlZCB0aGUgbHVhdHlwZW1hcHMuc3dnIHRvIHRpZHkgaXQgdXAuCgkgICAgQWRkZWQgYSBsb3Qgb2YgJWlnbm9yZXMgb24gdGhlIG9wZXJhdG9ycyBub3Qgc3VwcG9ydGVkIGJ5IGx1YS4KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBjb25zdGFudCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgJiBydW50ZXN0IGZvciBtZW1iZXJfcG9pbnRlci5pCgkgICAgQWRkZWQgZmlyc3QgdmVyc2lvbiBvZiB3Y2hhci5pCgowOS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIHRocm93cyB0eXBlbWFwcyBmb3Igc3RkOjp3c3RyaW5nIHVzaW5nIEMjIHBhdGNoICMxNzk5MDY0IGZyb20gRGF2aWQgUGllcGdyYXNzCgowOS8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSAjMTc3MTMxMyB0byBmaXggYnVnICMxNjUwMjI5IC0gZml4ZXMgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcKICAgICAgICAgICAgaGFuZGxpbmcuCgowOS8yMC8yMDA3OiBvbGx5CgkgICAgW0phdmFdIEVsaW1pbmF0ZSBzb21lIHVubmVjZXNzYXJ5IHVzZXMgb2YgYSB0ZW1wb3JhcnkgYnVmZmVyCgkgICAgYWxsb2NhdGVkIHVzaW5nIG5ld1tdLiAgU0YjMTc5NjYwOS4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgY2FuIGJlIHVzZWQgaW4gdGhlIGNzdmFyaW4gdHlwZW1hcCB3aGVyZSBpdCBpcyBhbHdheXMKICAgICAgICAgICAgZXhwYW5kZWQgdG8gJ3ZhbHVlJy4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGJ1ZyByZXBvcnRlZCBieSBHbGVubiBBIFdhdHNvbiBhbmQgIzE3OTUyNjAgd2hlcmUgdGhlIGNzdHlwZSB0eXBlbWFwIHVzZWQgdGhlICdyZWYnCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIHR5cGVtYXAgYm9keSwgaXQgcHJvZHVjZWQgdW5jb21waWxhYmxlIEMjIHByb3BlcnRpZXMgKHZhcmlhYmxlIHdyYXBwZXJzKS4KICAgICAgICAgICAgVGhlIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSBub3cgY29ycmVjdGx5IGNvbWVzIGZyb20gdGhlICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgY3N0eXBlIHR5cGVtYXAuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGNvbnN0IHN0ZDo6d3N0cmluZyYgdHlwZW1hcHMKCjA5LzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciByZWZlcmVuY2UsIGVnIGluIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlIHBnY3BwCiAgICAgICAgICAgIGlzIGFsc28gZ2VuZXJhdGVkIG5vdyB3aGVuIHVzZXIncyBjdXN0b20gdHlwZW1hcHMgdXNlIGEgcHJveHkgY2xhc3MgaW4gdGhlIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFuZCBhICdsb25nJyBpbiB0aGUganR5cGUgdHlwZW1hcC4KCjA5LzE4LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlcnMgb2YgdHlwZSBzdGQ6OnN0cmluZyAmCgkgICAgd2hpY2ggYXJlIG1vZGlmaWVkIGJ5IHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNwbGl0IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5nIGxpdGVyYWxzIHRvIGF2b2lkIGhpdHRpbmcKCSAgICBNU1ZDJ3MgbG93IGZpeGVkIGxpbWl0IG9uIHN0cmluZyBsaXRlcmFsIGxlbmd0aCAtIHBhdGNoIGZyb20KCSAgICBTRiMxNzIzNzcwLCBhbHNvIHJlcG9ydGVkIGFzIFNGIzE2MzA4NTUuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW29jYW1sXSBGaXggcmVuYW1pbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBtZXRob2RfdGFibGUgLQoJICAgIG15IHBhdGNoIGZyb20gU0YjOTQwMzk5LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNpbXBsZXIgY29kZSBmb3IgU1dJR19Bc1ZhbF9ib29sKCkgd2hpY2ggZml4ZXMgYSAic3RyaWN0CgkgICAgYWxpYXNpbmciIHdhcm5pbmcgZnJvbSBHQ0MgLSBwYXRjaCBmcm9tIFNGIzE3MjQ1ODEgYnkgQW5kcmV3CgkgICAgQmF1bWFubi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIFVzZSBzdl9zZXRwdm4oKSB0byBzZXQgYSBzY2FsYXIgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aAoJICAgIC0gcGF0Y2ggZnJvbSBTRiMxNzQ0NjAgYnkgIm1hdHN1YmFyYXkiLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFdoZW4gd3JhcHBpbmcgQysrIGNvZGUsIGdlbmVyYXRlIGNvZGUgd2hpY2ggdXNlcwoJICAgIHN0ZDo6c3RyaW5nOjphc3NpZ24oUFRSLCBMRU4pIHJhdGhlciB0aGFuIGFzc2lnbmluZwoJICAgIHN0ZDo6c3RyaW5nKFBUUiwgTEVOKS4gIFVzaW5nIGFzc2lnbiBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZQoJICAgICh0ZXN0ZWQgd2l0aCBHQ0MgNC4xLjIpLgoKMDkvMDcvMjAwNzogd3NmdWx0b24KCSAgICBGaXggJWlnbm9yZSBvbiBjb25zdHJ1Y3RvcnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkIFtTRiAjMTc3NzcxMl0KCjA5LzA1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIC0gQ2hhbmdlIHJfbHR5cGUgaW4gdHlwZXN5cy5jIHRvIHN0b3JlIGEgaGFzaHRhYmxlIGluc3RlYWQgb2YgYSBzaW5nbGUgdmFsdWUuCgkgICAgICBzZXZlcmFsIHZlcnkgc3VidGxlIGJ1Z3Mgd2VyZSBiZWluZyBjYXVzZWQgYnkgbXVsdGlwbGUgbHR5cGVzIGJlaW5nIG1hcHBlZAoJICAgICAgdG8gYSBzaW5nbGUgbWFuZ2xlZCB0eXBlLCBtb3N0bHkgd2hlbiB1c2luZyB0eXBlZGVmZWQgdGVtcGxhdGUgcGFyYW1ldGVycy4KCSAgICAgIE5vdywgcl9sdHlwZSBzdG9yZXMgYSBoYXNodGFibGUgb2YgcG9zc2libGUgbHR5cGVzLCBhbmQgd2hlbiBnZW5lcmF0aW5nIHRoZQoJICAgICAgdHlwZSB0YWJsZSwgYWxsIHRoZSBsdHlwZXMgYXJlIGFkZGVkIGludG8gdGhlIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZS4KCjA4LzMxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxNzU0OTY3IGZyb20gSmFtZXMgQmlnbGVyLgogICAgICAgICAgICAtIEZpeCBidWcgaW4gdHVybmluZyBvbiB3YXJuaW5ncyB0aGF0IHdlcmUgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBFZyAnc3dpZyAtdyszMDknIHdpbGwgbm93CiAgICAgICAgICAgICAgdHVybiBvbiB0aGUgbm9ybWFsbHkgc3VwcHJlc3NlZCB3YXJuaW5nIDMwOS4KCiAgICAgICAgICAgIC0gTmV3IC1XZXh0cmEgY29tbWFuZGxpbmUgb3B0aW9uIHdoaWNoIGVuYWJsZXMgdGhlIGV4dHJhIHdhcm5pbmcgbnVtYmVyczoKICAgICAgICAgICAgICAyMDIsMzA5LDQwMyw1MTIsMzIxLDMyMiAodGhpcyBpcyB0aGUgbGlzdCBvZiB3YXJuaW5ncyB0aGF0IGhhdmUgYWx3YXlzIGJlZW4gc3VwcHJlc3NlZCBieQogICAgICAgICAgICAgIGRlZmF1bHQpLiBCeSBzcGVjaWZ5aW5nIC1XZXh0cmEsIGFsbCB3YXJuaW5ncyB3aWxsIGJlIHR1cm5lZCBvbiwgYnV0IHVubGlrZSAtV2FsbCwKICAgICAgICAgICAgICB3YXJuaW5ncyBjYW4gc3RpbGwgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9uL29mZiB1c2luZyAld2FybmZpbHRlciwKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuIG9yIGZ1cnRoZXIgLXcgY29tbWFuZGxpbmUgb3B0aW9ucywgZWc6CiAgICAgICAgICAgICAgICBzd2lnIC1XZXh0cmEgLXczMDkKICAgICAgICAgICAgICB3aWxsIHR1cm4gb24gYWxsIHdhcm5pbmdzIGV4Y2VwdCAzMDkuCgowOC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICAtIE5ldyBkZWJ1Z2dpbmcgb3B0aW9ucywgLWRlYnVnLW1vZHVsZSA8bj4gYW5kIC1kZWJ1Zy10b3AgPG4+IHRvIGRpc3BsYXkgdGhlIHBhcnNlIHRyZWUgYXQKICAgICAgICAgICAgICB2YXJpb3VzIHN0YWdlcywgd2hlcmUgPG4+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RhZ2VzIDEtNC5Gb3IgZXhhbXBsZSwgdG8KICAgICAgICAgICAgICBkaXNwbGF5IHRvcCBvZiBwYXJzZSB0cmVlIGF0IHN0YWdlcyAxIGFuZCAzOgogICAgICAgICAgICAgICAgc3dpZyAtZGVidWctdG9wIDEsMwoKICAgICAgICAgICAgLSBEZXByZWNhdGUgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdoaWNoIGhhdmUgZXF1aXZhbGVudHMgYmVsb3c6CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfbW9kdWxlICAgID0+ICAgLWRlYnVnLW1vZHVsZSAxCiAgICAgICAgICAgICAgLWR1bXBfbW9kdWxlICAgICAgICAgID0+ICAgLWRlYnVnLW1vZHVsZSA0CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfdG9wICAgICAgID0+ICAgLWRlYnVnLXRvcCAxCiAgICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgICAgICAgID0+ICAgLWRlYnVnLXRvcCA0CgogICAgICAgICAgICAtIFJlbmFtZWQgc29tZSBjb21tYW5kbGluZSBvcHRpb25zIGZvciBuYW1pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbCBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAgPT4gICAtZGVidWctdGVtcGxhdGUKICAgICAgICAgICAgICAtZGVidWdfdHlwZW1hcCAgID0+ICAgLWRlYnVnLXR5cGVtYXAKICAgICAgICAgICAgICAtZHVtcF9jbGFzc2VzICAgID0+ICAgLWRlYnVnLWNsYXNzZXMKICAgICAgICAgICAgICAtZHVtcF90YWdzICAgICAgID0+ICAgLWRlYnVnLXRhZ3MKICAgICAgICAgICAgICAtZHVtcF90eXBlZGVmICAgID0+ICAgLWRlYnVnLXR5cGVkZWYKICAgICAgICAgICAgICAtZHVtcF9tZW1vcnkgICAgID0+ICAgLWRlYnVnLW1lbW9yeQoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaGFuZGxpbmcgb2YgZG91YmxlIG9yIGZsb2F0IHBhcmFtZXRlcnMgd2l0aCBhbiBpbnRlZ2VyCgkgICAgZGVmYXVsdCB2YWx1ZS4KCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gR2VuZXJhdGUgX19pc3NldCgpIG1ldGhvZHMgZm9yIHNldHRlcnMgZm9yIFBIUCA1LjEgYW5kIGxhdGVyLgoKMDgvMjAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBkaXJlY3RvciBidWcgIzE3NzY2NTEgcmVwb3J0ZWQgYnkgU3RlcGhhbmUgUm91dGVsb3VzIHdoaWNoIG9jY3VycmVkIHdoZW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IG9mIHNvbWUgb3RoZXIgc3ltYm9scyB1c2VkIHdpdGhpbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MuCgowOC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBDb3JyZWN0IGJlaGF2aW91ciBmb3IgdGVtcGxhdGVkIG1ldGhvZHMgdXNlZCB3aXRoICVyZW5hbWUgb3IgJWlnbm9yZSBhbmQgdGhlIGVtcHR5CiAgICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9uIC0gJXRlbXBsYXRlKCkuIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgdGhlIG1ldGhvZCBoYXMgbm90IGJlZW4KICAgICAgICAgICAgcmVuYW1lZC4KCjA4LzE2LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBOYW1lIGdlbmVyYXRlZCBjbCBmaWxlIGJhc2VkIG9uIGlucHV0IGZpbGUgcmF0aGVyIHRoYW4gYnkKCSAgICBtb2R1bGUgbmFtZS4gSXQgd2FzIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgbXlwYWNrYWdlLmNsIGFuZCBhIHRlc3Rfd3JhcC5jCgkgICAgd2hlbiBwYXJzaW5nIGEgdGVzdC5pIGlucHV0IGZpbGUuIENvbmZ1c2luZy4gQWxzbywgaW5jbHVkZSBleHRlcm5hbC1mb3JtYXQKCSAgICB0ZW1wbGF0ZXMgZm9yIDpmYXQgYW5kIDpmYXQtbGUgYXV0b21hdGljYWxseSB0byBhdm9pZCB0aGVzZSBiZWluZyBjb21waWxlZAoJICAgIGF0IHJ1bnRpbWUuCgowOC8xNS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIEFwcGx5IHBhdGNoICMxNzY2MDc2IGZyb20gTGVpZ2ggU21pdGggYWRkaW5nIHN1cHBvcnQgZm9yIG5ld2x5IGludHJvZHVjZWQKICAgICAgICAgICAgaW4gY2ZmaSA6bG9uZy1sb25nIGFuZCA6dW5zaWduZWQtbG9uZy1sb25nLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBkb2N1bWVudGF0aW9uIHBhdGNoICMxNzQzNTczIGZyb20gSmVmZnJleSBTb3JlbnNlbi4gSXQgY29udGFpbnMgYSBuZWF0CiAgICAgICAgICAgIGlkZWEgd2l0aCByZXNwZWN0IHRvIGJldHRlciBtZW1vcnkgbWFuYWdlbWVudCBieSB0aGUgSlZNIG9mIEMrKyBhbGxvY2F0ZWQgbWVtb3J5LgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGx5IHBhdGNoICMxNzcxNDEwIGZyb20gV2FkZSBCcmFpbmVyZCB0byBmaXggdHlwZWRlZiBYUyhTd2lnUGVybFdyYXBwZXIpIGluCiAgICAgICAgICAgIHBlcmxydW4uc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsIGJ1aWxkIDgyMiBhbmQgUGVybCA1LjguOSBhbmQgNS4xMCBicmFuY2hlcy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIGNvbnN0IGVudW0gcmVmZXJlbmNlIHR5cGVtYXBzIGZpeGVkLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIEMrKyBjbGFzcyBtZW1iZXIgcG9pbnRlcnMuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBzdXBwb3J0IGZvciAkb3duZXIgaW4gdGhlICJvdXQiIHR5cGVtYXBzIGxpa2UgaW4gdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiBOb3RlIHRoYXQgJG93bmVyIGhhcyBhbHdheXMgYmVlbiBzdXBwb3J0ZWQgaW4gdGhlICJqYXZhb3V0IiAvICJjc291dCIKICAgICAgICAgICAgdHlwZW1hcHMuCgowOC8wMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc21hcnQgcG9pbnRlciBoYW5kbGluZyBmb3IgY2xhc3NlcyB0aGF0IGhhdmUgdGVtcGxhdGVkIG1ldGhvZHMgd2l0aGluIHRoZSBzbWFydAogICAgICAgICAgICBwb2ludGVyIHR5cGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgY3JhaWdkbyBhdCBlZS53YXNoaW5ndG9uLmVkdS4KCjA3LzMxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbY2ZmaV0gZml4ZWQgbWVtb3J5IGFjY2VzcyBhZnRlciBiZWluZyBmcmVlZCBidWcuIHRoYW5rcyB0byBNYXJ0aW4gUGVyY29zc2kuCiAgICAgICAgICAgIHBhY2thZ2UgbmFtZSBjbG9zIGNoYW5nZWQgdG8gY2wuIHRoYW5rcyB0byBSYWxmIE1hdHRlcwoKMDcvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGFyYWxsZWwgbWFrZSBzdXBwb3J0IGFkZGVkIGZvciB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgZm9yIGRldmVsb3BlcnMgd2hvIGhhdmUKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBDUFUuIE5vdyBwYXJhbGxlbCBtYWtlIGNhbiBiZSB1c2VkIGZvciBjaGVja2luZyBpbiBhZGRpdGlvbiB0byBidWlsZGluZwogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlLiBTb21lIHR5cGljYWwgY2hlY2tpbmcgZXhhbXBsZXM6CgogICAgICAgICAgICAgIG1ha2UgLWo4IC1rIGNoZWNrCiAgICAgICAgICAgICAgbWFrZSAtajQgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSAtajIgY2hlY2stamF2YS1leGFtcGxlcwoKMDcvMTkvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgRml4ZWQgYnVnIHRoYXQgc3RvcHBlZCBjb25maWd1cmUgd29ya2luZyBvbiBtaW5ndyAoYXBwbGllZCBkb3MydW5peCB0byBjb25maWd1cmUuaW4pCgowNy8xMC8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBFeHRyYSBjb21wYXRpYmlsaXR5IHdpdGggTHVhIDUuMSAodXBkYXRlZCBTV0lHX2luaXQsIGRvY3MsIGV4YW1wbGVzLCB0ZXN0IHN1aXRlKQoJICAgIFJlbW92ZWQgbmFtZSBjbGFzaCBmb3Igc3RhdGljIGxpbmsgb2YgbXVsdGlwbGUgbW9kdWxlcwoKMDcvMDUvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRml4IGEgYnVnIGluIFNXSUdfQUxMT0NfQVJSQVkoKQogICAgICAgICAgICBpbXByb3ZlZCB0aGUgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCBhcmd1bWVudHMuCiAgICAgICAgICAgIENoYW5nZWQgdGhlIG91dHB1dCBvZiBzd2lnX3R5cGUoKSB0byB1c2UgdGhlIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhlIHR5cGUsCgkgICAgcmF0aGVyIHRoYW4gdGhlIHJhdyBzd2lnIHR5cGUuCgowNy8wMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvcnMgZm9yIHNvbWUgb3ZlcmxvYWRlZCBtZXRob2RzIHdoZXJlIHRoZSBpbXR5cGUgcmVzdWx0ZWQgaW4gaWRlbnRpY2FsCiAgICAgICAgICAgIG1ldGhvZHMgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBDIyBkaXJlY3RvciBjbGFzcywgZWcgdm9pZCBmb28oaW50ICopIGFuZCB2b2lkIGZvbyhkb3VibGUgKikKICAgICAgICAgICAgdXNlZCB0byBnZW5lcmF0ZWQgdHdvIG9mIHRoZXNlOgoKICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgU3dpZ0RpcmVjdG9yZm9vKEludFB0ciBwKSB7IC4uLiB9CgowNi8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgcGFyYW1ldGVyIG5hbWUgY2hhbmdlcyBpbiBzdGRfdmVjdG9yLmkgYWxsb3dpbmcgYmV0dGVyIHRhcmdldGluZwogICAgICAgICAgICBvZiB0eXBlbWFwcyBmb3IgbWV0aG9kIHBhcmFtZXRlcnMgKGZvciBtZW1vcnkgbWFuYWdlbWVudCBvZiBjb250YWluZXJzIG9mIHBvaW50ZXJzKS4KCjA2LzA3LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCBmb3JlaWduLXR5cGUgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgbG9vayBmb3IgZmZpdHlwZSB0eXBlbWFwCgkgICAgYmluZGluZ3MuIGZpeCBpbm91dF90eXBlbWFwcy5pIGZvciBzdHJpbmdzLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtSdWJ5XQoJICAgIFVzZSB3aGljaGV2ZXIgb2YgImxvbmciIG9yICJsb25nIGxvbmciIGlzIHRoZSBzYW1lIHNpemUgYXMgInZvaWQqIgoJICAgIHRvIGhvbGQgcG9pbnRlcnMgYXMgaW50ZWdlcnMsIHJhdGhlciB0aGFuIHdoaWNoZXZlciBtYXRjaGVzIG9mZl90LgoJICAgIEZpeGVzIGNvbXBpbGF0aW9uIG9uIE9TIFggYW5kIEdDQyB3YXJuaW5ncyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBzaXplb2Yodm9pZCopIDwgc2l6ZW9mKG9mZl90KSAoU0YgcGF0Y2ggIzE3MzE5NzkpLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCBoYW5kbGluZyBvZiBhIHBhcnRpY3VsYXIgY2FzZSBpbnZvbHZpbmcgb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycy4KCjA2LzA1LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBjYXNlIHdoZXJlIHdlJ2QgcGFzcyBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllcnMKCSAgICAoaS5lLiBOUzE6Ok5TMjo6Rk9PKSB0byBzd2lnLWluc2VydC1pZC4gQWxsIG5hbWVzcGFjZXMKCSAgICBzaG91bGQgYmUgc3RyaXBwZWQuCgoJICAgIEZpeCBidWcgaW4gVHlwZWRlZkhhbmRsZXIgaW50cm9kdWNlZCBieSBsYXN0IGZpeC4KCjA2LzA1LzIwMDc6IG9sbHkKCSAgICBGaXggcmVwb3J0aW5nIG9mIGZpbGVuYW1lcyBpbiBlcnJvcnMgYWZ0ZXIgJWluY2x1ZGUgKHBhdGNoIGZyb20KCSAgICBMZWlnaCBTbWl0aCBpbiAjMTczMTA0MDsgYWxzbyByZXBvcnRlZCBhcyAjMTY5OTk0MCkuCgowNS8zMS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggIm1pc3NpbmcgaW5pdGlhbGlzZXIiIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIEMvQysrCgkgICAgd3JhcHBlciBjb2RlIHdpdGggUHl0aG9uIDIuNSB3aXRoIHdhcm5pbmdzIGVuYWJsZWQgKHBhdGNoIGZyb20KCSAgICBidWcjMTcyNzY2OCBmcm9tIEx1a2UgTW9vcmUpLgoKMDUvMjkvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgU3BsaXQgZG9jc3RyaW5ncyBpbnRvIHNlcGFyYXRlIHN0cmluZyBsaXRlcmFscyBhdCBlYWNoIG5ld2xpbmUgd2hlbgoJICAgIGdlbmVyYXRpbmcgQy9DKysgd3JhcHBlciBjb2RlICh0aGUgQy9DKysgY29tcGlsZXIgd2lsbCBqdXN0IGNvbWJpbmUKCSAgICB0aGVtIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgbGl0ZXJhbCkuICBUaGlzIGF2b2lkcyBNU1ZDCgkgICAgY29tcGxhaW5pbmcgdGhhdCB0aGUgc3RyaW5ncyBhcmUgdG9vIGxvbmcgKHByb2JsZW0gcmVwb3J0ZWQgYnkKCSAgICBCbyBQZW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QpLgoKMDUvMjgvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRXNjYXBlIGJhY2tzbGFzaGVzIGluIGRvY3N0cmluZ3MuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggYXV0b2RvYyBnZW5lcmF0aW9uIG9mIGVudW1zIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUKCSAgICBlbnVtcyBhcmUgd3JhcHBlZCAtIHBhdGNoICMxNjk3MjI2IGZyb20gSm9zaCBDaGVycnkuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IHdyYXBwaW5nIG9mIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBwb2ludGVyIHRvIGEKCSAgICBjbGFzcyAoYnVnIzE3MDA3ODgpIGFuZCB0aG9zZSB3aGljaCBoYXZlIG92ZXJsb2FkZWQgZm9ybXMgcmV0dXJuaW5nCgkgICAgYm90aCBjbGFzc2VzIGFuZCBub24tY2xhc3NlcyAoYnVnIzE3MTI3MTcsIHRoYW5rcyB0byBTaW1vbgoJICAgIEJlcnRoaWF1bWUgZm9yIHRoZSBwYXRjaCkuCgowNS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAlcmVuYW1lIGluY29uc2lzdGVuY3kgaW4gY29udmVyc2lvbiBvcGVyYXRvcnMgYXMgcmVwb3J0ZWQgYnkgWmhvbmcgUmVuLiBUaGUgbWF0Y2hpbmcKICAgICAgICAgICAgaXMgbm93IGRvbmUgb24gdGhlIG9wZXJhdG9yIG5hbWUgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IGlzIGRvbmUgZm9yIHBhcmFtZXRlcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBBQkMoKSBjb25zdDsKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKEFCQyBhKSBjb25zdDsKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgQUJDIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKEFCQyBhKSBjb25zdCB7fQogICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEFCQygpIGNvbnN0IHsgQUJDIGE7IHJldHVybiBhOyB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBxdWFsaWZ5aW5nIHRoZSBjb252ZXJzaW9uIG9wZXJhdG9yIHByZXZpb3VzbHkgbWF5IG9yIG1heSBub3QgaGF2ZSBtYXRjaGVkLgogICAgICAgICAgICBOb3cgaXQgZGVmaW5pdGVseSB3b24ndCwgc28gdGhpcyB3aWxsIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgU3BhY2U6OkFCQygpIGNvbnN0OwoKICAgICAgICAgICAgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhpcyBkb2VzIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChTcGFjZTo6QUJDIGEpIGNvbnN0OwoKICAgICAgICAgICAgVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQgd2l0aCByZXNwZWN0IHRvICVyZW5hbWUsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlcy4KICAgICAgICAgICAgQ29udmVyc2lvbiBvcGVyYXRvcnMgZG9jdW1lbnRhdGlvbiB0b28uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA1LzE2LzIwMDc6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYmFkIGdlbmVyYXRpb24gb2YgbG9jYWwgdmFyIGx0eXBlJ3MgaW4gZnVuY3Rpb25XcmFwcGVyKCkuCgkgICAgVHJ5IHRvIHdvcmsgYmV0dGVyIHdpdGggdGhlIGJhY2t3YXJkIG9yZGVyIGluIHdoaWNoIHN3aWcKCSAgICB1bnJvbGxzIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucy4KCSAgICBjbGVhbmVkIHVwIGEgbGl0dGxlIHVubmVjZXNzYXJ5IGNvZGUvZGVidWcgcHJpbnRmJ3MuCgkgICAgUmVtb3ZlIHdhcm5pbmcgd2hlbiByZXBsYWNpbmcgJGxkZXN0cnVjdG9yIGZvciBmZjpmb3JlaWduLXBvaW50ZXIKCjA1LzEyLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIHN3aWcgLXB5dGhvbiAtdGhyZWFkcyBub3cgZ2VuZXJhdGVzIEMvQysrIGNvZGUgd2hpY2ggdXNlcyBQeXRob24ncwoJICAgIG93biB0aHJlYWRpbmcgYWJzdHJhY3Rpb24gKGZyb20gcHl0aHJlYWQuaCkgcmF0aGVyIHRoYW4gT1Mgc3BlY2lmaWMKCSAgICBjb2RlLiAgVGhlIG9sZCBjb2RlIGZhaWxlZCB0byBjb21waWxlIG9uIE1TIFdpbmRvd3MuICAoU2VlIFNGIHBhdGNoCgkgICAgdHJhY2tlciAjMTcxMDM0MSkuCgowNS8wNC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIFNUTCByZW5hbWVzIHRvIGJlIGdsb2JhbCByZW5hbWVzLiAgVGhpcyBmaXhlcwoJICAgIFNUTCBmdW5jdGlvbnMgbm90IGJlaW5nIHJlbmFtZWQgd2hlbiBhdXRvcmVuYW1lIGlzIG9uLgogICAgICAgICAgICBUaGlzIGlzIGEgbm90IGEgdG90YWxseSBwZXJmZWN0IHdvcmstYXJvdW5kLCBidXQgYmV0dGVyLgoJICAgIFNvbWVvbmUgcmVhbGx5IG5lZWRzIHRvIGZpeCB0aGUgdGVtcGxhdGUgcmVuYW1pbmcgY29kZS4KCSAgICAoU2VlIGJ1ZyAjMTU0NTYzNCkKCjA1LzA0LzIwMDcgIGdnYQoJICAgIFtBbGxdCiAgICAgICAgICAgIENoYW5nZWQgJXJlbmFtZSgiJSh1bmRlcmNhc2UpcyIpIGEgbGl0dGxlIHNvIHRoYXQgc2luZ2xlCgkgICAgbnVtYmVycyBhdCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gYXJlIG5vdCB1bmRlcmNhc2VkLiAgVGhhdCBpczoKCQlnZXRTb21ldGhpbmcgLT4gZ2V0X3NvbWV0aGluZwoJCWdldDJECSAgICAgLT4gZ2V0XzJkCgkJZ2V0MjM0CSAgICAgLT4gZ2V0XzIzNAoJICAgIEJVVDoKCQlhc0Zsb2F0MiAgICAgLT4gYXNfZmxvYXQyCgkgICAgKEJ1ZyAjMTY5OTcxNCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgX19zd2lndHlwZV9fID0+IEBfX3N3aWd0eXBlX18gc28gaXQgY2FuIGJlIGFjY2Vzc2VkCgkgICAgZnJvbSB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIChhbmQgZm9sbG93cyBSdWJ5J3Mgb2ZmaWNpYWwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiwganVzdCBpbiBjYXNlKS4KCSAgICBNYWRlIHRyYWNraW5nID0+IEBfX3RyYWNraW5nc19fIGZvciBzYW1lIHJlYXNvbi4KCSAgICBDdXJyZW50bHkgc3RvcmluZyBpdmFycyB3aXRob3V0IHRoZSBAIHNlZW1zIHZhbGlkLCBidXQKCSAgICB0aGUgUGlja0F4ZSBzYXlzIHRoaXMgaXMgbm90IGNvcnJlY3QsIHNvIGp1c3QgaW4gY2FzZS4uLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQXBwbGllZCBwYXRjaCBmb3IgLW1pbmhlcml0IGJ1ZyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMuCgkgICAgVGhpcyBpc3N1ZSBzaG91bGQgYmUgcmV2aXNpdGVkIG1vcmUgY2xvc2VseSwgYXMgTXVsdGlwbGUKCSAgICBJbmhlcml0YW5jZSBpbiBSdWJ5IGlzIHN0aWxsIHByb2JsZW1hdGljLgoJICAgIChwYXRjaC9idWcgIzE2MDQ4NzgpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucyBpbiBydWJ5IHdpbGwgbm93IHJlcG9ydCB0byB0aGUgdXNlcgogICAgICAgICAgICB0aGUgcG9zc2libGUgcHJvdG90eXBlcyB3aGVuIHRoZSB1c2VyIG1pc3R5cGVzIHRoZSBudW1iZXIgb3IKICAgICAgICAgICAgdHlwZSBvZiBhIHBhcmFtZXRlci4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZvcmdvdCB0byBkb2N1bWVudCB0aGUgYnVnIGZpeGluZyBvZiBhbiBvbGQgYnVnIHJlZ2FyZGluZwoJICAgIGV4Y2VwdGlvbnMuCgkgICAgKGJ1ZyAjMTQ1ODI0NykKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byB1c2UgdGhlIHByb3BlciBjc3Mgc3R5bGVzIGZvcgoJICAgIGVhY2ggc2VjdGlvbi4gQWRkZWQgYXV0b2RvYyBzZWN0aW9uIHRvIFJ1YnkncyBkb2NzIHRvCgkgICAgZG9jdW1lbnQgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSBSdWJ5IGluIGRvY3VtZW50aW5nIGl0cyBtb2R1bGVzLgoJICAgIE1hZGUgcmRvYyBkb2N1bWVudGF0aW9uIHNwaXQgb3V0IHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzICsKCSAgICBtZXRob2QgbmFtZS4gIEFsYmVpdCB0aGlzIHdpbGwgbWFrZSB0aGUgY3VycmVudCByZG9jIG5vdCByZWNvZ25pemUKICAgICAgICAgICAgdGhlIG1ldGhvZCwgdGhpcyBpcyBzdGlsbCBuZWVkZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gZGlmZmVyZW50CiAgICAgICAgICAgIGNsYXNzZXMgd2l0aCBzaW1pbGFyIG1ldGhvZHMgKHJkb2Mgd2FzIGNyZWF0ZWQgdG8gZG9jdW1lbnQgdGhlCgkgICAgcnVieSBzb3VyY2Ugd2hpY2ggb25seSBjb250YWlucyBvbmUgY2xhc3MgcGVyIGMgZmlsZSwgdW5saWtlIHN3aWcpCiAgICAgICAgICAgIEkgaGF2ZSBwYXRjaGVkIHJkb2MgdG8gbWFrZSBpdCBtb3JlIGZyaWVuZGx5IHRvIHN3aWcuICBUaGlzCiAgICAgICAgICAgIHBhdGNoIG5lZWRzIHRvIGJlIG1lcmdlZCBpbiB0aGUgcnVieSBzdGQgbGlicmFyeSBub3cuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIGZsYWcgLWZlYXR1cmUgdG8gYmUgLWluaXRfbmFtZSB0byBiZXR0ZXIgcmVmbGVjdCBpdHMKCSAgICBwdXJwb3NlIGFuZCBhdm9pZCBjb25mdXNpb24gd2l0aCAtZmVhdHVyZXMuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCBhdXRvZG9jIGdlbmVyYXRpb24uCgkgICAgQWRkZWQgYXV0b2RvYyAuc3dnIGZpbGVzIHRvIFJ1YnkgbGlicmFyeSBmb3IgZWFzaWx5IGFkZGluZwoJICAgIGRvY3VtZW50YXRpb24gdG8gY29tbW9uIFJ1YnkgbWV0aG9kcyBhbmQgU1RMIG1ldGhvZHMuCgkgICAgRml4ZWQgYXV0b2RvYyBkb2N1bWVudGluZyBvZiBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFuZCBtb2R1bGUuCgkgICAgTWFkZSB0ZXN0IHN1aXRlIGFsd2F5cyBnZW5lcmF0ZSBhdXRvZG9jcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgc29tZSB3YXJuaW5ncyBmcm9tIFNUTCBhbmQgdGVzdCBzdWl0ZS4KCjA1LzAyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGlzc3VlcyB3aXRoIEMrKyBjbGFzc2VzIGFuZCBoaWVyYWNoaWVzIGFjcm9zcyBtdWx0aXBsZQoJICAgIHNvdXJjZSBmaWxlcy4gRml4ZWQgaW1wb3J0cyB0ZXN0IGNhc2UgJiBhZGRlZCBydW4gdGVzdC4KCSAgICBBZGRlZCBFeGFtcGxlcy9pbXBvcnRzLgoJICAgIEFkZGVkIHR5cGVuYW1lIGZvciByYXcgbHVhX1N0YXRlKgoJICAgIEFkZGVkIGRvY3VtZW50YXRpb24gb24gbmF0aXZlIGZ1bmN0aW9ucy4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIERvY3N0cmluZ3MgYXJlIG5vdyBzdXBwb3J0ZWQuCgkgICAgJWZlYXR1cmUoImF1dG9kb2MiKSBhbmQgJWZlYXR1cmUoImRvY3N0cmluZyIpIGFyZSBub3cKCSAgICBwcm9wZXJseSBzdXBwb3J0ZWQgaW4gUnVieS4gIFRoZXNlIGZlYXR1cmVzIHdpbGwgZ2VuZXJhdGUKCSAgICBhIF93cmFwLmN4eCBmaWxlIHdpdGggcmRvYyBjb21tZW50cyBpbiB0aGVtLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgU1RMIGZpbGVzIGhhdmUgYmVlbiB1cGdyYWRlZCB0byBmb2xsb3cgdGhlIG5ldyBzd2lnL3B5dGhvbgoJICAgIExpYi9zdGQgY29udmVudGlvbnMuCgkgICAgVGhpcyBtZWFucyBzdGQ6OnZlY3Rvciwgc3RkOjpzZXQsIHN0ZDo6bWFwLCBzZXQ6Om11bHRpbWFwLAoJICAgIHN0ZDo6bXVsdGlzZXQsIHN0ZDo6ZGVxdWUgYW5kIHN0ZDo6c3RyaW5nIGFyZSBub3cgcHJvcGVybHkKCSAgICBzdXBwb3J0ZWQsIGluY2x1ZGluZyB0aGVpciBpdGVyYXRvcnMsIHN1cHBvcnQgZm9yIGNvbnRhaW5pbmcKCSAgICBydWJ5IG9iamVjdHMgKHN3aWc6OkdDX1ZBTFVFKSBhbmQgc2V2ZXJhbCBvdGhlciBydWJ5CgkgICAgZW5oYW5jZW1lbnRzLgoJICAgIHN0ZDo6Y29tcGxleCwgc3RkOjppb3MsIHN0ZDo6aW9zdHJlYW0sIHN0ZDo6aW9zdHJlYW1idWYgYW5kCgkgICAgc3RkOjpzc3RyZWFtIGFyZSBub3cgYWxzbyBzdXBwb3J0ZWQuCgkgICAgc3RkOjp3c3RyaW5nLCBzdGQ6Ondpb3MsIHN0ZDo6d2lvc3RyZWFtLCBzdGQ6Ondpb3N0cmVhbWJ1ZgoJICAgIGFuZCBzdGQ6Ondzc3RyZWFtIGFyZSBzdXBwb3J0ZWQgdmVyYmF0aW0gd2l0aCBubyB1bmljb2RlCgkgICAgY29udmVyc2lvbi4KCgkgICAgc3RkX3ZlY3Rvci5pIG5vdyBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIFJ1YnkgQXJyYXlzIG11Y2ggbW9yZQoJICAgIGNsb3NlbHksIHN1cHBvcnRpbmcgc2xpY2luZywgc2hpZnRpbmcsIHVuc2hpZnRpbmcsCiAgICAgICAgICAgIG11bHRpcGxlIGluZGV4aW5nIGFuZCBwcm9wZXIgcmV0dXJuIHZhbHVlcyBvbiBhc3NpZ25tZW50LgoKCSAgICBDT01QQVRBQklMSVRZIE5PVEU6IHRoaXMgY2hhbmdlcyB0aGUgb2xkZXIgYXBpIGEgbGl0dGxlIGJpdCBpbgoJICAgIHRoYXQgaW1wcm9wZXIgaW5kZXhpbmcgd291bGQgcHJldmlvdXNseSAoaW5jb3JyZWN0bHkpIHJhaXNlCgkgICAgZXhjZXB0aW9ucy4gIE5vdywgbmlsIGlzIHJldHVybmVkIGluc3RlYWQsIGZvbGxvd2luZyBydWJ5J3MKCSAgICBzdGFuZGFyZCBBcnJheSBiZWhhdmlvci4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgdGhlIHZhbHVlIG9mIFNXSUdfVFlQRUNIRUNLX0JPT0wgdG8gYmUgMTAwMDAgKGllLiBoaWdoZXIKCSAgICB0aGFuIHRoYXQgb2YgYWxsIGludGVnZXJzKS4KCSAgICBUaGlzIGlzIGJlY2F1c2UgUnVieSBhbGxvd3MgdHlwZWNhc3RpbmcKCSAgICBpbnRlZ2VycyBkb3duIHRvIGJvb2xlYW5zIHdoaWNoIGNhbiBtYWtlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIG9uCgkgICAgYm9vbHMgYW5kIGludGVnZXJzIHRvIGZhaWwuCgkgICAgKGJ1ZyMgMTQ4ODE0MikKCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIGEgc3VidGxlIGJ1ZyBpbiBtdWx0aXBsZSBhcmdvdXRzIHRoYXQgY291bGQgZ2V0IHRyaWdnZXJlZCBpZgoJICAgIHRoZSB1c2VyIHJldHVybmVkIHR3byBvciBtb3JlIGFyZ3VtZW50cyBhbmQgdGhlIGZpcnN0IG9uZSB3YXMgYW4KCSAgICBhcnJheS4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoZSBuZXcgZmVhdHVyZXMKICAgICAgICAgICAgYWRkZWQsIGFkZCBkaXJlY3RvcmluL291dC9hcmdvdXQgdHlwZW1hcHMsIGV0Yy4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFkZGVkICVpbml0c3RhY2sgYW5kICVpZ25vcmVzdGFjayBkaXJlY3RpdmVzIGZvciBkaXJlY3RvcgoJICAgIGZ1bmN0aW9ucy4gIFRoZXNlIGFsbG93IHlvdSB0byBjb250cm9sIHdoZXRoZXIgYSBkaXJlY3RvcgoJICAgIGZ1bmN0aW9uIHNob3VsZCByZS1pbml0IHRoZSBSdWJ5IHN0YWNrLgoJICAgIFRoaXMgaXMgc29tZXRpbWVzIG5lZWRlZCBmb3IgYW4gZW1iZWRkZWQgUnVieSB3aGVyZSB0aGUKCSAgICBkaXJlY3RvciBtZXRob2QgaXMgdXNlZCBhcyBhIEMrKyBjYWxsYmFjayBhbmQgbm90IGNhbGxlZAogICAgICAgICAgICBieSB0aGUgdXNlciBmcm9tIHJ1YnkgY29kZS4KCSAgICBFeHBsYW5hdGlvbjoKCSAgICBSdWJ5J3MgR0MgbmVlZHMgdG8gYmUgYXdhcmUgb2YgdGhlIHJ1bm5pbmcgT1Mgc3RhY2sgaW4gb3JkZXIgdG8KCSAgICBtYXJrIGFueSBWQUxVRSAoUnVieSBvYmplY3RzKSBpdCBmaW5kcyB0aGVyZSB0byBhdm9pZCBjb2xsZWN0aW9uCgkgICAgb2YgdGhlbS4gIFRoaXMgYWxsb3dzIHRoZSBydWJ5IEFQSSB0byBiZSB2ZXJ5IHNpbXBsZSBhbmQgYWxsb3dzCgkgICAgeW91IHRvIHdyaXRlIGNvZGUgbGlrZSAiVkFMVUUgYSA9IHN0aCIgYW55d2hlcmUgd2l0aG91dCBuZWVkaW5nCgkgICAgdG8gZG8gdGhpbmdzIGxpa2UgcmVmY291bnRpbmcgbGlrZSBweXRob24uCgkgICAgQnkgZGVmYXVsdCwgdGhlIHN0YXJ0IG9mIHRoZSBzdGFjayBpcyBzZXQgd2hlbiBydWJ5X2luaXQoKSBpcwoJICAgIGNhbGxlZC4gICBJZiBydWJ5IGlzIGluaXRlZCB3aXRoaW4gbWFpbigpLCBhcyBpdCB1c3VhbGx5IGlzIHRoZQoJICAgIGNhc2Ugd2l0aCB0aGUgbWFpbiBydWJ5IGV4ZWN1dGFibGUsIHJ1Ynkgd2lsbCBiZSBhYmxlIHRvIGNhbGN1bGF0ZQoJICAgIGl0cyBzdGFjayBwcm9wZXJseS4gIEhvd2V2ZXIsIHdoZW4gdGhpcyBpcyBub3QgcG9zc2libGUsIGFzIHdoZW4KCSAgICBydWJ5IGlzIGVtYmVkZGVkIGFzIGEgcGx1Z2luIHRvIGFuIGFwcGxpY2F0aW9uIHdoZXJlIG1haW4gaXMgbm90CgkgICAgYXZhaWxhYmxlLCBydWJ5X2luaXQoKSB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UsIGFuZAoJICAgIHJ1Ynkgd2lsbCBiZSBpbmNvcnJlY3RseSB0cmFja2luZyB0aGUgc3RhY2sgZnJvbSB0aGUgZnVuY3Rpb24KCSAgICB0aGF0IGNhbGxlZCBydWJ5X2luaXQoKSBmb3J3YXJkcyBvbmx5LCB3aGljaCBjYW4gbGVhZCB0bwoJICAgIGFsbCBzb3J0cyBvZiB3ZWlyZCBjcmFzaGVzIG9yIHRvIHJ1YnkgdGhpbmtpbmcgaXQgaGFzIHJ1biBvdXQgb2YKCSAgICBzdGFjayBzcGFjZSBpbmNvcnJlY3RseS4KCSAgICBUbyBhdm9pZCB0aGlzLCBkaXJlY3RvciAoY2FsbGJhY2spIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHRhZ2dlZAoJICAgIHRvIHRyeSB0byByZXNldCB0aGUgcnVieSBzdGFjaywgd2hpY2ggd2lsbCBzb2x2ZSB0aGUgaXNzdWVzLgoJICAgIE5PVEU6IHJ1YnkxLjguNiBzdGlsbCBjb250YWlucyBhIGJ1ZyBpbiBpdCBpbiB0aGF0IGl0cyBmdW5jdGlvbgoJICAgIHRvIHJlc2V0IHRoZSBzdGFjayB3aWxsIG5vdCBhbHdheXMgZG8gc28uICBUaGlzIGJ1ZyBpcyB0cmlnZ2VyZWQKCSAgICB2ZXJ5IHJhcmVseSwgd2hlbiBydWJ5IGlzIGNhbGxlZCBmcm9tIHR3byB2ZXJ5IGRpc3RpbmN0IHBsYWNlcwoJICAgIGluIG1lbW9yeSwgbGlrZSBhIGJyYW5jaCBvZiBtYWluKCkgYW5kIGFub3RoZXIgZHNvLiAgVGhpcyBidWcKCSAgICBoYXMgbm93IGJlZW4gcmVwb3J0ZWQgdG8gcnVieS1jb3JlIGFuZCBpcyBwZW5kaW5nIGZ1cnRoZXIKCSAgICBpbnZlc3RpZ2F0aW9uLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMzAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNzA3NTgyIC0gUmVzdG9yZSBidWlsZGluZyBmcm9tIHJlYWQtb25seSBzb3VyY2UgZGlyZWN0b3JpZXMuCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IHdpbGwgbm93IHJlcG9ydCB0aGUgcGFyYW1ldGVyIGluZGV4IHByb3Blcmx5IG9uIHR5cGUKCSAgICBlcnJvcnMgYXMgd2VsbCBhcyB0aGUgY2xhc3MgYW5kIHZhbHVlIG9mIHRoZSBpbmNvcnJlY3QKCSAgICBhcmd1bWVudCBwYXNzZWQuCgkgICAgKGZlYXR1cmUgcmVxdWVzdCAjMTY5OTY3MCkKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgbm8gbG9uZ2VyIGNyZWF0ZXMgdGhlIGZyZWVfQ2xhc3MgZnVuY3Rpb24gaWYgdGhlIGNsYXNzCgkgICAgY29udGFpbnMgaXRzIG93biB1c2VyIGRlZmluZWQgZnJlZSBmdW5jdGlvbiAoJWZyZWVmdW5jKS4KCSAgICAoYnVnICMxNzAyODgyKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBkaXJlY3RvcnMgcmFpc2UgYSBydWJ5IGV4Y2VwdGlvbiBmb3IgaW5jb3JyZWN0IGFyZ291dAoJICAgIHJldHVybmVkIHZhbHVlcyBpZiBSVUJZX0VNQkVEREVEIGlzIHNldCwgaW5zdGVhZCBvZiB0aHJvd2luZwoJICAgIGFuIGFjdHVhbCBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoJICAgIFRoaXMgd2lsbCBwcmV2ZW50IGNyYXNoZXMgd2hlbiBydWJ5IGlzIGVtYmVkZGVkIGFuZCB1bmF3YXJlCgkgICAgb2YgdGhlIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHRoZSBuZWVkIGZvciAtRFNXSUdFWFRFUk4uCgkgICAgQ2hhbmdlZCBzd2lnX3J1YnlfdHJhY2tpbmdzIHRvIGJlIGEgc3RhdGljIHZhcmlhYmxlLCBidXQgYWxzbwoJICAgIGJlIGtlcHQgd2l0aGluIGEgaGlkZGVuIGluc3RhbmNlIHZhcmlhYmxlIGluIHRoZSBTV0lHIG1vZHVsZS4KCSAgICBUaGlzIGFsbG93cyBwcm9wZXJseSBkZWFsaW5nIHdpdGggdHJhY2tpbmdzIGFjcm9zcyBtdWx0aXBsZQoJICAgIERTT3MsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGJyb2tlbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBpbXByb3ZlbWVudCB0byBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XSBGaXhlZCBHQyBtZW1vcnkgaXNzdWVzIHdpdGggdHJhY2tpbmdzIHRoYXQgY291bGQgbGVhZAoJICAgIHRvIHNlZ2ZhdWx0cyB3aGVuIGRlYWxpbmcsIG1haW5seSwgd2l0aCBzdGF0aWMgdmFyaWFibGVzLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgU3RyaW5nIGNvbnZlcnNpb24gdXNpbmcgb2xkIHJ1YnkxLjYgbWFjcm9zLiAgTm93CgkgICAgU3RyaW5nVmFsdWVQdHIoKSBpcyB1c2VkIGlmIGF2YWlsYWJsZS4gIFRoaXMgcmVtb3ZlcyB3YXJuaW5ncwoJICAgIHdoZW4gY29udmVydGluZyBzdHJpbmdzIHdpdGggXDAgaW4gdGhlbS4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIHRoZSBhcmdvdXQgY291bnQgaW4gZGlyZWN0b3JzIGZvciBSdWJ5LiAgUHJldmlvdXNseSwKCSAgICBpZ25vcmVkIG9yICJudW1pbnB1dHM9MCIgdHlwZW1hcHMgd291bGQgaW5jb3JyZWN0bHkgbm90IGdldAoJICAgIGNvdW50ZWQgdG93YXJkcyB0aGUgYXJnb3V0IGNvdW50LgoJICAgIChidWcvcGF0Y2ggIzE1NDU1ODUpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBVcGdyYWRlZCBSdWJ5IGNvbnZlcnRlciB0byByZWNvZ25pemUgIm51bWlucHV0cz0wIi4gIFByZXZpb3VzbHksCgkgICAgb25seSB0aGUgb2xkICJpZ25vcmUiIGZsYWcgd2FzIGNoZWNrZWQgKHdoaWNoIHdvdWxkIGN1cnJlbnRseQoJICAgIHN0aWxsIHdvcmsgcHJvcGVybHksIGJ1dCBpcyBkZXByZWNhdGVkKS4KCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5IC0gYnV0IHNob3VsZCBiZSBtYWRlIGdlbmVyaWNdCgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIGFkZGVkLgoKCSAgICBUaGlzIGZlYXR1cmUgYWxsb3dzIHlvdSB0byBpZ25vcmUgdGhlIG91dHB1dCBvZiBhIGZ1bmN0aW9uIHNvCgkgICAgdGhhdCBpdCBpcyBub3QgYWRkZWQgdG8gYSBsaXN0IG9mIG91dHB1dCB2YWx1ZXMKCSAgICAoIGllLiBhcmdvdXRzICkuCgkgICAgVGhpcyBzaG91bGQgYWxzbyBiZWNvbWUgYSBmZWF0dXJlIG9mICV0eXBlbWFwKGRpcmVjdG9yb3V0KQoJICAgIGFzICJudW1vdXRwdXRzIj0wLCBqdXN0IGxpa2UgIm51bWlucHV0cyI9MCBleGlzdHMuCgoJICAgICVmZWF0dXJlKCJkaXJlY3RvcnMiPTEpCgoJICAgICVpbmNsdWRlIDx0eXBlbWFwcy5pPgoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSB7IENsYXNzOjptZW1iZXJfZnVuY3Rpb24xIH07CgkgICAgJXR5cGVtYXAob3V0KSBNU3RhdHVzIHsgLy8gc29tZSBjb2RlLCBsaWtlIGNoZWNrIG1zdGF0dXMKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmFpc2UgZXhjZXB0aW9uIGlmIHdyb25nIH07CgoJICAgICVpbmxpbmUgJXsKCSAgICAgIHR5cGVkZWYgaW50IE1TdGF0dXM7CgkgICAgICBjbGFzcyBDbGFzcyB7CgoJICAgICAgLy8gb25lIGFyZ3VtZW50IHJldHVybmVkLCBidXQgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgZGlzY2FyZGVkIGFzIGEgcmV0dXJuIChvdXQpIHBhcmFtZXRlci4KCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24xKCBpbnQmIE9VVFBVVCApOwoKCSAgICAgIC8vIHR3byBhcmd1bWVudHMgcmV0dXJuZWQsIGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIG5vdCBkaXNjYXJkZWQKCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24yKCBpbnQmIE9VVFBVVCApOwoJICAgICAgfTsKICAgICAgICAgICAgJX0KCgowNC8yMS8yMDA3OiBvbGx5CgkgICAgRml4IHBhcnNpbmcgb2YgZmxvYXQgY29uc3RhbnRzIHdpdGggYW4gZXhwb25lbnQgKGUuZy4gMWUtMDJmKQoJICAgIChidWcgIzE2OTk2NDYpLgoKMDQvMjAvMjAwNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBsYWNrIG9mIGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyB3aGVuIC1PIGlzIHVzZWQuCgkgICAgQWxzbywgZml4IGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyBjb250YWluaW5nIGEgZG91YmxlIHF1b3RlCgkgICAgY2hhcmFjdGVyLiAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gYnVnIzE3MDAxNDYuCgowNC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFN1cHBvcnQgZm9yIGFkZGluZyBpbiBKYXZhL0MjIGNvZGUgYmVmb3JlIGFuZCBhZnRlciB0aGUgaW50ZXJtZWRpYXJ5IGNhbGwsCiAgICAgICAgICAgIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHRoZSBtYXJzaGFsbGluZyBvZiB0aGUgcHJveHkgdHlwZSB0byB0aGUgaW50ZXJtZWRpYXJ5IHR5cGUuCiAgICAgICAgICAgIFRoZSBqYXZhaW4vY3NpbiB0eXBlbWFwIG5vdyBzdXBwb3J0cyB0aGUgJ3ByZScgYW5kICdwb3N0JyBhdHRyaWJ1dGVzIHRvIGFjaGlldmUgdGhpcy4KICAgICAgICAgICAgVGhlIGphdmFpbiB0eXBlbWFwIGFsc28gc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ3BnY3BwbmFtZScgYXR0cmlidXRlIGZvciBwcmVtYXR1cmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIG5hbWluZyBhbmQgdGhlIGNzaW4gdHlwZW1hcCBzdXBwb3J0cyBhbiBvcHRpb25hbCAnY3NoaW4nCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIHBhcmFtZXRlciB0eXBlIHVzZWQgaW4gYSBjb25zdHJ1Y3RvciBoZWxwZXIgZ2VuZXJhdGVkIHdoZW4gdGhlIHR5cGUgaXMgdXNlZAogICAgICAgICAgICBpbiBhIGNvbnN0cnVjdG9yLiBEZXRhaWxzIGluIHRoZSBKYXZhLmh0bWwgYW5kIENTaGFycC5odG1sIGRvY3VtZW50YXRpb24uCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgRG9uJ3QgdHJlYXQgYHJlc3RyaWN0JyBhcyBhIHJlc2VydmVkIGlkZW50aWZpZXIgaW4gQysrIG1vZGUKCSAgICAoYnVnIzE2ODU1MzQpLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaG93IHplbmRfdGhyb3dfZXhjZXB0aW9uKCkgaXMgY2FsbGVkIChidWcgIzE3MDA3ODUpLgoKMDQvMTAvMjAwNzogb2xseQoJICAgIERlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRvIHRlbXBsYXRlIGZvciBhQ0MgKHJlcG9ydGVkIG9uCgkgICAgc3dpZy11c2VyIHRoYXQgdGhpcyBpcyBuZWVkZWQpLgoKMDQvMDQvMjAwNzogb2xseQoJICAgIFtQSFA1XSBJZiBaVFMgaXMgZW5hYmxlZCwgcmVsZWFzZSA8bW9kdWxlPl9nbG9iYWxzX2lkIGluIE1TSFVURE9XTgoJICAgIHRvIGF2b2lkIFBIUCBpbnRlcnByZXRlciBjcmFzaCBvbiBzaHV0ZG93bi4gIFRoaXMgc29sdXRpb24gd2FzCgkgICAgc3VnZ2VzdGVkIGhlcmU6IGh0dHA6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD00MDk4NQoKMDQvMDMvMjAwNzogb2xseQoJICAgIFtQSFA0XSBBZGQgbWlzc2luZyBaVFMgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIEMrKyB3cmFwcGVyIGNvZGUKCSAgICB0byBmaXggY29tcGlsYXRpb24gZmFpbHVyZXMgd2hlbiB1c2luZyBaVFMgZW5hYmxlZCBTV0lHIChMaW51eAoJICAgIGRpc3RyaWJ1dGlvbnMgdGVuZCB0byBkaXNhYmxlIFpUUywgYnV0IG5vdGFibHkgdGhlIFdpbmRvd3MgYnVpbGQKCSAgICB1c2VzIGl0IGJ5IGRlZmF1bHQpLgoKMDQvMDEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY4NDI2MTogZml4ZXMgaGFuZGxpbmcgb2YgdW5zaWduZWQgaW50IGxpdGVyYWxzLCB0aGFua3MgTGVpZ2ggU21pdGguCiAgICAgICAgICAgIEFsc28sIGltcHJvdmVkIGRvY3VtZW50YXRpb24uCgowMy8zMC8yMDA3OiBvbGx5CgkgICAgQXZvaWQgZ2VuZXJhdGluZyAnPDonIHRva2VuIHdoZW4gdXNpbmcgU3dpZ1ZhbHVlV3JhcHBlcjw+IG9uIGEgdHlwZQoJICAgIHdoaWNoIHN0YXJ0cyB3aXRoICc6OicgKHBhdGNoICMxNjkwOTQ4KS4KCjAzLzI1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtwZXJsNV0gQWRkIFNXSUdfZmFpbCB0byB0aGUgU1dJR19leGNlcHRpb24gbWFjcm8uICBGaXhlcyBhIGZldyBwcm9ibGVtcyByZXBvcnRlZAoJICAgIG9uIHRoZSBtYWlsaW5nIGxpc3QuCgowMy8yMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTdHJpbmcgY29weWluZyBwYXRjaCBmcm9tIEpvc2ggQ2hlcnJ5IHJlZHVjaW5nIG1lbW9yeSBjb25zdW1wdGlvbiBieSBhYm91dCAyNSUuCgowMy8yMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE2MzE5ODcgZnJvbSBVbHJpayBQZXRlcnNvbiAtIGJvb2wgSU5PVVQgdHlwZW1hcHMKICAgICAgICAgICAgZmFpbCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCBnaXZlbiBkb2RneSBDKysgY29kZTogbmFtZXNwYWNlIGFiYzo6ZGVmIHsgfQoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHNvIHRoYXQgQVJSQVlTT0ZDTEFTU0VTIGFuZCBBUlJBWVNPRkVOVU1TIGluIGFycmF5c19qYXZhLmkgY2FuIGJlIGFwcGxpZWQKICAgICAgICAgICAgdG8gcG9pbnRlciB0eXBlcy4KCjAzLzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gV2hlbiB3ZSBrbm93IHRoZSBsaXRlcmFsIG51bWVyaWMgdmFsdWUgZm9yIGEgY29uc3RhbnQsIHVzZQoJICAgIHRoYXQgdG8gaW5pdGlhbGlzZSB0aGUgY29uc3QgbWVtYmVyIGluIHRoZSBQSFAgd3JhcHBlciBjbGFzcy4KCjAzLzAyLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IFBIUCB3cmFwcGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBjZXJ0YWluIGNhc2VzIG9mCgkgICAgb3ZlcmxvYWRlZCBmb3JtcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLgoKMDIvMjYvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY1NjM5NTogZml4ZWQgaGV4IGFuZCBvY3RhbCB2YWx1ZXMgYnVnLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4KCjAyLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGJ1ZyBpbiB0eXBlbWFwcyB3aGljaCBjYXVzZWQgZGVyaXZlZF9ieXZhbHVlIGFuZCBybmFtZSB0ZXN0IGNhc2VzIHRvIGZhaWwuCgkgICAgVXBkYXRlZCBkZXJpdmVkX2J5dmFsdWUuaSB0byBleHBsYWluIGhvdyB0byBmaW5kIGFuZCBmaXggdGhlIHByb2JsZW0KCjAxLzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUzODUyMiBhbmQgIzEzMzg1MjcsIGZvcndhcmQgdGVtcGxhdGVkIGNsYXNzIGRlY2xhcmF0aW9ucyB3aXRob3V0IGEKICAgICAgICAgICAgbmFtZSBmb3IgdGhlIHRlbXBsYXRlZCBjbGFzcyBwYXJhbWV0ZXJzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIGNsYXNzPiBjbGFzcyBYOwoKMDEvMjMvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzE2NDA4NjI6IDxtYWxsb2MuaD4gcmVwbGFjZWQgYnkgPHN0ZGxpYi5oPgoJICAgIFBhdGNoICMxNTk4MDYzIFR5cG8gaW4gdHlwZW1hcHMuaQoKMDEvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBsdWEgc3BlY2lmaWMgY2FycmF5cy5pIHdoaWNoIGFkZHMgdGhlIG9wZXJhdG9yW10gc3VwcG9ydC4KCSAgICBtb2RpZmllZCB0aGUgbWFpbiBjb2RlIHRvIG1ha2UgaXQgbm90IGVtaXQgYWxsIHRoZSBjbGFzcyBtZW1iZXIgZnVuY3Rpb25zICYgYWNjZXNzb3JzCgkgICAgTm90ZTogQyBzdHJ1Y3RzIGFyZSBjcmVhdGVkIHVzaW5nIG5ld19YWFgoKSB3aGlsZSBDKysgY2xhc3NlcyB1c2UgWFhYKCkgKHNob3VsZCBiZSBzdGFuZGFyZGlzZWQpCgkgICAgVXBkYXRlZCB0ZXN0IGNhc2U6IGxpX2NhcnJheXMKCSAgICBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uLgoKMDEvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkIHN1cHBvcnQgZm9yIG5ld2ZyZWUgdHlwZW1hcHMgKHNvbWV0aW1lcyB1c2VkIGJ5ICVuZXdvYmplY3QpCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC1tYWNyb2Vycm9ycy4gICBXaGVuIHN1cHBsaWVkLCB0aGlzIHdpbGwgZm9yY2UKICAgICAgICAgICAgdGhlIEMgc2Nhbm5lci9wYXJzZXIgdG8gcmVwb3J0IHByb3BlciBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgY29kZSBjb250YWluZWQKICAgICAgICAgICAgaW5zaWRlIFNXSUcgbWFjcm9zIChkZWZpbmVkIHdpdGggJWRlZmluZSkuICBCeSBkZWZhdWx0LCBTV0lHIG1lcmVseSByZXBvcnRzCiAgICAgICAgICAgIGVycm9ycyBvbiB0aGUgbGluZSBhdCB3aGljaCBhIG1hY3JvIGlzIHVzZWQuICBXaXRoIHRoaXMgb3B0aW9uLCB5b3UKICAgICAgICAgICAgY2FuIGV4cGFuZCB0aGUgZXJyb3IgYmFjayB0byBpdHMgc291cmNlLS0tc29tZXRoaW5nIHdoaWNoIG1heSBzaW1wbGlmeQogICAgICAgICAgICBkZWJ1Z2dpbmcuCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdIE1ham9yIG92ZXJoYXVsIG9mIEMvQysrIHNjYW5uaW5nIGltcGxlbWVudGF0aW9uLiAgRm9yIHF1aXRlCiAgICAgICAgICAgIHNvbWUgdGltZSwgU1dJRyBjb250YWluZWQgdHdvIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgQy9DKysgdG9rZW5pemVycy0tCiAgICAgICAgICAgIHRoZSBsZWdhY3kgc2Nhbm5lciBpbiBDUGFyc2UvY3NjYW5uZXIuYyBhbmQgYSBnZW5lcmFsIHB1cnBvc2Ugc2Nhbm5lcgogICAgICAgICAgICBpbiBTd2lnL3NjYW5uZXIuYy4gU1dJRyBzdGlsbCBoYXMgdHdvIHNjYW5uaW5nIG1vZHVsZXMsIGJ1dCB0aGUgQyBwYXJzZXIKICAgICAgICAgICAgc2Nhbm5lciAoQ1BhcnNlL2NzY2FubmVyLmMpIG5vdyByZWxpZXMgdXBvbiB0aGUgZ2VuZXJhbCBwdXJwb3NlCiAgICAgICAgICAgIHNjYW5uZXIgZm91bmQgaW4gU3dpZy9zY2FubmVyLmMuICBBcyBhIHJlc3VsdCwgaXQgaXMgbXVjaCBzbWFsbGVyIGFuZAogICAgICAgICAgICBsZXNzIGNvbXBsaWNhdGVkLiAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWludGFpbiBhbGwKICAgICAgICAgICAgb2YgdGhlIGxvdy1sZXZlbCBDIHRva2VuaXppbmcgaW4gb25lIGNlbnRyYWwgbG9jYXRpb24gaW5zdGVhZCBvZiB0d28KICAgICAgICAgICAgcGxhY2VzIGFzIGJlZm9yZS4KCiAgICAgICAgICAgICoqKlBPVEVOVElBTCBGTEFLSU5FU1MqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGNhdXNlIHByb2JsZW1zIHdpdGggYWNjdXJhdGUgbGluZSBudW1iZXIgcmVwb3J0aW5nCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZXJyb3IgcmVwb3J0aW5nIG1vcmUgZ2VuZXJhbGx5LiBJIGhhdmUgdHJpZWQgdG8gcmVzb2x2ZSB0aGlzCiAgICAgICAgICAgIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCB0aGVyZSBtaWdodCBiZSBzb21lIGNvcm5lciBjYXNlcy4KCjAxLzEyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIHR5cGVtYXAgdGhyb3dzIGZvciBzdGQ6OnN0cmluZyosIHR5cGVtYXAgZm9yIFNXSUdUWVBFIERZTkFNSUMsCgkgICAgY2hhbmdlZCB0aGUgZXhpc3RpbmcgdGhyb3dzIHR5cGVtYXAgdG8gdGhyb3cgYSBzdHJpbmcgaW5zdGVhZCBvZiBtYWtpbmcgYSBjb3B5IG9mCgkgICAgdGhlIG9iamVjdCAodXBkYXRpbmcgYSBmZXcgdGVzdCBjYXNlcyB0byBkZWFsIHdpdGggdGhlIGNoYW5nZSkuCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBkeW5hbWljX2Nhc3RzLCBleGNlcHRpb25fcGFydGlhbF9pbmZvLCBsaV9zdGRfc3RyaW5nLCBzaXplX3QKCjAxLzAzLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10uICBVc2Ugb2Ygc3dpZ2tleXMuYy8uaCB2YXJpYWJsZXMgaXMgcmV2b2tlZC4gIFBsZWFzZSB1c2UKICAgICAgICAgICAgc2ltcGxlIHN0cmluZ3MgZm9yIGF0dHJpYnV0ZSBuYW1lcy4KCjEyLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgQVBJIGZ1bmN0aW9ucyBIYXNoR2V0QXR0cigpIGFuZCBIYXNoQ2hlY2tBdHRyKCkgaGF2ZSBiZWVuIHJldm9rZWQuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgR2V0YXR0cigpIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMuICBUaGUgZnVuY3Rpb24gQ2hlY2thdHRyKCkgY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gY2hlY2sgYXR0cmlidXRlcy4gIE5vdGU6ICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJldm9rZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGV5IG9ubHkgYWRkZWQgYSBtYXJnaW5hbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhdCB0aGUgZXhwZW5zZQogICAgICAgICAgICBjb2RlIGNsYXJpdHkuCgoxMi8yNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtb3JlIFNUTCAobW9yZSBleGNlcHRpb25zLCBtYXAsIHNpemVfdCksCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBjb252ZXJzaW9uX25zX3RlbXBsYXRlLgoKMTIvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gVXBkYXRlIHRvIHRocm93IGVycm9ycyB3aGVuIHNldHRpbmcgaW1tdXRhYmxlcywKCSAgICBhbmQgYWxsb3dpbmcgdXNlciBhZGRpdGlvbiBvZiBtb2R1bGUgdmFyaWFibGVzLgoKMTIvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVkZWYnZCB2YXJpYWJsZSB3cmFwcGVycyB0aGF0IHVzZSAlbmF0dXJhbHZhciwgZWcsIHN0ZDo6c3RyaW5nLgoKMTIvMTQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90IHR5cGVtYXBzCgoxMi8xNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IGJ1ZyAjMTYxMzY3MyAoYmFkIFBIUDUgY29kZSBnZW5lcmF0ZWQgZm9yIGdldHRlcnMgYW5kCgkgICAgc2V0dGVycykuCgoxMi8wMi8yMDA2OiB3c2Z1bHRvbiwgSm9obiBMZW56LCBEYXZlIEJlYXpsZXkKICAgICAgICAgICAgTW92ZSBmcm9tIGN2cyB0byBTdWJ2ZXJzaW9uIGZvciBzb3VyY2UgY29udHJvbAoKMTEvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBDbGVhbmVkIHVwIHN3aWd3YXJuaW5ncy5zd2cgZmlsZSBub3QgdG8gdXNlIG5lc3RlZCBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9ucy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGZvciAlZXh0ZW5kIHRvIHdvcmsgZm9yIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzLgoKVmVyc2lvbiAxLjMuMzEgKE5vdmVtYmVyIDIwLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiBMdWlnaSBCYWxsYWJpbwogICAgICAgICAgICBbUHl0aG9uXSBBbHRlcm5hdGUgZml4IGZvciBQeXRob24gZXhjZXB0aW9ucyBidWcgIzE1NzgzNDYgKHRoZSBwcmV2aW91cyBvbmUgYnJva2UgUHl0aG9uCiAgICAgICAgICAgIHByb3BlcnRpZXMgaW4gbW9kZXJuIGNsYXNzZXMpCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICAtZmFrZXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIG5vdyBnZW5lcmF0ZXMgdGhlIGZha2UgdmVyc2lvbiBpbnRvIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBkaXNwbGF5aW5nIGl0IHdoZW4gdGhlIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyB1c2VkLgoKMTQvMTEvMjAwNjogbWdvc3NhZ2UKCSAgICBbbHVhXSB1cGRhdGUgdG8gdHlwZW1hcCBmb3Igb2JqZWN0IGJ5IHZhbHVlLCB0byBtYWtlIGl0IGM4OSBjb21wbGlhbnQKClZlcnNpb24gMS4zLjMwIChOb3ZlbWJlciAxMywgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW2phdmFdIFJlbW92ZSBEZXRhY2hDdXJyZW50VGhyZWFkIHBhdGNoIGZyb20gIDA4LzExLzIwMDYgLSBpdCBjYXVzZXMgc2VnZmF1bHRzCiAgICAgICAgICAgIG9uIHNvbWUgc3lzdGVtcy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtweXRob25dIEZpeCAjMTU3ODM0NiAtIFB5dGhvbiBleGNlcHRpb25zIHdpdGggLW1vZGVybgoKMTEvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTkzMjkxIC0gU21hcnQgcG9pbnRlcnMgYW5kIGluaGVyaXRpbmcgZnJvbSB0ZW1wbGF0ZXMgCgoxMS8wOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3Igb3BlcmF0b3IgcG9pbnRlci9yZWZlcmVuY2UgY2FzdHMgLSAjMTU5MjE3My4KCjExLzA3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkc2VsZiBzcGVjaWFsIHZhcmlhYmxlIGZvciAlZXh0ZW5kIG1ldGhvZHMuIFBsZWFzZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGp1c3QgJ3NlbGYnCiAgICAgICAgICAgIGFzIHRoZSBDKysgJ3RoaXMnIHBvaW50ZXIuCgoxMS8wNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdIAoJICAgIGFsbGVncm9jbC5zd2c6IHN3aWctZGVmdmFyIHVwZGF0ZWQgdG8gYWxsb3cgc3BlY2lmeWluZyBvZgoJICAgIAkJICAgbm9uLWRlZmF1bHQgZm9yZWlnbiB0eXBlICh2aWEgOmZ0eXBlIGtleXdvcmQgYXJnKS4KCSAgICBhbGxlZ3JvY2wuY3h4OiBTcGVjaWZ5IHByb3BlciBhY2Nlc3MgdHlwZSBmb3IgZW51bSB2YWx1ZXMuCgoxMS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YS9DI10gRml4IGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm4gdHlwZXMgZm9yIGRpcmVjdG9ycyBhcyByZXBvcnRlZCBieQogICAgICAgICAgICBNYXJrIERvbnNlbHptYW5uCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIERlbGV0ZUxvY2FsUmVmIGZyb20gZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgZm9yIG5vdyBhcyBpdCBpcyBjYXVzaW5nIGEKICAgICAgICAgICAgc2VnIGZhdWx0IHdoZW4gcnVuIG9uIFNvbGFyaXMgOC4KCjEwLzI5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gUGF0Y2ggZnJvbSBDaHJpcyBTaG9lbWFrZXIgdG8gY2xlYW4gdXAgc29tZSB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSW1wb3J0YW50IGZpeCB0byBwcmV2ZW50IGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiB0aGUgSmF2YSBwcm94eSBjbGFzcwogICAgICAgICAgICB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGluIGEgbmF0aXZlIG1ldGhvZC4gVGhlIGZpbmFsaXplciBjb3VsZCBkZXN0cm95IHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIEMrKyBvYmplY3Qgd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQuIFRoZSBwcm9ibGVtIG9jY3VycyB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBubwogICAgICAgICAgICBsb25nZXIgc3Ryb25nbHkgcmVhY2hhYmxlIGFmdGVyIGEgbmF0aXZlIGNhbGwuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBvY2N1ciBpbgogICAgICAgICAgICBtZW1vcnkgc3RyZXNzIHNpdHVhdGlvbnMgb24gc29tZSBKVk1zLiBJdCBkb2VzIG5vdCBzZWVtIHRvIG9jY3VyIG9uIHRoZQogICAgICAgICAgICBTdW4gY2xpZW50IEpWTSB1cCB0byBqZGsgMS41LiBIb3dldmVyIHRoZSAxLjYgY2xpZW50IGpkayBoYXMgYSBtb3JlIGFnZ3Jlc3NpdmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0b3IgYW5kIHNvIHRoZSBwcm9ibGVtIGRvZXMgb2NjdXIuIEl0IGRvZXMgb2NjdXIgb24gdGhlIFN1biBzZXJ2ZXIKICAgICAgICAgICAgSlZNcyAoY2VydGFpbmx5IDEuNCBvbndhcmRzKS4gVGhlIGZpeCBlbnRhaWxzIHBhc3NpbmcgdGhlIHByb3h5IGNsYXNzIGludG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gYWRkaXRpb24gdG8gdGhlIEMrKyBwb2ludGVyIGluIHRoZSBsb25nIHBhcmFtZXRlciwgYXMgSmF2YSBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgICAgY29sbGVjdGVkIHdoZW4gdGhleSBhcmUgcGFzc2VkIGludG8gSk5JIG1ldGhvZHMuIFRoZSBleHRyYSBwYXJhbWV0ZXIgY2FuIGJlIHN1cHByZXNzZWQKICAgICAgICAgICAgYnkgc2V0dGluZyB0aGUgbm9wZ2NwcCBhdHRyaWJ1dGUgaW4gdGhlIGp0eXBlIHR5cGVtYXAgdG8gIjEiIG9yIHVzaW5nIHRoZSBuZXcgLW5vcGdjcHAKICAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgU2VlIEphdmEuaHRtbCNqYXZhX3BnY3BwIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyB0b3BpYy4KCjEwLzI0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMuIFRoZSB2aXJ0dWFsL292ZXJyaWRlL25ldyBrZXl3b3JkIGlzIG5vdCBnZW5lcmF0ZWQKICAgICAgICAgICAgZm9yIGVhY2ggbWV0aG9kIGFzIHRoZSBzbWFydCBwb2ludGVyIGNsYXNzIGRvZXMgbm90IG1pcnJvciB0aGUgdW5kZXJseWluZyBwb2ludGVyCiAgICAgICAgICAgIGNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gU0YgIzE0OTY1MzUKCjEwLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIG5hdGl2ZSBtZXRob2RzICYgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgogICAgICAgICAgICBmaXhlZCB0ZXN0IGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzICYgY3BwX2Jhc2ljLiBBZGRlZCBuZXcgZXhhbXBsZSAoZnVuY3RvcikuCiAgICAgICAgICAgIHRpZGllZCB1cCBhIGxpdHRsZSBvZiB0aGUgY29kZSAoYXJvdW5kIGNsYXNzSGFuZGxlcikuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIGRpcmVjdG9yb3V0IHR5cGVtYXAgY2hhbmdlcyB0byBmYWxsIGluIGxpbmUgd2l0aCB0aGUgb3RoZXIgZGlyZWN0b3IKICAgICAgICAgICAgbGFuZ3VhZ2VzLiAkcmVzdWx0IGlzIG5vdyB1c2VkIHdoZXJlICQxIHVzZWQgdG8gYmUgdXNlZC4gUGxlYXNlIGNoYW5nZSB5b3VyIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIHlvdSBoYXZlIGEgY3VzdG9tIGRpcmVjdG9yb3V0IHR5cGVtYXAuCgoxMC8xOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTb21lIGZpeGVzIGZvciBhcHBseWluZyB0aGUgY2hhciBhcnJheSB0eXBlbWFwcyB0byB1bnNpZ25lZCBjaGFyIGFycmF5cy4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIGluIGNvbnN0IHNpemVfdCYgYW5kIGNvbnN0IHN0ZDo6c2l6ZV90JiB0eXBlbWFwcy4KCjEwLzE1LzIwMDY6IGVmdXp6eW9uZSAKICAgICAgICAgICAgW0NGRkldIFN1cHByZXNzIGdlbmVyYXRpbmcgZGVmY3R5cGUgZm9yIGVudW1zLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4gUGF0Y2ggMTU2MDk4My4gCgoxMC8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIE1pbm9yIGZpeCB0byBtYWtlIFNXSUcgd29yayB3aXRoIHRoZSAoYXMgeWV0IHVucmVsZWFzZWQpIGNoaWNrZW4gMi41CgogICAgICAgICAgICBbR3VpbGUsQ2hpY2tlbl0gRml4IFNGIEJ1ZyAxNTczODkyLiAgQWRkZWQgYW4gZXh0X3Rlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgdG8gdGVzdAogICAgICAgICAgICB0aGlzIGJ1ZywgYnV0IHRoaXMgdGVzdCBjYW4gbm90IHJlYWxseSBiZSBtYWRlIGdlbmVyaWMgYmVjYXVzZSB0aGUgZXh0ZXJuYWwgY29kZSBtdXN0CiAgICAgICAgICAgIHBsdWcgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGludGVycHJldGVyIGRpcmVjdGx5LgogICAgICAgICAgICBTZWUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9jaGlja2VuL2V4dF90ZXN0LmkgYW5kIGV4dF90ZXN0X2V4dGVybmFsLmN4eAoKICAgICAgICAgICAgQWRkZWQgYSAlLmV4dGVybmFsdGVzdCB0byBjb21tb24ubWssIGFuZCBhbnkgaW50ZXJlc3RlZCBsYW5ndWFnZSBtb2R1bGVzIGNhbgogICAgICAgICAgICBjb3B5IGFuZCBzbGlnaHRseSBtb2RpZnkgZWl0aGVyIHRoZSBjaGlja2VuIG9yIHRoZSBndWlsZSBleHRfdGVzdC5pCgoxMC8xNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBhZGRlZCBPVVRQVVQmIGZvciBhbGwgbnVtYmVyIHR5cGVzLCBhZGRlZCBhIGxvbmcgbG9uZyB0eXBlCiAgICAgICAgICAgIGZpeGVkIHNldmVyYWwgdGVzdCBjYXNlcy4KICAgICAgICAgICAgdXBkYXRlOiBjaGFuZ2VkIHR5cGVtYXBzIHRvIHVzZSBTV0lHX0NvbnZlcnRQdHIgcmF0aGVyIHRoYW4gU1dJR19NdXN0R2V0UG9pbnRlcgogICAgICAgICAgICBzdGFydGVkIHNwbGl0aW5nIGx1YS5zd2cgaW50byBzbWFsbGVyIHBhcnRzIHRvIG1ha2UgaXQgbmVhdGVyCgoxMC8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIE1hcmdpbmFsbHkgYmV0dGVyIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlIG9ubHkgaW4gdGhhdCB5b3UgY2FuCiAgICAgICAgICAgIGNvbnRyb2wgd2hhdCB0aGUgYmFzZSBjbGFzcyBpcy4gVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBuZXcgJ3JlcGxhY2UnIGF0dHJpYnV0ZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwLCBlZyBpbiB0aGUgZm9sbG93aW5nLCAnTWUnIHdpbGwgYmUgdGhlIGJhc2UgY2xhc3MsCiAgICAgICAgICAgIG5vIG1hdHRlciB3aGF0IEZvbyBpcyByZWFsbHkgZGVyaXZlZCBmcm9tIGluIHRoZSBDKysgbGF5ZXIuCgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CgogICAgICAgICAgICBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgZm9yIHRoZSBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcHMgdG8gb3ZlcnJpZGUgdGhlIEMrKyBiYXNlLgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBkZWxldGUoKSBtZXRob2QgCiAgICAgICAgICAgIChpdCBpcyBub3cgYSBzeW5jaHJvbml6ZWQgbWV0aG9kLCBidXQgaXMgbm93IGN1c3RvbWlzYWJsZSBieSBjaGFuZ2luZyB0aGUgCiAgICAgICAgICAgIG1ldGhvZG1vZGlmaWVycyBhdHRyaWJ1dGUgaW4gdGhlIGphdmFkZXN0cnVjdCBvciBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwKQoKICAgICAgICAgICAgW0MjXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgRGlzcG9zZSgpIG1ldGhvZCwgCiAgICAgICAgICAgIHNpbWlsYXIgdG8gSmF2YSdzIGRlbGV0ZSgpIGFib3ZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBSZW1vdmUgcmVkdW5kYW50IGRpcmVjdG9yIGNvZGUgaW4gJWV4dGVuZCBtZXRob2RzICglZXh0ZW5kCiAgICAgICAgICAgIG1ldGhvZHMgY2Fubm90IGJlIGRpcmVjdG9yIG1ldGhvZHMpCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBGaXggIzE1MDU1OTQgLSBkaXJlY3RvciBvYmplY3RzIG5vdCByZXR1cm5lZCBhcyBkaXJlY3RvciBvYmplY3RzCiAgICAgICAgICAgIGluICVleHRlbmQgbWV0aG9kcy4KCjEwLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggIzEyMzg3OTggLSBEaXJlY3RvcnMgdXNpbmcgdW5zaWduZWQgbG9uZyBsb25nIG9yIGFueSBvdGhlciB0eXBlCiAgICAgICAgICAgIG1hcnNoYWxsZWQgYWNyb3NzIHRoZSBKTkkgYm91bmRhcnkgdXNpbmcgYSBKYXZhIGNsYXNzICh3aGVyZSB0aGUgam5pIHR5cGVtYXAgCiAgICAgICAgICAgIGNvbnRhaW5zIGpvYmplY3QpLgoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMTYyMTk0IC0gI2luY2x1ZGUvJWluY2x1ZGUgd2l0aGluIGEgc3RydWN0dXJlCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE0NTA2NjEsIHN0cmluZyB0cnVuY2F0aW9uIGluIFN0cmluZ19zZWVrIHRydW5jYXRpbmcgSmF2YS9DIyBlbnVtcy4KCjEwLzA2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMTU2OTU4Ny4gVGhlIG5hbWUgaXMgbm93IGNvcnJlY3QuCgoxMC8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvciBmaXhlcyBmb3IgdmlydHVhbCBjb252ZXJzaW9uIG9wZXJhdG9ycwoKMTAvMDQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCAjMTU2OTU4NyBmb3IgUEhQLiAgRG9uJ3QgdXNlIHNpemVvZigpIGV4Y2VwdCB3aXRoIHN0cmluZwoJICAgIGxpdGVyYWxzLiAgQ2hhbmdlIHNvbWUgIi8vIiBjb21tZW50cyB0byAiLyogKi8iIGZvciBwb3J0YWJpbGl0eS4KCjEwLzA0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhcnRpYWwgRml4ICMxNTY5NTg3LiBUaGUgdHlwZSBpcyBub3cgY29ycmVjdCwgYnV0IHRoZSBuYW1lIGlzIHN0aWxsIG5vdCBjb3JyZWN0LgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMTUyNzg4NSAtIE92ZXJsb2FkZWQgZGlyZWN0b3IgdmlydHVhbCBtZXRob2RzIHNvbWV0aW1lcyBwcm9kdWNlZAogICAgICAgICAgICB1bmNvbXBpbGFibGUgY29kZSB3aGVuIHVzZWQgd2l0aCB0aGUgZGlyZWN0b3I6ZXhjZXB0IGZlYXR1cmUuCgoxMC8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvcnM6IERpcmVjdG9ycyBhcmUgb3V0cHV0IGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZCBpbiAKICAgICAgICAgICAgdGhlIEMrKyBjbGFzcyByYXRoZXIgdGhhbiBpbiBzb21lIHBzZXVkby1yYW5kb20gb3JkZXIuCgoxMC8wMy8yMDA2OiBtbWF0dXMKICAgICAgICAgICAgRml4ICMxNDg2MjgxIGFuZCAjMTQ3MTAzOS4KCjEwLzAzLzIwMDY6IG9sbHkKCSAgICBbUGVybF0gRml4IGZvciBoYW5kbGluZyBzdHJpbmdzIHdpdGggemVybyBieXRlcyBmcm9tIFN0ZXBoZW4gSHV0c2FsLgoKMDkvMzAvMjAwNjogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBCaXRmaWVsZCBzdXBwb3J0IGFuZCB2YXJhcmcgc3VwcG9ydCBkdWUgdG8gQXJ0aHVyIFNteWxlcy4KICAgICAgICAgICAgQyBleHByZXNzaW9uIHRvIExpc3AgY29udmVyc2lvbiwgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMgZm9yIHRoZSBpbml0aWFsCiAgICAgICAgICAgIGlkZWEsIGl0IG5vdyBzdXBwb3J0cyBjb252ZXJzaW9uIGZvciBhIHdob2xlIHJhbmdlIG9mIEMgZXhwcmVzc2lvbnMuIAoKMDkvMjgvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTA4MzI3IC0gT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBoaWRkZW4gd2hlbiB1c2luZyAtZnZpcnR1YWwgb3B0aW1pc2F0aW9uLgogICAgICAgICAgICBPdmVybG9hZGVkIG1ldGhvZHMgYXJlIG5vIGxvbmdlciBjYW5kaWRhdGVzIGZvciBlbGltaW5hdGlvbiAtIHRoaXMgbWltaWNzCiAgICAgICAgICAgIEMrKyBiZWhhdmlvdXIgd2hlcmUgYWxsIG92ZXJsb2FkZWQgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgYW5kIGltcGxlbWVudGVkCiAgICAgICAgICAgIGluIGEgZGVyaXZlZCBjbGFzcyBpbiBvcmRlciBmb3IgdGhlbSB0byBiZSBhdmFpbGFibGUuCgowOS8yNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uLCBPY2FtbF0gRml4ICMxNTA1NTkxIFRocm93aW5nIGV4Y2VwdGlvbnMgaW4gZXh0ZW5kZWQgZGlyZWN0b3JzCgowOS8yNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzEwNTYxMDAgLSB2aXJ0dWFsIG9wZXJhdG9ycy4gCgowOS8yNC8yMDA2OiBvbGx5CgkgICAgRG9uJ3QgYWNjaWRlbnRhbGx5IGNyZWF0ZSBhICI8OiIgdG9rZW4gKHdoaWNoIGlzIHRoZSBzYW1lIGFzICJbIiBpbiBDKyspLgoJICAgIEZpeGVzIGJ1ZyAjIDE1MjE3ODguCgowOS8yMy8yMDA2OiBvbGx5CgkgICAgW1J1YnldIFN1cHBvcnQgYnVpbGRpbmcgd2l0aCByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIFJ1YnkgMS45CgkgICAgZGV2ZWxvcG1lbnQgYnJhbmNoLiAgRml4ZXMgYnVnICMxNTYwMDkyLgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFRlbXBsYXRlcyBjYW4gbm93IGJlIGluc3RhbnRpYXRlZCB1c2luZyBuZWdhdGl2ZSBudW1iZXJzIGFuZAoJICAgIGNvbnN0YW50IGV4cHJlc3Npb25zLCBlLmcuOgoKCSAgICB0ZW1wbGF0ZTxpbnQgcT4gY2xhc3MgeCB7fTsKCSAgICAldGVtcGxhdGUoeF9taW51czEpIHg8LTE+OwoJICAgICV0ZW1wbGF0ZSh4XzFwbHVzMikgeDwxKzI+OwoKCSAgICBBbHNvLCBjb25zdGFudCBleHByZXNzaW9ucyBjYW4gbm93IGluY2x1ZGUgY29tcGFyaXNvbnMgKD4sIDwsID49LAoJICAgIDw9LCAhPSwgPT0pLCBtb2R1bHVzICglKSwgYW5kIHRlcm5hcnkgY29uZGl0aW9uYWxzIChhID8gYiA6IGMpLgoKCSAgICBGaXhlcyBidWdzICM2NDYyNzUsICM5MjU1NTUsICM5NTYyODIsICM5OTQzMDEuCgowOS8yMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBtZXRob2RzIC0gQnVncyAjMTU0NjI1NCwgIzE1NDM1MzMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaWdub3JlIG9uIGRpcmVjdG9yIGNvbnN0cnVjdG9ycwoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdHMgYW5kIGFzc2VydHMgd2hlbiBkaXJlY3RvciBtZXRob2RzIGFyZSBpZ25vcmVkICgjMTU0MzUzMykKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvdXQgb2Ygc291cmNlIGJ1aWxkcyAtIGJ1ZyAjMTU0NDcxOAoKMDkvMjAvMjAwNjogb2xseQoJICAgIFRyZWF0IGEgbmVzdGVkIGNsYXNzIGRlZmluaXRpb24gYXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHJhdGhlcgoJICAgIHRoYW4gaWdub3JpbmcgaXQgY29tcGxldGVseSwgc28gdGhhdCB3ZSBnZW5lcmF0ZSBjb3JyZWN0IGNvZGUgZm9yCgkgICAgcGFzc2luZyBvcGFxdWUgcG9pbnRlcnMgdG8gdGhlIG5lc3RlZCBjbGFzcyAoZml4ZXMgU0YgYnVnICM5MDkzODcpLgoKMDkvMjAvMjAwNjogb2xseQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICBbcGhwXSBPdmVybG9hZCByZXNvbHV0aW9uIG5vdyB3b3Jrcy4gIEhvd2V2ZXIgdG8gYWxsb3cgdGhpcywgU1dJRwoJICAgIGdlbmVyYXRlZCB3cmFwcGVycyBubyBsb25nZXIgY29lcmNlIFBIUCB0eXBlcyAod2hpY2ggcmV2ZXJ0cyBhIGNoYW5nZQoJICAgIG1hZGUgaW4gMS4zLjI2KS4gIFNvIGZvciBleGFtcGxlLCBpZiBhIG1ldGhvZCB0YWtlcyBhIHN0cmluZywgeW91CgkgICAgY2FuIG5vIGxvbmdlciBwYXNzIGEgbnVtYmVyIHdpdGhvdXQgZXhwbGljaXRseSBjb252ZXJ0aW5nIGl0IHRvIGEKCSAgICBzdHJpbmcgaW4gUEhQIHVzaW5nOiAoc3RyaW5nKXgKCjA5LzE4LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtBTExdIGZpeCBvbiBzd2lnaW5pdC5zd2csIGhhcyBiZWVuIHJlcG9ydGVkIHRvIGNyYXNoIG9uIHNldmVyYWwgdGVzdCBjYXNlcwoJICAgIGZvdW5kIGFuZCBmaXhlZCBwcm9ibGVtIGluIGltcG9ydHMgdW5kZXIgcHl0aG9uIChtaW5ndykKCjA5LzE2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoIGZyb20gTWljaGFsIE1hcmVrIGZvciBQeXRob24gMi41IHRvIGZpeCA2NCBiaXQgYXJyYXkgaW5kZXhlcyBvbgogICAgICAgICAgICA2NCBiaXQgbWFjaGluZXMuCgowOS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZXhwbGljaXRjYWxsIGZlYXR1cmUgaGFzIGJlZW4gc2NyYXBwZWQuIFRoaXMgZmVhdHVyZSB3YXMgaW50cm9kdWNlZCBwcmltYXJpbHkKICAgICAgICAgICAgdG8gc29sdmUgcmVjdXJzaXZlIGRpcmVjdG9yIG1ldGhvZCBjYWxscy4gRGlyZWN0b3IgdXBjYWxsIGltcHJvdmVtZW50cyBtYWRlIGluc3RlYWQ6CgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY2FtbF0gVGhlIHN3aWdfdXAgZmxhZyBpcyBubyBsb25nZXIgdXNlZC4gVGhlIHJlcXVpcmVkIG11dGV4ZXMKICAgICAgICAgICAgd3JhcHBpbmcgdGhpcyBmbGFnIGFyZSBhbHNvIG5vIGxvbmdlciBuZWVkZWQuIFRoZSByZWN1cnNpdmUgY2FsbHMgZ29pbmcgZnJvbSBDKysKICAgICAgICAgICAgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSBhbmQgYmFjayBhZ2FpbiBldGMgYXJlIG5vdyBhdm9pZGVkIGJ5IGEgc3VidGxlbHkgZGlmZmVyZW50CiAgICAgICAgICAgIGFwcHJvYWNoLiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBzd2lnX3VwIGZsYWcgaW4gZWFjaCBkaXJlY3RvciBtZXRob2QgdG8gaW5kaWNhdGUKICAgICAgICAgICAgd2hldGhlciB0aGUgZXhwbGljaXQgQysrIGNhbGwgdG8gdGhlIGFwcHJvcHJpYXRlIGJhc2UgY2xhc3MgbWV0aG9kIG9yIGEgbm9ybWFsCiAgICAgICAgICAgIHBvbHltb3JwaGljIEMrKyBjYWxsIHNob3VsZCBiZSBtYWRlLCB0aGUgbmV3IGFwcHJvYWNoIG1ha2VzIG9uZSBvZiB0aGVzZSBjYWxscwogICAgICAgICAgICBkaXJlY3RseSBmcm9tIHRoZSB3cmFwcGVyIG1ldGhvZC4KCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIHJlY3Vyc2l2ZSBjYWxsIHByb2JsZW0gd2hlbiBjYWxsaW5nIGEgQysrIGJhc2UgY2xhc3MgbWV0aG9kIGZyb20KICAgICAgICAgICAgSmF2YS9DIyBpcyBub3cgZml4ZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIG90aGVyIGxhbmd1YWdlcwogICAgICAgICAgICBhcyB0aGUgZGV0ZWN0aW9uIGFzIHRvIHdoZXRoZXIgdGhlIGV4cGxpY2l0IGNhbGwgb3IgYSBub3JtYWwgcG9seW1vcnBoaWMgY2FsbCBpcyBtYWRlCiAgICAgICAgICAgIGluIHRoZSBKYXZhL0MjIGxheWVyIHJhdGhlciB0aGFuIGluIHRoZSBDKysgbGF5ZXIuCgowOS8xMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSB1cGRhdGVkIHN3aWdpbml0LnN3ZyB0byBhbGxvdyBtdWx0aXBsZSBpbnRlcnByZXRlcnMgdG8gdXNlIG11bHRpcGxlCgkgICAgc3dpZyBtb2R1bGVzIGF0IG9uY2UuIFRoaXMgaGFzIGJlZW4gdGVzdGVkIGluIEx1YSAobWluZ3cgJiBsaW51eCksCgkgICAgcGVybDUgJiBweXRob24gKGxpbnV4KSBvbmx5LgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gYWRkZWQgc3VwcG9ydCBmb3IgcGFzc2luZyBmdW5jdGlvbiBwb2ludGVycyBhcyB3ZWxsIGFzIG5hdGl2ZSBsdWEgb2JqZWN0CiAgICAgICAgICAgIGludG8gd3JhcHBlcmVkIGZ1bmN0aW9uLgogICAgICAgICAgICBBZGRlZCBleGFtcGxlIGZ1bmNwdHIzIHRvIGRlbW9uc3RyYXRlIHRoaXMgZmVhdHVyZQoKMDkvMDUvMjAwNjogb2xseQoJICAgIFtwaHBdIFJlbmFtZSBFcnJvckNvZGUgYW5kIEVycm9yTXNnICNkZWZpbmUtcyB0byBTV0lHX0Vycm9yQ29kZQoJICAgIGFuZCBTV0lHX0Vycm9yTXNnIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBjb2RlIHRoZSB1c2VyIG1pZ2h0IGJlCgkgICAgd3JhcHBpbmcgKHBhdGNoIGZyb20gRGFycmVuIFdhcm5lciBpbiBTRiBidWcgIzE0NjYwODYpLiAgQW55CgkgICAgdXNlciB0eXBlbWFwcyB3aGljaCB1c2UgRXJyb3JDb2RlIGFuZC9vciBFcnJvck1zZyBkaXJlY3RseSB3aWxsCgkgICAgbmVlZCBhZGp1c3RpbmcgLSB5b3UgY2FuIGVhc2lseSBmaXggdGhlbSB0byB3b3JrIHdpdGggYm90aCBvbGQKCSAgICBhbmQgbmV3IFNXSUcgYnkgY2hhbmdpbmcgdG8gdXNlIFNXSUdfRXJyb3JNc2cgYW5kIGFkZGluZzoKCgkJI2lmbmRlZiBTV0lHX0Vycm9yTXNnCgkJI2RlZmluZSBTV0lHX0Vycm9yTXNnKCkgRXJyb3JNc2coKQoJCSNlbmRpZgoKMDgvMjkvMjAwNjogb2xseQoJICAgIFtwaHBdIE1vdmUgY29uc3RhbnQgaW5pdGlhbGlzYXRpb24gZnJvbSBSSU5JVCB0byBNSU5JVCB0byBmaXggYQoJICAgIHdhcm5pbmcgd2hlbiB1c2luZyBBcGFjaGUgYW5kIG1vZF9waHAuICBXZSBvbmx5IG5lZWQgdG8gY3JlYXRlCgkgICAgUEhQIGNvbnN0YW50cyBvbmNlIHdoZW4gd2UncmUgZmlyc3QgaW5pdGlhbGlzZWQsIG5vdCBmb3IgZXZlcnkgSFRUUAoJICAgIHJlcXVlc3QuCgowOC8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTU0MjQ2NiBhZGRlZCBjb2RlIHRvIGFsbG93IG1hcHBpbmcgTHVhIG5pbCdzIDwtPiBDL0MrKyBOVUxMJ3MKCSAgICB1cGRhdGVkIHZhcmlvdXMgdHlwZW1hcHMgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgY2hhbmdlcwoJICAgIGFkZGVkIHZvaWR0ZXN0X3J1bm1lLmx1YSB0byBzaG93IHRoZSBmZWF0dXJlcyB3b3JraW5nCgowOC8xOS8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbR3VpbGVdIEFkZCBmZWF0dXJlOmNvbnN0YXN2YXIgdG8gZXhwb3J0IGNvbnN0YW50cyBhcyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBmdW5jdGlvbnMKICAgICAgICAgICAgdGhhdCByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlLgoKMDgvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERldGFjaEN1cnJlbnRUaHJlYWQgY2FsbHMgaGF2ZSBiZWVuIGFkZGVkIHNvIHRoYXQgbmF0aXZlbHkgY3JlYXRlZCB0aHJlYWRzCiAgICAgICAgICAgIG5vIGxvbmdlciBwcmV2ZW50IHRoZSBKVk0gZnJvbSBleGl0aW5nLiBCdWcgcmVwb3J0ZWQgYnkgVGhvbWFzIER1ZHppYWsgYW5kCiAgICAgICAgICAgIFBhdWwgTm9sbC4KCjA4LzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGRpcmVjdG9yIHByb3RlY3RlZCBtZXRob2RzIHNvIHRoZXkgd29yawoKMDcvMjUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIG1vcmUgYWRkaXRpb25zIHRvIHN0ZDo6c3RyaW5nLCBzb21lIHR3ZWFrcyBhbmQgc21hbGwgYnVnIGZpeGVzCgkgICAgLW5vY3dyYXAgbW9kZS4KCjA3LzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgQnVnZml4ICMxNTI2MDIyIHBkYXRlZCBzdGQ6OnN0cmluZyB0byBzdXBwb3J0IHN0cmluZ3Mgd2l0aCAnXDAnIGluc2lkZSB0aGVtCgkgICAgdXBkYXRlZCB0eXBlbWFwcy5pIHRvIGFkZCBzdXBwb3J0IGZvciBwb2ludGVyIHRvIHBvaW50ZXJzCgowNy8xOS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBBZGQgc3RkX3N0cmluZy5pIHN1cHBvcnQuCgkgICAgLSBBZGQgbmV3b2JqZWN0IHBhdGNoIHN1Ym1pdHRlZCBieSBta29lcHBlICh0aGFua3MhKQoJICAgIC0gRml4IHR5cGUgbmFtZSBtaXNtYXRjaCBpc3N1ZSBmb3IgbmVzdGVkIHR5cGUgZGVmaW5pdGlvbnMuCgkgICAgICBzcGVjaWZpY2FsbHkgdHlwZWRlZnMgaW4gdGVtcGxhdGVkIGNsYXNzIGRlZm5zLgoKMDcvMTgvMjAwNjogbWdvc3NhZ2UKCSAgICBCdWdmaXggIzE1MjI4NTgKCSAgICB1cGRhdGVkIGx1YS5jeHggdG8gc3VwcG9ydCAtZXh0ZXJuYWwtcnVudGltZSBjb21tYW5kCgowNy8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBJbmNyZW1lbnQgdGhlIFNXSUdfUlVOVElNRV9WRVJTSU9OIHRvIDMsIGJlY2F1c2Ugb2YgdGhlCgkgICAgYWRkaXRpb24gb2YgdGhlIG93bmRhdGEgbWVtYmVyIGluIHN3aWdfdHlwZV9pbmZvLgoJICAgIFJlcG9ydGVkIGJ5OiBQcmFiaHUgUmFtYWNoYW5kcmFuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWFyY2ggcGF0aCBmaXhlczoKICAgICAgICAgICAgLSBGaXggc2VhcmNoIHBhdGggZm9yIGxpYnJhcnkgZmlsZXMgdG8gYmVoYXZlIGFzIGRvY3VtZW50ZWQgaW4gTGlicmFyeS5odG1sLgogICAgICAgICAgICAtIEZpeCBtaW5ndy9tc3lzIGJ1aWxkcyB3aGljaCBkaWQgbm90IGZpbmQgdGhlIFNXSUcgbGlicmFyeSB3aGVuIGluc3RhbGxlZC4KICAgICAgICAgICAgLSBXaW5kb3dzIGJ1aWxkcyBhbHNvIG91dHB1dCB0aGUgbWluZ3cvbXN5cyBpbnN0YWxsIGxvY2F0aW9uIHdoZW4gcnVubmluZwogICAgICAgICAgICAgIHN3aWcgLXN3aWdsaWIuCiAgICAgICAgICAgIC0gVGhlIG5vbi1leGlzdGVudCBhbmQgdW5kb2N1bWVudGVkIGNvbmZpZyBkaXJlY3RvcnkgaW4gdGhlIHNlYXJjaCBwYXRoIGhhcwogICAgICAgICAgICAgIGJlZW4gcmVtb3ZlZC4KCjA3LzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkc3ltbmFtZSBzcGVjaWFsIHZhcmlhYmxlIGV4cGFuc2lvbi4KCjA3LzA0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgIEFkZCAlZmVhdHVyZSgiY29uc3Rhc3ZhciIpLCB3aGljaCBpbnN0ZWFkIG9mIGV4cG9ydGluZyBhIGNvbnN0YW50IGFzIGEKCSAgICBzY2hlbWUgZnVuY3Rpb24sIGV4cG9ydHMgdGhlIGNvbnN0YW50IGFzIGEgc2NoZW1lIHZhcmlhYmxlLiAgVXBkYXRlIHRoZQoJICAgIGRvY3VtZW50YXRpb24gYXMgd2VsbC4KCjA3LzA0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtTZWUgZW50cnkgb2YgMDkvMTMvMjAwNiAtIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGFuZCBkb2N1bWVudGF0aW9uIHRvIGl0IHJlbW92ZWRdCiAgICAgICAgICAgIE5ldyBleHBsaWNpdGNhbGwgZmVhdHVyZSB3aGljaCBnZW5lcmF0ZXMgYWRkaXRpb25hbCB3cmFwcGVycyBmb3IgdmlydHVhbCBtZXRob2RzCiAgICAgICAgICAgIHRoYXQgY2FsbCB0aGUgbWV0aG9kIGV4cGxpY2l0bHksIG5vdCByZWx5aW5nIG9uIHBvbHltb3JwaGlzbSB0byBtYWtlIHRoZSBtZXRob2QKICAgICAgICAgICAgY2FsbC4gVGhlIGZlYXR1cmUgaXMgYSBmZWF0dXJlIGZsYWcgYW5kIGlzIGVuYWJsZWQgbGlrZSBhbnkgb3RoZXIgZmVhdHVyZSBmbGFnLgogICAgICAgICAgICBJdCBhbHNvIHJlY29nbmlzZXMgYW4gYXR0cmlidXRlLCAic3VmZml4IiBmb3IgbWFuZ2xpbmcgdGhlIGZlYXR1cmUgbmFtZSwgc2VlCiAgICAgICAgICAgIFNXSUdQbHVzLmh0bWwjU1dJR1BsdXNfZXhwbGljaXRjYWxsIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGlzIGFsc28gYSB3b3JrYXJvdW5kIGZvciBzb2x2aW5nIHRoZSByZWN1cnNpdmUgY2FsbHMKICAgICAgICAgICAgcHJvYmxlbSB3aGVuIGEgZGlyZWN0b3IgbWV0aG9kIG1ha2VzIGEgY2FsbCB0byBhIGJhc2UgY2xhc3MgbWV0aG9kLiBTZWUKICAgICAgICAgICAgSmF2YS5odG1sI2phdmFfZGlyZWN0b3JzX2V4cGxpY2l0Y2FsbCBmb3IgdXBkYXRlZCBkb2N1bWVudGF0aW9uLgoKMDYvMjgvMjAwNjogam9lIChKb3NlcGggV2FuZykKCSAgICBbcl0gSW5pdGlhbCBzdXBwb3J0IGZvciBSCgowNi8yMC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KICAgICAgICAgICAgTWlub3IgZml4ZXMgdG8gZ2V0IGFwcGx5X3N0cmluZ3MuaSB0ZXN0c3VpdGUgdG8gcGFzcwoJICAgIFJlbW92ZSBpbnRlZ2Vyc19ydW5tZS5zY20gZnJvbSB0aGUgdGVzdHN1aXRlLCBiZWNhdXNlIFNXSUcgYW5kIENoaWNrZW4gZG9lcwogICAgICAgICAgICBoYW5kbGUgb3ZlcmZsb3dzLgoKMDYvMTkvMjAwNTogb2xseQoJICAgIFtwaHBdIEFkZCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIFBIUDUgY2xhc3Mgd3JhcHBlcnMgZm9yIEMrKwoJICAgIGNsYXNzZXMgKHVzZSAic3dpZyAtcGhwNSIpLgoKMDYvMTcvMjAwNjogb2xseQoJICAgIFtwaHBdIEFkZGVkIHNvbWUgbWlzc2luZyBrZXl3b3JkcyB0byB0aGUgUEhQNCBrZXl3b3JkIGxpc3QsIGFuZAoJICAgIGZpeGVkIF9fTElORV9fIGFuZCBfX0ZJTEVfXyB3aGljaCB3ZXJlIGluIHRoZSB3cm9uZyBjYXRlZ29yeS4KCSAgICBBbHNvIGFkZGVkIGFsbCB0aGUga2V5d29yZHMgbmV3IGluIFBIUDUsIGFuZCBhZGRlZCBjb21tZW50cwoJICAgIG5vdGluZyB0aGUgUEhQNCBrZXl3b3JkcyB3aGljaCBhcmVuJ3Qga2V5d29yZHMgaW4gUEhQNS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBEb24ndCBzZWdmYXVsdCBpZiBQSFAgTnVsbCBpcyBwYXNzZWQgYXMgdGhpcyBwb2ludGVyIChlLmcuCgkgICAgQ2xhc3NfbWV0aG9kKE51bGwpKSAtIGdpdmUgYSBQSFAgRXJyb3IgaW5zdGVhZC4KCjA2LzE1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBzdGQ6Omxpc3QgY29udGFpbmVyIGNsYXNzLgoJICAgIEZpeCBhIGZldyBidWdzIGluIGhlbHBlciBmdW5jdGlvbnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVwbGFjZSBKTklFWFBPUlQgd2l0aCBTV0lHRVhQT1JULCB0aGVyZWJ5IGVuYWJsaW5nIHRoZSBwb3NzaWJpbGl0eQogICAgICAgICAgICBvZiB1c2luZyBnY2MgLWZ2aXNpYmlsaXR5PWhpZGRlbiBmb3IgcG90ZW50aWFsbHkgc21hbGxlciBmYXN0ZXIgbG9hZGluZyB3cmFwcGVycy4KCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgTWFrZWZpbGVzIGZvciBhdXRvY29uZi0yLjYwIGJldGEKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFZsYWRpbWlyIE1lbnNoYWtvdiBwYXRjaCBmb3IgY29tcGlsaW5nIHdyYXBwZXJzIHdpdGggcHl0aG9uLTIuNSBhbHBoYS4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWZmZXIgb3ZlcmZsb3cgZXJyb3Igd2hlbiB1c2luZyBsYXJnZSAlZmVhdHVyZShkb2NzdHJpbmcpIHJlcG9ydGVkCiAgICAgICAgICAgIGJ5IEpvc2VwaCBXaW5zdG9uLgoKMDUvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIE9wZXJhdG9yIG92ZXJsb2FkIGZpeCBmcm9tIERhbmllbCBNb29yZS4KCjA1LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYnVnIGluIGdlbmVyYXRpb24gb2YgQ0xPUyB0eXBlIGRlY2xhcmF0aW9ucyBmb3IgdW5pb25zCgkgICAgYW5kIGVxdWl2YWxlbnQgdHlwZXMuCgowNS8yNC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRG9uJ3QgcmVxdWlyZSBhIGZ1bGwgY2xhc3MgZGVmaW5pdGlvbiB0byBnZW5lcmF0ZSBhIENMT1Mgd3JhcHBlci4KCjA1LzIwLzIwMDY6IG9sbHkKCSAgICBbcGhwXSBHQ0MgVmlzaWJpbGl0eSBzdXBwb3J0IG5vdyB3b3JrcyB3aXRoIFBIUC4KCjA1LzE5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW1vdmVkIHN1cHBvcnQgZm9yIC1kbG5hbWUgKHVzZSAtbW9kdWxlIGluc3RlYWQpLiAgRml4ZWQKCSAgICBuYW1pbmcgb2YgUEhQIGV4dGVuc2lvbiBtb2R1bGUgdG8gYmUgY29uc2lzdGVudCB3aXRoIFBIUAoJICAgIGNvbnZlbnRpb25zIChubyAicGhwXyIgcHJlZml4IG9uIFVuaXg7IG9uIFBIUCA+PSA0LjMuMCwgaGFuZGxlIFVuaXgKCSAgICBwbGF0Zm9ybXMgd2hpY2ggdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuICIuc28iIGFzIHRoZSBleHRlbnNpb24uKQoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkCgowNS8wNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIHdoZXJlIGEgQysrIHJlZmVyZW5jZQoJICAgIGlzIHdhbnRlZC4KCjA1LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggd3JhcHBlcnMgZ2VuZXJhdGVkIGZvciBnbG9iYWwgJ2NoYXInIHZhcmlhYmxlcyB0byBub3QKCSAgICBpbmNsdWRlIGEgdGVybWluYXRpbmcgemVybyBieXRlIGluIHRoZSBQSFAgc3RyaW5nLgoKMDUvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZ5IHR5cGVtYXBzIHNvIHRoYXQgY2hhciAqIGNhbiBiZSBhcHBsaWVkIHRvIHVuc2lnbmVkIGNoYXIgKiBvciBzaWduZWQgY2hhciAqCiAgICAgICAgICAgIHR5cGVzIGFuZCB2aXNhIHZlcnNhLgoKMDUvMDMvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldVGhhbmtzIHRvIEx1a2UgSiBDcm9vayBmb3IgdGhpcyBpZGVhLgogICAgICAgICAgICAgLSBhIHN0cnVjdC9lbnVtL3VuaW9uIGlzIHJlcGxhY2VkIHdpdGggOnBvaW50ZXIgb25seSBpZgogICAgICAgICAgICAgICB0aGF0IHNsb3QgaXMgYWN0dWFsbHkgYSBwb2ludGVyIHRvIHRoYXQgdHlwZS4gU28sOiAKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYV9zdHJ1Y3QgeyBpbnQgeDsgfSBhbmQKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYl9zdHJ1Y3QgeyBhX3N0cnVjdCBzdHJ1Y3RfMTsgfTsgCiAgICAgICAgICAgICAgIHdpbGwgYmUgY29udmVydGVkIGFzOgogICAgICAgICAgICAgICAgICAgKGNmZmk6ZGVmY3N0cnVjdCBiX3N0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0XzEgYV9zdHJ1Y3QpKQogICAgICAgICAgICAgLSBPdGhlciBtaW5vciBmaXhlcyBpbiBsaXNwaWZ5aW5nIG5hbWVzLgoKMDUvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBvc3NpYmxlIHJlZGVmaW5pdGlvbiBvZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgZm9yIFZDKysuCgowNC8xNC8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV0KICAgICAgICAgICAgVGhhbmtzIHRvIFRob21hcyBXZWlkbmVyIGZvciB0aGUgcGF0Y2guCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGV4cG9ydCBpcyBzZXQgKGV4cG9ydCAnZm9vKSBpcyAKICAgICAgICAgICAgICBnZW5lcmF0ZWQgZm9yIGV2ZXJ5IHN5bWJvbAogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbmxpbmUgaXMgc2V0IChkZWNsYWltIChpbmxpbmUgZm9vKSkgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGJlZm9yZSBldmVyeSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGludGVybl9mdW5jdGlvbiBpcyBzZXQgCiAgICAgICAgICAgICAgIy4odmFsdWUtb2YtaW50ZXJuLWZ1bmN0aW9uICJuYW1lIiAibm9kZVR5cGUiIHBhY2thZ2UpCiAgICAgICAgICAgICAgaXMgZW1pdHRlZCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBzeW1ib2wuIEEgc2FtcGxlIHN3aWctbGlzcGlmeSAKICAgICAgICAgICAgICBpcyBwcm92aWRlZC4KICAgICAgICAgICAgLSBldmVyeSBzeW1ib2wgaXMgcHJlZml4ZWQgYnkgaXQncyBwYWNrYWdlLgoKMDQvMTMvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCgkgICAgRml4ZWQgdGhlIGdlbmVyYXRpb24gb2Ygd3JhcHBlcnMgZm9yIGdsb2JhbCB2YXJpYWJsZXMuIAogICAgICAgICAgICBBZGRlZCB0aGUgb3B0aW9uIFtub11zd2lnLWxpc3Agd2hpY2ggdHVybnMgb24vb2ZmIGdlbmVyYXRpb24gCiAgICAgICAgICAgIG9mIGNvZGUgZm9yIHN3aWcgaGVscGVyIGxpc3AgbWFjcm8sIGZ1bmN0aW9ucywgZXRjLgoKVmVyc2lvbiAxLjMuMjkgKE1hcmNoIDIxLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNC8wNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IG91dHB1dCB0eXBlbWFwIG9mIGNoYXIgc28gaXQgcHJvZHVjZXMgYSBjaGFyYWN0ZXIgaW5zdGVhZAoJICAgIG9mIGFuIGludGVnZXIuIEFsc28gYWRkcyBpbnB1dC9vdXRwdXQgdHlwZW1hcHMgZm9yICdjaGFyIConLgoKCSAgICBhZGQgY29tbWFuZC1saW5lIGFyZ3VtZW50IC1pc29sYXRlIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZQoJICAgIGZpbGUgdGhhdCB3b24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBTV0lHIGdlbmVyYXRlZCBmaWxlcyB0aGF0CgkgICAgbWF5IGJlIHVzZWQgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24uCgowMy8yMC8yMDA1OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgTW9yZSB0d2Vha3MgdG8gSU5QVVQvT1VUUFVUIHR5cGVtYXBzIGZvciBib29sLgoKCSAgICBGaXggY29uc3RhbnRXcmFwcGVyIGZvciBjaGFyIGFuZCBzdHJpbmcgbGl0ZXJhbHMuCgoJICAgIGZpbmQtZGVmaW5pdGlvbiBrZXliaW5kaW5ncyBzaG91bGQgd29yayBpbiBFTEkvU0xJTUUuCgkgICAgT3V0cHV0IChpbi1wYWNrYWdlIDxtb2R1bGUtbmFtZT4pIHRvIGxpc3Agd3JhcHBlcgoJICAgIGluc3RlYWQgb2YgKGluLXBhY2thZ2UgIy4qc3dpZy1tb2R1bGUtbmFtZSopLgoKCSAgICBzbGlnaHQgcmV3b3JrIG9mIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCgoJICAgIGRvYyB1cGRhdGVzLgoKMDMvMTcvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIG1hbmdsZSBuYW1lcyBvZiBjb25zdGFudHMgZ2VuZXJhdGVkIHZpYSBjb25zdGFudFdyYXBwZXIuCgkgICAgCgkgICAgV2hlbiB1c2luZyBPVVRQVVQgdHlwZW1hcHMgYW5kIHRoZSBmdW5jdGlvbiBoYXMgYSBub24tdm9pZAoJICAgIHJldHVybiB2YWx1ZSwgaXQgc2hvdWxkIGJlIGZpcnN0IGluIHRoZSB2YWx1ZXMtbGlzdCwgZm9sbG93ZWQKCSAgICBieSB0aGUgT1VUUFVUIG1hcHBlZCB2YWx1ZXMuCgoJICAgIEZpeCBidWcgd2l0aCBib29sZWFuIHBhcmFtZXRlcnMsIHdoaWNoIG5lZWRlZCB0byBiZQoJICAgIHBhc3NlZCBpbiBhcyBpbnQgdmFsdWVzLCByYXRoZXIgdGhhbiBUIG9yIE5JTC4KCjAzLzE1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBHZW5lcmF0ZSB3cmFwcGVycyBmb3IgY29uc3RhbnRzIHdoZW4gaW4gQysrIG9yIC1jd3JhcCBtb2RlLgoJICAgIE1ha2UgLWN3cmFwIHRoZSBkZWZhdWx0LCBzaW5jZSBpdCBpcyBtb3N0IGNvcnJlY3QuIFVzZXJzCgkgICAgY2FuIHVzZSB0aGUgLW5vY3dyYXAgb3B0aW9uIHRvIGF2b2lkIHRoZSBjcmVhdGlvbiBvZiBhIC5jeHgKCSAgICBmaWxlIHdoZW4gaW50ZXJmYWNpbmcgdG8gQyBjb2RlLgoKCSAgICBXaGVuIGluIC1ub2N3cmFwIG1vZGUsIGltcHJvdmUgdGhlIGhhbmRsaW5nIG9mIGNvbnZlcnRpbmcKIAkgICAgaW5maXggbGl0ZXJhbHMgdG8gcHJlZml4IG5vdGF0aW9uIGZvciBsaXNwLiBUaGlzIGlzIHZlcnkKCSAgICBiYXNpYyBhbmQgbm90IGxpa2VseSB0byBiZSBpbXByb3ZlZCB1cG9uIHNpbmNlIHRoaXMgb25seQoJICAgIGFwcGxpZXMgdG8gdGhlIC1ub2N3cmFwIGNhc2UuIExpdGVyYWxzIHdlIGNhbid0IGZpZ3VyZSBvdXQKCSAgICB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcgYW5kIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQKCSAgICBjb2RlLgoKCSAgICB2YWxpZElkZW50aWZpZXIgbm93IG1vcmUgY2xvc2VseSBhcHByb3hpbWF0ZXMgd2hhdCBtYXkgYmUKCSAgICBhIGxlZ2FsIGNvbW1vbiBsaXNwIHN5bWJvbC4KCgkgICAgRml4IHR5cGVtYXAgZXJyb3IgaW4gYWxsZWdyb2NsLnN3ZwoJICAgIAowMy8xMi8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgZml4IHVwIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCSAgICBHZW5lcmF0ZSBjKysgc3R5bGUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHN0cnVjdC91bmlvbiBtZW1iZXJzCgkgICAgd2hlbiAtY3dyYXAgb3B0aW9uIHNwZWNpZmllZC4KCjAzLzEwLzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYnVnIGluIEMgd3JhcHBlciBnZW5lcmF0aW9uIGludHJvZHVjZWQgYnkgbGFzdCBhbGxlZ3JvY2wKCSAgICBjb21taXQuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgQ29tbWl0ICMxNDQ3MzM3IC0gRGVsZXRlIExvY2FsUmVmcyBhdCB0aGUgZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgdG8gZml4IHBvdGVudGlhbCBsZWFrCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE0NDQ5NDkgLSBjb25maWd1cmUgZG9lcyBub3QgaG9ub3IgLS1wcm9ncmFtLXByZWZpeC4KICAgICAgICAgICAgUmVtb3ZlZCBub24tc3RhbmRhcmQgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtcmVsZWFzZS1zdWZmaXguIEZpeCB0aGUgYXV0b2NvbmYgc3RhbmRhcmQKICAgICAgICAgICAgb3B0aW9ucyAtLXByb2dyYW0tcHJlZml4IGFuZCAtLXByb2dyYW0tc3VmZml4IHdoaWNoIHdlcmUgYmVpbmcgc2hvd24gaW4gdGhlIGhlbHAsCiAgICAgICAgICAgIGJ1dCB3ZXJlIGJlaW5nIGlnbm9yZWQuIFVzZSAtLXByb2dyYW0tc3VmZml4IGluc3RlYWQgb2YgLS13aXRoLXJlbGVhc2Utc3VmZml4IG5vdy4KCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBGaXggIzE0NDYzMTkgd2l0aCBwYXRjaCBmcm9tIGFuZHJlYXN0aCAtIG1vcmUgdGhhbiBvbmUgd3N0cmluZyBwYXJhbWV0ZXIgaW4gZGlyZWN0b3IgbWV0aG9kcwoKMDMvMDcvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gCgkgICAgRml4IGZvciBtb2R1bGUgbmFtZXMgY29udGFpbmluZyBhICItIiBpbiBub24tInNoYWRvdyIgbW9kZS4KCSAgICBQYXRjaCBmcm9tIEFhcm9uIFZhbkRldmVuZGVyICgjMTQ0MTQ3NCkuCgowMy8wNC8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCAtTyB0byB0aGUgbWFpbiBwcm9ncmFtLCB3aGljaCBub3cgZW5hYmxlcyAtZmFzdGRpc3BhdGNoCgkgICAgCgkgICAgW1B5dGhvbl0KCgkgICAgLSBBZGQgdGhlIC1mYXN0aW5pdCBvcHRpb24gdG8gZW5hYmxlIGZhc3RlciBfX2luaXRfXwogICAgICAgICAgICAgIG1ldGhvZHMuIFNldHRpbmcgJ3RoaXMnIGFzICdzZWxmLnRoaXMuYXBwZW5kKHRoaXMpJyBpbiB0aGUgcHl0aG9uCgkgICAgICBjb2RlIGNvbmZ1c2VzIFB5THVjZW5lLiBOb3cgdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhlCgkgICAgICB0aGUgQysrIHNpZGUsIGFzIHJlcG9ydGVkIGJ5IEFuZGkgYW5kIFJvYmluLgoKCSAgICAtIEFkZCB0aGUgLWZhc3RxdWVyeSBvcHRpb24gdG8gZW5hYmxlIGZhc3RlciBTV0lHX1R5cGVRdWVyeSB2aWEgYQogICAgICAgICAgICAgIHB5dGhvbiBkaWN0IGNhY2hlLCBhcyBwcm9wb3NlZCBieSBBbmRpIFZhamRhCgoJICAgIC0gQXZvaWQgdG8gY2FsbCBQeU9iamVjdF9HZXRBdHRyIGluc2lkZSBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcywKCSAgICAgIHNpbmNlIHRoaXMgY29uZnVzZXMgUHlMdWNlbmUsIGFzIHJlcG9ydGVkIGJ5IEFuZGkgVmFqZGEuCgkgICAgCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBSZW1vdmVkIGV4dHJhICh2b2lkICopIGNhc3Qgd2hlbiBjYXN0aW5nIHBvaW50ZXJzIHRvIGFuZCBmcm9tIGpsb25nIGFzIHRoaXMKICAgICAgICAgICAgd2FzIHN1cHByZXNzaW5nIGdjYydzICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiCiAgICAgICAgICAgIHdhcm5pbmcuIFRoaXMgd2FybmluZyBjb3VsZCBiZSBpZ25vcmVkIGluIHZlcnNpb25zIG9mIGdjYyBwcmlvciB0byA0LjAsIGJ1dCBub3cgdGhlCiAgICAgICAgICAgIHdhcm5pbmcgaXMgdXNlZnVsIGFzIGdjYyAtTzIgYW5kIGhpZ2hlciBvcHRpbWlzYXRpb24gbGV2ZWxzIGluY2x1ZGVzIC1mc3RyaWN0LWFsaWFzaW5nIHdoaWNoCiAgICAgICAgICAgIGdlbmVyYXRlcyBjb2RlIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlc2UgY2FzdHMuIFRoZSBhc3NpZ25tZW50IGlzIHNpbXBseSBuZXZlciBtYWRlLgogICAgICAgICAgICBQbGVhc2UgdXNlIC1mbm8tc3RyaWN0LWFsaWFzaW5nIHRvIGJvdGggc3VwcHJlc3MgdGhlIHdhcm5pbmcgYW5kIGZpeCB0aGUgYmFkIGFzc2VtYmx5CiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgdGhlIHdhcm5pbmcgaXMgb25seSBnZW5lcmF0ZWQgYnkgdGhlIEMgY29tcGlsZXIsIGJ1dCBub3QKICAgICAgICAgICAgdGhlIEMrKyBjb21waWxlciwgeWV0IHRoZSBDKysgY29tcGlsZXIgd2lsbCBhbHNvIGdlbmVyYXRlIGJyb2tlbiBjb2RlLiBBbHRlcm5hdGl2ZWx5IHVzZSAKICAgICAgICAgICAgLVduby1zdHJpY3QtYWxpYXNpbmcgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgZm9yIGdjYy0zLnguIFRoZSB0eXBlbWFwcyBhZmZlY3RlZAogICAgICAgICAgICBhcmUgdGhlICJpbiIgYW5kICJvdXQiIHR5cGVtYXBzIGluIGphdmEuc3dnIGFuZCBhcnJheXNfamF2YS5zd2cuIFVzZXJzIG91Z2h0IHRvIGZpeAogICAgICAgICAgICB0aGVpciBvd24gdHlwZW1hcHMgdG8gZG8gdGhlIHNhbWUuIE5vdGUgdGhhdCByZW1vdmFsIG9mIHRoZSB2b2lkICogY2FzdCBzaW1wbHkgcHJldmVudHMKICAgICAgICAgICAgc3VwcHJlc3Npb24gb2YgdGhlIHdhcm5pbmcgZm9yIHRoZSBDIGNvbXBpbGVyIGFuZCBub3RoaW5nIGVsc2UuIFR5cGljYWwgY2hhbmdlOgoKICAgICAgICAgICAgRnJvbToKICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAleyAkMSA9ICooJCYxX2x0eXBlKSh2b2lkICopJiRpbnB1dDsgJX0KICAgICAgICAgICAgVG86CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkmJGlucHV0OyAlfQoKICAgICAgICAgICAgRnJvbToKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFNXSUdUWVBFICogJXsgKigkJjFfbHR5cGUpKHZvaWQgKikmJHJlc3VsdCA9ICQxOyAlfSAKICAgICAgICAgICAgVG86CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSYkcmVzdWx0ID0gJDE7ICV9IAoKMDMvMDIvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXQoJICAgIEFkZCB0eXBlbWFwcyBmb3IgImxvbmcgbG9uZyI7IHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLCBob3dldmVyLCBkZXBlbmRzCgkgICAgb24gdGhlIHZlcnNpb24gYW5kIGNvbmZpZ3VyYXRpb24gb2YgR3VpbGUuCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBpbm5lciBleGNlcHRpb25zLiBJZiBhbnkgb2YgdGhlIGRlbGVnYXRlcyBhcmUgY2FsbGVkIHdoaWNoIGNvbnN0cnVjdAogICAgICAgICAgICBhIHBlbmRpbmcgZXhjZXB0aW9uIGFuZCB0aGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyBleGNlcHRpb24sIGl0IHdpbGwgY3JlYXRlIHRoZSBuZXcKICAgICAgICAgICAgZXhjZXB0aW9uIHdpdGggdGhlIHBlbmRpbmcgZXhjZXB0aW9uIGFzIGFuIGlubmVyIGV4Y2VwdGlvbi4KCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIFBocDUgZXhjZXB0aW9ucyBpZiBjb21waWxpbmcgYWdhaW5zdCBQaHA1IChwYXRjaCBmcm9tIE9sbHkgQmV0dHMpLgoKMDMvMDEvMjAwNjogbW1hdHVzCgkgICAgVXNlIHRoZSBHQ0MgdmlzaWJpbGl0eSBhdHRyaWJ1dGUgaW4gU1dJR0VYUE9SVC4KCgkgICAgTm93IHlvdSBjYW4gY29tcGlsZSAod2l0aCBnY2MgMy40IG9yIGxhdGVyKSB1c2luZwoJICAgIENGTEFHUz0iLWZ2aXNpYmlsaXR5PWhpZGRlbiIuCgkgICAgCgkgICAgQ2hlY2sgdGhlIGRpZmZlcmVuY2UgZm9yIHRoZSAnc3RkX2NvbnRhaW5lcnMuaScgcHl0aG9uIAoJICAgIHRlc3QgY2FzZToKIAogICAgICAgICAgICBTaXplczoKCgkgICAgICAzMzA1NDMyIF9zdGRfY29udGFpbmVycy5zbwoJICAgICAgMjM4Mzk5MiBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuCgoJICAgIEV4cG9ydGVkIHN5bWJvbHMgKG5tIC1EIDxmaWxlPi5zbyB8IHdjIC1sKToKCiAgICAgICAgICAgICAgNjE0NiBfc3RkX2NvbnRhaW5lcnMuc28gCiAgICAgICAgICAgICAgMTc0ICBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuIAoKCSAgICBFeGVjdXRpb24gdGltZXM6CgoJICAgICAgcmVhbCAwbTAuMDUwcyB1c2VyIDBtMC4wMzlzIHN5cyAwbTAuMDA1cyAgIF9zdGRfY29udGFpbmVycy5zbwogICAgICAgICAgICAgIHJlYWwgMG0wLjAzOXMgdXNlciAwbTAuMDI2cyBzeXMgMG0wLjAwN3MgICBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuCgoJICAgIFJlYWQgaHR0cDovL2djYy5nbnUub3JnL3dpa2kvVmlzaWJpbGl0eSBmb3IgbW9yZSBkZXRhaWxzLgoKCjAyLzI3LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBBZGQgc3VwcG9ydCBmb3IgSU5QVVQsIE9VVFBVVCwgYW5kIElOT1VUIHR5cGVtYXBzLgoJICAgIEZvciBPVVRQVVQgdmFyaWFibGVzLCB0aGUgbGlzcCB3cmFwcGVyIHJldHVybnMgbXVsdGlwbGUKCSAgICB2YWx1ZXMuCgowMi8yNi8yMDA2OiBtbWF0dXMKCgkgICAgW1J1YnldIGFkZCBhcmdjYXJndi5pIGxpYnJhcnkgZmlsZS4KCSAgICAKCSAgICBVc2UgaXQgYXMgZm9sbG93OgoKCQklaW5jbHVkZSBhcmdjYXJndi5pCgkgICAgICAJCQkJCQkJCQkgCiAgIAkgICAgICAgICVhcHBseSAoaW50IEFSR0MsIGNoYXIgKipBUkdWKSB7IChzaXplX3QgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIH0gCgkgICAgICAJCQkJCQkJCQkgCiAgIAkgICAgICAgICVpbmxpbmUgewkJCQkKICAgCSAgICAgICAgICBpbnQgbWFpbkFwcChzaXplX3QgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIAkKICAgCSAgICAgICAgICB7CQkJCQkJCiAgIAkgICAgICAgICAgICByZXR1cm4gYXJnYzsJCQkJCQogICAJICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0JCQkJCQkJCgkgICAgICAJCQkJCQkJCiAgIAkgICAgdGhlbiBpbiB0aGUgcnVieSBzaWRlOgkJCQkJCgkgICAgICAJCQkJCQkJCQogICAJICAgICAgICBhcmdzID0gWyJhc2RmIiwgImFzZGYyIl0JCQkJCiAgIAkgICAgICAgIG4gPSBtYWluQXBwKGFyZ3MpOwoJCgoJICAgIFRoaXMgaXMgdGhlIHNpbWlsYXIgdG8gdGhlIHB5dGhvbiB2ZXJzaW9uIExpYi9weXRob24vYXJnY2FyZ3YuaQoKMDIvMjQvMjAwNjogbWdvc3NhZ2UKCgkgICAgU21hbGwgdXBkYXRlIEx1YSBkb2N1bWVudHMgb24gdHJvdWJsZXNob290aW5nIHByb2JsZW1zCgkgICAgCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgRml4IGFsbCB0aGUgZXJyb3JzIHJlcG9ydGVkIGZvciAxLjMuMjguCgkgICAgLSBmaXggYnVnICMxMTU4MTc4CgkgICAgLSBmaXggYnVnICMxMDYwNzg5CgkgICAgLSBmaXggYnVnICMxMjYzNDU3CgkgICAgLSBmaXggJ2NvbnN0ICBjaGFyKiYnIHR5cGVtYXAgaW4gdGhlIFVUTCwgcmVwb3J0ZWQgYnkgR2VvZmYgSHV0Y2hpc29uCgkgICAgLSBmaXhlcyBmb3IgcHl0aG9uIDIuMSBhbmQgdGhlIHJ1bnRpbWUgbGlicmFyeQoJICAgIC0gZml4IGNvcHljdG9yICsgdGVtcGxhdGUgYnVnICMxNDMyMTI1CgkgICAgLSBmaXggWyAxNDMyMTUyIF0gJXJlbmFtZSBmcmllbmQgb3BlcmF0b3JzIGluIG5hbWVzcGFjZQoJICAgIC0gZml4IGdjYyB3YXJuaW5nIHJlcG9ydGVkIGJ5IFIuIEJlcm5zdGVpbgoJICAgIC0gYXZvaWQgYXNzZXJ0IHdoZW4gZmluZGluZyBhIHJlY3Vyc2l2ZSBzY29wZSBpbmhlcml0YW5jZSwKCSAgICAgIGVtaXQgYSB3YXJuaW5nIGluIHRoZSB3b3JzdCBjYXNlLCByZXBvcnRlZCBieSBOaXRybyAKCSAgICAtIGZpeCBwcmVtYXR1cmUgb2JqZWN0IGRlbGV0aW9uIHJlcG9ydGVkIGJ5IFBhdWwgaW4gdGNsM2QKCSAgICAtIGZpeCB3YXJuaW5nIHJlcG9ydGVkIGJ5IE5pdHJvIGluIFZDNwoJICAgIC0gbW9yZSBmaXhlcyBmb3Igb2xkIFNvbGFyaXMgY29tcGlsZXIKCSAgICAtIGZpeCBmb3IgcHl0aG9uIDIuMyBhbmQgZ2NfcmVmcyBpc3N1ZSByZXBvcnRlZCBieSBMdWlnaQoJICAgIC0gZml4IGZhc3Rwcm94eSBmb3IgbWV0aG9kcyB1c2luZyBrd2FyZ3MKCSAgICAtIGZpeCBvdmVybG9hZCArIHByb3RlY3RlZCBtZW1iZXIgaXNzdWUgcmVwb3J0ZWQgYnkgQ29saW4gTWNEb25hbGQKCSAgICAtIGZpeCBzZXRlcnJvcm1zZyBhcyByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IGRpcmVjdG9ycywgbm93IHRoZSB0ZXN0LXN1aXRlIHJ1bnMgYWdhaW4gdXNpbmcgLWRpcmVjdG9ycwoJICAgIC0gZml4IGZvciBmcmllbmQgb3BlcmF0b3IgYW5kIFZpc3VhbCBzdHVkaW8gYW5kIGJ1ZyAxNDMyMTUyCgkgICAgLSBmaXggYnVnICMxNDM1MDkwCgkgICAgLSBmaXggdXNpbmcgKyAlZXh0ZW5kIGFzIHJlcG9ydGVkIGJ5IFdpbGxpYW0KCSAgICAtIGZpeCBidWcgIzEwOTQ5NjQKCSAgICAtIGZpeCBmb3IgUHlfTm90SW1wbGVtZW50ZWQgYXMgcmVwb3J0ZWQgYnkgT2xseSBhbmQgQW1hdXJ5CgkgICAgLSBmaXggbmVzdGVkIG5hbWVzcGFjZSBpc3N1ZSByZXBvcnRlZCBieSBDaGFybGllCgoJICAgIGFuZCBhbHNvOgoJICAgIAoJICAgIC0gYWxsb3cgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlcnMgYnkgZGVmYXVsdAoJICAgIC0gZGVsZXRlIGV4dHJhIG5ldyBsaW5lcyBpbiBzd2lnbWFjcm9zW1VUTF0KCSAgICAtIGNvc21ldGljIGZvciBnZW5lcmF0ZWQgcHl0aG9uIGNvZGUKCSAgICAtIGFkZCB0aGUgZmFjdG9yeS5pIGxpYnJhcnkgZm9yIFVUTAoJICAgIC0gYWRkIHN3aWdyZWdpc3RlciBwcm94eSBtZXRob2QgYW5kIG1vdmUgX19yZXByX18gdG8gYQoJICAgICAgc2luZ2xlIGdsb2JhbCBtb2R1bGUgIFtweXRob25dCgowMi8yMi8yMDA2OiBtbWF0dXMgCgoJICAgIFdoZW4gdXNpbmcgZGlyZWN0b3JzLCBub3cgc3dpZyB3aWxsIGVtaXQgYWxsIHRoZSB2aXJ0dWFsCgkgICAgcHJvdGVjdGVkIG1ldGhvZHMgYnkgZGVmYXVsdC4gCgoJICAgIEluIHByZXZpb3VzIHJlbGVhc2VzLCB5b3UgbmVlZGVkIHRvIHVzZSB0aGUgJ2RpcnByb3QnCgkgICAgb3B0aW9uIHRvIGFjaGlldmUgdGhlIHNhbWUuCgoJICAgIElmIHlvdSB3YW50LCB5b3UgY2FuIGRpc2FibGUgdGhlIG5ldyBkZWZhdWx0IGJlaGF2aW91ciwKCSAgICB1c2UgdGhlICdub2RpcnByb3QnIG9wdGlvbjogCgoJICAgICAgIHN3aWcgLW5vZGlycHJvdCAuLi4KCgkgICAgYW5kL29yIHRoZSAlbm9kaXJlY3RvciBmZWF0dXJlIGZvciBzcGVjaWZpYyBtZXRob2RzLCBpLmUuOgoKCSAgICAgICAlbm9kaXJlY3RvciBGb286OmJhcjsKCgkgICAgICAgc3RydWN0IEZvbyB7CgkgICAgICAgICB2aXJ0dWFsIH5Gb28oKTsKCgkgICAgICAgcHJvdGVjdGVkOgoJICAgICAgICAgdmlydHVhbCB2b2lkIGJhcigpOwoJICAgICAgIH07CgkgICAgCgoJICAgIEFzIGJlZm9yZSwgcHVyZSBhYnN0cmFjdCBwcm90ZWN0ZWQgbWVtYmVycyBhcmUgYWxsd2F5cwoJICAgIGVtaXR0ZWQsIGluZGVwZW5kZW50IG9mIHRoZSAnZGlycHJvdC9ub2RpcnByb3QnIG9wdGlvbnMuCgoKMDIvMjIvMjAwNjogbW1hdHVzCgkgICAgQWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgbGFuZ3VhZ2VzIHVzaW5nIHRoZSBVVEwgKHB5dGhvbix0Y2wscnVieSxwZXJsKS4KCSAgICAKICAgICAgICAgICAgZmFjdG9yeS5pIGltcGxlbWVudHMgYSBtb3JlIG5hdHVyYWwgd3JhcCBmb3IgZmFjdG9yeSBtZXRob2RzLiAKCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlOgkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBHZW9tZXRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICAKICAJICAgICAgICAgICBlbnVtIEdlb21UeXBlewkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICAgICAgUE9JTlQsCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgICBDSVJDTEUJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgdmlydHVhbCB+R2VvbWV0cnkoKSB7fSAgICAJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgdmlydHVhbCBpbnQgZHJhdygpID0gMDsJCQkJICAgIAogIAkgICAgCSAJCQkJCQkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAJIC8vIEZhY3RvcnkgbWV0aG9kIGZvciBhbGwgdGhlIEdlb21ldHJ5IG9iamVjdHMJCSAgICAKICAJICAgIAkgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICAgIHN0YXRpYyBHZW9tZXRyeSAqY3JlYXRlKEdlb21UeXBlIGkpOyAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgUG9pbnQgOiBHZW9tZXRyeSAgewkJICAgICAJCSAgICAKICAJICAgICAgICAgICBpbnQgZHJhdygpIHsgcmV0dXJuIDE7IH0JCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZG91YmxlIHdpZHRoKCkgeyByZXR1cm4gMS4wOyB9ICAgIAkgICAgIAkJICAgIAogIAkgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgc3RydWN0IENpcmNsZSA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMjsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgcmFkaXVzKCkgeyByZXR1cm4gMS41OyB9ICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICB9OyAJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJCQkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vIEZhY3RvcnkgbWV0aG9kIGZvciBhbGwgdGhlIEdlb21ldHJ5IG9iamVjdHMJCSAgICAKICAJICAgICAgICAgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICBHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZShHZW9tVHlwZSB0eXBlKSB7CQkgICAgCiAgCSAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIFBPSU5UOiByZXR1cm4gbmV3IFBvaW50KCk7CSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgY2FzZSBDSVJDTEU6IHJldHVybiBuZXcgQ2lyY2xlKCk7IAkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOwkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgfQkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgfQkJCQkJICAgIAkJICAgIAogIAkgICAgLS0tLSAgZ2VvbWV0cnkuaCAtLS0tLS0tLQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAoJICAgIFlvdSBjYW4gdXNlIHRoZSAlZmFjdG9yeSB3aXRoIHRoZSBHZW9tZXRyeTo6Y3JlYXRlIG1ldGhvZCBhcyBmb2xsb3dzOgoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICAlbmV3b2JqZWN0IEdlb21ldHJ5OjpjcmVhdGU7CQkJCSAgICAKICAJICAgICAgJWZhY3RvcnkoR2VvbWV0cnkgKkdlb21ldHJ5OjpjcmVhdGUsIFBvaW50LCBDaXJjbGUpOwkgICAgCiAgCSAgICAgICVpbmNsdWRlICJnZW9tZXRyeS5oIgkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgYW5kIEdlb21ldHJ5OjpjcmVhdGUgd2lsbCByZXR1cm4gYSAnUG9pbnQnIG9yICdDaXJjbGUnIGluc3RhbmNlICAgCiAgCSAgICBpbnN0ZWFkIG9mIHRoZSBwbGFpbiAnR2VvbWV0cnknIHR5cGUuIEZvciBleGFtcGxlLCBpbiBweXRob246CSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgICAgY2lyY2xlID0gR2VvbWV0cnkuY3JlYXRlKEdlb21ldHJ5LkNJUkNMRSkJCQkgICAgCiAgCSAgICAgIHIgPSBjaXJjbGUucmFkaXVzKCkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICB3aGVyZSAnY2lyY2xlJyBub3cgaXMgYSBDaXJjbGUgcHJveHkgaW5zdGFuY2UuCSAgICAJCSAgICAKCgowMi8xNy8yMDA2OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBhY2NlcHQgdGhlIGZ1bGwgcmFuZ2Ugb2YgaW50ZWdyYWwKCSAgICB2YWx1ZXMsIGFuZCB0aGV5IHNpZ25hbCBhbiBlcnJvciB3aGVuIGEgdmFsdWUgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoJICAgIFtHdWlsZV0gVHlwZW1hcHMgZm9yIGFsbCBpbnRlZ3JhbCB0eXBlcyBub3cgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlCgkgICAgdGhlIHZhbGlkIHJhbmdlIGlzIHBhc3NlZC4KCjAyLzEzLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtEb2N1bWVudHNdIHVwZGF0ZWQgdGhlIGV4dGVuZGluZyBkb2N1bWVudHMgdG8gZ2l2ZSBhIHNrZWxldG9uIHN3aWdnaW5nIGNvZGUKICAgICAgICAgICAgd2l0aCBhIGZldyB0eXBlbWFwcy4KICAgICAgICAgICAgW0x1YV0gYWRkZWQgYW4gZXh0cmEgdHlwZW1hcCBmb3Igdm9pZCogW2luXSwgc28gYSBmdW5jdGlvbiB3aGljaCByZXF1aXJlcyBhIHZvaWQqCiAgICAgICAgICAgIGNhbiB0YWtlIGFueSBraW5kIG9mIHBvaW50ZXIKClZlcnNpb24gMS4zLjI4IChGZWJydWFyeSAxMiwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgRml4IG1hbnkgaXNzdWVzIHdpdGggbGluZSBjb3VudGluZyBhbmQgZXJyb3IgcmVwb3J0cy4KCjAyLzExLzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEJldHRlciBzdGF0aWMgZGF0YSBtZW1iZXIgc3VwcG9ydCwgaWYgeW91IGhhdmUKCSAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGJhcjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGVuIG5vdyBpcyB2YWxpZCB0byBhY2Nlc3MgdGhlIHN0YXRpYyBkYXRhIG1lbWJlciwgaWU6CgogICAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgICBmLmJhciA9IDMKCgkgICAganVzdCBhcyBpbiBDKysuCgoKMDIvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdCiAgICAgICAgICAgIEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiB0byB3b3JrIGFnYWluIHdpdGggb2xkIHZlcnNpb25zIG9mIFBlcmwKICAgICAgICAgICAgKDUuMDA0IGFuZCBsYXRlciB0ZXN0ZWQpCgowMi8wNC8yMDA2OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGQgdGhlICVleHRlbmRfc21hcnRfcG9pbnRlcigpIGRpcmVjdGl2ZSB0byBleHRlbmQKCSAgICBTV0lHIHNtYXJ0IHBvaW50ZXIgc3VwcG9ydCBpbiBweXRob24uIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzbWFydCBwb2ludGVyIGFzOgoJICAgIAoJICAgICAgdGVtcGxhdGUgPGNsYXNzIFR5cGU+IGNsYXNzIFJDUHRyIHsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgLi4uCgkgICAgICAgIFJDUHRyKFR5cGUgKnApOwoJCVR5cGUgKiBvcGVyYXRvci0+KCkgY29uc3Q7CgkJLi4uCgkgICAgICB9OwoJICAgICAgCgkgICAgeW91IHVzZSB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyIGRpcmVjdGl2ZSBhczoKCSAgICAKCSAgICAgICVleHRlbmRfc21hcnRfcG9pbnRlcihSQ1B0cjxBPik7CgkgICAgICAldGVtcGxhdGUoUkNQdHJfQSkgIFJDUHRyPEE+OwoJICAgIAoJICAgIHRoZW4sIGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIFJDUHRyPEE+IG1ha2VfcHRyKCk7CgkgICAgICBpbnQgZm9vKEEgKik7CgoJICAgIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZzoKCgkgICAgICBhID0gbWFrZV9wdHIoKTsKCSAgICAgIGIgPSBmb28oYSk7CgogICAgICAgICAgICBpZSwgc3dpZyB3aWxsIGFjY2VwdCBhIFJDUHRyPEE+IG9iamVjdCB3aGVyZSBhICdBIConIGlzCiAgICAgICAgICAgIGV4cGVjdGVkLgoKCSAgICBBbHNvLCB3aGVuIHVzaW5nIHZlY3RvcnMKCSAgICAKCSAgICAgICVleHRlbmRfc21hcnRfcG9pbnRlcihSQ1B0cjxBPik7CgkgICAgICAldGVtcGxhdGUoUkNQdHJfQSkgUkNQdHI8QT47CgkgICAgICAldGVtcGxhdGUodmVjdG9yX0EpIHN0ZDo6dmVjdG9yPFJDUHRyPEE+ID47CgkJCgkgICAgeW91IGNhbiB0eXBlCgoJICAgICAgYSA9IEEoKTsKCSAgICAgIHYgPSB2ZWN0b3JfQSgyKQoJICAgICAgdlswXSA9IGEKCiAgICAgICAgICAgIGllLCBhbiAnQSAqJyBvYmplY3QgaXMgYWNjZXB0ZWQsIHZpYSBpbXBsaWNpdCBjb252ZXJzaW9uLCAKCSAgICB3aGVyZSBhIFJDUHRyPEE+IG9iamVjdCBpcyBleHBlY3RlZC4gQWRkaXRpb25hbGx5CgoJICAgICAgeCA9IHZbMF0KCgkgICAgcmV0dXJucyAoYW5kIHNldHMgJ3gnIGFzKSBhIGNvcHkgb2YgdlswXSwgbWFraW5nIHJlZmVyZW5jZQoJICAgIGNvdW50aW5nIHBvc3NpYmxlIGFuZCBjb25zaXN0ZW50LgoKCSAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgaXMganVzdCBhIGNvbGxlY3Rpb25zIG9mIG5ldy9vbGQKCSAgICB0cmlja3MsIGluY2x1ZGluZyAldHlwZW1hcHMgYW5kIHRoZSBuZXcgJWltcGxpY2l0Y29udgoJICAgIGRpcmVjdGl2ZS4KCjAyLzAyLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIGJ1Z2ZpeCAjMTM1NjU3NywgY2hhbmdlZCBkb3VibGU9Pmx1YV9udW1iZXIgaW4gYSBmZXcgcGxhY2VzLgogICAgICAgICAgICBhZGRlZCB0aGUgc3RkOjpwYWlyIHdyYXBwaW5nCgowMS8zMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBzdGQ6OnN0cmluZyBhbmQgc3RkOjp3c3RyaW5nIG1lbWJlciB2YXJpYWJsZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgbm93IHVzZQogICAgICAgICAgICAlbmF0dXJhbHZhciBieSBkZWZhdWx0LCBtZWFuaW5nIHRoZXkgd2lsbCBub3cgYmUgd3JhcHBlZCBhcyBleHBlY3RlZCBpbiBhbGwgbGFuZ3VhZ2VzLgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZXNlIHdlcmUgd3JhcHBlZCBhcyBhIHBvaW50ZXIgcmF0aGVyIHRoYW4gYSB0YXJnZXQgbGFuZ3VhZ2Ugc3RyaW5nLgogICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGFkZCB0aGUgZm9sbG93aW5nIHdvcmthcm91bmQgdG8gd3JhcCB0aGVzZSBhcyBzdHJpbmdzOgoKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgowMS8yOC8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dIAoJICAgIEFkZCB0eXBlbWFwcyBmb3IgaGFuZGxpbmcgb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgoKMDEvMjQvMjAwNjogbW1hdHVzCgkgICAgLSBCZXR0ZXIgc3VwcG9ydCBmb3IgdGhlICVuYXR1cmFsdmFyIGRpcmVjdGl2ZSwgbm93IGl0CgkgICAgICB3b3JrcyB3aXRoIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGFzIHdlbGwgYXMKCSAgICAgIEphdmEvQyMuCgkgICAgICAKCSAgICAgIE5vdywgaXQgY2FuIGFsc28gYmUgYXBwbGllZCB0byBjbGFzcyB0eXBlczoKCgkgICAgICAgICVuYXR1cmFsdmFyIHN0ZDo6c3RyaW5nOwoJICAgICAgICAlaW5jbHVkZSA8c3RkX3N0cmluZy5pPgoJICAgICAgCiAgICAgICAgICAgICAgdGhhdCB3aWxsIHRlbGwgc3dpZyB0byB1c2UgdGhlICduYXR1cmFsJyB3cmFwcGluZwogICAgICAgICAgICAgIG1lY2hhbmlzbSB0byBhbGwgc3RkOjpzdHJpbmcgZ2xvYmFsIGFuZCBtZW1iZXIKICAgICAgICAgICAgICB2YXJpYWJsZXMuCgoJICAgIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSAlYWxsb3dleGNlcHQgZmVhdHVyZSBhbG9uZyB0aGUKICAgICAgICAgICAgICBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB3aGljaCBhbGxvd3MgdGhlICVleGNlcHRpb24gZmVhdHVyZQogICAgICAgICAgICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHZhcmlhYmxlIGFjY2VzcyBtZXRob2RzLiBBbHNvLCBhZGQKICAgICAgICAgICAgICB0aGUgJWV4Y2VwdGlvbnZhciBkaXJlY3RpdmUgdG8gc3BlY2lmeSBhIGRpc3RpbnRpYwogICAgICAgICAgICAgIGV4Y2VwdGlvbiBtZWNoYW5pc20gb25seSBmb3IgdmFyaWFibGVzLgoJICAgICAgCgkgICAgCgkgICAgLSBBZGQgbW9yZSBkb2NzIGZvciB0aGUgJWRlbG9iamVjdCBkaXJlY3RpdmUgdG8gbWFyayBhIG1ldGhvZCBhcyBhCgkgICAgICBkZXN0cnVjdG9yLCAnZGlzb3duaW5nJyB0aGUgZmlyc3QgYXJndW1lbnQuIEZvciBleGFtcGxlOgoKCSAgICAgICAgJW5ld29iamVjdCBjcmVhdGVfZm9vOwoJICAgICAgICAlZGVsb2JqZWN0IGRlc3Ryb3lfZm9vOwoKCSAgICAgICAgRm9vICpjcmVhdGVfZm9vKCkgeyByZXR1cm4gbmV3IEZvbygpOyB9CgkgICAgICAgIHZvaWQgZGVzdHJveV9mb28oRm9vICpmb28pIHsgZGVsZXRlIGZvbzsgfQoKCSAgICAgIG9yIGluIGEgbWVtYmVyIG1ldGhvZCBhczoKCgkgICAgICAgICVkZWxvYmplY3QgRm9vOjpkZXN0cm95OwoKCSAgICAgICAgY2xhc3MgRm9vIHsKCSAgICAgICAgcHVibGljOgoJICAgICAgICAgIHZvaWQgZGVzdHJveSgpIHsgZGVsZXRlIHRoaXM7fQoKCSAgICAgICAgcHJpdmF0ZToKCSAgICAgICAgICB+Rm9vKCk7CiAgICAgICAgICAgICAgIH07CgoKMDEvMjQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICAtIFJlbW92ZWQgdGhlIHR5cGUgc3dpZ19sdWFfY29tbWFuZF9pbmZvICYgcmVwbGFjZSB3aXRoIGx1YUxfcmVnCgkgICAgICAod2hpY2ggdGhlbiBicm9rZSB0aGUgY29kZSksIGZpeGVkIHRoaXMKCSAgICAtIGFkZGVkIGFuIGFkZGl0aW9uYWwgY2FzdCBpbiB0aGUgdHlwZW1hcHMgZm9yIGVudW0ncwoJICAgICAgZHVlIHRvIHRoZSBpc3N1ZSB0aGF0IFZDLk5ldCB3aWxsIG5vdCBhbGxvdyBjYXN0aW5nIG9mCgkgICAgICBhIGRvdWJsZSB0byBhbiBlbnVtIGRpcmVjdGx5LiBUaGVyZWZvcmUgY2FzdCB0byBpbnQgdGhlbiB0byBlbnVtCgkgICAgICAodGhhbmtzIHRvIEphc29uIFJlZ28gZm9yIHRoaXMgb2JzZXJ2YXRpb24pCgowMS8xNi8yMDA2OiBtbWF0dXMgKENoYW5nZSBkaXNhYmxlZC4uLiB3aWxsIGJlIGJhY2sgaW4gQ1ZTIHNvb24pCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgcmVnZXhwIHZpYSB0aGUgZXh0ZXJuYWwgbGlicmFyeQoJICAgIFJ4U3BlbmNlci4gU1dJRyBkb2Vzbid0IHJlcXVpcmUgdGhpcyBsaWJyYXJ5IHRvIGNvbXBpbGUKCSAgICBhbmQvb3IgcnVuLiBCdXQgaWYgeW91IHNwZWNpZnkgLS13aXRoLXJ4c3BlbmNlciwgYW5kIHRoZQoJICAgIGxpYnJhcnkgaXMgZm91bmQgZHVyaW5nIGluc3RhbGxhdGlvbiwgdGhlbiBzd2lnIHdpbGwgdXNlCgkgICAgaXQgaW4gdGhyZWUgcGxhY2VzOgoKCSAgICAtIEluICVyZW5hbWVzIHJ1bGVzLCB2aWEgdGhlIG5ldyByeHNtYXRjaCBydWxlcywgZm9yIGV4YW1wbGU6CgkgICAgCSAgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHNtYXRjaCRuYW1lPSJHU0xfLioiKSAiIjsKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5vZGVUeXBlPSJlbnVtIEdTTF8uKiIpICIiOwoJICAgIAkgCiAgICAgICAgICAgICAgcnhzbWF0Y2ggaXMgc2ltaWxhciB0byB0aGUgbWF0Y2ggcnVsZSwgaXQganVzdCB1c2VzCiAgICAgICAgICAgICAgdGhlIFJ4U3BlbmNlciByZWdleHAgbGlicmFyeSB0byBkZWNpZGUgaWYgdGhlcmUgaXMgYQogICAgICAgICAgICAgIG1hdGNoIHdpdGggdGhlIHByb3ZpZGVkIHJlZ2V4cC4gQXMgd2l0aCB0aGUgbWF0Y2gKICAgICAgICAgICAgICBydWxlLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBuZWdhdGUgcnVsZSBub3RyeHNtYXRjaC4KCgkgICAgLSBJbiB0aGUgJXJlbmFtZSB0YXJnZXQgbmFtZSB2aWEgdGhlIHJ4c3RhcmdldCBvcHRpb24sIGZvciBleGFtcGxlOgoJICAgIAkJIAoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzdGFyZ2V0PTEpICJHU0xfLioiOwoKCSAgICAJd2hlcmUgdGhlIHRhcmdldCBuYW1lICJHU0wuKiIgaXMgbm93IHVuZGVyc3Rvb2QgYXMgYQoJICAgIAlyZWdleHAgdG8gYmUgbWF0Y2hlZC4gIAoJICAgIAkgCiAgICAgICAgICAgIC0gSW4gdGhlIG5ldyBlbmNvZGVyICJyeHNwZW5jZXIiLCB3aGljaCBsb29rcyBsaWtlOgoKCSAgICAJICAlKHJ4c3BlbmNlcjpbcmVnZXhwXVtyZXBsYWNlXSlzCgoJICAgIAl3aGVyZSAicmVnZXhwIiBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGFuZCAicmVwbGFjZSIKCSAgICAJaXMgYSBzdHJpbmcgdXNlZCBhcyBhIHJlcGxhY2VtZW50LCB3aGVyZSB0aGUgQDAsQDEsLi4uLEA5CgkgICAgCXBzZXVkbyBhcmd1bWVudHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZQoJICAgIAljb3JyZXNwb25kaW5nIG1hdGNoaW5nIGl0ZW1zIGluIHRoZSByZWcgZXhwcmVzc2lvbi4KCgkgICAgCUZvciBleGFtcGxlOgoJICAgIAkJICAgICAgCgkgICAgICAgICUocnhzcGVuY2VyOltHU0wuKl1bQDBdKXMgICAgICAgPC0gSGVsbG8gICAgLT4gCgkgICAgICAgICUocnhzcGVuY2VyOltHU0wuKl1bQDBdKXMgICAgICAgPC0gR1NMSGVsbG8gLT4gR1NMSGVsbG8KCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTCguKildW0AxXSlzICAgICA8LSBHU0xIZWxsbyAtPiBIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bZ3NsQDFdKXMgIDwtIEdTTEhlbGxvIC0+IGdzbEhlbGxvCgoJICAgIAlBbm90aGVyIGV4YW1wbGUgY291bGQgYmU6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJShsb3dlcmNhc2UpcyIsc291cmNlZm10PSIlKHJ4c3BlbmNlcjpbR1NMXyguKildW0AxXSlzIiwlJGlzZnVuY3Rpb24pICIiOwoKCSAgICAJd2hpY2ggdGFrZSBvdXQgdGhlIHByZWZpeCAiR1NMXyIgYW5kIHJldHVybnMgYWxsIHRoZQoJICAgIAlmdW5jdGlvbiBuYW1lcyBpbiBsb3dlciBjYXNlcywgYXMgZm9sbG93aW5nOgoKCSAgICAJICAgIHZvaWQgR1NMX0hlbGxvKCk7ICAgLT4gICBoZWxsbygpOwoJICAgIAkgICAgdm9pZCBHU0xfSGkoKTsgICAgICAtPiAgIGhpKCk7CgkgICAgCSAgICBjb25zdCBpbnQgR1NMX01BWDsgIC0+ICAgR1NMX01BWDsgIC8vIG5vIGNoYW5nZSwgaXMgbm90IGEgZnVuY3Rpb24KCQoJICAgIFdlIHVzZSB0aGUgUnhTcGVuY2VyIGFzIGFuIGluaXRpYWwgdGVzdCBiZWQgdG8KICAgICAgICAgICAgaW1wbGVtZW50aW9uIHdoaWxlIHdlIGRlY2lkZSB3aGljaCBsaWJyYXJ5IHdpbGwgYmUKICAgICAgICAgICAgZmluYWxseSBhZGRlZCB0byBzd2lnLgoKICAgICAgICAgICAgWW91IGNhbiBvYnRhaW4gdGhlIFJ4U3BlbmNlciBsaWJyYXJ5IGZyb20gCgkgICAgCgkgICAgICBodHRwOi8vYXJnbGlzdC5jb20vcmVnZXggKFVuaXgpCgoJICAgIG9yCgkgICAgIAoJICAgICAgaHR0cDovL2dudXdpbjMyLnNvdXJjZWZvcmdlLm5ldC9wYWNrYWdlcy5odG1sIChXaW5kb3dzKQoKCSAgICBPbmNlIGluc3RhbGxlZCwgdXNlICJtYW4gcnhzcGVuY2VyIiB0byBnZXQgbW9yZSBpbmZvCgkgICAgYWJvdXQgdGhlIHJlZ2V4cCBmb3JtYXQsIG9yIGp1c3QgZ29vZ2xlIHJ4c3BlbmNlci4KCgkgICAgU2luY2Ugbm93IHlvdSBjYW4gZW5hYmxlIHRoZSByeHNtYXRjaCBydWxlcyAoc2VlIGFib3ZlKSwKICAgICAgICAgICAgdGhlIHNpbXBsZSBvciAnfCcgc3VwcG9ydCBmb3IgdGhlIG1hdGNoIHJ1bGVzCiAgICAgICAgICAgICgwMS8xMi8yMDA2OiBtbWF0dXMpIGlzIGRpc2FibGVkLiBTdGlsbCwgaWYgeW91IGhhdmUKICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCB0aGUgcnhzcGVuY2VyIGxpYnJhcnksIHlvdSBjYW4gcmUtZW5hYmxlCiAgICAgICAgICAgIHRoZSBzaW1wbGUgJ21hdGNoIG9yJyBzdXBwb3J0IHVzaW5nCiAgICAgICAgICAgIC1EU1dJR19VU0VfU0lNUExFX01BVENIT1IuCgkgIAoKMDEvMTYvMjAwNjogbW1hdHVzCgkgICAgQ2hhbmdlIHRoZSAlcmVuYW1lIHByZWRpY2F0ZXMgdG8gdXNlIHRoZSBwcmVmaXggJyUkJywgYXMgaW46CgkgICAgCgkgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIiwlJGlzZnVuY3Rpb24sJSRpc21lbWJlcikgIiI7IAoJICAgCQogICAgICAgICAgICB0byBhdm9pZCBjbGFzaGVzIHdpdGggb3RoZXIgc3dpZyBtYWNyb3MvZGlyZWN0aXZlcy4KCjAxLzE0LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBSdWJ5IGJhbmchIG1ldGhvZHMgdmlhIGEgbmV3ICViYW5nIGZlYXR1cmUuCgkgICAgQmFuZyBtZXRob2RzIGVuZCBpbiBleGNsYW1hdGlvbiBwb2ludHMgYW5kIGluZGljYXRlIHRoYXQgdGhlCgkgICAgb2JqZWN0IGJlaW5nIHByb2Nlc3NlZCB3aWxsIGJlIG1vZGlmaWVkIGluLXBsYWNlIGFzIAoJICAgIG9wcG9zZWQgdG8gYmVpbmcgY29waWVkLgoKMDEvMTIvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIFVwZGF0ZWQgdGhlIFJ1YnkgbW9kdWxlIHRvIGF1dG9tYXRpY2FsbHkgY29udmVydAoJICAgIG1ldGhvZCBuYW1lcyB0byBsb3dlcl9jYXNlX3dpdGhfdW5kZXJzY29yZXMgdXNpbmcgdGhlCgkgICAgbmV3ICVyZW5hbWUgZnVuY3Rpb25hbGl0eS4KCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIGFsaWFzZXMgZm9yICdjYXNlJyBlbmNvZGVycyB1c2VkIHdpdGggJXJlbmFtZS8lbmFtZXdhcm4KCgkgICAgICAlKHVwcGVyY2FzZSlzICAgaGVsbG9fd29ybGQgLT4gSEVMTE9fV09STEQKCSAgICAgICUobG93ZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb3dvcmxkCgkgICAgICAlKGNhbWVsY2FzZSlzICAgaGVsbG9fd29ybGQgLT4gSGVsbG9Xb3JsZAoJICAgICAgJSh1bmRlcmNhc2UpcyAgIEhlbGxvV29ybGQgIC0+IGhlbGxvX3dvcmxkCgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlIC1kdW1wX3BhcnNlX21vZHVsZSBhbmQgLWR1bXBfcGFyc2VfdG9wIG9wdGlvbnMsCgkgICAgd2hpY2ggYXJlIHNpbWlsYXIgdG8gLWR1bXBfbW9kdWxlIGFuZCAtZHVtcF90b3AsIGJ1dCB0aGV5CgkgICAgZHVtcCB0aGUgbm9kZSB0cmVlcyBqdXN0IGFmdGVyIHBhcnNpbmcsIHNob3dpbmcgb25seSB0aGUgCgkgICAgYXR0cmlidXRlcyB2aXNpYmxlIGF0IHRoZSBwYXJzaW5nIHN0YWdlLCBhbmQgbm90IHRoZSBhZGRlZAoJICAgIGxhdGVyIGluIHR5cGVtYXAuY3h4LCBhbGxvY2F0ZS5jeHgsIGxhbmcuY3h4IG9yIGVsc2V3aGVyZS4KCSAgICAKCSAgICBCZXNpZGVzIGRlYnVnZ2luZyBwb3JwdXNlcywgdGhlc2Ugb3B0aW9ucyBhcmUgdmVyeSB1c2VmdWwKCSAgICBpZiB5b3UgcGxhbiB0byB1c2UgJXJlbmFtZSBpbiBhbiAiYWR2YW5jZSB3YXkiLCBzaW5jZSBpdAoJICAgIHNob3dzIG9ubHkgYW5kIGFsbCB0aGUgbm9kZSdzIGF0dHJpYnV0ZXMgeW91IGNhbiB1c2UKCSAgICBpbnNpZGUgdGhlIG1hdGNoIHJ1bGVzLgoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHByZWRpY2F0ZXMgdG8gJXJlbmFtZSwgc28sIHlvdSBkb24ndCBuZWVkIHRvCgkgICAgICByZW1lbWJlciwgZm9yIGV4YW1wbGUsIGhvdyB0byBtYXRjaCBhIG1lbWJlciBmdW5jdGlvbi4KCgkgICAgICBOb3cgaXQgaXMgZWFzeSwgZm9yIGV4YW1wbGUgdG8gdXNlIHRoZSAndXRpdGxlJyBlbmNvZGVyIAoJICAgICAgaW4gYWxsIHRoZSBtZW1iZXIgbWV0aG9kcywgeW91IHR5cGU6CgoJICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIiwlaXNmdW5jdGlvbiwlaXNtZW1iZXIpICIiOwoKCSAgICAgIG9yIHRvIGlnbm9yZSBhbGwgdGhlIGVudW1pdGVtcyBpbiBhIGdpdmVuIGNsYXNzOgoKCSAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsICVpc2VudW1pdGVtLCAlY2xhc3NuYW1lPSJNeUNsYXNzIikgIiI7ICAKCgkgICAgICBBdmFpbGFibGUgcHJlZGljYXRlcyBhcmUgKHNlZSBzd2lnLnN3Zyk6CgogICAgICAgICAgICAgICAgJWlzZW51bSAgICAgICAgIAoJCSVpc2VudW1pdGVtICAgICAKCQklaXNhY2Nlc3MgICAgICAgCgkJJWlzY2xhc3MgICAgICAgIAoJCSVpc2V4dGVuZCAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzY29uc3RydWN0b3IgIAoJCSVpc2Rlc3RydWN0b3IgICAKCQklaXNuYW1lc3BhY2UgICAgCgkJJWlzdGVtcGxhdGUgICAgIAoJCSVpc2NvbnN0YW50ICAgICAKCQkJCQkKCQklaXN1bmlvbiAgICAgICAgCgkJJWlzZnVuY3Rpb24gICAgIAoJCSVpc3ZhcmlhYmxlICAgICAKCQklaXNpbW11dGFibGUgICAgCgkJCQkJCgkJJWlzc3RhdGljICAgICAgIAoJCSVpc2ZyaWVuZCAgICAgICAKCQklaXN0eXBlZGVmICAgICAgCgkJJWlzdmlydHVhbCAgICAgIAoJCSVpc2V4cGxpY2l0ICAgICAKCQklaXNleHRlcm4gICAgICAgCgkJCQkJCgkJJWlzbWVtYmVyICAgICAgIAoJCSVpc2dsb2JhbCAKCQklaW5uYW1lc3BhY2UKCgkJJWlzcHVibGljICAgIAoJCSVpc3Byb3RlY3RlZCAKCQklaXNwcml2YXRlICAgCgkJCQkgICAgIAoJCSVjbGFzc25hbWUgICAKCiAgICAgICAgICAgICAgVGhlc2UgcHJlZGljYXRlcyBjb3JyZXNwb25kIHRvIHNwZWNpZmljICdtYXRjaCcKICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMsIHdoaWNoIHNvbWV0aW1lcyBhcmUgbm90IGFzIGV2aWRlbnQgYXMgdGhlCiAgICAgICAgICAgICAgcHJlZGljYXRlcyBuYW1lcy4KCgogICAgICAgICAgICAtIEFkZCB0aGUgb3IgJ3wnIG9wZXJhdGlvbiBpbiAlcmVuYW1lIG1hdGNoLCBmb3IKICAgICAgICAgICAgICBleGFtcGxlIHRvIGNhcGl0YWxpemUgYWxsIHRoZSBjb25zdGFudHMgKCVjb25zdGFudCBvcgogICAgICAgICAgICAgIGNvbnN0IGNkZWNsKToKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSgiJSh1cHBlcilzIixtYXRjaD0iY2RlY2x8Y29uc3RhbnQiLCVpc2ltbXV0YWJsZSkgIiI7CiAgICAgICAgICAgICAgICAKCgowMS8xMi8yMDA2OiBtZ29zc2FnZQoJICAgIC0JUGFydGlhbCBmaXhlZCBvZiBlcnJvcnMgdW5kZXIgQzg5LCBidWcgIzEzNTY1NzQKCSAgICAJKGNvbnZlcnRlZCBDKysgc3R5bGUgY29tbWVudHMgdG8gQyBzdHlsZSkKCSAgICAtCUFkZGVkIHBhdGNoZXMgZnJvbSBuZW9tYW50cmFAdXNlcnMuc2YubmV0ICMxMzc5OTg4IGFuZCAjMTM4ODM0MwoJICAgIAltaXNzaW5nIGEgJ3JldHVybicgc3RhdGVtZW50IGZvciBlcnJvciBjb25kaXRpb25zCgkgICAgCWFsc28gdXBkYXRlZCB0aGUgJWluaXQgYmxvY2sgYnVnICMxMzU2NTg2CgkJIAowMS8xMC8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCB0aGUgJ3V0aXRsZScgZW5jb2RlciwgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gYWRkCgkgICAgICB5b3VyIG93biBlbmNvZGVyLiBJIGFkZGVkIHRoZSBlbmNvZGVyIG1ldGhvZCBpbiBtaXNjLmMgCgkgICAgICBidXQgZGV2ZWxvcGVycyBjYW4gYWRkIG90aGVycywgdGhlIHNhbWUgd2F5LCBpbnNpZGUgYW55CgkgICAgICB0YXJnZXQgbGFuZ3VhZ2UuCgkgICAgICAKCSAgICAgIFdlbGwsICd1dGl0bGUnIGlzIHRoZSByZXZlcnNlIG9mICdjdGl0bGUnLCBpZToKCgkgICAgICAgICAlcmVuYW1lKCIlKGN0aXRsZSlzIikgY2FtZWxfY2FzZTsgIC0+IENhbWVsQ2FzZTsKCSAgICAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiKSBDYW1lbENhc2U7ICAgLT4gY2FtZWxfY2FzZTsKCQkgCgowMS8xMC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCiAgICAgICAgICAgIFVwZGF0ZWQgUnVieSBFeGNlcHRpb24gaGFuZGxpbmcuICBDbGFzc2VzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aHJvd3MgY2xhdXNlcywgCiAgICAgICAgICAgIG9yIGFyZSBtYXJrZWQgYXMgJWV4Y2VwdGlvbmNsYXNzLCBhcmUgbm93IGluaGVyaXRlZCBmcm9tIHJiX2VSdW50aW1lRXJyb3IuIAogICAgICAgICAgICBUaGlzIGFsbG93cyBpbnN0YW5jZXMgb2YgdGhlc2UgY2xhc3NlcyB0byBiZSByZXR1cm5lZCB0byBSdWJ5IGFzIGV4Y2VwdGlvbnMuIAogICAgICAgICAgICBUaHVzIGlmIGEgQysrIG1ldGhvZCB0aHJvd3MgYW4gaW5zdGFuY2Ugb2YgTXlFeGNlcHRpb24sIHRoZSBjYWxsaW5nIFJ1YnkgCiAgICAgICAgICAgIG1ldGhvZCB3aWxsIGdldCBiYWNrIGEgTXlFeGNlcHRpb24gb2JqZWN0LiAgVG8gc2VlIGFuIGV4YW1wbGUsIAogICAgICAgICAgICBsb29rIGF0IHJ1YnkvZXhhbXBsZXMvZXhjZXB0aW9uX2NsYXNzLgoKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgCiAgICAgICAgICAgIC0gQWRkIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUsIHdoaWNoIGNvbXBsZW1lbnRzIHRoZSAlZXhjZXB0aW9uCgkgICAgZGlyZWN0aXZlIGluIGEgbW9yZSBhdXRvbWF0aWMgd2F5LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKCiAgICAgICAgICAgICAgICBpbnQgZm9vKCkgdGhyb3coRTEpOwoKICAgICAgICAgICAgc3dpZyBnZW5lcmF0ZXMgdGhlIHByb3BlciB0cnkvY2F0Y2ggY29kZSB0byBkaXNwYXRjaCBFMS4KCSAgICAKCSAgICBCdXQgaWYgeW91IGhhdmU6CgoKCSAgICAgICAgICBpbnQgYmFyZm9vKGludCBpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgewoJICAgICAgICAgICAgICAgdGhyb3cgRTEoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICB0aHJvdyBFMigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWUsIHdoZXJlIHRoZXJlIGlzIG5vIGV4cGxpY2l0IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGluIHRoZSBkZWNsLCB5b3UgCgkgICAgZW5kIHVwIGRvaW5nOgoJCSAgCiAgICAgICAgICAgICAgICVleGNlcHRpb24gYmFyZm9vIHsJCQkKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUxKSB7CS4uLiB9CQkJCSAgCgkgICAgICAgICB9IGNhdGNoKEUyKSB7CS4uLiB9CQkJCSAgCgkgICAgICAgfQkJCQkKCSAgICAKCSAgICB3aGljaCBpcyB2ZXJ5IHRlZGlvdXMuIFdlbGwsIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUgZGVmaW5lcwoJICAgIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdG8gY2F0Y2gsIGFuZCBmcm9tIHN3aWc6CiAJCgkgICAgICAgJWNhdGNoZXMoRTEsRTIpIGJhcmZvbyhpbnQgaSk7CgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSk7CgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvIAoKCSAgICAgICBpbnQgYmFyZm9vKGludCBpKSB0aHJvdyhFMSxFMik7CgoJICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlICVjYXRjaGVzIGxpc3QgZG9lc24ndCBoYXZlIHRvCgkgICAgY29ycmVzcG9uZCB0byB0aGUgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91CgkgICAgaGF2ZToKCgkJc3RydWN0IEUge307CgkJc3RydWN0IEUxIDogRSB7fTsKCQlzdHJ1Y3QgRTIgOiBFIHt9OwoKICAJICAgICAgICBpbnQgYmFyZm9vKGludCBpKSB0aHJvdyhFMSxFMik7CgogICAgICAgICAgICB5b3UgY2FuIGRlZmluZQoJICAgICAgICAKCQklY2F0Y2hlcyhFKSBiYXJmb28oaW50IGkpOwoJCgkgICAgYW5kIHN3aWcgd2lsbCBnZW5lcmF0ZSBhbiBhY3Rpb24gY29kZSBlcXVpdmFsZW50IHRvCgoJICAgICAgICAgdHJ5IHsJCQkJCgkgICAgICAgICAgICRhY3Rpb24JCQkKCSAgICAgICAgIH0gY2F0Y2goRSAmX2UpIHsgCgkJICAgPHJhaXNlIF9lPjsKCQkgfQkKCiAgICAgICAgICAgIE9mIGNvdXJzZSwgeW91IHN0aWxsIGhhdmUgdG8gc2F0aXNmeSB0aGUgQysrIHJlc3RyaWN0aW9ucywKCSAgICBhbmQgdGhlIGNhdGNoZXMgbGlzdCBtdXN0IGJlIGNvbXBhdGlibGUgKG5vdCB0aGUgc2FtZSkKCSAgICBhcyB0aGUgb3JpZ2luYWwgbGlzdCBvZiB0eXBlcyBpbiB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uCgoJICAgIEFsc28sIHlvdSBjYW4gbm93IHNwZWNpZnkgdGhhdCB5b3Ugd2FudCB0byBjYXRjaCB0aGUKCSAgICB1bmtub3duIGV4Y2VwdGlvbiAnLi4uJywgZm9yIGV4YW1wbGU6CgoJICAgICAgICVjYXRjaGVzKEUxLEUyLC4uLikgYmFyZm9vKGludCk7CgoJICAgIEluIGFueSBjYXNlLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIHdpbGwgZW1pdCB0aGUKCSAgICBjb2RlIHRvIGNvbnZlcnQgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGVycm9yL2V4Y2VwdGlvbgogICAgICAgICAgICB1c2luZyB0aGUgJ3Rocm93cycgdHlwZW1hcC4KCgkgICAgRm9yIHRoZSAnLi4uJyBjYXNlIHRvIHdvcmssIHlvdSBuZWVkIHRvCgkgICAgd3JpdGUgdGhlIHByb3BlciB0eXBlbWFwIGluIHlvdXIgdGFyZ2V0IGxhbmd1YWdlLiBJbiB0aGUKCSAgICBVVEwsIHRoaXMgbG9va3MgbGlrZToKCgkgICAgICAldHlwZW1hcCh0aHJvd3MpICguLi4pIHsKCSAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19SdW50aW1lRXJyb3IsInVua25vd24gZXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgfQoKMDEvMDkvMjAwNjogbXV0YW5kaXoKCSAgICBbQWxsZWdyb2NsXQoKICAgICAgICAgICAgRml4ZXMgYSBudW1iZXIgb2YgU0VHVnMgcHJpbWFyaWx5IGluIHRoZSBoYW5kbGluZyBvZgogICAgICAgICAgICB2YXJpb3VzIGFub255bW91cyB0eXBlcy4gRm91bmQgaW4gYSBwYXNzIHRocm91Z2ggdGhlCiAgICAgICAgICAgIHN3aWcgdGVzdC1zdWl0ZS4gU3RpbGwgbW9yZSB0byBkbyBoZXJlLCBidXQgdGhpcyBpcyBhCiAgICAgICAgICAgIGdvb2QgY2hlY2twb2ludC4KCiAgICAgICAgICAgIEFkZHMgLWN3cmFwIGFuZCAtbm9jd3JhcCBhcyBhbiBhbGxlZ3JvY2wgc3BlY2lmaWMKICAgICAgICAgICAgY29tbWFuZC1saW5lIGFyZ3VtZW50LiBDb250cm9scyBnZW5lcmF0aW5nIG9mIGEgQwogICAgICAgICAgICB3cmFwcGVyIGZpbGUgd2hlbiB3cmFwcGluZyBDIGNvZGUuIEJ5IGRlZmF1bHQgb25seSBhCiAgICAgICAgICAgIGxpc3AgZmlsZSBpcyBjcmVhdGVkIGZvciBDIGNvZGUgd3JhcHBpbmcuCgogICAgICAgICAgICBEb2MgdXBkYXRlcyBmb3IgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYW5kIGZpeGVzIGFzCiAgICAgICAgICAgIHBvaW50ZWQgb3V0IG9uIHN3aWctZGV2ZWwKCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggdW5zaWduZWQgbG9uZyBsb25nIGFuZCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgJiB0eXBlbWFwcwogICAgICAgICAgICAtIEJ1ZyAjMTM5ODM5NCAgd2l0aCBwYXRjaCBmcm9tIERyaWVzIERlY29jawoKMDEvMDYvMjAwNjogbW1hdHVzCgkgICAgQWRkICduYW1lZCcgd2FybmluZyBjb2Rlcywgbm93IGluIGFkZGl0aW9uIHRvOgoJICAgIAoJICAgICAgJXdhcm5maWx0ZXIoODEzKTsKCSAgIAoJICAgIHlvdSBjYW4gdXNlCgoJICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fSkFWQV9NVUxUSVBMRV9JTkhFUklUQU5DRSk7CgoJICAgIGp1c3QgdXNlIHRoZSBzYW1lIGNvZGUgbmFtZSBmb3VuZCBpbiAgU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaCAKCSAgICBwbHVzIHRoZSAnU1dJRycgcHJlZml4LgoKCSAgICBJZiBhIGRldmVsb3BlciBhZGRzIGEgbmV3IHdhcm5pbmcgY29kZSwgdGhlIExpYi9zd2lnd2Fybi5zd2cgZmlsZQogICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIHJ1bm5pbmcgdGhlIHRvcCBsZXZlbCBtYWtlLgoKMDEvMDUvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIFJlaW1wbGVtZW50ZWQgb2JqZWN0IHRyYWNraW5nIGZvciBSdWJ5LiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiB3b3JrcwoJICAgIGJ5IGV4cGFuZGluZyB0aGUgc3dpZ19jbGFzcyBzdHJ1Y3R1cmUgZm9yIFJ1YnkgYnkgYWRkaW5nIGEgdHJhY2tPYmplY3RzCgkgICAgZmllbGQuICBUaGlzIGZpZWxkIGNhbiBiZSBzZXQvdW5zZXQgdmlhICV0cmFja29iamVjdHMgYXMgZXhwbGFpbmVkCgkgICAgaW4gdGhlIFJ1YnkgZG9jdW1lbnRhdGlvbi4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gaXMgbW9yZSByb2J1c3QKCSAgICBhbmQgdGFrZXMgbGVzcyBjb2RlIHRvIGltcGxlbWVudC4KCQkKMDEvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlZXh0ZW5kIGFuZCBzdGF0aWMgY29uc3QgaW50ZWdyYWwgdHlwZXMsIGVnOgoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBiYXIgPSA0MjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OyAKCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgaW5mbyBmb3Igb2xkIGFuZCBuZXcgZGVidWcgb3B0aW9uczoKICAgICAgICAgICAgICAKICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIGVudGlyZSBub2RlIHRyZWUsIGluY2x1ZGluZyBzeXN0ZW0gbm9kZXMgICAgCiAgICAgCSAgICAtZHVtcF9tb2R1bGUgICAgLSBQcmludCBpbmZvcm1hdGlvbiBvZiB0aGUgbW9kdWxlIG5vZGUgdHJlZSwgYXZvaWRpbmcgc3lzdGVtIG5vZGVzICAgICAKICAgICAJICAgIC1kdW1wX2NsYXNzZXMgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbGFzc2VzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UJICAgICAgIAogICAgIAkgICAgLWR1bXBfdHlwZWRlZiAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGVzIGFuZCB0eXBlZGVmcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgCSAgICAtZHVtcF90YWdzICAgICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFncyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kZWJ1Z190eXBlbWFwICAtIFByaW50IGluZm9ybWF0aW9uIGZvciBkZWJ1Z2dpbmcgdHlwZW1hcHMJCQkgICAgICAgCiAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAtIFByaW50IGluZm9ybWF0aW9uIGZvciBkZWJ1Z2dpbmcgdGVtcGxhdGVzCQkJICAgICAgICAKCgkgIC0gQWRkIHRoZSBmYWtldmVyc2lvbi4gSWYgeW91IGhhdmUgYSBwcm9qZWN0IHRoYXQgdXNlcwogICAgICAgICAgICBjb25maWd1cmUvc2V0dXAucHksIG9yIGFub3RoZXIgYXV0b21hdGljIGJ1aWxkaW5nIHN5c3RlbQogICAgICAgICAgICBhbmQgcmVxdWlyZXMgYSBzcGVjaWZpYyBzd2lnIHZlcnNpb24sIGxldCBzYXkgMS4zLjIyIAoJICAgIHlvdSBjYW4gdXNlOgoKCSAgICAgICBTV0lHX0ZFQVRVUkVTPSItZmFrZXZlcnNpb24gMS4zLjIyIgoKCSAgICAgb3IKIAogICAgICAgICAgICAgICBzd2lnIC1mYWtldmVyc2lvbiAxLjMuMjIKCiAgICAgICAgICAgICBhbmQgdGhlbiBzd2lnIC12ZXJzaW9uIHdpbGwgcmVwb3J0IDEuMy4yMiBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICAgY3VycmVudCB2ZXJzaW9uLgoKCSAgICAgVHlwaWNhbCB1c2Ugd291bGQgYmUKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIgLi9jb25maWd1cmUgCSAgICAgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIG9wdGlvbi9mb3JtYXQgc3VwcG9ydCB0byAlcmVuYW1lIGFuZCAlbmFtZXdhcm4uCQoJICAgIE5vdyAlbmFtZXdhcm4gY2FuIGZvcmNlIHJlbmFtaW5nLCBmb3IgZXhhbXBsZToKCgkgICAgICAlbmFtZXdhcm4oIjMxNDogaW1wb3J0IGlzIGEga2V5d29yZCIscmVuYW1lPSJfJXMiKSAiaW1wb3J0IjsKCSAgICAKCSAgICBhbmQgcmVuYW1lIGNhbiBhbHNvIHN1cHBvcnQgZm9ybWF0IGZvcm1zOgoKCSAgICAgICAlcmVuYW1lKCJzd2lnXyVzIikgaW1wb3J0OwoKCSAgICBOb3csIHNpbmNlIHRoZSBmb3JtYXQgaXMgcHJvY2Vzc2VkIHZpYSBzd2lnIFByaW50ZiwgeW91CgkgICAgY2FuIHVzZSBlbmNvZGVycyBhcyBmb2xsb3dzOgoKCSAgICAgICAlcmVuYW1lKCIlKHRpdGxlKXMiKSAgaW1wb3J0OyAgICAgLT4gSW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJSh1cHBlcilzIikgIGltcG9ydDsgICAgIC0+IElNUE9SVAoJICAgICAgICVyZW5hbWUoIiUobG93ZXIpcyIpICBJbXBvcnQ7ICAgICAtPiBpbXBvcnQKCSAgICAgICAlcmVuYW1lKCIlKGN0aXRsZSlzIikgY2FtZWxfY2FzZTsgLT4gQ2FtZWxDYXNlCgkgICAgICAgCgkgICAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGFkZCBtb3JlIGVuY29kZXJzLCBhcyB0aGUgCgkgICAgZXhwZWN0ZWQgb25lIGZvciByZWd1bGFyIGV4cHJlc3Npb25zLiAKCgkgIC0gQWRkIHRoZSBhYm92ZSAnY3RpdGxlJyBlbmNvZGVyLCB3aGljaCBkb2VzIHRoZSBjYW1lbCBjYXNlOgoKCSAgICAgICAgY2FtZWxfY2FzZSAtPiBDYW1lbENhc2UKICAKCSAgLSBBbHNvLCB3aGlsZSB3ZSBnZXQgdGhlIHJlZ2V4cCBzdXBwb3J0LCBhZGQgdGhlICdjb21tYW5kJyBlbmNvZGVyLAogICAgICAgICAgICB5b3UgY2FuIHVzZSBpdCBhcyBmb2xsb3dzCgogICAgICAgICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6c2VkIC1lICdzL1woW2Etel1cKS9cVVxcMS8nIDw8PCApcyIpIGltcG9ydDsgCgoJICAgIHRoZW4gc3dpZyB3aWxsIHBvcGVuIHRoZSBjb21tYW5kCgkgICAgCgkJInNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgaW1wb3J0IgoJCQogICAgICAgICAgICBzZWUgYmVsb3cgZm9yIGFub255bW91cyByZW5hbWVzIGZvciBiZXR0ZXIgZXhhbXBsZXMuCQkKCiAgICAgICAgICAtIFRoZSByZW5hbWUgZGlyZWN0aXZlIG5vdyBhbHNvIGFsbG93czoKCgkgICAgLSBzaW1wbGUgbWF0Y2g6IG9ubHkgYXBwbHkgdGhlIHJlbmFtZSBpZiBhIHR5cGUgbWF0Y2gKCSAgICAgIGhhcHBlbiwgZm9yIGV4YW1wbGUKCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoPSJlbnVtaXRlbSIpIGhlbGxvOwoKCQkgZW51bSBIZWxsbyB7CgkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAKCQkgfTsKCQkgaW50IGhlbGxvKCkgIC0+ICBoZWxsbzsgCgoJICAgIC0gZXh0ZW5kZWQgbWF0Y2g6IG9ubHkgYXBwbHkgdGhlIHJlbmFtZSBpZiB0aGUgJ2V4dGVuZGVkIGF0dHJpYnV0ZScgbWF0Y2gKCSAgICAgIG9jY3VycmVkLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gc2FtZSBhcyBzaW1wbGUgbWF0Y2ggCQkKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgaGVsbG87IAoKCQkgZW51bSBIZWxsbyB7CgkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAKCQkgfTsKCgkgICAgICAgTm90ZSB0aGF0IHRoZSBzeW1ib2wgJyQnIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBhdHRyaWJ1dGUgbmFtZSBpbgoJICAgICAgIGEgJ3JlY3Vyc2l2ZScgd2F5LCBmb3IgZXhhbXBsZToKCgkJIC8vIG1hdGNoIG9ubHkgaGVsbG8gaW4gJ2VudW0gSGVsbG8nCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJHBhcmVudE5vZGUkdHlwZT0iZW51bSBIZWxsbyIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gICAvLyBtYXRjaAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgogICAgICAgICAgICAgICBoZXJlLCBmb3IgSGVsbG86OmhpLCB0aGUgInBhcmVudE5vZGUiIGlzICJIZWxsbyIsIGFuZCBpdHMgInR5cGUiCiAgICAgICAgICAgICAgIGlzICJlbnVtIEhlbGxvIi4KCSAgICAgICAKCSAgICAgICAKICAgICAgICAgICAgLSBBbm9ueW1vdXMgcmVuYW1lczogeW91IGNhbiB1c2UgJ2Fub255bW91cycgcmVuYW1lIGRpcmVjdGl2ZXMsIGZvciBleGFtcGxlOiAKCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBlbnVtIGl0ZW1zIGluIEhlbGxvCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJHBhcmVudE5vZGUkdHlwZT0iZW51bSBIZWxsbyIpICIiOyAKCgkJIGVudW0gSGVsbG8gewogCQkgICBoaSwgaGVsbG8gIC0+ICBIaSwgSGVsbG8gICAvLyBtYXRjaCBib3RoCgkJIH07CgoJCSBlbnVtIEhpIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIGhlbGxvICAgLy8gbm8gbWF0Y2gKCQkgfTsKCQkgCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBlbnVtIGl0ZW1zIAoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRub2RlVHlwZT0iZW51bWl0ZW0iKSAiIjsgCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgaXRlbXMgaW4gZ2l2ZW4gY29tbWFuZCAoc2xvb29vdywgYnV0Li4uKQoJCSAlcmVuYW1lKCUoY29tbWFuZDo8bXkgZXh0ZXJuYWwgY21kPilzKSAiIjsgCgoJCgkgICAgICBBbm9ueW1vdXMgcmVuYW1lcyB3aXRoIGNvbW1hbmRzIGNhbiBiZSB2ZXJ5IHBvd2VyZnVsLCBzaW5jZSB5b3UKCSAgICAgIGNhbiAnb3V0c291cmNlJyBhbGwgdGhlIHJlbmFtaW5nIG1lY2hhbmlzbSAob3IgcGFydCBvZiBpdCkgdG8gYW4KCSAgICAgIGV4dGVybmFsIHByb2dyYW06CgkgICAgICAKCSAgICAgICAgLy8gVXBwZXJjYXNlIGFsbCAoYW5kIG9ubHkpIHRoZSBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggJ2knCgkgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDphd2sgJy9eaS97cHJpbnQgdG91cHBlcigkMSl9JyA8PDwpcyIpICIiOyAgIAoJICAgICAgIAoJICAgICAgICBpbnQgaW1wb3J0ZWQoKSAtPiBJTVBPUlRFRDsKCSAgICAgICAgaW50IGhlbGxvKCkgICAgLT4gaGVsbG8KCgkgICAgICBOb3RlIHRoYXQgaWYgdGhlICdjb21tYW5kJyBlbmNvZGVyIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCBzd2lnCgkgICAgICB1bmRlcnN0YW5kcyB0aGF0IG5vIHJlbmFtZSBpcyBuZWNlc3NhcnkuCgoJICAgICAgQWxzbyBub3RlIHRoYXQgJXJlbmFtZSAncGFzc2VzJyB0aGUgbWF0Y2hlZCBuYW1lLiBGb3IgZXhhbXBsZSwgaW4KCSAgICAgIHRoaXMgY2FzZQoKCSAgICAgICAgbmFtZXNwYWNlIG5zMSB7CgkJICBpbnQgZm9vKCk7CgkJfQoKCSAgICAgICAgbmFtZXNwYWNlIG5zMiB7CgkJICBpbnQgYmFyKCk7CgkJfQoKCSAgICAgIHRoZSBleHRlcm5hbCBwcm9ncmFtIG9ubHkgcmVjZWl2ZXMgImZvbyIgYW5kICJiYXIiLiBJZiBuZWVkZWQsCgkgICAgICBob3dldmVyLCB5b3UgY2FuIHJlcXVlc3QgdGhlICdmdWxsbmFtZScgCgkgICAgICAgCQoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICdhd2sgJy9uczE6Oi97bD1zcGxpdCgkMSxhLCI6OiIpOyBwcmludCB0b3VwcGVyKGFbbF0pfScnIDw8PClzIixmdWxsbmFtZT0xKSAiIjsgICAKICAgICAgICAgICAgICAgIAoJCW5zMTo6Zm9vIC0+IEZPTwoJCW5zMjo6YmFyIC0+IGJhcgkKCQoJICAgIC0gTWl4aW5nIGVuY29kZXJzIGFuZCBtYXRjaGluZzogb2YgY291cnNlLCB5b3UgY2FuIGRvIG1peCBjb21tYW5kcwoJICAgICAgYW5kIG1hdGNoIGZpZWxkcywgZm9yIGV4YW1wbGU6CgoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBmbmNzPikiLG1hdGNoPSJjZGVjbCIpICIiOwoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBlbnVtcz4pIixtYXRjaD0iZW51bWl0ZW0iKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXMgaW5zaWRlIGEgY2xhc3M+KSIsbWF0Y2g9ImVudW1pdGVtIiwKCQkgICAgICAgIG1hdGNoJHBhcmVudE5vZGUkcGFyZW50Tm9kZSRub2RlVHlwZT0iY2xhc3MiKSAiIjsKCQkKCSAgICAgIFVzZSAic3dpZyAtZHVtcF9wYXJzZV9tb2R1bGUiIHRvIHNlZSB0aGUgYXR0cmlidXRlIG5hbWVzIHlvdSBjYW4gdXNlIHRvCgkgICAgICBtYXRjaCBhIHNwZWNpZmljIGNhc2UuCgkKICAgICAgICAgICAgLSAnc291cmNlZm10JyBhbmQgJ3RhcmdldGZtdCc6IHNvbWV0aW1lcyB5b3UgbmVlZCB0bwogICAgICAgICAgICAgIHByb2Nlc3MgdGhlICdzb3VyY2UnIG5hbWUgYmVmb3JlIGNvbXBhcmluZywgZm9yIGV4YW1wbGUKCgkgICAgICAgICVuYW1ld2FybigiMzE0OiBlbXB0eSBpcyBhIGtleXdvcmQiLHNvdXJjZWZtdD0iJShsb3dlcilzIikgImVtcHR5IjsKCgkgICAgICB0aGVuIGlmIHlvdSBoYXZlCgoJICAgICAgICBpbnQgRW1wdHkoKTsgIC8vICJFbXB0eSIgaXMgdGhlIHNvdXJjZSAKCQkKCSAgICAgIHlvdSB3aWxsIGdldCB0aGUga2V5d29yZCB3YXJuaW5nIHNpbmNlICdFbXB0eScgd2lsbCBiZQoJICAgICAgbG93ZXIgY2FzZWQsIHZpYSB0aGUgc291cmNlZm10PSIlKGxvd2VyKXMiIG9wdGlvbiwKCSAgICAgIGJlZm9yZSBiZWVuIGNvbXBhcmVkIHRvIHRoZSAndGFyZ2V0JyAiZW1wdHkiLgoKCSAgICAgIFRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgJ3RhcmdldGZtdCcgb3B0aW9uIHRvIHByb2Nlc3MgdGhlCgkgICAgICAndGFyZ2V0JyBiZWZvcmUgY29tcGFyaW5nLgoKCSAgICAtIGNvbXBsZW1lbnRpbmcgJ21hdGNoJzogeW91IGNhbiB1c2UgJ25vdG1hdGNoJywgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIsbm90bWF0Y2g9Im5hbWVzcGFjZSIpICJlbXB0eSI7CgoJICAgICAgaGVyZSwgdGhlIG5hbWUgd2FybmluZyB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzeW1ib2xzIGV4Y2VwdCBuYW1lc3BhY2VzLgoJICAgIAogICAgICAJCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBnY2ogYW5kIEphdmEgLT4gPHRhcmdldCBsYW5ndWFnZT4gbWVjaGFuaXNtLgoKCSAgICBTZWUJZXhhbXBsZXMgaW46ICAKCSAgCgkJRXhhbXBsZXMvcHl0aG9uL2phdmEKCQlFeGFtcGxlcy9ydWJ5L2phdmEKCQlFeGFtcGxlcy90Y2wvamF2YQoKICAgICAgICAgICAgdG8gc2VlIGhvdyB0byB1c2UgZ2NqK3N3aWcgdG8gZXhwb3J0IGphdmEgY2xhc3NlcyBpbnRvCiAgICAgICAgICAgIHB5dGhvbi9ydWJ5L3RjbC4KCSAgICAKCSAgICBUaGUgaWRlYSBpcyB0byBwdXQgYWxsIHRoZSBjb21tb24gY29kZSBmb3IgZ2NqIGluc2lkZQoKCSAgICAgICAgICBMaWIvZ2NqCgogICAgICAgICAgICBhbmQgbG9jYWxpemUgc3BlY2lmaWMgdHlwZXMgc3VjaCBhcyBqc3RyaW5nLCBhcyBjYW4gYmUgZm91bmQKICAgICAgICAgICAgaW4KCgkgICAgICAgICBMaWIvcHl0aG9uL2pzdHJpbmcuaQoJICAgICAgICAgTGliL3J1YnkvanN0cmluZy5pCgkgICAgICAgICBMaWIvdGNsL2pzdHJpbmcuaQoKICAgICAgICAgICAgVXNpbmcgdGhlIFVUTCwgdGhpcyBpcyB2ZXJ5IGVhc3ksIGFuZCB0aGUgcGVybCB2ZXJzaW9uIGZvcgogICAgICAgICAgICBqc3RyaW5nLmkgd2lsbCBiZSBuZXh0LgoJCSAJICAgIAoKMTIvMjkvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSBjb3B5Y3RvciBmZWF0dXJlL2RpcmVjdGl2ZS9vcHRpb24gdG8gZW5hYmxlIHRoZSBhdXRvbWF0aWMKCSAgICBnZW5lcmF0aW9uIG9mIGNvcHkgY29uc3RydWN0b3JzLiBVc2UgYXMgaW46CgoJICAgICAgJWNvcHljdG9yIEE7CgoJICAgICAgc3RydWN0IEEgewoKICAgICAgICAgICAgICB9OwoKCSAgICB0aGVuIHRoaXMgd2lsbCB3b3JrCgoJICAgICAgYTEgPSBBKCk7CgkgICAgICBhMiA9IEEoYTEpOwoKCSAgICBBbHNvLCBzaW5jZSBpdCBpcyBhIGZlYXR1cmUsIGlmIHlvdSBqdXN0IHR5cGUKCgkgICAgICAlY29weWN0b3I7CgoJICAgIHRoYXQgd2lsbCAgZW5hYmxlIHRoZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBmb3IgYWxsIHRoZQoJICAgIGNsYXNzZXMuIEl0IGlzIGFsc28gZXF1aXZhbGVudCB0bwoKCSAgICAgICBzd2lnIC1jb3B5Y3RvciAtYysrIC4uLgoKCSAgICBOb3RlczogCgoJICAgIDEuLSBUaGUgZmVhdHVyZSBvbmx5IHdvcmtzIGluIEMrKyBtb2RlLgoKCSAgICAyLi0gVGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiB0aGUgY29weSBjb25zdHJ1Y3RvciB3aWxsCgkgICAgICAgIHVzdWFsbHkgcHJvZHVjZSBvdmVybG9hZGluZy4gSGVuY2UsIGlmIHRoZSB0YXJnZXQKCSAgICAgICAgbGFuZ3VhZ2UgZG9lc24ndCBzdXBwb3J0IG92ZXJsb2FkaW5nLCBhIHNwZWNpYWwgbmFtZQoJICAgICAgICB3aWxsIGJlIHVzZWQgKEFfY29weSkuCgkgICAgCgkgICAgMy4tIEZvciB0aGUgb3ZlcmxvYWRpbmcgcmVhc29ucyBhYm92ZSwgaXQgaXMgcHJvYmFibHkgbm90CiAgICAgICAgICAgICAgICBhIGdvb2QgaWRlYSB0byB1c2UgdGhlIGZsYWcgd2hlbiwgZm9yIGV4YW1wbGUsIHlvdSBhcmUKCQl1c2luZyBrZXl3b3JkcyBpbiBQeXRob24uCgogICAgICAgICAgICA0Li0gVGhlIGNvcHljdG9yIGF1dG9tYXRpYyBtZWNoYW5pc20gZm9sbG93cyBtb3JlIG9yIGxlc3MKCSAgICAgICAgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgbWVjaGFuaXNtLAoJICAgICAgICBpLmUuLCBhIGNvcHkgY29uc3RydWN0b3Igd2lsbCBub3QgYmUgYWRkZWQgaWYgdGhlCgkgICAgICAgIGNsYXNzIGlzIGFic3RyYWN0IG9yIGlmIHRoZXJlIGlzIGEgcGVydGluZW50IG5vbi1wdWJsaWMgCgkJY29weSBjdG9yIGluIHRoZSBjbGFzcyBvciBpdHMgaGllcmFyY2h5LgoKCQlIZW5jZSwgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IGZvciB5b3UgdG8gY29tcGxldGUgdGhlCgkJY2xhc3MgZGVjbGFyYXRpb24gd2l0aCB0aGUgcHJvcGVyIG5vbi1wdWJsaWMgY29weSBjdG9yCgkJdG8gYXZvaWQgYSB3cm9uZyBjb25zdHJ1Y3RvciBhZGRpdGlvbi4KCQkKICAgICAgICAgIC0gRml4IGZlYXR1cmVzL3JlbmFtZSBmb3IgdGVtcGxhdGVzIGN0b3IvZHRvciBhbmQgb3RoZXIKICAgICAgICAgICAgdGhpbmdzIGFyb3VuZCB3aGlsZSBhZGRpbmcgdGhlIGNvcHljdG9yIG1lY2hhbmlzbS4KCSAgICAKCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgJ21hdGNoJyBvcHRpb24gdG8gdHlwZW1hcHMuIEFzc3VtZSB5b3UgaGF2ZToKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAoaW50IHJlcykgey4ufQoJICAgICAgJXR5cGVtYXAoZnJlZWFyZykgU1dJR1RZUEUgKiB7IGlmIChyZXMkYXJnbnVtKSAuLi59CgoJICAgIHRoZW4gaWYgeW91IGRvCiAKCSAgICAgICV0eXBlbWFwKGluKSBBICogey4uLn0KCgkgICAgc3dpZyB3aWxsICdvdmVybG9hZCB0aGUgJ2luJyB0eXBlbWFwLCBidXQgdGhlICdmcmVlYXJnJyAKCSAgICB0eXBlbWFwIHdpbGwgYmUgYWxzbyBhcHBsaWVkLCBldmVuIHdoZW4gdGhpcyBpcyB3cm9uZy4gVGhlIG9sZAoJICAgIHNvbHV0aW9ucyBpcyB0byB3cml0ZToKCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CiAgCSAgICAgICV0eXBlbWFwKGZyZWVhZykgQSAqICIiOwoKCSAgICBvdmVybG9hZCAnZnJlZWFyZycgd2l0aCBhbiBlbXB0eSBkZWZpbml0aW9uLgoKCSAgICBUaGUgcHJvYmxlbSBpcywgaG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgeW91IG5lZWQKCSAgICB0byBkbyB0aGF0IHVudGlsIHlvdSBzdGFydCBnZXR0aW5nIGJyb2tlbiBDKysgY29kZSwgb3IKCSAgICB3b3JzZSwgYnJva2VuIHJ1bnRpbWUgY29kZS4KCgkgICAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgaW5mYW1vdXMgJ3R5cGVjaGVjaycgdHlwZW1hcCwKCSAgICB3aGljaCBhbHdheXMgY29uZnVzZXMgcGVvcGxlLCBzaW5jZSB0aGUgZmlyc3QgdGhpbmcgeW91IGRvCgkgICAgaXMgdG8ganVzdCB3cml0ZSB0aGUgJ2luJyB0eXBlbWFwLgoKCSAgICBUaGUgJ21hdGNoJyBvcHRpb24gc29sdmVzIHRoZSBwcm9ibGVtLCBhbmQgaWYgaW5zdGVhZCB5b3Ugd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcsbWF0Y2g9ImluIikgU1dJR1RZUEUgKiB7IGlmIChyZXMkYXJnbnVtKSAuLi59CgkgICAgICAldHlwZW1hcCh0eXBlY2hlY2ssbWF0Y2g9ImluIixwcmVjZWRlbmNlLi4uKSBTV0lHVFlQRSAqIHsuLi59CgkgICAgCgkgICAgaXQgd2lsbCB0ZWxsIHN3aWcgdG8gYXBwbHkgdGhlICdmcmVlYXJnL3R5cGVjaGVjaycKCSAgICB0eXBlbWFwcyBvbmx5IGlmIHRoZXkgJ21hdGNoJyB0aGUgdHlwZSBvZiB0aGUgJ2luJwoJICAgIHR5cGVtYXAuIFRoZSBzYW1lIGNhbiBiZSBkb25lIHdpdGggb3RoZXIgdHlwZW1hcHMgYXM6CgoJICAgICAgJXR5cGVtYXAoZGlyZWN0b3JvdXQpIFNXSUdUWVBFICogey4uLn0KCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yZnJlZSxtYXRjaD0iZGlyZWN0b3JvdXQiKSBTV0lHVFlQRSAqIHsuLi59CgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICduYXR1cmFsdmFyJyBvcHRpb24vbW9kZS9mZWF0dXJlIHRvIHRyZWF0IG1lbWJlcgoJICAgIHZhcmlhYmxlcyBpbiBhIG1vcmUgbmF0dXJhbCB3YXksIGllLCBzaW1pbGFyIHRvIHRoZSBnbG9iYWwKCSAgICB2YXJpYWJsZSBiZWhhdmlvci4KCgkgICAgWW91IGNhbiB1c2UgaXQgaW4gYSBnbG9iYWwgd2F5IHZpYSB0aGUgY29tbWFuZCBsaW5lCgoJICAgICAgc3dpZyAtbmF0dXJhbHZhciAuLi4KCgkgICAgb3IgdGhlIG1vZHVsZSBtb2RlIG9wdGlvbgogCgkgICAgICAlbW9kdWxlKG5hdHVyYWx2YXI9MSkKCgkgICAgYm90aCBmb3JtcyBtYWtlIHN3aWcgdHJlYXQgYWxsIHRoZSBtZW1iZXIgdmFyaWFibGVzIGluIHRoZQoJICAgIHNhbWUgd2F5IGl0IHRyZWF0cyBnbG9iYWwgdmFyaWFibGVzLiAKCgkgICAgQWxzbywgeW91IGNhbiB1c2UgaXQgaW4gYSBjYXNlIGJ5IGNhc2UgYXBwcm9hY2ggZm9yCgkgICAgc3BlY2lmaWMgbWVtYmVyIHZhcmlhYmxlcyB1c2luZyB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgJW5hdHVyYWx2YXIgQmFyOjpzOwoJICAgIAoJICAgIFRoZW4sIGluIHRoZSBmb2xsb3dpbmcgY2FzZSBmb3IgZXhhbXBsZToKCgkgICAgICAgc3RkOjpzdHJpbmcgczsKCSAgICAgICBzdHJ1Y3QgQmFyIHsKCQkgc3RkOjpzdHJpbmcgczsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHlvdSBjYW4gZG86ICAKCgkgICAgICAgYiA9IEJhcigpCgkgICAgICAgYi5zID0iaGVsbG8iCgkgICAgICAgY3Zhci5zID0gImhlbGxvIgoJICAgICAgIAoJICAgICAgIGlmIChiLnMgIT0gY3Zhci5zKToKCSAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKCgkJICAKICAgICAgICAgICAgVGhpcyBpcyB2YWxpZCBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCB0aGUKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gZm9yY2luZyB0aGUgdXNlIG9mIHRoZSAKICAgICAgICAgICAgY29uc3QgU1dJR1RZUEUmIChDKyspL1NXSUdUWVBFIChDKSB0eXBlbWFwcyBmb3IgdGhlCiAgICAgICAgICAgIGdldC9zZXQgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBTV0lHVFlQRSAqIHR5cGVtYXBzLgoJICAgIEhlbmNlLCBmb3IgJ25hdHVyYWx2YXInIHRvIHdvcmssIGVhY2ggdGFyZ2V0IGxhbmd1YWdlCgkgICAgbXVzdCBpbXBsZW1lbnQgJ3R5cGVtYXAoaW4vb3V0KSBjb25zdCBUeXBlJicgcHJvcGVybHkuCgoJICAgIFRoZSAnbmF0dXJhbHZhcicgb3B0aW9uIHJlcGxhY2VzIG9yIG1ha2VzIHdvcmthcm91bmRzIHN1Y2ggIGFzOgoJICAgIAoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgIHVubmVjZXNzYXJ5LgoKCSAgICBOb3RlMTogSWYgeW91ciBpbnRlcmZhY2UgaGFzIG90aGVyIGtpbmRzIG9mIHdvcmthcm91bmRzIHRvCgkgICAgZGVhbCB3aXRoIHRoZSBvbGQgJ3VubmF0dXJhbCcgd2F5IHRvIGRlYWwgd2l0aCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgKHJldHVybmluZy9leHBlY3RpbmcgcG9pbnRlcnMpLCB0aGUKCSAgICAnbmF0dXJhbHZhcicgb3B0aW9uIGNvdWxkIGJyZWFrIHRoZW0uCgkgICAgCgkgICAgTm90ZTI6IHRoZSBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB1bm5hbWVkIHR5cGVzLCBzdWNoCgkgICAgYXMgdW5uYW1lZCBuZXN0ZWQgdW5pb25zLgoJICAgIAoJICAKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIG1vcmUgJ2V4cHJlc3NpdmUnIHJlc3VsdCBzdGF0ZXMgZm9yIHRoZSB0eXBlbWFwCiAgICAgICAgICAgIGxpYnJhcmllcy4KCgkgICAgSW4gdGhlIHBhc3QsIGZvciBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB5b3Ugd291bGQgZG8gY2hlY2tpbmcgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgaWYgKENvbnZlcnRQdHIob2JqLCZ2cHRyLHR5LGZsYWdzKSAhPSAtMSkgewoJICAgICAgICAvLyBzdWNjZXNzCiAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgLy8gZXJyb3IKCSAgICAgIH0KCgkgICAgTm93IHRoZSByZXN1bHQgc3RhdGUgY2FuIGNhcnJ5IG1vcmUgaW5mb3JtYXRpb24sCgkgICAgaW5jbHVkaW5nOgoKCSAgICAgIC0gRXJyb3Igc3RhdGU6IGxpa2UgdGhlIG9sZCAtMS8wLCBidXQgd2l0aCBlcnJvciBjb2RlcyBmcm9tIHN3aWdlcnJvcnMuc3dnLgoKCSAgICAgICAgIGludCByZXMgPSBDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncyk7CgkJIGlmIChTV0lHX0lzT0socmVzKSkgewoJCSAgIC8vIHN1Y2Nlc3MgY29kZQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkJICAgU1dJR19FcnJvcihyZXMpOyAvLyByZXMgY2FycmllcyB0aGUgZXJyb3IgY29kZQogICAgICAgICAgICAgICAgIH0KCgkgICAgICAtIENhc3QgcmFuazogd2hlbiByZXR1cm5pbmcgYSBzaW1wbGUgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgY29udmVyc2lvbiwgeW91IGp1c3QgcmV0dXJuIFNXSUdfT0ssIGJ1dCBpZiB5b3UgbmVlZAogICAgICAgICAgICAgICAgdG8gZG8gYSAnY2FzdCcsIHlvdSBjYW4gYWRkIHRoZSBjYXN0aW5nIHJhbmssIGllOgoJCQoJCSAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewoJCSAgICB2YWx1ZSA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKCQkgICAgcmV0dXJuIFNXSUdfT0s7CgkJICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSAoZG91YmxlKSBQeUludF9Bc0xvbmcob2JqKTsKCQkgICAgcmV0dXJuIFNXSUdfQWRkQ2FzdChTV0lHX09LKTsJCSAgICAKICAgICAgICAgICAgICAgICAgfQoJCQoJCWxhdGVyLCB0aGUgY2FzdGluZyByYW5rIGlzIHVzZWQgdG8gcHJvcGVybHkgZGlzcGF0Y2gKCQl0aGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiwgZm9yIGV4YW1wbGUuIFRoaXMgb2YgY291cnNlCgkJcmVxdWlyZXMgeW91ciBsYW5ndWFnZSB0byBzdXBwb3J0IGFuZCB1c2UgdGhlIG5ldwoJCWRpc3BhdGNoIGNhc3QvcmFuayBtZWNoYW5pc20gKE5vdyBtYWlubHkgc3VwcG9ydGVkIGluCgkJcGVybCBhbmQgcHl0aG9uLCBhbmQgZWFzaWx5IGV4cGFuZGFibGUgdG8gcnVieSBhbmQgdGNsKS4KCSAgICAgIAoJICAtIFtVVExdIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3ICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzLgoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSBDKysgaW1wbGljaXQgY29udmVyc2lvbiBtZWNoYW5pc20sIHdoaWNoCiAgICAgICAgICAgIHJlcXVpcmVkIHNvbWUgbW9kaWZpY2F0aW9ucyBpbiBwYXJzZXIueSAodG8gcmVjb2duaXplCiAgICAgICAgICAgICdleHBsaWNpdCcpIGFuZCBvdmVybG9hZC5jeHggKHRvIHJlcGxhY2UgJGltcGxpY2l0Y29udiBhcwogICAgICAgICAgICBuZWVkZWQpLgoJICAgIAoJICAgIFN0aWxsLCByZWFsIHN1cHBvcnQgaW4gZWFjaCB0YXJnZXQgbGFuZ3VhZ2UgcmVxdWlyZXMgZWFjaAoJICAgIHRhcmdldCBsYW5ndWFnZSB0byBiZSBtb2RpZmllZC4gUHl0aG9uIHByb3ZpZGVzIGFuIGV4YW1wbGUsCiAgICAgICAgICAgIHNlZSBiZWxvdy4KCgoJICAtIEFkZCBzdXBwb3J0IGZvciBuYXRpdmUgQysrIGltcGxpY2l0IGNvbnZlcnNpb25zLCBpZSwgaWYgeW91CiAgICAgICAgICAgIGhhdmUKCgkgICAgICAgICVpbXBsaWNpdGNvbnYgQTsKCgkgICAgICAgIHN0cnVjdCBBIHsKCQkgICBpbnQgaWk7CgkJICAgQSgpIHtpaSA9IDE7fQoJCSAgIEEoaW50KSB7aWkgPSAyO30KCQkgICBBKGRvdWJsZSkge2lpID0gMzt9CgkJICAgZXhwbGljaXQgQShjaGFyICpzKSB7aWkgPSA0O30KCQl9OwoJCQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCiAgICAgICAgICAgIHlvdSBjYW4gY2FsbDoKCgkgICAgICAgIGEgPSBBKCkKCSAgICAgICAgYWkgPSBBKDEpCgkgICAgICAgIGFkID0gQSgxLjApCgkgICAgICAgIGFzID0gQSgiaGVsbG8iKQoJCQoJCSMgb2xkIGZvcm1zCgkgICAgICAgIGdldChhKSAgLT4gMQoJICAgICAgICBnZXQoYWkpIC0+IDIKCSAgICAgICAgZ2V0KGFkKSAtPiAzCgkgICAgICAgIGdldChhcykgLT4gNAoJCQoJCSNpbXBsaWNpdCBjb252ZXJzaW9ucwoJICAgICAgICBnZXQoMSkgICAgICAgLT4gMgoJICAgICAgICBnZXQoMS4wKSAgICAgLT4gMwoJICAgICAgICBnZXQoImhlbGxvIikgLT4gRXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgogICAgICAgICAgICBBbHNvLCBhcyBpbiBDKyssIG5vdyBpbXBsaWNpdCBjb252ZXJzaW9ucyBhcmUgc3VwcG9ydGVkIGluCiAgICAgICAgICAgIHZhcmlhYmxlIGFzc2lnbWVudHMsIGFuZCBpZiB5b3UgaGF2ZToKCgkgICAgICBBIGdhOwoJICAgICAgc3RydWN0IEJhciB7CgkgICAgICAgIEEgYTsKICAgICAgICAgICAgICB9OwoKCSAgICB5b3UgY2FuIGRvOgoKCSAgICAgIGN2YXIuZ2EgPSBBKDEpCgkgICAgICBjdmFyLmdhID0gMQoJICAgICAgY3Zhci5nYSA9IDEuMAoJICAgICAgY3Zhci5nYSA9IEEoImhlbGxvIikgCgkgICAgICBjdmFyLmdhID0gImhlbGxvIiAtPiBlcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCgkgICAgICBiID0gQmFyKCkKCSAgICAgIGIuYSA9IEEoImhlbGxvIikKCSAgICAgIGIuYSA9IDEKCSAgICAgIGIuYSA9IDEuMAoJICAgICAgYi5hID0gImhlbGxvIiAtPiBlcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCgkgICAgTm90ZSB0aGF0IHRoZSBsYXN0IGNhc2UsIGFzc2lnbmluZyBhIG1lbWJlciB2YXIgZGlyZWN0bHksIAoJICAgIGFsc28gcmVxdWlyZXMgdGhlICduYXR1cmFsdmFyJyBvcHRpb24uCgoJICAgIFRoaXMgc3VwcG9ydCBub3cgbWFrZXMgdGhlIG9sZCAnJWltcGxpY2l0JyBtYWNybywgd2hpY2gKCSAgICB3YXMgZm91bmQgaW4gJ2ltcGxpY2l0LmknIGFuZCBpdCB3YXMgZnJhZ2lsZSBpbiBtYW55IHdheXMsCgkgICAgb2Jzb2xldGUsIGFuZCB5b3Ugc2hvdWxkIHVzZSB0aGUgbmV3ICclaW1wbGljaXRjb252JwoJICAgIGRpcmVjdGl2ZSBpbnN0ZWFkLgoKCSAgICBOb3RlIHRoYXQgd2UgZm9sbG93IHRoZSBDKysgY29udmVudGlvbnMsIGllLCBpbiB0aGUKCSAgICBmb2xsb3dpbmcgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgYWxsb3dlZDoKCgkJaW50IGdldChBIGEpIHtyZXR1cm4gYS5paTt9CgkJaW50IGdldChjb25zdCBBJiBhKSB7cmV0dXJuIGEuaWk7fQoJICAgIAoJICAgIGJ1dCBub3QgaW4gdGhlc2UgY2FzZXM6CgoJCWludCBnZXQoQSAqYSkge3JldHVybiBhLT5paTt9CgkJaW50IGdldChBJiBhKSB7cmV0dXJuIGEuaWk7fQoJCQoJICAgIEFsc28sIGl0IHdvcmtzIGZvciBkaXJlY3RvciBtZXRob2RzIHRoYXQgcmV0dXJuIGEgYnkgdmFsdWUKCSAgICByZXN1bHQsIGllLCB0aGUgZm9sbG93aW5nIHdpbGwgd29yazoKCiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEgZ2V0X2EoKSA9IDA7CgoJCWRlZiBnZXRfYShzZWxmKToKCQkgICByZXR1cm4gMQoKICAgICAgICAgICAgYnV0IG5vdCBpbiB0aGlzIGNhc2U6CgogICAgICAgICAgICAgICAgdmlydHVhbCBjb25zdCBBJiBnZXRfYSgpID0gMDsKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEqIGdldF9hKCkgPSAwOwoJICAgIAoJICBOb3RlczoKCgkgIC0gdGhlIGltcGxpY2l0Y29udiBtZWNoYW5pc20gaXMgaW1wbGVtZW50ZWQgYnkgZGlyZWN0bHkKCSAgICBjYWxsaW5nL2Rpc3BhdGNoaW5nIHRoZSBweXRob24gY29uc3RydWN0b3IsIHRyaWdnZXJpbmcgYQoJICAgIGNhbGwgdG8gdGhlIF9faW5pdF9fbWV0aG9kLiBIZW5jZSwgaWYgeW91IGV4cGFuZGVkIHRoZQoJICAgIF9faW5pdF9fIG1ldGhvZCwgbGlrZSBpbjoKCgkgICAgICAgIGNsYXNzIEE6CgkJICAgZGVmIF9faW5pdF9fKHNlbGYsYXJncyk6CgkJICAgICAgPHN3aWcgY29kZT4KCQkgICAgICA8bXkgY29kZSBoZXJlPgoKICAgICAgICAgICAgdGhlbiAnbXkgY29kZScgd2lsbCBhbHNvIGJlIGV4ZWN1dGVkLgoJICAgIAoJICAtIFNpbmNlIHRoZSAlaW1wbGljaXRjb252IGRpcmVjdGl2ZSBpcyBhIFNXSUcgZmVhdHVyZSwgaWYgeW91IHR5cGU6CgkgICAgCiAgCSAgICAgICAlaW1wbGljaXRjb252OyAgCgoJICAgIHRoYXQgd2lsbCBlbmFibGUgaW1wbGljaXQgY29udmVyc2lvbiBmb3IgYWxsIHRoZSBjbGFzc2VzIGluCgkgICAgeW91ciBtb2R1bGUuCgoJICAgIEJ1dCBpZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgcGVyZm9ybWFuY2UsIG1heWJlIHRoYXQgd2lsbCBiZQoJICAgIHRvbyBtdWNoLCBlc3BlY2lhbGx5IGlmIHlvdSBoYXZlIG92ZXJsb2FkZWQgbWV0aG9kcywgc2luY2UKCSAgICB0byByZXNvbHZlIHRoZSBkaXNwYXRjaGluZyBwcm9ibGVtLCBweXRob24gd2lsbCBlZmVjdGl2ZWx5CgkgICAgdHJ5IHRvIGNhbGwgYWxsIHRoZSBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYXMgbmVlZGVkLgoKCSAgLSBGb3IgdGhlIHNhbWUgcmVhc29uLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlCiAgICAgICAgICAgIHRoZSBuZXcgJ2Nhc3Rtb2RlJyB3aGVuIG1peGluZyBpbXBsaWNpdCBjb252ZXJzaW9uIGFuZAogICAgICAgICAgICBvdmVybG9hZGluZy4KCgkgLSBbcHl0aG9uXSBUaGUgJWltcGxpY2l0IGRpcmVjdGl2ZSBpcyBkZWNsYXJlZCBvYnNvbGV0ZSwgYW5kCiAgICAgICAgICAgeW91IHNob3VsZCB1c2UgJWltcGxpY2l0Y29udiBpbnN0ZWFkLiBJZiB5b3UgaW5jbHVkZQoJICAgdGhlIGltcGxpY2l0LmkgZmlsZSwgYSB3YXJuaW5nIHdpbGwgcmVtaW5kIHlvdSBvZiB0aGlzLgoKCSAgIE5vdGU6IFNpbmNlICVpbXBsaWNpdCBpcyBmcmFnaWxlLCBqdXN0IHJlcGxhY2luZyBpdCBieQoJICAgJWltcGxpY2l0Y29udiBjb3VsZCBsZWFkIHRvIGRpZmZlcmVudCBiZWhhdmlvci4gSGVuY2UsIHdlCgkgICBkb24ndCBhdXRvbWF0aWNhbGx5IHN3aXRjaCBmcm9tIHRvIHRoZSBvdGhlciwgYW5kIHRoZSB1c2VyCgkgICBtdXN0IG1pZ3JhdGUgdG8gdGhlIG5ldyAlaW1wbGljaXRjb252IGRpcmVjdGl2ZSBtYW51YWxseS4KCgoxMi8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdCiAgICAgICAgICAgIE1vZGlmeSBzdGQ6OnZlY3RvciB3cmFwcGVycyB0byB1c2Ugc3RkOjp2ZWN0b3I6OnZhbHVlX3R5cGUgYXMgdGhpcyBpcwogICAgICAgICAgICBjbG9zZXIgdG8gdGhlIHJlYWwgU1RMIGRlY2xhcmF0aW9ucyBmb3Igc29tZSBtZXRob2RzLCBlZyBmb3IgcHVzaF9iYWNrKCkuCiAgICAgICAgICAgIEZpeGVzIHNvbWUgY29tcGlsYXRpb24gZXJyb3JzIGZvciBzb21lIGNvbXBpbGVycyBlZyB3aGVuIHRoZSB0ZW1wbGF0ZWQKICAgICAgICAgICAgdHlwZSBpcyBhIHBvaW50ZXIuCgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgc3RkOjp2ZWN0b3IgaW1wcm92ZW1lbnRzIC0gYSBmZXcgbW9yZSBtZXRob2RzIGFyZSB3cmFwcGVkIGFuZCBzcGVjaWFsaXphdGlvbnMgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciByZXF1aXJlZC4gVGhlIHNwZWNpYWxpemVfc3RkX3ZlY3RvciBtYWNybyBpcyBubyBsb25nZXIgbmVlZGVkIChhCiAgICAgICAgICAgIHdhcm5pbmcgaXMgaXNzdWVkIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgaXQpLgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBBZGQgaW4gcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMuIFRoaXMgYWxzbyBlbmFibGVzIG9uZSB0byBlYXNpbHkgd3JhcAogICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB3aGVyZSBUIGlzIGEgcG9pbnRlci4KCjEyLzI0LzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gVGhlIGNmZmkgbW9kdWxlIGZvciBTV0lHOgogICAgICAgICAgICAgIC0gRnVsbHkgc3VwcG9ydHMgQywgYnV0IHByb3ZpZGVzIGxpbWl0ZWQgc3VwcG9ydHMgZm9yIEMrKywgaW4KICAgICAgICAgICAgICAgcGFydGljdWxhciBDKysgc3VwcG9ydCBmb3IgdGVtcGxhdGVzIGFuZCBvdmVybG9hZGluZyBuZWVkcyB0bwogICAgICAgICAgICAgICBiZSB3b3JrZWQgdXBvbi4gCgoxMi8yMy8yMDA1OiBtbWF0dXMKCSAgICBbcHl0aG9uXSBBZGQgdGhlIGNhc3Rtb2RlIHRoYXQgYWxsb3dzIHRoZSBweXRob24KCSAgICB0eXBlIGNhc3RpbmcgdG8gb2NjdXIuCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAnaW50IGZvbyhpbnQpJywgbm93CgkgICAgCgkgICAgICBjbGFzcyBBaSgpOgoJICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYseCk6IAoJCSAgICBzZWxmLnggPSB4CgkgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKTogCgkJICAgIHJldHVybiBzZWxmLngKCgkgICAgICBmb28oMSkgICAvLyBPawoJICAgICAgZm9vKDEuMCkgLy8gT2sKCSAgICAgIGZvbygxLjMpIC8vIEVycm9yCgkgICAgICBhID0gQWkoNCkKICAgICAgICAgICAgICBmb28oYWkpICAvLyBPawoKICAgICAgICAgICAgVGhlIGNhc3Rtb2RlLCB3aGljaCBjYW4gYmUgZW5hYmxlZCBlaXRoZXIgd2l0aCB0aGUKICAgICAgICAgICAgJy1jYXN0bW9kZScgb3B0aW9uIG9yIHRoZSAlbW9kdWxlKCJjYXN0bW9kZSIpIG9wdGlvbiwgdXNlcwogICAgICAgICAgICB0aGUgbmV3IGNhc3QvcmFuayBkaXNwYXRjaCBtZWNoYW5pc20uIEhlbmNlLCBub3cgaWYgeW91CiAgICAgICAgICAgIGhhdmUgJ2ludCBmb28oaW50KTsgaW50IGZvbyhkb3VibGUpOycsIHRoZSBmb2xsb3dpbmcgd29ya3MKICAgICAgICAgICAgYXMgZXhwZWN0ZWQ6CgoJICAgICAgZm9vKDEpICAgLT4gZm9vKGludCkKCSAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCgkgICAgICBhaSA9IEFpKDQpCgkgICAgICBmb28oYWkpICAtPiBmb28oaW50KQoKCSAgICBOb3RlMTogdGhlICdjYXN0bW9kZScgY291bGQgZGlzcnVwdCBzb21lIHNwZWNpYWxpemVkCgkgICAgdHlwZW1hcHMuIEluIHBhcnRpY3VsYXIsIHRoZSAiaW1wbGljaXQuaSIgbGlicmFyeSBzZWVtcyB0bwoJICAgIGhhdmUgcHJvYmxlbSB3aXRoIHRoZSBjYXN0bW9kZS4gQnV0IGJlc2lkZXMgdGhhdCBvbmUsIHRoZQoJICAgIGVudGlyZSB0ZXN0LXN1aXRlIGNvbXBpbGVzIGZpbmUgd2l0aCBhbmQgd2l0aG91dCB0aGUKCSAgICBjYXN0bW9kZS4KCiAJICAgIE5vdGUyOiB0aGUgY2FzdCBtb2RlIGNhbid0IGJlIGNvbWJpbmVkIHdpdGggdGhlIGZhc3QKCSAgICBkaXNwYXRjaCBtb2RlLCBpZSwgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uIGhhcyBubyBlZmZlY3QKCSAgICB3aGVuIHRoZSBjYXN0IG1vZGUgaXMgc2VsZWN0ZWQuIFRoZSBwZW5hbHRpZXMsIGhvd2V2ZXIsCgkgICAgYXJlIG1pbmltdW0gc2luY2UgdGhlIGNhc3QgZGlzcGF0Y2ggY29kZSBpcyBhbHJlYWR5IGJhc2VkCgkgICAgb24gdGhlIHNhbWUgZmFzdCBkaXNwYXRjaCBtZWNoYW5pc20uCgoJICAgIFNlZSB0aGUgZmlsZSBvdmVybG9hZF9kaXNwYXRjaF9jYXN0X3J1bm1lLnB5IGZpbGUgZm9yCgkgICAgbmV3IGNhc2VzIGFuZCBleGFtcGxlcy4KCjEyLzIyLzIwMDU6IG1tYXR1cwoJICAgIEFkZCB0aGUgY2FzdCBhbmQgcmFuayBtZWNoYW5pc20gdG8gZGlzcGF0Y2ggb3ZlcmxvYWRpbmcKCSAgICBmdW5jdGlvbnMuIFRoZSBVVEYgc3VwcG9ydHMgaXQgbm93LCBidXQgZm9yIGVhY2ggbGFuZ3VhZ2UKCSAgICBpdCBtdXN0IGJlIGRlY2lkZWQgaG93IHRvIGltcGxlbWVudCBhbmQvb3Igd2hlbiB0byB1c2UgaXQuCgoJICAgIFtwZXJsXSBOb3cgcGVybCB1c2VzIHRoZSBuZXcgY2FzdCBhbmQgcmFuayBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgd2hpY2ggc29sdmVzIGFsbCB0aGUgcGFzdCBwcm9ibGVtcyBrbm93biAKCSAgICBpbiBwZXJsLCBzdWNoIGFzIHRoZSBvbGQgJysgMScgcHJvYmxlbToKCgkgICAgICAgIGludCBmb28oaW50KTsKCSAgICAKCQkkbiA9IDEKICAgICAgICAgICAgICAgICRuID0gJG4gKyAxCiAgICAgICAgICAgICAgICAkciA9IGZvbyhuKQoKICAgICAgICAgICAgYWxzbyB3b3JrczoKCiAgICAgICAgICAgICAgICAgZm9vKDEpOwogICAgICAgICAgICAgICAgIGZvbygiMSIpOwogICAgICAgICAgICAgICAgIGZvbygxLjApOwogICAgICAgICAgICAgICAgIGZvbygiMS4wIik7CgogICAgICAgICAgICAgYnV0IGZhaWxzCgogICAgICAgICAgICAgICAgIGZvbygibCIpOwoKICAgICAgICAgICAgIGFuZCB3aGVuIG92ZXJsb2FkaW5nICBmb28oaW50KSBhbmQgZm9vKGRvdWJsZSk7CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCJsIikgLT4gZXJyb3IKCQkgZm9vKCRuKSAtPiBmb28oaW50KSAgZm9yIGdvb2QgcGVybCB2ZXJzaW9ucwoJCSBmb28oJG4pIC0+IGZvbyhkb3VibGUpICBmb3Igb2xkIGJhZCBwZXJsIHZlcnNpb25zCgoJICAgICB3aGVuIG92ZXJsb2FkaW5nIGZvbyhpbnQpLCBmb28oY2hhciopIGFuZCBmb28oZG91YmxlKToKCiAgICAgICAgICAgICAgICAgZm9vKDEpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oIjEiKSAtPiBmb28oY2hhciopCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oY2hhciopCiAgICAgICAgICAgICAgICAgZm9vKCJsIikgLT4gZm9vKGNoYXIqKQoKICAgICAgICAgICAgIE5vdGU6IEluIHBlcmwgdGhlIG9sZCBkaXNwYXRjaCBtZWNoYW5pc20gd2FzIGJyb2tlbiwKICAgICAgICAgICAgIHNvLCB3ZSBkb24ndCBwcm92aWRlIGFuIG9wdGlvbiB0byBlbmFibGUgdGhlIG9sZCBvbmUKCSAgICAgc2luY2UsIGFnYWluLCBpdCB3YXMgcmVhbGx5IHJlYWxseSBicm9rZW4uCgoJICAgICBTZWUgJ292ZXJsb2FkX3NpbXBsZV9ydW5tZS5wbCcgZm9yIG1vcmUgY2FzZXMgYW5kIHRlc3RzLgoKCSAgICAgUFM6IGFsbCB0aGUgb2xkIGtub3duIGlzc3VlcyBhcmUgZGVjbGFyZWQgcmVzb2x2ZWQsIGFueQoJICAgICBuZXcgInByb2JsZW0iIHRoYXQgY291bGQgYmUgZGlzY292ZXJlZCBpcyBkZWNsYXJlZCwgCgkgICAgIGEgcHJpb3JpLCBhcyAiZmVhdHVyZXMiIG9mIHRoZSBuZXcgZGlzcGF0Y2ggbWVjaGFuaXNtCgkgICAgICh1bnRpbCB3ZSBmaW5kIGFub3RoZXIgc29sdXRpb24gYXQgbGVhc3QpLgoJICAgICAKCSAgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCgkgICAgQXMgd2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBVVEYsIHNvbWUgdGhpbmdzIGNvdWxkCgkgICAgbm93IHN0YXJ0IHRvIHdvcmsgYXMgZXhwZWN0ZWQsIGFuZCBwZW9wbGUgdXNlZCB0byBkZWFsIG9yCgkgICAgd29ya2Fyb3VuZCBwcmV2aW91cyBidWdzIHJlbGF0ZWQgdG8gdGhlIGRpc3BhdGNoCgkgICAgbWVjaGFuaXNtLCBjb3VsZCBzZWUgbm93IGEgZGlmZmVyZW5jZSBpbiBwZXJsIGJlaGF2aW9yLgoKMTIvMjEvMjAwNTogbW1hdHVzCgkgIC0gVGhlICctbm9kZWZhdWx0JyBmbGFnIChwcmFnbWEgYW5kIGZlYXR1cmUpIG5vdyBnZW5lcmF0ZXMKCSAgICBhIHdhcm5pbmcsIGFuZCByZWNvbW1lbmRzIHRvIHVzZSB0aGUgZXhwbGljaXQKCSAgICAtbm9kZWZhdWx0Y3RvciBhbmQgIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCgkgICAgVGhlIHJlYXNvbiB0byBzcGxpdCB0aGUgJ25vZGVmYXVsdCcgYmVoYXZpb3IgaXMgdGhhdCwgaW4KCSAgICBnZW5lcmFsLCBpZ25vcmluZyB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yIGdlbmVyYXRlcyBtZW1vcnkKCSAgICBsZWFrcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBIZW5jZSwgaXMgdG9vIHJpc2t5IGp1c3QgdG8KCSAgICBkaXNhYmxlIGJvdGggdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKCSAgICBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICBJZiB5b3UgbmVlZCB0byBkaXNhYmxlIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IsIGl0IGlzCgkgICAgYWxzbyByZWNvbW1lbmRlZCB5b3UgdXNlIHRoZSBkaXJlY3RpdmUgZm9ybToKCgkgICAgICAgJW5vZGVmYXVsdGR0b3IgIE15VmVyeVNwZWNpYWxDbGFzczsKCiAgICAgICAgICAgIGZvciBzcGVjaWZpYyBjbGFzc2VzLCBhbmQgYWx3YXlzIGF2b2lkIHVzaW5nIHRoZSBnbG9iYWwKICAgICAgICAgICAgLW5vZGVmYXVsdCBhbmQgLW5vZGVmYXVsdGR0b3Igb3B0aW9ucy4KCSAgICAKMTIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGNvZGUgZ2VuZXJhdGlvbiB3aGVuIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3NuYW1lIGlzIGNoYW5nZWQKICAgICAgICAgICAgaW4gdGhlIG1vZHVsZSBkaXJlY3RpdmUgZnJvbSBpdHMgZGVmYXVsdC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVtb2R1bGUoam5pY2xhc3NuYW1lPSJteWltY2xhc3NuZXduYW1lIikgIm15bW9kdWxlIiAvLyBKYXZhCiAgICAgICAgICAgICAgJW1vZHVsZShpbWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gQyMKCiAgICAgICAgICAgIEFkZCBpbiBuZXcgc3BlY2lhbCB2YXJpYWJsZSAkaW1jbGFzc25hbWUuIFNlZSBkb2NzLgoKMTIvMTcvMjAwNTogbW1hdHVzCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtYWxpYXNvYmowLy1ub2FsaWFzb2JqMCBvcHRpb25zIHRvIHVzZSB3aXRoCgkgICAgLWZhc3R1bnBhY2sgYW5kL29yIC1PIGFuZCBvbGQgdHlwZW1hcHMgdGhhdCB1c2UgJ29iajAnCgkgICAgZGlyZWN0bHkuCgoJICAgIFNvLCBpZiB5b3UgY29tcGlsZSB5b3VyIGNvZGUgdXNpbmcgLU8gYW5kIGdldCBlcnJvcnMgYWJvdXQKCSAgICB0aGUgdW5kZWNsYXJlZCAnb2JqMCcgdmFyaWFibGUsIHJ1biBhZ2FpbiB1c2luZyAKCgkJc3dpZyAtTyAtYWxpYXNvYmowIC1weXRob24gLi4uLgoJICAgIAoJICAgIEZvciBuZXcgdHlwZW1hcHMsIG5ldmVyIHVzZSAnb2JqMCcgZGlyZWN0bHksIGlmIG5lZWRlZCwKCSAgICB1c2UgdGhlICckc2VsZicgbmFtZSB0aGF0IHdpbGwgYmUgcHJvcGVybHkgIGV4cGFuZGVkIHRvCgkgICAgJ29iajAnIChub2Zhc3R1bnBhY2spIG9yICdzd2lnX29ialswXScgKGZhc3R1bnBhY2spLiAKICAKCSAgICBJZiB5b3UgaGF2ZSBubyBpZGVhIHdoYXQgSSBhbSB0YWxraW5nIGFib3V0LCBiZXR0ZXIsIHRoYXQKCSAgICBtZWFucyB5b3UgaGF2ZSBubyB0eXBlbWFwIHdpdGggdGhpcyBwcm9ibGVtLgoKCjEyLzE0LzIwMDU6IG1tYXR1cyAJIAoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWZhc3R1bnBhY2svLW5vZmFzdHVucGFjayBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIHVzZSBvZiB0aGUgaW50ZXJuYWwgVW5wYWNrVHVwbGUgbWV0aG9kLCBpbnN0ZWFkIG9mCgkgICAgY2FsbGluZyB0aGUgb25lIGZyb20gdGhlIHB5dGhvbiBDIEFQSS4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1mYXN0dW5wYWNrLgoJICAgIAoKMTIvMTEvMjAwNTogbW1hdHVzIAoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLXByb3h5ZGVsLy1ub3Byb3h5ZGVsIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICB0aGUgZ2VuZXJhdGlvbiBvZiBwcm94eS9zaGFkb3cgX19kZWxfXyBtZXRob2RzLCBldmVuCgkgICAgd2hlbiBub3cgdGhleSBhcmUgcmVkdW5kYW50LCBzaW5jZSB0aGV5IGFyZSBlbXB0eS4KCSAgICBIb3dldmVyLCBvbGQgaW50ZXJmYWNlcyBjb3VsZCByZWx5IG9uIGNhbGxpbmcgdGhlbS4KCgkgICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZ2VuZXJhdGUgdGhlIF9fZGVsX18gbWV0aG9kcwoJICAgIGFzIGluIDEuMy4yNyBvciBvbGRlciBzd2lnIHZlcnNpb25zLgoKCSAgICBUaGUgb3B0aW9uIC1PIG5vdyBhbHNvIGltcGxpZXMgLW5vcHJveHlkZWwuCgoxMi8xMC8yMDA1OiBtbWF0dXMgCgkgIFtVVEZdCiAgICAgICAgICAtIEZpeCB1bm5lY2Vzc2FyeSBjYWxscyB0byBTV0lHX1R5cGVRdWVyeSBmb3IgJ2NoYXIgKicKCSAgICBhbmQgJ3djaGFyX3QgKicsIHByb2JsZW0gZm91bmQgYnkgQ2xheSBDdWx2ZXIgd2hpbGUKCSAgICBwcm9maWxpbmcgdGhlIFB5T2dyZSBwcm9qZWN0LgoKCSAgCgkgIFtQeXRob25dIAoJICAtIEFkZCB0aGUgLWRpcnZ0YWJsZS8tbm9kaXJ2dGFibGUgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICBhIHBzZXVkbyB2aXJ0dWFsIHRhYmxlIHVzZWQgZm9yIGRpcmVjdG9ycywgYXZvaWRpbmcKCSAgICB0aGUgbmVlZCB0byByZXNvbHZlIHRoZSBweXRob24gbWV0aG9kIGF0IGVhY2ggY2FsbC4KCSAgICAKCSAgLSBBZGQgdGhlIC1zYWZlY3N0cmluZ3MvLW5vc2FmZWNzdHJpbmdzIG9wdGlvbnMgdG8KCSAgICBlbmFibGUvZGlzYWJsZSB0aGUgdXNlIG9mIHNhZmUgY29udmVyc2lvbnMgZnJvbSBQeVN0cmluZwoJICAgIHRvIGNoYXIgKi4gUHl0aG9uIHJlcXVpcmVzIHlvdSB0byBuZXZlciBjaGFuZ2UgdGhlIGludGVybmFsCgkgICAgYnVmZmVyIGRpcmVjdGx5LCBhbmQgaGVuY2UgJ3NhZmVjdHJpbmdzJyB3YXJyYW50aWVzIHRoYXQKCSAgICBidXQgcmV0dXJuaW5nIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgcHl0aG9uIHN0cmluZyBidWZmZXIuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiBwcmV2aW91cyByZWxlYXNlcywgaXMgdG8gcmV0dXJuIGEKCSAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgKG5vc2FmZWNzdHJpbmdzKSwgc28sIGl0IGlzIHRoZSB1c2VyJ3MKCSAgICByZXNwb25zaWJpbGl0eSB0byBhdm9pZCBpdHMgbW9kaWZpY2F0aW9uLgoJICAgIAoJICAtIEFkZCB0aGUgLU8gb3B0aW9uIHRvIGVuYWJsZSBhbGwgdGhlIG9wdGltaXphdGlvbiBvcHRpb25zCgkgICAgYXQgb25jZSwgaW5pdGlhbGx5IGVxdWl2YWxlbnQgdG8KCgkgICAgLW1vZGVybiAtZmFzdGRpc3BhdGNoIC1kaXJ2dGFibGUgLW5vc2FmZWNzdHJpbmdzIC1mdmlydHVhbAoKMTIvMDgvMjAwNTogbW1hdHVzIAoKCSAgLSBBZGQgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uIChmYXN0ZGlzcGF0Y2ggZmVhdHVyZSkuIFRoaXMKCSAgICBlbmFibGVzIHRoZSAiZmFzdCBkaXNwYXRjaCIgbWVjaGFuaXNtIGZvciBvdmVybG9hZGVkCgkgICAgbWV0aG9kcyBwcm92aWRlZCBieSBTYWx2YWRvciBGYW5kaX5ubyBHYXJjJ2lhICgjOTMwNTg2KS4KCgkgICAgVGhlIHJlc3VsdGluZyBjb2RlIGlzIHNtYWxsZXIgYW5kIGZhc3RlciBzaW5jZSBsZXNzIHR5cGUKCSAgICBjaGVja2luZyBpcyBwZXJmb3JtZWQuIEhvd2V2ZXIsIHRoZSBlcnJvciBtZXNzYWdlcyB5b3UKCSAgICBnZXQgd2hlbiB0aGUgb3ZlcmxvYWRpbmcgaXMgbm90IHJlc29sdmVkIGNvdWxkIGJlCgkgICAgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgdHJhZGl0aW9uYWwgbWV0aG9kIHJldHVybnMuCgoJICAgIFdpdGggdGhlIG9sZCBtZXRob2QgeW91IGFsd2F5cyBnZXQgYW4gZXJyb3Igc3VjaCBhcyAKCgkgICAgICAgIk5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBvdmVybG9hZGVkIC4uLiIKCiAgICAgICAgICAgIHdpdGggdGhlIG5ldyBtZXRob2QgeW91IGNhbiBhbHNvIGdldCBlcnJvcnMgc3VjaCBhcwoKCSAgICAgICAiVHlwZSBlcnJvciBpbiBhcmd1bWVudCAxIG9mIHR5cGUgLi4uIgoKCSAgICBTZWUgYnVnIHJlcG9ydCAjOTMwNTg2IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICAgIAogIAkgICAgU28sIHRoaXMgb3B0aW1pemF0aW9uIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkIGJ5IHVzZXJzLgoKCSAgICBUaGUgbmV3IG1lY2hhbmlzbSBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgc3dpZyAtZmFzdGRpc3BhdGNoCgogICAgICAgICAgICBvciB1c2luZyB0aGUgZmVhdHVyZSBmb3JtCgoJICAgICAgJWZlYXR1cmUoImZhc3RkaXNwYXRjaCIpIG1ldGhvZDsKICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAlZmFzdGRpc3BhdGNoIG1ldGhvZDsKCSAgICAKCjEyLzA2LzIwMDU6IG1tYXR1cyAKCiAgICAgICAgICAtIFNldmVyYWwgbWVtb3J5IGFuZCBzcGVlZCBpbXByb3ZlbWVudHMsIHNwZWNpYWxseSBmb3IKCSAgICB0ZW1wbGF0ZXMuIE5vdyBzd2lnIGlzIHVwIHRvIDIwIGZhc3RlciB0aGFuIGJlZm9yZSBmb3IKCSAgICBsYXJnZSB0ZW1wbGF0ZSBpbnRlcmZhY2VzLCBzdWNoIGFzIHRoZSBzdGRfY29udGFpbmVycy5pCgkgICAgYW5kIHRlbXBsYXRlX21hdHJpeC5pIGZpbGVzIGluIHRoZSBweXRob24gdGVzdC1zdWl0ZS4KCgkgICAgTWVtb3J5IGZvb3RwcmludCBpcyBhbHNvIHJlZHVjZWQgaW4gY29uc2lkZXJhdGlvbiBvZiBzbWFsbAoJICAgIHBjcy9hcmNoaXRlY3R1cmVzLgoKCSAgLSBhZGQgY29tbWFuZGxpbmUgb3B0aW9ucyAtY3BwZXJyYXN3YXJuIGFuZCAtbm9jcHBlcnJhc3dhcm4iIHRvIGZvcmNlCiAgICAgICAgICAgIHRoZSBzd2lnIHByZXByb2Nlc3NvciB0byB0cmVhdCB0aGUgI2Vycm9yIGRpcmVjdGl2ZSBhcyBhICN3YXJuaW5nLgoJICAgIAoJICAgIHRoZSBwcmFnbWFzCgogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTEKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0wCgkgICAgICAgCgkgICAgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLCByZXNwZWN0aXZlbHkuCiAgICAgICAgICAgICAKCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIFRoZSBnZW5lcmF0ZWQgY29kZSBpcyBub3cgbW9yZSBwb3J0YWJsZSwgZXNwZWNpYWxseQoJICAgIGZvciBXaW5kb3dzLiBGb2xsb3dpbmcgCgogICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvZmFxL3dpbmRvd3MuaHRtbAoKICAgICAgICAgICAgUHlfTm9uZSBpcyBuZXZlciBhY2Nlc3NlZCBhcyBhIHN0cnVjdHVyZSwgcGx1cyBvdGhlcgogICAgICAgICAgICB0cmlja3MgbWVudGlvbmVkIHRoZXJlLgoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB0aHJlYWRzIGJhc2VkIGluIHRoZQoJICAgIHByb3Bvc2FsIGJ5IEpvc2VwaCBXaW5zdG9uLgoKCSAgICBUaGUgdXNlciBpbnRlcmZhY2UgaXMgYXMgZm9sbG93czoKCgkgICAgMS4tIHRoZSBtb2R1bGUgdGhyZWFkIHN1cHBvcnQgaXMgZW5hYmxlIHZpYSB0aGUgInRocmVhZHMiIG1vZHVsZQogICAgICAgICAgICAgICAgb3B0aW9uLCBpLmUuCgogICAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0aHJlYWRzIj0xKQoKICAgICAgICAgICAgMi4tIEVxdWl2YWxlbnQgdG8gdGhhdCwgaXMgdGhlIG5ldyAnLXRocmVhZHMnIHN3aWcgb3B0aW9uCgogICAgICAgICAgICAgICAgICBzd2lnIC10aHJlYWRzIC1weXRob24gLi4uCgogICAgICAgICAgICAzLi0gWW91IGNhbiBwYXJ0aWFsbHkgZGlzYWJsZSB0aHJlYWQgc3VwcG9ydCBmb3IgYSBnaXZlbgogICAgICAgICAgICAgICAgbWV0aG9kIHVzaW5nOgoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZCBtZXRob2Q7CgogICAgICAgICAgICAgICAgYWxzbywgeW91IGNhbiBkaXNhYmxlIHNlY3Rpb25zIG9mIHRoZSB0aHJlYWQgc3VwcG9ydCwgCiAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkYmxvY2siKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkYmxvY2sgbWV0aG9kOwoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkYWxsb3ciKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkYWxsb3cgbWV0aG9kOwoKICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBkaXNhYmxlcyB0aGUgQysrL3B5dGhvbiB0aHJlYWQgcHJvdGVjdGlvbiwgYW5kIHRoZQogICAgICAgICAgICAgICAgc2Vjb25kIGRpc2FibGVzIHRoZSBweXRob24vQysrIHRocmVhZCBwcm90ZWN0aW9uLiAKCiAgICAgICAgICAgIDQuLSBUaGUgY3VycmVudCB0aHJlYWQgc3VwcG9ydCBpcyBiYXNlZCBpbiB0aGUgUHlHSUwKICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBwcmVzZW50IGluIHB5dGhvbiB2ZXJzaW9uIDIuMyBvciBsYXRlciwgYnV0CiAgICAgICAgICAgICAgICB5b3UgY2FuIHByb3ZpZGUgdGhlIHRocmVhZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucyBieQogICAgICAgICAgICAgICAgZGVmaW5pbmcgdGhlIG1hY3JvcyBpbiBweXRocmVhZHMuc3dnLgoKCQlJZiB5b3UgZ2V0IGEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBmb3Igb2xkZXIgdmVyc2lvbnMsCgkJcGxlYXNlIHNlbmQgdXMgYSBwYXRjaC4KCiAgICAgICAgICAgIEZvciB0aGUgY3VyaW91cyBhYm91dCBwZXJmb3JtYW5jZSwgaGVyZSBhcmUgc29tZSBudW1iZXJzCiAgICAgICAgICAgIGZvciB0aGUgcHJvZmlsZXRlc3QuaSB0ZXN0LCB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIHRoZSBzcGVlZAoJICAgIG9mIHRoZSB3cmFwcGVkIGNvZGU6CgoJICAgICAgICBub3RocmVhZCAgICAgICAgICAgOS42cyAgKG5vIHRocmVhZCBjb2RlKQoJCW5vdGhyZWFkYmxvY2sgICAgIDEyLjJzICAob25seSAnYWxsb3cnIGNvZGUpCgkJbm90aHJlYWRhbGxvdyAgICAgMTMuNnMgIChvbmx5ICdibG9jaycgY29kZSkKICAgICAgICAgICAgICAgIGZ1bGwgdGhyZWFkICAgICAgIDE1LjVzICAoJ2FsbG93JyArICdibG9jaycgY29kZSkKCSAgICAKCSAgICBpLmUuLCBmdWxsIHRocmVhZCBjb2RlIGRlY3JlYXNlcyB0aGUgd3JhcHBpbmcgcGVyZm9ybWFuY2UgYnkKCSAgICBhcm91bmQgNjAlLiBJZiB0aGF0IGlzIGltcG9ydGFudCB0byB5b3VyIGFwcGxpY2F0aW9uLCB5b3UKCSAgICBjYW4gdHVuZSBlYWNoIG1ldGhvZCB1c2luZyB0aGUgZGlmZmVyZW50ICdub3RocmVhZCcsCgkgICAgJ25vdGhyZWFkYmxvY2snIG9yICdub3RocmVhZGFsbG93JyBmZWF0dXJlcyBhcwoJICAgIG5lZWRlZC4gTm90ZSB0aGF0IGZvciBzb21lIG1ldGhvZHMgZGVhY3RpdmF0aW5nIHRoZQoJICAgICd0aHJlYWQgYmxvY2snIG9yICd0aHJlYWQgYWxsb3cnIGNvZGUgaXMgbm90IGFuIG9wdGlvbiwKCSAgICBzbywgYmUgY2FyZWZ1bC4KCSAgICAKCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyB1c2Ugc3lzdGVtIGFuZ2xlIGJyYWNrZXRzIGV2ZXJ5d2hlcmUgZm9yICVpbmNsdWRlLCBlZwogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfY29tbW9uLmkiCiAgICAgICAgICAgIGJlY29tZXMKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX2NvbW1vbi5pPgoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUeXBlc2FmZSBlbnVtcyBhbmQgcHJvcGVyIGVudW1zIGhhdmUgYW4gZXh0cmEgY29uc3RydWN0b3Igc28gdGhhdCBlbnVtIGl0ZW0gdmFsdWVzIHRoYXQKICAgICAgICAgICAgYXJlIGluaXRpYWxpc2VkIGJ5IGFub3RoZXIgZW51bSBpdGVtIHZhbHVlIGNhbiBiZSB3cmFwcGVkIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSAlamF2YWNvbnN0dmFsdWUvCiAgICAgICAgICAgICVjc2NvbnN0dmFsdWUgZm9yIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKS4gU3VnZ2VzdGlvbiBieQogICAgICAgICAgICBCb2IgTWFyaW5pZXIvRG91Z2xhcyBQZWFyc29uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHh5eiwKICAgICAgICAgICAgICAgICBsYXN0ID0geHl6CiAgICAgICAgICAgICAgfSByZXBlYXQ7CgoxMS8yMS8yMDA1OiBtbWF0dXMKCSAgICBbcnVieSArIHB5dGhvbl0KCgkgICAgRml4ZXMgZm9yIGRpcmVjdG9ycyArIHBvaW50ZXJzLiBUaGlzIGlzIGFuIHVnbHkgcHJvYmxlbSB3aXRob3V0IGFuIGVhc3kKCSAgICBzb2x1dGlvbi4gQmVmb3JlIHdlIGlkZW50aWZpZWQgdGhpcyBjYXNlIGFzIHByb2JsZW1hdGljOgoKCSAgICAgICAgICB2aXJ0dWFsIGNvbnN0IE15Q2xhc3MmIG15X21ldGhvZCgpOwoKICAgICAgICAgICAgYnV0IGl0IHR1cm5zIG91dCB0aGF0IGFsbCB0aGUgY2FzZXMgd2hlcmUgYSBwb2ludGVyLCBhcnJheSBvcgogICAgICAgICAgICByZWZlcmVuY2UgaXMgcmV0dXJuZWQsIGFyZSBwcm9ibGVtYXRpYywgZXZlbiBmb3IgCgkgICAgcHJpbWl0aXZlIHR5cGVzIChhcyBpbnQsIGRvdWJsZSwgY2hhciosIGV0YykuCgoJICAgIFRvIHRyeSB0byBmaXggdGhlIGlzc3VlLCBhIG5ldyB0eXBlbWFwIHdhcyBhZGRlZCwKCSAgICAnZGlyZWN0b3JmcmVlJywgd2hpY2ggaXMgdXNlZCB0byAnZnJlZScgdGhlIHJlc291cmNlcwoJICAgIGFsbG9jYXRlZCBkdXJpbmcgdGhlICdkaXJlY3Rvcm91dCcgcGhhc2UuIEF0IHRoZSBzYW1lCgkgICAgdGltZSwgYSBwcmltaXRpdmUgZ2FyYmFnZSBjb2xsZWN0b3IgZW5naW5lIHdhcyBhZGRlZCB0bwoJICAgIGRlYWwgd2l0aCBvcnBoYW5lZCBhZGRyZXNzZXMsIHdoZW4gbmVlZGVkLgoJICAgIAoJICAgIFRoZSBzaXR1YXRpb24gaXMgbXVjaCBiZXR0ZXIgbm93LCBidXQgc3RpbGwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZQoJICAgIG1lbW9yeSBleGhhdXN0YXRpb24gaWYgcmVjdXJzaW9uIGlzIHVzZWQuCgoJICAgIFNvLCBzdGlsbCB5b3UgbmVlZCB0byBhdm9pZCByZXR1cm5pbmcgcG9pbnRlcnMsIGFycmF5cyBvcgoJICAgIHJlZmVyZW5jZXMgd2hlbiB1c2luZyBkaXJlY3RvciBtZXRob2RzLgoKCSAgICAtIEFkZGVkIHN0ZGludC5pIC0gdHlwZW1hcHMgZm9yIGxhdGVzdCBDOTkgaW50ZWdyYWwgdHlwZXMgZm91bmQgaW4gc3RkaW50LmguCgkgICAgCjExLzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgdHlwZXMgYWRkZWQgdG8gd2luZG93cy5pLCBlZyBVSU5UOCwgV09SRCwgQllURSBldGMuIAogICAgICAgICAgICBJbmNsdWRpbmcgd2luZG93cy5pIHdpbGwgYWxzbyBlbmFibGUgU1dJRyB0byBwYXJzZSB0aGUgX19kZWNsc3BlYyBNaWNyb3NvZnQKICAgICAgICAgICAgZXh0ZW5zaW9uLCBlZyBfX2RlY2xzcGVjKGRsbGltcG9ydCkuIEFsc28gb3RoZXIgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb25zCiAgICAgICAgICAgIHN1Y2ggYXMgX19zdGRjYWxsLgoKMTEvMTAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBmb3IgV2luZG93cyAtIHdpbmRvd3MuaS4gVGhpcyBmaWxlIHdpbGwgY29udGFpbiB1c2VmdWwgdHlwZQogICAgICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdXNlcnMgd2hvIGluY2x1ZGUgd2luZG93cy5oLiBJbml0aWFsIHN1cHBvcnQgaXMgZm9yIHRoZQogICAgICAgICAgICBub24gSVNPIGludGVncmFsIHR5cGVzOiBfX2ludDgsIF9faW50MTYsIF9faW50MzIsIF9faW50NjQgYW5kIHVuc2lnbmVkIHZlcnNpb25zLgogICAgICAgICAgICBUaGUgdW5zaWduZWQgdmVyc2lvbnMgcHJldmlvdXNseSBjb3VsZCBub3QgYmUgcGFyc2VkIGJ5IFNXSUcuICBTRiAjODcyMDEzLgoKMTEvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBQb3J0YWJpbGl0eSB3YXJuaW5nIGZvciBmaWxlcyB3aGljaCB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyIG9uIGNhc2UKICAgICAgICAgICAgaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW1zIHN1Y2ggYXMgRkFUMzIvTlRGUy4gVGhpcyB3aWxsIG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0d28KICAgICAgICAgICAgY2xhc3MgbmFtZXMgYXJlIHRoZSBzYW1lIGJhcnJpbmcgY2FzZS4gVGhlIHdhcm5pbmcgaXMgaXNzdWVkIG9uIGFsbCBwbGF0Zm9ybXMgYW5kCiAgICAgICAgICAgIGNhbiBiZSBzdXBwcmVzc2VkIHdpdGggdGhlIHVzdWFsIHdhcm5pbmcgc3VwcHJlc3Npb24gdGVjaG5pcXVlcy4gU0YgYnVnICMxMDg0NTA3LgoKMTEvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXB5dGhvbiAtLXdpdGgtcnVieSAtLXdpdGgtcGVybDUgZXRjIGVuYWJsZSB0aGVzZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGllIHRoZSAtLXdpdGgteHh4eCBvcHRpb25zLCB3aGVyZSBubyBwYXRoIGlzIHNwZWNpZmllZCwgd29yayB0aGUgc2FtZSBhcyBpZiAKICAgICAgICAgICAgdGhlIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZCBhdCBhbGwuIEJhc2VkIG9uIHBhdGNoZXMgIzEzMzUwNDIgIzEzMjkwNDggIzEzMjkwNDcuCgoxMS8wOS8yMDA1OiBkYW5jeQoKCSAgICBbQWxsZWdyb2NsXQoJICAgIEFkZCBDKysgc3VwcG9ydCB0byB0aGUgQWxsZWdyb2NsIG1vZHVsZS4gRnVydGhlcgoJICAgIGVuaGFuY2VzIHRoZSBDIHN1cHBvcnQgYXMgd2VsbC4gU29tZSBvZiB0aGUKCSAgICBmZWF0dXJlczoKCgkgICAgLSBNVUNIIGJldHRlciBnZW5lcmF0aW9uIG9mIGZvcmVpZ24gdHlwZXMgYmFzZWQgb24KCSAgICB0aGUgQy9DKysgdHlwZXMgZm9yIHVzZSBpbiBkZWZpbmluZyB0aGUgRkZJIG9uCgkgICAgdGhlIGxpc3Agc2lkZS4gV2UgZG9uJ3QgcGFzcyBldmVyeXRoaW5nIGFzIGEgKCogOnZvaWQpCgkgICAgYW55IGxvbmdlci4KCgkgICAgLSBVc2VzIHR5cGVtYXBzIGZvciBiZXR0ZXIgY29udHJvbCBvZiB0eXBlIGNvbnZlcnNpb25zCgkgICAgYW5kIGNvZGUgZ2VuZXJhdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIGxpc3AgYW5kIGMrKyB3cmFwcGVyCgkgICAgY29kZS4KCgkgICAgLSBDTE9TIHdyYXBwaW5nIG9mIHBvaW50ZXJzIHJldHVybmVkIGZyb20gZm9yZWlnbiBzcGFjZQoJICAgIG1ha2VzIGl0IGVhc2llciB0byBkaWZmZXJlbnRpYXRlIHBvaW50ZXJzIGluIHVzZXIgY29kZS4KCSAgICBUaGUgd3JhcHBpbmcgb2JqZWN0cyBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEZGIGNhbGxzLgoKCSAgICAtIERlZnVuIHdyYXBwaW5nIG9mIEZGIGNhbGxzLCBhbGxvd2luZyBmb3IgbW9yZSBsaXNweQoJICAgIGludGVyZmFjZS4gQ29udmVyc2lvbiwgR0NpbmcsIG9mIGxpc3Agb2JqZWN0cyB0byAKCSAgICBmb3JlaWduIG9iamVjdHMgY2FuIGJlIGRvbmUgaW4gdGhlIHdyYXBwaW5nIGRlZnVuIHZpYQoJICAgIHRoZSB1c2Ugb2YgdHlwZW1hcHMuCgkgICAgCgkgICAgLSBvdmVybG9hZCBkaXNwYXRjaGluZyBpbXBsZW1lbnRlZCBvbiB0aGUgbGlzcCBzaWRlCgkgICAgdXNpbmcgZ2VuZXJpYyBmdW5jdGlvbnMuCgoJICAgIC0gVGVtcGxhdGVzIGFuZCBzeW5vbnltb3VzIHR5cGVzIHN1cHBvcnRlZC4KCjExLzA3LzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRpbmcgcHJvcGVyIHN1cHBvcnQgZm9yIG11bHRpLWluaGVyaXRhbmNlIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLCBpZSwgaWYgeW91IGhhdmUgdHdvIEMrKyB3cmFwcGVkIGNsYXNzLCBGb28KCSAgICBhbmQgQmFyLCBub3c6CgoJICAgICAgIGNsYXNzIE15UHl0aG9uQ2xhc3MoRm9vLEJhcik6CgkgICAgICAgICAgLi4uLgoKICAgICAgICAgICAgd2lsbCBwcm9wZXJseSB3b3JrLCBldmVuIHdpdGggZGlyZWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIGRlYWxsb2NhdGlvbiBvZiBGb28udGhpcyBhbmQgQmFyLnRoaXMgd2lsbCBmb2xsb3cKICAgICAgICAgICAgY29ycmVjdGx5LiBCZWZvcmUsIGEgY2xhc3MgY291bGQgb25seSBoYXZlIG9uZSAndGhpcycKICAgICAgICAgICAgaW5zdGFuY2UgKHVubGlrZSBDKyspLCBvbmx5IHRoZSBsYXN0IGJhc2UgY2xhc3Mgd2FzCiAgICAgICAgICAgIHByb3Blcmx5IGRlbGV0ZWQsIG9yIGRldGVjdGVkIHdpdGggZGlyZWN0b3JzLgoKCSAgICBOb3cgJ3NlbGYudGhpcycgY2FuIGJlIGEgbGlzdCwgd2hpY2ggd2lsbCBjb250YWluIHRoZSBDKysKCSAgICBpbnN0YW5jZSBwb2ludGVycyBmb3IgYWxsIHRoZSBiYXNlIGNsYXNzZXMuCgkgICAgCgkgICAgQWxzbywgc3dpZy50aGlzIGlzIHJlc3BvbnNpYmxlIGZvciBkZWFsbG9jYXRpbmcgdGhlIEMrKwoJICAgIGluc3RhbmNlKHMpLCBhbmQgdGhlIF9fZGVsX18gbWV0aG9kIGlzIG5vdCBlbWl0dGVkIHVubGVzcwoJICAgIHRoZSB1c2VyIHByZXBwZW5kL2FwcGVuZCBzb21lIGNvZGUgdG8gaXQuCgoJICAtIFN3aWcgY2FuIG5vdyBkZXRlY3QgbWVtb3J5IGxlYWtzLCBpZSwgaWYgeW91IHN0aWxsCgkgICAgZG9uJ3QgdXNlIHByb3h5L3NoYWRvdyBjbGFzc2VzLCBhbmQgdHlwZSBzb21ldGhpbmcgbGlrZQoJICAgIAoJICAgICAgICAgaW1wb3J0IF9leGFtcGxlCgkgICAgICAgICBmID0gX2V4YW1wbGUubmV3X0ZvbygpCgoJICAgIGFuZCBmb3JnZXQgdG8gY2FsbCBfZXhhbXBsZS5kZWxldGVfRm9vKGYpLCB0aGVuIHN3aWcgd2lsbAoJICAgIHRlbGwgeW91IHRoYXQgdGhlcmUgaXMgYSBtZW1vcnkgbGVhay4KCgkgICAgT3RoZXJ3aXNlLCBpZiB5b3UgYWx3YXlzIHVzZSB0aGUgcHJveHkgY2xhc3NlcywgeW91IHByb2JhYmx5CgkgICAgeW91IHdpbGwgbmV2ZXIgZXZlciBzZWUgdGhpcyB3YXJuaW5nIHVubGVzcyB0aGVyZSBpcwoJICAgIHNvbWV0aGluZyB3cm9uZyBpbnNpZGUgdGhlIHN3aWcgd3JhcHBpbmcgY29kZS4KCSAgICAgICAKCQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICAKCSAgICBJZiB5b3Ugb3ZlcmxvYWRlZCB0aGUgX19kZWxfXyBtZXRob2QsIGFuZCBjYWxsIHRoZSBiYXNlCgkgICAgb25lCSB3aXRob3V0IGEgdHJ5IGJsb2NrLCBhcyBpbgoKCSAgICAgICAgICAgY2xhc3MgTXlDbGFzcyhTd2lnQ2xhc3MpOgoKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCQkgICAgICAgICAgU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICAKICAgICAgICAgICAgcHl0aG9uIGNvdWxkIGNvbXBsYWluIHRoYXQgdGhlIG1ldGhvZCBTd2lnQ2xhc3MuX19kZWxfXyBpcwogICAgICAgICAgICB1bmRlZmluZWQuIFRyeSB0byB1c2UgaW5zdGVhZDoKCSAgICAKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCQkgICAgICAgICAgdHJ5OiBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIGV4Y2VwdDogcGFzcwoKCSAgICBvciBzaW1wbHkgCQkgIAoKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRpbmcgbW9yZSBmdW4gdG8gU1RML1NURCBjb250YWluZXJzLCBub3cgeW91CgkgICAgY2FuIGRvCgoJICAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8UHlPYmplY3QgKj47CQkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6dmVjdG9yPFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8UHlPYmplY3QgKixQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6Om1hcDxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwoJICAgICAgIC4uLi4KCgkgICAgVGhlIHNhbWUgIGFwcGxpZXMgdG8gc3RkOjpsaXN0LCBzdGQ6OmRlcXVlLCBzdGQ6Om11bHRpc2V0LCBldGMuCgoJICAgIFRoZW4sIGF0IHRoZSBweXRob24gc2lkZSB5b3UgY2FuIGRvIG5vdzoKCgkgICAgICAgIyBDKysgc3RkOjp2ZWN0b3IgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIHYgPSBweXZlY3RvcihbMSwiaGVsbG8iLCgxLDIpXSkKCSAgICAgICBwcmludCB2WzFdCgkgICAgICAgPj4gJ2hlbGxvJwoJICAgICAgIHByaW50IHZbMl0KCSAgICAgICA+PiAoMSwyKQoJICAgICAgIAkJCQkJICAgCgkgICAgICAgIyBDKysgc3RkOjpzZXQgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIHMgPSBweXNldCgpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoKDEsMikpCQkgICAKCSAgICAgICBzLmluc2VydCgxKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCJoZWxsbyIpCgkgICAgICAgc3VtPSgpCgkgICAgICAgZm9yIGkgaW4gczoKCSAgICAgICAgIHN1bSArPShpLCkKCSAgICAgICBwcmludCBzdW0KCSAgICAgICA+Pj4gKDEsICdoZWxsbycsICgxLCAyKSkKCSAgICAgICAJCQkJICAgCgkgICAgICAgIyBDKysgc3RkOjptYXAgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIG0gPSBweW1hcCgpCQkJICAgCgkgICAgICAgbVsiZm9vIl0gPSAiaGVsbG8iCQkgICAKCSAgICAgICBtWzFdID0gKDEsMikKCSAgICAgICBwbSA9IHt9CgkgICAgICAgZm9yIGsgaW4gbToJICAgIAkgICAKCSAgICAgICAgIHBtW2tdID0gbVtrXQoJICAgICAgIHByaW50IHBtCgkgICAgICAgPj4+IHsxOiAoMSwgMiksICdmb28nOiAnaGVsbG8nfQoKCSAgICBpZSwgdGhlIFNURC9TVEwgY29udGFpbmVycyB3b3JrIGFzIHJlYWwgbmF0aXZlIHB5dGhvbgoJICAgIGNvbnRhaW5lciwgd2l0aCBhcmJpdHJhcnkgaXRlbSB0eXBlcyBhbmQgc28uCgoJICAgIEJ1dCBzaW5jZSBub3JtYWwgQysrIGNvbnRhaW5lcnMgZG8gbm90IHByb3Blcmx5IHJlZi91bnJlZgoJICAgIHRoZWlyIGl0ZW1zLCB5b3Ugc2hvdWxkIHVzZSB0aGUgc2FmZXIgdmVyc2lvbnM6CgkgICAgCgkgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6dmVjdG9yPHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8c3dpZzo6UHlPYmplY3RfcHRyLCBzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6Om1hcDxzd2lnOjpQeU9iamVjdF9wdHIsc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgIC4uLi4KCgkgICAgd2hlcmUgc3dpZzo6UHlPYmplY3RfcHRyIGlzIGEgUHlPYmplY3QgKiBlbnZlbG9wZSBjbGFzcyBwcm92aWRlZAoJICAgIHRvIHNhZmVseSBpbmNyZWYvZGVjcmVmIHRoZSBweXRob24gb2JqZWN0LiAKCSAgICAKCSAgICBTbywgbm93IHlvdSBjYW4gdXNlIGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGFzIG5hdGl2ZQoJICAgIFB5dGhvbiBjb250YWluZXJzLiAKCgkgICAgTm90ZSAxOiBzdGQ6Om1hcCwgc3RkOjpzZXQgYW5kIHRoZSBvdGhlciAnb3JkZXJlZCcKCSAgICBjb250YWluZXJzIHdpbGwgcHJvcGVybHkgdXNlIFB5T2JqZWN0X0NvbXBhcmUgZm9yIHNvcnRpbmcsCgkgICAgd2hlbiBuZWVkZWQuCgoJICAgIE5vdGUgMjogYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgaGF2ZSBhIGxpbWl0IHNpemUgb2YKCSAgICBTSVpFX01BWCwgaWUsIHlvdSBjYW4gaGF2ZSBtYW5hZ2UgY29udGFpbmVycyBsYXJnZXIgdGhhbgoJICAgIElOVF9NQVgsIHRoZSBweXRob24gbGltaXQuCgkgICAgCgkgICAgICAKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dCgkgICAgLSBhZGQgJ2l0ZXJhdG9yKCknIG1ldGhvZCBmb3IgYWxsIHNlcXVlbmNlcyBhbmQgYWRkaXRpb25hbGx5CgkgICAgICAna2V5X2l0ZXJhdG9yKCknIGZvciBtYXBzLgoKCSAgICAgICdpdGVyYXRvcigpJyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IuCgkgICAgICBBZGRpdGlvbmFsbHksIGluIG1hcHMsICdrZXlfaXRlcmF0b3IoKScgd2lsbCByZXR1cm4gYSBweXRob24KCSAgICAgIGl0ZXJhdG9yIHVzaW5nIG9ubHkgdGhlIG1hcCBrZXlzLgoJICAgICAgCgkgICAgICBJbiBnZW5lcmFsIHRoZSBzZXF1ZW5jZSBtZXRob2QgX19pdGVyX18gd2lsbCBjYWxsCgkgICAgICAnaXRlcmF0b3IoKScsIHJldHVybmluZyB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvciwgYnV0IGluCgkgICAgICBtYXBzIGl0IHdpbGwgY2FsbCAna2V5X2l0ZXJhdG9yKCknLCBtYWludGFpbmluZwoJICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KCgkgICAgICBIZW5jZSwgZm9yIHN0ZDo6bWFwcywgeW91IGNhbiBwbGF5IHRoZW4gd2l0aCB0aGUgbmF0aXZlCgkgICAgICBDKysgaXRlcmF0b3IsIHdoaWNoIHZhbHVlIGlzIGEgKGtleSwgdmFsdWUpIHBhaXIsIGJ5CgkgICAgICBjYWxsaW5nIG1hcC5pdGVyYXRvcigpLCBhcyB3aXRoIG1hcC5iZWdpbigpLCBtYXAuZW5kKCksIGV0Yy4KCgkgICAgICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG1hcC5pdGVyYXRvcigpIHJldHVybnMgYSBzYWZlCgkgICAgICAnY2xvc2VkJyBpdGVyYXRvciwgd2hpbGUgbWFwLmJlZ2luKCkgYW5kIG1hcC5lbmQoKSBhcmUKCSAgICAgICdvcGVuJyBpdGVyYXRvcnMuCgoJICAgICAgQSAnY2xvc2VkJyBpdGVyYXRvciBrbm93cyB0aGUgYmVnaW4gYW5kIHRoZSBlbmQgb2YgdGhlCgkgICAgICBzZXF1ZW5jZSwgYW5kIGl0IG5ldmVyIGNhbiBzZWcuIGZhdWx0LiBBbiAnb3BlbicKCSAgICAgIGl0ZXJhdG9yLCBhcyBpbiBDKyssIGNhbiBzZWcuIGZhdWx0IGF0IHRoZSBDKysgc2lkZS4KCgkgICAgICAgICAjIGEgY2xvc2VkIGl0ZXJhdG9yIGlzIHNhZmUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLgoJCSAjIHRoZSBuZXh0KCkgbWV0aG9kIHdpbGwgdGhyb3cgYSBTdG9wSXRlcmF0aW9uCgkgICAgICAgICAjIGV4Y2VwdGlvbiBhcyBuZWVkZWQKCQoJICAgICAgICAgaSA9IHNlcS5pdGVyYXRvcigpCgkJIHRyeToKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CgkJICAgICAgICBzdW0gKz0gaS5uZXh0KCkKCQkgZXhjZXB0OiBwYXNzCgkJIAoJCSAjIGFuIG9wZW4gaXRlcmF0b3IgYWx3YXlzIG5lZWQgdG8gYmUgY2hlY2tlZCwKCQkgIyBvciBpdCB3aWxsIGNyYXNoIGF0IHRoZSBDKysgc2lkZQoKCSAgICAgICAgIGN1cnJlbnQgPSBzZXEuYmVnaW4oKQogICAgICAgICAgICAgICAgIGVuZCA9IHNlcS5lbmQoKQoJCSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOgoJCSAgICBzdW0gKz0gY3VycmVudC5uZXh0KCkKCSAgICAgIAoJICAgICAgCgkgICAgW1B5dGhvbl0KCSAgICAtIEZpbmFsbHksIHdoZW4gd2UgY2FsbCAKCgkgICAgICAgIGYgPSBGb28oKQoKCSAgICAgIHRoZSBjb25zdHJ1Y3Rpb24gaXMgJ29uZS13YXknLiBCZWZvcmUgY29uc3RydWN0aW9uICB3YXMgZG9uZQoJICAgICAgc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgRm9vKCkgKHB5dGhvbikgLT4gX25ld19Gb28oKSAoQysrKSAKICAgICAgICAgICAgICAgICAgbmV3X0ZvbygpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pIAogICAgICAgICAgICAgICAgICBGb29QdHIoKSAocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQoKICAgICAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciB3YXMgZG9uZSBsaWtlCgogICAgICAgICAgICAgICAgICBOZXdQb2ludGVyT2JqKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikKICAgICAgICAgICAgICAgICAgRm9vUHRyKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKICAgICAgICAgICAgICAgICAgCQkgIAoKCSAgICAgIGllLCB3ZSB3aGVuIGdvaW5nIGJhY2sgYW5kIGZvcndhcmQgYmV0d2VlbiB0aGUgQysrIGFuZAoJICAgICAgcHl0aG9uIHNpZGUuCgoJICAgICAgTm93IHNpbmNlIHRoZXJlIGlzIG5vIEZvb1B0ciB0aGUgY29uc3RydWN0aW9uIHByb2Nlc3MgaXMKCgkgICAgICAgICAgRm9vKCkgKHB5dGhvbikgLT4gX25ld19Gb28oKSAoQysrKQogICAgICAgICAgICAgICAgICBfbmV3X0ZvbygpIChDKyspIC0+IE5ld1BvaW50ZXJPYmooKSAoQysrKSAobm8gc2hhZG93IGNsYXNzKQoKICAgICAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciBpcyBkb25lCgogICAgICAgICAgICAgICAgICBOZXdQb2ludGVyT2JqKCkgKEMrKykgKHdpdGggc2hhZG93IGNsYXNzKSAtPiBOZXdJbnN0YWNlT2JqKCkgKEMrKykKCgkgICAgICB3aGVyZSBOZXdJbnN0YW5jZU9iaiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIHdpdGhvdXQKCSAgICAgIGNhbGxpbmcgX19pbml0X18gYW5kIGl0IGRvZXNuJ3QgZ28gJ2JhY2snIHRvIHB5dGhvbiwgaXMKCSAgICAgICdwdXJlJyBDIEFQSS4KCgkgICAgIC0gV2l0aCB0aGlzIGNoYW5nZSwgYW5kIHRoZSBvdGhlciBvbmVzIGluIHRoZQogICAgICAgICAgICAgICBQeVN3aWdPYmplY3QgdHlwZSwgd2hpY2ggbm93IGNhcnJpZXMgdGhlIHRoaXNvd24gYW5kCiAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvIHBvaW50ZXIsIHRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgYmUgYXMKICAgICAgICAgICAgICAgZmFzdCBhcyBib29zdDo6UHl0aG9uIGFuZC9vciB0aGUgb3RoZXIgcHl0aG9uIHdyYXBwZXJzCiAgICAgICAgICAgICAgIGJhc2VkIGluIHB1cmUgUHl0aG9uL0MgQVBJIGNhbGxzLgoKCSAgICAgICBBcyBhIHJlZmVyZW5jZSwgdGhlIHByb2ZpbGV0ZXN0X3J1bm1lLnB5IGV4YW1wbGUsIHdoaWNoCgkgICAgICAgZG9lcyBhIHNpbXBsZSBjYWxsIGZ1bmN0aW9uIG1hbnkgdGltZXMsIHN1Y2ggYXMgdGhpcyBjb2RlOgoKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgcHJvZmlsZXRlc3QgICAgICAgCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkgICAgYSA9IHByb2ZpbGV0ZXN0LkEoKSAgICAgIAoJCSAgICBiID0gcHJvZmlsZXRlc3QuQigpICAgICAgCgkJICAgIGZvciBpIGluIHJhbmdlKDAsMTAwMDAwMCkKCSAgICAgICAgICAgICAgYSA9IGIuZm4oYSkgICAgICAgICAgICAKCgoJICAgICAgIHdoZXJlIGZuIGlzIGRlZmluZWQgYXMgJ0EqIEI6OmZuKEEgKmEpIHtyZXR1cm4gYTt9JywKCSAgICAgICBwcm9kdWNlcyAgdGhlIGZvbGxvd2luZyB0aW1lcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbW9kZXJuICAgIG1vZGVybgoJICAgICAgICAgc3dpZy0xLjMuMjYgICAgMTkuNzBzICAgICAgNS45OHMKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC45OXMgICAgICAwLjk4cwoJICAgICAgIAoKCSAgICAgICBDbGVhcmx5LCB0aGVyZSBpcyBhIGxhcmdlIGltcHJvdmVtZW50IGZvciB0aGUgcHl0aG9uCgkgICAgICAgJ25vbW9kZXJuJyBtb2RlLiBTdGlsbCwgdGhlICdtb2Rlcm4nIG1vZGUgaXMgYXJvdW5kCgkgICAgICAgNiB0aW1lcyBmYXN0ZXIgdGhhbiBiZWZvcmUuIEZvciB0aGUgc2FtZSB0ZXN0LCBidXQKCSAgICAgICB1c2luZyB0aGUgbm9uLXNoYWRvdyB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUsIHdlIGdldAoKCSAgICAgICAgICAgICAgICAgICAgICAgX3Byb2ZpbGV0ZXN0IChub24tc2hhZG93KQoJICAgICAgICAgc3dpZy0xLjMuMjYgICAgIDAuODBzIAogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjYwcyAKCgkgICAgICAgSGVuY2UsIG5vdyBmb3IgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGUgcHJveHkgb3ZlcmhlYWQKCSAgICAgICBpcyBpbnNpZ25pZmljYW50LgoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHBlcmZvcm1hbmNlIG51bWJlcnMgd2UgYXJlIHNob3dpbmcgaXMgZm9yCgkgICAgICAgYSBzaW1wbGUgbW9kdWxlICh0d28gdHlwZXMpIGFuZCBhIHNpbXBsZSBmdW5jdGlvbiAob25lCgkgICAgICAgYXJndW1lbnQpLiBGb3IgcmVhbCBzaXR1YXRpb25zLCBmb3IgbW9kdWxlcyB3aXRoIG1hbnkKCSAgICAgICBtb3JlIHR5cGVzIGFuZC9vciBmdW5jdGlvbnMgd2l0aCBtYW55IG1vcmUgcGFyYW1ldGVycywKCSAgICAgICB5b3Ugd2lsbCBzZWUgZXZlbiBiZXR0ZXIgcmVzdWx0cy4KCSAgICAgICAKCQkgIAkgICAgICAKMTAvMzEvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0KCgkgICAgLSBGaW5hbGx5LCBubyBtb3JlIENsYXNzUHRyIHByb3h5IGNsYXNzZXMuIFlvdSB3aWxsIHNlZQoJICAgICAgb25seSBhIGNsZWFuIENsYXNzIHByb3h5IGNsYXNzIGluIHRoZSAucHkgZmlsZS4KCgkgICAgLSBObyBtb3JlICdyZWFsJyB0aGlzb3duIGF0dHJpYnV0ZSBlaXRoZXIsIHRoZSBQeVN3aWdPYmplY3Qgbm93CiAgICAgICAgICAgICAgY2FycmllcyB0aGUgb3duZXJzaGlwIGluZm8uCgoJICAgICAgWW91IGNhbiBhbHNvIGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgkJICAKCQkgIHNlbGYudGhpcy5kaXNvd24oKQoJCSAgc2VsZi50aGlzLm93bigwKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXMuYWNxdWlyZSgpCgkJICBzZWxmLnRoaXMub3duKDEpCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCgkgICAgICBTdGlsbCB0aGUgb2xkIHdheSwKCSAgICAgIAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IFRydWUKCgkJICBzZWxmLnRoaXNvd24gPSAwCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzb3duID0gMQoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IFRydWUKCiAgICAgICAgICAgICAgaXMgc3VwcG9ydGVkLCBhbmQgcHl0aG9uIGRpc3BhdGNoZXMgdGhlIHByb3BlciBtZXRob2QKICAgICAgICAgICAgICBjYWxscyBhcyBuZWVkZWQuIAkJICAKCSAgICAgICAKCgkgICAgLSBTdXBwb3J0IGZvciBpdGVyYXRvcnMgaW4gU1RML1NURCBjb250YWluZXJzLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKCiAgICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlPHNldF9zdHJpbmc+IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjsKCSAgICAgICAgICAKICAgICAgICAgICAgICAgeW91IGNhbiB1c2UgdGhlIEMrKyBpdGVyYXRvcnMgYXM6ICAKCiAgICAgICAgICAgICAgICAgICAgIHMgPSBzZXRfc3RyaW5nKCkKCQkgICAgICAgICAgICAgICAgICAgICAKCQkgICAgIHMuYXBwZW5kKCJjIikgICAKCQkgICAgIHMuYXBwZW5kKCJhIikgICAKCSAgICAgICAgICAgICBzLmFwcGVuZCgiYiIpCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkJICAgICBlID0gcy5lbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiYWJjIiAKCgkJYWR2YW5jZSB0aGUgaXRlcmF0b3IgYXMgaW4gQysrCgogICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcy5iZWdpbigpICAgICAgCgkJICAgICBjdXJyZW50ICs9IDEKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgY3VycmVudC52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICAKCQlub3cgdXNpbmcgdGhlIHJldmVyc2Ugb3BlcmF0b3JzCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5yYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMucmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJjYmEiIAoKCSAgICAgICAgb3IgdGhlICdwcmV2aW91cycgbWV0aG9kCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkJICAgICBlID0gcy5lbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gZS5wcmV2aW91cygpCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJjYmEiIAoKICAgICAgICAgICAgICAgIG9yIGp1c3QgYXMgaW4gYSBweXRob24gZmFzaGlvbgoKICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBOb3RlIDE6IEl0ZXJhdG9ycyBpbiBDKysgYXJlIHZlcnkgcG93ZXJmdWwsIGJ1dAogICAgICAgICAgICAgICAgZGFuZ2Vyb3VzIHRvby4gQW5kIGluIHB5dGhvbiB5b3UgY2FuIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290CiAgICAgICAgICAgICAgICBqdXN0IGxpa2UgaW4gQysrLCBzbywgYmUgY2FyZWZ1bC4KCQkKCQlOb3RlIDI6IHRoZSBpdGVyYXRvcnMgYXJlICdsaWdodCcsIGllLCB0aGV5IGRvIG5vdAoJCWNvbnZlcnQgc2VxdWVuY2UgZWxlbWVudHMgdW50aWwgeW91IHJlcXVlc3QgdG8gZG8gc28sIHZpYQoJCW5leHQoKSwgdmFsdWUoKSBvciBwcmV2aW91cygpLiBJZiB5b3UganVzdCBpbmNyZW1lbnQvZGVjcmVtZW50IG9uZQoJCW5vIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJICAgICAgICAgICAgIGIgKz0gMQogICAgICAgICAgICAgICAgICAgICBiLmluY3IoKQogICAgICAgICAgICAgICAgICAgICBiLmluY3IoMikKCQkgICAgIGIuZGVjcigyKQogICAgICAgICAgICAgICAgICAgICBiLmRlY3IoKQogICAgICAgICAgICAgICAgICAgICBiIC09IDEKCgkJIG9ubHkgdGhlIGl0ZXJhdG9yIGlzIG1vZGlmaWVkLCBhbmQgbm90IHZhbHVlIHdyYXBwZXIKCQkgaXMgZ2VuZXJhdGVkLiBPdGhlciB0eXBpY2FsIEMrKyBvcGVyYXRpb25zIGFyZSBhbHNvIAoJCSBhdmFpbGFibGUsIHN1Y2ggYXM6CgoJCSAgICAgcHJpbnQgcy5lbmQoKSAtIHMuYmVnaW4oKQoJCSAgICAgPj4+IDMKCQkgICAgIGYgPSBzLmJlZ2luKCkgKyAxCgkJICAgICBwcmludCBmLnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIGwgPSBzLmVuZCgpIC0gMQoJCSAgICAgcHJpbnQgbC52YWx1ZSgpCgkJICAgICA+Pj4gImMiCgkJIAoJCSBldGMuICBPZiBjb3Vyc2UsIHRoZSAnZmluZCcsICdpbnNlcnQnLCAnZXJhc2UnLCBhbmQKCQkgc28gb24gbWV0aG9kcyBhbHNvIHN1cHBvcnRzIGl0ZXJhdG9ycyBub3csIGllOgoKCQkgICAgICBpID0gcy5iZWdpbigpCgkJICAgICAgaSArPSAxCgkJICAgICAgcy5lcmFzZShpKQogICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBpCgkJICAgICAgcHJpbnQgc3VtCgkJICAgICAgPj4+ICJhYyIKCQkgICAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgIFRoZXJlIGlzIG5vIG1vcmUgJ3RoaXNvd24nIGF0dHJpYnV0ZS4gSWYgeW91IHVzZSBpdCwgcHl0aG9uCgkgICAgd2lsbCB0cmFuc2xhdGUgdGhlIGZvbGxvd2luZyBjb2RlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgaWYgKHNlbGYudGhpc293bik6ICAgPT0+ICAgaWYgKHNlbGYudGhpcy5vd24oKSk6CgkJc2VsZi50aGlzb3duID0gMSAgICAgPT0+ICAgc2VsZi50aGlzLm93bigxKQogICAgICAgICAgICAgICAgc2VsZi50aGlzb3duID0gMCAgICAgPT0+ICAgc2VsZi50aGlzLm93bigwKQoKCSAgICBTdGlsbCwgbWF5YmUgaW4gc29tZSB1bnVzdWFsIGNhc2VzIHRoZSB0cmFuc2xhdGlvbiB3aWxsIG5vdCBiZQoJICAgIDEwMCUgY29ycmVjdCwgc28gaWYgeW91IGhhdmUgYSBwcm9ibGVtLCBwbGVhc2UgcmVwb3J0IGl0CgkgICAgYW5kL29yIHVzZSB0aGUgbmV3ICdzZWxmLnRoaXMub3duKCknIGFjY2Vzc29yLgoJICAgIAoJICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICAKCSAgICBUaGVyZSBpcyBubyBtb3JlIENsYXNzUHRyIGNsYXNzZXMgaW4gdGhlIHB5dGhvbiBjb2RlLiBIZW5jZSwKCSAgICBpZiBpbiB0aGUgcGFzdCB5b3UgbmVlZGVkIHRvIHJlc29ydCB0byBzb21lIGtpbmQgb2YgdHJpY2tlcnkKCSAgICB3aXRoIHRoZW0sIG9yIG92ZXJjb21lIHRoZWlyIHByZXNlbmNlLCBpdCBpcyBubyBsb25nZXIKCSAgICByZXF1aXJlZCwgYnV0IHRoZSBleHRyYSBjb2RlIHlvdSBhZGRlZCBjb3VsZCBub3cgYnJlYWsKCSAgICB0aGluZ3MuCgoJICAgIElmIG5lZWRlZCwgeW91IGNhbiB1c2UgdGhlIG9wdGlvbiAtY2xhc3NwdHIsIGkuZS4sCgogICAgICAgICAgICAgICBzd2lnIC1jbGFzc3B0ciAtcHl0aG9uIC4uLgoKCSAgICB0byBnZW5lcmF0ZSB0aGUgb2xkIENsYXNzUHRyIGNsYXNzZXMuCgoKMTAvMzAvMjAwNTogbWtvZXBwZSAKCSAgICBbR3VpbGVdIE1ha2UgZGVjbGFyZWQgYW5kIGRlZmluZWQgbGlua2FnZSBvZiBTV0lHX2luaXQgY29uc2lzdGVudC4gIAoJICAgIFJlcG9ydGVkIGJ5IFN0ZXZlbiBHLiBKb2huc29uIChTRiBwYXRjaCAxMzE1NDk4KS4KCjEwLzI2LzIwMDU6IG1tYXR1cwoKCSAgLSBBZGRlZCB0aGUgYXR0cmlidXRlLmkgZmlsZSB0byB0aGUgZ2xvYmFsIGxpYnJhcnkgZGlyZWN0b3IuCgkgICAgTm93IGl0IGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHVzZQoJICAgIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSBhcyB3ZWxsLgoKCSAgICBTbywgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICVpbmNsdWRlIGF0dHJpYnV0ZS5pCgogICAgICAgICAgICAgICAlYXR0cmlidXRlKEEsIGludCwgYSwgZ2V0X2EsIHNldF9hKTsKCSAgICAgICAJCQkJICAgICAgCSAgCgkgICAgICAgc3RydWN0IEEJCQkgICAgICAJICAKCSAgICAgICB7ICAgIAkJCQkgIAoJICAgICAgICAgaW50IGdldF9hKCkgY29uc3Q7IAkJICAKCSAgICAgICAgIHZvaWQgc2V0X2EoaW50IGFhKTsgCQkgIAoJICAgICAgIH07CQkJCSAgCgogICAgICAgICAgICAgICAlYXR0cmlidXRlX3JlZihCLCBpbnQsIGMpOwoJICAgICAgIAkJCQkKCSAgICAgICBzdHJ1Y3QgQgkJCQoJICAgICAgIHsgICAgCQkJCgkgICAgICAgICBpbnQmIGMoKTsgCQkKCSAgICAgICB9OyAKCgkgICAgdGhlbiBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlIHRoZSAnQS5hJyBhbmQgJ0IuYycgYXR0cmlidXRlcyB3aWxsCgkgICAgYmUgdmlzaWJsZSwgaWUsIHlvdSBjYW4gYWNjZXNzIHRoZW0gYXMgcGxhaW4gdmFyaWFibGVzOgoKICAgICAgICAgICAgICAgZiAgID0gQSgpCiAgICAgICAgICAgICAgIGYuYSA9IDMKICAgICAgICAgICAgICAgZyAgID0gQigpCiAgICAgICAgICAgICAgIGcuYyA9IDMgCiAgICAgICAgICAgCgkgICAgICAgaCAgID0gZi5hICsgZy5jCgoJICAgIGFuZCB0aGUgcHJvcGVyIGdldC9zZXQgbWV0aG9kcyB3aWxsIGJlIGRpc3BhdGNoZWQuIFNlZQoJICAgIGF0dHJpYnV0ZS5pIGZvciBtb3JlIGluZm8uCiAgIAogICAgICAgICAgLSBNb3JlIGNsZWFudXBzIGFyb3VuZCBhbmQgYWRkaW5nIG1vcmUgdGVzdC1jYXNlcy4gVGhlCiAgICAgICAgICAgIERJU09XTiB0eXBlbWFwIG5vdyBpcyB0ZXN0ZWQgYW5kIHdvcmtpbmcgaW4gYWxsIHRoZQogICAgICAgICAgICBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpZSwgdGNsLAogICAgICAgICAgICBydWJ5LCBwZXJsIGFuZCBweXRob24uCgkgICAgCgoxMC8yNS8yMDA1OiBtbWF0dXMKCgkgICAgLSBQZXJsLCBjb21wbGV0ZSB0aGUgRElTT1dOIHR5cGVtYXAuCgkgICAgCgkgICAgLSBhZGRlZCB0aGUgYXR0cmlidXRlLmkgZmlsZSB0byB0aGUgdW5pZmllZCB0eXBlbWFwCiAgICAgICAgICAgICAgbGlicmFyeSAoYmVmb3JlIHdhcyBvbmx5IHVzYWJsZSBmcm9tIHB5dGhvbikuCgoJICAgIC0gdW5pZnkgdGhlIG5hbWVzIGZvciB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIgbWV0aG9kcyBpbgoJICAgICAgcGVybCx0Y2wscnVieSBhbmQgcHl0aG9uLCBzbywgdGhlIGF0dHJpYnV0ZS5pIGxpYnJhcnkKCSAgICAgIGNhbiB3b3JrIGFjcm9zcyB0aGVtLgoJICAgICAgCgkgICAgLSBzZWUgdGhlIGxpX2F0dHJpYnV0ZS5pIHRlc3QtY2FzZSBvciB0aGUgbGlicmFyeSBmaWxlCgogCSAgICAgICAgTGliL3R5cGVtYXBzL2F0dHJpYnV0ZS5zd2cKCiAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBhYm91dCBob3cgdG8gdXNlIGl0LgoKIAoJICAgICAgCgoxMC8yNC8yMDA1OiBtbWF0dXMKCgkgICAgLSBQZXJsIG5vdyB1c2VzIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeS4KCgkgICAgLSBDaGFuZ2VzIGluIHJ1YnkgdG8gdXNlIHRoZSAkdHJhY2sgb3B0aW9uIGluIHR5cGVtYXBzLgoKCSAgICAtIENoYW5nZXMgaW4gdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IHRvIGZvbGxvdyB0aGUKCSAgICAgIGNvbnZlbnRpb24gdGhhdCBhbGwgbWFjcm9zIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZQoJICAgICAgQy9DKysgc2lkZSBzdGFydHMgd2l0aCAlLCBzdWNoIGFzCgoJICAgICAgICAgICAlZGVsZXRlCgkJICAgJW5ld19hcnJheQoKICAgICAgICAgICAgICBldGMuCgkgICAgICAKCSAgICAtIERvY3VtZW50aW5nIGZyYWdtZW50cywgc2VlIGZyYWdtZW50cy5zd2cuCgoJICAgIC0gQ2xlYW5lciB3YXkgdG8gdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaW5jbHVkZQoJICAgICAganVzdCA8dHlwZW1hcHMvc3dpZ3R5cGVzLnN3Zz4uCgoJICAgICAgQ2hlY2sgc29tZSBvZiB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogcGVybCwgdGNsLCBydWJ5LAoJICAgICAgcHl0aG9uLgoKCSAgICAgIEFsd2F5cyBzdGFydCB3aXRoIHRoZSBoZWFkIGZpbGUsIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0aG9uLnN3ZwoJICAgICAgICAgdGNsL3RjbDguc3dnCgkgICAgICAgICBydWJ5L3J1Ynkuc3dnCgkgICAgICAgICBwZXJsNS9wZXJsNS5zd2cKCiAgICAgICAgICAgICAgYW5kIHRoZSBwcmluY2lwYWwgZmlsZSB0aGF0IGludm9rZXMgdGhlIHVuaWZpZWQgbGlicmFyeSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICB0Y2wvdGNsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHJ1YnkvcnVieXR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBwZXJsL3Blcmx0eXBlbWFwcy5zd2cJICAgIAoJICAgIAoJICAgICAgVGhlIGZpbGUgdGhhdCBwcm92aWRlIHRoZSBzcGVjaWFsaXphdGlvbiBmb3IgZWFjaAoJICAgICAgbGFuZ3VhZ2UgYXJlIHRoZSBvbmUgdGhhdCBwcm92aWRlcyB0aGUgYmFzaWMgdHlwZXM6CgoJICAgICAgICAgcHl0aG9uL3B5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXByaW10eXBlcy5zd2cJCgkgICAgICAgICB0Y2wvdGNscHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxwcmltdHlwZXMuc3dnCgoJICAgICAgYW5kIHRoZSBzdHJpbmcgbWFuaXB1bGF0aW9uOiAgCSAKCSAgICAKCSAgICAgICAgIHB5dGhvbi9weXN0cmluZ3Muc3dnCQoJICAgICAgICAgcnVieS9ydWJ5c3RyaW5ncy5zd2cJCgkgICAgICAgICB0Y2wvdGNsc3RyaW5ncy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJsc3RyaW5ncy5zd2cKCgkJIAoJICAgICAgVGhlIHJlc3Qgb2YgdGhlIGZpbGVzLCBzdWNoIGFzIGNhcnJheS5pLCBhcmUgbW9zdGx5IG9uZSAKCSAgICAgIGxpbmUgZmlsZXMgdGhhdCBpbmNsdWRlIHRoZSBwcm9wZXIgdHlwZW1hcCBsaWJyYXJ5CgkgICAgICB2ZXJzaW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUGVybCAqKioKCgkgICAgU29tZSBtaXNzaW5nL3dyb25nIHR5cGVtYXBzIGNvdWxkIHN0YXJ0IHdvcmtpbmcgcHJvcGVybHksCgkgICAgYW5kIGNoYW5nZSB0aGUgb2xkIGV4cGVjdGVkIGJlaGF2aW9yIGluIFBlcmwuCgoxMC8yMy8yMDA1OiB3dXp6ZWIKICAgICAgICAgICAgQ2hpY2tlbjoKICAgICAgICAgICAgICArIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMgZmluYWxseSB3b3JrIHByb3Blcmx5CiAgICAgICAgICAgICAgKyBhZGQgdGVzdCBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgdG8gY3BwX2Jhc2ljLmkKCjEwLzIwLzIwMDU6IGRhbmN5CgkgICAgW2FsbGVncm9jbF0gQWRkZWQgQysrIHN1cHBvcnQuIExhcmdlIHVwZGF0ZSwgbWFueSBjaGFuZ2VzLiBTZWUKCSAgICBuZXdseSBhZGRlZCBBbGxlZ3JvIENvbW1vbiBMaXNwIHNlY3Rpb24gaW4gbGlzcC5odG1sCgoxMC8yMC8yMDA1OiBtbWF0dXMKCSAgICBSdWJ5LCBUY2wsIFB5dGhvbjoKCgkgICAgLSBVbmlmb3JtIHdheSB0byBmYWlsIChsYWJlbCBmYWlsOiksIG5vdyBmaW5hbGx5CgkgICAgICBTV0lHX2V4Y2VwdGlvbiB3b3JrcyBhY3Jvc3MgdGhlIHRocmVlIGxhbmd1YWdlcyBhbmQgYWxsCgkgICAgICB0aGUgdHlwZW1hcHMuCgoJICAgIC0gQWRkIHByb3BlciBjbGVhbnVwIGNvZGUgdG8gcnVieQoKCSAgICAtIE1vcmUgdmFsZ3JpbmQgZml4ZXMKCgkgICAgLSBTaW1wbGlmeSB0aGUgaW5saW5lIHVzZSwgaXQgc2VlbXMgYSBzbWFsbCBpbnRlcmZhY2Ugb2YKCSAgICAgIDIwLDAwMCBsaW5lcyAocGx1cyBtYW55IG1hbnkgdGVtcGxhdGVzKSBjYW4gYnJlYWsgCgkgICAgICBnY2MgLU8zIGVhc2lseS4KCgkgICAgLSBGaW5hbGl6ZSB0aGUgdHlwZW1hcHMgbGlicmFyeS4gQWxsIHRoZSBvbGQgICouaSBmaWxlcwoJICAgICAgKGNhcnJheS5pLCBjcG9pbnRlci5pLCBleGNlcHRpb24uaSkgaGFkIGJlZW4gaW1wbGVtZW50ZWQKCSAgICAgIGluIHRoZSBuZXcgdHlwZW1hcHMgbGlicmFyeS4KCSAgICAKCjEwLzE5LzIwMDU6IHd1enplYgoJICAgIFVwZGF0ZSB0aGUgUnVudGltZSBUeXBlbWFwIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbAoKMTAvMTgvMjAwNTogd3V6emViCgkgICAgQ2hpY2tlbjoKCSAgICAgIC0gQ29ycmVjdGx5IGhhbmRsZSAlaWdub3JlZCBjbGFzc2VzCiAgICAgICAgICAgICAgLSBDb3JyZWN0bHkgY29udmVydCBsb25nLCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGV0YwogICAgICAgICAgICAgICAgdG8gY2hpY2tlbiBwcmltaXRpdmVzLiAoVGhhbmtzIHRvIEZlbGl4IFdpbmtlbG1hbm4pCiAgICAgICAgICAgICAgLSBVc2luZyBhcmdvdXQgcGFyYW1ldGVycyB3aGVuIHRoZSByZXR1cm4gdmFsdWUgd2FzIGEKICAgICAgICAgICAgICAgIHdyYXBwZWQgcG9pbnRlciBjYXVzZWQgYSBtZW1vcnkgY29ycnVwdGlvbi4gIFRoZSBjaGlja2VuCiAgICAgICAgICAgICAgICBnYXJiYWdlIGNvbGxlY3RvciBtb3ZlZCBhIHBvaW50ZXIgb3V0IGZyb20gdW5kZXIgdXMuCiAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBieSBydW5uaW5nIGFsbCB0aGUgcHJveHkgY3JlYXRpb24KICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBhcyBjb250aW51YXRpb25zIGFmdGVyIHRoZSB3cmFwcGVyIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICByZXR1cm5zLiAgQXMgcGFydCBvZiB0aGlzLCB3ZSBubyBsb25nZXIgbmVlZCB0aGUKICAgICAgICAgICAgICAgIGNoaWNrZW5mYXN0cHJveHkgZmxhZyBvbiBvdXRwdXQgdHlwZW1hcHMuCiAgICAgICAgICAgICAgLSB1c2luZyAtcHJveHkgYW5kIC1ub2NvbGxlY3Rpb24gdG9nZXRoZXIgd29ya3Mgbm93CiAgICAgICAgICAgICAgICBCZWZvcmUsIGl0IHdhcyBub3QgZXhwb3J0aW5nIHRoZSBkZXN0cnVjdG9yIGluIHRoZSBwcm94eQogICAgICAgICAgICAgICAgd3JhcHBlci4KCjEwLzE4LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEFkZGVkIHRoZSBVbmlmaWVkIFR5cGVtYXAgTGlicmFyeSAoVVRMKS4gSXQgdW5pZmllcyB0aGUgdHlwZW1hcHMgZm9yCgogCSAgICAgICAgcHl0aG9uLCBydWJ5LCB0Y2wKCgkgICAgYW5kIGluIHRoZSBwcm9jZXNzLCBmaXhlcyBzZXZlcmFsIHByb2JsZW1zIGluIGVhY2ggb2YgdGhlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRvIHdvcmsgaW4gYSAiY2Fub25pY2FsIiB3YXkgbm93IGVzdGFibGlzaGVkIGluCgkgICAgdGhlIHR5cGVtYXAgbGlicmFyeQoJICAgIAoJICAgICAgIFNXSUcvTGliL3R5cGVtcGFzCgoJICAgIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdW5pZmljYXRpb24gaXMgdGhhdCBldmVyeXRoaW5nCgkgICAgY29tcGlsZXMgYW5kIHJ1bnMgaW5zaWRlIHRoZSB0ZXN0LXN1aXRlIGFuZCBleGFtcGxlcwoJICAgIGRpcmVjdG9yaWVzLiBBbmQgZm9yIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdGhhbiBwYXNzIHRoZSBwcmltaXRpdmVfdHlwZXMuaSBjYXNlLgoKCSAgICBBbHNvLCB3ZSBoYXZlIGEgdW5pZm9ybSB3YXkgdG8gdHJlYXQgdGhlIGVycm9ycywgZm9yIGV4YW1wbGUKCSAgICBpZiB5b3UgZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICA+Pj4gZnJvbSBwcmltaXRpdmVfdHlwZXMgaW1wb3J0ICoKICAgICAgICAgICAgICA+Pj4gcHJpbnQgdmFsX3VjaGFyKDEwKQogICAgICAgICAgICAgIDEwCgkgICAgICA+Pj4gcHJpbnQgdmFsX3VjaGFyKDEwMDApCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgkJICAgICAgCgkgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8JCQkgICAgCgkgICAgICBPdmVyZmxvd0Vycm9yOiBpbiBhcmd1bWVudCAxIG9mIHR5cGUgJ3Vuc2lnbmVkIGNoYXInCgoJICAgIHlvdSBnZXQgdGhlIHNhbWUgZXhjZXB0aW9uIGluIGFsbCB0aGUgdGhyZWUgbGFuZ3VhZ2VzLgoJICAgIAoJICAgIEFuZCB3ZWxsLCBtYW55IG1vcmUgZ29vZCB0aGluZ3Mgd2lsbCBjb21lIGZyb20gdGhpcwoJICAgIHVuaWZpY2F0aW9uLCBmb3IgZXhhbXBsZSwgcHJvcGVyIHN1cHBvcnQgb2YgdGhlIFNUTC9TVEQgY2xhc3NlcwoJICAgIGZvciBhbGwgdGhlIGxhbmd1YWdlcywgYW5kIGhvcGVmdWxseSwgd2UgY2FuIGtlZXAKCSAgICBhZGRpbmcgb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICBUaGUgaGFyZGVzdCBwYXJ0LCB3cml0aW5nIGEgY29tbW9uIHR5cGVtYXAgbGlicmFyeQoJICAgIHRoYXQgc3VpdGVzIHRoZSB0aHJlZSBkaWZmZXJlbnQgbGFuZ3VhZ2VzLCBpcyBkb25lLAoJICAgIGFuZCBhZGRpbmcgYW5vdGhlciBsYW5ndWFnZSBzaG91bGQgbm93IGJlIGVhc3kuIAoKCSAgICBTdGlsbCB0aGUgZ2xvYmFsIHVuaWZpY2F0aW9uIGlzIG5vdCBjb21wbGV0ZSwgdGhlIFNUTC9TVEQgCgkgICAgcGFydCBpcyBuZXh0LCBhbmQgcHJvYmFibHkgYXMgd2VsbCBhcyBhZGRpbmcgb25lIG9yIHR3byBtb3JlCgkgICAgbGFuZ3VhZ2VzLgoKCSAgICBJZiB5b3UgYXJlIGN1cmlvdXMsIGxvb2sgYXQgdGhlIHB5dGhvbiwgcnVieSBhbmQvb3IgdGNsCgkgICAgZGlyZWN0b3JpZXMgdG8gc2VlIHdoYXQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG5ldwoJICAgIGNvbW1vbiB0eXBlbWFwcyBsaWJyYXJ5LiAgU3RpbGwsIHRoZSBmaW5hbCB3YXkgdG8KCSAgICBpbnRlZ3JhdGUgYSBuZXcgbGFuZ3VhZ2UgY291bGQgY2hhbmdlIGFzIHdlIG1vdmUgdG8KCSAgICBpbnRlZ3JhdGUgdGhlIFNURC9TVEwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBSdWJ5L1RjbCAqKioKCgkgICAgU29tZSBtaXNzaW5nL3dyb25nIHR5cGVtYXBzIGNvdWxkIHN0YXJ0IHdvcmtpbmcgcHJvcGVybHksCgkgICAgYW5kIGNoYW5nZSB0aGUgb2xkIGJlaGF2aW9yLCBzcGVjaWFsbHkgaW4gcnVieSBhbmQgdGNsLgoKVmVyc2lvbiAxLjMuMjcgKE9jdG9iZXIgMTUsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdHlwZXNhZmUgZW51bSB3cmFwcGluZyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCiAgICAgICAgICAgIG92ZXJsb2FkIGEgbWV0aG9kIHdpdGggMiBkaWZmZXJlbnQgZW51bSB0eXBlcy4KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWZlYXR1cmUoImltbXV0YWJsZSIsIjAiKSBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIHNldHRlcnMKICAgICAgICAgICAgZm9yIGNvbnN0YW50cy4KCiAgICAgICAgICAgIFJlc3RvcmVkICVpbW11dGFibGUgYW5kICVtYWtlZGVmYXVsdCB0byBjbGVhciB0aGUgZmVhdHVyZSBhcyBpdAogICAgICAgICAgICBiZWhhdmVkIGluIFNXSUctMS4zLjI1IGFuZCBlYXJsaWVyLgoKMTAvMTQvMjAwNTogbW1hdHVzCiAgICAgICAgICAgIEZpeCBidWcgaW4gYW5vbnltb3VzIHR5cGVkZWYgc3RydWN0dXJlcyB3aGljaCB3YXMgbGVhZGluZyB0bwogICAgICAgICAgICBzdHJhbmdlIGJlaGF2aW91ci4KCjEwLzEzLzIwMDU6IG1tYXR1cwoJICAgIFNldmVyYWwgbWlub3IgY2hhbmdlczoKCSAgICAKCSAgICAtIEltcHJvdmUgdGhlIHdjaGFyX3QgdHlwZSBzdXBwb3J0CgkgICAgLSBBZGQgYSB3YXJuaW5nIGZvciB3aGVuIHlvdSBkZWZpbmUgdGhlICdpbicgdHlwZW1hcCBidXQKCSAgICAgIHlvdSBkb24ndCBkZWZpbmUgdGhlICd0eXBlY2hlY2snIG9uZS4gVmVyeSBjb21tb24gbWlzdGFrZS4KCSAgICAtIEFkZCBwcm9wZXIgZGVmYXVsdCBydWxlIGZvciBmdW5jdGlvbiBwb2ludGVycywgbm93IHlvdQoJICAgICAgY2FuIGRlZmluZSBhIHR5cGVtYXAgc3VjaCBhczoKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKCgqKShBTlkpKSB7Li4ufQoKCSAgICAgIFRoYXQgd2lsbCBhcHBseSB0byBhbGwgdGhlIHBvaW50ZXIgdG8gZnVuY3Rpb25zLiBUaGUKCSAgICAgIHJ1bGUgaW4gQysrIGFsc28gYXBwbHkgdG8gdGhlIGZ1bmN0aW9uICdyZWZlcmVuY2UnLCBpZSwKCSAgICAgIGluIGJvdGggY2FzZXMKCgkgICAgICAgIHR5cGVkZWYgIGludCAoKmZwdHIpKGludCBhKTsKCSAgICAgICAgdHlwZWRlZiAgaW50IChmdW5jKShpbnQgYSk7CgoJICAgICAgVGhpcyB3YXMgbmVlZGVkIHNpbmNlIGl0IHNlZW1zIHRvIGJlICdpbGxlZ2FsJyBpbiBDKysgdG8KCSAgICAgIGRvIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAgIHZvaWQgKnB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oZnB0cik7CgoJICAgICAgYW5kIHByb2JhYmx5LCBhcyBmb3IgbWVtYmVyIGZ1bmN0aW9ucywgaXQgaXMgbm90CgkgICAgICB3YXJyYW50aWVkIHRoYXQgdGhlIHBvaW50ZXIgc2l6ZXMgd2lsbCBtYXRjaC4KCgkgICAgLSBBZGQgdGhlICNlcnJvci8jd2FybmluZyBkaXJlY3RpdmVzIHRvIHN3aWcncyBjcHAuCgoJICAgIC0gQWRkIHRoZSBub2Jsb2NrIG9wdGlvbiBmb3IgdHlwZW1hcHMsIHdoaWNoIGlzIHVzZWQgYXMKICAgICAgICAgICAgICBmb2xsb3dzOiBzdXBwb3NlZCB5b3UgYSB0eXBlbWFwLCBsaWtlIHRoaXMKCgkgICAgICAKCSAgICAgICV0eXBlbWFwKGluLG5vYmxvY2s9MSkgSGVsbG8gewkJCSAgIAoJICAgICAgICAgLi4uLgogICAgICAgICAgICAgIH0KCgkgICAgICB0aGVuIHRoZSB0eXBlbWFwIHdpbGwgYmUgaW5zZXJ0ZWQgd2l0aG91dCB0aGUgYmxvY2sKCSAgICAgIGltcG9zZWQgYnkgdGhlIGJyYWNrZXRzLCBzaW1pbGFyIHRvCgoJICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiLi4uIjsKCgkgICAgICBTbywgd2h5IHlvdSBkb24ndCBqdXN0IHVzZSB0aGUgcXVvdGUgc3R5bGU/LCBiZWNhdXNlOgoJICAgICAgCgkgICAgICAgICAxLi0gVGhlIHF1b3RlIHN0eWxlIGRvZXNuJ3QgZ2V0IHByZXByb2Nlc3NlZCwgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxPSBTV0lHX21hY3JvKCQxKTsiOwoJICAgICAgCgkgICAgICAgICAgICAgaGVyZSwgU1dJR19tYWNybyBkb2Vzbid0IGdldCBleHBhbmRlZAoKICAgICAgICAgICAgICAgICAyLi0gSW5zaWRlIGEgcXVvdGUgdHlwZW1hcCwgeW91IGhhdmUgdG8gdXNlIAogICAgICAgICAgICAgICAgICAgICBxdW90ZXMgY2FyZWZ1bGx5CgoJCSAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDEgPSBcImhlbGxvXCIgIjsKCgkJIDMuLSBZb3UgY2FuJ3QgbWFrZSBlbWFjcyBhbmQvb3Igb3RoZXIgZWRpdG9ycwoJCSAgICAgdG8gaW5kZW50IGluc2lkZSBhIHN0cmluZyEuIAoKCgkgICAgICBTbywgd2h5IGRvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgYmxvY2s/LCBiZWNhdXNlIGFuIGV4dHJhCgkgICAgICBibG9jayB3aGVuIG5vdCBuZWVkZWQgKG5vIGxvY2FsIHZhcmlhYmxlcyBpbiBpdCk6CgoJICAgICAgICAgIDEuLSBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZAogICAgICAgICAgICAgICAgICAyLi0gbWFrZXMgdGhlIGNvZGUgbGFyZ2VyCiAgICAgICAgICAgICAgICAgIDMuLSBvciBpbiBzaG9ydCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3ZSBoYXZlIHRoZSBxdW90ZSBzdHlsZS4KClZlcnNpb24gMS4zLjI2IChPY3RvYmVyIDksIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBBZGRlZCAndGhyb3dzJyB0eXBlbWFwcy4KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBsYW5ndWFnZXMgdGhhdCBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlLiBUaGUKICAgICAgICAgICAgZmlyc3Qgbm9uLWlnbm9yZWQgY2xhc3MgaW4gdGhlIHB1YmxpYyBiYXNlIGNsYXNzIGxpc3QgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIGJ5IHRoZSBwcm94eSBjbGFzcy4gUHJldmlvdXNseSwgaWYgdGhlIGZpcnN0IGNsYXNzIGluIHRoZSBsaXN0IHdhcyBpZ25vcmVkLCB0aGVuCiAgICAgICAgICAgIHRoZSBwcm94eSBjbGFzcyB3b3VsZG4ndCBoYXZlIGFueSBiYXNlIGNsYXNzZXMuCgoxMC8wNy8yMDA1OiBtbWF0dXMKCSAgICAgVXBkYXRlIG1vcmUgZmVhdHVyZXMgdG8gZm9sbG93IG5ldyBjb252ZW50aW9uLCBpbmNsdWRpbmc6CgoJICAgICAgIGNhbGxiYWNrCgkgICAgICAgcmVmL3VucmVmCgkgICAgICAgZXhjZXB0CgkgICAgCgkgICAgIEFsbCBvZiB0aGVtIHVzZSBub3Qgb25seSB0aGUgZmVhdHVyZSBhcyBhIGZsYWcsIGJ1dCBhbHNvCgkgICAgIGFzIGNvZGUgdmFsdWUuIFRvIGRlYWwgd2l0aCB0aG9zZSBmZWF0dXJlcywgd2UgdXNlIG5vdwoJICAgICBHZXRGbGFnQXR0ciwgd2hpY2ggaXMgc2ltaWxhciB0byBHZXRGbGFnLCBidXQgaW5zdGVhZCBvcgoJICAgICByZXR1cm5pbmcgMSBvciAwLCBpdCByZXR1cm5zIHRoZSBhdHRyIHZhbHVlLCBpZiBoYXBwZW5zCgkgICAgIHRvIGJlIGRpZmZlcmVudCBvZiAiMCIgb2YgY291cnNlLgoKCSAgICAgTm93IHRoZXJlIGFyZSBhbHNvIG1vcmUgdW5pZm9ybSBkaXJlY3RpdmUgbmFtZXMgZm9yIHRoZSAKCSAgICAgb25lcyBiYXNlZCBpbiBmZWF0dXJlcywgZm9yIGV4YW1wbGUsIGZvciB0aGUgb2xkCgkgICAgICVuZXdvYmplY3QgZGlyZWN0aXZlIG5vdyB3ZSBoYXZlIHRyZWUgZGlyZWN0aXZlcyBkZWZpbmVkOgoJICAgICAKCgkgICAgICNkZWZpbmUgJW5ld29iamVjdCAgICAgICAgJWZlYXR1cmUoIm5ldyIpCgkgICAgICNkZWZpbmUgJW5vbmV3b2JqZWN0ICAgICAgJWZlYXR1cmUoIm5ldyIsIjAiKQoJICAgICAjZGVmaW5lICVjbGVhcm5ld29iamVjdCAgICVmZWF0dXJlKCJuZXciLCIiKQoKCSAgICAgYW5kIHNvIG9uIGZvciBhbGwgdGhlIG90aGVyIGZlYXR1cmUgZGlyZWN0aXZlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMzAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzb21lIGZlYXR1cmVzLiBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgdG8gZGlzYWJsZSBtYW55CiAgICAgICAgICAgIGZlYXR1cmVzIG9uY2UgdGhleSBoYWQgYmVlbiBlbmFibGVkLiBUaGlzIHdhcyBmb3IgbW9zdCBmZWF0dXJlcyB0aGF0IGJlaGF2ZSBhcwogICAgICAgICAgICBmbGFncy4gVGhlc2UgZmVhdHVyZXMgbm93IHdvcmsgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiKSAgICAgICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjEiKSAgICAgICAgIC8vIGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIwIikgICAgICAgICAvLyBkaXNhYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIiIpICAgICAgICAgIC8vIGNsZWFycyB0aGUgZmVhdHVyZQoKICAgICAgICAgICAgSW4gZmFjdCBhbnkgbm9uLWVtcHR5IHZhbHVlIG90aGVyIHRoYW4gIjAiIHdpbGwgZW5hYmxlIHRoZSBmZWF0dXJlIChsaWtlIEMgYm9vbGVhbiBsb2dpYykuCiAgICAgICAgICAgIFByZXZpb3VzbHkgIjEiLCAiMCIgb3IgYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSB3b3VsZCBlbmFibGUgdGhlIGZlYXR1cmUgYW5kIGl0IHdvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgcG9zc2libGUgdG8gZGlzYWJsZSB0aGUgZmVhdHVyZSBieSBjbGVhcmluZyBpdCAoYXNzdW1pbmcgdGhlcmUgd2FzIG5vIGdsb2JhbCBlbmFibGUpLgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgYWZmZWN0ZWQ6CgogICAgICAgICAgICAgIGFsbG93ZXhjZXB0CiAgICAgICAgICAgICAgY29tcGFjdGRlZmF1bHRhcmdzCiAgICAgICAgICAgICAgY2xhc3NpYyAgICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIGNzOmNvbnN0ICAgICAgICAgICAgICAgKEMjKQogICAgICAgICAgICAgIGRpcmVjdG9yCiAgICAgICAgICAgICAgZXhjZXB0aW9uY2xhc3MgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIGlnbm9yZQogICAgICAgICAgICAgIGltbXV0YWJsZQogICAgICAgICAgICAgIGphdmE6Y29uc3QgICAgICAgICAgICAgKEphdmEpCiAgICAgICAgICAgICAgamF2YTpkb3duY2FzdCAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBrd2FyZ3MKICAgICAgICAgICAgICBtb2Rlcm4gICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbmV3CiAgICAgICAgICAgICAgbm9hdXRvZG9jICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG5vZGVmYXVsdAogICAgICAgICAgICAgIG5vZGlyZWN0b3IKICAgICAgICAgICAgICBub3JlZgogICAgICAgICAgICAgIG5vdGFic3RyYWN0CiAgICAgICAgICAgICAgbm91bnJlZgogICAgICAgICAgICAgIG5vdmFsdWV3cmFwcGVyCiAgICAgICAgICAgICAgcHl0aG9uOm1heWJlY2FsbCAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIHB5dGhvbjpub25keW5hbWljICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBtb2R1bGEzOm11bHRpcmV0dmFsICAgIChNb2R1bGEzKQogICAgICAgICAgICAgIHByZWRpY2F0ZSAgICAgICAgICAgICAgKFJ1YnkpCiAgICAgICAgICAgICAgdHJhY2tvYmplY3RzICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB2YWx1ZXdyYXBwZXIKCiAgICAgICAgICAgIEl0IGlzIG5vdyBwb3NzaWJsZSwgZm9yIGV4YW1wbGUgdG8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMgaW4gYSBoZWFkZXIgZmlsZSwgZXhjZXB0IGZvciBhCiAgICAgICAgICAgIGZldyB0YXJnZXR0ZWQgbWV0aG9kcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbGwgbWV0aG9kcy9jbGFzc2VzCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBzb21lX2Z1bmN0aW9uKGludCwgZG91YmxlKTsgLy8gZG8gbm90IGlnbm9yZSB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBTb21lQ2xhc3M7ICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGlnbm9yZSB0aGlzIENsYXNzCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBTb21lQ2xhc3M6Om1ldGhvZDsgICAgICAgICAgLy8gZG8gbm90IGlnbm9yZSB0aGlzIG1ldGhvZAogICAgICAgICAgICAgICVpbmNsdWRlICJiaWdoZWFkZXIuaCIKCiAgICAgICAgICAgIFJlbW92ZWQgJXB5dGhvbmR5bmFtaWMgLSBpdCBuZXZlciB3b3JrZWQgcHJvcGVybHkuIFVzZSAlcHl0aG9ubm9uZHluYW1pYyBpbnN0ZWFkLgogICAgICAgICAgICBSZW1vdmVkICVmZWF0dXJlKCJub2t3YXJncyIpIC0gaXQgd2Fzbid0IGZ1bGx5IGltcGxlbWVudGVkICAtIHVzZSAlZmVhdHVyZSgia3dhcmdzIiwiMCIpIGluc3RlYWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzI1LzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFkZCAidGhyb3dzIiB0eXBlbWFwcy4KCjA5LzI0LzIwMDU6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0gQWRkcyBuZXcgJXRyYWNrb2JqZWN0cyBmdW5jdGlvbmFsaXR5IHRoYXQgbWFwcyBDKysgb2JqZWN0cyB0bwogICAgICAgICAgICBSdWJ5IG9iamVjdHMuICBUaGlzIGZ1bmN0aW9uYWxpdHkgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gaW1wbGVtZW50CiAgICAgICAgICAgIG1hcmsgZnVuY3Rpb25zIGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuICBGb3IgbW9yZSBpbmZvcm1hdGlvbgogICAgICAgICAgICByZWZlciB0byB0aGUgdXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLgogICAgICAgICAgICAKMDkvMjAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhdGNoIDExMTY0MzEgZnJvbSBKb3NoIENoZXJyeS4gRml4ZXMgbm9uIG1lbWJlciBmdW5jdGlvbnMgaW5hZHZlcnRlbnRseQogICAgICAgICAgICBiZWluZyBjYWxsZWQgaW5zdGVhZCBvZiBtZW1iZXIgZnVuY3Rpb25zLgoKMDkvMjAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUGF0Y2ggZnJvbSBNYXJrIEdvc3NhZ2UgdG8gYWRkIHN1cHBvcnQgZm9yIEx1YS01LjEsIHN0ZDo6c3RyaW5nLAogICAgICAgICAgICBzdGQ6OnZlY3Rvciwgc3RkOjpleGNlcHRpb24gYW5kIGRvY3VtZW50YXRpb24uCgowOS8xNC8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGQgLW5vY3BwY2FzdC4gTm93IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCgkgICAgYWx3YXlzIHVzZSB0aGUgY3BwY2FzdCBvcGVyYXRvcnMuIEJlZm9yZSB0aGF0IHdhcyB0aGUgY2FzZQoJICAgIG9ubHkgd2hlbiB5b3UgdXNlZCB0aGUgLWNwcGNhc3Qgb3B0aW9uLgoKICAgICAgICAgICAgSWYgdGhpcyBzZWVtcyB0byBicmVhayB5b3VyIGNvZGUuLi4geW91ciB3ZWxjb21lISwgaXQKCSAgICBtZWFucyBpdCB3YXMgYnJva2VuIGJlZm9yZSwgYW5kIHlvdSBuZXZlciBub3RpY2UuIAoKCSAgICBJZiB5b3UgdGhpbmcgdGhlIGVycm9yIGlzIGR1ZSB0byBvbmUgb2YgdGhlIFNXSUcgdHlwZW1hcHMsCgkgICAgc2VuZCB1cyBhbiBleGFtcGxlLgoKCSAgICBVc2UgLW5vY3BwY2FzdCBvbmx5IHdpdGggdmVyeSBvbGQgQysrIGNvbXBpbGVycyB0aGF0CgkgICAgZG8gbm90IHN1cHBvcnQgdGhlIGNwcGNhc3Qgb3BlcmF0aW9ucy4gCgoJICAgIFNvLCBoZXJlIGFwcGxpZXM6CgoJCVRoaXMgY2hhbmdlIGRvZXNuJ3QgYnJlYWsgY29tcGF0aWJpbGl0eSwgaXQgd2FzIGJyb2tlbiBiZWZvcmUuCgowOS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvciBtZXRob2RzIHdoZW4gYSBjbGFzcyBpcyBwYXNzZWQgYnkgdmFsdWUgYXMgYQogICAgICAgICAgICBwYXJhbWV0ZXIuCgowOS8xMS8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgQWRkaW5nIHRoZSBtb2R1bGUgb3B0aW9uIHRvIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gTm93IHlvdQogICAgICAgICAgICBjYW4gdXNlIGl0IGFzCgoJICAgICAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkgICAgd2hlcmUgc3ViZmlsZSBjb3VsZCAob3Igbm90KSBkZWZpbmUgdGhlIG1vZHVsZSBuYW1lIHZpYQoJICAgIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gVGhlIG1vZHVsZSBvcHRpb24gdGFrZSBwcmVjZWRlbmNlCgkgICAgYW5kIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3RzIHRoYW4gaGF2aW5nIHRoZSBkaXJlY3RpdmUgCgoJICAgICAgICAlbW9kdWxlIEJpZ01vZHVsZSAgCgoJICAgIGluc2lkZSB0aGUgaW1wb3J0ZWQgZmlsZSBmb28uaS4KCgkgICAgWW91IGNhbiB1c2UgdGhlIG9wdGlvbiBpbiBtYWlubHkgdHdvIGNhc2VzOgoKCSAgICAxLi0gWW91IHVzZWQgdGhlIC1tb2R1bGUgb3B0aW9uIHdoZW4geW91IGdlbmVyYXRlZCB0aGUKICAgICAgICAgICAgICAgIG1vZHVsZSB0byBiZSBpbXBvcnRlZCwgYW5kIGhlbmNlIHRoZSBtb2R1bGUgbmFtZSBpbgogICAgICAgICAgICAgICAgdGhlIGltcG9ydGVkICVtb2R1bGUgZGlyZWN0aXZlIGlzIG5vdCByZWFsbHkgdXNlZnVsLgoKCSAgICAyLi0gVGhlIG1vZHVsZSB5b3Ugd2FudCB0byBpbXBvcnQgaXMgdmVyeSBsYXJnZSwgYW5kIGl0CiAgICAgICAgICAgICAgICBoYXMgc2V2ZXJhbCAuaS8uaCBmaWxlcy4gVGhlbiwgaWYgeW91IGp1c3Qgb25lIHRvCiAgICAgICAgICAgICAgICBpbXBvcnQgYSBjbGFzcyBvciBzbyBmcm9tIHRoZSBtb2R1bGUsIHNheXMgJ2ZvbycsIGFuZAogICAgICAgICAgICAgICAgbm90IHRoZSBlbnRpcmUgbW9kdWxlIHZpYSBpbXBvcnRpbmcgdGhlIG1haW4KICAgICAgICAgICAgICAgIEJpZ01vZHVsZS5pIGZpbGUsIHRoZW4geW91IGp1c3QgZG86CgogCQkgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5oCgogICAJICAgICAgICBvcgoJCQogCQkgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5pCgoJCXdoZXJlIGZvby5pIGNvbnRhaW5zIHRoZSAnZm9vJyBkZWNsYXJhdGlvbiBhbmQgbWF5YmUgYQoJCWNvdXBsZSBvZiBleHRyYSAlaW5jbHVkZSBkaXJlY3RpdmVzLCBhcyBuZWVkZWQuCgoJICAgIAowOS8xMS8yMDA1OiBtbWF0dXMKCSAgICBGaXggYnVnICMxMjgyNjM3LCBhYm91dCB0aGUgLW1vZHVsZSBvcHRpb24gbm90IGhhdmluZyBlZmZlY3QKCSAgICBpbiBwbGFjZXMgd2hlcmUgaXQgd2FzIG5lZWRlZC4KCjA5LzExLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFdoZW4gd3JhcHBpbmcgdmFyaWFibGVzLCBlbnN1cmUgdGhhdCBub25lIG9mIHRoZSB0eXBlbWFwcyB1c2VkIGZvciB0aGUKICAgICAgICAgICAgc2V0IHdyYXBwZXJzIGFyZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgZ2V0IHdyYXBwZXJzLiBJIGRvdWJ0IHRoaXMgd2FzIGEKICAgICAgICAgICAgcHJvYmxlbSBmb3IgYW55IGxhbmd1YWdlcyBleGNlcHQgZm9yIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIG51bGwgYXR0cmlidXRlCiAgICAgICAgICAgIGluIHRoZSBvdXQgdHlwZW1hcCAoQyMgb25seSkuCgowOS8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2VzIHdoZW4gZmlsZXMgZmFpbCB0byBvcGVuLgoKMDkvMDYvMjAwNTogbW1hdHVzIAoKCSAgICBBbGxvdyBhICVkZWZpbmUgYSBtYWNybyBpbnNpZGUgYW5vdGhlciAlZGVmaW5lIG1hY3JvLCBmb3IgZXhhbXBsZQoKCSAgICAgICVkZWZpbmUgaGVsbG8obmFtZSwgVHlwZSkKCSAgICAgICVkZWZpbmUgbmFtZSAjIyBhKFR5cGUpCgkgICAgICAldHlwZW1hcChpbikgVHlwZSAiaGVsbG87IjsKCSAgICAgICVlbmRkZWYKCSAgICAgICVlbmRkZWYKCSAgICAgIAoJICAgIFRvIGxlYXJuIGhvdyB0byB1c2UgdGhpcyBuZXcgZmVhdHVyZXMgaW4geW91ciBvd24gdHlwZW1hcHMgbGlicmFyeSwgc2VlCgkgICAgcHl0aG9uL2NzdHJpbmcuaSwgcHl0aG9uL2N3c3RyaW5nLmkgYW5kIHB5dGhvbi9jd3N0cmJhc2UuaS4JICAgIAoKICAgICAgICAgICAgW1B5dGhvbl0gTm9ybWFsaXplIHRoZSBjc3RyaW5nLmkgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZyYWdtZW50cywgYW5kIGFkZAogICAgICAgICAgICBjd3N0cmluZy5pLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzYW1lIHR5cGVtYXBzIGJ1dCBmb3Igd2NoYXJfdCBzdHJpbmdzLgoKCSAgICBbUHl0aG9uXSBCdWcgZml4ZWQ6IDEyNDc0NzcsIDEyNDU1OTEsIDEyNDk4NzggYW5kIG90aGVycy4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgU1dJR1RZUEUqIERJU09XTiB0eXBlbWFwIChsaWtlIGluIFB5dGhvbikgZm9yCiAgICAgICAgICAgIGJldHRlciBjb250cm9sIG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBlZyB3aGVuIGFkZGluZyBhbiBvYmplY3QgY3JlYXRlZCBpbiBSdWJ5CiAgICAgICAgICAgIHRvIGEgQysrIGNvbnRhaW5lci4gUGF0Y2ggIzEyNjE2OTIgZnJvbSBDaGFybGllIFNhdmFnZS4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIDY0IGJpdCBwbGF0Zm9ybSBmaXhlcyBmb3IgdGhlIHZhcmFyZ3MgaGFuZGxpbmcgaW4gU1dJR19HZXRBcmdzLiBUaGlzIGlzIGFuCiAgICAgICAgICAgIGltcHJvdmVkIGZpeCBmb3IgYnVnICMxMDExNjA0IGFzIHN1Z2dlc3RlZCBieSBKZXJlbXkgTGluLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQnVnICMxMjQwNDY5IC0gJW5ld29iamVjdCBzdXBwb3J0IGZvciBUY2wuIFBhdGNoIGZyb20gQm9iIE1hcmluaWVyLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEJ1ZyAjMTI1NDQ5NCAtIEZpeCBmb3IgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24gYnkgcGVybCBoZWFkZXIgZmlsZXMKICAgICAgICAgICAgKGJvb2wgZGVmaW5lKSBwcmV2ZW50ZWQgU1RMIGhlYWRlcnMgZnJvbSBiZWluZyB1c2VkIG9uIHNvbWUgc3lzdGVtcywgZWcKICAgICAgICAgICAgV2luZG93cyB3aXRoIFZpc3VhbCBTdHVkaW8uCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQnVnICMxMjQwOTM3IC0gUmVkZWZpbml0aW9uIG9mIF9faW50NjQgdHlwZWRlZiBmb3IgSW50ZWwgY29tcGlsZXJzLgoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gQnVnICMxMjUxODMyIC0gIEMrKyB0ZW1wbGF0ZSBtYXkgZ2VuZXJhdGUgaW52YWxpZCBYTUwgZmlsZQoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gU3VwcG9ydCBhZGRlZCBmb3IgTHVhLiBQYXRjaCAjMTI0Mjc3MiBmcm9tIE1hcmsgR29zc2FnZS4KICAgICAgICAgICAgSXQgc3VwcG9ydHMgbW9zdCBDL0MrKyBmZWF0dXJlcyAoZnVuY3Rpb25zLCBzdHJ1Y3QsIGNsYXNzZXMsIGFycmF5cywgcG9pbnRlcnMsCiAgICAgICAgICAgIGV4Y2VwdGlvbnMpLCBhcyB3ZWxsIGFzIGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBhbmQgYSBmZXcgdGVzdCBjYXNlcyAmIGV4YW1wbGVzLgoKMDgvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gRml4IGluY29ycmVjdCB4bWwgZXNjYXBpbmcgaW4gYmFzZSBjbGFzcyBuYW1lIHdoZW4gYmFzZSBjbGFzcyBpcyBhIHRlbXBsYXRlLgoKMDgvMTMvMjAwNTogZWZ1enp5b25lCgkgICAgW0NMSVNQXSBBZGRlZCBzdXBwb3J0IGZvciBoYW5kbGluZyBlbnVtcy4gRG9lcyBub3QgYWRkcyB0aGUgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb24KCSAgICB0byB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiwgaWYgYSBmdW5jdGlvbiByZXR1cm5zIHZvaWQuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgTmV3IGxhbmd1YWdlIG1vZHVsZSwgQ29tbW9uIExpc3Agd2l0aCBVRkZJLCBmcm9tIFV0ei1Vd2UgSGF1cy4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBGaXggdGhlIExpc3Agcy1leHByZXNzaW9uIG91dHB1dCBtb2R1bGU7IGl0IG5vIGxvbmdlciBjb21wbGFpbnMgYWJvdXQgInVua25vd24gdGFyZ2V0cyIuCgowNy8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIFNUTCB3cmFwcGVycyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIHVzZXIncyAlZXhjZXB0aW9uIGRpcmVjdGl2ZQogICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSBTVEwgd3JhcHBlciBtZXRob2RzLiBQcmV2aW91c2x5IHRoZSBmb2xsb3dpbmcgZ2xvYmFsICVleGNlcHRpb24KICAgICAgICAgICAgZGlyZWN0aXZlIHdvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7IAogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBieSByZXBsYWNpbmcgJWV4Y2VwdGlvbiBkaXJlY3RpdmVzIGZvciBzcGVjaWZpYyBTVEwgd3JhcHBlcgogICAgICAgICAgICBtZXRob2RzIHdpdGggYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZGVjbGFyZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kcy4gdGhyb3dzIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBub3cgc3VwcGxpZWQgZm9yIGhhbmRsaW5nIHRoZSBTVEwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIFRoZXNlIGNhbiBhbHNvIGJlIGVhc2lseQogICAgICAgICAgICBvdmVycmlkZGVuLCBmb3IgZXhhbXBsZSB0aGUgc3RkOjpvdXRfb2ZfcmFuZ2UgZXhjZXB0aW9uLCB3aGljaCBpcyB1c2VkIGEgbG90IGluIHRoZSBTVEwKICAgICAgICAgICAgd3JhcHBlcnMsIGNhbiBiZSBjdXN0b21pc2VkIGVhc2lseToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIHN0ZDo6b3V0X29mX3JhbmdlIHsKICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBleGNlcHRpb24gaGFuZGxlcgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdEludCkgc3RkOjp2ZWN0b3I8aW50PjsKCjA3LzIyLzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0xJU1BdIFRoZSBjbGlzcCBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBJdCBjYW4gb25seSBoYW5kbGUgQywgY2xpc3AgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnRzIGZmaSBiaW5kaW5ncyB0byBDKysuCiAgICAgICAgICAgICAgLSBJdCBoYXMgdHdvIG9wdGlvbnMsIChhKSAtZXh0ZXJuLWFsbCB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgZm9yIGFsbCBmdW5jdGlvbnMKICAgICAgICAJYW5kIHZhcmlhYmxlc3Rpb25zLCAoYikgLWdlbmVyYXRlLXR5cGVkZWYgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzICJkZWYtYy10eXBlIgoJICAgICAgICB3cmFwcGVycyBmb3IgdHlwZWRlZnMKCSAgICAgIC0gQ2FuIGhhbmRsZSBwb2ludGVycyB0byBmdW5jdGlvbnMsIGNvbXBsZXggdHlwZXMgc3VjaCBhcyBuLWRpbWVuc2lvbmFsIGFycmF5cyBvZiAKCSAJcG9pbnRlcnMgb2YgZGVwdGggZAoJICAgICAgLSBHZW5lcmF0ZXMgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyBhcyB3ZWxsIGFzIHZhcmlhYmxlcwoJICAgICAgLSBDb3JyZWN0bHkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHRoZSBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZXMgaW4gc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCgkgICAgICAtIENyZWF0ZXMgYSBkZWZwYWNrYWdlICJkZWNsYXJhdGlvbiIgd2l0aCB0aGUgbW9kdWxlIG5hbWUgYXMgdGhlIHBhY2thZ2UgbmFtZSwgdGhlIGNyZWF0ZWQgCgkgICAgCXBhY2thZ2UgZXhwb3J0cyBib3RoIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzCgkgICAgICAtIHRyaWVzIHRvIGd1ZXNzIHdoZW4gc2hvdWxkIGEgcG9pbnRlciB2YXJpYWJsZSBiZSBkZWNsYXJlZCBhcyBjLXB0ciBvciBjLXBvaW50ZXIKCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQ2hhbmdlcyB0byBzdXBwb3J0IEMjIHN0cnVjdHMgcmV0dXJuZWQgYnkgdmFsdWUuIFRoZSBjaGFuZ2VzIHJlcXVpcmVkIGFyZToKICAgICAgICAgICAgICAtIFVzaW5nIGFuIG9wdGlvbmFsICdudWxsJyBhdHRyaWJ1dGUgaW4gdGhlIG91dCB0eXBlbWFwLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgICB0aGVuIGl0IGlzIHVzZWQgZm9yIHRoZSAkbnVsbCBzcGVjaWFsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KICAgICAgICAgICAgICAtIFRoZSBjdHlwZSB1c2VkIGluIHRoZSBDL0MrKyB3cmFwcGVycyBpcyBubyBsb25nZXIgaW5pdGlhbGlzZWQgdG8gMCBvbiBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgQm90aCBvZiB0aGVzZSBjaGFuZ2VzIGZpeCB0aGUgc2l0dWF0aW9ucyB3aGVyZSBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFzc2lnbiAwIHRvIHRoZQogICAgICAgICAgICByZXR1cm5lZCBzdHJ1Y3QuIE1hcnNoYWxsaW5nIHN0cnVjdHMgYXMgdmFsdWUgdHlwZXMgc3RpbGwgcmVxdWlyZXMgdXNlciBkZWZpbmVkIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYW4gZXhhbXBsZS4KCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IFNXSUdfZXhjZXB0aW9uIHVzYWdlIHRvIHdvcmsgd2l0aCBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGVtcHR5IG1hY3JvCiAgICAgICAgICAgIGFyZ3VtZW50cy4gVW5mb3J0dW5hdGVseSB0aGlzIGZpeCB3aWxsIHN0b3AgdXNhZ2Ugb2YgU1dJR19leGNlcHRpb24gYmVpbmcgdXNlZCB3aXRoaW4gdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCB1c2UgIiIgb3IgJXsgJX0gZGVsaW1pdGVycywgYnV0IGNvbnRpbnVlcyB0byB3b3JrIHdpdGggdHlwZW1hcHMgdXNpbmcge30gZGVsaW1pdGVycy4KICAgICAgICAgICAgUGxlYXNlIHVzZSB0aGUgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQgb3IgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gbWV0aG9kcyBpbnN0ZWFkCiAgICAgICAgICAgIGFzIFNXSUdfZXhjZXB0aW9uIGlzIHJlYWxseSBpbnRlbmRlZCBhcyBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hY3JvIGZvciB0aGUgU1dJRyBsaWJyYXJ5IHdyaXRlcnMuCgowNy8xNi8yMDA1OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSBzcGVjaWZpYyBmb3JlaWduIHR5cGVzIHJhdGhlciB0aGFuICgqIDp2b2lkKS4gCgkgICAgVXNlICpzd2lnLWlkZW50aWZpZXItY29udmVydGVyKi4KCjA2LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZ1bmN0aW9ucyBkZWNsYXJlZCBhcyAnZXh0ZXJuJyBubyBsb25nZXIgaGF2ZSBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFkZGVkIHRvIHRoZSAKICAgICAgICAgICAgd3JhcHBlciBmaWxlcy4gVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgU1dJRyBkb2VzIG5vdCBnZXQgdGhpcyByaWdodCwgZWcgYnVnICMxMjA1ODU5IChleHRlcm4KICAgICAgICAgICAgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UpLiBBbHNvIFNXSUcgY2Fubm90IGdldCBub24tc3RhbmRhcmQKICAgICAgICAgICAgY2FsbGluZyBjb252ZW50aW9ucyBjb3JyZWN0LCBlZyBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHVzdWFsbHkgaGFuZGxlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMIF9fc3RkY2FsbAogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgRExMSU1QT1JUIGV4dGVybiBTVERDQUxMIHZvaWQgZnVuY3Rpb24oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgU1dJRyBpbmNvcnJlY3RseSBnZW5lcmF0ZXM6CgogICAgICAgICAgICBleHRlcm4gdm9pZCBmdW5jdGlvbihpbnQpOwoKICAgICAgICAgICAgVG8gd2hpY2ggdGhlcmUgaXMgbm8gc29sdXRpb24gYXMgU1dJRyBkb2Vzbid0IGhhbmRsZSBub24tc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9ucy4gVGhlIGV4dHJhCiAgICAgICAgICAgICdleHRlcm4nIGZ1bmN0aW9uIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaXMgc3VwZXJmbHVvdXMgdW5sZXNzIGEgdXNlciBoYXMgZm9yZ290dGVuIHRvIGFkZCB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgZGVjbGFyYXRpb24gaW50byB0aGUgd3JhcHBlcnMuCgogICAgICAgICAgICBUaGUgLW5vZXh0ZXJuIGNvbW1hbmRsaW5lIGFyZ3VtZW50IGlzIG5vdyByZWR1bmRhbnQgYW5kIGEgbmV3IGNvbW1hbmRsaW5lIGFyZ3VtZW50IC1hZGRleHRlcm4gY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIuIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB1bmxlc3MgdGhlIGhlYWRlciBmaWxlCiAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdhcyBpbmFkdmVydGVudGx5IG5vdCBhZGRlZCB0byB0aGUgd3JhcHBlcnMuIFRvIGZpeCB0aGlzCiAgICAgICAgICAgIGFkZCB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gaW50byB5b3VyIHdyYXBwZXJzLCBGb3IgZXhhbXBsZSwgcmVwbGFjZToKCiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CgogICAgICAgICAgICB3aXRoOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDYvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhLCBNb2R1bGEzLCBPY2FtbF0KICAgICAgICAgICAgVGhlIGludGVybWVkaWFyeSBmdW5jdGlvbiBuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcyB0bwogICAgICAgICAgICBtYXRjaCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBzbyB0aGF0ICVleHRlbmQgZm9yIGEgbWVtYmVyIHZhcmlhYmxlIHdvcmtzCiAgICAgICAgICAgIHVuaWZvcm1seSBhY3Jvc3MgYWxsIGxhbmd1YWdlIG1vZHVsZXMsIGVnOgoKICAgICAgICAgICAgICAlZXh0ZW5kIEV4dGVuZE1lIHsKICAgICAgICAgICAgICAgIFZhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBFeHRlbmRNZV9WYXJfc2V0KEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBFeHRlbmRNZV9WYXJfZ2V0KEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtZXRob2RzIGltcGxlbWVudGluZyB0aGUgZ2V0L3NldCB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBnZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBuYW1lIG9mIHZhcmlhYmxlIHdyYXBwZXIgZnVuY3Rpb25zIHdoZW4gdXNpbmcgLW5vcHJveHkuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBuYW1lcyBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggdGhlIC1vbGR2YXJuYW1lcyBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKClZlcnNpb24gMS4zLjI1IChKdW5lIDExLCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzExLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBoYW5kbGluZyBvZiBhbm9ueW1vdXMtZW51bSB2YXJpYWJsZXMuCgowNi8xMC8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXNzZWQgYnkKCSAgICBjb3B5LW9mLXZhbHVlLiAgRml4IGZvciBnbG9iYWwgImNvbnN0IGNoYXIgKiIgdmFyaWFibGVzLgoJICAgIEZpeCB0ZXN0Y2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MsIGFycmF5c19nbG9iYWwuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIHdoZW4gYSBiYXNlIGNsYXNzIGRlZmluZXMgYSBzeW1ib2wgYXMgYSBtZW1iZXIgdmFyaWFibGUgYW5kIGEgZGVyaXZlZCBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIHRoZSBzYW1lIHN5bWJvbCBhcyBhIG1lbWJlciBtZXRob2QuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyAtIHdoZW4gYSBtZXRob2QgaGFzIHByb3RlY3RlZCBhY2Nlc3MgCiAgICAgICAgICAgIGluIGJhc2UgYW5kIHB1YmxpYyBhY2Nlc3MgaW4gZGVyaXZlZCBjbGFzcy4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA2NjM2MyAtIEZvbGxvdyBjb252ZW50aW9uIG9mIHJlbGVhc2UgdGFyYmFsbCBuYW1lIG1hdGNoaW5nIGRpcmVjdG9yeSBuYW1lLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggIzEyMTEzNTMgLSB0eXBlc2FmZSBlbnVtcyAoYW5kIEphdmEgcHJvcGVyIGVudW1zKSB3cmFwcGVycyB3aGVuIGVudW0gdmFsdWUKICAgICAgICAgICAgaXMgbmVnYXRpdmUuCgowNS8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2Rlcm5pc2VkIGFuZCB0aWRpZWQgdXAgV2luZG93cyBtYWNyb3MgLS0+IFNXSUdFWFBPUlQsIFNXSUdTVERDQUxMLiBUaGV5IGNhbiBiZSBvdmVycmlkZGVuCiAgICAgICAgICAgIGJ5IHVzZXJzIHZpYSAtRCBjb21waWxlciBkaXJlY3RpdmVzIGlmIG5lZWQgYmUuCgowNS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAlY3NtZXRob2Rtb2RpZmllcnMgY2FuIGJlIGFwcGxpZWQgdG8gdmFyaWFibGVzIGFzIHdlbGwgYXMgbWV0aG9kcyBub3cuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCAncHVibGljJyBtb2RpZmllciB0aGF0IFNXSUcgZ2VuZXJhdGVzLCAlY3NtZXRob2Rtb2RpZmllcnMgd2lsbCBhbHNvCiAgICAgICAgICAgIHJlcGxhY2UgdGhlIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyB0aGF0IFNXSUcgdGhpbmtzIGlzIGFwcHJvcHJpYXRlLiBUaGlzIGZlYXR1cmUgaXMKICAgICAgICAgICAgdXNlZnVsIGZvciBzb21lIG9ic2N1cmUgY2FzZXMgd2hlcmUgU1dJRyBtaWdodCBnZXQgdGhlIG1vZGlmaWVycyBpbmNvcnJlY3QsIGZvciBleGFtcGxlCiAgICAgICAgICAgIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UgYW5kIG92ZXJyaWRpbmcgYSBtZXRob2QgaW4gdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBjb25zdHJ1Y3RvcnMgdG8gc3RkOjpwYWlyIHdyYXBwZXJzIChzdGRfcGFpci5pKSBmb3IgYWxsIGxhbmd1YWdlcy4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgc3RkOjpwYWlyIHdyYXBwZXJzIGluIHN0ZF9wYWlyLmkKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlIEMjICduZXcnIGFuZCAnb3ZlcnJpZGUnIG1vZGlmaWVycyB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGEgQysrIGNsYXNzIGluaGVyaXRzIG1ldGhvZHMKICAgICAgICAgICAgdmlhIGEgQysrICd1c2luZycgZGVjbGFyYXRpb24uCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBwcmV2aW91c2x5IGJlaW5nIGlnbm9yZWQgaW4gY2xhc3NlcyB0aGF0IGluaGVyaXRlZCBtZXRob2RzCiAgICAgICAgICAgIGZyb20gJ3VzaW5nJyBkZWNsYXJhdGlvbnMsIGVnIGNhbGxzIHRvIERlcml2ZWQ6OmJhciBiZWxvdyB3aWxsIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50bwogICAgICAgICAgICBhIHRhcmdldCBsYW5ndWFnZSBleGNlcHRpb24vZXJyb3IsIGxpa2UgaXQgYWx3YXlzIGhhcyBkb25lIGZvciBCYXNlOjpCYXIuCgogICAgICAgICAgICBjbGFzcyBCYXNlIHsKICAgICAgICAgICAgICB2aXJ0dWFsIGJhcigpIHRocm93IChzdGQ6OnN0cmluZyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CiAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6YmFyOwogICAgICAgICAgICB9OwoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRldGVjdGluZyB2aXJ0dWFsIG1ldGhvZHMgaW4gJWV4dGVuZCBmb3IgdGhlIC1mdmlydHVhbCBvcHRpb24gYW5kIEMjIG92ZXJyaWRlIGFuZCBuZXcKICAgICAgICAgICAgbWV0aG9kIG1vZGlmaWVycy4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICduZXcnIG1vZGlmaWVyIGlzIG5vdyBnZW5lcmF0ZWQgb24gdGhlIHByb3h5IG1ldGhvZCB3aGVuIGEgbWV0aG9kIGluIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBpcyBub3QgcG9seW1vcnBoaWMgYW5kIHRoZSBzYW1lIG1ldGhvZCBleGlzdHMgaW4gdGhlIGRlcml2ZWQgY2xhc3MgKGllIGl0IGhpZGVzCiAgICAgICAgICAgIHRoZSBiYXNlIGNsYXNzJyBub24tdmlydHVhbCBtZXRob2QpLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXhlcyB0byBkZXRlY3Rpb24gb2YgY292YXJpYW50IHJldHVybiB0eXBlcyAtIHdoZW4gdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyBtb3JlCiAgICAgICAgICAgIHRoYW4gMiBjbGFzc2VzIGRlZXAuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXBzIG1vdmVkIGZyb20gc3RkX3N0cmluZy5pIHRvIHN0ZF93c3RyaW5nLmkKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgY3Jhc2ggaW4gRG9oU3Ryc3RyLCBidWcgIzExOTA5MjEKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIEZpeCBmb3IgbWV0aG9kcyB3aXRoIHNpbWlsYXIgbmFtZXMgd2hlbiBzaG93aW5nIGxpc3Qgb2YgbmFtZXMgb24gZXJyb3IgLSBidWcgIzExOTE4MjguCiAgICAgICAgICAgIFBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBsb25nIGxvbmcgb3ZlcmxvYWRpbmcgZml4IC0gYnVnICMxMTkxODM1LCBwYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTE5Njc1NSB0byByZW1vdmUgZGVidWcgZnJvbSBzd2lndGNsOC5zd2cuCgowNS8xOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIC1mdmlydHVhbCBvcHRpb25dIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIHdoZW4gYQogICAgICAgICAgICB2aXJ0dWFsIG1ldGhvZCdzIHJldHVybiB0eXBlIHdhcyBhIHR5cGVkZWYgaW4gZWl0aGVyIHRoZSBiYXNlIG9yIGRlcml2ZWQgY2xhc3MuIEFsc28gZW5zdXJlcyB0aGUKICAgICAgICAgICAgbWV0aG9kIGlzIGVsaW1pbmF0ZWQgd2hlbiB1c2luZyB0aGUgLWZ2aXJ0dWFsIG9wdGlvbi4gRm9yIGV4YW1wbGUsIERlcml2ZWQubWV0aG9kIG5vdyBoYXMgdGhlIEMjCiAgICAgICAgICAgIG92ZXJyaWRlIGtleXdvcmQgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCogSW50ZWdlclB0cjsKCiAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCBJbnRlZ2VyUHRyIG1ldGhvZCgpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICBpbnQgKiBtZXRob2QoKSBjb25zdDsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgW0MjXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgYmVpbmcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciB2aXJ0dWFsIG1ldGhvZHMgd2hlbiBhIGJhc2UgY2xhc3MKICAgICAgICAgICAgaXMgaWdub3JlZCB3aXRoICVpZ25vcmUuCgowNS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gcmVtb3ZlICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiCiAgICAgICAgICAgIHdhcm5pbmdzIGluIEMgd3JhcHBlcnMgd2hlbiBjb21waWxpbmcgQyBjb2RlIHdpdGggJ2djYyAtV2FsbCAtZnN0cmljdC1hbGlhc2luZycuIFBhdGNoIGZyb20KICAgICAgICAgICAgTWljaGFlbCBDYWhpbGwuIFRoaXMgbW9kaWZpZXMgbWFueSBvZiB0aGUgY2FzdHMgc2xpZ2h0bHksIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSZqYXJnMTsKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopKHZvaWQgKikmamFyZzE7CgowNS8xMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIEMjIGF0dHJpYnV0ZXMuIEMjIGF0dHJpYnV0ZXMgY2FuIGJlIGdlbmVyYXRlZDoKICAgICAgICAgICAgMSkgT24gYSBDL0MrKyB0eXBlIGJhc2lzIGJ5IHNwZWNpZnlpbmcgYW4gaW5hdHRyaWJ1dGVzIGFuZC9vciBvdXRhdHRyaWJ1dGVzIHR5cGVtYXAgYXR0cmlidXRlCiAgICAgICAgICAgICAgIGluIHRoZSBpbXR5cGUgb3IgY3N0eXBlIHR5cGVtYXBzIChmb3IgQyMgcmV0dXJuIHR5cGUgb3IgQyMgcGFyYW1ldGVyIHR5cGUgYXR0cmlidXRlcykuCiAgICAgICAgICAgIDIpIE9uIGEgd3JhcHBlZCBtZXRob2Qgb3IgdmFyaWFibGUgYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyBmZWF0dXJlICglZmVhdHVyZSkuCiAgICAgICAgICAgIDMpIE9uIGEgd3JhcHBlZCBwcm94eSBjbGFzcyBvciBlbnVtIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgdHlwZW1hcC4KCiAgICAgICAgICAgIEV4YW1wbGVzIGFyZSBpbiB0aGUgQyMgZG9jdW1lbnRhdGlvbiAoQ1NoYXJwLmh0bWwpLgoKMDQvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gdG8gdHVybiBvZmYgdGhlIGRlZmF1bHQgbWF4aW11bSBjb21waWxlciB3YXJuaW5nIGFzCiAgICAgICAgICAgIHRoZXkgY291bGRuJ3QgYmUgcmVtb3ZlZCBldmVuIHdoZW4gb3ZlcnJpZGluZyBDRkxBR1MgYW5kIENYWEZMQUdTIHdpdGggY29uZmlndXJlCiAgICAgICAgICAgICguL2NvbmZpZ3VyZSBDRkxBR1M9IENYWEZMQUdTPSkuIFRvIHR1cm4gdGhlIG1heGltdW0gd2FybmluZ3Mgb2ZmLCBydW46ICAKCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRob3V0LW1heGltdW0tY29tcGlsZS13YXJuaW5ncwoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgd2hpY2ggcmV3b3JrcyB0aGUgSmF2YSBjb25zdHJ1Y3RvciBhbmQgZmluYWxpemUvZGVzdHJ1Y3RvciB0eXBlbWFwcywKICAgICAgICAgICAgZm9yIGRpcmVjdG9ycyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvdmVyYWxsIEphdmEgdHlwZW1hcHMuIEFkZGVkIHRoZSBkaXJlY3Rvcl90YWtlIGFuZCAKICAgICAgICAgICAgZGlyZWN0b3JfcmVsZWFzZSB0eXBlbWFwcyB0byBlbXVsYXRlIG90aGVyIG1vZHVsZXMnIF9fZGlzb3duX18gZnVuY3Rpb25hbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ZWQgcHJvYmxlbXMgZHVlIHRvIHRoZSBvdmVyIGVhZ2VyIGdhcmJhZ2UgY29sbGVjdG9yLiBPY2Nhc2lvbmFsbHkgdGhlCiAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdvdWxkIGNvbGxlY3QgYSBDIyBwcm94eSBjbGFzcyBpbnN0YW5jZSB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZAogICAgICAgICAgICBpbiB1bm1hbmFnZWQgY29kZSBpZiB0aGUgb2JqZWN0IHdhcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSB3cmFwcGVkIGZ1bmN0aW9uLgogICAgICAgICAgICBOZWVkbGVzcyB0byBzYXkgdGhpcyBjYXVzZWQgaGF2b2MgYXMgdGhlIEMjIHByb3h5IGNsYXNzIGNhbGxzIHRoZSBDKysgZGVzdHJ1Y3RvcgogICAgICAgICAgICB3aGVuIGl0IGlzIGNvbGxlY3RlZC4gUHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMgbm93IHVzZSBhIEhhbmRsZVJlZiwKICAgICAgICAgICAgd2hpY2ggaG9sZHMgYW4gSW50UHRyLCBpbnN0ZWFkIG9mIGEgcGxhaW4gSW50UHRyIHRvIG1hcnNoYWwgdGhlIEMrKyBwb2ludGVyIHRvIHVubWFuYWdlZAogICAgICAgICAgICBjb2RlLiBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnkgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYXMgYSByZXN1bHQgb2YgdGhpcwogICAgICAgICAgICBtb2RpZmljYXRpb24uCgogICAgICAgICAgICBUaGUgY2hhbmdlcyBhcmUgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHN3aWdDUHRyIGlzIG5vdyBvZiB0eXBlIEhhbmRsZVJlZgogICAgICAgICAgICBpbnN0ZWFkIG9mIEludFB0ciBhbmQgY29uc2VxdWVudGx5IHRoZSBnZXRDUHRyIG1ldGhvZCByZXR1cm4gdHlwZSBoYXMgYWxzbyBjaGFuZ2VkLiBUaGUgbmV0CiAgICAgICAgICAgIGVmZmVjdCBpcyB0aGF0IGFueSBjdXN0b20gd3JpdHRlbiB0eXBlbWFwcyBtaWdodCBoYXZlIHRvIGJlIG1vZGlmaWVkIHRvIHN1aXRlLiBBZmZlY3RlZCB1c2VycwogICAgICAgICAgICBzaG91bGQgbm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBuZXcgJ291dCcgYXR0cmlidXRlIGluIHRoZSBpbXR5cGUgdHlwZW1hcCBhcyB0aGUKICAgICAgICAgICAgaW5wdXQgdHlwZSBpcyBub3cgYSBIYW5kbGVSZWYgYW5kIHRoZSBvdXRwdXQgdHlwZSBpcyBzdGlsbCBhbiBJbnRQdHIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBhc3ltbWV0cmljIHR5cGUgbWFyc2hhbGxpbmcgYWRkZWQuIFNvbWV0aW1lcyB0aGUgb3V0cHV0IHR5cGUgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZGlmZmVyZW50IHRvIHRoZSBpbnB1dCB0eXBlLiBTdXBwb3J0IGZvciB0aGlzIGNvbWVzIGluIHRoZSBmb3JtIG9mIGEgbmV3IG9wdGlvbmFsICdvdXQnCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIGN0eXBlLCBpbXR5cGUgYW5kIGNzdHlwZSB0eXBlbWFwcy4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBub3QKICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBpcyB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXAsIGFzIGhhcyBhbHdheXMgcHJldmlvdXNseSBiZWVuIHRoZSBjYXNlLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgdGhlbiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBvdXRwdXQgdHlwZXMgYW5kIHRoZSB0eXBlIHNwZWNpZmllZAogICAgICAgICAgICBpbiB0aGUgdHlwZW1hcCBpdHNlbGYgaXMgdXNlZCBmb3IgdGhlIGlucHV0IHR5cGUuIEFuIG91dHB1dCB0eXBlIGlzIGEgcmV0dXJuIHZhbHVlIGZyb20KICAgICAgICAgICAgYSB3cmFwcGVkIG1ldGhvZCBvciB3cmFwcGVkIGNvbnN0YW50IGFuZCBhbiBpbnB1dCB0eXBlIGlzIGEgcGFyYW1ldGVyIGluIGEgd3JhcHBlZCBtZXRob2QuCgogICAgICAgICAgICBBbiBleGFtcGxlIHNob3dzIHRoYXQgY2hhciAqIGNvdWxkIGJlIG1hcnNoYWxsZWQgaW4gZGlmZmVyZW50IHdheXMsIAoKICAgICAgICAgICAgICAldHlwZW1hcChpbXR5cGUsIG91dD0iSW50UHRyIikgY2hhciAqICJzdHJpbmciCiAgICAgICAgICAgICAgY2hhciAqIGZ1bmN0aW9uKGNoYXIgKik7CgogICAgICAgICAgICBUaGUgb3V0cHV0IHR5cGUgaXMgdGh1cyBJbnRQdHIgYW5kIHRoZSBpbnB1dCB0eXBlIGlzIHN0cmluZy4gVGhlIHJlc3VsdGluZyBpbnRlcm1lZGlhcnkgQyMgY29kZSBpczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gSW50UHRyIGZ1bmN0aW9uKHN0cmluZyBqYXJnMSk7CgowNC8yMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggZ2VuZXJhdGlvbiBvZiAiZGVmaW5lLW1ldGhvZCIgZm9yIG1ldGhvZHMgb2YKCSAgICBjbGFzc2VzIHdpdGggYSBjb25zdHJ1Y3Rvci4gIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDQvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgRm9yIHdyYXBwZWQgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG11bHRpcGxlIHZhbHVlcyAodXNpbmcgYXJnb3V0KSwKCSAgICBTV0lHIENISUNLRU4gbm93IHJldHVybnMgdGhlbSBhcyBtdWx0aXBsZSB2YWx1ZXMgaW5zdGVhZCBvZiBhcwoJICAgIGEgbGlzdC4gIFRoZXkgY2FuIHRoZW4gYmUgYWNjZXNzZWQgdXNpbmcgKGNhbGwtd2l0aC12YWx1ZXMpLgoKMDQvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXQogICAgICAgICAgICArIEFkZGVkIGEgd2hvbGUgYnVuY2ggb2YgbmV3IF9ydW5tZSBzY3JpcHRzIGludG8gdGhlIGNoaWNrZW4gdGVzdAogICAgICAgICAgICBzdWl0ZS4gIEFsc28gZml4IHNvbWUgYnVncyB0aGVzZSBuZXcgc2NyaXB0cyB0dXJuZWQgdXAuCgogICAgICAgICAgICArIEFkZGVkIG9wdGltaXphdGlvbiB3aGVuIHJldHVybmluZyBhIHdyYXBwZWQgcHJveHkgY2xhc3MuICBCZWZvcmUsCiAgICAgICAgICAgIGEgbWlub3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBpbnZva2VkIGV2ZXJ5IHRpbWUgYSBmdW5jdGlvbiByZXR1cm5lZC4KCgkgICAgKyBBbGwgdGhlIGNoaWNrZW4gRXhhbXBsZXMgc2hvdWxkIG5vdyBydW4gY29ycmVjdGx5CgowNC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHR5cGVtYXAgbWF0Y2hpbmcgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGluIHBhcnRpY3VsYXIKICAgICAgICAgICAgc3RkOjpzdHJpbmcsIHNvIHRoYXQgc3RkOjpzdHJpbmcgdmFyaWFibGVzIGNhbiBiZSBlYXNpbHkgbWFyc2hhbGxlZCB3aXRoCiAgICAgICAgICAgIGEgQyMgc3RyaW5nIHByb3BlcnR5IHVzaW5nOgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3N0cmluZy5pIgogICAgICAgICAgICAgICVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKnZhcmlhYmxlX25hbWUgfTsKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lOwoKICAgICAgICAgICAgKFJlY2FsbCB0aGF0IGFsbCBjbGFzcyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcG9pbnRlcnMpCgowNC8wNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIEFkZGVkIEV4YW1wbGVzL2NoaWNrZW4vZWdnLCBhbiBleGFtcGxlIG9uIGhvdyB0byBidWlsZCBhIGNoaWNrZW4KCSAgICAgIGV4dGVuc2lvbiBsaWJyYXJ5IGluIHRoZSBmb3JtIG9mIGFuIGVnZy4gIEFsc28gdXBkYXRlZCB0aGUKCSAgICAgIGRvY3VtZW50YXRpb24gb24gdGhlIGRpZmZlcmVudCBsaW5raW5nIG9wdGlvbnMuCgoJICAgICsgY2hpY2tlbiB0ZXN0LXN1aXRlIG5vdyBoYXMgc3VwcG9ydCB0byBjaGVjayBTV0lHIHdpdGggdGhlIC1wcm94eQoJICAgICAgYXJndW1lbnQgaWYgdGhlcmUgZXhpc3RzIGEgX3Byb3h5X3J1bm1lLnNzIGZpbGUuCgoJICAgICsgTW9yZSBmaXhlcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMgYW5kIC1wcm94eQoKMDMvMzEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgVHVybmVkIG9uIGV4dHJhIHRlbXBsYXRlIGZlYXR1cmVzIGZvciBhbGwgbGFuZ3VhZ2VzIHdoaWNoIHdlcmUKICAgICAgICAgICAgcHJldmlvdXNseSBvbmx5IGF2YWlsYWJsZSB0byBQeXRob24uCgogICAgICAgICAgICBUaGlzIGVuYWJsZXMgdHlwZW1hcHMgZGVmaW5lZCB3aXRoaW4gYSB0ZW1wbGF0ZWQgY2xhc3MgdG8gYmUgdXNlZCBhcwogICAgICAgICAgICBleHBlY3RlZC4gUmVxdWlyZXMgJXRlbXBsYXRlIG9uIHRoZSB0ZW1wbGF0ZWQgY2xhc3MsICV0ZW1wbGF0ZSgpIHdpbGwKICAgICAgICAgICAgYWxzbyBwaWNrIHVwIHRoZSB0eXBlbWFwcy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb288VD4gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vX2kpIEZvbzxpbnQ+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIEZvbzxkb3VibGU+OwogICAgICAgICAgICAgIAogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIHRoZSBwcm9wZXIgJ2luJyB0eXBlbWFwcyB3aGVyZXZlciBGb288aW50PiBhbmQgRm9vPGRvdWJsZT4KICAgICAgICAgICAgYXJlIHVzZWQuCgowMy8zMC8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBQYXRjaCBmcm9tIEhhbnMgT2VzdGVyaG9sdCBmb3Igc3VwcG9ydGluZyBNelNjaGVtZSAzMHguCgowMy8yOS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIFJlYWxsb3cgb2xkZXIgdmVyc2lvbnMgb2YgY2hpY2tlbiAoMS40MCB0byAxLjg5KSBieSBwYXNzaW5nIC1ub2NvbGxlY3Rpb24KCSAgICAgIGFyZ3VtZW50IHRvIFNXSUcKCSAgICArICVpbXBvcnQgbm93IHdvcmtzIGNvcnJlY3RseSB3aXRoIHRpbnljbG9zLiAgKGRlY2xhcmUgKHVzZXMgLi4uKSkgd2lsbCBiZQoJICAgICAgZXhwb3J0ZWQgY29ycmVjdGx5LgoJICAgICsgVGlueUNMT1MgcHJveHkgY2xhc3NlcyBub3cgd29yayBjb3JyZWN0bHkgd2l0aCBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgICAgYW5kIGNvbnN0cnVjdG9ycy4KCjAzLzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JvdXQgdHlwZW1hcHMuIEphdmEgZGlyZWN0b3JzCiAgICAgICAgICAgIHJlcXVpcmUgdGhlIGRpcmVjdG9yb3V0IHR5cGVtYXBzIGxpa2UgdGhlIG90aGVyIGxhbmd1YWdlcyBub3cuIFRoZSBuZXcKICAgICAgICAgICAgdHlwZW1hcHMgcHJvdmlkZSBmaXhlcyBmb3IgbWV0aG9kcyB3aGVyZSB0aGUgcmV0dXJuIHR5cGUgaXMgcmV0dXJuZWQKICAgICAgICAgICAgYnkgcmVmZXJlbmNlICh0aGlzIGNhbm5vdCBhdXRvbWF0aWNhbGx5IGJlIG1hZGUgdGhyZWFkIHNhZmUgdGhvdWdoKS4KCjAzLzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEVudW0gY2FzdGluZyBmaXhlcy4gVmlzdWFsIEMrKyBkaWRuJ3QgbGlrZSB0aGUgQyB0eXBlIGNhc3RpbmcgU1dJRyBwcm9kdWNlZAogICAgICAgICAgICB3aGVuIHdyYXBwaW5nIEMrKyBlbnVtIHJlZmVyZW5jZXMsIGFzIHJlcG9ydGVkIGJ5IEFkbWlyZSBLYW5kYXdhc3Zpa2EuCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gU0YgIzExMjQ0OTAuIEZpeCBQZXJsIG1hY3JvIGNsYXNoZXMgd2hlbiB1c2luZyBWaXN1YWwgU3R1ZGlvJ3MgU1RMIHN0cmluZywKICAgICAgICAgICAgc28gbm93IHByb2plY3RzIGNhbiAjaW5jbHVkZSA8c3RyaW5nPi4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICV2YXJhcmdzIHdoaWNoIGdvdCBicm9rZW4gd2l0aCB0aGUgcmVjZW50IGRlZmF1bHQgYXJndW1lbnQgY2hhbmdlcy4KICAgICAgICAgICAgQWxzbyB3b3JrcyBmb3IgSmF2YSBhbmQgQyMgZm9yIHRoZSBmaXJzdCB0aW1lIG5vdy4KCjAzLzE3LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgKyBGaXggYSB3aG9sZSBidW5jaCBvZiBidWdzIGluIHRoZSBjaGlja2VuIG1vZHVsZS4gIFRoZSBlbnRpcmUKICAgICAgICAgICAgICB0ZXN0IHN1aXRlIG5vdyBjb21waWxlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSB0ZXN0cyB0aGF0IHJlcXVpcmUKCSAgICAgIHN0ZF92ZWN0b3IuaSwgc3RkX2RlcXVlLmksIGFuZCBzbyBvbiwgd2hpY2ggY2hpY2tlbiBkb2VzIG5vdCBoYXZlIHlldC4KCgkgICAgKyBBZGQgc3VwcG9ydCBmb3IgJWV4Y2VwdGlvbiBhbmQgJXR5cGVtYXAoZXhjZXB0aW9ucykuICBFeGNlcHRpb25zIGFyZQoJICAgICAgdGhyb3duIHdpdGggYSBjYWxsIHRvIChhYm9ydCkgYW5kIGNhbiBiZSBoYW5kbGVkIGJ5IChoYW5kbGUtZXhjZXB0aW9ucykKCjAzLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JzLiBNb2RpZmljYXRpb25zIHRvIHRoZSB0eXBlbWFwcwogICAgICAgICAgICBnaXZpbmcgdXNlcnMgZmluZSBjb250cm9sIG92ZXIgbWVtb3J5IG93bmVyc2hpcCBhbmQgbGlmZXRpbWUgb2YgZGlyZWN0b3IgY2xhc3Nlcy4KICAgICAgICAgICAgRGlyZWN0b3IgY2xhc3NlcyBubyBsb25nZXIgbGl2ZSBmb3JldmVyIGJ5IGRlZmF1bHQgYXMgdGhleSBhcmUgbm93IGNvbGxlY3RhYmxlCiAgICAgICAgICAgIGJ5IHRoZSBHQy4KCjAzLzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBBZGQgc3VwcG9ydCBmb3IgYWRkaW5nIGZpbmFsaXplcnMgZ2FyYmFnZSBjb2xsZWN0ZWQgb2JqZWN0cy4KCSAgICBGdW5jdGlvbnMgdGhhdCByZXR1cm4gbmV3IG9iamVjdHMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoICVuZXdvYmplY3QgYW5kCgkgICAgaW5wdXQgYXJndW1lbnRzIHdoaWNoIGNvbnN1bWUgKG9yIHRha2Ugb3duZXJzaGlwKSBvZiBhIHBvaW50ZXIgc2hvdWxkCgkgICAgYmUgbWFya2VkIHdpdGggdGhlIERJU09XTiB0eXBlbWFwLgoKCSAgICBBbHNvIGFkZCBzdXBwb3J0IGZvciBjb3JyZWN0bHkgY2hlY2tpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkCgkgICAgdG8gYSBmdW5jdGlvbiwgYW5kIHJhaXNpbmcgYW4gZXJyb3IgaWYgdGhlIHdyb25nIG51bWJlciBhcmUgcGFzc2VkLgoKMDMvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIEFkZCAtLXdpdGhvdXQtYWxsbGFuZyBvcHRpb24gdG8gY29uZmlndXJlLmluLCB3aGljaCBpcyB0aGUgc2FtZSBhcwogICAgICAgICAgICBwYXNzaW5nIGFsbCB0aGUgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcGVybDUgZXRjLi4uIHRoYXQgTWF0dGhpYXMgYWRkZWQuCgowMy8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBNZW1vcnkgbGVhayBmaXggZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgY2xhc3Nlcy9zdHJ1Y3RzIGJ5IHZhbHVlLgoKMDMvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBmb3IgUGVybCBpbmNvcnJlY3RseSB0YWtpbmcgbWVtb3J5IG93bmVyc2hpcCBmb3IgcmV0dXJuIHR5cGVzIHRoYXQKICAgICAgICAgICAgYXJlIHR5cGVkZWZzIHRvIGEgc3RydWN0L2NsYXNzIHBvaW50ZXIuIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBWYXJpb3VzIGV4Y2VwdGlvbiBjaGFuZ2VzIGZvciB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZXNlIG5vdyBtb3JlCiAgICAgICAgICAgIGFjY3VyYXRlbHkgbWlycm9yIHRoZSBzYW1lIGV4Y2VwdGlvbnMgdGhhdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0IHRocm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggdW5kZWZpbmVkIGJlaGF2aW91ciBhZnRlciBhbnkgb2YgdGhlIHN0ZDo6dmVjdG9yIG1ldGhvZHMKICAgICAgICAgICAgdGhyb3cgYW4gZXhjZXB0aW9uLgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBXaGVuIG51bGwgaXMgcGFzc2VkIGZvciBhIEMrKyByZWZlcmVuY2Ugb3IgdmFsdWUgcGFyYW1ldGVyLCB0aGUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24gaGFzIGJlZW4gY29ycmVjdGVkIHRvIGFuIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBpbnN0ZWFkCiAgICAgICAgICAgIG9mIE51bGxSZWZlcmVuY2VFeGNlcHRpb24gYXMgcmVjb21tZW5kZWQgaW4gdGhlIC5ORVQgRnJhbWV3b3JrIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgdHVybiBhIEMrKyBleGNlcHRpb24gaW50byBhbiBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKICAgICAgICAgICAgbm90IGEgU3lzdGVtRXhjZXB0aW9uIG5vdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTnVtZXJvdXMgY2hhbmdlcyBpbiBDIyBleGNlcHRpb24gaGFuZGxpbmcgaGF2ZSBiZWVuIG1hZGUgb3ZlciB0aGUgcGFzdAogICAgICAgICAgICBmZXcgd2Vla3MuIEEgc3VtbWFyeSBmb2xsb3dzOgoKICAgICAgICAgICAgVGhlIHdheSBpbiB3aGljaCBDKysgZXhjZXB0aW9ucyBhcmUgbWFwcGVkIHRvIEMjIGV4Y2VwdGlvbnMgaXMgcXVpdGUgZGlmZmVyZW50LgogICAgICAgICAgICBUaGUgY2hhbmdlIGlzIHRvIGZpeCBDIyBleGNlcHRpb25zIHNvIHRoYXQgdGhlIEMrKyBleGNlcHRpb24gc3RhY2sgaXMgY29ycmVjdGx5CiAgICAgICAgICAgIHVud291bmQgYXMgcHJldmlvdXNseSBDKysgZXhjZXB0aW9ucyB3ZXJlIGJlaW5nIHRocm93biBhY3Jvc3MgdGhlIEMgUEludm9rZSBsYXllcgogICAgICAgICAgICBpbnRvIHRoZSBtYW5hZ2VkIHdvcmxkLgoKICAgICAgICAgICAgTmV3IHR5cGVtYXAgYXR0cmlidXRlcyAoY2FudGhyb3cgYW5kIGV4Y29kZSkgaGF2ZSBiZWVuIGludHJvZHVjZWQgdG8gY29udHJvbCB0aGUKICAgICAgICAgICAgbWFwcGluZyBvZiBDKysgdG8gQyMgZXhjZXB0aW9ucy4gRXNzZW50aWFsbHkgYSBjYWxsYmFjayBpbnRvIHRoZSB1bm1hbmFnZWQgd29ybGQKICAgICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSBwZW5kaW5nIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbiB0byB0aHJvdyBpcyBzdG9yZWQgaW4gdGhyZWFkIGxvY2FsCiAgICAgICAgICAgIHN0b3JhZ2UgKHNvIHRoZSBhcHByb2FjaCBpcyB0aHJlYWQtc2FmZSkuIFRoZSB0eXBlbWFwcyBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuCiAgICAgICAgICAgIGZyb20gdW5tYW5hZ2VkIGNvZGUgYXMgc29vbiBhcyB0aGUgcGVuZGluZyBleGNlcHRpb24gaXMgc2V0LiBBbnkgcGVuZGluZyBleGNlcHRpb25zCiAgICAgICAgICAgIGFyZSBjaGVja2VkIGZvciBhbmQgdGhyb3duIG9uY2UgbWFuYWdlZCBjb2RlIHN0YXJ0cyBleGVjdXRpbmcuIFRoZXJlIHNob3VsZAogICAgICAgICAgICBiZSBtaW5pbWFsIGltcGFjdCBvbiBleGVjdXRpb24gc3BlZWQgZHVyaW5nIG5vcm1hbCBiZWhhdmlvdXIuIEZ1bGwgZGV0YWlscyB3aWxsIGJlCiAgICAgICAgICAgIGRvY3VtZW50ZWQgaW4gQ1NoYXJwLmh0bWwuCgogICAgICAgICAgICBUaGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbigpIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlCiAgICAgICAgICAgIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50KCkgYW5kIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbigpCiAgICAgICAgICAgIGZ1bmN0aW9ucy4gVGhlIG9yaWdpbmFsIG5hbWUgaGFzIGJlZW4gZGVsaWJlcmF0ZWx5IGNoYW5nZWQgdG8gYnJlYWsgb2xkIGNvZGUgYXMKICAgICAgICAgICAgdGhlIG9sZCBhcHByb2FjaCB3YXMgc29tZXdoYXQgZmxhd2VkLiBBbnkgdXNlciBkZWZpbmVkIGV4Y2VwdGlvbnMgdGhhdCBmb2xsb3cgdGhlCiAgICAgICAgICAgIHNhbWUgcGF0dGVybiBhcyB0aGUgb2xkIGFwcHJvYWNoIHNob3VsZCBhbHNvIGJlIGZpeGVkLgoKICAgICAgICAgICAgTnVtZXJvdXMgbmV3IC5ORVQgZnJhbWV3b3JrIGV4Y2VwdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUgZm9yIGVhc3kgdGhyb3dpbmcgZnJvbSAKICAgICAgICAgICAgdW5tYW5hZ2VkIGNvZGUuIFRoZSBjb21wbGV0ZSBsaXN0IGlzOiAKCiAgICAgICAgICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24sIEFyaXRobWV0aWNFeGNlcHRpb24sIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLCBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiwgT3V0T2ZNZW1vcnlFeGNlcHRpb24sIE92ZXJmbG93RXhjZXB0aW9uLCAKICAgICAgICAgICAgICBTeXN0ZW1FeGNlcHRpb24sIEFyZ3VtZW50RXhjZXB0aW9uLCBBcmd1bWVudE51bGxFeGNlcHRpb24gYW5kCiAgICAgICAgICAgICAgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzA1LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEZpeCBzZXZlcmFsIG1lbW9yeSBsZWFrcyBhcm91bmQuIEV2ZW4gd2hlbiB3ZSBzdXJ2aXZlICBrbm93bmluZwoJICAgIHN3aWcgaXMgYSBtZW1vcnkgbGVhayBmYWN0b3J5LCBpdCB3YXMgYSBsaXR0bGUgb3V0IG9mCgkgICAgY29udHJvbC4gVG8gcnVuIHN0ZF9jb250YWluZXJzLmkgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLAoJICAgIHN3aWcgd2FzIHVzaW5nIH4yNjBNQiwgbm93IGl0IHVzZXMgJ29ubHknIH40ME1CLCB3aGljaCBpcwoJICAgIHRoZSBzYW1lIGFtbW91bnQgdGhhdCBnKysgdXNlcywgc28sIGlzIG5vdCB0aGF0IGJhZC4KCSAgICBJbiB0aGUgcHJvY2VzcywgSSBmb3VuZCBhIGNvdXBsZSBvZiBleHRyYSBEZWxldGVzLCB3aGljaAoJICAgIGluIHNvbWUgY2FzZXMgY291bGQgdHJpZ2dlciBzZWcuIGZhdWx0cyBhbmQvb3IKCSAgICBET0gvYXNzZXJ0cy4KCSAgICAKCSAgICBbcHl0aG9uXSBCZXR0ZXIgc3VwcG9ydCBmb3IgZGlyZWN0b3JzICsgZXhjZXB0aW9uLiBNb3JlCgkgICAgdmVyYm9zZSBlcnJvcnMgYW5kIGFkZGVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsZXIuCgoJICAgIFtweXRob25dIEZpeCBtZW1vcnkgbGVhayBmb3IgdGhlCgoJICAgIAkgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+IAoKCSAgICBjYXNlLHJlcG9ydGVkIGJ5IEJvIFBlbmcuCgoJICAgIFtweXRob25dIEZpeCBTd2lnUHlPYmplY3QgY29tcGFyZSBwcm9ibGVtIHJlcG9ydGUgYnkKCSAgICBDYW1lcm9uIFBhdHJpY2suIAoKCSAgICBbcHl0aG9uXSBGaXggc2V2ZXJhbCB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgCgkgICAgZm9yIGdudS1nY2MsIEludGVsIGFuZCBWQzcuMSAgY29tcGlsZXJzLgoKCjAyLzI1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uIHRvIHVzZSBDU1MgYW5kIDxkaXY+IGluc3RlYWQgb2YgPGJsb2NrcXVvdGU+CgkgICAgSSB1c2VkIGEgc2NyaXB0IHRvIGNvbnZlcnQgdGhlIGRvY3MsIGFuZCBpdCBzZXQgYWxsIHRoZSBib3ggY2xhc3NlcwoJICAgIHRvIGJlICJjb2RlIi4gIFRoZXJlIGFyZSBhY3R1YWxseSA0IGRpZmZlcmVudCBjbGFzc2VzLAoJICAgICJzaGVsbCIsICJjb2RlIiwgInRhcmdldGxhbmciLCBhbmQgImRpYWdyYW0iLiAgV2UgbmVlZCB0byBnbyB0aHJvdWdoCgkgICAgYW5kIGNvbnZlcnQgdGhlIGRpdnMgZGVwZW5kaW5nIG9uIHdoYXQgdGhleSBjb250YWluLgoKMDIvMjMvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGVkIG9wdGlvbiAtbm9ydHRpIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBuYXRpdmUKCSAgICBDKysgUlRUSSB3aXRoIGRpcmVjdG9ycyAoZHluYW1pY19jYXN0PD4gaXMgbm90IHVzZWQpLgoKCSAgICBBZGQgbW9yZSBjb2RlIGZvciBkaXJlY3RvcnMgdG8gZGV0ZWN0IGFuZCByZXBvcnQgZXJyb3JzIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLgoKCSAgICBFeHRlbmQgdGhlIHVzZSBvZiBTV0lHSU5URVJOIHdoZW5ldmVyIGlzIHBvc3NpYmxlLgoKCSAgICBSZW1vdmUgdGVtcGxhdGUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgVkM3LjEuCgoJICAgIFJlbW92ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBnY2MvZysrLiBGaW5hbGx5IHlvdSBjYW4KCSAgICBjb21waWxlIHVzaW5nCgoJICAgICAgIGcrKyAtVyAtV2FsbCAtYyBteW1vZHVsZV93cmFwLmN4eAoKCSAgICBhbmQgbm8gc3B1cmlvdXMgZXJyb3JzIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyCgkgICAgY29kZS4KCjAyLzIzLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEFkZGVkIC1leHRlcm5hbC1ydW50aW1lIGFyZ3VtZW50LiAgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIGR1bXAKCSAgICBvdXQgYWxsIHRoZSBjb2RlIG5lZWRlZCBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSBydW50aW1lIHN5c3RlbSwKCSAgICBhbmQgaXQgcmVwbGFjZXMgaW5jbHVkaW5nIHRoZSBmaWxlcyBkaXJlY3RseS4gIFRoaXMgY2hhbmdlIGFkZHMKCSAgICB0d28gbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHRvIHRoZSBMYW5ndWFnZSBjbGFzcywgd2hpY2ggYXJlIHVzZWQKCSAgICB0byBmaW5kIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBydW50aW1lIGNvZGUuICBJIGFsc28gdXBkYXRlZAoJICAgIGFsbCBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHJ1bnRpbWUgdG8gaW1wbGVtZW50IHRoZXNlIHR3byBmdW5jdGlvbnMuCgowMi8yMi8yMDA1OiBtbWF0dXMgCgkgICAgRml4ICV0ZW1wbGF0ZSArIHByaXZhdGUgZXJyb3IgU0YjMTA5OTk3Ni4KCjAyLzIxLzIwMDU6IG1tYXR1cyAKCgkgICAgRml4IHN3aWdydW4uc3dnIHdhcm5pbmdzIHJlcG9ydGVkIHdoZW4gdXNpbmcgImdjYyAtVyAtV2FsbCIKCSAgICAoc3RhdGljL2lubGluZSBub3QgdXNlZCBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uCgkgICAgZGVjbGFyYXRpb24pLCBhbmQgYWRkIFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkCgkgICAgdW51c2VkIHdhcm5pbmdzIGVsc2V3aGVyZS4KCgkgICAgRml4IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncy4KCgkgICAgW1B5dGhvbl0gVXNlIG5ldyBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncyBpbgoJICAgIFNXSUdJTlRFUk4gbWV0aG9kcy4KCgkgICAgW1B5dGhvbl0gRml4IFB5T1Nfc25wcmludGYgZm9yIHB5dGhvbiB2ZXJzaW9ucyA8IDIuMiAoU0YgIzExMDQ5MTkpLgoKCSAgICBbUHl0aG9uXSBGaXggbWFwL211bHRpbWFwIHRvIGFsbG93IGVtcHR5IG1hcHMgKHJlcG9ydGVkIGJ5CiAgCSAgICBQaGlsaXBwZSBIZXRyb3kpLgoKCSAgICBbRG9jc10gQWRkIHNvbWUgZG9jdW1lbnRhdGlvbiB0byBQeXRob24uaHRtbCBhbmQKCSAgICBTV0lHUGx1cy5odG1sLCBpbmNsdWRpbmcgZm9yIGV4YW1wbGUgdGhlIGZhY3QgdGhhdAoJICAgICdmcmllbmRzJyBhcmUgbm93IHN1cHBvcnRlZC4KCjAyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQSFBdIFBhdGNoIGZyb20gT2xseSBCZXR0cywgc28gdGhhdCB3cmFwcGVycyBjb21waWxlIHdpdGggWmVuZCB0aHJlYWQgc2FmZXR5IGVuYWJsZWQuCgowMi8xNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNZW1vcnkgbGVhayBmaXggaW4gc29tZSBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIG1vZHVsZXMgd2hlbiB1c2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBpbiBjb25zdHJ1Y3RvcnMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2FzIG5vdCB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZQogICAgICAgICAgICBDKysgb2JqZWN0IG1lbW9yeSB3aGVuIGFueSBvZiB0aGUgY29uc3RydWN0b3JzIHRoYXQgdXNlIGRlZmF1bHQgYXJndW1lbnRzIHdhcyBjYWxsZWQuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTExNTA1NTogRmFpbGVkIG1ha2UgaW5zdGFsbC4gUGF0Y2ggZnJvbSBSb2IgU3RvbmUuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgIzExMjM0MTYgZnJvbSBQYXVsIE1vb3JlLiBDb3JyZWN0IG1lbW9yeSBhbGxvY2F0aW9uIGZvciBTVFJJTkdBUlJBWQogICAgICAgICAgICB0eXBlbWFwcyBpbiB2YXJpb3VzLmkuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXNhYmxlZCB0eXBlbWFwIHNlYXJjaCBjaGFuZ2VzIGZvciBub3cgKHNlZSBlbnRyeSAxOS8xMi8yMDA0KS4gSXQgYnJlYWtzCiAgICAgICAgICAgIG9sZCB0eXBlbWFwcywgbGVuZ3RoZW5zIHRoZSBleGVjdXRpb24gdGltZSBieSBhYm91dCAyNSUgYW5kIGludHJvZHVjZXMKICAgICAgICAgICAgaW5jb25zaXN0ZW5jaWVzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgc3dpZyAtaGVscCBmb2xsb3dzIG90aGVyIHNvZnR3YXJlIGJ5IHByaW50aW5nIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIHN3aWcgLXZlcnNpb24gYWxzbyBkaXNwbGF5cyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBCZWhhdmlvdXIgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBmb3IgdGhlIGxlc3MgY29tbW9ubHkgdXNlZCBvcmRlcmluZyBvZiAlaW5jbHVkZSBhbmQgI2luY2x1ZGUsIHNvCiAgICAgICAgICAgIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLiBCdWcgcmVwb3J0ZWQgYnkgcmVwb3J0ZWQgYnkgTWF4IEJvd3NoZXIuCiAgICAgICAgICAgICAgJWluY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJX0gCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFNXSUdfZXhjZXB0aW9uIG1hY3JvIHdpbGwgbm93IHJldHVybiBmcm9tIHVubWFuYWdlZCBjb2RlIC8gbmF0aXZlIGNvZGUKICAgICAgICAgICAgYXMgc29vbiBhcyBpdCBpcyBjYWxsZWQuIEZpeGVzIHBvc3NpYmxlIEpWTSBjcmFzaGVzIGFuZCBvdGhlciBjb2RlIHVuZXhwZWN0ZWRseQogICAgICAgICAgICBiZWluZyBleGVjdXRlZC4gTm90ZSBTV0lHX2V4Y2VwdGlvbiBpcyBvbmx5IG9jY2FzaW9uYWxseSB1c2VkIGJ5IFNXSUcgbGlicmFyeQogICAgICAgICAgICB3cml0ZXJzLCBhbmQgaXMgYmVzdCBhdm9pZGVkIGJ5IFNXSUcgdXNlcnMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFR5cGVtYXBzIGNhbiBub3cgYmUgdGFyZ2V0ZWQgYXQgZ2xvYmFsIHZhcmlhYmxlIG5hbWVzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIG5hbWVzLiBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgIHRoZSBzZXR0ZXJzIHdlcmUgaWdub3JlZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgZ2xvYmFsaW50ICIuLi4iCiAgICAgICAgICAgICAgaW50IGdsb2JhbGludDsKCjAyLzEzLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZCAldHlwZWNoZWNrIGZvciBTV0lHVFlQRSwgYWRkICV0eXBlY2hlY2sgZm9yIHB0cmRpZmZfdCwgZml4CgkgICAgdHlwZW1hcHMgZm9yIHNpemVfdC4KCgkgICAgW1Bpa2VdIE1lcmdlIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIGZvciBpbXByb3ZlZCBQaWtlIGNvbmZpZ3VyYXRpb24uCgowMi8xMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IGNvbmZpZ3VyZSBzd2l0Y2hlcyAtLXdpdGhvdXQtdGNsLCAtLXdpdGhvdXQtcHl0aG9uIGV0Yy4gYWxsb3cgdG8KICAgICAgICAgICAgZGlzYWJsZSB0aGUgc2VhcmNoIGZvciBpbnN0YWxsZWQgbGFuZ3VhZ2VzLgoKMDEvMzEvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gQWRkIERvaFNvcnRMaXN0IHRvIERPSAoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgcnVudGltZSB0eXBlIHN5c3RlbToKICAgICAgICAgICAgICAgKyBTcGVlZC4gVHlwZSBsb2FkaW5nIGlzIG5vdyBPKG4gbG9nIG4pIGluc3RlYWQgb2YgTyhOXjIpLCB3aGljaAoJICAgICAgICAgZm9yIGxhcmdlIG1vZHVsZXMgaXMgYSBodWdlIGltcHJvdmVtZW50LgogICAgICAgICAgICAgICArIEEgd2hvbGUgYnVuY2ggb2YgZnVuY3Rpb25zIGluIHN3aWdydW4uc3dnIG5vIGxvbmdlciBuZWVkIHRoZSAKICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfbGlzdF9oYW5kbGUgcGFzc2VkIHRvIHRoZW0uICBUaGUgb25seSBvbmUgbGVmdCBpcyAKCQkgVHlwZVF1ZXJ5LiAgVGhpcyBhbHNvIG1ha2VzIHJ1bnRpbWUuc3dnIGEgbG90IHNtYWxsZXIuCgkgICAgICAgKyBTcGxpdCB1cCBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUgaW50byB0d28gc3RydWN0dXJlcwoJICAgICAgICAgKHN3aWdfdHlwZV9pbmZvIGFuZCBzd2lnX2Nhc3RfaW5mbykKCSAgICAgICArIFN0b3JlIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvIHJhdGhlciB0aGFuIGp1c3QgdGhlIHR5cGUKCSAgICAgICAgIG5hbWUgc3RyaW5nIGluIHRoZSBsaW5rZWQgbGlzdCBvZiBjYXN0cy4gRmlyc3Qgb2ZmLCB0aGlzIG1ha2VzCgkgICAgICAgICB0aGUgZ3VpbGUgbW9kdWxlIGEgbGl0dGxlIGZhc3RlciwgYW5kIHNlY29uZCwgdGhlCgkgICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKCkgZnVuY3Rpb24gaXMgZmFzdGVyIHRvby4gCgkgICAgICAgKyBBZGQgdGhlIGlkZWEgb2YgYSBtb2R1bGUgaW50byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUsIGFsbCB0aGUKCSAgICAgICAgIHR5cGVzIHdlcmUgc3RvcmVkIGluIG9uZSBodWdlIGxpbmtlZCBsaXN0LiBOb3csIGFub3RoZXIgbGV2ZWwgaXMKCSAgICAgICAgIGFkZGVkLCBhbmQgdGhlIHR5cGUgc3lzdGVtIHN0b3JlcyBhIGxpbmtlZCBsaXN0IG9mIG1vZHVsZXMsIGVhY2gKCSAgICAgICAgIG9mIHdoaWNoIHN0b3JlcyBhbiBhcnJheSBvZiB0eXBlcyBhc3NvY2lhdGVkIHdpdGggaXQuCgkgICAgICAgKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvZiBob3cgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gbm93IHdvcmtzLAoJICAgICAgICAgcGxlYXNlIHNlZSBEb2MvTWFudWFsL3R5cGVtYXBzLmh0bWwgYW5kIERvYy9EZXZlbC9ydW50aW1lLnR4dAoJCSAKCSAgICAtIFVwZGF0ZSBhbGwgbGFuZ3VhZ2UgbW9kdWxlcyB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCgkgICAgICB0byBlYWNoIGxhbmd1YWdlIG1vZHVsZSBhcmUgbWlub3IuICBBbGwgbGFuZ3VhZ2VzIGFyZSBub3cgYWJsZSB0bwoJICAgICAgdXNlIHJ1bnRpbWUuc3dnIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlCgkgICAgICBvbmx5IHB5dGhvbiBhbmQgcGVybCBkaWQuCgoJICAgIC0gW2d1aWxlLCBtenNjaGVtZSwgb2NhbWwsIGFuZCBwaHA0XSAgVGhlc2UgbGFuZ3VhZ2VzIG9wZW5lZCB1cCB0aGUKCSAgICAgIGluaXQgZnVuY3Rpb24gaW5zaWRlIHRoZSAuY3h4IGNvZGUsIGFuZCBhbnkgY29kZSBpbiB0aGUgLnN3ZyBmaWxlcwoJICAgICAgaW4gdGhlIGluaXQgc2VjdGlvbiB3YXMgaW5zaWRlIHRoaXMgZnVuY3Rpb24uICBUaGlzIHdhcyBhIHByb2JsZW0KCSAgICAgIGZvciBzd2lnaW5pdC5zd2csIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgU1dJR19pbml0CgkgICAgICBmdW5jdGlvbiBpcyBvcGVuZWQuICBUaHVzIEkgY2hhbmdlZCB0aGVzZSBsYW5ndWFnZXMgdG8gYmUgbGlrZQoJICAgICAgcHl0aG9uIG9yIHBlcmwsIHdoZXJlIHRoZSBpbml0IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSAuc3dnCgkgICAgICBmaWxlLgoJICAgICAgCgkgICAgLSBbUnVieV0gSW5zdGVhZCBvZiBtb3ZpbmcgdGhlIGluaXQgZnVuY3Rpb24gdG8gdGhlIC5zd2cgZmlsZSwgSQoJICAgICAgYWRkZWQgYSBuZXcgc2VjdGlvbiBpbml0YmVmb3JlZnVuYywgYW5kIHRoZW4gYWRkZWQKCSAgICAgICVpbnNlcnQoaW5pdGJlZm9yZWZ1bmMpICJzd2lnaW5pdC5zd2ciCgoJICAgIC0gW016U2NoZW1lXSBGaXggZW51bXMgYW5kIGZpeCBFeGFtcGxlcy9NYWtlZmlsZS5pbiBzbyB0aGF0IGlmCgkgICAgICBtdWx0aXBsZSAtSSBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgSU5DTFVERVMgdmFyaWFibGUsIGVhY2gKCSAgICAgIGdldHMgYSArK2NjZi4KCgkgICAgLSBbR3VpbGUgR0hdIFVwZGF0ZSBHdWlsZSBHSCB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFNlZQoJICAgICAgRG9jL01hbnVhbC9HdWlsZS5odG1sIGZvciBob3cgc21vYnMgYXJlIG5vdyB1c2VkLgoKMDEvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2NzY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2phdmFjb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLiBBbm90aGVyIHR5cGVtYXAgbmFtZWQgJ2phdmFjb25zdHJ1Y3RfZGlyZWN0b3InCiAgICAgICAgICAgIGlzIHVzZWQgaW5zdGVhZCB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBhIGRpcmVjdG9yIGNsYXNzLgoKICAgICAgICAgICAgW0MjLCBKYXZhXSBJZiBhIEMrKyBjbGFzcyBkaWQgbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhIHByb3RlY3RlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHLiBUaGlzIHNlZW1zIGlzIHVubmVjZXNzYXJ5IGFuZCBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgIGFuZCB0aGVyZWJ5IGdpdmluZyB0aGUgdXNlciBhbG1vc3QgY29tcGxldGUgY29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgY29kZSBhbG9uZyB3aXRoIHRoZQogICAgICAgICAgICBuZXcgdHlwZW1hcHMgYWJvdmUuCgoxOS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW0Rpc2FibGVkLCBzZWUgZW50cnkgMDIvMTUvMjAwNF0KICAgICAgICAgICAgLSBGaXggdHlwZW1hcCBzZWFyY2gsIG5vdyB0aGUgIm91dCIgdHlwZW1hcCBzZWFyY2ggaXMgZG9uZSBhcyBmb2xsb3dzCgogICAgICAgICAgICAgICAgIGludCAqRm9vOjpmb28oaW50IGJhcikgICAtPiAgaW50ICpGb286OmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpGb286OmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKgoKICAgICAgICAgICAgICAgdGhlbiwgbm93IHlvdSBjYW4gYmUgbW9yZSBzcGVjaWZpYywgYW5kIGRlZmluZQoKICAgICAgICAgICAgICAvKiBhcHBseSBvbmx5IGZvciAgJ0Zvbzo6Zm9vJyBtZXRob2QgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIEZvbzo6Zm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAvKiBhcHBseSBmb3IgYWxsICdmb28nIGZ1bmN0aW9ucy9tZXRob2RzICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgKmZvbyhpbnQgKmJhcik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCSAgCgoxNS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgLSBNb3JlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgYW5kIHRlbXBsYXRlIGRlZmF1bHQgYXJncy4KICAgICAgICAgICAgICBTZWUgdGVtcGxhdGVfZGVmYXVsdC5pIGZvciBzY2FyeSBjYXNlcyB0aGF0IG5vdyBhcmUgCiAgICAgICAgICAgICAgc3VwcG9ydGVkLCBiZXNpZGVzIHRoZSBhbHJlYWR5IHVnbHkgU1RML3N0ZCBjYXNlcy4KICAgICAgICAgICAgICAKICAgICAgICAgICAgLSBDb3NtZXRpY3MgYW5kIG1vcmUgdXNlIG9mICdjb25zdCcgd2hlcmUgaXQgd2FzIGltcGxpY2l0LgogICAgICAgICAgICAtIE90aGVyIGZpeGVzIGZvciBPU1MsIHdoaWNoIGlzIG5vdyB3b3JraW5nIGFnYWluIHdpdGggMS4zLjI1LgoJClZlcnNpb24gMS4zLjI0IChEZWNlbWJlciAxNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTIvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBGaXggYSBidW5jaCBvZiBidWdzIHJlbGF0aW5nIHRvIC1wcm94eSBzdXBwb3J0CgkgICAgICArIG5vbi1jbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgbWVtYmVyIGNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBhZGRlZCBhIC1ub3VuaXQgYXJndW1lbnQsIHdoaWNoIGRvZXMgbm90IGV4cG9ydCB0aGUgKGRlY2xhcmUgKHVuaXQgLi4uKSkKCSAgICAgICsgY29ycmVjdGx5IGluc3RhbGwgc3dpZ2Nsb3NwcmVmaXguc2NtCgkgICAgICArIGNvbnN0YW50cyAoZW51bXMsIGRlZmluZXMpIG5vdyBjb3JyZWNseSBleHBvcnQgd2hlbiB1c2luZyAtcHJveHkKCjEyLzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbmZpZ3VyZSBmaXggZm9yIHdoZW4gbW9yZSB0aGFuIG9uZSB2ZXJzaW9uIG9mIGpuaV9tZC5oIGlzIGZvdW5kCiAgICAgICAgICAgIGluIHRoZSBKYXZhIGluY2x1ZGUgZGlyZWN0b3J5ICh3YXMgZ2VuZXJhdGluZyBsb3RzIG9mIHNlZCBlcnJvcgogICAgICAgICAgICBtZXNzYWdlcykuCgoxMi8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gYXJyYXlzX2phdmEuaSBzbyB0aGF0IG9uZSBjYW4gYXBwbHkgdGhlIGFycmF5CiAgICAgICAgICAgIHR5cGVtYXBzIHRvIGZ1bmN0aW9ucyB0YWtpbmcgcG9pbnRlcnMgYXMgaW5wdXQsIGVnCgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICAlYXBwbHkgaW50W10ge2ludCp9OwogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICphKTsKCjEyLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBtb2RzIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4gTmV3IHR5cGVtYXBzCiAgICAgICAgICAgIGRpcmVjdG9yZGlzY29ubmVjdCBhbmQgZGlyZWN0b3JkaXNjb25uZWN0X2Rlcml2ZWQgZm9yIHRoZSAKICAgICAgICAgICAgc3dpZ0RpcmVjdG9yRGlzY29ubmVjdCgpIG1ldGhvZC4gQWxzbyBmaXggdG8gZ2V0IHRoZSBqYXZhcGFja2FnZQogICAgICAgICAgICB0eXBlbWFwIHdvcmtpbmcgYWdhaW4uCgoxMi8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpbmlzaGluZyB0aGUgZml4ZXMgZm9yIHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgKyBzcGVjaWFsaXphdGlvbnMuCgogICAgICAgICAgICAtIFtQeXRob25dIE5vdyB3ZSB1c2UgdGhlIG5ldyB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzIGluIHRoZSBzdGQvU1RMIGxpYnJhcnkuIFRoYXQgbWVhbnMgdGhlIGludGVybmFsCgkgICAgICBzd2lnIGZpbGVzIGFyZSBnZXR0aW5nIHVnbGllciBzaW5jZSB3ZSBub3cgc3VwcG9ydCB0aGUKCSAgICAgIG9yaWdpbmFsIGRlY2xhcmF0aW9uczoKCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8IF9UcCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCS4uLi4KCQl9OwoJICAgICAgCSAgICAgCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXkgPiwKCSAgICAgICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcCA+ID4gPgogICAgICAgICAgICAgICAgY2xhc3MgbWFwIHsKCQkuLi4uCgkJfTsKIAogICAgICAgICAgICAgIGFuZCB0aGUgdXNlciBjYW4gdXNlIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFzCgoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIHN0ZDo6YWxsb2NhdG9yPGludD4gPjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBNeUFsbG9jYXRvcjxpbnQ+ID47CgogICAgICAgICAgICAgIE5vdyB3ZSBhcmUgY2xvc2VyIHRvIHRoZSBjbGVhbmluZy9yZXdyaXRpbmcgb2YgdGhlCgkgICAgICBweXRob24gc3RkL1NUTCBzdXBwb3J0LCBzdWNoIHRoYXQgd2UgcmVjb3ZlciBzdXBwb3J0IGZvcgoJICAgICAgTVNWQysrIDYuMCwgYW5kIHdlIGNhbiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICB0b28uCgoKMTIvMDIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB1c2luZyBhIG1lbWJlciBlbnVtCiAgICAgICAgICAgIGFuZCB0eXBlc2FmZS9wcm9wZXIgZW51bXMgZW5hYmxlZC4KCjEyLzAxLzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHR5cGVtYXBzIHRvIHdvcmsgd2l0aCB0ZW1wbGF0ZXMgYW5kIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MsIGllCgoJICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCID0gaW50PgogICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICB9OwoKCSAgICAgICAldHlwZW1hcChpbikgRm9vPGludD4gKnsuLi59CgkgICAgICAgJXR5cGVtYXAob3V0KSBGb288aW50LGludD4gKnsuLi59CgoJICAgICAgIEZvbzxpbnQ+ICogZm9vKCBGb288aW50PiAqZjEsIEZvbzxpbnQsaW50PiAqZjIpOwoKCSAgICAgIG5vdyAnZjEnLCAnZjInIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmUgdGhlIHByb3ZpZGVkCgkgICAgICB0eXBlbWFwcyBwcm9wZXJseS4KCgkgICAgICBUaGlzIGlzIGhpZ2hseSBuZWVkZWQgZm9yIHByb3BlciBTVEwgc3VwcG9ydCwgc2VlIG5ldyAKCSAgICAgIHN0ZF9iYXNpY19zdHJpbmcuaSwgc3RkX3NzdHJlYW0uaSwgZXRjLgoKCSAgICAtIEFkZGVkIHN0ZF9zc3RyZWFtLmksIGFuZCBmaXggc3RkX2Jhc2ljX3N0cmluZy5pIHRvIHVzZQoJICAgICAgdGhlIG5ldyB0eXBlbWFwcyArIHRlbXBsYXRlIGRlZi4gYXJnIG1lY2hhbmlzbS4gQWxzbywKCSAgICAgIGFkZGVkIHRoZSBuZWVkZWQgc3RkX2FsbG9jLmkuIE5vdywgYWxsIHRoZSBjb250YWluZXJzCgkgICAgICBjYW4gYmUgbW9kaWZpZWQgdG8gc3VwcG9ydCBzdGQ6OmFsbG9jYXRvciwgbGlrZSBpbjoKCSAgICAgIAoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBBID0gc3RkOjphbGxvY2F0b3I8VCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCXB1YmxpYzoKCQkuLi4uCgkJfTsKCSAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgb25seSBjb21wbGV0ZWQgYnkgbm93IGZvciBiYXNpY19zdHJpbmcuCgoJICAgIC0gRml4IGZvciBzbWFydCBwb2ludGVycyArIG1lbWJlcnMgKyBleHRlbnNpb25zOgoKCSAgICAgICVleHRlbmQgRm9vIHsKCSAgICAgICAgaW50IGV4dGVuc2lvbihpbnQgaSwgaW50IGopIHsgcmV0dXJuIGk7IH0KCQlpbnQgZXh0ZW5zaW9uKCkgeyByZXR1cm4gMTsgfQoJICAgICAgfQoKCSAgICAgICVpbmxpbmUgJXsKCgkgICAgICBjbGFzcyBGb28gewoJICAgICAgcHVibGljOgoJCWludCB5OwoJCXN0YXRpYyBjb25zdCBpbnQgejsKCSAgICAgIH07CiAgCgkgICAgICBjbGFzcyBCYXIgewoJICAgICAgICBGb28gKmY7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIEJhcihGb28gKmYpIDogZihmKSB7IH0KCQlGb28gKm9wZXJhdG9yLT4oKSB7CgkJICByZXR1cm4gZjsKCQl9CgkgICAgICB9OwoKCSAgICAgIG5vdyB5b3UgY2FuIAoJICAgICAKCSAgICAgIGYgPSBGb28oKQoJICAgICAgZi55ID0gMwoJICAgICAgYSA9IGYuegoJICAgICAgZi0+ZXh0ZW5zaW9uKCkKIAoJICAgICAgYiA9IEJhcihmKQoJICAgICAgYi55ID0gMwoJICAgICAgYSA9IGIuegoJICAgICAgYi0+ZXh0ZW5zaW9uKCkKCgkgICAgLSBPdGhlciBzbWFsbCBlcnJvcnMgZml4ZXMsIG1vc3RseSBweXRob24uCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgYnVnIGZpeGVzIHNvIHRoYXQgdGhlIGNvcnJlY3QgamF2YSB0eXBlcwogICAgICAgICAgICBhbmQgY2Fub25pY2FsaXplZCB0eXBlcyBpbiB0aGUgSk5JIGNvZGUgYXJlIGVtaXR0ZWQuIFVzZSBvZiB0aGUKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZXMgaW4gdGhlIGRpcmVjdG9yIHR5cGVtYXBzIG5vdwogICAgICAgICAgICBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1kaXJlY3RvciB0eXBlbWFwcy4gVGhlIHR5cGVzIHVzZWQgZm9yIAogICAgICAgICAgICB0eXBlbWFwIGxvb2t1cHMgYXJlIGFsc28gY29ycmVjdGVkIGluIGEgZmV3IHBsYWNlcy4gSWYgeW91IAogICAgICAgICAgICBwcmV2aW91c2x5IGhhZCB5b3VyIG93biBkaXJlY3RvciB0eXBlbWFwcywgZW5zdXJlIHRoZXkgYXJlIHVzaW5nIHRoZQogICAgICAgICAgICBjb3JyZWN0IEMrKyB0eXBlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uc3QgZW51bSBTV0lHVFlQRSAmIHR5cGVtYXBzIGFkZGVkLiBUaGVzZSB3cmFwIGNvbnN0IGVudW0gcmVmZXJlbmNlcwogICAgICAgICAgICBhcyBpZiB0aGV5IHdlcmUgcGFzc2VkIGJ5IHZhbHVlLiBDb25zdCBlbnVtIHJlZmVyZW5jZXMgdGh1cyB3b3JrIHRoZQogICAgICAgICAgICBzYW1lIGFzIGNvbnN0IHJlZmVyZW5jZSBwcmltaXRpdmUgdHlwZXMgc3VjaCBhcyBjb25zdCBkb3VibGUgJiwgCiAgICAgICAgICAgIGNvbnN0IGludCAmIGV0Yy4gVHlwZW1hcHMgYWRkZWQgZm9yIEphdmEsIEMjLCBSdWJ5LCBUY2wsIFBlcmwgYW5kIFBpa2UuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE5ldyBzcGVjaWFsIHZhcmlhYmxlOiAkKmphdmFjbGFzc25hbWUsIHNpbWlsYXIgdG8gJGphdmFjbGFzc25hbWUKICAgICAgICAgICAgYW5kICQmamF2YWNsYXNzbmFtZS4gVGhlIG5ldyBvbmUgcmVtb3ZlcyBhIHBvaW50ZXIgZnJvbSB0aGUgQyB0eXBlIGJlZm9yZQogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIEphdmEgY2xhc3MgbmFtZS4gT25lIG9yIG1vcmUgb2YgJGphdmFjbGFzc25hbWUsCiAgICAgICAgICAgICQmamF2YWNsYXNzbmFtZSBvciAkKmphdmFjbGFzc25hbWUgbWF5IG5vdyBhcHBlYXIgaW4gYSB0eXBlbWFwLiBMaWtld2lzZSBmb3IKICAgICAgICAgICAgQyMgdXNpbmcgY3NjbGFzc25hbWUgaW5zdGVhZCBvZiBqYXZhY2xhc3NuYW1lLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGxhc3QgdmVzdGlnZXMgb2YgZW51bXMgYmVpbmcgaGFuZGxlZCBhcyBpbnRlZ2VycyByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgICAgIGludGVybmFscy4gVGhlIHdyYXBwZXIgbWV0aG9kcyB1c2UgdGhlIGVudW0gdHlwZSByYXRoZXIgdGhhbiBhbiBpbnQKICAgICAgICAgICAgbm93LiBUaGUgbmV0IHJlc3VsdCBpcyBhZGRlZCB0eXBlIHNhZmV0eSBmb3IgZW51bXMgd2hlbiBoYW5kbGVkIGFzCiAgICAgICAgICAgIHBvaW50ZXJzLCByZWZlcmVuY2VzIGV0Yy4gUHJldmlvdXNseSBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgYSBtZXRob2QKICAgICAgICAgICAgdGFraW5nIGEgcG9pbnRlciB0byBhbiBlbnVtLCBhIHBvaW50ZXIgdG8gYW4gaW50IG9yIGEgcG9pbnRlciB0byBhbgogICAgICAgICAgICBlbnVtIG9mIHNvbWUgb3RoZXIgdHlwZSBjb3VsZCBpbmFkdmVydGFudGx5IGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kLgogICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgYW4gZW51bSBpcyBubyBsb25nZXIgYmFzZWQgb24KICAgICAgICAgICAgYW4gaW50LCBidXQgdGhlIGVudW0gdHlwZSBpbnN0ZWFkLiBBbm9ueW1vdXMgZW51bXMgYXJlIHN0aWxsIGhhbmRsZWQKICAgICAgICAgICAgYXMgaW50ZWdlcnMuCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgZm9yIHNjcmlwdGluZyBsYW5ndWFnZSB1c2VycyBpbiBjb3JyZWN0IHVzYWdlIG9mIGVudW1zCiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbm90aWNlYWJsZS4gVGhlcmUgaXMgbm8gY2hhbmdlIGZvciBhbnkgb2YgdGhlIGxhbmd1YWdlcwogICAgICAgICAgICB3aGVyZSBlbnVtcyBhcmUgcGFzc2VkIGJ5IHZhbHVlIC0gbW9zdCBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aWxsCiAgICAgICAgICAgIHN0aWxsIGFjY2VwdCBhbiBpbnRlZ2VyIGZvciBhbiBlbnVtIHZhbHVlIGFuZCB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgbGFuZ3VhZ2VzIHN0aWxsIHVzZSBlaXRoZXIgdHlwZXNhZmUgZW51bXMsIGludGVnZXJzIG9yIHByb3BlciBlbnVtcwogICAgICAgICAgICBkZXBlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBjb25maWd1cmVzLiBGb3IgSmF2YSBhbmQgQyMgdXNlcnMgYSBjaGFuZ2UKICAgICAgICAgICAgaW4gdGhlIHR5cGV3cmFwcGVyIGNsYXNzIG5hbWUgaGFzIG9jY3VycmVkIChmb3IgZW51bSBwb2ludGVycywKICAgICAgICAgICAgcmVmZXJlbmNlcyBldGMpLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgb25lPTEsIHR3byB9OwogICAgICAgICAgICAgIGVudW0gTnVtYmVycyogbnVtYmVyKCk7CgogICAgICAgICAgICBJbiBKYXZhIGFuZCBDIyB0aGlzIG11c3Qgbm93IGJlIGNvZGVkIGFzCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfTnVtYmVycyBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgIHJhdGhlciB0aGFuCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50IG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS8yMDA0OiB3c2Z1bHRvbi9tbWF0dXMKICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBkZXByZWNhdGVkIHdhcm5pbmcgZm9yICVuYW1lIGFuZCByZW1vdmUgcmVtYWluaW5nICVuYW1lCiAgICAgICAgICAgIHVzYWdlIGluIHRoZSBTV0lHIGxpYnJhcmllcy4KCjExLzIxLzA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZGluZyB0aGUgUHlTd2lnT2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNhcnJ5aW5nCgkgICAgICB0aGUgaW5zdGFuY2UgQy9DKysgcG9pbnRlcnMuIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mCgkgICAgICBzdHJpbmcgYW5kIFB5Q09iamVjdHMuCgoJICAgICAgVGhlIG5ldyBQeVN3aWdPYmplY3QgaXMgZXZlbiBzYWZlciB0aGFuIFB5Q09iamVjdCwgYW5kCgkgICAgICBtb3JlIGZyaWVuZGx5IHRoYW4gcGxhaW4gc3RyaW5nczoKCgkgICAgICBub3cgeW91IGNhbiBkbwoKCSAgICAgICAgcHJpbnQgYS50aGlzCgkJPFN3aWcgT2JqZWN0IGF0IF8wMDY5MTYwOF9wX0E+CgoJCXByaW50IHN0cihhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQQoKCQlwcmludCBsb25nKGEudGhpcykKCQkxMzU2ODY0MDAKCgkJcHJpbnQgIiVzIDB4JXgiICUgKGEudGhpcywgYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EgMHg4MTY2OTAwCgoJICAgICAgdGhlIGxhc3Qgb25lIGlzIHZlcnkgdXNlZnVsIHdoZW4gZGVidWdnaW5nIHRoZSBDL0MrKwoJICAgICAgc2lkZSwgc2luY2UgaXMgdGhlIHBvaW50ZXIgdmFsdWUgeW91IHdpbGwgdXN1YWxseSBnZXQKCSAgICAgIGZyb20gdGhlIGRlYnVnZ2VyLgoKCSAgICAgIEFsc28sIGlmIHlvdSBoYXZlIHNvbWUgb2xkIGNvZGUgdGhhdCB1c2VzIHRoZSBzdHJpbmcKCSAgICAgIHJlcHJlc2VudGF0aW9uICJfMDA2OTE2MDhfcF9BIiwgeW91IGNhbiB1c2UgaXQgbm93IGFnYWluCgkgICAgICB1c2luZyAnc3RyKHB0ciknLCBvciBieSBjYWxsaW5nICdzdHIgPSBQeU9iamVjdF9TdHIob2JqKScKCSAgICAgIGluIHRoZSBDL0MrKyBzaWRlLgogCgkgICAgICBUaGlzIGNoYW5nZSBpcyBtYWlubHkgZm9yIG5vc3RhbGdpYyBzd2lnIHVzZXJzIHRoYXQgbWlzcwoJICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYnV0IGFsc28gYWxsb3dzIHRvIHNheSBhZ2FpbgoKCSAgICAgICAgaWYgYS50aGlzID09IGIudGhpczoKCQkgIHJldHVybiAiYSBpcyBiIgoKCSAgICAgIGFuZCB3ZWxsLCBzaW5jZSB0aGUgY2hhbmdlIHdlcmUgcmVhbGx5IHNpbXBsZSwgbWF5YmUgaW4KCSAgICAgIHRoZSBmdXR1cmUgd2Ugd2lsbCBiZSBhYmxlIHRvIGRvCiAgIAoJCW5leHQgPSBhLnRoaXMgKyAxCgoJICAgICAgb3IgYWRkIG5hdGl2ZSBweXRob24gaXRlcmF0aW9uIG92ZXIgbmF0aXZlIEMvQysrIGFycmF5cywKCSAgICAgIGllLCBubyBuZWVkIHRvIGNyZWF0ZS9jb3B5IG5ldyB0dXBsZXMgd2hlbiByZXR1cm5pbmcgYW5kCgkgICAgICBhcnJheSBvciB2ZWN0b3IuCgoJICAgICAgQWxzbywgYSBQeVN3aWdQYWNrZWQgb2JqZWN0IHdhcyBhZGRpbmcgdG8gY2FycnkgYSBtZW1iZXIKCSAgICAgIG1ldGhvZCBwb2ludGVyLCBidXQgdGhpcyBpcyBwcm9iYWJseSBhIHRlbXBvcmFsIHNvbHV0aW9uCgkgICAgICB1bnRpbCBhIG1vcmUgZ2VuZXJhbCBvYmplY3QgZm9yIG1ldGhvZHMgaXMgYWRkZWQuCgoJICAgICAgQmUgYXdhcmUgdGhhdCB0byBzaW1wbGlmeSBtYWludGFpbmluZyBhbmQgY29tcGF0aWJpbGl0eQoJICAgICAgd2l0aCBvdGhlciB0b29scywgdGhlIG9sZCBzdHJpbmcgYW5kIFB5Q09iamVjdHMKCSAgICAgIHJlcHJlc2VudGF0aW9uIGNvdWxkIGRpc2FwcGVhciB2ZXJ5IHNvb24sIGFuZCB0aGUKCSAgICAgIFNXSUdfQ09CSkVDVFNfVFlQRVMgb3IgU1dJR19OT19PQkpFQ1RfVFlQRVMgbWFjcm9zIHdpbGwKCSAgICAgIGhhdmUgbm8gZWZmZWN0IGF0IGNvbXBpbGF0aW9uIHRpbWUuIFN0aWxsLCB0aGUgdGhyZWUKCSAgICAgIG1lY2hhbmlzbXMgYXJlIHByZXNlbnQgaW4gdGhlIGNvZGUganVzdCBmb3IgdGVzdGluZywKCSAgICAgIGRlYnVnZ2luZyBhbmQgY29tcGFyaXNvbiBwdXJwb3Nlcy4KCSAgICAgIAoxMS8yMS8wNDogbW1hdHVzCgoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIGJhY2sgc3VwcG9ydCBmb3IgdXNpbmcgdGhlIHN3aWcgcnVudGltZSBjb2RlCgkgICAgICBpbnNpZGUgdGhlIHVzZXIgY29kZS4gV2UganVzdCBhbGxvdyB0aGUgdXNlciB0byBpbmNsdWRlCgkgICAgICB0aGUgbWluaW1hbCBjb2RlIG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIHJ1bnRpbWUKCSAgICAgIG1lY2hhbmlzbSBzdGF0aWNhbGx5LCBqdXN0IGFzIGluIGRvbmUgaW4gdGhlIHN3aWcKCSAgICAgIG1vZHVsZXMuCgkgICAgICAKCSAgICAgIFRvIHVzZSB0aGUgc3dpZyBydW50aW1lIGNvZGUsIGZvciBleGFtcGxlIHdpdGggcHl0aG9uLAoJICAgICAgdGhlIHVzZXIgbmVlZHMgaW5jbHVkZSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxQeXRob24uaD4gICAgICAgICAvLyBvciB1c2luZyB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxzd2lncnVuLnN3Zz4KICAgICAgICAgICAgICAgI2luY2x1ZGUgPHB5dGhvbi9weXJ1bi5zd2c+IC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHJ1bnRpbWUuc3dnPgoKCSAgICAgIHRoZSBmaWxlcyBzd2lncnVuLnN3ZywgcHlydW4uc3dnIGFuZCBydW50aW1lLnN3ZyBjYW4gCgkgICAgICBiZSBjaGVja2VkIG91dCBieSB1c2luZyBzd2lnIC1jbywgb3IgdGhleSBjYW4gc2ltcGx5IAoJICAgICAgYmUgZm91bmQgYnkgYWRkaW5nIHRoZSBzd2lnIGxpYiBkaXJlY3RvcnkgdG8gdGhlCgkgICAgICBjb21waWxlciBpbmNsdWRlIGRpcmVjdG9yeSBsaXN0LCBmb3IgZXhhbXBsZQoKCSAgICAgICBTV0lHTElCPWBzd2lnIC1zd2lnbGliYAoJICAgICAgIGMrKyAtSSR7U1dJR0xJQn0gLi4KCgkgICAgICBvZiBiZXR0ZXIsIHVzaW5nIHRoZSBDUFBGTEFHUywgYnV0IHRoYXQgZGVwZW5kcyBvbiB5b3VyCgkgICAgICBlbnZpcm9ubWVudC4KCSAgICAgICAKCSAgICAgIFRoaXMgY2hhbmdlIGNhbiBiZSBwb3J0ZWQgdG8gdGhlIG90aGVyIGxhbmd1YWdlcyB0b28sCgkgICAgICB5b3UganVzdCBuZWVkIHRvIGlzb2xhdGUgdGhlIG5lZWRlZCBydW50aW1lIGNvZGUgaW4KCSAgICAgIGEgc2luZ2xlIGZpbGUgbGlrZSAncHlydW4uc3dnJywgYW5kIHByb3ZpZGUgdGhlIAoJICAgICAgU1dJR19SdW50aW1lX0dldFR5cGVMaXN0KCkgbWV0aG9kLiBMb29rIGF0IHRoZQoJICAgICAgTGliL3B5dGhvbi9weXJ1bi5zd2cgZmlsZSBhbmQgdGhlIEV4YW1wbGVzL3B5dGhvbi9zd2lncnVuCgkgICAgICBleGFtcGxlLgoKMTEvMTUvMDQ6IG1tYXR1cwoJICAgIC0gRml4IG1peGVkX3R5cGVzLmkgKyBnY2MtMy40LCBpZSwgYXJyYXlzICsgcmVmZXJlbmNlcyArCgkgICAgICB0eXBlZGVmcwoKCSAgICAtIEZpeCBtdWx0aWRpbSBhcnJheXMgKyB0eXBlZGVmcyxpZQoKCSAgICAgICB0eXBlZGVmIGNoYXIgY2hhcmFjdGVyWzFdOwoJICAgICAgIHR5cGVkZWYgY2hhcmFjdGVyIHdvcmRbNjRdOwoKCSAgICAtIFByb2Nlc3MgcHJvdGVjdGVkL3ByaXZhdGUgYmFzZXMgaW4gdGhlIHNhbWUgd2F5IGJlZm9yZQoJICAgICAgd2UgcHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBtZW1iZXJzLCBpZSwgd2UgY2hlY2sKCSAgICAgIGZvciBjb25zdHJ1Y3RvcnMsIG9wZXJhdG9yIG5ldywgdmlydHVhbCBtZW1iZXJzLCBldGMuCiAgIAoJICAgIC0gRml4IFJ1YnkvSmF2YSB0byB3b3JrIChvciBpZ25vcmUpIG11bHRpLWluaGVyaXRhbmNlICsKICAgICAgICAgICAgICBkaXJlY3RvcnMuIEFsbG93IG90aGVyIGxhbmd1YWdlcyB0byBkZWZpbmUgaWYgaXQgaXMKICAgICAgICAgICAgICBzdXBwb3J0ZWQgb3Igbm90LgoJICAgIAoJICAgIC0gTm93IHlvdSBjYW4gcnVuCgogICAgICAgICAgICAgICAgU1dJR19GRUFUVVJFUz0iLWRpcmVjdG9ycyAtZGlycHJvdCIgCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stb2NhbWwtdGVzdC1zdWl0ZQoKCSAgICAgIGFuZCB5b3Ugd2lsbCBnZXQgb25seSAncmVhbCcgZXJyb3JzLiBydWJ5IGFuZCBweXRob24KCSAgICAgIGNvbXBpbGUgd2l0aCBubyBlcnJvcnMsIGphdmEgc2hvd3Mgc29tZSBwcm9ibGVtcy4JCgpWZXJzaW9uIDEuMy4yMyAoTm92ZW1iZXIgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5ODI3NTMgZnJvbSBGYWJyaWNlIFNhbHZhaXJlOiBBZGRzIGRlcGVuZGVuY2llcyBnZW5lcmF0aW9uIGZvcgogICAgICAgICAgICBjb25zdHJ1Y3RpbmcgbWFrZWZpbGVzLiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgLU1GIC1NRCAtTU1EIHRvIHdvcmsKICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBvcHRpb25zIC1NIGFuZCAtTU0uIFRoZXNlIG9wdGlvbnMgYXJlIG5hbWVkIHRoZSBzYW1lCiAgICAgICAgICAgIGFuZCB3b3JrIHRoZSBzYW1lIGFzIGluIGdjYy4KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVpZ25vcmUvJXJlbmFtZSBjaGFuZ2VzIGZvciBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgdG8gbWlycm9yCiAgICAgICAgICAgICVmZWF0dXJlIGJlaGF2aW91ci4gU2VlIHByZXZpb3VzIGVudHJ5LgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciBmaW5lIHR1bmluZyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgd2l0aAogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cy4gQW55ICVmZWF0dXJlIHRhcmdldGluZyBhIG1ldGhvZCB3aXRoIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcyBpZiB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZS4gSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZQogICAgICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLCB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgbWF0Y2ggdGhhdCBleGFjdAogICAgICAgICAgICB3cmFwcGVyIG1ldGhvZCBvbmx5IGFuZCBub3QgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB3aWxsIGFwcGx5IHRoZSBmZWF0dXJlIHRvIGFsbCB0aHJlZSB3cmFwcGVyIG1ldGhvZHMsIHRoYXQgaXM6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgb25seSBhcHBseSB0byB0aGlzIHdyYXBwZXIgbWV0aG9kOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CgogICAgICAgICAgIGFuZCBub3QgdGhlc2Ugd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBtYWtlICVmZWF0dXJlIG1vcmUgcG93ZXJmdWwgdG8gZWFzZSB0aGUgbWlncmF0aW9uCiAgICAgICAgICAgdG8gbmV3IGRlZmF1bHQgYXJndW1lbnRzIHdyYXBwaW5nIGFwcHJvYWNoLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBJZiB5b3UgcHJldmlvdXNseSBoYWQgYSAlZmVhdHVyZSBhbmQgZGlkbid0IHNwZWNpZnkgdGhlIGRlZmF1bHQgYXJndW1lbnRzLAogICAgICAgICAgIHlvdSB3aWxsIGhhdmUgdG8gYWRkIHRoZW0gaW4gbm93IG9yIHlvdSBjYW4gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIKICAgICAgICAgICBieSB1c2luZyAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikuCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXBzIGZvciBzdGQ6OnZlY3RvciBhZGRlZCBpbnRvIHN0ZF92ZWN0b3IuaS4gVGhlIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGFyZSBtb2RlbGxlZCBvbiB0aGUgLk5FVCBBcnJheUxpc3QgY2xhc3MuIFRoaXMgaXNuJ3QgcXVpdGUKICAgICAgICAgICAgcmVhZHkgZm9yIGdlbmVyYWwgY29uc3VtcHRpb24geWV0LCBidXQgd2lsbCB3b3JrIHdpdGggdmVjdG9ycyBvZiBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgYW5kIHNvbWUgY2xhc3Nlcy4KCjEwLzMvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtHVUlMRV0gVGhlIC1zY20gaW50ZXJmYWNlIGlzIG5vdyB0aGUgZGVmYXVsdC4gIFRoZSBvbGQgR0ggaW50ZXJmYWNlIGNhbgoJICAgIHN0aWxsIGJlIGVuYWJsZWQgYnkgcGFzc2luZyAtZ2ggdG8gU1dJRy4KCjEwLzIvMjAwNDogbW1hdHVzCgoJICAgIC0gTW9yZSBmaXhlcyBmb3IgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLgoJICAgICAgQXMgYW4gZXh0cmEgYm9udXMsIHdlIGdldCAldGVtcGxhdGUgc3VwcG9ydCBmb3Igc3RhdGljL21lbWJlcnMgY2xhc3MKCSAgICAgIG1ldGhvZHMsIGllLCBub3cgeW91IGNhbiBzYXk6CgoJICAgICAgICBuYW1lc3BhY2Ugc3BhY2UgewogICAgICAgICAgICAgICAgIHN0cnVjdCBBCQkJICAgIAoJICAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkgICAgCgkgICAgICAgICAgIHN0YXRpYyB2b2lkIGZvb1QoWSB5KSB7IH0KCSAgICAgICAgIH07CQoJCX0JCQkgICAgCgkgICAgICAJICAgICAgCQkJICAgIAoJICAgICAgICBzdHJ1Y3QgQgkJCSAgICAKCSAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CQkgICAgCgkgICAgICAgICAgdm9pZCBiYXJUKFkgeSkge30gCgkgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGRvdWJsZT47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8aW50PjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxjaGFyPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGRvdWJsZT47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxpbnQ+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8Y2hhcj47CgoJICAgICAgYW5kIGNhbGwKCgkgICAgICAgIEEuZm9vKDEpCgkJYiA9IEIoKQoJCWIuYmFyKDEpCgkgICAgICAKCSAgICAgIG5vdGUgdGhlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgaW5zaWRlIHRoZSBjbGFzc2VzLAoJICAgICAgYW5kIGhlbmNlLCB0aGUgJXRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIHRoZSAnbWVtYmVyJwoJICAgICAgbWV0aG9kIG5hbWUsIG5vdCBhIGdsb2JhbCBuYW1lc3BhY2UgbmFtZS4KCjEwLzMxLzIwMDQ6IG1tYXR1cwoJICAgIC0gU29sdmUgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLCBhcyBpbgoKCSAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyOwoJCSBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBzdHJ1Y3QgZm9vOjpCYXIgOiBGb28gewogICAgICAgICAgICAgICB9OwoKCSAgICAgICBzZWUgbmFtZXNwYWNlX2NsYXNzLmkgZm9yIG1vcmUgZXhhbXBsZXMuCgogICAgICAgICAgICAtIEZpeCAldGVtcGxhdGUgZGlyZWN0aXZlIHRvIHByb3Blcmx5IHVzZSBuYW1lc3BhY2VzLAogICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgY2FzZToKCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsKCQkgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CgkJICAgICAgIHN0cnVjdCBQdHIge307CiAgICAgICAgICAgICAgICAgICB9CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CQkgIAoJCSAgICAgICBzdHJ1Y3QgT2JqMSB7fTsKCQkgICAgICAgdHlwZWRlZiBQdHI8T2JqMT4gT2JqMV9wdHI7CiAgCQkgICAgICAgJXRlbXBsYXRlKE9iajFfcHRyKSBQdHI8T2JqMT47IAoJCSAgIH0JCQkJICAKCQkgICAJCQkJICAKCQkgICBuYW1lc3BhY2UgdHdvICAKCQkgICB7CgkJICAgICAgIHN0cnVjdCBPYmoyIHt9OwkKCQkgICAgICAgdHlwZWRlZiBvbmU6OlB0cjxPYmoyPiBPYmoyX3B0cjsKCQkgICAgICAgJXRlbXBsYXRlKE9iajJfcHRyKSBvbmU6OlB0cjxPYmoyPjsKCQkgICB9CgoJICAgICAgdGhpcyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBuYW1lc3BhY2UgbmFtZSAnb25lJyB0byBjcmVhdGUKICAgICAgICAgICAgICBhIG5hbWVzcGFjZSBub2RlIHRvIGVtaXQgdGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24sCiAgICAgICAgICAgICAganVzdCBhcyBiZWZvcmUsIGJ1dCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcmVzb2x2ZWQKICAgICAgICAgICAgICBhbmQgcXVhbGlmaWVkIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZSAoJ29uZScgb3IgJ3R3bycpLgogICAgICAgICAgICAgIFRoaXMgaXMgc2FtZSB3YXkgdGhhdCB0eXBlZGVmIHdvcmtzLiAKCgkgICAgICBUaGlzIHJlc29sdmUgdGhlIHNtYXJ0X3BvaW50ZXJfbmFtZXNwYWNlMi5pIGNhc2UsIGFuZCBhdAogICAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUsIHNldmVyYWwgb3RoZXIgb25lcyB3aGVyZSBiZWZvcmUgc3dpZyB3YXMKICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZQoKCSAgICAgICAgIkNhbid0IGluc3RhbnRpYXRlIHRlbXBsYXRlICd4eCcgaW5zaWRlIG5hbWVzcGFjZSAneXknIgoJICAgICAgCgkgICAgICBlcnJvciBtZXNzYWdlLiBJbiBmYWN0LCB0aGF0IGVycm9yIGRvZXNuJ3QgZXhpc3QKCSAgICAgIGFueW1vcmUuIFlvdSBjYW4gb25seSBnZXQgYW4gZXJyb3IgaWYgeW91IHVzZSBhIGJhZAoJICAgICAgbmFtZXNwYWNlIG5hbWUgb3Igc28uCgoxMC8zMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtydWJ5XSBEaXJlY3RvcnMgZml4ZXM6CgkgICAgICAtIGVudW1zIGFuZCBzdGQ6OnN0cmluZ3MgYXJlIHdvcmtpbmcgbm93IChzZXZlcmFsCgkgICAgICAgIHJlcG9ydHMgaW4gYnVnIHRyYWNrIHN5c3RlbSkKCSAgICAgIC0gYWRkZWQgcGF0Y2ggMTAyNTg2MSBmb3IgZGlyZWN0b3IgKyBleGNlcHRpb25zCgkJCiAgICAgICAgICAgICAgKioqIEF0dGVudGlvbiAqKio6IHJ1Ynkgd2l0aCBkaXJlY3RvcnMgKyBwcm90ZWN0ZWQKICAgICAgICAgICAgICBtZW1iZXJzIHdvcmsgd2l0aCB2ZXJzaW9uIDEuNysuIE9sZGVyIHZlcnNpb25zIHNlZW1zIHRvCiAgICAgICAgICAgICAgaGF2ZSBhIGJyb2tlbiBzaWduYXR1cmUgZm9yJ3JiX3Byb3RlY3QnLgoJCQoJICAgICAgSWYgeW91IG5lZWQgdG8gdXNlIGFuIG9sZCB2ZXJzaW9uLCBsb29rIGF0CgoJICAgICAgaHR0cDovL2V4Y3J1Ynkuc291cmNlZm9yZ2UubmV0L2RvY3MvaHRtbC9ydWJ5X19oYWNrc184aHBwLXNvdXJjZS5odG1sCiAgCSAgICAgIGZvciB3b3JrYXJvdW5kcy4KCSAgICAgIAogICAgICAgICAgICAtIFtydWJ5XSBGaXggbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbSBpbiB0eXBlbWFwIChidWcgMTAzNzI1OSkKCgkgICAgLSBbdGNsXSBGaXggKGVudW1zfGNvbnN0YW50cykgKyBuYW1lc3BhY2Ugb3B0aW9uIAoJICAgICAgICAgICAgKHJlcG9ydGVkIGJ5IGphc29uLm0uc3VycHJpc2VAaW50ZWwuY29tKS4KCiAgICAgICAgICAgIC0gW3BlcmxdIEFkZCBwYXRjaCA5NjIxNjggZm9yIG11bHRpcGxlIGluaGVyZXRhbmNlCgkgICAgCgkgICAgLSBGaXggJ2RlZmluZWQnIGFzIHZhcmlhYmxlIG5hbWUuCgoxMC8yOS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBnbG9iYWwgc2NvcGUgb3BlcmF0b3IgdXNlZCBmb3IgZnJpZW5kIG1ldGhvZHM6CgogICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgZnJpZW5kIHZvaWQgOjpnbG9iYWxzY29wZSgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjEwLzI4LzIwMDQ6bW1hdHVzCgkgICAgLSBBZGRlZCBtb2R1bGUgYW5kIHN3aWcgb3B0aW9uICJ0ZW1wbGF0ZXJlZHVjZSIgdG8gZm9yY2Ugc3dpZwoJICAgICAgdG8gcmVkdWNlIGFueSB0eXBlIG5lZWRlZCB3aXRoIHRlbXBsYXRlcywgaWUsIGluIHRoZXNlIGNhc2VzCgogICAgICAgICAgICAgICAgJW1vZHVsZSgidGVtcGxhdGVyZWR1Y2UiKSB0ZXN0CgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBBIHsgfTsKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnQ7CgkgICAgICAgICV0ZW1wbGF0ZShBX0ludCkgQTxJbnQ+ICA9PT4gICV0ZW1wbGF0ZShBX0ludCkgQTxpbnQ+CgogICAgICAgICAgICAgICAgdHlwZWRlZiBCKiBCcDsKCSAgICAgICAgJXRlbXBsYXRlKEFfQnApIEE8QnA+ICA9PT4gICV0ZW1wbGF0ZShBX0JwKSBBPEIqPgoKICAgICAgICAgICAgICBzd2lnIHJlZHVjZXMgdGhlIHR5cGVzIEludCBhbmQgQnAgdG8gdGhlaXIgcHJpbWl0aXZlcwogICAgICAgICAgICAgIGludCBhbmQgQiouIFRoaXMgaXMgY2xvc2VyIHRvIHRoZSB1c3VhbCBjb21waWxlcgogICAgICAgICAgICAgIHJlc29sdXRpb24gbWVjaGFuaXNtLCBhbmQgaXQgaXMgcmVhbGx5IG5lZWRlZCBzb21ldGltZXMKICAgICAgICAgICAgICB3aGVuIHlvdSBtaXggdGVtcGxhdGVzICsgdHlwZWRlZnMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgICAgRG9uJ3QgdXNlIGl0IGlmIHlvdSBkb24ndCBoYXZlIGFueSBwcm9ibGVtIGFscmVhZHksCgkgICAgICBzaW5jZSB0aGUgdHlwZSByZWR1Y3Rpb24gY2FuIGludGVyZmVyZSB3aXRoIHNvbWUKCSAgICAgIHVzZXIgdHlwZW1hcHMsIHNwZWNpYWxseSBpZiB5b3UgZGVmaW5lZCBzb21ldGhpbmcgbGlrZQoKCQkgICB0eXBlZGVmIGludCBJbnQ7CgkJICAgJXR5cGVtYXAoaW4pIEludCAuLi47CgogICAgICAgICAgICAgIGluIHRoaXMgY2FzZSwgd2hlbiB5b3UgdXNlIHRoZSAidGVtcGxhdGVyZWR1Y2UiIG9wdGlvbiwKCSAgICAgIHN3aWcgd2lsbCBpZ25vcmUgdGhlIHVzZXIgdHlwZW1hcCwgc2luY2UgdGhlICJ0eXBlZGVmIGludCBJbnQiCgkgICAgICB3aWxsIHRha2UgcHJlY2VkZW5jZSwgYW5kIHRoZSB1c3VhbCAiaW50IiB0eXBlbWFwIHdpbGwgYmUKCSAgICAgIGFwcGxpZWQuIAoKCSAgICAgIE5vdGUgdGhhdCB0aGUgcHJldmlvdXMgY2FzZSBpcyBub3QgY29tbW9uLCBhbmQgc2hvdWxkIGJlCgkgICAgICBhdm9pZGVkLCBpZSwgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSBhIHR5cGVkZWYgYW5kIGEKCSAgICAgIHR5cGVtYXAgYXQgdGhlIHNhbWUgdGltZSwgc3BlY2lhbGx5IGlmIHlvdSBhcmUgZ29pbmcgdG8KCSAgICAgIHVzZSB0ZW1wbGF0ZXMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgIC0gRGlyZWN0b3JzOgoKCSAgICAgICAgdmlydHVhbCBkZXN0cnVjdG9yIGlzIGFsd2F5cyBlbWl0dGVkIG5vdywgdGhpcyBkb2Vzbid0CgkgICAgICAgIGNhdXNlIGFueSBoYXJtLCBhbmQgY291bGQgc29sdmUgc29tZSBuYXN0eSBhbmQKCSAgICAgICAgbXlzdGVyaW91cyBlcnJvcnMsIGxpa2UgdGhlIG9uZSBtZW50aW9uZWQgYnkgU2NvdHQuCgoJCWFsc28gdGhlIGRlc3RydWN0b3IgaXMgbm90IGluLWxpbmVkLCBzbywgdGhhdCBjYW4gc29sdmUKCQlzb21lIG90aGVyIG15c3RlcmlvdXMgZXJyb3JzIHdoZW4gbWl4aW5nIGRpcmVjdG9ycyArCgkJaW1wb3J0cyArIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyArIHNvbWUgc3BlY2lmaWMgY29tcGlsZXJzLgoJCQoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIHR5cGVtYXBzLmkgbGlicmFyeSBmaWxlIHdpdGggSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgYWRkZWQuCgoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXAgZml4ZXMgaW4gc3RkX3N0cmluZy5pIGZyb20gUnVzc2VsbCBLZWl0aC1NYWdlZS4KCjEwLzI1LzIwMDQ6IG1tYXR1cyAKCgkgICAgLSBVc2luZyArIG5hbWVzcGFjZSBpcyB3b3JraW5nIG5vdyAodXNpbmdfbmFtZXNwYWNlLmkpLgoKCSAgICAtIERlcml2ZWQgKyBuZXN0ZWQgY2xhc3NlcyBpcyB3b3JraW5nIG5vdwoJICAgICAgKGRlcml2ZXJfbmVzdGVkLmkpLCBidXQgb2YgY291cnNlLCB3ZSBhcmUgc3RpbGwgd2FpdGluZwoJICAgICAgZm9yIHRoZSBuZXN0ZWQgY2xhc3Mgc3VwcG9ydC4KCSAgICAKCSAgICAtIERpcmVjdG9yczoKCSAgICAgIC0gdW5uYW1lZCBwYXJhbWV0ZXJzIHN1cHBvcnQsCgoJICAgICAgLSBwcm90ZWN0ZWQgY29uc3RydWN0b3Igc3VwcG9ydCAoYXV0b21hdGljIGFuZCB3aXRoCiAgICAgICAgICAgICAgICBkaXJwcm90IG1vZGUpLAoKCSAgICAgIC0gZGV0ZWN0aW9uIG9mIHJlYWxseSBuZWVkZWQgcHJvdGVjdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgKG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycykgbm93IGlzIGRvbmUgYXV0b21hdGljYWxseS4KICAgICAgICAgICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHVzZSB0aGUgJ2RpcnByb3QnIG1vZGUsIHN3aWcgd2lsbAogICAgICAgICAgICAgICAgd3JhcCB3aGF0IGlzIG1pbmltYWxseSBuZWVkZWQgKGFuZCBwcm90ZWN0ZWQpIGZvciB0aGUKICAgICAgICAgICAgICAgIGNvZGUgdG8gY29tcGlsZS4KCQkKCQl3aGF0IGlzIHB1YmxpYywgYXMgdXN1YWwsIGlzIGFsd2F5cyB3cmFwcGVkLCBhbmQgaWYKCQl5b3UgdXNlIHRoZSAnZGlycG9ydCcKCQkKCgkgICAgLSBGaW5hbCBmaXhlcyBmb3IgdGhlIE9TUyB0byBjb21waWxlIHdpdGggU1dJRyAxLjMuMjMgKG15CgkgICAgICB2ZXJ5IHZlcnkgdWdseSBDKysgKyB0ZW1wbGF0ZXMgKyBldmVyeXRoaW5nIG1vdW50ZXJzIHdyYXApLgoKMTAvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1kbGxpbXBvcnQuIFRoaXMgZW5hYmxlcyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgRExMIGZvciB0aGUgRGxsSW1wb3J0IGF0dHJpYnV0ZS4gTm9ybWFsbHkgdGhpcyBuYW1lCiAgICAgICAgICAgIGNvbWVzIGZyb20gdGhlIG1vZHVsZSBuYW1lLCBzbyBub3cgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhpczoKCiAgICAgICAgICAgICAgc3dpZyAtY3NoYXJwIC1kbGxpbXBvcnQgeHl6IGV4YW1wbGUuaQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBmb3IgYWxsIHRoZSB3cmFwcGVkIFBJbnZva2UgbWV0aG9kczoKCiAgICAgICAgICAgICAgW0RsbEltcG9ydCgieHl6IiwgRW50cnlQb2ludD0iLi4uIildCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gLi4uCgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZnJvbSBtYW55IGRpZmZlcmVudCBTV0lHIGludm9jYXRpb25zIGNhbiB0aHVzIGJlIGNvbXBpbGVkCiAgICAgICAgICAgIGludG8gb25lIERMTC4KCiAgICAgICAgICAgIEEgbmV3IHNwZWNpYWwgdmFyaWFibGUgJGRsbGltcG9ydCBjYW4gYWxzbyBiZSB1c2VkIGluIHR5cGVtYXBzLCBwcmFnbWFzLAogICAgICAgICAgICBmZWF0dXJlcyBldGMuIFRoaXMgd2lsbCBnZXQgdHJhbnNsYXRlZCBpbnRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgLWRsbGltcG9ydAogICAgICAgICAgICBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZSB0aGUgbW9kdWxlIG5hbWUuCgoxMC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzEwNDk0OTYgZnJvbSBTY290dCBNaWNoZWwgZml4ZXMgZGlyZWN0b3JzIG1ldGhvZHMgd2l0aCAKICAgICAgICAgICAgZW51bXMgd2hlbiB3cmFwcGVkIHdpdGggdHlwZXNhZmUgb3IgcHJvcGVyIEphdmEgZW51bXMuCgoxMC8yMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgaW4gZGlyZWN0b3IgY29uc3RydWN0b3JzIChQeXRob24sIFJ1YnksIE9jYW1sKS4KCjEwLzIxLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLWNwbHVzY2FzdCcgb3B0aW9uIHRvIGVuYWJsZSB0aGUgJ25ldycKCSAgICAgIEMrKyBjYXN0aW5nIG9wZXJhdG9ycywgc3VjaCBhcyAnc3RhdGljX2Nhc3QnLCBpbnNpZGUgdGhlCgkgICAgICB0eXBlbWFwcy4gQnkgZGVmYXVsdCBzd2lnIHVzZSB0aGUgb2xkIEMgY2FzdCBzdHlsZSwgZXZlbgoJICAgICAgd2hlbiBwYXJzaW5nIEMrKy4KCSAgICAgIAoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5ld192d20nIG9wdGlvbiB0byBlbmFibGUgdGhlIG5ldwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIgbW9kZS4gTm93IHRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgdGhhdCB0aGUgdHlwZW1hcHMgYXJlIHJlYWxseSBzYWZlIGZvciBhbnkgZnV0dXJlCiAgICAgICAgICAgICAgc29sdXRpb24sIGJ1dCB5b3UgY2FuIHVzZSBpdCBpZiB5b3UgaGF2ZSBhIHZlcnkgc3RyYW5nZQogICAgICAgICAgICAgIGVycm9yIHdpdGggZGVmYXVsdCBjb3NudHJ1Y3RvcnMgbWlzc2luZyArICVhcHBseSArCiAgICAgICAgICAgICAgJXR5cGVtYXAsIGFuZCBpZiBldmVyeXRoaW5nIGVsc2UgZmFpbHMgKHNlZQogICAgICAgICAgICAgIHZhbHV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbHRlcm5hdGl2ZSBhbmQgY3VycmVudAogICAgICAgICAgICAgIHNvbHV0aW9ucykuIElmIHlvdSBhcmUgYSB1c2VyIHRoYXQgZG9uJ3Qga25vdyB3aGF0IGlzCiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgZG9uJ3QgZXZlbiB0cnkgaXQuCgoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5vaCcgb3B0aW9uIHRvIGJlIHVzZWQgd2l0aCBkaXJlY3RvcnMKCSAgICAgIGFuZCB3aGVuIHlvdSBwcmVmZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKCSAgICAgIGRpcmVjdG9yIGhlYWRlciBmaWxlLiBJZiBub3QgdXNlZCwgc3dpZyB3aWxsIHdvcmsgYXMKCSAgICAgIHVzdWFsIGdlbmVyYXRpbmcgYm90aCB0aGUgd3JhcC5jeHggYW5kIHdyYXAuaCBmaWxlcy4gSWYKCSAgICAgIHlvdSB1c2UgaXQsIHN3aWcgd2lsbCBvbmx5IGdlbmVyYXRlIHdyYXAuY3h4LgoKMTAvMjEvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gSWYgeW91IGRlZmluZSBTV0lHX1RZUEVfVEFCTEUgd2hlbiBjb21waWxpbmcgYSB3cmFwcGVyIGZpbGUsCgkgICAgICB0aGUgcnVudGltZSB0eXBlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gdHlwZSB0YWJsZSBuYW1lLgoJICAgICAgVXNpbmcgdGhpcywgeW91IGNhbiBzZXBlcmF0ZSBkaWZmZXJlbnQgbW9kdWxlcyB0byBzaGFyZSB0aGVpcgoJICAgICAgb3duIHR5cGUgc3lzdGVtcy4gIC1EU1dJR19UWVBFX1RBQkxFPU15dGFibGUKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfU1RBVElDX1JVTlRJTUUgdGhlbiB0aGUgdHlwZSBpbmZvcm1hdGlvbgoJICAgICAgd2lsbCBiZSBzdGF0aWMgdG8gdGhpcyB3cmFwcGVyLiAgTm90aGluZyB3aWxsIGJlIHNoYXJlZCB3aXRoIGFueQoJICAgICAgb3RoZXIgbW9kdWxlcwoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19MSU5LX1JVTlRJTUUsIHRoZW4gaW5zdGVhZCBvZiB1c2luZwoJICAgICAgdGhlIG5ldyB3YXkgb2Ygc2hhcmluZyB0eXBlIGluZm9ybWF0aW9uLCB0aGUgd3JhcHBlciB3aWxsIGV4cGVjdAoJICAgICAgdG8gYmUgbGlua2VkIGFnYWluc3QgdGhlIExpYi9saW5rcnVudGltZS5jIGZpbGUuICBBbnkgbW9kdWxlcyBjb21waWxlZAoJICAgICAgd2l0aCBTV0lHX0xJTktfUlVOVElNRSBhbmQgbGlua2VkIGFnYWluc3QgbGlua3J1bnRpbWUuYyB3aWxsIGFsbAoJICAgICAgc2hhcmUgdHlwZSBpbmZvcm1hdGlvbi4KCjEwLzIwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gSW5pdGlhbCBmaXggZm9yIHB5dGhvbi9pbXBvcnQgZXhhbXBsZS4gUGxlYXNlCgkgICAgICB1cGRhdGUgdGhlIE1ha2VmaWxlIChhdXRvY29uZiwgY29uZmlndXJlLCBldGMsIGV4cGVydCksCgkgICAgICBzaW5jZSBub3cgcHJvYmFibHkgaXMgb25seSB3b3JraW5nIHdpdGggZysrLCBpY2MgYW5kIGEKCSAgICAgIGZldyBvdGhlciBjb21waWxlcnMgdGhhdCBoYXZlIHRoZSAtc2hhcmVkIG9wdGlvbi4KCgkgICAgICBXZSBuZWVkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNoYXJlZCBsaWJyYXJpZXMgZm9yIHRoZQoJICAgICAgdmlydHVhbCBkZXN0cnVjdG9ycy4gT2xkIGFuZCB1c3VhbGx5IGZvcmdvdHRlbiBDKysKCSAgICAgIHJlcXVpcmVtZW50LgoJICAgICAgCgkgICAgICBTYW1lIGZpeCBuZWVkIHRvIGJlIHVzZWQgaW4gcGVybCwgSSB0aGluay4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gRml4IGdlbmVyYXRpb24gb2YgaGVhZGVyIGZpbGUgZm9yIGRpcmVjdG9ycywKICAgICAgICAgICAgICBub3cgZGlyZWN0b3JzLnN3ZyBpcyBhbHNvIGluY2x1ZGVkLCBzbywgaXQgY2FuIGJlIHJlYWxseQoJICAgICAgdXNlZCBmcm9tIEMrKywgYW5kIGl0IHNvbHZlcyBzb21lIHByb2JsZW0gd2l0aCBjb21waWxlcgoJICAgICAgdGhhdCByZXF1aXJlIHRoYXQsIGV2ZW4gd2l0aCB0aGUgc2ltcGxlIHN3aWcgaW5jbHVzaW9uLiAgCgogICAgICAgICAgICAtIFtQeXRob25dIFJlb3JkZXJpbmcgdGhlIG1ldGhvZHMgYW5kIG1vdmluZyBzb21lIGJvZGllcwogICAgICAgICAgICAgIG91dHNpZGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBkdWUgdG8KICAgICAgICAgICAgICBzb21lIGdjYy0yLjk2IGludGVybmFsIGNvbXBpbGVyIGVycm9ycy4gSXQgc2VlbXMgdGhlCiAgICAgICAgICAgICAgUFlUSE9OIGNsYXNzIGlzIGdldHRpbmcgdG9vIGxhcmdlIHRvIGJlZW4gZGVjbGFyZWQgYW5kCiAgICAgICAgICAgICAgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICAtIEFkZCB0aGUgLW9oIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG91dHB1dCBoZWFkZXIgZmlsZSBuYW1lCiAgICAgICAgICAgICAgaWYgbmVlZGVkOgoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAtb2ggdGVzdC5ISAoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBtYWlubHkgbmVlZGVkIHdoZW4gdXNpbmcgZGlyZWN0b3JzLCBhbmQgaWYgdGhlCiAgICAgICAgICAgICAgY3VycmVudCBkZWZhdWx0IGhlYWRlciBmaWxlIG5hbWUgaXMgbm90IGdvb2QgZm9yIHlvdSwKICAgICAgICAgICAgICB3aGljaCBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93OgkgICAgICAKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pICAgICAgICAgICAgID0+IHRlc3Rfd3JhcC5oCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgID0+IHRlc3QuaAoKCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIDEpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgZmVhdHVyZSBhZGRlZC4gVGhpcyBmZWF0dXJlIGFsbG93cyBvbmUKICAgICAgICAgICAgICB0byB1c2UgdGhlIGRlZmF1bHQgYXJndW1lbnQgY29kZSBnZW5lcmF0aW9uIHRoYXQgd2FzIHVzZWQgaW4KICAgICAgICAgICAgICBTV0lHLTEuMy4yMiBhbmQgZWFybGllciB2ZXJzaW9ucy4gSXQgcHJvZHVjZXMgbW9yZSBjb21wYWN0IHdyYXBwZXJzCiAgICAgICAgICAgICAgYXMgb25seSBvbmUgd3JhcHBlciBtZXRob2QgaXMgZ2VuZXJhdGVkIGZvciBhbnkgbWV0aG9kIHdpdGggZGVmYXVsdAogICAgICAgICAgICAgIGFyZ3VtZW50cy4gU28gdGhlIGFkdmFudGFnZSBpcyBpdCBnZW5lcmF0ZXMgbGVzcyBjb2RlIGJ1dCBoYXMgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgbGltaXRhdGlvbnMsIGxpa2UgaXQgaXQgZG9lcyBub3Qgd29yayB3aXRoIGFsbCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBjYW5ub3QgYmUgdGFrZW4gYWR2YW50YWdlIG9mIGluIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICAgIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpLiBJdCBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlIHVzdWFsICVmZWF0dXJlIG1lY2hhbmlzbToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIik7CgogICAgICAgICAgICAyKSBLZXl3b3JkIGFyZ3VtZW50cyAoa3dhcmdzKSBhcmUgd29ya2luZyBhZ2FpbiBmb3IgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgaW4gdGhlIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgaXQsIGllLCBQeXRob24gYW5kIFJ1YnkuIFRoZSBuZXcgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudCB3cmFwcGluZyBhcHByb2FjaCB1c2luZyBvdmVybG9hZGVkIG1ldGhvZHMgY2Fubm90IHN1cHBvcnQga3dhcmdzCiAgICAgICAgICAgICAgIHNvIHRoZSBjb21wYWN0IGRlZmF1bHQgYXJndW1lbnQgZmVhdHVyZSBpcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuCiAgICAgICAgICAgICAgIGt3YXJncyBhcmUgc3BlY2lmaWVkLCBieSAlZmVhdHVyZSgia3dhcmdzIikuCgogICAgICAgICAgICAzKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4gd3JhcHBpbmcKICAgICAgICAgICAgICAgQyAobm90IEMrKykgY29kZS4gVGhpcyBpcyB0byBzdXBwb3J0IHRoZSBiaXphcnJlIG5vdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBmb3IgQyBjb2RlLgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zIGluIG5hbWVzcGFjZXMgYWxzbyB3b3JraW5nIG5vdy4KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGluIG5hbWVzcGFjZXMgdG9vLgoKMTAvMTkvMjAwNDogbW1hdHVzCgoJICAgIC0gQWxsb3cgdG8gZGlzYWJsZSB0aGUgbmV3IFN3aWdWYWx1ZVdyYXBwZXIgbWVjaGFuaXNtLAoJICAgICAgaWYgeW91IGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBsYW5ndWFnZSBtYWluLgoKCQkgLyogVHVybiBvbiBzYWZlIHZhbHVlIHdyYXBwZXIgdXNlIG1vZGUgKi8KICAgICAgICAgICAgICAgICBTd2lnX3ZhbHVlX3dyYXBwZXJfbW9kZSgxKTsKCgkgICAgICAKCSAgICAgIE5vdyBpcyBvbmx5IGFjdGl2ZSBpbiBweXRob24uIEFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICBhcmUgdXNpbmcgdGhlIG9sZCByZXNvbHV0aW9uLCBidXQgdGhleSAgY2FuIGFsc28gdXNlIHRoZQoJICAgICAgInZhbHVld3JhcHBlciIvIm5vdmFsdWV3cmFwcGVyIiBmZWF0dXJlcyB0byBmaXggc29tZQoJICAgICAgb2YgdGhlIG9sZCBicm9rZW4gY2FzZXMuIE5vdGUsIGhvd2V2ZXIsICB0aGF0IG5vdCBhbGwgCgkgICAgICB0aGUgYnJva2VuIGNhc2VzIGNhbiBiZSBzb2x2ZWQgaW4gdGhhdCB3YXkuCgoJICAgICAgVGhlIG5ldyBtZWNoYW5pc20gc2VlbXMgdG8gYmUgd29ya2luZyBmaW5lIGluIHBlcmwsIHJ1YnkKCSAgICAgIGFuZCB0Y2wsIGJ1dCBmYWlsaW5nIGluIHNvbWUgdHlwZW1hcHMgaW4gamF2YS4KCgkgICAgICBIZW5jZSwgaXMgdXB0byB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0byB0ZXN0IGl0LCBhbmQKCSAgICAgIGRlY2lkZSB0byBlbmFibGUgaXQgb3Igbm90LgoKCSAgICAgIExvb2sgYXQgdGhlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgZXhhbXBsZXMuCgoJICAgIC0gRml4IG1vcmUgU3dpZ1ZhbHVlV3JhcHBlciBjYXNlcyB3aGVuIHRoZSBuZXcgbWVjaGFuaXNtCgkgICAgICBpcyBhY3RpdmUuIE5vdyBpdCBhbHNvIGNoZWNrIGZvciBsb2NhbCB0eXBlbWFwCgkgICAgICB2YXJpYWJsZXMsIHNlZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFuIGV4YW1wbGUgd2hlbgoJICAgICAgdGhpcyBpcyBuZWVkZWQuIEJ1dCBhZ2FpbiwgdGhpcyBleHRyYSBjaGVja2luZyB3aWxsIG9ubHkKCSAgICAgIGJlIGFjdGl2YXRlZCB3aGVuIHVzaW5nIHRoZSBuZXcgdmFsdWUgd3JhcHBlciBtb2RlLgoKCSAgICAtIFtQeXRob25dIEZpeCB2YXJpYWJsZSB3cmFwcGluZyBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZQoJICAgICAgYXNzaWduIG9wZXJhdG9ycy4gSXQgc2hvdWxkIGJlIGVhc3kgdG8gZml4IGluIGFsbCB0aGUgCgkgICAgICBvdGhlciBtb2R1bGVzLCBpbnN0ZWFkIG9mIGNoZWNraW5nCgoJICAgICAgICAgaWYgKCFHZXRhdHRyKG4sImltbXV0YWJsZSIpKSAuLi4KCQoJICAgICAgeW91IG5lZWQgdG8gdmVyaWZ5CgoJICAgICAgICAgaWYgKGlzX2Fzc2lnbmFibGUobikpIC4uLgoKCSAgICAgIExvb2sgYXQgdGhlIHByaXZhdGVfYXNzaWduLmkgZm9yIGFuIGV4YW1wbGUuCgoxMC8xOC8yMDA0OiBtbWF0dXMKCSAgICAtICVmZWF0dXJlcyAiZGlyZWN0b3IiLyJub2RpcmVjdG9yIiBub3cgd29yayBhcyBleHBlY3RlZC4KICAgICAgICAgICAgLSBHZW5lcmFsIGZpeGVzIGluICVmZWF0dXJlIHRvIHJlc29sdmUgZnVuY3Rpb24gZGVjbAoJICAgICAgcHJvcGVybHksCgkgICAgICAKCSAgICAgICAgJWZlYXR1cmUoImhlbGxvIikgZm9vKCk7CgkgICAgICAgIGNoYXIgZm9vKCkgLT4gIGYoKSAgICAvLyB3YXMgd29ya2luZwoJICAgICAgICBjaGFyICpmb28oKSAtPiBmKCkucCAgLy8gaXQgd2Fzbid0CiAKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgKyBzcGVjaWFsaXphdGlvbiArIGRlZmF1bHQgdGVtcGxhdGUgYXJncyBub3cgaXMKCSAgICAgIHdvcmtpbmcsIChkb24ndCBjb25mdXNlIHdpdGggdGVtcGxhdGUgKyBkZWZhdWx0IGFyZwoJICAgICAgdmFsdWVzLCB0aGF0IHdhcyBzb2x2ZWQgYmVmb3JlKSwgbm93IHRoaXMgdWdseSBjYXNlIGlzCgkgICAgICB3b3JraW5nOgoKCSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEEgPSBBbGxvYzxUPiA+CgkJc3RydWN0IFZlY3RvcgoJCXsKCQkgICBWZWN0b3IoVCBhKXt9CgkJfTsJCSAgIAoKCQl0ZW1wbGF0ZSA8PgoJCXN0cnVjdCBWZWN0b3I8ZG91YmxlPgoJCXsKCQkgIFZlY3Rvcigpe30KCQkgIGludCBmb28oKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgJXRlbXBsYXRlKFZfYykgVmVjdG9yPGNoYXIsIEFsbG9jPGNoYXI+ID47CgkgICAgICAgICV0ZW1wbGF0ZShWX2kpIFZlY3RvcjxpbnQ+OyAgICAvLyBwaWNrcyBWZWN0b3I8aW50LEFsbG9jPGludD4gPgoJICAgICAgICAldGVtcGxhdGUoVl9kKSBWZWN0b3I8ZG91YmxlPjsgLy8gcGlja3MgdGhlIHNwZWNpYWxpemF0aW9uCgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG5lZWRlZCBmb3IgYXV0b21hdGljIFNUTCBzdXBwb3J0IChsYXRlciB3aWxsCiAgICAgICAgICAgICAgYmUpLgoKCSAgICAtIEZpeCB0aGUgdGVtcGxhdGUgKyB0eXBlZGVmIGVycm9ycyBpbiB0ZXN0LXN1aXRlLCB3aGljaAogICAgICAgICAgICAgIHByb2JhYmx5IHdpbGwgZml4IGFub3RoZXIgZ3JvdXAgb2Ygc3RyYW5nZSB0ZW1wbGF0ZSArCiAgICAgICAgICAgICAgbmFtZXNwYWNlcyArIHR5cGVkZWZzIGVycm9ycy4KCgkgICAgLSAld2FybmZpbHRlciBpcyB3b3JraW5nIGJldHRlciBub3csIHBhcnNlci55IHRyaWVzIHRvIHVzZQoJICAgICAgdGhlbSB3aGVuIG5lZWRlZC4KCgkgICAgLSAqKioqIE5ldyBkZWZhdWx0IHR5cGUgcmVzb2x1dGlvbiBtZXRob2QgKHN0eXBlLmMpICoqKioqIAoKCSAgICAgIEl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgbWl4ZWQgdHlwZXMsIHRoZW4gaXQgZ29lcwoJICAgICAgJ2JhY2t3YXJkJyBmaXJzdCBkZWxldGluZyB0aGUgcXVhbGlmaWVyLCB0aGVuIHRoZSBpbm5lcgoJICAgICAgdHlwZXMsIGZvciBleGFtcGxlOgogICAgCQkgCQkJCQkJCSAgCiAgICAJCSB0eXBlZGVmIEEgKkFwdHI7CQkJCSAgCiAgICAJCSBjb25zdCBBcHRyJjsJCQkJCQkKICAgIAkJIHIucShjb25zdCkuQXB0ciAgICAgICAtPiByLnEoY29uc3QpLnAuU1dJR1RZUEUJCQogICAgCQkgci5xKGNvbnN0KS5wLlNXSUdUWVBFIC0+IHIucC5TV0lHVFlQRQkJCQogICAgCQkgci5wLlNXSUdUWVBFICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBlbnVtIEhlbGxvIHt9OwkJCQkJCQogICAgCQkgY29uc3QgSGVsbG8mIGhpOwkJCQkJCiAgICAJCSByLnEoY29uc3QpLkhlbGxvICAgICAgICAgIC0+IHIucShjb25zdCkuZW51bSBTV0lHVFlQRQkKICAgIAkJIHIucShjb25zdCkuZW51bSBTV0lHVFlQRSAgLT4gci5lbnVtIFNXSUdUWVBFCQkKICAgIAkJIHIuZW51bSBTV0lHVFlQRSAgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGludCBhWzJdWzRdOwkJCQkJCQogICAgCQkgYSgyKS5hKDQpLmludCAgICAgICAgICAgLT4gYShBTlkpLmEoQU5ZKS5TV0lHVFlQRQkKICAgIAkJIGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUgIC0+IGEoQU5ZKS5hKCkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLmEoKS5TV0lHVFlQRSAgICAgLT4gYShBTlkpLnAuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLnAuU1dJR1RZUEUgICAgICAgLT4gYShBTlkpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5TV0lHVFlQRSAgICAgICAgIC0+IGEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKCkuU1dJR1RZUEUgICAgICAgICAgICAtPiBwLlNXSUdUWVBFCQkJCiAgICAJCSBwLlNXSUdUWVBFICAgICAgICAgICAgICAtPiBTV0lHVFlQRSAgICAgICAgICAgICAgICAgICAgCgoJICAgICAgYmVmb3JlIGl0IGFsd2F5cyBzdG9wcyBhZnRlciBmaW5kaW5nIHJlZi9wb2ludGVyL2VudW0vYXJyYXkvZXRjLgoJICAgICAgIAoJICAgICAgTm93LCB0aGVuLCB5b3UgY2FuIGRlZmluZSAodXNlIGFuZCBhcHBseSkgJ2hpZ2hlcicgdHlwZW1hcHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKG91dCkgY2hhciBGSVhTSVpFW0FOWV0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGVudW0gU1dJR1RZUEUmCgkgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRVtBTlldW0FOWV0KCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKCYpW0FOWV0KCSAgICAgICAKCSAgICAgIEl0IGlzIHBvc3NpYmxlIHdpdGggdGhpcyBjaGFuZ2UgdGhhdCBwcmV2aW91cyB0eXBlbWFwcwoJICAgICAgdGhhdCB3ZXJlIGRlZmluZWQgKGJ1dCBpZ25vcmVkKSwgbm93IHdpbGwgc3RhcnQgdG8gd29yay4KCgkgICAgICBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgY2hlY2sgZm9yIHRoZSAnJXR5cGVtYXAodmFyaW4pIFNXSUdUWVBFW10nLAoJICAgICAgYmVmb3JlIGl0IHdhcyB1c3VhbGx5IG5vdCBkZWZpbmVkIChidXQgY2hhcltdIHdhcyksCgkgICAgICBhbmQgdGhhdCBjYW4gcHJvZHVjZSBzb21lIGluY29uc2lzdGVuY2llcy4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgICBUaGlzIGNoYW5nZSB3YXMgbmVlZGVkIGZvciBTVEwsIHNpbmNlIHN0ZDo6dmVjdG9yPGVudW0gSGVsbG8+IAoJICAgICAgc3RkOjp2ZWN0b3I8QSo+LCBldGMsIHdpbGwgYWx3YXlzIGdlbmVyYXRlIG1ldGhvZHMgdGhhdAoJICAgICAgbWl4IGNvbnN0IHJlZmVyZW5jZXMgd2l0aCB0aGUgdmVjdG9yIHR5cGUuCgoJICAgICAgTm93IHRoYXQgaXMgd29ya2luZywgYWxsIHRoZSBzdGQ6OmNvbnRhaW5lcjxUKj4KCSAgICAgIHNwZWNpYWxpemF0aW9uIHdpbGwgbm90IGJlIG5lZWRlZCBhbnltb3JlLCB3ZWxsLCBpbgoJICAgICAgdGhlb3J5LiAKCgkgICAgICBJbiB0aGUgcHJhY3RpY2UsIGV2ZXJ5dGhpbiBpcyB3b3JraW5nIGFzIGJlZm9yZSB1bnRpbAoJICAgICAgdGhlIHByb3BlciBtaXhlZCB0eXBlcyBhcmUgZGVmaW5lZCBhbmQgdGhlIGxpYnJhcmllcwoJICAgICAgc2ltcGxpZmllZCB0byB1c2UgdGhlbS4KCgkgICAgLSBDaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGV4dGVybiAiamF2YSIvImZvcnRyYW4iLyJldGMiLCAKCSAgICAgIG5vdyBzd2lnIHByb2R1Y2VzIGEgd2FybmluZywgYW5kIHVzZSBleHRlcm4gIkMiIGluc3RlYWQuCgkgICAgICBUaGUgd2FybmluZyBjYW4gYWxzbyBiZSBkaXNhYmxlIHdpdGggdGhlICItdyAzMTMiIGZsYWcuCgkgICAgICAoV0FSTl9QQVJTRV9VTkRFRklORURfRVhURVJOKS4KCgkgICAgLSBTd2lnVmFsdWVXcmFwcGVyIGlzIG5vdyBtb3JlIHNlbGVjdGl2ZSAobGFuZy5jeHgpLgoKICAgICAgICAgICAgW1BlcmwvVGNsXQoJICAgIC0gRml4IHNvbWUgdHlwZW1hcHMgKHBlcmwvdGNsKSB0byB3b3JrIHByb3Blcmx5IHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIuIFRoaXMgd2FzIG5vdCBhIHByb2JsZW0gd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgYnV0IHdpdGggdGhlIHR5cGVtYXBzIHRoYXQgbm93IGFyZQoJICAgICAgc2FmZSB0byB1c2Ugd2l0aCAlYXBwbHkuCgoJICAgIFtQeXRob25dCgogICAgICAgICAgICAtIEZpeCAlY2FsbGJhY2svJXB5dGhvbmNhbGxiYWNrIHdvcmsgbm93IGFzIGJlZm9yZSBhZnRlcgoJICAgICAgdGhlIGRlZiBhcmdzIGNoYW5nZXMuIEFsc28sICVjYWxsYmFjayBub3cgaXMgYW4gYWxpYXMKCSAgICAgIGZvciAlcHl0aG9uY2FsbGJhY2ssIHNvLCB0aGV5IGRvIHRoZSBzYW1lLgoKCSAgICBbUHl0aG9uL1J1YnldCgkgICAgLSAlY2FsbGJhY2sgaXMgbW9yZSB1c2FibGUgYW5kIHVuaWZvcm06CgogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKSBmb28oKTsgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKTsgICAgICAgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygxKSBmb28oKTsgICAgICAgIC8vIG9ubHkgaW4gcHl0aG9uLgoKMTAvMTcvMjAwNDogYXJ0eQoJICAgIFtPQ0FNTF0KCSAgICAtIFR3ZWFrIHRvIGVudW0gdHlwaW5nIGZvciBzb3VuZG5lc3MgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlCgkgICAgICBtb2R1bGVzLgoJICAgIC0gZ2xvYmFsIGZ1bmN0aW9ucyBhcmUgbm93IHVuYW1iaWd1b3VzIGluIG11bHRpcGxlIGxvYWRlZCBtb2R1bGVzLgoJICAgIC0gRml4ZWQgdGVzdCBjYXNlIGNvZGUgdG8gYnVpbGQgbXVsdGltb2R1bGUgdGVzdCBjYXNlcyBjb3JyZWN0bHkuCgkgICAgLSBUaGVyZSBpcyBubyB3YXkgdG8gc2hhcmUgb3ZlcmxvYWQgcmVzb2x1dGlvbiBhY3Jvc3MgbW9kdWxlcwoJICAgICAgYmVjYXVzZSBvZiBzb3VuZG5lc3MgaXNzdWVzLiAgSWYgdGhlIHVzZXIgd2FudHMgdG8gY2FsbCBzb21lCgkgICAgICBmdW5jdGlvbiBmb28gZnJvbSBhbiBhcmJpdHJhcnkgbW9kdWxlIGJhciwgdGhleSB3aWxsIGhhdmUgdG8KCSAgICAgIHVzZSBCYXIuX2ZvbyB0byBjYWxsIGl0IGNvcnJlY3RseS4gIExhdGVyIEkgd2lsbCBmaXggdGhlIAoJICAgICAgY2FtbHA0IG1vZHVsZSB0byBkbyBzb21ldGhpbmcgY2xldmVyIGluIHRoaXMgY2FzZS4gIAogICAgICAgICAgICAtIFByb21pZGVkIHBlcmZvcm1hbmNlIG92ZXJoYXVsIG9mIGNsYXNzIG1lY2hhbmlzbS4KCSAgICAtIFJlbW92ZWQgc3ltYm9sIGhhY2sgZm9yIG9jYW1sLTMuMDcgYW5kIGJlbG93IHdoaWNoIGlzIG5vdCBuZWVkZWQKCSAgICAgIGZvciBvY2FtbC0zLjA4IGFuZCBhYm92ZS4KCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ0hJQ0tFTl0KCSAgICAtIENvbXBsZXRseSBjaGFuZ2UgaG93IGNoaWNrZW4uY3h4IGhhbmRsZXMgQ0xPUyBhbmQgZ2VuZXJpYyBjb2RlLgoJICAgICAgY2hpY2tlbiBubyBsb25nZXIgZXhwb3J0cyAtY2xvcy5zY20gYW5kIC1nZW5lcmljLnNjbS4gIFRoZSBjbG9zCgkgICAgICBjb2RlIGlzIGV4cG9ydGVkIGRpcmVjdGx5IGludG8gdGhlIG1vZHVsZS5zY20gZmlsZSBpZiAtcHJveHkgaXMgcGFzc2VkLgoJICAgIC0gVGhlIGNvZGUgbm93IGFsd2F5cyBleHBvcnRzIGEgdW5pdC4gIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUgaXMgbm93CgkgICAgICBtYWpvcmx5IGJyb2tlbiwgYW5kIG5lZWRzIHRvIGJlIGZpeGVkLgoJICAgIC0gQ0xPUyBub3cgZ2VuZXJhdGVzIHZpcnR1YWwgc2xvdHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgc2ltaWxhciB0byBob3cKCSAgICAgIEdPT1BTIHN1cHBvcnQgd29ya3MgaW4gdGhlIGd1aWxlIG1vZHVsZS4KCSAgICAtIGNoaWNrZW4gbm8gbG9uZ2VyIHByZWZpeGVzIHN5bWJvbHMgYnkgdGhlIG1vZHVsZSBuYW1lLCBhbmQgbm8gbG9uZ2VyCgkgICAgICBmb3JjZXMgYWxsIG5hbWVzIHRvIGxvd2VyIGNhc2UuICBJdCBub3cgaGFzIC11c2VjbGFzc3ByZWZpeCBhbmQgLWNsb3NwcmVmaXgKCSAgICAgIHNpbWlsYXIgdG8gaG93IGd1aWxlIGhhbmRsZXMgR09PUFMgbmFtZXMuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgd29ya2luZyB3aXRoIG5ldyBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHdyYXBwaW5nIGFwcHJvYWNoLiBUaGUgbmV3IGFwcHJvYWNoIG5vIGxvbmdlciBmYWlscyB3aXRoIHRoZSBmb2xsb3dpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudCBwYXR0ZXJuIChwcmV2aW91c2x5IGZhaWxlZCB3aXRoIHNvbWUgcHJpbWl0aXZlIHR5cGVzLCBsaWtlIAogICAgICAgICAgICB1bnNpZ25lZCBwcmltaXRpdmUgdHlwZXMpOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZm9vKGNvbnN0IFQmIHUgPSBUKCkpOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzx1bnNpZ25lZCBpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWxpZXMgb24gdGhlIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyBzdXBwb3J0IGp1c3QgYWRkZWQsIHNvIGFsbAogICAgICAgICAgICB0aGUgY29tYmluYXRpb25zIG9mIG92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlIHBhcmFtZXRlcnMgYW5kIG5vcm1hbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgb3ZlcmxvYWRpbmcgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgd29ya3MuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgbGFyZ2UgcmFuZ2Ugb2YgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHRoYXQgQysrCiAgICAgICAgICAgIHN1cHBvcnRzLgoKICAgICAgICAgICAgLSBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQsIGNvbnN0IFQgJnIpOwoKICAgICAgICAgICAgLSBGaXhlcyB3aGVyZSB0aGUgdGVtcGxhdGVkIHR5cGUgaXMgbm90IHVzZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHh5eigpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCB4eXo8ZG91YmxlPigpOwoKICAgICAgICAgICAgLSBGaXhlcyBmb3Igb3ZlcmxvYWRpbmcgb2YgcGxhaW4gZnVuY3Rpb25zIGJ5IGEgdGVtcGxhdGVkIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKCiAgICAgICAgICAgIC0gT3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGVkIHBhcmFtZXRlcnMgZml4ZWQ6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZm9vKFQgdCkge30KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiB2b2lkIGZvbyhUIHQsIFUgdSkge30KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPGRvdWJsZSwgZG91YmxlPjsKCiAgICAgICAgICAgIC0gQWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYWxzbyB3b3JraW5nIGluY2x1ZGluZyBzcGVjaWFsaXphdGlvbnMsIGVnOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjPGRvdWJsZT4oZG91YmxlIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmMoaW50IHQpOwoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVtb3ZlIHRoZSBhYmlsaXR5IHRvIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24gYnkgdXNpbmcgYyBsaW5raW5nLgogICAgICAgICAgICAgIEFsbCB0eXBlIHNoYXJpbmcgaGFwcGVucyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgICAgICArIFJlbW92ZSBTV0lHX05PSU1QT1JULCBTV0lHX1JVTlRJTUUsIGFuZCByZWxhdGVkIGRlZmluZXMuCiAgICAgICAgICAgICAgICArIERlcHJlY2F0ZSAtcnVudGltZSwgLW5vcnVudGltZSBjb21tYW5kIGxpbmUgb3B0aW9ucwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGVzdC1zdWl0ZSBjb21tb24ubWsgdG8gY29ycmVjdGx5IGJ1aWxkIG11bHRpY3BwdGVzdAogICAgICAgICAgICAgICAgKyBSZW1vdmUgcmVmZXJlbmNlIHRvIHByZWNvbW1vbi5zd2cKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRoZSBndWlsZV9naCBpbnRlcmZhY2UgdG8gc2hhcmUgZGF0YSBieSBhIGdsb2JhbCB2YXIgaW5zdGVhZAogICAgICAgICAgICAgICAgICBvZiBjIGxpbmthZ2UuCgogICAgICAgICAgICAtIFJlbW92ZSBBZHZhbmNlZC5odG1sLCBzaW5jZSBldmVyeXRoaW5nIGluIGl0IGlzIG5vdyBvYnNvbGV0ZQoKMTAvMDkvMjAwNDogbW1hdHVzCgkgICAgLSBTcGxpdCB0aGUgcHl0aG9uIHN0ZC9TVEwgQysrIGxpYnJhcnkgZmlsZXMsIG5vdwoJICAgICAgYWxsIHRoZSBsYW5ndWFnZSBpbmRlcGVuZGVudCBkZWZpbml0aW9ucyBhcmUgdW5kZXIKCSAgICAgIHRoZSBkaXJlY3RvcnkKCSAgICAgIAoJCUxpYi9zdGQKCgkgICAgICBhbmQgaGVuY2UsIGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICAtIEFkZCBtb3JlIGRvY3VtZW50YXRpb24gdG8gdGhlIFB5dGhvbiBTVEwsIGFuZAoJICAgICAgY2xlYW4gdW5uZWNlc3NhcnkgY29kZS4KCgkgICAgLSBBZGQgaW5pdGlhbCBDOTkgY29tcGxleCBzdXBwb3J0LCBhbmQgc29tZSBmaXhlcwoJICAgICAgZm9yIGxvbmcgZG91YmxlLgoKMTAvMDgvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdGhlIFN3aWdWYWx1ZVdyYXBwZXIgZm9yIG9wYXF1ZSB0eXBlcywgbm93IGl0IGlzIAoJICAgICAgYXBwbGllZCBmb3Igb3BhcXVlIHRlbXBsYXRlcyBhbmQgY2xhc3NlcywgZm9yIHdoaWNoIHdlCgkgICAgICBkb24ndCBrbm93IGlmIHRoZXJlIGlzIG9yIG5vdCBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGllCgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKGludCk7CiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgIFN0aWxsLCBpZiB5b3Uga25vdyB0aGF0IHlvdSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGFuZCBmb3Igc29tZSB2ZXJ5IHZlcnkgcGFydGljdWxhciByZWFzb24KICAgICAgICAgICAgICB5b3Ugd2FudCB0byBhdm9pZCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciwgYW5kIHlvdSBkb24ndAogICAgICAgICAgICAgIHdhbnQgb3IgY2FuJ3QgZXhwb3NlIHRoZSBjbGFzcyB0byBzd2lnLCBub3cgeW91IGNhbgogICAgICAgICAgICAgIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm92YWx1ZXdyYXBwZXIiKSBBOyAgICAKICAgICAgICAgICAgICAgICBjbGFzcyBBOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgICBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgaWYgdGhlIGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYnV0IHlvdSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgd3JhcHBlciwgeW91CiAgICAgICAgICAgICAgY2FuIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgidmFsdWV3cmFwcGVyIikgQTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQSgpOwoJCSAgIC4uLi4KICAgICAgICAgICAgICAgICB9OyAgIAogICAgICAKCSAgICAtIEZpeCBmb3IgY2hhciA+IDEyOCwgaWUKCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHRpbGRlX2EgPSAnXDM0MSc7CgogICAgICAgICAgICAtIEFkZCBwYXRjaCAxMDQxODU4IGZvciAkbGV4dHlwZSwgd2hpY2ggY2FycmllcyB0aGUgCiAgICAgICAgICAgICAgbGl0ZXJhbCB0eXBlIG9mIGEgc3ltYm9sLiBTZWUgbGV4dHlwZS5pIGluIHRoZQogICAgICAgICAgICAgIHRlc3Qtc3VpdGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAoKMTAvMDcvMjAwNDogd3NmdWx0b24KCSAgICB7UnVieSwgSmF2YV0gRml4IGRpcmVjdG9yICsgJ2VtcHR5JyB0aHJvd3MKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICBBKCkgdGhyb3coKTsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgICBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCgoxMC8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW1RDTF0KICAgICAgICAgICAgLSBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbGxpYW0gQS4gSG9mZm1hbiBwcm9wYWdhdGluZyBjbGllbnRkYXRhCiAgICAgICAgICAgIGJldHdlZW4gbW9kdWxlcy4gIEFkZGVkIGNsaWVudGRhdGFfcHJvcC5tdWx0aWNwcHRlc3QgdG8gY2hlY2sgZm9yCiAgICAgICAgICAgIHRoaXMgYnVnLiAgVGhlIGZpeCBpbnZvbHZlZCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgICArIFN3aWdUeXBlX2NsaWVudGRhdGFfY29sbGVjdCBkb2VzIG5vdCBuZWVkIHRvIGNoZWNrCiAgICAgICAgICAgICAgICB0eXBlcyBpbiByX3Jlc29sdmVkIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIHByb3BhZ2F0ZSBjbGllbnRkYXRhCiAgICAgICAgICAgICAgICB0byB0eXBlZGVmZWQgY2xhc3NlcywgYW5kIHJfbWFuZ2xlZCBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdHlwZWRlZnMuCgogICAgICAgICAgICAgICAgKyBTV0lHX1R5cGVSZWdpc3RlciBub3cgY29waWVzIHRoZSBjbGllbnRkYXRhIGZpZWxkIGNvcnJlY3RseQoKICAgICAgICAgICAgICAgICsgTW92ZSBTV0lHX0d1aWxlX1Byb3BhZ2F0ZUNsaWVudERhdGEgZnVuY3Rpb24gZnJvbSBndWlsZSBtb2R1bGUKICAgICAgICAgICAgICAgIGludG8gY29tbW9uLnN3ZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGNhbGwgaXQgZnJvbSBib3RoIGd1aWxlIGFuZCB0Y2wuCgogICAgICAgICAgICAgICAgKyBBZGQgYmFzZV9uYW1lcyB0byBzd2lnX2NsYXNzIHRvIGRlbGF5IHRoZSBsb29rdXAgb2YgYmFzZXMuICBTV0lHCiAgICAgICAgICAgICAgICBub3cgZXhwb3J0cyB0aGUgYmFzZSBuYW1lcyBhbmQgb25seSB3aGVuIHRoZSBiYXNlIHN3aWdfY2xhc3MgaXMKICAgICAgICAgICAgICAgIG5lZWRlZCBpcyBTV0lHX1R5cGVRdWVyeShuYW1lKS0+Y2xpZW50ZGF0YSBsb29rZWQgdXAuCgogICAgICAgICAgICAtIGNvbnZlcnNpb25fbnNfdGVtcGxhdGUgdGVzdHN1aXRlIHRlc3Qgd2FzIGZhaWxpbmcgYmVjYXVzZQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3YXMgbm90IGNhbGN1bGF0ZWQKICAgICAgICAgICAgY29ycmVjdGx5IGZvciBzdHJ1Y3RzLiAgRml4ZWQuCgoxMC8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgdXNlZCBpbiBkaXJlY3RvcnMgLSBpbiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMgYW5kIGRpcmVjdG9yIGNvbnN0cnVjdG9ycy4KCjEwLzA2LzIwMDQ6IG1tYXR1cwoJICAgIEZpeCB0aGUgX19jcGx1c3BsdXMgbWFjcm8sIGFuZCBidWcgMTA0MTE3MC4KCSAgICBOb3cgaXQgaXMgd29ya2luZyBhcyBzdXBwb3NlZCwgaWUsIHlvdSBjYW4gc2FmZWx5IHVzZQoKCSAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwoJICAgICAgLi4uCgkgICAgCgkgICAgYWxsIG92ZXIgc3dpZywgaW5jbHVkaW5nIGluc2lkZSAlZGVmaW5lcyBhbmQgJXsgJX0gYm9kaWVzLgoKCSAgICAKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGUgb2xkIHRyaWNrIG9mIHVzaW5nCgoJICAgICAgI2lmIF9fY3BsdXNwbHVzCgoJICAgIGRvZXNuJ3Qgd29yayBhbnkgbW9yZS4gU28sIGlmIHlvdSBoYXZlIHlvdXIgb3duIHR5cGVtYXBzCgkgICAgdXNpbmcgdGhhdCBzeW50YXgsIHlvdSB3aWxsIG5lZWQgdG8gbWlncmF0ZSB0aGVtIHRvIHVzZQoJICAgICIjaWZkZWYgX19jcGx1c3BsdXMiLgoKMTAvMDUvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVvcmdhbml6ZSBob3cgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBhbmQgc2hhcmVkCgkgICAgYmV0d2VlbiBtb2R1bGVzLiAgRm9yIGNoaWNrZW4gYW5kIG16c2NoZW1lLCBJIHJlbW92ZWQKCSAgICB0aGUgYWJpbGl0eSB0byB1c2UgcnVudGltZSBsaWJyYXJpZXMsIHdoaWxlIHBlcmwsIHRjbCwgcHl0aG9uLCBhbmQKCSAgICBydWJ5IGRlZmF1bHQgdG8gdXNpbmcgdGhlIG5ldyBtZXRob2QgYnV0IGNhbiBnbyBiYWNrIHRvIHRoZSBvbGQKCSAgICBtZXRob2QgYnkgZGVjbGFyaW5nIFNXSUdfQUxMT1dfUlVOVElNRS4KCgkgICAgLSBsaW5lIDU4MiBpbiBtenNjaGVtZS5jeHggd2FzIGdlbmVyYXRpbmcgYSBzZWdmYXVsdCBvbiAKCSAgICBpbXBvcnRzLm11bHRpY3BwdGVzdCwgc28gSSBmaXhlZCBpdC4KCjEwLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAlZXh0ZW5kIGFuZCBvdmVybG9hZGVkIHN0YXRpYyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMuCgoxMC8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIFtweXRob25dIEZpeCBkaXJlY3RvciArIG1ldGhvZCB3aXRoICdlbXB0eScgdGhyb3csIGllCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCQkgICAgCgkgICAgICBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIGFsc28gZWFzeSB0byBmaXgsIGxvb2sgZm9yCgkgICAgICBHZXRhdHRyKG4sInRocm93IikgaW4gcHl0aG9uLmN4eC4KCgkgICAgLSBGaXggZGlyZWN0b3IgKyBkZXN0cnVjdG9yIHdpdGggJ2VtcHR5JyB0aHJvdwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICB9OwoKCSAgICAtIE5vdyBTV0lHX0ZFQVRVUkVTIHBhcnNlIGFsbCBhbmQgdGhlIHNhbWUgIG9wdGlvbnMgeW91CiAgICAgICAgICAgICAgY2FuIHBhc3MgdG8gc3dpZyBpbiB0aGUgY29tbWFuZCBsaW5lLgoJICAgICAgCgkgICAgLSBOZXcgY29tbWFuZCBsaW5lIGZsYWc6IC1mZWF0dXJlcyA8bGlzdD4sIGFzIGluCgoJICAgICAgICBzd2lnIC1mZWF0dXJlcyBhdXRvZG9jPTMsZGlyZWN0b3IKCgkgICAgICBpZSwgYW55IGdsb2JhbCBmZWF0dXJlIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIHRoZQoJICAgICAgY29tbWFuZCBsaW5lLiBUaGlzIGlzIG1haW5seSBmb3IgdGVzdGluZywgYnV0IHVzZXJzCgkgICAgICBjYW4gYWxzbyB0YWtlIGFkdmFudGFnZSBvZiBpdC4KCjEwLzA0LzIwMDQ6IG1tYXR1cwoJICAgIC0gUHJvcGVybHkgcXVhbGlmeSB0eXBlIGluIHN5bnRheCBhcyAnbG9uZygyKScgb3IgJ0ZvbygpJywKCSAgICAgIHRoaXMgc29sdmUgb2xkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3MsIGFuZCBwcm9iYWJseQoJICAgICAgb3RoZXIgcHJvYmxlbXMgYXJvdW5kLiBIb3dldmVyLCB0aGUgZGVmYXVsdCBhcmcgcHJvYmxlbQoJICAgICAgd2FzIGFsc28gYWxyZWFkeSBzb2x2ZWQgYnkgV2lsbGlhbSAoc2VlIGJlbG93KS4KCgkgICAgLSBGaXggZmVhdHVyZV9zZXQgYW5kIGZlYXR1cmVfZ2V0IG1ldGhvZHMuIEJlZm9yZQoJICAgICAgdGhleSBsb29rIGZyb20gcGFydGljdWxhciB0byBnZW5lcmFsIGFuZCBrZWVwIHRoZSBmaXJzdAoJICAgICAgZmVhdHVyZSBmb3VuZC4gVGhpcyBkaWRuJ3Qgd29yayB3ZWxsIHdpdGggdGVtcGxhdGVzLgoJICAgICAgTm93IHRoZSBtZXRob2RzIGxvb2sgZnJvbSBnZW5lcmFsIHRvIHBhcnRpY3VsYXIsIGFuZAoJICAgICAgb3ZlcnJpZGUgYW55IGZvdW5kIGZlYXR1cmUuCgogICAgICAgICAgICAtIFByZXZpb3VzbHkgYSBmZWF0dXJlIGNvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIGNvbnN0cnVjdG9ycwogICAgICAgICAgICAgIG9yIGRlc3RydWN0b3JzIHRoYXQgd2VyZW4ndCBleHBsaWNpdGx5IGRlY2xhcmVkIGluIHRoZSBjbGFzcy4KICAgICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgRm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIH5Gb28oKSAiLi4uIgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLy8gaW1wbGljaXQgRm9vKCkgYW5kIH5Gb28oKQogICAgICAgICAgICAgICAgfTsKCgkgICAgLSBGaXggbWlzc2luZyBmZWF0dXJlcyBmb3IgZGVmYXVsdCBjb25zdC9kZXN0LCBieSByZWFsbHkKCSAgICAgICdjcmVhdGluZycgdGhlIG1ldGhvZHMgYW5kIGFwcGx5aW5nIHRoZSBmZWF0dXJlcy4KCgkgICAgLSBGaXggcmV0dXJuX2NvbnN0X3ZhbHVlLmkgY2FzZSBieSBhZGRpbmcgU3dpZ1ZhbHVlV3JhcHBlcjxjb25zdCBUPgoJICAgICAgc3BlY2lhbGl6YXRpb24uCgoJICAgIC0gRml4ICVleHRlbmQgKyBvdmVybG9hZCwgaW5jbHVkaW5nIG92ZXJsb2FkaW5nIGFjdHVhbAogICAgICAgICAgICAgIGNsYXNzIG1ldGhvZHMuIAoKCSAgICAtIEFkZGluZyBtb3JlIGNhc2VzIGluIHJlbGF0ZWQgZmlsZXMgaW4gdGhlIHRlc3Qtc3VpdGUuICAKCjEwLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIHdheSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgd3JhcHBlZC4gUHJldmlvdXNseSBhIHNpbmdsZQogICAgICAgICAgICBtZXRob2Qgd2FzIGdlbmVyYXRlZCBmb3IgZWFjaCBtZXRob2QgdGhhdCBoYWQgZGVmYXVsdCBhcmd1bWVudHMuIElmCiAgICAgICAgICAgIGEgbWV0aG9kIGhhZCA1IGFyZ3VtZW50cywgc2F5LCBvZiB3aGljaCAxIGhhZCBhIGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgdGhlbiB0aGUgY2FsbCB0byB0aGUgd3JhcHBlZCBtZXRob2Qgd291bGQgcGFzcyA1IGFyZ3VtZW50cy4gVGhlIGRlZmF1bHQKICAgICAgICAgICAgdmFsdWUgd2FzIGNvcGllZCBpbnRvIHRoZSB3cmFwcGVyIG1ldGhvZCBhbmQgdXNlZCBpZiB0aGUgc2NyaXB0aW5nCiAgICAgICAgICAgIGxhbmd1YWdlIHBhc3NlZCBqdXN0IDQgYXJndW1lbnRzLiBIb3dldmVyLCB0aGlzIHdhcyBmbGF3ZWQgYXMgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnQgc29tZXRpbWVzIGRvZXMgbm90IGhhdmUgZ2xvYmFsIGFjY2VzcywgZm9yIGV4YW1wbGUKICAgICAgICAgICAgU1dJRyB3b3VsZCBnZW5lcmF0ZSBjb2RlIHRoYXQgY291bGRuJ3QgY29tcGlsZSB3aGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICBjbGFzcyBUcmlja3kgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwgPSBwcml2YXRldmFsdWUpOwogICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IHZhbCA9IFRyaWNreTo6Z2V0RGVmYXVsdCgpKTsKICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgc3RhdGljIGludCBnZXREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBlbnVtIHsgcHJpdmF0ZXZhbHVlID0gMjAwIH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFsc28gYnVncyBpbiByZXNvbHZpbmcgc3ltYm9scyBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlCiAgICAgICAgICAgIChwcm9iYWJseSBmaXhhYmxlIHRob3VnaCk6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBjbGFzcyBLbGFzcyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgS2xhc3MgY29uc3RydWN0b3JjYWxsKGNvbnN0IEtsYXNzJiBrID0gS2xhc3MoKSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGFwcHJvYWNoIGFsc28gZG9lcyBub3Qgd29yayBmb3Igc3RhdGljYWxseSB0eXBlZCBsYW5ndWFnZXMgKEMjIGFuZCBKYXZhKQogICAgICAgICAgICBhcyB0aGVzZSBsYW5ndWFnZXMgZG8gbm90IGFsbG93IG1ldGhvZHMgdG8gaGF2ZSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgogICAgICAgICAgICBBbHRob3VnaCBDIyBoYXMgYSBtZWNoYW5pc20gdG8gcGFzcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgdGhleQogICAgICAgICAgICBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGFyZSBtb3JlIGxpa2UgdmFyYXJncy4KCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggc29sdmVzIHRoZSBhYm92ZSBwcm9ibGVtcyBhbmQgd3JhcHMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQuIFNvIFNXSUcgd2lsbCBub3cgdHJlYXQKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFzIGlmIGl0IGhhZCBwYXJzZWQ6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oKTsKCiAgICAgICAgICAgIFRoZSBjb2RlIGdlbmVyYXRlZCBpcyB0aGVuIGV4YWN0bHkgdGhlIHNhbWUgYXMgaWYgU1dJRyBoYWQgcGFyc2VkIHRoZSB0d28KICAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2RzLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlcyBjb3VudCB0aGUgYXJndW1lbnRzIHBhc3NlZCBhbmQgY2FsbAogICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLCBqdXN0IGxpa2Ugb3ZlcmxvYWRlZCBtZXRob2RzLiBDIyBhbmQgSmF2YSBhcmUgbm93IGFibGUKICAgICAgICAgICAgdG8gcHJvcGVybHkgd3JhcCBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYnkgZ2VuZXJhdGluZyBleHRyYSBtZXRob2RzLAogICAgICAgICAgICBhZ2FpbiBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLCBzbyBmb3I6CgogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzPSJoZWxsbyIsIGRvdWJsZSBkPTEwLjAsIGludCBpPTApOwoKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwcm94eSBtZXRob2RzIGFyZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzLCBkb3VibGUgZCwgaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMpOwogICAgICAgICAgICAgIHZvaWQgYmFyKCk7CgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIGNvbWVzIHdpdGggYSBjb3VwbGUgb2YgbWlub3Iga25vY2sgb24gZWZmZWN0cy4KCiAgICAgICAgICAgIDEpIFNXSUcgc3VwcG9ydCBmb3IgZGVmYXVsdCBhcmd1bWVudHMgZm9yIEMgKG5vdCBDKyspIGNvZGUgbm8gbG9uZ2VyIHdvcmtzLgogICAgICAgICAgICBQcmV2aW91c2x5IHlvdSBjb3VsZCBoYXZlIHRoaXMgaW50ZXJmYWNlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZSB3cmFwcGVkIG1ldGhvZCBmcm9tIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGFuZCBwYXNzIG5vIGFyZ3VtZW50cwogICAgICAgICAgICB3aGVyZXVwb24gdGhlIGRlZmF1bHQgb2YgMCB3YXMgdXNlZC4gWW91IGNhbiBnZXQgdGhlIHNhbWUgYmVoYXZpb3VyIGZvciBDCiAgICAgICAgICAgIGNvZGUgYnkgdXNpbmcgdGhlICJkZWZhdWx0IiB0eXBlbWFwOgoKICAgICAgICAgICAgICAldHlwZW1hcChkZWZhdWx0KSBpbnQgdmFsICIkMSA9IDA7IjsKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CgogICAgICAgICAgICBvciB5b3UgY291bGQgb2YgY291cnNlIGNvbXBpbGUgeW91ciBjb2RlIGFzIEMrKyBpZiB5b3Ugd2FudCBDKysgZmVhdHVyZXMgOikgOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgQSBjb3VwbGUgb2YgU1dJRydzIGxpYnJhcmllcyB1c2VkIHRoaXMgQyBleHRlbnNpb24gYW5kIHRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZAogICAgICAgICAgICB0byB1c2UgdGhlICJkZWZhdWx0IiB0eXBlbWFwLiBUaGUgImRlZmF1bHQiIHR5cGVtYXAgaXMgdGh1cyB1bmNoYW5nZWQgKGFuZCBzdGlsbAogICAgICAgICAgICBpcyBub3QgYW5kIGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQgYnkgQyMgYW5kIEphdmEsIGFuZCBpcyBsaWtlbHkgdG8gcmVtYWluIHNvKS4KCgogICAgICAgICAgICAyKSBBbGwgZmVhdHVyZXMgKCVmZWF0dXJlLCAlcmVuYW1lLCAlaWdub3JlIGV0Yykgbm8gbG9uZ2VyIHdvcmsgYXMgaWYgdGhlIG1ldGhvZAogICAgICAgICAgICB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGlzIGp1c3Qgb25lIG1ldGhvZC4gRm9yIGV4YW1wbGUsIHByZXZpb3VzbHkKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKCiAgICAgICAgICAgIHdvdWxkIGhhdmUgaWdub3JlZCB0aGUgbWV0aG9kIGNvbXBsZXRlbHkuIE5vdyBpdCB3aWxsIG9ubHkgaWdub3JlIGZvbyhpbnQpIGJ1dAogICAgICAgICAgICBub3QgdGhlIGV4dHJhIGZvbygpIG1ldGhvZC4gSW5zdGVhZCB1c2U6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vOwoKICAgICAgICAgICAgdG8gaWdub3JlIHRoZW0gYWxsLiBvcgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CgogICAgICAgICAgICBUaGlzIG9mIGNvdXJzZSBhbGxvd3Mgb25lIHRvIGZpbmUgdHVuZSB0aGUgd3JhcHBpbmcsIGZvciBleGFtcGxlIG9uZSBjb3VsZCB1c2U6CgogICAgICAgICAgICAgICVyZW5hbWUoZm9vaW50KSBmb28oaW50KTsKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2RlZmF1bHRzKSBmb28oKTsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlbSBmcm9tIGFueSBsYW5ndWFnZSBsaWtlIHNvOgoKICAgICAgICAgICAgICBmb29pbnQoMjAwKQogICAgICAgICAgICAgIGZvb2RlZmF1bHRzKCkKCiAgICAgICAgICAgIG9yIGZvciBleGFtcGxlIGlnbm9yZSB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2QsIHNvIHRoZSBkZWZhdWx0cyBjYW5ub3QgYmUgdXNlZDoKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTAvMi8yMDA0OiBtbWF0dXMKCSAgIFtQeXRob25dCgkgICAtIE1vcmUgY2xlYW5pbmcgdXAgYW5kIHVuaWZvcm1hdGlvbiBvbiB0aGUgUHl0aG9uIExpYgoKCSAgIC0gQWRkZWQgUm9iaW4ncyBkb2NzdHJpbmcgcGF0Y2gsIHBsdXMgc29tZSBmaXhlcywgcGx1cwoJICAgICBzb21lIGV4dGVuc2lvbnMsIHNlZSBhdXRvZG9jLmkgZXhhbXBsZSBpbiB0aGUgdGVzdC1zdWl0ZSwKCSAgICAgYW5kIHRyeSB1c2luZyAlZmVhdHVyZSgiYXV0b2RvYyIsImV4dGVuZGVkIikuCgkgICAgCgkgICAgIFRoaXMgcGF0Y2ggaXMgbm90IGEgY29tcGxldGUgc29sdXRpb24gZm9yIHRoZQoJICAgICBkb2N1bWVudGF0aW9uIHByb2JsZW0sIGp1c3QgZW5vdWdoIHRvIGluZm9ybSBweXRob24gYWJvdXQKCSAgICAgdGhlIHBhcmFtZXRlciBsaXN0LgoKCSAgICAgVGhlIGV4cGVjdGVkIHN3aWcgZG9jdW1lbnRhdGlvbiBzdXBwb3J0IGlzIGZhciBmYXIgYXdheSB5ZXQuCgkgICAgIAoKMTAvMS8yMDA0OiBtbWF0dXMKCSAgIC0gRml4IHRoZSAlY2FsbGJhY2sgZmVhdHVyZSAob25seSB1c2VkIGluIHJ1YnkgYW5kIHB5dGhvbiBleGFtcGxlcywKCSAgICAgYnkgbm93LCBidXQgaXQgc2hvdWxkIGJlIGdlbmVyaWMpLCBub3cgbWVtYmVyIGNhbGxiYWNrcwoJICAgICBhcmUgd29ya2luZyBhZ2FpbgoJICAgICAKCSAgIC0gRml4IHdyYXBwaW5nIG9mIGZ1bmN0aW9ucyBwb2ludGVycyBsaWtlCgoJCSBzdGQ6Om9zdHJlYW0mIHN0ZDo6ZW5kbChzdGQ6Om9zdHJlYW0mKTsKCgkgICAgIGllLCB0aGUgb25lcyB0aGF0IHJldHVybiByZWZlcmVuY2VzIG9yIGVudW1zLgoJIAoJICAgW1B5dGhvbl0gQWRkIHRoZSAlcHl0aG9uY2FsbGJhY2sgZGlyZWN0aXZlLCB3aGljaCBpcyAKCSAgIGFuIGltcHJvdmVkIHZlcnNpb24gb2YgJWNhbGxiYWNrLCBpZSwKCgkgICAgICVweXRob25jYWxsYmFjaygxKSBmb287CgkgICAgICVweXRob25jYWxsYmFjaygxKSBBOjpiYXI7CgkgICAgICVweXRob25jYWxsYmFjaygxKSBBOjpiYXJtOwoKCSAgICAgaW50IGZvbyhpbnQgYSkgewoJICAgICAgICAgcmV0dXJuIGE7CgkgICAgIH0KICAKCSAgICAgc3RydWN0IEEgCgkgICAgIHsKCSAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgYSk7CgkgICAgICAgaW50IGJhcm0oaW50IGEpOwoKCSAgICAgfTsKCiAgICAgICAgICAgICBpbnQgZm9vYmFyKGludCBhLCBpbnQgKCpwZikoaW50IGEpKTsKCgkgICBpbiBweXRob24geW91IGNhbiB1c2UKCiAgICAgICAgICAgICBmb28oMikKCSAgICAgZm9vYmFyKDIsZm9vKQogICAgICAgICAgICAgQS5iYXIoMikKCSAgICAgZm9vYmFyKDIsQS5iYXIpCiAgICAgICAgICAKICAgICAgICAgICBpZSwgbm8gYWRkaXRpb25hbCBwb2ludGVyIGVsZW1lbnRzIGFyZSBjcmVhdGVkLCBhbmQKCSAgIHRoZSBvcmlnaW5hbCAnZm9vJyBhbmQgJ0EuYmFyJyBjYW4gYmUgdXNlZCBhcyBwYXJhbWV0ZXJzLgoKCSAgIEluIHRoZSBjYXNlIG9mIG1lbWJlciBmdW5jdGlvbiBob3dldmVyLCBzdGlsbCB5b3UgbmVlZAoJICAgdG8gdXNlIHRoZSBzcGVjaWFsIHZhcmlhYmxlIENsYXNzOjo8Zm5jX25hbWU+X2NiX3B0ciwgaWU6CgogCSAgICAgZm9vYmFybSgzLCBhLCBBLmJhcm1fY2JfcHRyKQoJICAgCgkgICB3ZSB3aWxsIHRyeSB0byBmaXggdGhpcyBzaXR1YXRpb24gYWxzbywgYnV0IGxhdGVyLiAgCgoJICAgW1B5dGhvbl0gQWRkIG1vcmUgZWxlbWVudHMgZnJvbSB0aGUgU1RMIGxpYnJhcnksIG5vdwoJICAgeW91IGNhbiB1c2UKCgkgICAgIGltcG9ydCBzdGQKCSAgICAgc3RkLmNvdXQgPDwgImhlbGxvICIgPDwgMTIzIDw8IHN0ZC5lbmRsCgoJICAgW1B5dGhvbl0gRml4IGluL291dCByZXR1cm4gbWVjaGFuaXNtLCBub3cgc3dpZyB3aWxsIGJlaGF2ZQoJICAgYXMgMS4zLjIxIGJ1dCB1c2luZyBhIHB5dGhvbiBsaXN0IHdoZW4gbmVlZGVkLiBUaGUgcHJvYmxlbQoJICAgaXMgdGhhdCB0aGUgdHlwZXMgc3RkOjpwYWlyLHN0ZDo6dmVjdG9yLGV0YywgdXNlIHR1cGxlcywKCSAgIGFuZCB0aGV5IGludGVyZmVyIHdpdGggdGhlIHByZXZpb3VzIGlub3V0IHR1cGxlIHR5cGUuCgoJICAgQnkgdXNpbmcgbGlzdHMgd2Ugc29sdmUgdGhlIGNvbmZsaWN0cywgc3dpZyBhY3RzIGFzIGJlZm9yZSwKCSAgIGJ1dCByZXR1cm5zIGEgbGlzdCB3aGVuIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyIGFyZSB1c2luZwoJICAgdGhlIE9VVCB0eXBlbWFwLiBTZWUgdGhlIG5ldyBpbm91dC5pIGV4YW1wbGUgaW4gdGhlCgkgICB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgkJICAgCiAgICAgICAgICAgW1B5dGhvbl0gTXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIGJhZCBhcmd1bWVudHMsIG5vdwoJICAgeW91IGFsd2F5cyBnZXQgdGhlIGFyZ3VtZW50IG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCgowOS8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIC0KICAgICAgICAgICAgMSkgV2FybmluZyBlbWl0dGVkIHdoZW4gLWltcG9ydGFsbCBhbmQgLWluY2x1ZGVhbGwgaXMgdXNlZCB0b2dldGhlciwKICAgICAgICAgICAgICAgd2l0aCAtaW5jbHVkZWFsbCB0YWtpbmcgcHJlY2VkZW5jZS4KICAgICAgICAgICAgMikgRW5zdXJlIFNXSUdJTVBPUlRFRCBpcyBhbHdheXMgZGVmaW5lZCB3aGVuIGEgZmlsZSBpcyBiZWluZwogICAgICAgICAgICAgICBpbXBvcnRlZCB3aXRoICVpbXBvcnQuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBTV0lHSU1QT1JULAogICAgICAgICAgICAgICB3aGljaCBnZXRzIGRlZmluZWQgaW4gYWxsIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGVzLgoKMDkvMjYvMjAwNDogbW1hdHVzCgoJICAgIC0gYWRkICVmZWF0dXJlKCJleGNlcHRpb25jbGFzcyIpIHRvIGlkZW50aWZ5IGEgY2xhc3MgdXNlZAoJICAgICAgYXMgZXhjZXB0aW9uLiBCZWZvcmUgc3dpZyBpZGVudGlmaWVkIGFuZCBtYXJrZWQgYSBjbGFzcwoJICAgICAgdXNpbmcgdGhlICJjcGx1czpleGNlcHRpb25jbGFzcyIgYXR0cmlidXRlLiBIb3dldmVyLCB0aGUKCSAgICAgIGNsYXNzIG5lZWRlZCB0byBhcHBlYXIgb24gYW4gdGhyb3coKSBzdGF0ZW1lbnQuICBOb3cKCSAgICAgIHN3aWcga2VlcHMgdHJ5aW5nIHRvIGlkZW50aWZ5IHRoZSBleGNlcHRpb24gY2xhc3NlcywgYXMKCSAgICAgIGJlZm9yZSwgYnV0IGl0IGFsc28gYWxsb3dzIHRoZSB1c2VyIHRvIG1hcmsgYSBjbGFzcyBieQoJICAgICAgdXNpbmcgdGhlICVmZWF0dXJlIGV4cGxpY2l0bHkuIChtb3N0bHkgcmVsZXZhbnQgZm9yCgkgICAgICBweXRob24gYW5kIGNoaWNrZW4pCgoJICAgIFtQeXRob25dCgoJICAgIC0gZml4IC1tb2Rlcm4gb3B0aW9uICsgZXhjZXB0aW9ucywgd2hpY2ggbWl4IG9sZCBjbGFzcwoJICAgICAgc3R5bGUgd2l0aCB0aGUgbmV3IG9uZS4gU28sIHdlIGFsd2F5cyBuZWVkIHRvIGVtaXQKCSAgICAgIHRoZSAibm9ubW9kZXJuIiBweXRob24gY29kZS4KCgkgICAgLSBhZGQgdGhlICJweXRob246bm9uZHluYW1pYyIgZmVhdHVyZSBhbmQgaXRzIGhhbmRsZXIKCgkgICAgICBub3cgaWYgeW91IGhhdmUKCSAgICAgIAoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWMgQTsKCSAgICAgIAoJICAgICAgc3RydWN0IEEgewoJICAgICAgIGludCBhOwoJICAgICAgIGludCBiOwoJICAgICAgfTsKCgkgICAgICB0aGVuLCBpbiB0aGUgcHl0aG9uIHNpZGUKCSAgICAgIAoJICAgICAgYWEgPSBBKCkKCSAgICAgIAoJICAgICAgYWEuYSA9IDEgIyBvawoJICAgICAgYWEuYiA9IDIgIyBvawoJICAgICAgYWEuYyA9IDMgIyBlcnJvciwgdGhlIGNsYXNzIGNhbiBub3QgYmUgZXh0ZW5kZWQgZHluYW1pY2FsbHkuCgoJICAgIAoJICAgIFNpbmNlIHRoaXMgaXMgYSBmZWF0dXJlLCB5b3UgY2FuIHVzZQoKCSAgICAgICVweXRob25ub25keW5hbWljOwoKICAgICAgICAgICAgb3IgCgoJICAgICAgJXB5dGhvbmR5bmFtaWM7IFsgTm90ZTogJXB5dGhvbmR5bmFtaWMgc2luY2UgZGVwcmVjYXRlZCBdCiAgIAoJICAgIHRvIGZvcmNlIGFsbCB0aGUgd3JhcHBlZCBjbGFzc2VzIHRvIGJlICJub25keW5hbWljIiBvbmVzLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcmVndWxhciBweXRob24sIGlzIHRoYXQgYWxsIHRoZSB3cmFwcGVkCgkgICAgY2xhc3NlcyBhcmUgZHluYW1pY3MuIFNvLCBjYXJlZnVsIHdpdGggeW91ciBzcGVsbGluZy4KCjA5LzE0LzIwMDQ6IG1tYXR1cyAKCSAgICAtIFN1cHBvcnQgdGhlIC1JLSBvcHRpb24uCgoJICAgIC0gRGlmZmVyZW50aWF0ZSBiZXR3ZWVuICVpbmNsdWRlIDxmaWxlPiBhbmQgJWluY2x1ZGUgImZpbGUiLgoJICAgICAgVGhpcyBmaXggc2V2ZXJhbCBjb3JuZXIgY2FzZXMuCgoJICAgIAoJICAgIFtQeXRob25dIFNldmVyYWwgcGF0Y2hlczoKCgkgICAgLSBOb3JtYWxpemUgdGhlIExpYiBmaWxlIG5hbWVzOiAKCQkqLnN3ZyBpbnRlcm5hbCBmaWxlcywgCgkJKi5pICAgdXNlciBmaWxlcy4KCgkgICAgLSBGaXggQ2hhcltBTlldIHR5cGVtYXBzLCBzbyB0aGV5IGFsc28gZGVsZXRlIGFueSBleHRyYSAnXDAnIGNoYXJzLAoJICAgICAgbm93IHRoZXkgYmVoYXZlIGFzIGJlZm9yZSAoMS4zLjIxKS4gU3RpbGwsIHlvdSBjYW4gdXNlCgkgICAgICB0aGUgU1dJR19QUkVTRVJWRV9DQVJSQVlfU0laRSBtYWNybyBpZiB5b3UgbmVlZCB0bwoJICAgICAgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHNpemUgKHNlZSBweXN0cmJhc2Uuc3dnKS4KCgkgICAgLSBBZGQgdGhlIENoYXIgRklYU0laRVtBTlldIHR5cGVtYXBzLCB0byBwcmVzZXJ2ZSB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBDIGFycmF5IHNpemVzIChzZWUgYWJvdmUpLiBUaG91Z2gsIHlvdSBjYW4ndAogICAgICAgICAgICAgIHVzZSB0aGVtIHlldCBzaW5jZSAlYXBwbHkgYW5kIGFycmF5cyBhcmUgbm90IHdvcmtpbmcKICAgICAgICAgICAgICB0b2dldGhlci4KCiAgICAgICAgICAgIC0gQWRkIHB5ZnJhZ21lbnRzLnN3Zywgbm93IHRoZSB1c2VyIGNhbiBhZGQgZnJhZ21lbnRzCgkgICAgICB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvbmVzLgoKMDkvMTAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSB3aGljaCBmaXhlcyBzcHVyaW91cyBwcmVwcm9jZXNzb3IgYnVnIHdoaWNoCiAgICAgICAgICAgIHNob3dzIG9uIFNvbGFyaXMgYW5kIGdjYywgZWc6CiAgICAgICAgICAgICAgICBXYXJuaW5nKDIwMik6IENvdWxkIG5vdCBldmFsdWF0ZSAnIWRlZmluZWQoU1dJR0pBVkEpICYmCiAgICAgICAgICAgICAgICAhKGRlZmluZWQoU1dJR0NTSEFSUCknCiAgICAgICAgICAgIEFsc28gZml4ZXMgYSBidWcgd2hlcmUgJyNpZiAiYSIgPT0gImIiID09IDEnIHdvdWxkbid0IGhhdmUgd29ya2VkIAoKMDkvMTAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUmVzdG9yZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgZm9yIHRoZSB0ZXN0LXN1aXRlLiBQYXRjaCBmcm9tCiAgICAgICAgICAgIEJpbGwgQ2xhcmtlLgoKMDkvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG1pc3NpbmcgcnVudGltZS5kc3AgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGVzIGZvciB0aGUKICAgICAgICAgICAgaW1wb3J0IGV4YW1wbGVzIHRvIHdvcmsuCgoKVmVyc2lvbiAxLjMuMjIgKFNlcHRlbWJlciA0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgc3dpZy5tNCBtYWNybyBmb3IgdXNlIHdpdGggdGhlIEF1dG9jb25mL0F1dG9tYWtlL0xpYnRvb2wgaGFzCiAgICAgICAgICAgIGJlZW4gcmVtb3ZlZCBhbmQgaXMgbm8gbG9uZ2VyIGluc3RhbGxlZC4gUGxlYXNlIHVzZSB0aGUgbmV3IGFuZCBiZXR0ZXIKICAgICAgICAgICAgbWFpbnRhaW5lZCB2ZXJzaW9uIGRlcml2ZWQgZnJvbSBzd2lnLm00IGluIHRoZSBBdXRvY29uZiBtYWNybyBhcmNoaXZlLgogICAgICAgICAgICBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19wa2dfc3dpZy5odG1sIGFuZAogICAgICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3B5dGhvbl9kZXZlbC5odG1sLgoKMDkvMDEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgcGF0Y2ggIzEwMTk2NjkgZnJvbSBDaHJpc3RvcGggRmxhbW0uIEFkZHMgc3VwcG9ydAogICAgICAgICAgICBmb3IgJWZlYXR1cmUoInNoYWRvdyIpIGluIHRoZSBzYW1lIHdheSBhcyBpdCB3b3JrcyBpbiBQeXRob24uIFRoaXMKICAgICAgICAgICAgZW5hYmxlcyBvbmUgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCBzaGFkb3cvcHJveHkgbWV0aG9kcywgaW5jbHVkaW5nCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAvKiBMZXQncyBtYWtlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MgU3F1YXJlIG1vcmUgdmVyYm9zZSAqLwoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikgU3F1YXJlKGRvdWJsZSB3KQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBzdWIgbmV3IHsKICAgICAgICAgICAgICAgICAgbXkgJHBrZyA9IHNoaWZ0OwogICAgICAgICAgICAgICAgICBteSAkc2VsZiA9IGV4YW1wbGVjOjpuZXdfU3F1YXJlKEBfKTsKICAgICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJDb25zdHJ1Y3RlZCBhbiBAe1tyZWYoJHNlbGYpXX1cbiI7CiAgICAgICAgICAgICAgICAgIGJsZXNzICRzZWxmLCAkcGtnIGlmIGRlZmluZWQoJHNlbGYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgIGNsYXNzIFNxdWFyZSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgU3F1YXJlKGRvdWJsZSB3KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgowOC8zMS8yMDA0OiBtbWF0dXMgCgkgICAgW1B5dGhvbl0gSW5jb21wYXRpYmlsaXR5IHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlIChsbGliQGNvbXB1dGVyLm9yZyk6CgkgICAgCgkgICAgSWYgeW91IGFyZSB1c2luZyBTdW4gU3R1ZGlvIDggKGFuZCBwb3NzaWJseSBlYXJsaWVyCgkgICAgdmVyc2lvbnMpIHRvIGNvbXBpbGUgdGhlIG91dHB1dCBwcm9kdWNlZCBieSBzd2lnCgkgICAgMS4zLjIycmMxLCBhbmQgeW91IGFyZSB1c2luZyBDKysgYW5kIFNUTCB0ZW1wbGF0ZXMgdGhlbgoJICAgIHlvdSBuZWVkIHRvIHVzZSBlaXRoZXIgIi1ydW50aW1lIiBvciAiLW5vcnVudGltZSIuICBJZiB5b3UKCSAgICB1c2UgbmVpdGhlciBvZiB0aGVzZSBvcHRpb25zIHRoZW4geW91IHdpbGwgcHJvYmFibHkgZ2V0CgkgICAgY29tcGlsZXIgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgdGhlIHdyYXBwZXIgZmlsZTsKCSAgICB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGxpa2UgdGhpczogVGhlIG5hbWUKCSAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UHRyWy4uLl0gaXMgdW51c2FibGUgaW4gc3RhdGljCgkgICAgc3dpZ3B5Ojp0cmFpdHNfYXNwdHJbLi4uXSAgSWYgeW91IGdldCB0aGlzIGVycm9yIG1lc3NhZ2UsCgkgICAgeW91IG5lZWQgdG8gcmVnZW5lcmF0ZSB5b3VyIHdyYXBwZXIgZmlsZSB1c2luZyAnc3dpZwoJICAgIC1ydW50aW1lJyBvciAnc3dpZyAtbm9ydW50aW1lJy4KCgkgICAgWW91IHNob3VsZG4ndCBnZXQgdGhpcyBwcm9ibGVtIHdpdGggU3VuIFN0dWRpbyA5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgkgICAgCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkICM5MzIzMzMgZnJvbSBJa2VnYW1pIFRzdXRvbXUuIEZpeGVzIGxvbmcgbG9uZyAqT1VUUFVUCiAgICAgICAgICAgIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgKk9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjODU3MzQ0IGZyb20gQXJ0IFllcmtlcy4gV29ya2Fyb3VuZCBmb3IgYXV0b2NvbmYgYnVnIHdoZW4KICAgICAgICAgICAgcnVubmluZyAnbWFrZSBpbnN0YWxsJy4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBQYXJ0IG9mIHBhdGNoICM5ODI3NTMgYXBwbGllZC4gVGhpcyBpbXBsZW1lbnRzIGEgJXBlcmxjb2RlIGRpcmVjdGl2ZS4KICAgICAgICAgICAgSXQgYWxsb3dzIG9uZSB0byBhZGQgUGVybCBjb2RlIHRvIHRoZSBnZW5lcmF0ZWQgLnBtIGZpbGUuIFdvcmtzIHRoZSBzYW1lIAogICAgICAgICAgICBhcyAlcHl0aG9uY29kZS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9ycyB3aGVuIHdyYXBwaW5nIHZpcnR1YWwgbWV0aG9kcyB3aXRoIGV4Y2VwdGlvbgogICAgICAgICAgICBzcGVjaWZpY2F0aW9ucyB0aGF0IHdlcmUgbm90IHNpbXBsZSB0eXBlcy4gUHJldmlvdXNseSBjb2RlIHdhcyBnZW5lcmF0ZWQgdGhhdAogICAgICAgICAgICBkaWRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUgd2hlbiB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gd2FzIGEgcG9pbnRlci4KCjA4LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVHlwZW1hcCBmaXggZm9yIG1ldGhvZHMgdGhhdCByZXR1cm4gY2hhciAqLiBUaGUgQ0xSIHdvdWxkIGluY29ycmVjdGx5CiAgICAgICAgICAgIGRlbGV0ZSB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgY2hhciAqLiBBbHNvIGFwcGxpZWQgdGhlIHNhbWUgY29ycmVjdGlvbiB0bwogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB0eXBlbWFwcy4KCjA4LzI0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAtZm1pY3Jvc29mdCBlcnJvci93YXJuaW5nIG1lc3NhZ2UgZGlzcGxheTogCiAgICAgICAgICAgIC0gRW5kIG9mIGZpbGUgKEVPRikgd2FybmluZyBtZXNzYWdlcyBub3QgZGlzcGxheWluZyBpbiBjb3JyZWN0IGZvcm1hdAogICAgICAgICAgICAtIFNvbWUgbWVzc2FnZXMgY29udGFpbmluZyBhIGZpbGUgcGF0aCB3ZXJlIGRpc3BsYXlpbmcgYSBkb3VibGUgYmFja3NsYXNoCiAgICAgICAgICAgICAgaW5zdGVhZCBvZiBhIHNpbmdsZSBiYWNrc2xhc2gKCjA4LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzEwMTE2MDQgc3VibWl0dGVkIGJ5IENoYXJsZXMgU2Nod2lldGVycy4gRml4IGZvciA2NCBiaXQgdGNsCiAgICAgICAgICAgIGludGVycHJldGVycy4KCjA4LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgYnVnICM4NzU1ODMgLSBlbnVtIGZvcndhcmQgZGVjbGFyYXRpb25zIHByZXZpb3VzbHkgZ2F2ZSBhIHN5bnRheCBlcnJvci4KCjA4LzIzLzIwMDQ6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHR5cGVtYXBzICJmZml0eXBlIiBhbmQgImxpc3B0eXBlIiB0byBkZXRlcm1pbmUgdGhlIEZGSSB0eXBlCgkgICAgc3BlY2lmaWVycyBmcm9tIHRoZSBDIHR5cGUuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlLCBmb3IgaW5zdGFuY2UsIHRvIGNvbnRyb2wKCSAgICB3aGV0aGVyIGEgQyAiY2hhciIgYXJndW1lbnQgdGFrZXMgYSBMaXNwIGNoYXJhY3RlciBvciBhIExpc3AgaW50ZWdlciB2YWx1ZS4KCSAgICBUaGUgZGVmYXVsdCAodGFraW5nIExpc3AgY2hhcmFjdGVycykgaXMgZG9uZSBieSB0aGVzZSBidWlsdC1pbiB0eXBlbWFwczoKCSAgICAgICV0eXBlbWFwKGZmaXR5cGUpIGNoYXIgIjpjaGFyIjsgJXR5cGVtYXAobGlzcHR5cGUpIGNoYXIgImNoYXJhY3RlciI7CgkgICAgSWYgY2hhciBtZWFucyBhbiBpbnRlZ2VyIGluc3RlYWQsIHVzZSB0aGVzZSB0eXBlbWFwczoKCSAgICAgICV0eXBlbWFwKGZmaXR5cGUpIGNoYXIgIjpjaGFyIjsgJXR5cGVtYXAobGlzcHR5cGUpIGNoYXIgImludGVnZXIiOwoKMDgvMjIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXMgZGlzY3Vzc2VkIGluIGJ1ZyAjNzcyNDUzLCB0aGUgU1dJRyBsaWJyYXJ5IGRpcmVjdG9yeSBpcyBub3cgaW5zdGFsbGVkCiAgICAgICAgICAgIGludG8gYSBkaWZmZXJlbnQgZGVmYXVsdCBkaXJlY3RvcnkuIFRoZSBsaWJyYXJ5IHVzZWQgdG8gYmUgaW5zdGFsbGVkIHRvCiAgICAgICAgICAgIC91c3IvbG9jYWwvbGliL3N3aWcxLjMuIEl0IGlzIG5vdyBpbiB0aGUgbW9yZSB1c3VhbCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQKICAgICAgICAgICAgZGlyZWN0b3J5IGFuZCBJIGhhdmUgYWRkaXRpb25hbGx5IHVzZWQgYSB2ZXJzaW9uIHNwZWNpZmljIHN1YmRpcmVjdG9yeSBhcwogICAgICAgICAgICB0aGUgbGlicmFyeSB3aWxsIHJhcmVseSB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgU1dJRy4gVGhpcyByZWxlYXNlCiAgICAgICAgICAgIHdpbGwgdGh1cyB1c2UgL3Vzci9sb2NhbC9zaGFyZS9zd2lnLzEuMy4yMiBieSBkZWZhdWx0LCB3aGljaCBjYW4gYmUKICAgICAgICAgICAgdGFpbG9yZWQgYXMgYmVmb3JlIHVzaW5nICcuL2NvbmZpZ3VyZSAtLXN3aWdsaWJkaXInLgoKMDgvMTcvMjAwNDogbWtvZXBwZQoJICAgIFtNelNjaGVtZV0gQWRkIHN1cHBvcnQgdG8gY3JlYXRlIG5hdGl2ZSBNelNjaGVtZSBzdHJ1Y3R1cmVzIGZyb20gQyBzdHJ1Y3R1cmVzLgoJICAgIFRvIGNvbnZlcnQgYSBDIHN0cnVjdHVyZSB0byBhbiBNelNjaGVtZSBzdHJ1Y3R1cmUsIHVzZSB0aGUgbmV3IHJ1bnRpbWUgbWFjcm8KCSAgICBTV0lHX05ld1N0cnVjdEZyb21QdHIgaW4gYSB0eXBlbWFwLiAgUGF0Y2ggZnJvbSBEbWl0cml5IFphdmluLiAKCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4Mzc3MTUgZnJvbSBCZW4gUmVzZXIgdG8gY29ycmVjdGx5IGRldGVjdCBQeXRob24gbGliIGRpcmVjdG9yeQogICAgICAgICAgICBvbiA2NCBiaXQgc3lzdGVtcy4KCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gdGhlIGNhc2Ugb2YgZWFybHkgcmV0dXJuCiAgICAgICAgICAgIGZyb20gd3JhcHBlciBtZXRob2RzIHVzaW5nIGNvbnN0IHN0ZDo6c3RyaW5nICYgcGFyYW1ldGVycy4gTW9kaWZpZWQKICAgICAgICAgICAgTWFyayBUcmF1ZHQgcGF0Y2ggIzk1MTU2NS4KCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1ZyAjOTQzNzgzIHdpdGggcGF0Y2ggZml4ZXMgcGhwIGNoYXIgKiBvdXQgdHlwZW1hcCBOVUxMIHZhbHVlcy4KCjA4LzAzLzIwMDQ6IEFobW9uIERhbmN5ICA8ZGFuY3lAZGFuY3k+CgogICAgICAgICAgICBbYWxsZWdyb2NsXSBBZGRpdGlvbmFsIGNhc2UgbW9kZSBmaXhlcy4gIEFsc28sIG1ha2Ugc3VyZQoJICAgIGZvcmVpZ24gdHlwZXMgYXJlIGV4cG9ydGVkLgoKMDcvMjQvMjAwNDogbWtvZXBwZSAKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgU1dJRyBtb2R1bGVzIG5vdyBleGNoYW5nZSB0aGVpciBwb2ludGVyIHR5cGUKCSAgICBpbmZvcm1hdGlvbiB2aWEgdGhlIEd1aWxlIGludGVycHJldGVyLiAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBidWlsZCBhCgkgICAgcnVudGltZSBsaWJyYXJ5IG9yIHRvIHVzZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBldGMuCgkgICAgCgkgICAgVGhlIG1vZHVsZSAoU3dpZyBzd2lncnVuKSB3aGljaCB3YXMgaW50cm9kdWNlZCBpbiB0aGUgY2hhbmdlIG9mIDA1LzE3LzIwMDQgaXMKCSAgICBubyBsb25nZXIgYXV0b21hdGljYWxseSBidWlsdC4gIElmIHlvdSBuZWVkIGl0LCBydW4gU1dJRyBvbiB0aGUgaW50ZXJmYWNlIGZpbGUKCSAgICBzd2lncnVuLmkuIAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBCdWcgIzkxNzYwMSBNYXBwaW5nIEMrKyBib29sIGZpeCBmcm9tIE1hcmsgVHJhdWR0CgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSUE0gZml4ZXMgZm9yIGxhdGVzdCBDVlMgdmVyc2lvbiBpbmNsdWRpbmcgcmVtb3ZhbCBvZiBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcnkuCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjOTA4OTU1IGZyb20gUm9iZXJ0IEggRGUgVnJpZXMuCiAgICAgICAgICAgIFJQTSBmaWxlIGdlbmVyYXRpb24gZml4IGZvciBGZWRvcmUgQ29yZSAxIGFuZCBSZWRoYXQgQVMyLjEuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODY0Njg5IGZyb20gUm9iaW4gRHVubjoKCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggY29ycmVjdHMgdHdvIHByb2JsZW1zIGluIHRoZSBYTUwgb3V0cHV0IG9mIFNXSUc6CiAgICAgICAgICAgICAKICAgICAgICAgICAgICAxLiBUaGVyZSB3ZXJlIG9mdGVuIGV4dHJhICcvPlxuJyBpbiB0aGUgb3V0cHV0LgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDIuIHZhbHVlIGF0dHJpYnV0ZXMgd2VyZSBvdXRwdXQgd2l0aCAnXG4nIGluIHRoZW0gYnV0CiAgICAgICAgICAgICAgc2luY2UgdGhhdCBpcyBub3QgdGVjaG5pY2FsbHkgbGVnYWwgbW9zdCAoYWxsPykgWE1MCiAgICAgICAgICAgICAgcGFyc2VycyB3aWxsIHN0cmlwIHRoZW0gb3V0LiBSZXBsYWNpbmcgdGhlICdcbicgd2l0aAogICAgICAgICAgICAgIHRoZSAnJiMxMDsnIGVudGl0eSByZWZlcmVuY2Ugc29sdmVzIHRoaXMgYXMgdGhhdCBpcwogICAgICAgICAgICAgIGxlZ2FsIGFuZCBYTUwgcGFyc2VycyB3aWxsIGNvbnZlcnQgaXQgdG8gYSAnXG4nIHdoZW4KICAgICAgICAgICAgICByZWFkaW5nIHRoZSB2YWx1ZXMgYmFjayBpbi4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBUaGlzIHBhdGNoIGFsc28gYWRkcyBhIG5ldyBnbG9iYWwgY29tbWFuZCBsaW5lIG9wdGlvbgogICAgICAgICAgICAgIHRoYXQgd2lsbCBhbGxvdyB0aGUgcGFyc2UgdHJlZSB0byBiZSB3cml0dGVuIG91dCBpbiBYTUwKICAgICAgICAgICAgICAqYWZ0ZXIqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlIGhhcyBiZWVuIHJ1biwgaW4KICAgICAgICAgICAgICBvcmRlciB0byBiZSBhYmxlIHRvIGdldCBleHRyYSBpbmZvIHRoYXQgdGhlIGxhbmd1YWdlCiAgICAgICAgICAgICAgbW9kdWxlIHB1dHMgaW4gdGhlIHRyZWUuIEluIHRoaXMgd2F5IHRoZSBYTUwgaXMgYQogICAgICAgICAgICAgIHBvc3QtcHJvY2Vzc2VkIHZlcnNpb24gb2YgdGhlIHRyZWUgcmF0aGVyIHRoYW4gYQogICAgICAgICAgICAgIHByZS1wcm9jZXNzZWQgdmVyc2lvbi4gCiAKICAgICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9uIGlzIC1kdW1wX3htbCBvciAteG1sb3V0IDxmaWxlPgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIHRvIGZpeCB0eXBlc2FmZSBlbnVtcyBhbmQgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIHdpdGggZGlyZWN0b3JzLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgSFRNTCBkb2N1bWVudGF0aW9uIChtYWtlY2hhcC5weSkgZmlsZSBnZW5lcmF0b3IgbWlzc2luZyBlbmQgb2YgbGluZQogICAgICAgICAgICBwYXRjaCAjOTA4OTUxIGZyb20gUm9iZXJ0IGRlIFZyaWVzLgoKMDcvMDgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGRlcHJlY2F0ZWQgcnVudGltZSBsaWJyYXJ5IGJ1aWxkIGhhcyBiZWVuIHJlbW92ZWQuIFRoaXMgYWxzbyByZW1vdmVzCiAgICAgICAgICAgIHRoZSBkZXBlbmRlbmN5IG9uIExpYnRvb2wuIExpYnRvb2wgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGJ1aWxkIFNXSUcuCiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIC1sZGZsYWdzIFNXSUcgY29tbWFuZGxpbmUgb3B0aW9uIGhhcyBhbHNvIGJlZW4gcmVtb3ZlZC4KCiAgICAgICAgICAgIFRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSB0ZXN0Y2FzZXMgdGhhdCB1c2VkIHRoZSBydW50aW1lIGxpYnJhcnkgaGF2ZQogICAgICAgICAgICBiZWVuIHVwZGF0ZWQgdG8gdXNlIHRoZSByZXBsYWNlbWVudCBhcHByb2FjaCB0byB1c2luZyBTV0lHIGFjcm9zcyAKICAgICAgICAgICAgbXVsdGlwbGUgbW9kdWxlcywgdGhhdCBpcyB0aGV5IHVzZSB0aGUgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgY29tbWFuZGxpbmUKICAgICAgICAgICAgb3B0aW9ucywgc2VlIE1vZHVsZXMuaHRtbC4gRWZmZWN0aXZlbHkgdGhleSBidWlsZCB0aGVpciBvd24gcnVudGltZQogICAgICAgICAgICBsaWJyYXJpZXMgdXNpbmcgLXJ1bnRpbWUuIFRoZSBleGFtcGxlcyBhcmUgaW1wb3J0IGFuZCBpbXBvcnRfdGVtcGxhdGUuCiAgICAgICAgICAgIFRoZSB0ZXN0IGNhc2VzIGFyZSBpbiB0aGUgaW1wb3J0cyBhbmQgdGVtcGxhdGVfdHlwZWRlZl9pbXBvcnQgZGlyZWN0b3JpZXMuCgogICAgICAgICAgICBBbnlvbmUgd2hvIHdhbnRzIHRoZSBvcmlnaW5hbCBydW50aW1lIGxpYnJhcmllcyBjYW4gZWl0aGVyIHJ1biB0aGUgdGVzdC1zdWl0ZQogICAgICAgICAgICBvciBidWlsZCB0aGUgZXhhbXBsZXMgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2hhcmVkIG9iamVjdC9ETEwgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgd2l0aCB0aGUgLXJ1bnRpbWUgY29tbWFuZGxpbmUgb3B0aW9uLiBGb3IgZXhhbXBsZSBsaWJpbXBvcnRzX3J1bnRpbWUuc28KICAgICAgICAgICAgKFB5dGhvbiBjYWxscyBpdCBsaWJfaW1wb3J0c19ydW50aW1lLnNvKSBpcyBnZW5lcmF0ZWQgYWZ0ZXIgcnVubmluZyB0aGUgCiAgICAgICAgICAgICdtYWtlIGltcG9ydHMubXVsdGljcHB0ZXN0JyB0ZXN0Y2FzZSBpbiB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS88bGFuZz4KICAgICAgICAgICAgZGlyZWN0b3J5LiBPciB1c2UgbGlicnVudGltZS5zbyAvIHJ1bnRpbWUuZGxsIGFmdGVyIGJ1aWxkaW5nIHRoZSBpbXBvcnQKICAgICAgICAgICAgZXhhbXBsZXMgaW4gRXhhbXBsZXMvPGxhbmc+L2ltcG9ydC4KCjA3LzA3LzIwMDQ6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gQ29udmVydCBjaGFyYWN0ZXIgYW5kIHN0cmluZyBsaXRlcmFscyBpbiBjb25zdGFudHMgdG8gCgkgICAgQ0wgc3ludGF4LiAgRml4IEZGOkRFRi1GT1JFSUdOLUNBTEwgZm9yIG1peGVkLWNhc2UgQyBmdW5jdGlvbnMuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTmV3IGZlYXR1cmUgZm9yIEphdmEgZXhjZXB0aW9ucyB3aXRoIGZvcm1hdCAlamF2YWV4Y2VwdGlvbihleGNlcHRpb25jbGFzc2VzKS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGEgc2xpZ2h0IGVuaGFuY2VtZW50IHRvICVleGNlcHRpb24gYW5kIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIAogICAgICAgICAgICBhZGRpdGlvbiBvZiB0aGUgZXhjZXB0aW9uIGNsYXNzZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBpbnRvIGEgdGhyb3dzIGNsYXVzZS4KICAgICAgICAgICAgVGhlICdleGNlcHRpb25jbGFzc2VzJyBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgd2hpY2ggd2lsbCBiZQogICAgICAgICAgICBhZGRlZCB0byB0aGUgYXNzb2NpYXRlZCBwcm94eSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLiBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnCiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgbGlrZSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMgaW4gdGhlICd0aHJvd3MnIGF0dHJpYnV0ZSBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcHMuIFRoaXMgZmVhdHVyZSBzaG91bGQgYmUgdXNlZCBmb3IgY29ycmVjdGx5IGhhbmRsaW5nIGNoZWNrZWQgZXhjZXB0aW9ucwogICAgICAgICAgICB0aHJvd24gZnJvbSBKTkkgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVqYXZhZXhjZXB0aW9uKCJqYXZhLmxhbmcuRXhjZXB0aW9uIikgdGhyb3dFeGNlcHRpb24gJXsKICAgICAgICAgICAgICAgIC4uLiBjb252ZXJ0IGEgc3RkOjpsb2dpY19lcnJvciBpbnRvIGEgamF2YS5sYW5nLkV4Y2VwdGlvbiB1c2luZyBKTkkgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkZXhjZXB0PgogICAgICAgICAgICAgIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJMb2dpYyBlcnJvciEiKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGEgbWV0aG9kIHdpdGggYSB0aHJvd3MgY2xhdXNlIGluIHRoZSBtb2R1bGUgY2xhc3M6CgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsgLi4uIH0KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3ICVjc2NvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBUaGlzIHdvcmtzIHRoZSBzYW1lIHdheSBhcyAlamF2YWNvbnN0dmFsdWUuIEZvciBDIywgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICAgaXMgdGhlIG9ubHkgd2F5IHRoYXQgb25lIGNhbiBmaXggd3JhcHBpbmcgb2YgQy9DKysgZW51bXMgd2l0aCBwcm9wZXIgQyMKICAgICAgICAgICAgZW51bXMgaWYgdGhlIGVudW0gaXRlbSdzIGluaXRpYWxpc2VyIGNhbm5vdCBjb21waWxlIGFzIEMjIGNvZGUuIFRoaXMgaXMKICAgICAgICAgICAgYmVjYXVzZSBKYXZhIGVudW1zIGNhbiB1c2UgYSBjYWxsIGludG8gQyBjb2RlIHRvIGluaXRpYWxpc2UgdGhlIGVudW0gaXRlbSwKICAgICAgICAgICAgd2hlcmVhcyBpbiBDIywgdGhlIGVudW0gdmFsdWUgbXVzdCBiZSBhIGNvbXBpbGUgdGltZSBjb25zdGFudC4gVGhhdCBpcywKICAgICAgICAgICAgdXNpbmcgJWNzY29uc3QoMCkgY2Fubm90IGJlIHVzZWQgaW4gQyMgdG8gaW5pdGlhbGlzZSB0aGUgQyMgZW51bSBpdGVtIHZpYQogICAgICAgICAgICBhIFBJTlZPS0UgY2FsbC4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgJWphdmFjb25zdHZhbHVlKHZhbHVlKSBmZWF0dXJlIGRpcmVjdGl2ZSBmb3IgdXNlIHdpdGggY29uc3RhbnRzIGFuZAogICAgICAgICAgICBlbnVtcy4gU29tZXRpbWVzIHRoZSB1c2Ugb2YgJWphdmFjb25zdCgxKSB3aWxsIHByb2R1Y2UgY29kZSB0aGF0IHdvbid0IGNvbXBpbGUKICAgICAgICAgICAgdW5kZXIgSmF2YS4gSWYgYSBjb21waWxlIHRpbWUgY29uc3RhbnQgaXMgcmVxdWlyZWQsICVqYXZhY29uc3QoMCkgaXMgbm90IGFuCiAgICAgICAgICAgIG9wdGlvbi4gVGhlICVqYXZhY29uc3R2YWx1ZSBkaXJlY3RpdmUgYWNoaWV2ZXMgdGhpcyBnb2FsIGFuZCB0aGUgdmFsdWUgc3BlY2lmaWVkCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZCBhcyBKYXZhIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgY29uc3RhbnQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKTsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoMTAwMCkgQklHOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgibmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKFwiMjAwMFwiKSIpIExBUkdFOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMCkgYmFyOwogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFyID0gMTA7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgICAjZGVmaW5lIEJJRyAxMDAwTEwKICAgICAgICAgICAgICAgICNkZWZpbmUgTEFSR0UgMjAwMFVMTAogICAgICAgICAgICAgICAgZW51bSBGb28geyBCQVIgPSA6OmJhciB9OwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBHZW5lcmF0ZXM6CgogICAgICAgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgZXhhbXBsZUNvbnN0YW50cyB7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gMTAwMDsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgTEFSR0UgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoIjIwMDAiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbyBCQVIgPSBuZXcgRm9vKCJCQVIiLCAxMCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBQcmV2aW91c2x5LCBub25lIG9mIEJJRywgTEFSR0Ugb3IgQkFSIHdvdWxkIGhhdmUgcHJvZHVjZWQgY29tcGlsYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGVuaGFuY2VtZW50cy4gRmVhdHVyZXMgY2FuIG5vdyB0YWtlIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYXR0cmlidXRlcwogICAgICAgICAgICBpbiBhZGRpdGlvbiB0byB0aGUgZmVhdHVyZSBuYW1lIGFuZCBmZWF0dXJlIHZhbHVlLiBUaGUgYXR0cmlidXRlcyBhcmUgb3B0aW9uYWwgCiAgICAgICAgICAgIGFuZCBhcmUgbXVjaCB0aGUgc2FtZSBhcyB0aGUgdHlwZW1hcCBhdHRyaWJ1dGVzLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwogICAgICAgICAgICBzcGVjaWZpZXMgdHdvIG9wdGlvbmFsIGF0dHJpYnV0ZXMsIGF0dHJpYjEgYW5kIGF0dHJpYjI6CgogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZSAidmFsIjsKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCB2YWwsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZTsKCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgdGhlIHN5bnRheCB0aGF0IHRha2VzIHRoZSBmZWF0dXJlIHZhbHVlIHdpdGhpbiB0aGUKICAgICAgICAgICAgJWZlYXR1cmUoKSBicmFja2V0cy4gVGhlIHZhbHVlIHNwZWNpZmllZCBpcyBubyBsb25nZXIgcmVzdHJpY3RlZCB0byBiZWluZyBqdXN0CiAgICAgICAgICAgIGEgc3RyaW5nLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIuIEZvciBleGFtcGxlLCB0aGlzIGlzIG5vdyBhY2NlcHRhYmxlCiAgICAgICAgICAgIHN5bnRheDoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLDIwLjApOwogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQgaGF2ZSB0byBoYXZlIGJlZW46CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwiMjAuMCIpOwogICAgICAgICAgICBVc2VmdWwgZm9yIGZlYXR1cmVzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFzIGEgbWFjcm8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgICNkZWZpbmUgJXNvbWVmZWF0dXJlKHZhbHVlKSAgICAgICVmZWF0dXJlKCJzb21lZmVhdHVyZSIsdmFsdWUpCiAgICAgICAgICAgIFRoZXNlIHdpbGwgbm93IHdvcmsgYWNjZXB0aW5nIGVpdGhlciBhIHN0cmluZyBvciBhIG51bWJlcjoKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoIkZyZWQiKTsKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoNCk7CgowNi8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW4sIEd1aWxlXQogICAgICAgICAgICAgLSBDcmVhdGVkIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL3NjaGVtZXJ1bm1lIGRpcmVjdG9yeSwgd2hpY2ggaG9sZHMgYWxsIHRoZQoJICAgICAgIHJ1bm1lIHNjcmlwdHMgZm9yIGd1aWxlIGFuZCBjaGlja2VuIChhbmQgcG9zc2libHkgbXpzY2hlbWUuLi4pLiAgVGhlIGd1aWxlCgkgICAgICAgYW5kIGNoaWNrZW4gX3J1bm1lIGZpbGVzIHRoZW4gKGxvYWQgIi4uL3NjaGVtZXJ1bm1lL2Zvby5zY20iKS4KICAgICAgICAgICAgIC0gSW4gY2hpY2tlbiBtb2R1bGUsIGZpeCBhIGZldyBidWdzIGludmxvbHZpbmcgZHluYW1pYyBjYXN0cy4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIHRvIGZpeCB3cmFwcGluZyBvZiB0ZW1wbGF0ZWQgbWV0aG9kcy4gSVNPIGNvbXBsaWFudCBjb21waWxlcnMsIGxpa2UKICAgICAgICAgICAgQ29tZWF1IGFuZCBHQ0MtMy40LjAsIGRvbid0IGxpa2UgdGhlIHRlbXBsYXRlIHNwZWNpZmllciB0aGF0IFNXSUcgd2FzIGdlbmVyYXRpbmcKICAgICAgICAgICAgd2hlbiBjYWxsaW5nIHRoZSBtZXRob2QuIFRoaXMgZml4IG1heSBicmVhayBzb21lIG5vbiBzdGFuZGFyZCBjb21wbGlhbnQgY29tcGlsZXJzLAogICAgICAgICAgICBmb3IgZXhhbXBsZSwgU3VuIHdvcmtzaG9wIGNvbXBpbGVycyBwcmlvciB0byB2ZXJzaW9uIDYuMi5wMi4gUGF0Y2ggc3VibWl0dGVkCiAgICAgICAgICAgIGJ5IEJpbGwgQ2xhcmtlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBVbmRvY3VtZW50ZWQgc3BlY2lhbCB2YXJpYWJsZSAkaW1jbGFzc25hbWUgcmVtb3ZlZC4KICAgICAgICAgICAgTmV3IHNwZWNpYWwgdmFyaWFibGUgJG1vZHVsZSBpcyByZXBsYWNlZCBieSB0aGUgbW9kdWxlIG5hbWUsIGFzIHNwZWNpZmllZAogICAgICAgICAgICBieSAlbW9kdWxlIG9yIC1tb2R1bGUgY29tbWFuZGxpbmUgb3B0aW9uLiAkaW1jbGFzc25hbWUgY2FuIGJlIGNyZWF0ZWQgZnJvbSAkbW9kdWxlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTYW1lIGFzIGZvciBKYXZhIGJlbG93LiBUaGUgbmV3IHR5cGVtYXBzIGFyZSBuYW1lZCBkaWZmZXJlbnRseSwgbmFtZWx5LAogICAgICAgICAgICBjc2JvZHkgYW5kIGNzYm9keV9kZXJpdmVkLiBUaGUgZGVwcmVjYXRlZCB0eXBlbWFwcyBhcmUgY3NnZXRjcHRyIGFuZAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUeXBlbWFwIGNoYW5nZXMgZm9yIHRoZSBKYXZhIHByb3h5IC8gdHlwZXdyYXBwZXIgYW5kIGVudW0gY2xhc3Nlcy4gQSBuZXcKICAgICAgICAgICAgdHlwZW1hcCBjYWxsZWQgamF2YWJvZHkgY29udGFpbnMgdGhlIGVzc2VudGlhbCBzdXBwb3J0IGNvZGUgZm9yIGdlbmVyYXRpb24gaW50byB0aGUgYm9keQogICAgICAgICAgICBvZiB0aGVzZSBjbGFzc2VzLiBUaGVyZSBpcyBhbHNvIGEgbmV3IGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcCB3aGljaCBpcyB1c2VkIGluc3RlYWQgZm9yCiAgICAgICAgICAgIHdyYXBwZWQgY2xhc3NlcyB0aGF0IGhhdmUgYSB3cmFwcGVkIGJhc2UgY2xhc3MuIFRoZSBjb2RlIGlzIGJhc2ljYWxseSwgdGhlIGdldENQdHIoKQogICAgICAgICAgICBtZXRob2QgYW5kIHN3aWdDUHRyIGFuZCBzd2lnQ01lbU93biBtZW1iZXIgdmFyaWFibGVzLiBUaGVzZSB1c2VkIHRvIGJlIGhhcmQgY29kZWQKICAgICAgICAgICAgd2l0aCBubyB3YXkgdG8gbW9kaWZ5IHRoZSBjb2RlLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoaXMgdHlwZW1hcCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgICAgdGhlIHVzZXIgdG8gdGFpbG9yIG5lYXJseSBldmVyeSBhc3BlY3Qgb2YgdGhlIGNvZGUgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBub3cgaXMgdGhlIGNvZGUgZm9yIGRpcmVjdG9yIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgYW5kIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyB0eXBlbWFwcyBhcmUgZGVwcmVjYXRlZCBhbmQgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciB1c2VkIGFzIHRoZSBjb2RlIHRoYXQgdGhlc2UgZ2VuZXJhdGVkIGNhbiBiZSBwdXQgaW4gdGhlIG1vcmUgZmxleGlibGUKICAgICAgICAgICAgamF2YWJvZHkgYW5kIGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwgbWF5IGhlbHAgeW91IHVwZ3JhZGUgaWYgeW91IGhhdmUgdXNlZAogICAgICAgICAgICB0aGUgamF2YWdldGNwdHIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICAvKiBVdGlsaXR5IG1hY3JvIGZvciBtYW5pcHVsYXRpbmcgdGhlIEphdmEgYm9keSBjb2RlIG1ldGhvZCBhdHRyaWJ1dGVzICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIENUT1JfQVRUUklCLCBHRVRDUFRSX0FUVFJJQikKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5KSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN3aWdDTWVtT3duOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzd2lnQ01lbU93biA9IGNNZW1vcnlPd247CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keV9kZXJpdmVkKSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKCRtb2R1bGVKTkkuU1dJRyRqYXZhY2xhc3NuYW1lVXBjYXN0KGNQdHIpLCBjTWVtb3J5T3duKTsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFRoZSBkZWZhdWx0IGlzIHByb3RlY3RlZCBnZXRDUHRyLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoU1dJR1RZUEUsIHByb3RlY3RlZCwgcHJvdGVjdGVkKQoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19HRVRDUFRSKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHJvdGVjdGVkLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwdWJsaWMgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0JPRFlNRVRIT0RTKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHVibGljLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MgbW9kaWZpZXIgdHlwZW1hcHMgYW5kIHByYWdtYXMgaGF2ZSBjaGFuZ2VkLgogICAgICAgICAgICBUaGV5IG11c3Qgbm93IGluY2x1ZGUgdGhlIGNsYXNzIHR5cGUuIFByZXZpb3VzbHkgJ2NsYXNzJyB3YXMgaGFyZCBjb2RlZC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBmbGV4aWJpbGl0eSBpbnRvIHdoYXQgdHlwZSBvZiBjbGFzcyBpcyBnZW5lcmF0ZWQsCiAgICAgICAgICAgIGZvciBleGFtcGxlIHRoZSBwcm94eSBjbGFzcyBjb3VsZCBiZSBhbiBpbnRlcmZhY2UgaW5zdGVhZCBvZiBhIGNsYXNzLgoKICAgICAgICAgICAgRm9yIEphdmEgdGhpcyBhZmZlY3RzIHRoZSBqYXZhY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBGb3IgQyMgdGhpcyBhZmZlY3RzIHRoZSBjc2NsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBVbmxlc3MgeW91IGhhdmUgb3ZlcnJpZGRlbiB0aGUgZGVmYXVsdCB2ZXJzaW9ucyBvZiB0aGVzZSB0eXBlbWFwcyBvciBwcmFnbWFzLCB5b3UKICAgICAgICAgICAgc2hvdWxkbid0IGJlIGFmZmVjdGVkLiBIb3dldmVyLCBpZiB5b3UgaGF2ZSwgdXBncmFkaW5nIGlzIGVhc3ksIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCIKCiAgICAgICAgICAgIG11c3Qgbm93IGJlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwgY2xhc3MiCgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHRoYXQgYXJlIHJlZmVyZW5jZXMuIFByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgT3JlbiBNaWxsZXIuIEFsc28gaW1wcm92ZXMgdGhlIGdlbmVyYXRlZCBleGNlcHRpb24gZGVjbGFyYXRpb25zIGluIHRoZQogICAgICAgICAgICBjYXRjaCBoYW5kbGVyIGZvciBwb2ludGVycyAtIGEgcG9pbnRlciBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWZlcmVuY2UgdG8KICAgICAgICAgICAgYSBwb2ludGVyLiBBZGRlZCBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgJiwgU1dJR1RZUEUgKiBhbmQKICAgICAgICAgICAgU1dJR1RZUEVbQU5ZXSAoSmF2YSBhbmQgQyMpLgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIG1pbm9yIHR5cGVzYWZlIGVudW0gaW1wcm92ZW1lbnRzLCBpbmNsdWRpbmcgc3RvcmluZyB0aGUgbmFtZSBvZgogICAgICAgICAgICB0aGUgZW51bSBpdGVtLiBUaGUgdG9TcmluZygpIC8gVG9TdHJpbmcoKSBtZXRob2RzIGFyZSBvdmVycmlkZGVuIHRvIHJldHVybiB0aGlzIG5hbWUuCgowNS8zMC8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICAtIFVwZGF0ZSBob3cgZXhhbXBsZXMgYW5kIHRoZSB0ZXN0IHN1aXRlIGFyZSBidWlsdC4KCSAgICAgLSBTeW1ib2wgbmFtZXMgYXJlIG5vIGxvbmdlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZQoJICAgICAtIEFkZGVkIHVuaW9uX3J1bm1lLnNzLCB3aGljaCB3YXMgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBndWlsZSBtb2R1bGUKCjA1LzI2LzIwMDQ6IGxiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIENvbW1pdHRlZCBvbiBiZWhhbGYgb2YgTWFyY2VsbyAod2hvIHN0aWxsIGhhcyBwcm9ibGVtcyB3aXRoIAoJICAgIHRoZSBTb3VyY2VGb3JnZSBDVlMuKQoKCSAgICBBZGRlZCBQeXRob24gdHlwZW1hcHMgZm9yIEZJTEUqIHdpdGggKFB5dGhvbi1vbmx5KSB0ZXN0LgoKNS8yNC8yMDA0OiAgZGFuY3kKCgkqIEFsbGVncm8gQ0wgbW9kdWxlOiAgTm93IHVzaW5nIHNvbWUgbWFjcm9zIChkZWZpbmVkIGluCglMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2cpLCBzd2lnLWRlZmNvbnN0YW50IGFuZCBzd2lnLWRlZnVuLCBmb3IKCWRlZmluaW5nIGNvbnN0YW50cyBhbmQgZm9yZWlnbiBmdW5jdGlvbnMuICBUaGlzIG1ha2VzIHRoZQoJZ2VuZXJhdGVkIGZpbGUgYSBiaXQgbmVhdGVyLiAgICAKCglOb3cgc3RyaXBzIGEgbGF5ZXIgb2YgcGFyZW50aGVzaXMgZnJvbSBjb25zdGFudHMuCgoJVXNlcyAoKiA6dm9pZCkgaW5zdGVhZCBvZiA6Zm9yZWlnbi1hZGRyZXNzIG5vdy4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFVubmFtZWQgZW51bSBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3cgc3VwcG9ydGVkIGluIGFkZGl0aW9uCiAgICAgICAgICAgIHRvIHRoZSByZWNlbnRseSBhZGRlZCBzdXBwb3J0IGZvciB1bm5hbWVkIGVudW0gbWVtYmVyIHZhcmlhYmxlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMSwgZW51bTIgfSBNZW1iZXJJbnN0YW5jZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTMsIGVudW00IH0gR2xvYmFsSW5zdGFuY2U7CgogICAgICAgICAgICBUaGUgaW50IHR5cGVtYXBzIGFyZSB1c2VkIGZvciB3cmFwcGluZyB0aGUgZ2V0L3NldCBhY2Nlc3NvciBtZXRob2RzLgogICAgICAgICAgICBJZiB0aGUgc2l6ZW9mIGFuIGVudW0gaXMgbm90IHRoZSBzYW1lIHNpemUgYXMgYW4gaW50IHRoZW4gc2V0dGluZyB0aGUKICAgICAgICAgICAgdmFyaWFibGUgd2lsbCBzaWxlbnRseSBkbyBub3RoaW5nIGFzIHRoZSBjYXN0cyBjYW5ub3QgYmUgZWFzaWx5IGFuZCBwb3J0YWJseQogICAgICAgICAgICBnZW5lcmF0ZWQuIElmIHlvdSBuZWVkIHRvIHNvbHZlIHRoaXMgaGlnaGx5IG9ic2N1cmUgc2l0dWF0aW9uLCB3cml0ZQogICAgICAgICAgICB0aGUgYXNzaWdubWVudCB1c2luZyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlLgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDIyBlbnVtIHdyYXBwaW5nIG1vZHMuIFNpbWlsYXIgdG8gdGhlIEphdmEgbW9kdWxlLCBlbnVtcyBjYW4gYmUgd3JhcHBlZCB1c2luZwogICAgICAgICAgICBvbmUgb2YgMyBhcHByb2FjaGVzOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEMjIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWNzZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFtObyBpbXBsZW1lbnRhdGlvbiBkZWVtZWQgbmVjZXNzYXJ5IGZvciB0eXBlIHVuc2FmZSBlbnVtc10uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyBwcm9wZXIgQyMgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGVudW0gc3VwcG9ydCBhZGRlZC4gVGhlcmUgYXJlIG5vdyA0IHdheXMgaW4gd2hpY2ggZW51bXMgY2FuIGJlIHdyYXBwZWQ6CgogICAgICAgICAgICAxKSBQcm9wZXIgSmF2YSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgVHlwZSB1bnNhZmUgZW51bXMgKGNvbnN0YW50IGludGVnZXJzKSAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGV1bnNhZmUuc3dnIgogICAgICAgICAgICA0KSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWphdmFlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcHMgd2lsbCBoYW5kbGUgZW51bXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNwZWNpZmllZCBpbml0aWFsCiAgICAgICAgICAgIHZhbHVlcywgZm9yIGV4YW1wbGUgdGVuIGlzIHNwZWNpZmllZDoKCiAgICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyB6ZXJvLCB0ZW4oMTApIH07CgogICAgICAgICAgICBIb3dldmVyLCB0aGUgYW1vdW50IG9mIGdlbmVyYXRlZCBKYXZhIGNvZGUgY2FuIGJlIGN1dCBkb3duLCBieSBtb2RpZnlpbmcgdGhlc2UgdHlwZW1hcHMKICAgICAgICAgICAgaWYgbm9uZSBvZiB0aGUgZW51bXMgaGF2ZSBpbml0aWFsIHZhbHVlcyAocHJvcGVyIEphdmEgZW51bXMgYW5kIHR5cGVzYWZlIGVudW1zIGFwcHJvYWNoKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHR5cGVzYWZlIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGJ1ZyB1c2luZyAlcmVuYW1lIG9uIGVudW0gaXRlbXMgYW5kIHdoZW4gdXNpbmcKICAgICAgICAgICAgJWphdmFjb25zdCgxKSAvICVjc2NvbnN0KDEpCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShPYmopIE9iamVjdDsKICAgICAgICAgICAgICAgIGVudW0gR3JhbW1hciB7IFN1YmplY3QsIE9iamVjdCB9OwoKMDQvMjgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBNaW5vciBmaXhlcyB3aGVuIHVzaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgCiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzLCBqYXZhYmFzZSwgY3NpbnRlcmZhY2VzIGFuZCBjc2Jhc2UgdHlwZW1hcHMuCgowNS8xOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSlZNIGxpbmsgZmFpbHVyZSBvbiBzb21lIHN5c3RlbXMgZml4ZWQgd2hlbiB1c2luZyBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIEFsc28gYWRkcyBkZWZhdWx0IHZlY3RvciBjb25zdHJ1Y3RvciBmb3IgdXNlIGZyb20gSmF2YS4KCjA1LzE3LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCgkgICAgW0d1aWxlXSBOZXcgcnVudGltZSBmdW5jdGlvbnMgU1dJR19Qb2ludGVyQWRkcmVzcywKCSAgICBTV0lHX1BvaW50ZXJUeXBlLCBTV0lHX0lzUG9pbnRlck9mVHlwZSwgU1dJR19Jc1BvaW50ZXIuCgoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB3cmFwIHNldmVyYWwgU1dJRyBydW50aW1lIGZ1bmN0aW9ucwoJICAgIGFuZCBleHBvcnQgdGhlbSBpbnRvIHRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikuICBUaGUKCSAgICBydW50aW1lIG1vZHVsZSBpcyBub3cgYnVpbHQgd2l0aCAibW9kdWxlIiBsaW5rYWdlLgoKCSAgICBbR3VpbGVdIEdPT1BTIHByb3h5IG9iamVjdHMgbm93IGFsc28gcHJpbnQgdGhlIHBvaW50ZXIKCSAgICBhZGRyZXNzIG9mIHRoZSBDIG9iamVjdC4KCjA1LzE0LzIwMDQ6IGx5bGUKICAgICAgICAgICAgQWRkZWQgS291J3MgcGF0Y2ggZm9yIHRoZSBSdWJ5ICVpbXBvcnQgZGlyZWN0aXZlIHNvIHRoYXQgbW9kdWxlcwogICAgICAgICAgICB3aXRoICJuZXN0ZWQiIG5hbWVzIGFyZSBoYW5kbGVkIHByb3Blcmx5LiBDb25zaWRlciBhbiBpbnRlcmZhY2UKICAgICAgICAgICAgZmlsZSBmb28uaSB0aGF0IGhhcyB0aGlzICVtb2R1bGUgZGVjbGFyYXRpb24gYXQgaXRzIHRvcDoKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJtaXNjOjp0ZXh0Ojpmb28iCgogICAgICAgICAgICBOb3cgY29uc2lkZXIgYW5vdGhlciBpbnRlcmZhY2UgZmlsZSBzcGFtLmkgdGhhdCBpbXBvcnRzIGZvby5pOgoKICAgICAgICAgICAgICAgICVpbXBvcnQgZm9vLmkKICAgICAgICAgICAgCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIHBhdGNoLCB0aGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBzcGFtX3dyYXAuYzoKCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjOjp0ZXh0Ojpmb28iKTsKCiAgICAgICAgICAgIFdpdGggdGhpcyBwYXRjaCwgaG93ZXZlciwgeW91J2xsIGdldCB0aGUgY29ycmVjdCBwYXRoIG5hbWUKICAgICAgICAgICAgZm9yIHRoZSBjYWxsIHRvIHJiX3JlcXVpcmUoKSwgZS5nLgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2MvdGV4dC9mb28iKTsKCiAgICAgICAgICAgIFNlZSBTb3VyY2VGb3JnZSBCdWcgIzkyODI5OS4KCjA1LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZvciBlbWl0dGluZyBkaXJlY3RvcnMgd2hlbiAlZmVhdHVyZSgiZGlyZWN0b3IiKSBzcGVjaWZpZWQKICAgICAgICAgICAgZm9yIGEgY2xhc3Mgd2l0aCBubyB2aXJ0dWFsIG1ldGhvZHMsIGJ1dCBkb2VzIGhhdmUgYSB2aXJ0dWFsIGRlc3RydWN0b3IuCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBLZXZpbiBTbWl0aC4KCjA1LzA2LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgU1dJRyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVByZXR0eU5hbWUsIHdoaWNoIAoJICAgIHJldHVybnMgYW4gdW5tYW5nbGVkIHR5cGUgbmFtZSBmb3IgYSBzd2lnX3R5cGVfaW5mbwoJICAgIG9iamVjdC4gCgoJICAgIFtHdWlsZV06IFVzZSBpdCBmb3IgcHJpbnRpbmcgcG9pbnRlciBvYmplY3RzLgoKMDUvMDMvMjAwNDogIGRhbmN5IChBaG1vbiBEYW5jeSkKCgkqIExpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZzogIFVwZGF0ZWQgY29tbWVudHMgYWJvdXQgaWRlbnRpZmVyCgljb252ZXJzaW9uLiAgCgoJKiBTb3VyY2VzL01vZHVsZXMvYWxsZWdyb2NsLmN4eDogIFJlZ2lzdGVyIC9kZXYvbnVsbCBmb3IgImhlYWRlciIKCXRhcmdldC4gICBBbHNvLCBkaXNyZWdhcmQgImNvbnN0IiBxdWFsaWZpZXJzIGR1cmluZyB0eXBlCgljb252ZXJzaW9uLiAgCgoJCjA1LzAyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBGaXggYnVnIDc4MjQ2OC4KCSAgICBUbyBmaXggdGhpcyBidWcsIHRoZSBydW50aW1lIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuLCBhbmQKCSAgICBwb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGEgQ19TV0lHX1BPSU5URVJfVFlQRS4KCgkgICAgQ2hpY2tlbiB2ZXJzaW9uID4gMS40MCBpcyBub3cgcmVxdWlyZWQhCgoJICAgICogVHlwZW1hcCBpbmNvbXBhdGliaWxpdHk6ICB0eXBlbWFwcyBubyBsb25nZXIgdXNlIGNoaWNrZW5fd29yZHMuCgkgICAgICBJZiBhIHR5cGVtYXAgbmVlZHMgc29tZSBzcGFjZSwgaXQgc2hvdWxkIGp1c3QgY2FsbCBDX2FsbG9jCgoJICAgICogYXJnb3V0IHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgdGhlIC8qIGlmIE9ORSAqLyBjb25zdHJ1Y3QgdG8KCSAgICAgIGJ1aWxkIGFuIG91dHB1dCBsaXN0LiAgQSBTV0lHX0FQUEVORF9WQUxVRSBtYWNybywgZXhhY3RseSBsaWtlCgkgICAgICBndWlsZSBhbmQgbXpzY2hlbWUgaXMgbm93IHVzZWQuCgowNC8yNS8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiB0aGUgZ2VuZXJhdGVkIEdPT1BTIGNvZGUsIGRvbid0IGNyZWF0ZSBtZXRob2RzCgkgICAgdGhhdCB3b3VsZCBub3Qgc3BlY2lhbGl6ZSBhbnkgYXJndW1lbnRzOyBzaW1wbHkgcmUtZXhwb3J0CgkgICAgdGhlIHByaW1pdGl2ZSBmdW5jdGlvbnMuICAoVGhpcyBpcyBhIHBlcmZvcm1hbmNlCgkgICAgb3B0aW1pemF0aW9uIHdoaWNoIHJlZHVjZXMgbG9hZCB0aW1lIGFuZCBleGVjdXRpb24gdGltZS4pCgoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGZpeCB0aGUgInRvbyBtYW55IGluaXRpYWxpemVycyIgZXJyb3IKCSAgICB3aGljaCB3YXMgY2F1c2VkIGJ5IGFuIGluY29tcGF0aWJsZSBzd2lnX3R5cGVfaW5mbyBsYXlvdXQuCgoJICAgIFtHdWlsZV0gVGhlIHR5cGVtYXAgZm9yIEZJTEUgKiBpbiBwb3J0cy5pIG5vdyBhbHNvIGFjY2VwdHMKCSAgICBhIHJlZ3VsYXIgRklMRSAqIHBvaW50ZXIgb2JqZWN0LiAgQWxzbyBhIGJ1ZyB3aXRoIFNjaGVtZQoJICAgIGZpbGUgcG9ydHMgdGhhdCBhcmUgb3BlbiBmb3IgaW5wdXQgYW5kIG91dHB1dCBoYXMgYmVlbgoJICAgIGZpeGVkLiAKCjA0LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENoYW5nZSBlbnRyeSAwMy8yMS8yMDA0IHJldm9rZWQuIFRoZSBjaGFuZ2UgaW50cm9kdWNlZCBhbm90aGVyCiAgICAgICAgICAgIGluY29uc2lzdGVuY3kgKHJlZmVyZW5jZSB0eXBlbWFwcyBiZWluZ3MgdXNlZCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXIgdHlwZW1hcHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgYXMgd2VsbCBhcyBzdGF0aWMKICAgICAgICAgICAgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBmb3Igc29tZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGJ1dCBvbmx5IGZvciBDKysgYW5kIG5vdCBDKS4gVGhpcyB3b3VsZCBicmVhayB1c2VyJ3MgY3VycmVudAogICAgICAgICAgICB0eXBlbWFwcyBhbmQgaW50cm9kdWNlIGZ1cnRoZXIgaW5jb25zaXN0ZW5jaWVzLiBBbHRlcm5hdGl2ZQogICAgICAgICAgICBzb2x1dGlvbiByZXF1aXJlZCBhbmQgYmVpbmcgZGlzY3Vzc2VkLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBBZGRlZCB0aGUgLWRpcmVjdG9ycyBmbGFnLiBUaGlzIGVuYWJsZXMgdGhlIGRpcmVjdG9yCgkgICAgbW9kZSBmb3IgdGhlIGludGVyZmFjZSBhbmQgYWxsIHRoZSBjbGFzc2VzIHRoYXQKCSAgICBkb24ndCBzZXQgdGhlICJmZWF0dXJlOm5vZGlyZWN0b3IiIGV4cGxpY2l0bHkuCgoJICAgIFlvdSBjYW4gdXNlIHRoaXMgaW4geW91ciBtb2R1bGUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQoJICAgIGRpcmVjdG9yIGZlYXR1cmUgaW4gYWxsIHlvdXIgY2xhc3NlcywgYnV0IGl0IGlzIG1vc3QKCSAgICBpbnRlbmRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcywgbGlrZToKCgkgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCgkgICAgVGhlc2UgY29tbWFuZHMgd2lsbCBydW4gdGhlIGVudGlyZSB0ZXN0LXN1aXRlIHVzaW5nCgkgICAgZGlyZWN0b3JzLCBhbmQgbm90IG9ubHkgdGhlIHNwZWNpZmljICdkaXJlY3RvcnNfKicKCSAgICBjYXNlcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBmcm9tIHRpbWUgdG8gdGltZS4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gQWRkZWQgc3VwcG9ydCBmb3Igc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90LAoJICAgIGZvciBjb21waWxlciBhbmQgcHl0aG9uIHZlcnNpb25zIHRoYXQgc3VwcG9ydCB0aGVtLgoJICAgIAoJICAgIFdoZW4gbmVlZGVkLCB1c2UgCgoJICAgICAlaW5sY3VkZSBzdGRfc3RyaW5nLmkgICAgICAvLyAnY2hhcicgc3RyaW5ncwoJICAgICAlaW5sY3VkZSBzdGRfd3N0cmluZy5pICAgICAvLyAnd2NoYXJfdCcgc3RyaW5ncwoJICAgIAoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBGaXggdGhlIGRlZmF1bHQgYmVoYXZpb3VyIChzZWcuIGZhdWx0KSB3aGVuIGFuCgkgICAgaW5wbGFjZSBvcGVyYXRvciAoKz0sLT0sLi4uKSB3YXMgd3JhcHBlZCwgYXMgcmVwb3J0ZWQgYnkKCSAgICBMdWNyaXogKGx1Y3JpekBzaXRpbGFuZGlhLml0KSwgd2hlbiB0aGUgbW9zdCBjb21tb24KCSAgICBmb3JtIHdhcyB1c2VkOgoKICAgICAgICAgICAgICAgICAgIEEmICBBOjpvcGVyYXRvcis9KGludCBpKSB7IC4uLjsgcmV0dXJuICp0aGlzOyB9CiAgICAgICAgICAgICAgICAgIF5eXl4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KCSAgICAKCgkgICAgaWUsIGFuIG9iamVjdCBpcyByZXR1cm5lZCBhbmQgaXRzIGNvbnRhaW5zIHRoZSBzYW1lICd0aGlzJwoJICAgIHZhbHVlIHRoYW4gdGhlIGlucHV0IG9iamVjdCwgd2hpY2ggaXMgZGVsZXRlZCBhZnRlciB0aGUKCSAgICBvcGVyYXRpb24gImEgKz0gYiIsIGxlYXZpbmcgdGhlIHJlc3VsdCB3aXRoIG5vIHJlYWwKCSAgICBvYmplY3QsIGJ1dCBhIHNlZy4gZmF1bHQuCgoJICAgIFRvIGZpeCBpdCwgd2UgbmVlZGVkIHRvIGludHJvZHVjZSBhIG5ldyBmZWF0dXJlIGFuZCB1c2UgYW4KCSAgICBvbGQgb25lOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIpIEE6Om9wZXJhdG9yKz07CgkgICAgCgkgICAgaGVyZSwgInNlbGY6ZGlzb3duIiBkaXNhYmxlIHRoZSBvd25lcnNoaXAgb2YgdGhlICdzZWxmJwoJICAgIG9yIGlucHV0IG9iamVjdCwgYW5kIHRoZSAibmV3IiBmZWF0dXJlIHRyYW5zZmVycyB0aGUKCSAgICBvd25lcnNoaXAgdG8gdGhlIHJlc3VsdCBvYmplY3QuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUvc29sdXRpb24gY291bGQgYWxzbyBiZSB1c2VkIGluIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgdXNlIGdjIGFuZCBpbXBsZW1lbnQgdGhlIGlucGxhY2Ugb3BlcmF0b3JzLCBvciBvdGhlcgoJICAgIG9wZXJhdG9ycywgaW4gYSBzaW1pbGFyIHdheS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQeXRob24gTU9EVUxFICoqKgoKCSAgICBJZiB5b3UgYWxyZWFkeSBhcmUgdXNpbmcgdGhlIGlucGxhY2Ugb3BlcmF0b3JzIGluIHB5dGhvbiwKCSAgICBhbmQgeW91IGltcGxlbWVudGVkIHNvbWUga2luZCBvZiB3b3JrYXJvdW5kIHRvIHRoZSBwcm9ibGVtCgkgICAgZml4ZWQgaGVyZSwgaXQgaXMgcG9zc2libGUgeW91IGNvdWxkIGVuZCB3aXRoICdmcmVlJwoJICAgIG9iamVjdHMgdGhhdCBuZXZlciBnZXQgZGVsZXRlZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgYW5kCgkgICAgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGUgY3VycmVudCBmaXgsIHVzZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIsIiIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciLCIiKSBBOjpvcGVyYXRvcis9OwoKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEMrKyBlbnVtcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgaW50ZWdlcnMsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IAogICAgICAgICAgICBDIyBlbnVtcy4gRm9yIEV4YW1wbGUsIGdpdmVuIEMrKzoKCiAgICAgICAgICAgICAgICBlbnVtIEFuRW51bSB7IGZvbywgYmFyIH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIEFuRW51bSBBbkVudW1lcmF0aW9uOwogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bWVyYXRpb24gZik7CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgZW51bSBBbkVudW0gewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtIGYpIHsuLi59CgogICAgICAgICAgICBOb3RlIHRoYXQgYSBnbG9iYWwgZW51bSBsaWtlIEFuRW51bSBhYm92ZSBpcyBnZW5lcmF0ZWQgaW50byBpdHMgb3duCiAgICAgICAgICAgIGZpbGUgY2FsbGVkIEFuRW51bS5jcy4gRW51bXMgZGVmaW5lZCB3aXRoaW4gYSBDKysgY2xhc3MgYXJlIGRlZmluZWQKICAgICAgICAgICAgd2l0aGluIHRoZSBDIyBwcm94eSBjbGFzcy4gU29tZSBvZiB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZyBDIyBwcm94eQogICAgICAgICAgICBjbGFzc2VzIGFsc28gd29yayBmb3IgZW51bXMuIEZvciBleGFtcGxlIGdsb2JhbCBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbXBvcnRzKSB0byBhZGQgaW4gZXh0cmEgdXNpbmcgc3RhdGVtZW50cy4KCiAgICAgICAgICAgIEdsb2JhbCBlbnVtcyBhbmQgY2xhc3MgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIHRvIG1ha2UgdGhlIGVudW0gcHJpdmF0ZSwgcHVibGljIGV0Yy4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGVudW0gdHlwZSAoZW51bSBiYXNlKQoKICAgICAgICAgICAgSWYgd2UgYWRkIHRoaXMgZm9yIHRoZSBhYm92ZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIEFuRW51bSAicHJvdGVjdGVkIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSBBbkVudW0gImxvbmciCgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZW51bSBBbkVudW0gOiBsb25nIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZW1wdHkgZW51bXMsIGxpa2UKICAgICAgICAgICAgICAgIGVudW0gRm9vIHt9OwoKMDMvMjEvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtOb3RlOiB0aGlzIGNoYW5nZSByZXZva2VkIG9uIDA0LzI1LzIwMDRdCgkgICAgW1B5dGhvbl0gTWFrZXMgdGhlIGZvbGxvd2luZyAndmFyJyBjYXNlcyBtb3JlIHVuaWZvcm06CgogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2E7CiAKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHNhOwogICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgbm93IHRoZSB0aHJlZSB2YXJpYWJsZXMgKGdhLCBzYSwgbWEpIGNhbiBiZSBhc3NpZ25lZCBhczoKCgogICAgICAgICAgICAgICAgICBjdmFyLmdhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgQS5zYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIGEubWEgPSAiaGVsbG8iOwoKICAgICAgICAgICAgaWUsIG5vdyAnbWEnIHdpbGwgYWxzbyB1c2UgYSBzdGQ6OnN0cmluZyB0eXBlbWFwICdpbicgaWYKICAgICAgICAgICAgZGVmaW5lZCwgYmVmb3JlIGl0IHdhcyBvbmx5IGFjY2VwdGluZyBhICdwX3N0ZF9zdHJpbmcnCiAgICAgICAgICAgIHBvaW50ZXIuICBOb3RlLCBob3dldmVyLCB0aGF0ICdtYScgd2lsbCBub3QgdXNlIHRoZQogICAgICAgICAgICAndmFyaW4vdmFyb3V0JyB0eXBlbWFwcyAodGhhdCBwcm9iYWJseSBjb3VsZCBiZSBtb3JlCiAgICAgICAgICAgIG5hdHVyYWwpLCBidXQgaXQgd2lsbCBwaWNrIHVwIHRoZSAnaW4nIHR5cGVtYXAgZm9yIGNvbnN0CiAgICAgICAgICAgIHN0ZDo6c3RyaW5nJiAod2hpY2ggaXMgZWFzaWVyKS4KCgkgICAgVGhlIGNoYW5nZXMgaW4gY3dyYXAuYyBhbmQgbGFuZy5jeHggd2lsbCBwcm9iYWJseSBmaXggdGhlCgkgICAgYmVoYXZpb3VyIGluIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBvdmVybG9hZCB0aGUKCSAgICBtZW1iZXJ2YXJIYW5kbGVyIG1ldGhvZCAidG9vIG11Y2giLgogCiAgICAgICAgICAgIAowMy8yMS8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBEaXNhYmxpbmcgdGhlIGRlZmF1bHQgaW5zdGFudGlhdGlvbnMgbGlrZToKCgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8aW50LGludD47CgogICAgICAgICAgICBmb3IgYWxsIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIFNUTCBjb250YWluZXJzL2NsYXNzZXMuCgkgICAgVGhleSBhcmUgZXhwZW5zaXZlLCBzcGVjaWFsbHkgZm9yIHBhaXIgYW5kIG1hcCwgYW5kIHRoZQoJICAgIHByZXZpb3VzIGJlaGF2aW91ciBhbHNvIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHBlcmZvcm0KCSAgICBtYW51YWwgaW5zdGFudGlhdGlvbnMuIFN0aWxsLCBpZiB0aGUgc3BlZWQgZGlmZmVyZW5jZSBpcwoJICAgIG5vdCBpbXBvcnRhbnQsIGl0IGNhbiBiZSByZS1lbmFibGVkIGJ5IGRlZmluaW5nIHRoZSBtYWNybwoJICAgIFNXSUdfU1REX0RFRkFVTFRfSU5TVEFOVElBVElPTiAoc2VlIHN0ZF9jb21tb24uaSkuCgoJICAgIEFsc28sIG5vcm1hbGl6aW5nIHRoZSBJTlBVVC9PVVRQVVQvSU5PVVQgdHlwZW1hcHMuIE5vdwoJICAgIHRoZXkgdXNlIHRoZSBzYW1lIGNvbnZlcnNvcnMgdGhhbiB0aGUgcmVzdCBvZiB0aGUKCSAgICB0eXBlbWFwcywgYW5kIHlvdSBjYW4gdXNlIHRoZW0gZm9yIHN0ZDo6cGFpciwgc3RkOjpzdHJpbmcKCSAgICBhbmQgYWxsIHRoZSBvdGhlciBTVEwgdHlwZXMsIGxpa2UgaW46CgoJICAgICAgdm9pZCBwX2lub3V0ZChzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+ICpJTk9VVCk7CgoJICAgIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBhbmQgaW1wbGljaXQuaSBmaWxlcyB3aXRoIG1hY3JvcyB0bwoJICAgIHRyYW5zZm9ybSBmdW5jdGlvbnMgcGFpcnMgbGlrZSAnc2V0X3gnLydnZXRfeCcgCgkgICAgKG9yICdUJiB4KCknLydjb25zdCBUJiB4KCkgY29uc3QnKSBpbnRvIGFuIGF0dHJpYnV0ZSwKCSAgICBhbmQgYWxsb3dpbmcgdGhlIHVzZSBvZiBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgaW4gdHlwZW1hcHMKCSAgICAoc2VlIHRoZSBmaWxlcyBmb3IgbW9yZSBkZXRhaWxzKS4KCjAzLzIxLzIwMDQ6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmdzIG9mIGZ1bmN0aW9ucyB3aXRoCgkgICAgYW5vbnltb3VzIGFyZ3VtZW50cy4KCjAzLzE4LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIE1vcmUgZ2VuZXJhbCBzdGRfc3RyaW5nLmkgaW50ZXJmYWNlLgoJICAgIE5vdyB5b3UgY2FuIHdyYXAgaXQgdXNpbmcKCgkgICAgICAldGVtcGxhdGUoc3RyaW5nKSBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjsKCiAgICAgICAgICAgIGFuZCB1c2UgdGhlIHN0ZDo6c3RyaW5nIGFzIGEgYmFzZSBjbGFzczoKCgkgICAgICBzdHJ1Y3QgQSA6IHN0ZDo6c3RyaW5nIHsKICAgICAgICAgICAgICB9OwoKCSAgICBCdXQgbW9yZSBpbXBvcnRhbnQsIHN3aWcgd2lsbCByZWNvZ25pemUgCgkgICAgYm90aCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPiBhbmQgc3RkOjpzdHJpbmcgYXMKCSAgICB0aGUgc2FtZSB0eXBlLgoKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgUHJldmlvdXNseSBhZGRlZCwgYnV0IG5vdCBtZW50aW9uZWQgYmVmb3JlOgoKCSAgICAtIGZyaWVuZCBkZWNsYXJhdGlvbiBzdXBwb3J0LCBzd2lnIG5vdyBlbWl0cyBhIGdsb2JhbAoJICAgICAgZnVuY3Rpb24gaW4gdGhlIHNhbWUgY2xhc3Mgc2NvcGUuCgoJICAgIC0gcmVmL3VucmVmIGZlYXR1cmVzOiB0byBtaXggcmVmIGNvdW50aW5nIEMrKyBjbGFzc2VzCgkgICAgICBhbmQgbmF0aXZlIHNjcmlwdCByZWYgY291bnRpbmcgbWVjaGFuaXNtcyAobGlrZSBpbiBweXRob24pLgoJICAgIAoJICAgICAgVXNlIGl0IGxpa2U6CgogCSAgICAgICAgJWZlYXR1cmUoInJlZiIpICAgUkNPYmogIiR0aGlzLT5yZWYoKTsiCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgidW5yZWYiKSBSQ09iaiAiJHRoaXMtPnVucmVmKCk7IgoKCSAgICAgIEFuZCB0aGUgY2xhc3MgUkNPYmosIGFuZCBhbGwgdGhlIGRlcml2ZWQgb25lcywgd2lsbAoJICAgICAgcGVyZm9ybSB0aGUgcmlnaHQgcmVmL3VucmVmIGNhbGxzIHdoZW4gYSBuZXcgcG9pbnRlciAgCgkgICAgICBpcyByZXR1cm5lZCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLCBvciB3aGVuIHRoZSB0YXJnZXQKCSAgICAgIGxhbmd1YWdlIGF0dGVtcHRzIHRvIGRlbGV0ZSB0aGUgb2JqZWN0LgoJICAgICAgCgkgICAgICBTZWUgdGhlIHJlZmNvdW50LmkgZmlsZSBpbiB0aGUgdGVzdC1zdWl0ZSBmb3IgbW9yZQoJICAgICAgZGV0YWlscy4KCgkgICAgCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIFVzaW5nIHRoZSBuZXcgJWZyYWdtZW50IHN1cHBvcnQsIG1ham9yIHJld3JvdGUgCgkgICAgb2YgdGhlIHB5dGhvbiBzd2lnIGxpYnJhcnksIGluY2x1ZGluZzoKCgkgICAgLSBBbG1vc3QgYXV0b21hdGljIHRlbXBsYXRlL3R5cGVtYXAgaW5zdGFudGlhdGlvbiBmb3IKCSAgICAgIHRoZSBTVEwgY29tcG9uZW50cy4gRm9yIGV4YW1wbGUsIG5vdyB5b3UgY2FuIHdyaXRlOgoKCQkgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICAgIGFuZCBhIHNwZWNpYWxpemVkIHZlY3Rvcl9pIGNsYXNzIGlzIGVtaXR0ZWQgd2l0aCBhbGwKCSAgICAgIHRoZSBuZWVkZWQgdHlwZW1hcHMuIE5vIG5lZWQgdG8gdXNlIHRoZSBvbGQKCSAgICAgICdzcGVjaWFsaXplX3ZlY3RvcicgbWFjcm9zLgoKCSAgICAgIE5vdGUgeW91IGNhbiBhbHNvIGRlZmluZQoKCSAgICAgICAgICAldGVtcGxhdGUobWF0cml4X2kpICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+OwoJICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfcGlpKSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LGludD4gPjsKCgkgICAgLSBUaGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKIAkgCiAgICAgICAgICAgCSAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICBkZWZpbmVzIHRoZSB2ZWN0b3IgdHlwZW1hcHMsIGJ1dCBubyBwcm94eSBjbGFzcy4gRm9yIGFsbCB0aGUKICAgICAgICAgICAgICBmdW5kYW1lbnRhbCB0eXBlcywgdGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gYXJlCiAgICAgICAgICAgICAgZGVmaW5lZCwgc28sIHlvdSBjYW4gc2F5CgoJICAgICAgJWluY2x1ZGUgc3RkX3ZlY3RvcgoKCSAgICAgIGludCBmdW5jKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGEpOwoJICAgICAgCgkgICAgICB3aGVyZSB0aGUgcHJvcGVyIHR5cGVtYXAgaXMgYXBwbGllZCB0byAnYScsIGJ1dCBubwoJICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwcm94eSBpcyBnZW5lcmF0ZWQuCgkgICAgICAKCiAgICAgICAgICAgIC0gQWxsIHRoZSBTVEwgY29udGFpbmVycyBwcmVzZW50IGEgbW9yZSB1bmlmb3JtIGJlaGF2aW9yIGFuZAoJICAgICAgbW9yZSBjb21wbGV0ZSBpbnRlcmZhY2UgZGVjbGFyYXRpb24uIFRoZSBmb2xsb3dpbmcgYXJlIAoJICAgICAgbm93IHN1cHBvcnRlZDoKCgkJICBzdGQ6OnZlY3RvcjxUPgoJCSAgc3RkOjpsaXN0PFQ+CgkJICBzdGQ6OmRlcXVlPFQ+CgkJICBzdGQ6OnNldDxUPgoJCSAgc3RkOjptdWx0aXNldDxUPgoJCSAgc3RkOjptYXA8VD4KCQkgIHN0ZDo6bXVsdGltYXA8VD4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBub3QgYSBjb250YWluZXIsIGJ1dCBhbHNvIHN1cHBvcnRlZDoKCgkJICBzdGQ6OnBhaXI8VCxVPgoKICAgICAgICAgICAgICBhbHNvLCBtb3JlIHR5cGVtYXBzIGFyZSBkZWZpbmVkIGZvciBhbGwgb2YgdGhlbSwKCSAgICAgIGluY2x1ZGluZyB2YXJpbiwgdmFyb3V0LCB0eXBlY2hlY2ssIGV0Yy4KCiAgICAgICAgICAgIC0gSW5pdGlhbCBhdHRlbXB0IHRvIGltcGxlbWVudCB0aGUgU1RMIGNvbnRhaW5lcnMKICAgICAgICAgICAgICBjb25zaWRlcmluZyBhbGxvY2F0b3JzLCBpZToKCgkgICAgICAgICAgc3RkOjp2ZWN0b3I8VCxBPgkJCQoKCSAgICAgIGl0IGlzIHBhcnRpYWxseSB3b3JraW5nLCBidXQgaXQgaXMganVzdCBhIHdvcmthcm91bmQKCSAgICAgIHdoaWxlIHN3aWcgaW1wcm92ZXMgaXRzIHRlbXBsYXRlIHR5cGUgc3VwcG9ydC4KCSAgICAgIAoJICAgICAgCgkgICAgIFBsZWFzZSB0ZXN0IHdpdGggeW91ciBwYXJ0aWN1bGFyIHNldHVwLiBJdCBzZWVtcyB0byBiZQoJICAgICB3b3JraW5nIHdpdGggZysrIDMuMi4yLCBnKysgMi45NiwgSW50ZWwgaWNjIGFuZCBTR0kgQ0MKCSAgICAgY29tcGlsZXJzLCBwbHVzIHB5dGhvbiAxLjUuMiwgMi4wIGFuZCAyLjMsIGJ1dCBzaW5jZQoJICAgICB3ZSBhcmUgdXNpbmcgdGVtcGxhdGVzLCB0aGVyZSBpcyBhIGNoYW5jZSB5b3UgY2FuIGZpbmQKCSAgICAgc29tZSBwcm9ibGVtcyB3aGVuIHVzaW5nIHdpdGggYW4gb2xkIEMrKyBjb21waWxlci4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoKICAgICAgICAgICAgLSBBbGxvd2luZyB0aGUgZW1wdHkgJXRlbXBsYXRlIGRpcmVjdGl2ZSwgc3VjaCBhcwoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIHRvIHByb2Nlc3MgdGhlIGNsYXNzICJ0eXBlZGVmInMgYW5kICJ0eXBlbWFwInMuIEJlZm9yZQoJICAgICAgb25seSB0aGUgaW50ZXJuYWwgInR5cGVkZWYicyB3ZXJlIHByb2Nlc3NlZC4KCiAgICAgICAgICAgICAgVGhpcyBtYWtlcyBwb3NzaWJsZSB0byBlbWl0IHRoZSBkZWZhdWx0IGluL291dAogICAgICAgICAgICAgIHR5cGVtYXBzIHdpdGhvdXQgdGhlIG5lZWQgb2Ygd3JhcHBpbmcgYW4gc3BlY2lhbGl6ZWQKICAgICAgICAgICAgICB2ZWN0b3IgaW5zdGFuY2UuCgoJICAgIC0gQWRkaW5nIHRoZSBwcmVwcm9jZXNzb3IgZXh0ZW5zaW9uICNAIHdoaWNoIG1hbmdsZXMgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIG1hY3JvIGFyZ3VtZW50LCBsaWtlIGluOgoKICAgICAgICAgICAgICAgICNkZWZpbmUgbWFjcm8oWCkgICNAWAogICAgICAgICAgICAgICAgbWFjcm8oaW50KSAgICAgICAgIC0+IGludAogICAgICAgICAgICAgICAgbWFjcm8oc3RkOjpzdHJpbmcpIC0+IHN0ZF9zX3Nfc3RyaW5nCiAgICAgICAgICAgICAgICAKCSAgICAtIEZyYWdtZW50cyBjYW4gbm93IGJlICJ0eXBlIHNwZWNpYWxpemVkIiwgYXMgdGhlIHR5cGVtYXBzLiBUaGUKCSAgICAgIHN5bnRheCBpcyBhcyBmb2xsb3dzCiAKICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIsImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIGEgdHlwZSBpbmRlcGVuZGVudCBmcmFnbWVudCAob2xkIHN5bnRheCkgKi8gfQogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiB7VHlwZX0sICJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiB0aGUgZnJhZ21lbnQgaXMgdHlwZSBkZXBlbmRlbnQgKi99CiAKICAgICAgICAgICAgICBOb3cgZnJhZ21lbnRzIGNhbiBhbHNvIGJlIHVzZWQgaW5zaWRlIHRlbXBsYXRlczogCgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAlZnJhZ21lbnQoImluY29kZSJ7QTxUPn0sImhlYWRlciIpIHsKCQkgICAgICAvKiAnaW5jb2RlJyBzcGVjaWFsaXplZCBmcmFnbWVudCAqLwoJCSAgIH0KIAoJCSAgICV0eXBlbWFwKGluLGZyYWdtZW50PSJpbmNvZGUie0E8VD59KSB7CgkJICAgICAgLyoKCQkgICAgICAgICBoZXJlIHdlIHVzZSB0aGUgJ3R5cGUgc3BlY2lhbGl6ZWQnIAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgImluY29kZSJ7QTxUPn0KICAgICAgICAgICAgICAgICAgICAgICovCgkJICAgIH0KICAgICAgICAgICAgICAgIH07CgkJCSAgICAgCQoKMDMvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBidWcgd2hpY2ggbWVhbnQgdGhhdCBzb21lIHZpcnR1YWwgZnVuY3Rpb25zIG92ZXJyaWRkZW4gaW4KICAgICAgICAgICAgSmF2YSB3ZXJlIG5vdCBiZWluZyBjYWxsZWQgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gQnVnIHJlcG9ydGVkIGFuZCBmaXhlZAogICAgICAgICAgICBieSBSb2JlcnQgZGUgVnJpZXMgYW5kIFNjb3R0IE1pY2hlbC4KCjAzLzAyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNoZWNrIHRoZSB0eXBlIG9mIHN0cmluZyBhcmd1bWVudHMuCgowMi8yNC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1uYW1lc3BhY2UgPG5hbWU+LiBUaGlzIGFsbG93cyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICBhIEMjIG5hbWVzcGFjZSBpbnRvIHdoaWNoIGFsbCBDIyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQuCgowMi8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpIAoJICAgIFtNelNjaGVtZV0gVXNlIEZVTkNfTkFNRSByYXRoZXIgdGhhbiBhIGJvZ3VzIHR5cGVtYXAgdmFyaWFibGUgZm9yIHNpZ25hbGxpbmcKCSAgICBlcnJvcnMuICBDYWxsIHNjaGVtZV93cm9uZ190eXBlIHdpdGggYSB6ZXJvLWJhc2VkIGFyZ3VtZW50IG51bWJlci4gIAoJICAgIFJlcG9ydGVkIGJ5IE9uZHJlaiBQYWNvdnNreSwgU0YgIzkwMjYyMS4KCgkgICAgW0d1aWxlXSBEZWZpbmUgRlVOQ19OQU1FIGFsc28gaW4gdGhlIGRpc3BhdGNoIHdyYXBwZXIgZm9yIG92ZXJsb2FkZWQKCSAgICBmdW5jdGlvbnMuICBQYXRjaCBieSBKb2huIExlbnosIFNGICM4OTYyNTUuCgowMi8yMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IHRyeSB0byBpbnZva2UgYSBudWxsIGRlc3RydWN0b3IgZnVuY3Rpb24uCgowMi8yMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgc28gdGhhdCB0aGUgU1dJRyBzb3VyY2Ugd2lsbCBjb21waWxlIHVzaW5nIHRoZSBEaWdpdGFsIE1hcnMgQ29tcGlsZXIKICAgICAgICAgICAgKGZvcm1lcmx5IFN5bWFudGljIGNvbXBpbGVyKSBvbiBXaW5kb3dzLiBTdWJtaXR0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMDIvMTMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gTmV3IGNvbW1hbmQtbGluZSBhcmd1bWVudCAtbm9pbml0LiAgVXNlIGl0IGZvciBidWlsZGluZwoJICAgIHRoZSBydW50aW1lIGxpYnJhcnksIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbnMKCSAgICBzY2hlbWVfaW5pdGlhbGl6ZSBldGMuICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTE3NTQuCgoJICAgIFtNelNjaGVtZV0gRG9uJ3QgcHJvZHVjZSBpbnZhbGlkIEMgY29kZSB3aGVuIGludm9rZWQgd2l0aCB0aGUKCSAgICAtZGVjbGFyZW1vZHVsZSBvcHRpb24uICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTExMDguCgkgICAgCgkgICAgW0d1aWxlXSBCdWlsZCB0aGUgcnVudGltZSBsaWJyYXJ5IHdpdGggcGFzc2l2ZSBsaW5rYWdlLCB0byByZW5hbWUKCSAgICB0aGUgU1dJR19pbml0IGZ1bmN0aW9uIHVuaXF1ZWx5LgoKMDIvMTIvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gUGF0Y2ggc3VibWl0dGVkIGJ5IEJpbGwgSG9mZm1hbiB3aGljaCBwcmV2ZW50cyBTV0lHIGZyb20gY3Jhc2hpbmcKICAgICAgICAgICAgd2hlbiBhIGZpbGUgZm9yIHRoZSB0eXBld3JhcHBlciBjbGFzcyBjYW5ub3QgYmUgb3BlbmVkLgoKMDIvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gT3ZlcmxvYWRpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAtIE1ldGhvZHMgd2hpY2ggYXJlIG92ZXJsb2FkZWQgaW4gY29uc3Qgb25seSBubyBsb25nZXIgZ2VuZXJhdGUgSmF2YQogICAgICAgICAgICAgICAgY29kZSB0aGF0IHdvbid0IGNvbXBpbGUgLSB0aGUgZmlyc3QgbWV0aG9kIHBhcnNlZCBpcyB1c2VkIGFuZCBhCiAgICAgICAgICAgICAgICB3YXJuaW5nIGlzIGRpc3BsYXllZC4gTm90ZSB0aGF0IHRoaXMgYmVoYXZpb3VyIGlzIHNsaWdodGx5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2hpY2ggYWx3YXlzIHVzZXMgdGhlIG5vbi1jb25zdCBtZXRob2QuCiAgICAgICAgICAgICAgLSBXYXJuaW5nIG1lc3NhZ2VzIDUwOSBhbmQgNTEyIHJlcGxhY2VkIGJ5IG5ldyB3YXJuaW5nIG51bWJlciA1MTYsIHdoaWNoIAogICAgICAgICAgICAgICAgaXMgbW9yZSByZWxldmFudCB0byB0aGVzZSBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyBhcyB0aGUgb3ZlcmxvYWRlZAogICAgICAgICAgICAgICAgbWV0aG9kcyBhcmVuJ3QgJ3NoYWRvd2VkJywgdGhleSBhcmUgaWdub3JlZC4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlcGxhY2UgdGhlICJrbm93bl9jbGFzc2VzIiBoYXNoIHRhYmxlIGJ5IGEgbm9kZQoJICAgIGF0dHJpYnV0ZS4gIE1ldGhvZHMgb2YgY2xhc3NlcyBpbiBDKysgbmFtZXNwYWNlcyBub3cgZ2V0CgkgICAgdGhlIHByb3BlciBzcGVjaWFsaXplciBpbiB0aGUgR09PUFMgZGVjbGFyYXRpb24uCgkgICAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBVbmlxdWlmeSB0aGUgYXJndW1lbnQgbmFtZXMgaW4gR09PUFMgc2hhZG93IG1ldGhvZAoJICAgIGRlY2xhcmF0aW9ucy4gIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjEvMjAwNDogc3Vuc2hpbmUgKEVyaWMgU3Vuc2hpbmUpCiAgICAgICAgICAgIFJldml2ZWQgdGhlIE5leHRTdGVwIHBvcnQgb2YgU1dJRy4KCiAgICAgICAgICAgIEZpeGVkIGZhdGFsIHByb2JsZW0gaW4gRG9oU3Ryc3RyKCkgY2F1c2VkIGJ5IGRpZmZlcmVuY2UgaW4gc3Ryc3RyKCkKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFkZSAlYXBwbHkgYmVjb21lIGVudGlyZWx5IGR5c2Z1bmN0aW9uYWwuICBPbgogICAgICAgICAgICBOZXh0U3RlcCwgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0ZXMgdG8gTlVMTDsgd2hlcmVhcywgb24gbW9kZXJuCiAgICAgICAgICAgIHBsYXRmb3JtcywgaXQgZXZhbHVhdGVzIHRvICJmb28iLiAgJWFwcGx5IHJlbGllcyBleHRlbnNpdmVseSB1cG9uCiAgICAgICAgICAgIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGluZyB0byBub24tTlVMTCwgdGhlcmVmb3JlIGl0IGZhaWxlZAogICAgICAgICAgICBjYXRhc3Ryb3BoaWNhbGx5IHdoZW4gZmFjZWQgd2l0aCBOZXh0U3RlcCdzIHN0cnN0cigpLgoKICAgICAgICAgICAgQWRkZWQgYGJvb2wnIGNoZWNrIHRvIGNvbmZpZ3VyZS5pbiBzaW5jZSBOZXh0U3RlcCdzIEMrKyBjb21waWxlcgogICAgICAgICAgICBkb2VzIG5vdCBzdXBwbHkgdGhpcyB0eXBlLiAgc3dpZy5oIG5vdyBmYWtlcyB1cCBgYm9vbCcgaWYgbmVlZGVkLgoKICAgICAgICAgICAgV29ya2VkIGFyb3VuZCBOZXh0U3RlcCBDKysgY29tcGlsZXIgYnVnIGluIHdoaWNoIEMrKyBjb2RlIGlzCiAgICAgICAgICAgIGRpc2FsbG93ZWQgaW5zaWRlIGV4dGVybiAiQyIgZnVuY3Rpb25zLiAgVGhpcyBwcm9ibGVtIGFmZmVjdGVkIGFsbAogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLCBzaW5jZSB0aGV5IHB1Ymxpc2ggaG9vayBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgRml4ZWQgYnkgY3JlYXRpbmcgYSBDKysgd3JhcHBlcjoKICAgICAgICAgICAgICAgIHN0YXRpYyBMYW5ndWFnZSAqbmV3X3N3aWdfZm9vKCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXdfc3dpZ19mb28oKTsgfQoKICAgICAgICAgICAgRW5zdXJlZCB0aGF0IFN3aWdfY29weV9zdHJpbmcoKSBpcyB1c2VkIGluIHBsYWNlIG9mIHN0cmR1cCgpIHNpbmNlCiAgICAgICAgICAgIE5leHRTdGVwIGRvZXMgbm90IHN1cHBseSBzdHJkdXAoKS4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBSdWJ5IGxpYnJhcnkgbmFtZSBhbmQgbG9jYXRpb24gaW4gY29uZmlndXJlLmluLgogICAgICAgICAgICBQcm9ibGVtIDE6IEFzc3VtZWQgdGhhdCBsaWJyYXJ5IGFsd2F5cyByZXNpZGVkIGluIFJ1YnkncyAiYXJjaGRpciIsCiAgICAgICAgICAgIHdoaWNoIHdhcyBjb3JyZWN0IGZvciBSdWJ5IDEuNi54LCBidXQgd2hpY2ggaXMgaW5jb3JyZWN0IGZvciBSdWJ5CiAgICAgICAgICAgIDEuOC54LCBpbiB3aGljaCBjYXNlIHRoZSBsaWJyYXJ5IG5vcm1hbGx5IHJlc2lkZXMgaW4gUnVieSdzCiAgICAgICAgICAgICJsaWJkaXIiLiAgUHJvYmxlbSAyOiBBc3N1bWVkIHRoYXQgdGhlIGxpYnJhcnkgY291bGQgYWx3YXlzIGJlCiAgICAgICAgICAgIGxpbmtlZCB2aWEgIi1sIitSVUJZX0lOU1RBTExfTkFNRSAod2hlcmUgUlVCWV9JTlNUQUxMX05BTUUKICAgICAgICAgICAgdHlwaWNhbGx5IGlzICJydWJ5IiksIGhvd2V2ZXIgdGhpcyBmYWlsZWQgZm9yIHBsYXRmb3Jtcywgc3VjaCBhcwogICAgICAgICAgICBOZXh0U3RlcCwgd2hpY2ggZG8gbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4gIEluIHRoaXMgY2FzZSwgdGhlCiAgICAgICAgICAgIHN0YXRpYyBsaWJyYXJ5IG5hbWUgaW4gMS44LnggaXMgbGlicnVieS1zdGF0aWMuYSwgdGh1cwogICAgICAgICAgICAtbHJ1Ynktc3RhdGljIGlzIHJlcXVpcmVkLiAgVGhlIG5ldyBsb2dpYyB3b3JrcyBjb3JyZWN0bHkgZm9yCiAgICAgICAgICAgIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBmb3IgMS42LnggYW5kIDEuOC54LgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFBlcmwgQ0ZMQUdTIGluIGNvbmZpZ3VyZS5pbiBmb3IgTmV4dFN0ZXAuCiAgICAgICAgICAgIERldGVjdGlvbiBjb2RlIGV4dHJhY3RlZCBDRkxBR1MgZnJvbSBQZXJsJ3MgJUNvbmZpZyBoYXNoIGJ1dAogICAgICAgICAgICBuZWdsZWN0ZWQgdG8gYWRkIGEgbmV3bGluZSB0byB0aGUgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgdGhyb3VnaAogICAgICAgICAgICBgc2VkJy4gIE5leHRTdGVwJ3MgYW5jaWVudCBgc2VkJyBkaXNjYXJkcyBpbnB1dCB3aGljaCBpcyBub3QKICAgICAgICAgICAgdGVybWluYXRlZCB3aXRoIGEgbmV3bGluZSwgdGh1cyBQZXJsIENGTEFHUyBhbHdheXMgZXZhbHVhdGVkIHRvIHRoZQogICAgICAgICAgICBlbXB0eSBzdHJpbmcuCgowMS8xNi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGlkeSB1cCBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgdGhhdCBpcyBnZW5lcmF0ZWQgd2hlbgogICAgICAgICAgICBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGFyZSB3cmFwcGVkIHdpdGggdGhlIHRocm93cyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIHJlZHVuZGFudCBjb2RlIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3c7IAogICAgICAgICAgICAgICAgfQoKMDEvMTIvMjAwNDogd3NmdWx0b24gb24gYmVoYWxmIG9mIG1tYXR1cyAobWFyY2VsbyBtYXR1cykgCiAgICAgICAgICAgIGlmIGEgbWV0aG9kIHVzZXMgJWV4Y2VwdGlvbiBhbmQgdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgdXNlCiAgICAgICAgICAgIG9mIHRoZSB0aHJvd3MgdHlwZW1hcCwgdGhlIGNvZGUgaW4gYSB0aHJvd3MgdHlwZW1hcCB3aWxsIGJlCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnNpZGUgdGhlIHRyeSBib2R5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBtZXRob2QgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIEV4Y2VwdCAlewogICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgY2xhc3MgRXhjZXB0IHt9OwogICAgICAgICAgICAgIHZvaWQgbWV0aG9kKGludCBpKSB0aHJvdyAoRXhjZXB0KTsKCiAgICAgICAgICAgIFdpbGwgZ2VuZXJhdGU6CgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdCAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgQXMgY2FuIGJlIHNlZW4sIHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sgaXMgZm9yIHRoZSB0aHJvd3MgdHlwZW1hcHMuCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoaXMgd2FzIHJldmVyc2VkIHNvIHRoYXQgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jawogICAgICAgICAgICB3YXMgdGhlICVleGNlcHRpb24gY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGl0IHdvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICBpbXBvc3NpYmxlIHRvIGNhdGNoIEV4Y2VwdCBhcyB0aGUgY2F0Y2ggYWxsICguLi4pIHdvdWxkIGNhdGNoIHRoZQogICAgICAgICAgICBleGNlcHRpb24gaW5zdGVhZC4KClZlcnNpb24gMS4zLjIxIChKYW51YXJ5IDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzEwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgb3V0cHV0IGZvcm1hdCBmb3IgYm90aCB3YXJuaW5ncyBhbmQgZXJyb3JzIGNhbiBiZSBzZWxlY3RlZCBmb3IKICAgICAgICAgICAgaW50ZWdyYXRpb24gd2l0aCB5b3VyIGZhdm91cml0ZSBJREUvZWRpdG9yLiBFZGl0b3JzIGFuZCBJREVzIGNhbiB1c3VhbGx5CiAgICAgICAgICAgIHBhcnNlIGVycm9yIG1lc3NhZ2VzIGFuZCBpZiBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0IHdpbGwgZWFzaWx5IHRha2UgeW91IAogICAgICAgICAgICBkaXJlY3RseSB0byB0aGUgc291cmNlIG9mIHRoZSBlcnJvci4gVGhlIHN0YW5kYXJkIGZvcm1hdCBpcyB1c2VkIGJ5IAogICAgICAgICAgICBkZWZhdWx0IGV4Y2VwdCBvbiBXaW5kb3dzIHdoZXJlIHRoZSBNaWNyb3NvZnQgZm9ybWF0IGlzIHVzZWQgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1Gc3RhbmRhcmQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmk6NDogU3ludGF4IGVycm9yIGluIGlucHV0LgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZtaWNyb3NvZnQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmkoNCk6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NzE5MDkgXSBzaW1wbGUgbmFtZXNwYWNlIHByb2JsZW0uCiAgICAgICAgICAgIFRoaXMgd2FzIGEgcHJvYmxlbSB1c2luZyBhbm9ueW1vdXMgc3RydWN0dXJlcyBpbiBhIG5hbWVzcGFjZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0ICB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgbjsKICAgICAgICAgICAgICAgICAgIH0gUzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBicm9rZW4gUGVybCBleGFtcGxlcy4KCjEyLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSBhbmQgQyNdIEZpeGVzIGZvciB3cmFwcGluZyBjb3ZhcmlhbnQgKHBvbHltb3JwaGljKSByZXR1cm4gdHlwZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFzZSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIEJhc2UqIGNvcHkoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBEZXJpdmVkKiBjb3B5KCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIERlcml2ZWQ6OmNvcHkgcHJveHkgbWV0aG9kIHJldHVybnMgQmFzZSBub3QgRGVyaXZlZC4gQSB3YXJuaW5nIGlzIGlzc3VlZAogICAgICAgICAgICBhYm91dCB0aGlzLiBQcmV2aW91c2x5IHRoZSBwb2ludGVyIHVzZWQgYnkgdGhlIHByb3h5IGNsYXNzIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICB0cmVhdGVkIGFzIGEgQmFzZSogaW5zdGVhZCBvZiBhIERlcml2ZWQqLgoKMTIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBzbyB0aGF0IFdpbmRvd3MgcGF0aHMgYXJlIGRpc3BsYXllZCBjb3JyZWN0bHkgd2hlbiByZXBvcnRpbmcgZXJyb3JzLgogICAgICAgICAgICBBbiBlcnJvciBwcmV2aW91c2x5IHdvdWxkIGhhdmUgYmVlbiBzaG93biBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgICAgICAgLj94YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKICAgICAgICAgICAgaW5zdGVhZCBvZjoKCiAgICAgICAgICAgICAgLlxleGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCgpWZXJzaW9uIDEuMy4yMCAoRGVjZW1iZXIgMTcsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTGFzdCBtaW51dGUgbW9kaWZpY2F0aW9ucy4gICBQZXJsNSBtb2R1bGUgbm93IGdlbmVyYXRlcyBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgICBieSBkZWZhdWx0IGxpa2UgYWxsIG9mIHRoZSBvdGhlciBtb2R1bGVzLiAgUEhQNCB3cmFwcGVycyBubyBsb25nZXIKICAgICAgICAgICAgaW5jbHVkZSAiY29uZmlnLmgiLiAKCjEyLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgV2Vha2VuZWQgd2FybmluZyBtZXNzYWdlIHJlbGF0ZWQgdG8gY29uc3RydWN0b3IgbmFtZXMgc28gdGhhdCBhbgogICAgICAgICAgICB1bnVzdWFsIG5lc3RlZC1jbGFzcyB3cmFwcGluZyB0ZWNobmlxdWUgd291bGQgd29yayBhZ2FpbiAoYXBwYXJlbnRseQogICAgICAgICAgICBpdCB3b3JrZWQgaW4gc29tZSBvbGRlciBTV0lHIHJlbGVhc2VzKS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQjsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQSB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NCIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6ICBUaGVyZSBpcyBzdGlsbCBzb21lIG9kZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBTV0lHIHN5bWJvbAogICAgICAgICAgICB0YWJsZS90eXBlIHN5c3RlbSB0aGF0IHdpbGwgbmVlZCB0byBiZSBsb29rZWQgYXQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR3VzdGF2byBOaWVtZXllci4KCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3RlY3RlZCBjbGFzcyBtZXRob2RzIGFyZSB3cmFwcGVkIGFzIHByb3RlY3RlZCBKYXZhIG1ldGhvZHMgCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdGhlIGRpcnByb3QgZGlyZWN0b3IgZmVhdHVyZS4gVGhpcyBjYW4gYmUgY2hhbmdlZCB1c2luZwogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyB0byBzb21ldGhpbmcgZWxzZSBzaG91bGQgdGhlIG5lZWQgYXJpc2UsIGZvcgogICAgICAgICAgICBleGFtcGxlLCBwcml2YXRlIG9yIHBhY2thZ2UgYWNjZXNzLgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIChKYXZhKSBhbmQgJWNzbWV0aG9kbW9kaWZpZXJzIChDIykgb3BlcmF0ZSBzbGlnaHRseSAKICAgICAgICAgICAgZGlmZmVyZW50bHkuIFByZXZpb3VzbHkgdGhpcyBmZWF0dXJlIGhhZCB0byBiZSBwcmVzZW50IHRvIHNldCB0aGUgbWV0aG9kCiAgICAgICAgICAgIG1vZGlmaWVycy4gTm93IGl0IGlzIG9ubHkgdXNlZCBpZiBpdCBleGlzdHMgZm9yIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgInB1YmxpYyIgYXMgcHJldmlvdXMgaG93ZXZlciwgd2hlbiB3cmFwcGluZyBwcm90ZWN0ZWQKICAgICAgICAgICAgZGlyZWN0b3IgbWV0aG9kcyBpdCBpcyAicHJvdGVjdGVkIi4gVGhpcyBjaGFuZ2Ugd2lsbCBub3QgYWZmZWN0IGV4aXN0aW5nCiAgICAgICAgICAgIHVzZSBvZiB0aGUgJWphdmFtZXRob2Rtb2RpZmllcnMgb3IgJWNzbWV0aG9kbW9kaWZpZXJzLgoKMTIvMTEvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGlzIGZpeCBzb21lIHJlY3VycmluZyByZXBvcnRzIGFib3V0IGtleXdvcmRzIG5vdCBiZWVuCgkgICAgcHJvcGVybHkgaWRlbnRpZmllZCBhbmQgd2FybmVkLCBhbmQgaXQgc29sdmVzIHRoZSBwcm9ibGVtCgkgICAgb2YgaG93IHRvIGFkZCBhIHRlc3QgZmlsZSB0byB0aGUgdGVzdC1zdWl0ZSBzdWNoIHRoYXQgaXQKCSAgICBkb2Vzbid0IHVzZSBhbnkga2V5d29yZCBvZiBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMKCSAgICAoYW5kIGRvaW5nIGl0IHdpdGhvdXQgY29tcGlsaW5nIHRoZSB0ZXN0IGZvciBhbGwgdGhlCgkgICAgc3VwcG9ydGVkIGxhbmd1YWdlcywgdGhpbmcgdGhhdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLAoJICAgIGFuZCB3aXRob3V0IHJlcXVpcmluZyB5b3UgdG8ga25vdyBhbGwgdGhlIHN1cHBvcnRlZAoJICAgIGxhbmd1YWdlIGtleXdvcmRzLCB0aGluZyB0aGF0IGlzIGFsd2F5cyBpbXBvc3NpYmxlKS4KCgkgICAgU28gdGhlc2UgYXJlIHRoZSBjaGFuZ2VzIGdsb2JhbGx5IHNwZWFraW5nOgoKCSAgICAtIFVuaWZvcm0gdGhlIGRlZmluaXRpb24gb2YgdGhlIGtleXdvcmQgd2FybmluZ3MgdGhyb3VnaAoJICAgICAgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IGFsbCB0aGUgbGFuZ3VhZ2VzIGhhcyBub3cgYQoJICAgICAgc2VwYXJhdGUgZmlsZSB0aGF0IGRlZmluZXMgdGhlIGtleXdvcmRzIG9yIGJhZCBuYW1lczoKCgkJICBweXRob24vcHl0aG9ua3cuc3dnCgkJICBjaGlja2VuL2NoaWNrZW5rdy5zd2cKICAgICAgICAgICAgICAgICAgLi4uLgoKCSAgICAtIEFkZGVkIGtleXdvcmQgbGlzdCBmb3IgbW9zdCBvZiB0aGUgbGFuZ3VhZ2VzIHRoYXQgZGlkbid0CgkgICAgICBoYXZlIG9uZSAodXNpbmcgdGhlIG5ldyBzZXBhcmF0ZWQgZmlsZSkuCgkJICAgIAkgICAgCgkgICAgLSBBZGRlZCB0aGUgIkFsbCBrZXl3b3JkcyIgd2FybmluZyBzdXBwb3J0OiAtV2FsbGt3IG9wdGlvbi4KCiAgICAgICAgICAgICAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBpbmNsdWRlIGFsbCB0aGUga25vd24ga2V5d29yZHMKCSAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMsIGFuZCBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgICAgc3dpZyAtV2FsbGt3IC4uLi4KCSAgICAKCSAgICAgIFRoaXMgd2lsbCBoZWxwIHRvIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBhIHRlc3Qtc3VpdGUKCSAgICAgIGZpbGUgdGhhdCBjYW4gYmUgY29tcGlsZWQgaW4gYWxsIHRoZSBzd2lnIHN1cHBvcnRlZAoJICAgICAgbGFuZ3VhZ2VzLCBhbmQgaXQgd2lsbCBiZSBhbHNvIGhlbHBmdWwgZm9yIHVzZXJzIHdobwoJICAgICAgd2FudCB0byBjcmVhdGUgbXVsdGktbGFuZ3VhZ2UgbGlicmFyaWVzLgoJICAgIAoJICAgIEFuZCB0aGVzZSBhcmUgdGhlIGRldGFpbGVkIGNoYW5nZXMgKG1vc3RseSBmaWxlIGFkZGl0aW9uKToKCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBzb21lIHNvcnQgb2Yga2V5d29yZAoJICAgICAgd2FybmluZyBsaXN0LCBtb3ZlIGl0IHRvIGFuIGV4dGVybmFsIGxhbmd1YWdla3cuc3dnCgkgICAgICBmaWxlLCBpZToKCSAgICAKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBweXRob24uc3dnIC0+IHB5dGhvbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIGNoaWNrZW4uc3dnIC0+IGNoaWNrZW5rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSB0Y2w4LnN3ZyAtPiB0Y2xrdy5zd2cKIAogICAgICAgICAgICAgIGFuZCByZS1pbmNsdWRlIGxhbmd1YWdla3cuc3dnIGZyb20gbGFuZ3VhZ2Uuc3dnLgoJICAgIAoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZSB0aGF0IGRpZG4ndCBoYXZlIGEga2V5d29yZCBsaXN0LCBhbmQKCSAgICAgIGZvciB0aGUgb25lcyB0aGF0IEkgY291bGQgZmluZCBhIGxpc3QsIGFkZCB0aGUKCSAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGUsIGllOgoKICAgICAgICAgICAgICAgICBjc2hhcnAvY3NoYXJwa3cuc3dnCiAgICAgICAgICAgICAgICAgamF2YS9qYXZha3cuc3dnCiAgICAgICAgICAgICAgICAgcGhwNC9waHBrdy5zd2cKCQkgcGlrZS9waWtla3cuc3dnCSAKCQkgcnVieS9ydWJ5a3cuc3dnCgoKICAgICAgICAgICAgICBhbHNvIGFkZCBhIGxpbmUgaW4gbGFuZ3VhZ2Uuc3dnIHRvIGluY2x1ZGUKCSAgICAgIGxhbmd1YWdla3cuc3dnLCBidXQgbm93IGl0IGlzIGNvbW1lbnRlZCEhISwgbGlrZSBpbgoJICAgICAgamF2YS5zd2c6CgogICAgICAgICAgICAgICAgICAvKiBqYXZhIGtleXdvcmRzICovCiAgICAgICAgICAgICAgICAgIC8qIHBsZWFzZSB0ZXN0IGFuZCBhY3RpdmF0ZSAqLwogICAgICAgICAgICAgICAgICAvLyVpbmNsdWRlICJqYXZha3cuc3dnIgoKCSAgICAgIGllLCB0aGVyZSB3aWxsIGJlIG5vIGNoYW5nZSBpbiBob3cgc3dpZyBydW5zIG5vcm1hbGx5CgkgICAgICB1bnRpbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0ZXN0IGFuZCB1bmNvbW1lbnQgdGhhdAoJICAgICAgbGluZS4KCSAgICAgIAoJICAgICAgU28sIHBsZWFzZSBjaGVjayBlYWNoIGxhbmd1YWdla3cuc3dnIGZpbGUgKEkgbGVmdCB0aGUKCSAgICAgIGxpbmsgdG8gdGhlIGtleXdvcmQgbGlzdCBzb3VyY2UgZm9yIGNoZWNraW5nKSwgYW5kIGFmdGVyCgkgICAgICB0ZXN0aW5nLCB1bmNvbW1lbnQgdGhlICVpbmNsdWRlIGxpbmUuCgoJICAgIC0gQWRkZWQgdGhlIGZpbGUgYWxsa3cuc3dnLCB3aGljaCBpbmNsdWRlcyBhbGwgdGhlCiAgICAgICAgICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZXMuCgoJICAgICAgRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBoYXMgbm8gbGFuZ3VhZ2Vrdy5zd2cgZmlsZSByaWdodAoJICAgICAgbm93LCBhbmQgaWYgdGhleSBuZWVkIG9uZSwgYWRkIHRoZSBmaWxlIGludG8gdGhlCgkgICAgICBsYW5ndWFnZSBkaXJlY3RvcnksIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgaW5jbHVkZQoJICAgICAgbGluZSBpbnRvIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIAoJICAgIC0gQWRkZWQgdGhlIC1XYWxsa3cgdGhhdCBpbmNsdWRlcyB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICBOb3RlIHRoYXQgdGhlIG9sZCAtbGFsbGt3LnN3ZyBvcHRpb24gY291bGRuJ3QgYmUgdXNlZAoJICAgICAgc2luY2UgaXQgaW5jbHVkZSB0aGUgZmlsZSBhZnRlciBpdCB3b3VsZCBiZSBuZWVkZWQuCgoKCSAgICBIb3BlZnVsbHksIHRoZSAtV2FsbGt3IG9wdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0CgkgICAgcnVsZXMgaW4gdGhlIHJlbGF0ZWQgdGVzdC1zdWl0ZSBNYWtlZmlsZXMsIHNvLCB3aGVuCgkgICAgY3JlYXRpbmcgYSBuZXcgdGVzdCwgb3IgYWRkaW5nIGEgbmV3IHN3aWcgbGlicmFyeSBmaWxlCgkgICAgKGxpa2UgX3N0ZF9kZXF1ZS5pKSwgc3dpZyB3aWxsIHdhcm4geW91IGlmIHlvdSBhcmUgdXNpbmcgYQoJICAgIGJhZCBuYW1lLCBjb25zaWRlcmluZyBhbGwgdGhlIGxhbmd1YWdlIHdoZXJlIGl0IG5lZWRzIHRvCgkgICAgcnVuLgoJICAgIAoJICAgIFJpZ2h0IG5vdyB5b3UgY2FuIHRlc3QgaXQgYnkgdXNpbmc6CgogICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9InN3aWcgLVdhbGxrdyIKCgkgICAgb3IgdXNpbmcgeW91ciBmYXZvcml0ZSB0YXJnZXQgbGFuZ3VhZ2UsIGl0IGRvZXNuJ3QgbWF0dGVyLgoKCSAgICBBbmQgeWVzLCB0aGVyZSBhcmUgc2V2ZXJhbCBleGFtcGxlcyB0aGF0IGFyZSB1c2luZwoJICAgIHJlc2VydmVkIGtleXdvcmRzLCBzcGVjaWFsbHkgZnJvbSBjc2hhcnAuCiAgICAgICAgICAKCSAgICAqKiogUmVtZW1iZXIgKioqKjogdGhlIG5ldyBrZXl3b3JkIHdhcm5pbmcgbGlzdHMgYXJlIG5vdAoJICAgIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gYW55IG9mIGxhbmd1YWdlIHRoYXQgYmVmb3JlIGRpZG4ndAoJICAgIGhhdmUgb25lLiBUbyBlbmFibGUgdGhlIGtleXdvcmQgd2FybmluZ3MgYXMgdGhlIGRlZmF1bHQKCSAgICBiZWhhdmlvciwgdGhlIGluY2x1c2lvbiBvZiB0aGUgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSBoYXMgdG8KCSAgICBiZSB1bmNvbW1lbnRlZCBhdCBlYWNoIGxhbmd1YWdlLnN3ZyBmaWxlLgoKCSAgICBTbywgYWxsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVycywgcGxlYXNlIGNoZWNrIHRoZQoJICAgIGtleXdvcmRzIGxpc3QuIAoKCSAgICBBbHNvLCB5b3UgY2FuIGFkZCBidWl0LWluIG5hbWVzLCBhbmQgbm90IG9ubHkga2V5d29yZHMsIGxpa2UKCSAgICAnVHJ1ZS9GYWxzZScgaW4gcHl0aG9uLiAgUmVtZW1iZXIgdGhhdCB5b3UgY2FuIGJlIG1vcmUKCSAgICBzcGVjaWZpYyBhbmQgcmVmZXIgb25seSB0byBtZW1iZXIgbmFtZXMsIGxpa2UgKjo6Y29uZmlndXJlCgkgICAgb3IgKjo6Y2dldCAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlIHRjbDgvdGNsOGt3LnN3ZyBmaWxlKSwKCSAgICBvciBvbmx5IGdsb2JhbCBuYW1lcywgbGlrZSA6OnJhbmdlIChzZWUgYW4gZXhhbXBsZSBpbiB0aGUKCSAgICBweXRob24vcHl0aG9ua3cuc3dnIGZpbGUuCgoJICAgIEp1c3QgdG8gYmUgY29uc2lzdGVudCwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZXM6CgoJICAgIC0gVXNlIGNvZGUgMzE0IGZvciBrZXl3b3JkIGFuZC9vciBmYXRhbCBiYWQgbmFtZXMuCgkgICAgLSBVc2UgY29kZSAzMjEgZm9yIGJ1aXQtaW4gYW5kL29yIG5vdCBmYXRhbCBiYWQgbmFtZXMuCiAgICAgICAgICAgCiAgICAgICAgICAgIHNvLCB0aGV5IGNhbid0IGJlIGRpc2FibGVkL2VuYWJsZWQgaW5kZXBlbmRlbnRseSAoc2VlCgkgICAgcHl0aG9uL3B5aHRvbmt3LnN3ZyBmb3IgZXhhbXBsZXMpLgoKCSAgICAqKioqIEFuZCBkb24ndCBhZGQgYW55IG5ldyB0ZXN0IGZpbGUgd2l0aG91dCBjaGVja2luZyBpdAoJICAgIHdpdGggdGhlIC1XYWxsa3cgb3B0aW9uISEgKHRoYXQgaW5jbHVkZXMgbWUpICoqKioqLgoJICAKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTRiBidWcgIzg1NDYzNAogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhY2NlcHRpbmcgdGhlIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciAnLycgb24gCiAgICAgICAgICAgIFdpbmRvd3MgYW5kIHRoZSBNYWMgaW4gYWRkaXRpb24gdG8gdGhlIG5hdGl2ZSBvbmUgKCAnXCcgb24gCiAgICAgICAgICAgIFdpbmRvd3MpLiBUaGlzIGNhbiBiZSB1c2VkIGluICVpbXBvcnQsICVpbmNsdWRlIGFuZCBjb21tYW5kbGluZSAKICAgICAgICAgICAgb3B0aW9ucyB0YWtpbmcgYSBwYXRoLCBmb3IgZXhhbXBsZSAtSS4gT24gQ3lnd2luLCBib3RoIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIGFuZCBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgY2FuIG5vdyBiZSB1c2VkICh3YXMgJy8nIG9ubHkpLgogICAgICAgICAgICAKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKICAgICAgICAgICAgW3B5dGhvbl0gSW1wbGVtZW50aW5nIHRoZSBydW50aW1lICJyZXByb3RlY3RlZCIgZGlyZWN0b3IKCSAgICBtZW1iZXJzLCBpZiB5b3UgaGF2ZToKICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXIoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgaGVsbG8oKSB7IHJldHVybiBkb19oZWxsbygpOykKCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hpKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGVsbG8oKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4sIGF0IHRoZSBweXRob24gc2lkZQoKICAgICAgICAgICAgICAgIGltcG9ydCBteV9tb2R1bGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28obXlfbW9kdWxlLkJhcik6CiAgICAgICAgICAgICAgICAgIGRlZiBkb19oZWxsbyhzZWxmKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgCgkgICAgICAgIGIgPSBCYXIoKSAjIFB1cmUgQysrIERpcmVjdG9yIGNsYXNzCiAgICAgICAgICAgICAgICBmID0gRm9vKCkgIyBDKysgRGlyZWN0b3IgKyBweXRob24gbWV0aG9kcwoKICAgICAgICAgICAgICAgIGIuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgQysrIEJhcjo6ZG9faGVsbG8oKQogICAgICAgICAgICAgICAgZi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBQeXRob24gRm9vOjpkb19oZWxsbygpCgogICAgICAgICAgICAgICAgYi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKIAogICAgICAgICAgICAgICAgYi5kb19oZWxsbygpICMgUnVudGltZUVycm9yLCBkb19oZWxsbygpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hlbGxvKCkgIyBPaywgc2luY2UgaXQgaXRzIHJlZGVmaW5lZCBpbiBweXRob24uCgogICAgICAgICAgICBIZXJlIEJhci5kb19oZWxsbyBpcyBhbHdheXMgcHJvdGVjdGVkLCBidXQgRm9vLmRvX2hlbGxvCiAgICAgICAgICAgIGlzICJwdWJsaWMiLCBiZWNhdXNlIGl0IGlzIHJlZGVmaW5lZCBpbiBweXRob24uIEJlZm9yZSwKCSAgICBhbGwgdGhlICdkb19oZWxsbycgbWV0aG9kcyB3ZXJlIHB1YmxpYy4KCgkgICAgVGhpcyBzZWVtcyB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIEMrKyBhbmQgcHl0aG9uCgkgICAgcGhpbG9zb3BoaWVzLCBpZSwgYWxsIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBrZWVwCgkgICAgcHJvdGVjdGVkIGF0IHRoZSB1c2VyIHNpZGUgKEMrKyB3YXkpIHVudGlsIHRoZXkgYXJlCgkgICAgcmVkZWZpbmVkIChweXRob24gd2F5LCB3ZXJlIGFsbCBkZWZpbmVkIG1ldGhvZHMgYXJlIGFsd2F5cwoJICAgIHB1YmxpYykuIEFuZCB0aGlzIGlzIG5vdCBvbmx5IGEgZ29vZCBjb21wcm9taXNlLCBpdCBhbHNvCgkgICAgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGRvIGl0IDopLgoKCSAgICBOb3cgcnVieSBoYXMgbmF0aXZlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzLCBhbmQgcHl0aG9uCgkgICAgcHVyZSBydW50aW1lIHN1cHBvcnQuIEkgZ3Vlc3MgdGhlc2UgYXJlIHRoZSB0d28gcG9zc2libGUKCSAgICBleHRyZW1lIGNhc2VzLiBBbmQgaG9wZWZ1bGx5LCB0aGV5IGNvdWxkIGJlIHVzZWQgYXMKCSAgICB0ZW1wbGF0ZXMgdG8gbW9kaWZ5IHRoZSBvdGhlciBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0CgkgICAgZGlyZWN0b3JzLCBzbyB0aGV5IGNhbiAicmVwcm90ZWN0IiB0aGUgcHJvdGVjdGVkIGRpcmVjdG9yCgkgICAgbWVtYmVycyBhdCB0aGUgdGFyZ2V0IGxhbmd1YWdlIHNpZGUuCgoJICAgIFRoaXMgZmluaXNoZWQgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBzdXBwb3J0IGZvciB0aGUgCgkgICAgcHl0aG9uIGxhbmd1YWdlLiBPY2FsbSB3aWxsIG5lZWQgdG8gYWRkIHRoZQoJICAgICJyZXByb3RlY3Rpb24iIGxhdGVyLgoKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGUgZm9sbG93aW5nIGNhc2UgKHJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbikgd2FzIGZpeGVkOgoKCSAgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKCSAgICAgIGNsYXNzIEZvbyB7IAoJICAgICAgcHVibGljOgoJICAgICAgICB2b2lkIHkoKTsKCgkgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgIGludCB4OwoJICAgICAgfTsKCgkgICBzd2lnIHdhcm5lZCB0aGF0IHRoZSBzeW1ib2wgJ3gnIHdhcyBhbHJlYWR5IGRlZmluZWQsIGFuZAogICAgICAgICAgIHRoZSByZW5hbWluZyBmYWlscy4gJ3gnIHdhcyBub3QgZW1pdHRlZCwgc2luY2UgaXQgaXMKICAgICAgICAgICBwcm90ZWN0ZWQsIGJ1dCBpdCB3YXMga2VwdCBpbiB0aGUgc3ltYm9sIHRhYmxlIHdpdGggdG9vCiAgICAgICAgICAgbXVjaCBpbmZvcm1hdGlvbi4KCgkgICBOb3cgc3dpZyB3b3JrcyBmb3IgYWxsIHRoZSBjYXNlcyAocGxhaW4sIGRpcmVjdG9yIGFuZAoJICAgZGlycHJvdCkgYWdhaW4uIFRoaXMgd2FzIGZpeGVkIGJ5IGFsbG93aW5nIHRoZSBwYXJzZXIueSB0bwoJICAgZGVjaWRlIG11Y2ggY2xvc2VyIHdoYXQgdG8gZG8gd2l0aCAneCcuIEJlZm9yZSBhbGwgdGhlCgkgICBkaXNjYXJkaW5nIG9yIGdlbmVyYXRpb24gd2FzIHJlc29sdmVkIGF0IHRoZSBsYW5nLmN4eAoJICAgc3RhZ2UuIEFsc28gdGhlIGNoYW5nZXMgaW4gcGFyc2VyLnkgdG8gaW1wbGVtZW50IHRoZQoJICAgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUgYXJlIG5vdyBtdWNoIG1vcmUgZW5jYXBzdWxhdGVkLCBhbmQKCSAgIHRoZXkgZ2V0IGRpc2FibGVkIGlmIHRoZSBtb2RlIGlzIG5vdCBlbmFibGVkLiBCZWZvcmUgdGhlCgkgICBkZWFjdGl2YXRpb24gd2FzIGRvbmUgYXQgdGhlIGdlbmVyYXRpb24gc3RhZ2UgKGxhbmcuY3h4KS4KCgkgICBCeSB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGRpcmVjdG9yIG1vZGUgaXMgZW5hYmxlZCwgYW5kCgkgICAlcmVuYW1lIGlzIGRvbmUsIHJldXNpbmcgYSBwcm90ZWN0ZWQgbWVtYmVyIG5hbWUsIHRoZXJlIGlzCgkgICBhIHBhdGhvbG9naWNhbCBjYXNlOgoKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAogICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEEgewoJICAgICBwdWJsaWM6CgkgICAgICAgdm9pZCB5KCk7CgoJICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgaW50IHg7ICAgICAgICAgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIGludCB4OyAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgdm9pZCB4KCk7IC8qIHdvcmtzICovCgkgICAgICAgdHlwZWRlZiB2b2lkIHgoKTsgLyogd29ya3MgKi8KCgkgICAgICAgdmlydHVhbCB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBhcyBpdCBzaG91bGQsIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbzo6eCgpIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3IgKi8KCgkgICAgICAgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYnV0IHNvbWV0aW1lcyBpdCBzaG91bGRuJ3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSB0aGUgRm9vOjp4KCkgd2lsbCBub3QgYmUgZW1pdHRlZCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgbm90IHZpcnR1YWwgKi8KCgkgICAgIH07CgoJICAgVGhlIGxhc3QgY2FzZSBpcyBub3QgYWx3YXlzIHJpZ2h0IGJlY2F1c2UgYXQgdGhlIHBhcnNlci5weQoJICAgc3RhZ2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlY2lkZSBpZiB0aGUgcHJvdGVjdGVkIG1lbWJlcgoJICAgRm9vOjp4KCkgY291bGQgb3Igbm90IGNvbmZsaWN0IHdpdGggdGhlIHJlbmFtZWQgRm9vOjp5KCksCgkgICBzaW5jZSBGb286OngoKSBjb3VsZCBiZSB2aXJ0dWFsIGJ5IGluaGVyaXRhbmNlLgoKCSAgIEkgZ3Vlc3MgdGhpcyBqdXN0IGFuIGludHJpbnNpYyBsaW1pdGF0aW9uLCBhbmQgbm8gbXVjaCBjYW4KCSAgIGJlIGRvbmUgYWJvdXQgaXQgd2l0aG91dCByZXNvcnRpbmcgaW50byBsYXJnZXIgY2hhbmdlcyB0bwoJICAgcG9zdHBvbmUsIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhlIG11bHRpcGx5IHN5bWJvbAoJICAgZGV0ZWN0aW9uIChsYW5nLmN4eCBzdGFnZSkuCgkgICAKCSAgIFNvLCBieSBub3csIGl0IGlzIGp1c3QgY29uc2lkZXJlZCBhIHdlbGwga25vd24gImZlYXR1cmUiIGluCgkgICB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUuIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBpdCBzZWVtcwoJICAgdG8gYmUgYSByYXJlIGNhc2UsIGFuZCBpdCBjYW4gYmUgYXZvaWRlZCBieSB0aGUgdXNlciBieQoJICAgaGlkaW5nICd4JyBiZWZvcmUgcmVuYW1pbmcgJ3knOgoKCSAgICAgJXJlbmFtZShfeCkgRm9vOjp4KCk7CgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CgkgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgdmlydHVhbCBtZXRob2QgZGV0ZWN0aW9ucyBub3cgcHJvcGVybHkKCSAgICB0cmVhdHMgdGhlIGZvbGxvd2luZyBjYXNlczoKCiAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsgdHlwZWRlZiBpbnQgSW50OyB9CgkgICAgIHN0cnVjdCBBIHt9OwoJICAgICB0eXBlZGVmIEEgQjsKCiAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgdmlydHVhbCB+Rm9vKCkge30KCiAgICAgICAgICAgICAgIHZpcnR1YWwgRm9vKiBjbG9uZXIoKSA9IDA7CgkgICAgICAgdmlydHVhbCBpbnQgZ2V0X3ZhbHVlKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgQSogZ2V0X2NsYXNzKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgdm9pZCBqdXN0X2RvX2l0KCkgPSAwOwoJICAgICB9OwoKICAgICAgICAgICAgIHN0cnVjdCBCYXIgOiBGb28KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgQmFyKiBjbG9uZXIoKTsKICAgICAgICAgICAgICAgZm9vOjpJbnQgZ2V0X3ZhbHVlKCk7CiAgICAgICAgICAgICAgIEIqIGdldF9jbGFzcygpOwogICAgICAgICAgICAgICB2b2lkIGp1c3RfZG9faXQoKTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgQWxsIHRoZSBGb28gYW5kIEJhciBtZXRob2RzIGFyZSB2aXJ0dWFsLiAgQSBuZXcgYXR0cmlidXRlCgkgICAgInZpcnR1YWw6dHlwZSIgcmVjb3JkIHRoZSBiYXNlIHBvbHltb3JwaGljIHR5cGUuIEluIHRoZQoJICAgIHByZXZpb3VzIGNhc2VzIHdlIGhhdmU6CgoJICAgICAgIHR5cGUgOiBCYXIgICAgICAgdmlydHVhbDp0eXBlIDogRm9vCgkgICAgICAgdHlwZSA6IGZvbzo6SW50ICB2aXJ0dWFsOnR5cGUgOiBpbnQKCSAgICAgICB0eXBlIDogQiAgICAgICAgIHZpcnR1YWw6dHlwZSA6IEEKCSAgICAgICB0eXBlIDogdm9pZCAgICAgIHZpcnR1YWw6dHlwZSA6IHZvaWQKCiAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHVzZWZ1bCBpbiBsYW5ndWFnZXMgKGphdmErZGlyZWN0b3JzKQoJICAgIHRoYXQgY291bGQgaGF2ZSBwcm9ibGVtcyByZWRlZmluaW5nIEJhciogQmFyOjpjbG9uZXIoKS4KCgkgICAgSWYgeW91IG5ldmVyIGhhZCBjb2RlIGxpa2UgdGhlIGFib3ZlLCB5b3Ugd2lsbCBzZWUgbm8KCSAgICBlZmZlY3RzLiBCdXQgaWYgeW91IGhhdmUgc29tZSBjb2RlIGxpa2UgdGhhdCwgeW91CgkgICAgd2lsbCBzZWUgc29tZSBlZmZlY3RzIHNpbmNlIHNvbWUgbWV0aG9kcyB0aGF0CgkgICAgYmVmb3JlIHdlcmUgbm90IHByb3Blcmx5IHRyZWF0ZWQgYXMgdmlydHVhbCwKCSAgICB3aWxsIHN0YXJ0IHRvIGFjdCBsaWtlIHRoYXQuIFRoaXMgY291bGQgZW5sYXJnZQoJICAgIHlvdXIgZGlyZWN0b3IgY2xhc3Nlcy4KCSAgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IChkaXJwcm90KQoJICAgIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCgkgICAgCgkgICAgSXQgY2FuIGJlIGVuYWJsZSBieSB1c2luZyAnLWRpcnByb3QnIG9yIGJ5IGFkZGluZwoJICAgIHRoZSBvcHRpb24gdG8gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbiwgbGlrZToKCiAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIixkaXJwcm90PSIxIikgbXlfbW9kdWxlCgoJICAgIFRoaXMgbW9kdWxlIG9wdGlvbiB3YXMgYWRkZWQgdG8gcHJvcGVybHkgY29tcGlsZSB0aGUKCSAgICBkaXJlY3Rvcl9wcm90ZWN0ZWQuaSBhbmQgZGlyZWN0b3JfbmVzdGVkLmkgZXhhbXBsZXMuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uWzIuMiwyLjNdIAoJICAgIGFuZCBydWJ5WzEuNi43XSwgYm90aCBhdCBjb21waWxhdGlvbiBhbmQgcnVudGltZSwgYW5kIAoJICAgIGphdmFbajJzZGsxLjQuMV8wMV0sIGJ1dCBvbmx5IGF0IGNvbXBpbGF0aW9uIChteSBqYXZhCgkgICAgaW5zdGFsbGF0aW9uIGRvZXNuJ3QgcnVuIGFueSBvZiB0aGUgZGlyZWN0b3IgZXhhbXBsZXMsCgkgICAgb2xkcyBub3IgbmV3cykuCgoJICAgIFBsZWFzZSB0ZXN0IGZvciBvY2FtbCBhbmQgamF2YS4KCSAgICAKCSAgICBUaGUgZXJyb3JzIHJlcG9ydGVkIGJ5IFdpbGxpYW0gYW5kIFNjb3R0IHdlcmUgZml4ZWQsCgkgICAgZXhjZXB0IGZvciBhIHdhcm5pbmcgYWJvdXQgIFNXSUdfSmF2YVRocm93RXhlY3B0aW9uKCkKCSAgICBtdWx0aXBseSBkZWZpbmVkLiBJIGNhbid0IHJlcHJvZHVjZSB0aGlzIGVycm9yIHdpdGggbXkKCSAgICBleGFtcGxlcy4gV2Ugd2lsbCB3YWl0IGZvciBTY290dCB0byBzZW5kIHVzIGEgbWluaW1hbAoJICAgIGNhc2UuCgoKMTIvMDcvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgaGFzIGJlZW4KCSAgICBjb21wbGV0bHkgbW92ZWQgb3V0IGZyb20gcHl0aG9uLmN4eCwgYW5kIG5vdwoJICAgIHJlc2lkZXMgaW4gdGhlIGNvbW1vbiBsYW5nLmN4eCwgZW1pdC5jeHggYW5kCgkgICAgYWxsb2NhdGUuY3h4IGZpbGVzLiAKCgkgICAgVGhpcyBtZWFucyBpdCBzaG91bGQgd29yayBmb3IgYWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IGN1cnJlbnRseSBzdXBwb3J0IGRpcmVjdG9ycywgaWUsIHB5dGhvbiwgamF2YSwgb2NhbG0KCSAgICBhbmQgcnVieS4KCgkgICAgVGhlIGNoYW5nZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob24gKGNvbXBpbGF0aW9uK3J1bnRpbWUpCgkgICAgYW5kIGphdmEgKGp1c3QgY29tcGlsYXRpb24pLgoJICAgIAoJICAgIFBsZWFzZSBhZGQgcnVudGltZSB0ZXN0cyBmb3IgdGhlIG1pc3NpbmcgbGFuZ3VhZ2VzIAoJICAgIGFuZCB0ZXN0IGl0LgoKCSAgICBUaGUgJy1ub2RpcnByb3QnIG9wdGlvbiB3YXMgbW92ZWQgdG8gdGhlIHByaW5jaXBhbCBtYWluLAoJICAgIGFuZCBjYW4gYmUgdXNlZCBmcm9tIGFsbCB0aGUgbGFuZ3VhZ2VzLgoKMTIvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBhbmQgaW1wcm92ZWQgZXJyb3IgY2hlY2tpbmcgb2YgU1RSSU5HX09VVCB0eXBlbWFwcyBpbiAKICAgICAgICAgICAgdmFyaW91cy5pLgoKMTIvMDQvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICAtIE5vdyB0aGUgdmlydHVhbCBtZW1iZXJzIHdpdGggbm8gZXhwbGljaXQgZGVjbGFyYXRvcgoJICAgIGFyZSBwcm9wZXJseSBpZGVudGlmaWVkOgoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgewogICAgICAgICAgICAgICAgICBpbnQgZigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgSGVyZSwgQjo6ZigpIGlzIHZpcnR1YWwsIGFuZCB0aGUgZGlyZWN0b3IgYW5kIHRoZQoJICAgIHZpcnR1YWwgZWxpbWluYXRpb24gbWVjaGFuaXNtIG5vdyByZWNvZ25pemUgdGhhdC4KCiAgICAgICAgICAgIC0gW0MjXSBUaGlzIGZpeCBhbHNvIGZpeGVzIHRoZSBwcm9ibGVtIHdoZXJlICdvdmVycmlkZScgd2FzIG5vdCBiZWluZyAKICAgICAgICAgICAgdXNlZCBvbiBhbnkgb3ZlcnJpZGRlbiB2aXJ0dWFsIG1ldGhvZCwgc28gZm9yIHN0cnVjdCBCIGFib3ZlLCAKICAgICAgICAgICAgdGhpcyBDIyBjb2RlIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgQiA6IEEgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBmKCkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCSAgICAtIEluaXRpYWwgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIHZpcnR1YWwgbWV0aG9kcy4gVGhleSBhcmUgbm93CgkgICAgcHJvcGVybHkgZW1pdHRlZCB3aGVuIHVzaW5nIHdpdGggZGlyZWN0b3IgKHB5dGhvbiBvbmx5IGJ5CgkgICAgbm93KS4KCSAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7ICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQXsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgZjIoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIFRoaXMgY2FuIGJlIGRpc3NhYmxlZCBieSB1c2luZyB0aGUgJy1ub2RpcnByb3QnIG9wdGlvbi4KCgkgICAgLSBUaGUgZmVhdHVyZSAnbm9kaXJlY3RvcicgaXMgd29ya2luZyBub3cgYXQgdGhlIHRvcCBsZXZlbCwKCSAgICBzbywgaXQgbXVzdCB3b3JrIGZvciBhbGwgdGhlIGxhbmd1YWdlczoKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOwogICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vZGlyZWN0b3IiKSBBOjpmMjsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMigpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIAoJICAgIGluIHRoaXMgY2FzZSwgb25seSAnZjEnIGlzIGV4cG9ydGVkIHRvIHRoZSBkaXJlY3RvciBjbGFzcy4KCSAgICAKCSAgICAtIEFkZGVkIGRpcmVjdG9yIHN1cHBvcnQgZm9yIGNvbnN0IFRZUEUmIGFyZ3VtZW50cyAocHl0aG9uKS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBJTk9VVCBhbmQgT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIHdoZW4gdGhlIEpOSSB0eXBlIAogICAgICAgICAgICBpcyBiaWdnZXIgdGhhbiB0aGUgQyB0eXBlLiBGb3IgZXhhbXBsZSwgdW5zaWduZWQgbG9uZyAoMzJiaXRzIG9uIG1vc3Qgc3lzdGVtcykKICAgICAgICAgICAgaXMgbWFwcGVkIHRvIGpsb25nICg2NGJpdHMpLiBSZXR1cm5lZCB2YWx1ZSB3YXMgaW5jb3JyZWN0LiBCdWcgcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEJyaWFuIEhhd2xleS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEJldHRlciBmaXggZm9yIGVudHJ5IGRhdGVkIDA1LzExLzIwMDMuIEZpeGVzIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgdHlwZW1hcHM6CgogICAgICAgICAgICBKYXZhOiBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgogICAgICAgICAgICBDIzogY3NiYXNlLCBjc2ludGVyZmFjZXMsIGNzaW1wb3J0cywgY3NjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgY3NmaW5hbGl6ZSwgY3NnZXRjcHRyICYgY3Njb2RlLgoKICAgICAgICAgICAgSXQgYWxzbyBmaXhlcyBidWcgaW4gdXNpbmcgYXJyYXlzIG9mIEMgc3RydWN0cyB3aXRoIGFycmF5c19qYXZhLmkgCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIFNjb3R0IE1pY2hlbC4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEZpeGVkIFsgODUyMTE5IF0gcmVjdXJzaXZlIGluaGVyaXRhbmNlIGluIG91dHB1dCAucG0sIHBlcmw1LgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIERvd2xpbmcuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIFsgNzU1MzgyIF0gY2FsbGluZyBmdW5jKGNvbnN0IHZlY3RvcjxUPiYgcCkgZXZhbHVhdGVzIHBbMF0gaW4gaW50ZXJwLgogICAgICAgICAgICBUaGUgVGNsIHR5cGUgY2hlY2tlciB3YXMgaW1wcm9wZXJseSBoYW5kbGluZyB0aGUgaW50ZXJwcmV0ZXIgcmVzdWx0IHdoZW4KICAgICAgICAgICAgdHlwZSB2aW9sYXRpb25zIHdlcmUgc3VwcG9zZWQgdG8gYmUgaWdub3JlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxhdml1IFBvcHAtTm93YWsuCgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA1NDUwNTggXSBjb25maWd1cmUncyAtLXdpdGgtdGNsaW5jbCBoYXMgbm8gZWZmZWN0CgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgNzY2NDA5IF0gbWlzc2luZyBzeW1ib2wgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gZHVyaW5nIG1vZHVsZSBsb2FkCiAgICAgICAgICAgIFNXSUcncyBpbnRlcm5hbCBmdW5jdGlvbnMgYXJlIGFsbCBzdGF0aWMgYXMgdGhlcmUgaXMgbm8gbmVlZCBmb3IgZGlmZmVyZW50IFNXSUcKICAgICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMgdG8gc2hhcmUgYW55IGNvZGUgYXQgcnVudGltZS4KCjExLzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgc3VwcG9ydCBmb3IgQysrIHBvaW50ZXJzIHRvIG1lbWJlcnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA4NDgzMzUgXSBEaXJlY3RvcnM6ICNpbmNsdWRlIHdyYXBwZXIgLmggZmlsZSAtIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICBhZGRpbmcgYSBkaXJlY3RvcnkgdG8gdGhlIGdlbmVyYXRlZCAjaW5jbHVkZSAiZm9vX3dyYXAuaCIgc3RhdGVtZW50CiAgICAgICAgICAgIGluIHNvbWUgc2l0dWF0aW9ucy4KCjExLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgWyA4NDkwNjQgXSBKQVZBIDogQWNjZXNzIG1vZGlmaWVyIGZvciBkZXJpdmVkIGNsYXNzIHdyb25nLgogICAgICAgICAgICBUaGUgZGVsZXRlKCkgbWV0aG9kIGlzIGFsd2F5cyBwdWJsaWMgbm93LiBJdCB1c2VkIHRvIGJlIHByb3RlY3RlZCB3aGVuZXZlciBhIAogICAgICAgICAgICBkZXN0cnVjdG9yIHdhcyBub24gcHVibGljLiBBbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBydW50aW1lIAogICAgICAgICAgICBleGNlcHRpb24gaXMgdGhyb3duIGluc3RlYWQgb2YgbWFraW5nIGRlbGV0ZSgpIHByb3RlY3RlZCBub3cuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gQWRkZWQgc3VwcG9ydCBmb3IgQysrIHBvaW50ZXJzIHRvIG1lbWJlcnMuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODUwMTUxIF0gUFlWRVJTSU9OIHdpdGggcHl0aG9uMi4zIGluIGNvbmZpZ3VyZSBvZiBTV0lHIDEuMy4xOSAoTWF5YmUpLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCAgWyA4NTA2NjYgXSAjaW5jbHVkZSBleHRyYSBsaW5lIGFkZGVkLiAgCiAgICAgICAgICAgIFRoaXMgc2hvdWxkIGZpeCBzb21lIHByb2JsZW1zIHdpdGggZ2V0dGluZyBjb3JyZWN0IGxpbmUgbnVtYmVycyBvbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlcy4KCjExLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYW5vdGhlciBvbmUgb2YgTWFyY2VsbydzIGV2aWwgdGVtcGxhdGUgYnVncyAoaW5maW5pdGUKICAgICAgICAgICAgcmVjdXJzaW9uKS4gWyA4NDk1MDQgXSB0ZW1wbGF0ZSBhbmQgdHlwZWRlZiAtPiBpbmYuIHJlY3Vyc2lvbi4KCjExLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggZGVjbGFyYXRpb25zIGxpa2UgdGhpczoKCgkgICAgICAgICBpbnQgKnggPSAmc29tZWFycmF5WzBdOwoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc1NjU1MiBdIG1pc3NpbmcgZGVmYXVsdCBhcmd1bWVudCBjbGFzcyBzY29wZSB3aXRoICJ8Ii4KICAgICAgICAgICAgVGhpcyBpcyByZWFsbHkgb25seSBhIGJhbmQtYWlkIGZpeCBmb3IgdXNlIG9mIGNsYXNzLWVudW1zIGluCiAgICAgICAgICAgIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBlbnVtIEZsYWcgeyBmbGFnMSA9IDB4MSwgZmxhZzIgPSAweDIgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHggPSBmbGFnMSB8IGZsYWcyKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGU6IHRoZXJlIGFyZSBzdGlsbCBzb21lIChtb3JlIHN1YnRsZSkgY2FzZXMgdGhhdCBhcmUgYnJva2VuLAogICAgICAgICAgICBidXQgaGFyZCB0byBmaXggZHVlIHRvIGFuIGlzc3VlIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uLiBXaWxsCiAgICAgICAgICAgIGFkZHJlc3MgbGF0ZXIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERtaXRyeSBNaXJvbm92LgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgWyA4NDA4NzggXSBzdXBwb3J0IGZvciAlaW5saW5lIHsgLi4uIH0gKFBBVENIKS4KICAgICAgICAgICAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgICAlaW5saW5lIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgJWlubGluZSAleyAuLi4gJX0gaXMgdGhhdCB0aGUKICAgICAgICAgICAgZW5jbG9zZWQgdGV4dCBpcyBwcm9jZXNzZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgIFRoaXMKICAgICAgICAgICAgYWxsb3dzIHNwZWNpYWwgbWFjcm9zIGFuZCBvdGhlciBwcm9jZXNzaW5nIHRvIGJlIHVzZWQgaW4gCiAgICAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggJWlubGluZS4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGlubyBHYXJjaWEuCgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODM2OTAzIF0gQysrIGluY29uc2lzdGVuY3kgKHdpdGggdm9pZCBhcmd1bWVudHMpLgogICAgICAgICAgICBTV0lHIHdhcyBoYXZpbmcgZGlmZmljdWx0eSB3aXRoIGYoKSB2cyBmKHZvaWQpIGluIEMrKyBwcm9ncmFtcy4KICAgICAgICAgICAgRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmKHZvaWQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZigpOyAgICAvLyBOb3QgbWF0Y2hlZCB0byBmKHZvaWQpIGNvcnJlY3RseQogICAgICAgICAgICAgICAgICB9OyAKCiAgICAgICAgICAgIFRoZSBwYXJzZXIgbm93IG5vcm1hbGl6ZXMgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybSBmKHZvaWQpIAogICAgICAgICAgICBpbiBDKysgY2xhc3NlcyB0byBmKCkuICBUaGlzIHNob3VsZCBmaXggYSB2YXJpZXR5IG9mIHN1YnRsZSAKICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCBpbmhlcml0YW5jZSwgb3B0aW1pemF0aW9ucywgb3ZlcmxvYWRpbmcsIGV0Yy4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBQYXJ0aG8gQmhvd21pY2suCiAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEluY29ycG9yYXRlZCBbIDg0MTA3NCBdIGJldHRlciBjcm9ha2luZyAoUEFUQ0gpLiAgVGhpcyBmaXhlcyBzb21lIHByb2JsZW1zCiAgICAgICAgICAgIHdpdGggc3RyaW5ncyBhbmQgcHJvdmlkZXMgc29tZSBuZXcgZXJyb3IgZnVuY3Rpb25zLiAKICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGlubyBHYXJjaWEuCiAgICAgICAgICAgIAoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzkxODM1IF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIGNhc3Q6IHR4dCA9IChjaGFyICopInR4dCIgc3ludGF4IEVycm9yLgogICAgICAgICAgICBUaGUgcGFyc2VyIHNob3VsZCBub3cgYWNjZXB0IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKnMgPSAoY2hhciAqKSAiSGVsbG8iKTsKCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQ2xhdWRpdXMgU2Nobm9yci4KCjExLzI0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gRml4ZWQgcHJvYmxlbSB3aXRoIGNyb3NzIG1vZHVsZSBsaW5raW5nLiAgUHJldmlvdXNseSBtb2R1bGVzIHJlZmVycmVkCiAgICAgICAgICAgIHRvIGJhc2UgY2xhc3NlcyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlLiAgIE5vdywgdGhlIG1vZHVsZSBsb29rcyB1cCBiYXNlCiAgICAgICAgICAgIGNsYXNzZXMgdGhyb3VnaCB0aGUgdHlwZSBzeXN0ZW0gaXRzZWxmLS0tYXZvaWRpbmcgdGhlIG5lZWQgdG8gbGluayB0byBhIGdsb2JhbAogICAgICAgICAgICBsaWtlIGJlZm9yZS4gIENhdmVhdDogIG1vZHVsZXMgd2l0aCBiYXNlIGNsYXNzZXMgbXVzdCBiZSBsb2FkZWQgYmVmb3JlCiAgICAgICAgICAgIG1vZHVsZXMgd2l0aCBkZXJpdmVkIGNsYXNzZXMuCiAKMTEvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB1c2UgKCkgdG8gcmVwcmVzZW50IG51bGwgcG9pbnRlcnMsCgkgICAgYXMgaXQgaXMgZG9uZSBpbiAtZ2ggbW9kZS4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBBZGQgYSBnZW5lcmF0ZWQgc2NyaXB0ICJwcmVpbnN0LXN3aWciLCB3aGljaCBjYW4gYmUgdXNlZAoJICAgIHRvIGludm9rZSBTV0lHIGJlZm9yZSBpdCBoYXMgYmVlbiBpbnN0YWxsZWQuICBJdCBhcnJhbmdlcwoJICAgIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlCgkgICAgdXNlZC4gCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNhbGwgU1dJR19HdWlsZV9Jbml0LgoJICAgIEFkZCBhIFNXSUdfY29udHJhY3RfYXNzZXJ0IG1hY3JvLgoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gVXBkYXRlIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHRoZSBkeW5leHQgb2JqZWN0IHRvIHdvcmsKCSAgICB3aXRoIE16U2NoZW1lIDIwNS4KCjExLzIwLzIwMDM6IG1tYXR1cwoJICAgIEZpeGVkIHRoZSBpbmNsdWRlL2ltcG9ydCBlcnJvciByZXBvcnRlZCBieSBLZXJpbSBCb3JjaGFldiwKCSAgICB3aGVyZSB0d28gZmlsZXMgd2l0aCBuYW1lcyBsaWtlCgoJICAgICdkaXIxL2hlbGxvLmknCgkgICAgJ2RpcjIvaGVsbG8uaScKCSAgICAKCSAgICBjYW4gbm90IGJlIGluY2x1ZGUgYXQgdGhlIHNhbWUgdGltZS4gU3dpZyB3YXMgaW5jbHVkaW5nCgkgICAganVzdCB0aGUgZmlyc3Qgb25lLCBhc3N1bWluZyB0aGUgc2Vjb25kIG9uZSB3YXMgbm90IGEKCSAgICBkaWZmZXJlbnQgb25lLCBzaW5jZSBpdCB3YXMgY2hlY2tpbmcva2VlcGluZyBqdXN0IHRoZQoJICAgIGJhc2VuYW1lICdoZWxsby5pJy4KCjExLzE5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgU1dJRyBydW50aW1lIGxpYnJhcnkgc3VwcG9ydC4gCiAgICAgICAgICAgICAgLSAgVGhlIC1jIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byAtbm9ydW50aW1lCiAgICAgICAgICAgICAgLSAgTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC1ydW50aW1lLiAgV2hlbiBzdXBwbGllZCwgdGhpcwogICAgICAgICAgICAgICAgIGluc2VydHMgdGhlIHN5bWJvbCBTV0lHX0dMT0JBTCBpbnRvIHRoZSB3cmFwcGVyIGNvZGUuICBUaGlzLAogICAgICAgICAgICAgICAgIGluIHR1cm4sIG1ha2VzIGFsbCBvZiB0aGUgcnVudGltZSBzdXBwb3J0IGZ1bmN0aW9ucyBnbG9iYWxseQogICAgICAgICAgICAgICAgIHZpc2libGUuCiAgICAgICAgICAgICAgIC0gTmV3IGxpYnJhcnkgZmlsZTogc3dpZ3J1bi5pLiAgIFVzZWQgdG8gY3JlYXRlIG1vZHVsZXMKICAgICAgICAgICAgICAgICBmb3IgcnVudGltZSBsaWJyYXJ5IChpZiBuZWVkZWQpLgogICAgCjExLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICAnbWFrZSBzcmNycG0nIHJwbWJ1aWxkIGZpeCAtIHBhdGNoIGZyb20gSm9lIENvb3BlcgoKMTEvMTgvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQ2hhbmdlIG1lYW5pbmcgb2YgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtZ3VpbGUgdG8KCSAgICB0aGUgbmFtZSBvZiB0aGUgR3VpbGUgZXhlY3V0YWJsZS4gIFRoZSBuZXcgb3B0aW9uIC0td2l0aC1ndWlsZS1wcmVmaXggCgkgICAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHJlZSB3aGVyZSBHdWlsZSBpcwoJICAgIGluc3RhbGxlZC4gIChIb3dldmVyLCB1c3VhbGx5IGl0IHN1ZmZpY2VzIHRvIHVzZSB0aGUKCSAgICBzaW5nbGUgb3B0aW9uIC0td2l0aC1ndWlsZS1jb25maWcuKSAgCgkgICAgV2hlbiBydW5uaW5nIHRoZSBydW4gdGVzdHMgdGVzdC1zdWl0ZSwgbWFrZSBzdXJlIHRvIHVzZSB0aGUKCSAgICB2ZXJzaW9uIG9mIEd1aWxlIHRoYXQgU1dJRyB3YXMgY29uZmlndXJlZCBmb3IuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbXByb3ZlbWVudHMgdG8gb2JqZWN0LW93bmVyc2hpcCBtYW5hZ2VtZW50IGluIAoJICAgICItc2NtIiBtb2RlLiAgKFRoZXkgZG8gbm90IGFwcGx5IHRvIHRoZSBkZWZhdWx0ICItZ2giIG1vZGUuKQoJICAgICogUmVuYW1lZCB0aGUgc21vYiB0eXBlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBjYW4KCSAgICAgIGJlIGdhcmJhZ2UgY29sbGVjdGVkIGZyb20gImNvbGxlY3RlZCBzd2lnIiB0byAiY29sbGVjdGFibGUKCSAgICAgIHN3aWciLCB3aGljaCBpcyBtb3JlIHByZWNpc2UuICAKCSAgICAqIEV4cG9ydCB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYWdhaW4uICBJdCBpcyBub3cKIAkgICAgICBhbGxvd2VkIHRvIGV4cGxpY2l0bHkgY2FsbCBkZXN0cnVjdG9ycywgZXZlbiBmb3IKCSAgICAgIGdhcmJhZ2UtY29sbGVjdGVkIHBvaW50ZXIgb2JqZWN0cy4gIEEgcG9pbnRlciBvYmplY3QKCSAgICAgIHRoYXQgaGFzIGJlZW4gcGFzc2VkIHRvIGEgZGVzdHJ1Y3RvciBpcyBtYXJrZWQgaW4gYQoJICAgICAgc3BlY2lhbCB3YXkgdXNpbmcgYSBuZXcgc21vYiB0eXBlLCAiZGVzdHJveWVkIHN3aWciLgoJICAgICAgKFRoaXMgaGVscHMgYXZvaWQgbmFzdHkgbWVtb3J5IGJ1Z3MsIHdoZXJlIHJlZmVyZW5jZXMgdG8KCSAgICAgIGRlYWQgQyBvYmplY3RzIGFyZSBzdGlsbCBoZWxkIGluIFNjaGVtZS4gTW9yZW92ZXIsIHRoZQoJICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd2lsbCBub3QgdHJ5IHRvIGZyZWUgYSBkZXN0cm95ZWQKCSAgICAgIG9iamVjdCBvbmNlIG1vcmUuKQoJICAgICogRGVzdHJ1Y3Rvci1saWtlIGZ1bmN0aW9ucyBjYW4gYWxzbyBtYXJrIHRoZWlyIGFyZ3VtZW50cyAKCSAgICAgIGFzIGRlc3Ryb3llZCBieSBhcHBseWluZyB0aGUgdHlwZW1hcCBTV0lHVFlQRSAqREVTVFJPWUVELgoJICAgICAgKEl0IGNhbGxzIHRoZSBmdW5jdGlvbiBTV0lHX0d1aWxlX01hcmtQb2ludGVyRGVzdHJveWVkLikKCSAgICAqIEZ1bmN0aW9ucyB0aGF0ICJjb25zdW1lIiB0aGVpciBvYmplY3RzIChvciB0aGF0ICJvd24iCgkgICAgICB0aGVtIGFmdGVyIHRoZSBjYWxsKSBjYW4gbWFyayB0aGVpciBhcmd1bWVudHMgYXMKCSAgICAgIG5vdCBnYXJiYWdlIGNvbGxlY3RhYmxlLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBhcHBseWluZwoJICAgICAgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkNPTlNVTUVELiAgKEl0IGNhbGxzIHRoZSBmdW5jdGlvbgoJICAgICAgU1dJR19HdWlsZV9NYXJrUG9pbnRlck5vbmNvbGxlY3RhYmxlLikKCSAgICAqIFRoZSBtYWNybyBUWVBFTUFQX1BPSU5URVJfSU5QVVRfT1VUUFVUIGZyb20gbGlicmFyeQoJICAgICAgcG9pbnRlci1pbi1vdXQuaSBjcmVhdGVzIGFkZGl0aW9uYWwgdHlwZW1hcHMgCgkgICAgICBQVFJUWVBFICpJTlBVVF9DT05TVU1FRCwgUFRSVFlQRSAqSU5QVVRfREVTVFJPWUVELgoJICAgICAgVGhleSBtYXJrIHRoZSBwYXNzZWQgcG9pbnRlciBvYmplY3QgbGlrZXdpc2UuCgkgICAgICBUaGUgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVQgY3JlYXRlcyBhIGdhcmJhZ2UtY29sbGVjdGFibGUKCSAgICAgIHBvaW50ZXIgb2JqZWN0LCBsaWtlICVuZXdvYmplY3QgZG9lcyBmb3IgYSByZXR1cm5lZCAKCSAgICAgIHBvaW50ZXIuICBVc2UgdGhlIG5ldyB0eXBlbWFwIFBUUlRZUEUgKk9VVFBVVF9OT05DT0xMRUNUQUJMRQoJICAgICAgdG8gY3JlYXRlIGEgcG9pbnRlciBvYmplY3QgdGhhdCB3aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KCjExLzE3LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEhhbmRsZSAkaW5wdXQgaW4gImZyZWVhcmciIHR5cGVtYXBzLgoJICAgIE5ldmVyIHF1YWxpZnkgR09PUFMgc2xvdCBuYW1lcyB3aXRoIHRoZSBjbGFzcyBuYW1lLiAKCSAgICBIYW5kbGUgb3B0aW9uYWwgYXJndW1lbnRzIHByb3Blcmx5IGluIHRoZSBHT09QUyBtZXRob2RzLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBpbnN0YWxsYXRpb24gdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBBdXRvbWFrZS0xLjguCiAgICAgICAgICAgIG1raW5zdGFsbGRpcnMgd2FzIGJlaW5nIHVzZWQgYnkgYSBub24tQXV0b21ha2UgbWFrZWZpbGUuIAogICAgICAgICAgICBta2luc3RhbGxkaXJzIGlzIGJlaW5nIHBoYXNlZCBvdXQgYW5kIHNvIHdhcyBub3QgYmVpbmcKICAgICAgICAgICAgY3JlYXRlZCBieSBBdXRvbWFrZS4gaW5zdGFsbC1zaCB1c2VkIGluc3RlYWQuCgoxMS8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE51bWVyb3VzIGRpcmVjdG9yIGltcHJvdmVtZW50cywgdHdlYWtzIGFuZCBidWcgZml4ZXMgc2luY2UgCiAgICAgICAgICAgIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGhhdmUgYmVlbiBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gJWZlYXR1cmUoInNoYWRvdyIpIGlzIHVzZWQgdG8gYWRkIGNvZGUgdG8gc2hhZG93CiAgICAgICAgICAgIGNsYXNzZXMsIHRoZSBzcGVjaWFsIHZhcmlhYmxlICRhY3Rpb24gZXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgdW5kZXJseWluZyB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCBub3JtYWxseS4KCjExLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiBnZW5lcmF0aW5nIHByb3h5IGNsYXNzIGNvZGUsIFNXSUcgZW1pdHMgYSBmZXcKICAgICAgICAgICAgZGVmYXVsdCBtZXRob2RzIGZvciBfX3JlcHJfXygpIGFuZCBvdGhlciBQeXRob24gc3BlY2lhbAogICAgICAgICAgICBtZXRob2RzLiAgU29tZSBvZiB0aGVzZSBtZXRob2RzIGFyZSBlbWl0dGVkIGFmdGVyIGFsbCBvZiB0aGUKICAgICAgICAgICAgY29udGVudHMgb2YgYSBjbGFzcy4gSG93ZXZlciwgdGhpcyBtYWtlcyBpdCBoYXJkIHRvIG92ZXJyaWRlCiAgICAgICAgICAgIHRoZSBtZXRob2RzIHVzaW5nICVweXRob25jb2RlIGFuZCBzb21lIG90aGVyIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgICBhbGxvdyBjb2RlIHRvIGJlIGluc2VydGVkIGludG8gYSBjbGFzcy4gIFRoZXNlIHNwZWNpYWwgbWV0aG9kcwogICAgICAgICAgICBhcmUgbm93IGVtaXR0ZWQgaW50byB0aGUgY29kZSAqYmVmb3JlKiBhbGwgb2YgdGhlIG90aGVyIG1ldGhvZHMuCiAgICAgICAgICAgIFN1Z2dlc3RlZCBieSBFcmljIEpvbmVzLgogCjExLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUHJlcHJvY2Vzc29yIGVuaGFuY2VtZW50LiAgIEZvciBpbmNsdWRlIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgImZvby9iYXIuaSIKCiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgImZvbyIgaXMgbm93IGFkZGVkIHRvIHRoZSBzZWFyY2ggcGF0aCB3aGlsZSAKICAgICAgICAgICAgcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYmFyLmkuICBUaHVzLCBpZiBiYXIuaSBpbmNsdWRlcyBvdGhlcgogICAgICAgICAgICBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHRoZXkgd2lsbCBiZSBmb3VuZC4gUHJldmlvdXNseSwKICAgICAgICAgICAgeW91IHdvdWxkIGhhdmUgdG8gYWRkIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgdXNpbmcgLUkgdG8gbWFrZSB0aGlzCiAgICAgICAgICAgIHdvcmsgY29ycmVjdGx5LiAgTm90ZTogdGhlIEMgcHJlcHJvY2Vzc29yIHNlZW1zIHRvIGJlaGF2ZSBpbgogICAgICAgICAgICBhbiBpZGVudGljYWwgbWFubmVyIG9uIG1hbnkgKG1vc3Q/IGFsbD8pIHN5c3RlbXMuCiAgICAgICAgICAgIFN1Z2dlc3RlZCBieSBLZXJpbSBCb3JjaGFldi4KCjExLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIG9uIE1hYyBPUyBYIDEwLjMueCAoUGFudGhlcikuCiAgICAgICAgICAgIFRlc3RlZCB3aXRoIFB5dGhvbiwgVGNsLCBQZXJsLCBhbmQgUnVieS0tLWFsbCBvZiB3aGljaCBzZWVtIHRvIHdvcmsuCgoxMS8wOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIHRoZSB0eXBlbWFwcyBpbiB2YXJpb3VzLmkgd2hpY2ggd2VyZSBtb3N0bHkgYnJva2VuLgogICAgICAgICAgICBjaGFyICoqU1RSSU5HX0lOIGFuZCBjaGFyICoqU1RSSU5HX1JFVCB0eXBlbWFwcyByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBTVFJJTkdfQVJSQVkuIGZsb2F0ICpGTE9BVF9BUlJBWV9SRVRVUk4gdHlwZW1hcCByZW1vdmVkLgoKMTEvMDgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBUY2wgbW9kdWxlIG5vdyBlbWl0cyBhIHNhZmUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGJ5CiAgICAgICAgICAgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmVtb3ZlZCBieSBydW5uaW5nICdzd2lnIC1ub3NhZmUnLgoKMTEvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gT25seSB1c2UgdGhlIFNDTV8gQVBJIHdoZW4gdGhlIGZ1bmN0aW9uCgkgICAgYHNjbV9zbG90X2V4aXN0c19wJyBleGlzdHMgKG5lZWRlZCBmb3IgR09PUFMgc3VwcG9ydCkuICAKCSAgICBUaGlzIGZ1bmN0aW9uIHdhcyByZW5hbWVkIGR1cmluZyB0aGUgR3VpbGUgMS41IHNlcmllcwoJICAgIGZyb20gYHNjbV9zbG90c19leGlzdHNfcCcuCgkgICAgUmVwb3J0IHRoZSByaWdodCBydW50aW1lIGxpYnJhcnkgd2hlbiBpbnZva2VkIHdpdGgKCSAgICAtc2NtIC1sZGZsYWdzLgoKMTEvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBGaXggIzc4MjA1Mi4gIFRoZSAtLXdpdGgtY2hpY2tlbmNmZyBjb25maWd1cmUKCSAgICBvcHRpb24gKGFuZCBvdGhlcnMpIHdlcmUgbm90IGFjY2VwdGVkLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTWVyZ2UgbmV3IHNldCBvZiBHT09QUyBjaGFuZ2VzIGJ5IEpvaG4gTGVuei4KCSAgICBHT09QUyBvYmplY3RzIGFyZSBub3cgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgYnkgdGhlIEMgY29kZS4KCSAgICBTb21lIGZpeGVzIHRvIHR5cGVtYXAtR09PUFMgaW50ZXJhY3Rpb24uCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZW1vdmUgdGhlIGZpbGUgYXJndW1lbnQgdG8gLXNjbXN0dWIgYW5kIC1nb29wcy4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgYWx3YXlzIGNhbGxlZCBNT0RVTEUuc2NtIG9yCgkgICAgTU9EVUxFLXByaW1pdGl2ZS5zY20sIHdoZXJlIE1PRFVMRSBpcyB0aGUgbW9kdWxlIG5hbWUgYW5kIAoJICAgICJwcmltaXRpdmUiIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSAtcHJpbXN1ZmZpeCBvcHRpb24uCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IHBsYWNlZCBpbiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5CgkgICAgdGhlIC1vdXRkaXIgb3B0aW9uLCBvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuCgkgICAgKFBhdGNoIGJ5IEpvaG4gTGVueiwgc2xpZ2h0bHkgbW9kaWZpZWQuKQoKCSAgICAqKiogSU5DT01QQVRJQklMSVRZIFtHdWlsZV0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgVW5pZnkgdGhlIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4gIFRoZSBzdGFuZGFyZAoJICAgIGZ1bmN0aW9ucyBhcmU6CgkgICAgICogU1dJR19OZXdQb2ludGVyT2JqIChQT0lOVEVSLCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gQ3JlYXRlIGFuIHNjcmlwdGluZyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgdHlwZWQKCQkgICBwb2ludGVyLiBGTEFHUyBhcmUgbGFuZ3VhZ2Ugc3BlY2lmaWMuCgkgICAgICogU1dJR19Db252ZXJ0UHRyIChJTlBVVCwgUkVTVUxULCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHN0b3JlIGl0IGluIHRoZSBwbGFjZSBSRVNVTFQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCAKCQkgICBvY2N1cnMsIHJldHVybiBub256ZXJvLgoJICAgICAqIFNXSUdfTXVzdEdldFB0ciAoSU5QVVQsIFRZUEUsIEFSR05VTSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICByZXR1cm4gaXQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCBvY2N1cnMsIHRocm93IGFuCgkJICAgZXhjZXB0aW9uLiAgSWYgQVJHTlVNID4gMCwgcmVwb3J0IGl0IGFzIHRoZSAKCQkgICBhcmd1bWVudCBudW1iZXIgdGhhdCBoYXMgdGhlIHR5cGUgbWlzbWF0Y2guCiAgICAgICAgICAgIFtHdWlsZV06ICAgIE5vIGNoYW5nZXMuCgkgICAgW016U2NoZW1lXTogTm8gY2hhbmdlcy4KCSAgICBbUGVybF06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iai4KCQkgICAgICAgIFRoZSBmdW5jdGlvbiBTV0lHX01ha2VQdHIgaXMga2VwdC4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgbm90CgkJCXN1cHBvcnRlZC4KCSAgICBbUHl0aG9uXTogICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbUnVieV06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbVGNsXTogICAgICBSZW1vdmUgdGhlICJpbnRlcnAiIGFyZ3VtZW50IG9mCgkJICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqLCBTV0lHX0NvbnZlcnRQdHIsCgkJICAgICAgICBTV0lHX0NvbnZlcnRQYWNrZWQsIGFuZCBTV0lHX0NvbnZlcnRQdHJGcm9tU3RyaW5nLgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSAKCQkJbm90IHN1cHBvcnRlZC4KCSAgICBObyBjaGFuZ2VzIHRvIFBpa2UgYmVjYXVzZSBpdHMgcG9pbnRlciBjb252ZXJzaW9uIGNvZGUgZGlkCgkgICAgbm90IGxvb2sgY29tcGxldGUuICBObyBjaGFuZ2VzIHRvIFBIUDQsIGJlY2F1c2UgSSBkaWQgbm90CgkgICAgdW5kZXJzdGFuZCBpdHMgcnVudGltZSBjb2RlLiAgTm8gY2hhbmdlcyB0byBDaGlja2VuCgkgICAgYmVjYXVzZSBtYWpvciBjaGFuZ2VzIGFyZSBleHBlY3RlZCBzb29uIGFueXdheS4gIE5vCgkgICAgY2hhbmdlcyB0byBKYXZhLCBPQ2FtbCwgQyMgYmVjYXVzZSB0aGV5IGRvIG5vdCBzZWVtIHRvCgkgICAgaGF2ZSBhIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4KCiAgICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW1RjbF0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW1Blcmw1LCBQSFA0LCBQaWtlLCBQeXRob24sIFJ1YnksIFRjbF06IFVzZSB0aGUKCSAgICBwcmVwcm9jZXNzb3IgdG8gcmVuYW1lIGV4dGVybmFsIGZ1bmN0aW9ucyBvZiB0aGUgU1dJRwoJICAgIHJ1bnRpbWUgQVBJIHRvIGZvbGxvdyB0aGUgbmFtaW5nIGNvbnZlbnRpb24KCSAgICBTV0lHXzxsYW5ndWFnZT5fPGZ1bmN0aW9uPi4gIFRoaXMgc2hvdWxkIGFsbG93IGxpbmtpbmcKCSAgICBtb3JlIHRoYW4gb25lIGludGVycHJldGVyIGludG8gYSBwcm9ncmFtLgoKMTAvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHNpbmNlIGludHJvZHVjaW5nIHRoZSBleGNlcHRpb24gYW5kIHN0ZDo6c3RyaW5nIGRlbGVnYXRlcy4KICAgICAgICAgICAgVGhlIGZpeCBvdmVyY29tZXMgbGlua2VyIGVycm9ycyB3aGVuIHVzaW5nIG1vcmUgdGhhbiBvbmUgU1dJRyBtb2R1bGUuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQW5kcmVhcyBTY2j2cmsuCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjMzMDIgXSBJbmNyIFRjbCBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBBbGV4ZXkgRHlhY2hlbmtvLgogICAgICAgICAgICBOb3RlOiBuZWVkcyBkb2N1bWVudGF0aW9uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzI1IF0gbmV3IFB5dGhvbiBNb2R1bGUgb3B0aW9ucyBhbmQgZmVhdHVyZXMuCiAgICAgICAgICAgIFJvYmluIER1bm4gd3JpdGVzOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBtYWtlcyBhIG51bWJlciBvZiBjaGFuZ2VzIHRvIHRoZSBTV0lHIHB5dGhvbiBtb2R1bGUuCgogICAgICAgICAgICAxLiBBZGQgLWFwcGx5IG9wdGlvbiwgYW5kIGNoYW5nZSB0aGUgZGVmYXVsdCBjb2RlCiAgICAgICAgICAgIG91dHB1dCB0byB1c2UgdGhlIGZvbygqYXJncywgKiprdykgY2FsbGluZyBzeW50YXgKICAgICAgICAgICAgaW5zdGVhZCBvZiB1c2luZyBhcHBseSgpLiBJZiB0aGUgLWFwcGx5IG9wdGlvbiBpcwogICAgICAgICAgICBnaXZlbiB0aGVuIGNvZGUgaXMgZ2VuZXJhdGVkIGFzIGJlZm9yZS4gVGhpcyBpcyB2ZXJ5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gUGF0Y2ggIzczNzI4MSBidXQgdGhlIG5ldyAtbW9kZXJuIG9wdGlvbgogICAgICAgICAgICBtYWtlcyB0aGUgc2Vjb25kIGhhbGYgb2YgdGhhdCBwYXRjaCB1bm5lY2Vzc2FyeSBzbyBpdAogICAgICAgICAgICBpcyBub3QgaW5jbHVkZWQgaGVyZS4KCSAgICAKICAgICAgICAgICAgMi4gQWRkIC1uZXdfcmVwciBvcHRpb24uIFRoaXMgaXMgdGhlIHNhbWUgYXMgbXkgUGF0Y2gKICAgICAgICAgICAgIzc5NzAwMiB3aGljaCBJIHdpbGwgbWFyayBhcyBjbG9zZWQgc2luY2UgaXQgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIG5lZWRlZC4gV2hlbiB0aGlzIG5ldyBvcHRpb24gaXMgdXNlZCB0aGVuIHRoZQogICAgICAgICAgICBfX3JlcHJfXyBtZXRob2RzIHRoYXQgYXJlIGdlbmVyYXRlZCBmb3IgcHJveHkgY2xhc3NlcwogICAgICAgICAgICB3aWxsIGJlIG1vcmUgaW5mb3JtYXRpdmUgYW5kIGdpdmUgZGV0YWlscyBhYm91dCB0aGUKICAgICAgICAgICAgcHl0aG9uIGNsYXNzIGFuZCB0aGUgQysrIGNsYXNzLgoJICAgIAogICAgICAgICAgICAzLiBBZGQgJWZlYXR1cmUoImFkZHRvZnVuYyIpLiBJdCBhbGxvd3MgeW91IHRvIGluc2VydAogICAgICAgICAgICBvbmUgb3IgbW9yZSBsaW5lcyBvZiBjb2RlIGluc2lkZSB0aGUgc2hhZG93IG1ldGhvZCBvcgogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGlzIGFscmVhZHkgZ2VuZXJhdGVkLCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgbGlrZSAlZmVhdHVyZSgic2hhZG93IikgZG9lcy4KICAgICAgICAgICAgRm9yIF9faW5pdF9fIGl0IGdvZXMgYXQgdGhlIGVuZCwgZm9yIF9fZGVsX18gaXQgZ29lcwogICAgICAgICAgICBhdCB0aGUgYmVnaW5pbmcgYW5kIGZvciBhbGwgb3RoZXJzIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgICBpcyBleHBhbmRlZCBvdXQgdG8gYmUgbGlrZQoJICAgIAogICAgICAgICAgICBkZWYgQmFyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHZhbCA9IF9tb2R1bGUuRm9vX0JhcigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIHJldHVybiB2YWwKCSAgICAKICAgICAgICAgICAgYW5kIHRoZSAiYWRkdG9mdW5jIiBjb2RlIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIHRoZQogICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgdXNlZCBmb3IgYQogICAgICAgICAgICBwYXJ0aWN1bGFyIG1ldGhvZCBvciBmdW5jdGlvbiB0aGVuIHRoZSBzaG9ydGVyIGNvZGUgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGp1c3QgbGlrZSBiZWZvcmUuCgkgICAgCiAgICAgICAgICAgIDQuIEEgbGl0dGxlIGJpdCBvZiByZWZhY3RvcmluZyB0byBtYWtlIGltcGxlbWVudGluZwogICAgICAgICAgICBhZGR0b2Z1bmMgYSBsaXR0bGUgZWFzaWVyLgoJICAgIAogICAgICAgICAgICA1LiBBZGRlZCBhIC1tb2Rlcm4gY29tbWFuZC1saW5lIGZsYWcgdGhhdCB3aWxsIGNhdXNlCiAgICAgICAgICAgIFNXSUcgdG8gb21pdCB0aGUgY3J1ZnQgaW4gdGhlIHByb3h5IG1vZHVsZXMgdGhhdCBhbGxvd3MKICAgICAgICAgICAgaXQgdG8gd29yayB3aXRoIHZlcnNpb25zIG9mIFB5dGhvbiBwcmlvciB0byAyLjIuIFRoZQogICAgICAgICAgICByZXN1bHQgaXMgYSBzaW1wbGVyLCBjbGVhbmVyIGFuZCBmYXN0ZXIgcHl0aG9uIHByb3h5CiAgICAgICAgICAgIG1vZHVsZSwgYnV0IG9uZSB0aGF0IHJlcXVpcmVzIFB5dGhvbiAyLjIgb3IgZ3JlYXRlci4gCgoxMC8zMS8yMDAzOiBiZWF6bGV5IAogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE5IF0gWE1MIG1vZHVsZSB0d2Vha3MuCiAgICAgICAgICAgIFRoaXMgYWRkcyBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC14bWxsaXRlIHRoYXQgCiAgICAgICAgICAgIGdyZWF0bHkgcmVkdWNlcyB0aGUgYW1vdW50IG9mIGVtaXR0ZWQgWE1MIGNvZGUgYnkKICAgICAgICAgICAgZWxpbWluYXRpbmcgc29tZSBmaWVsZHMgbW9zdGx5IHVzZWQgaW4gU1dJRydzCiAgICAgICAgICAgIGludGVybmFsIHByb2Nlc3NpbmcuICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE3IF0gQWRkcyBEb2hTcGxpdExpbmVzIGZ1bmN0aW9uLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNzkwNyBdIGFyZ291dCBvYmplY3RzIG5vdCBiZWluZyB3cmFwcGVkIHByb3Blcmx5IChQQVRIKS4KICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgkgICAgIAoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI2OTk2IF0gcGVybCB0eXBlIGNoZWNraW5nIGlnbm9yZXMgcGVybCBzdWJjbGFzc2VzLgogICAgICAgICAgICBUaGlzIGVuaGFuY2VtZW50IG1ha2VzIGl0IHNvIHdyYXBwZWQgY2xhc3NlcyBhbmQgc3RydWN0cyBjYW4KICAgICAgICAgICAgYmUgc3ViY2xhc3NlZCBpbiBQZXJsIGFuZCB1c2VkIG5vcm1hbGx5LiAKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgoxMC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbnRQdHIgbWFyc2hhbGxlZCB3aXRoIGEgdm9pZCogaW5zdGVhZCBvZiBpbnQgaW4gQyBmdW5jdGlvbiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiBUaGUgY2FzdHMgdGh1cyBsb29rIG1vcmUgY29udmVudGlvbmFsLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAvLyBvbGQKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KGludCBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAqKFNoYXBlICoqKSZqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBuZXcKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KHZvaWQgKiBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAoU2hhcGUgKilqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoKMTAvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBzbWFydCBwb2ludGVycy4KICAgICAgICAgICAgSWYgYSBjbGFzcyBoYXMgb3ZlcmxvYWRlZCBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50IHgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgeCwgaW50IHkpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBhbmQgdGhlIGNsYXNzIGlzIHVzZWQgYXMgYSBzbWFydCBwb2ludGVyOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb1B0ciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBTV0lHIHdvdWxkIHRyeSB0byBleHBvc2UgdGhlIHN0YXRpYyBtZW1iZXIgRm9vOjpiYXIKICAgICAgICAgICAgdGhyb3VnaCBGb29QdHItLS1yZXN1bHRpbmcgYm9ndXMgd3JhcHBlciBjb2RlIGFuZCBhIGNvbXBpbGVyCiAgICAgICAgICAgIGVycm9yLgoKICAgICAgICAgICAgRHVlIHRvIHRoZSB3YXkgaW4gd2hpY2ggb3ZlcmxvYWRpbmcgaXMgaGFuZGxlZCwgaXQgaXMKICAgICAgICAgICAgZXh0cmVtZWx5IGRpZmZpY3VsdCB0byBlbGltaW5hdGUgdGhlIHN0YXRpYyBtZXRob2QgaW4KICAgICAgICAgICAgdGhpcyBjYXNlLiAgVGhlcmVmb3JlLCBpdCBpcyBzdGlsbCBleHBvc2VkLiAgSG93ZXZlciwKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBjb2RlIG5vdyBjb21waWxlcyBhbmQgd29ya3MuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlLCBNelNjaGVtZSwgQ2hpY2tlbl06IFJlbW92ZSBzeW1ib2wgY2xhc2hlcyBiZXR3ZWVuCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGJ5IHJlbmFtaW5nIGFsbCBleHRlcm4gY29tbW9uLnN3ZwoJICAgIGZ1bmN0aW9ucyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBiYXNpYyBHT09QUyBzdXBwb3J0LCBjb250cmlidXRlZCBieSBKb2huIExlbnouCgkgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgoJICAgIAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBOZXcgb3B0aW9uLCAtb25seS1zZXR0ZXJzLCB3aGljaCBkaXNhYmxlcwoJICAgIHRyYWRpdGlvbmFsIGdldHRlciBhbmQgc2V0dGVyIHByb2NlZHVyZXMgZm9yIHN0cnVjdHVyZSBzbG90cy4KCjEwLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIHJ1biB0ZXN0IGZvciByZWZlcmVuY2VfZ2xvYmFsX3ZhcnMgYnkgSm9obiBMZW56LgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBQYXJ0aWFsIHNvbHV0aW9uIHRvIFsgNzkyMTgwIF0gQysrIHNtYXJ0LXBvaW50ZXIvbmFtZXNwYWNlIG1peHVwIHJldmlzaXRlZC4KICAgICAgICAgICAgVGhlIHByb2JsZW0gaXMgbm90IGVhc3kgdG8gZml4IChhdCBsZWFzdCBpdCBkb2Vzbid0IHNlZW0gc28pLCBidXQgaXMKICAgICAgICAgICAgcmVsYXRlZCB0byB0aGUgaW5zdGFudGlhdGlvbiBvZiBxdWFsaWZpZWQgdGVtcGxhdGVzIGluc2lkZSBvZiBvdGhlcgogICAgICAgICAgICBuYW1lc3BhY2VzLiAgIFNXSUcgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZSByYXRoZXIKICAgICAgICAgICAgdGhhbiBnZW5lcmF0aW5nIGJyb2tlbiB3cmFwcGVycy4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MDAwMTIgXSBFTlRFUiBtYWNybyBmcm9tIENPUkUvc2NvcGUuaCBjbGFzaGVzIHdpdGggbGliYyBzZWFyY2guaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODExNTE4IF0gQ2FzdGluZyBpbnRzIHRvIGRvdWJsZXMgKHcvIHNvbHV0aW9uPykKICAgICAgICAgICAgQWRkcmVzc2VzIGEgcHJvYmxlbSB3aXRoIG92ZXJsb2FkaW5nIGluIHRoZSBQZXJsIG1vZHVsZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIERhbGxleS4KCjA5LzI4LzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGUgd2l0aCAtc2NtIG9wdGlvbl0gRml4IHR5cG8gaW4gZ2VuZXJhdGVkIGNvZGUgZm9yCgkgICAgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMuICBSZXBvcnRlZCBieSBKb2huIExlbnouCgowOS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODEyNTI4IF0gZXh0ZXJucyBub3QgY29ycmVjdCB3aGVuIHRocm93IGlzIGluIHNpZ25hdHVyZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCiAgICAgICAgICAgIAowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU1dJRyB3YXMgZ2VuZXJhdGluZyBhIG51bWJlciBvZiBzeW1ib2xzIHRoYXQgZGlkbid0IGNvbXBseSB3aXRoIAogICAgICAgICAgICB0aGUgSVNPIEMvQysrIHN0YW5kYXJkLCBpbiBwYXJ0aWN1bGFyIElTTy9JRUMgMTQ4ODI6MTk5OChFKSAxNy40LjMuMS4yCiAgICAgICAgICAgIHdoZXJlIGRvdWJsZSB1bmRlcnNjb3JlcyBhcmUgZm9yYmlkZGVuIGFzIHdlbGwgYXMgc3ltYm9scyBzdGFydGluZyB3aXRoCiAgICAgICAgICAgIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE1vc3Qgb2YgdGhlc2UgaGF2ZQogICAgICAgICAgICBiZWVuIHJvb3RlZCBvdXQuIFNlZSBuZXcgc2VjdGlvbiBhZGRlZCB0byBpbnRlcm5hbHMuaHRtbCBkZXZlbG9wbWVudAogICAgICAgICAgICBtYW51YWwgJ1N5bWJvbCBOYW1pbmcgR3VpZGVsaW5lcyBmb3IgR2VuZXJhdGVkIEMvQysrIENvZGUnLgoKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpcmVjdG9yIHR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBpbnYgICAgID0+IGRpcmVjdG9yaW4KICAgICAgICAgICAgb3V0diAgICA9PiBkaXJlY3Rvcm91dAogICAgICAgICAgICBhcmdvdXR2ID0+IGRpcmVjdG9yYXJnb3V0CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzE5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIGNvbnN0cnVjdG9ycyBub3cgZGVmYXVsdCB0byBfX2Rpc293biA9IDAsIAoJICAgIHdoaWNoIGlzIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBhbmQgZml4ZXMgdGhlIGRpcmVjdG9yX2ZpbmFsaXplciAKCSAgICB0ZXN0IGNhc2UgdW5kZXIgcHl0aG9uLgoKMDkvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gLSBUeXBlbWFwcyBhZGRlZCBmb3Igc3RkOjpzdHJpbmcgYW5kIGNvbnN0IHN0ZDo6c3RyaW5nICYuCiAgICAgICAgICAgICAgICAgLSBOZXcgZGVsZWdhdGUgZm9yIGNyZWF0aW5nIGEgQyMgc3RyaW5nIGdpdmVuIGEgY2hhciAqLiBJdAogICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgYnkgY2FsbGluZyBTV0lHX2NzaGFycF9zdHJpbmdfY2FsbGJhY2sgYXMgc2hvd24KICAgICAgICAgICAgICAgICAgIGluIHRoZSBzdGQ6OnN0cmluZyAnb3V0JyB0eXBlbWFwLiBVc2VmdWwgaWYgdGhlIHJldHVybiB0eXBlIGlzCiAgICAgICAgICAgICAgICAgICBtYXBwZWQgdG8gYSBDIyBzdHJpbmcgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIAogICAgICAgICAgICAgICAgICAgZm9yIGNsZWFuaW5nIHVwIG1lbW9yeSBhcyB0aGUgQyMgZ2FyYmFnZSBjb2xsZWN0b3IgZG9lc24ndAogICAgICAgICAgICAgICAgICAgZnJlZSB0aGUgbWVtb3J5IGNyZWF0ZWQgaW4gQy9DKysgYW5kIHRoZW4gcmV0dXJuZWQgYXMgYSBDIyBzdHJpbmcuCiAgICAgICAgICAgICAgICAgLSBUaGUgZXhjZXB0aW9uIGRlbGVnYXRlcyBoYXZlIG1vdmVkIGludG8gYW4gaW5uZXIgY2xhc3MgaW4gdGhlCiAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgY2xhc3MsIHRoZXJlYnkgZnJlZWluZyB1cCB0aGUgc3RhdGljIGNvbnN0cnVjdG9yLgoKMDkvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICAoSW50ZXJuYWxzKQogICAgICAgICAgICBNYWpvciByZWZhY3RvcmluZyBvZiBpdGVyYXRpb24gb3ZlciBsaXN0cyBhbmQgaGFzaGVzLiAgVGhlCiAgICAgICAgICAgIERPSCBsaWJyYXJ5IG5vdyB1c2VzIGl0ZXJhdG9ycy4gIFRoZXkgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgTGlzdCAqbCA9IChzb21lIGxpc3QpOwoKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBjb250YWlucyB0aGUgYWN0dWFsIGxpc3QgaXRlbS4KICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gaXMgTlVMTCBhdCBlbmQgb2YgbGlzdAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEhhc2ggKmggPSAoc29tZSBoYXNoKTsKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGo7CiAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChoKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGouaXRlbSBjb250YWlucyBoYXNoIHRhYmxlIGl0ZW0KICAgICAgICAgICAgICAgICAgICAvLyBqLmtleSAgY29udGFpbnMgaGFzaCB0YWJsZSBrZXkKICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIGouaXRlbSBhbmQgai5rZXkgYXJlIE5VTEwgYXQgZW5kCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgVGhlIG9sZCBpdGVyYXRpb24gZnVuY3Rpb25zIEZpcnN0aXRlbSgpLCBOZXh0aXRlbSgpLCBGaXJzdGtleSgpLAogICAgICAgICAgICBhbmQgTmV4dGtleSgpIGFyZSBnb25lLiAgCgogICAgICAgICAgICBUaGUgbmV3IGl0ZXJhdG9ycyBhcmUgc2ltcGxlciwgcmVzdWx0IGluIGJldHRlciBtZW1vcnkgdXNlLAogICAgICAgICAgICBhbmQgbWF5IGJlIGZhc3Rlci4gIEFsc28sIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IHByb2JsZW1zCiAgICAgICAgICAgIGl0ZXJhdGluZyBvdmVyIHRoZSBzYW1lIGxpc3QvaGFzaCBpbiBtdWx0aXBsZSBwbGFjZXMgYXQKICAgICAgICAgICAgdGhlIHNhbWUgdGltZS4gIEZvciBleGFtcGxlLCB0aGlzIGlzIGZpbmU6CgogICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGksajsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGwpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKFRoaXMgbmV2ZXIgd29ya2VkIGluIHByZXZpb3VzIHZlcnNpb25zKS4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLiAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIAogICAgICAgICAgICB0aGlyZCBwYXJ0eSBleHRlbnNpb25zIHRvIFNXSUcgKG9yIGdpdmUgdGhlbSBmdXJ0aGVyIGVuY291cmFnZW1lbnQKICAgICAgICAgICAgdG8gam9pbiB0aGUgU1dJRyBDVlMtdHJlZSA6LSkuCgowOS8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggbWVtb3J5IGxlYWtzIGluIHRoZSAibGlzdC12ZWN0b3IuaSIgdHlwZW1hcHMuCgowOS8wOS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIFVzZSBDX21rX2Jvb2wgcmF0aGVyIHRoYW4gQ19ta2Jvb2wuICBUaGlzIGZpeGVzCgkgICAgdGhlIHdyYXBwaW5nIG9mIGJvb2xlYW4gdmFsdWVzIGZvciBDaGlja2VuIDEuMTAgYW5kIG5ld2VyLgoJICAgIFJlcG9ydGVkIGJ5IERhdmUgPGh1bmRvQHlhaG9vLmNvbT4gLyBGZWxpeCBXaW5rZWxtYW5uCgkgICAgPGZlbGl4QHByb3hpbWEtbXQuZGU+LgoKMDkvMDUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvcnMgaW1wbGVtZW50ZWQgZm9yIEphdmEuIEluIHN1bW1hcnkgdGhpcyBpcyBhIGJpZyBuZXcgZmVhdHVyZSAKICAgICAgICAgICAgd2hpY2ggc3VwcG9ydHMgdXBjYWxscyBmcm9tIEMrKyB0byBKYXZhLiBDb2RlIGlzIGdlbmVyYXRlZCB0byBzdXBwb3J0IEMrKyAKICAgICAgICAgICAgY2FsbGJhY2tzIHRvIGNhbGwgaW50byBKYXZhIGFuZCB0cnVlIHBvbHltb3JwaGljIGJlaGF2aW91ciBmb3IgSmF2YSBjbGFzc2VzIAogICAgICAgICAgICBkZXJpdmVkIGZyb20gQysrIGNsYXNzZXMuIFNlZSBqYXZhLmh0bWwgZm9yIGRldGFpbHMuIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBTY290dCBNaWNoZWwuCgowOS8wNS8yMDAzOiBUaWdlcgogICAgICAgICAgICBDcmVhdGVkIGNvbnRyYWN0IGV4YW1wbGUgZGlyZWN0b3J5IGF0IC9TV0lHL0V4YW1wbGVzL2NvbnRyYWN0CiAgICAgICAgICAgIEFkZGVkIHNpbXBsZSBjb250cmFjdCBleGFtcGxlcyAoc2ltcGxlX2MgJiBzaW1wbGVfY3h4KQogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBtb2R1bGUncyBvdXRwdXQgZm9ybWF0CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGVzdC1zdWl0ZSBidWlsZCBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIC0gTXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgd29ya2luZyBmb3IgdGhlIHRlc3Qgc3VpdGUsIHNvIGl0IGlzIG5vdwogICAgICAgICAgICAgIHBvc3NpYmxlIHRvIHJ1biBjb25maWd1cmUgaW4gbXVsdGlwbGUgc3ViZGlyZWN0b3JpZXMgYW5kIHJ1biB0aGUgdGVzdAogICAgICAgICAgICAgIHN1aXRlIGluIGVhY2ggb2YgdGhlc2Ugc3ViIGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtICdtYWtlIGRpc3RjbGVhbicgZml4ZWQgc28gaXQgZG9lc24ndCBib21iIG91dCBvbiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgd2hlbiB1c2luZyBtdWx0aXBsZSBzdWJkaXJldG9yeSBidWlsZHMuIFJlcXVpcmVkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMKICAgICAgICAgICAgICB0byBiZSBtb3ZlZDoKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGVybCAtPiBFeGFtcGxlcy9HSUZQbG90L1Blcmw1CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BocCAgLT4gRXhhbXBsZXMvR0lGUGxvdC9QaHA0CiAgICAgICAgICAgICAgVGhlc2UgbmV3IGRpcmVjdG9yaWVzIHVzZWQgdG8gYmUgc3ltYm9saWMgbGlua3MgdG8gdGhlIG9sZCBkaXJlY3RvcnkuCiAgICAgICAgICAgICAgQWxzbyB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9QZXJsIHN5bWJvbGljIGxpbmsgaGFzIGJlZW4gcmVtb3ZlZC4KICAgICAgICAgICAgLSBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBvdGhlciB0aGFuIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LCBzYXkKICAgICAgICAgICAgICBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL3B5dGhvbiB3aWxsIG5vdyBkaXNwbGF5IGFsbCB0aGUgY29kZSBiZWluZwogICAgICAgICAgICAgIGV4ZWN1dGVkLgogICAgICAgICAgICAtIFRoZSBmb2xsb3dpbmcgMyBDIyBjb21waWxlcnMgYXJlIGRldGVjdGVkIGR1cmluZyBjb25maWd1cmUgYW5kIHdvcmsgd2l0aCAKICAgICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZTogTW9ubywgUG9ydGFibGUuTkVUIGFuZCBNaWNyb3NvZnQuCgowOS8wMS8yMDAzOiBUaWdlcgogICAgICAgICAgICBBZGRlZCBpbmhlcml0YW5jZSBzdXBwb3J0IGZvciBkZXNpZ24gYnkgY29udHJhY3QgZmVhdHVyZS4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTQ5MTQgXSBXcm9uZyB0eXBlcyBpbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgU1dJRyB3YXMgbm90IGhhbmRsaW5nIGFyZ3VtZW50cyBjb3JyZWN0bHkgaW4gdGVtcGxhdGUgCiAgICAgICAgICAgIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb288VCAqPiB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgVCAqYmxhaCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vSW50KSBGb288aW50ICo+OwoKICAgICAgICAgICAgaW4gdGhpcyBjbGFzcywgdGhlIHJldHVybiB0eXBlIG9mIGJsYWggd2FzIHNldCB0bwogICAgICAgICAgICAnaW50ICoqJywgYnV0IGl0IHNob3VsZCByZWFsbHkgYmUgJ2ludCAqJy4gIFRoaXMgaGFzIGJlZW4KICAgICAgICAgICAgZml4ZWQsIGJ1dCBpdCB3aWxsIGFmZmVjdCBhbGwgcHJpb3IgdXNlcyBvZiBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uLgogCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODYzOTQgXSBQYXRjaCBmb3IgZ2VuZXJhdGVkIHBlcmwgY29kZSBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFJlZEhhdDkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNjb3R0IEZpbm5lcmFuLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTU3OSBdICh1bnNpZ25lZCkgbG9uZyBsb25nIGhhbmRsZWQgaW5jb3JyZWN0bHkgKFRjbCkuCiAgICAgICAgICAgIFRoaXMgd2FzIGFuIGVycm9yIGluIHRoZSBUY2wgdHlwZW1hcHMuaSBmaWxlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgS2plbGwgV29vZGluZy4KICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3MyBdIG5vIHdheSB0byByZW5hbWUgY2xhc3NlcyBjb21pbmcgZnJvbSBDIHN0cnVjdHVyZXMuCiAgICAgICAgICAgIFRoaXMgcHJvYmxlbSByZWxhdGVzIHRvIHJlbmFtaW5nIG9mIGFub255bW91cyBzdHJ1Y3R1cmVzIHdpdGggYQogICAgICAgICAgICB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6IAoKICAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KICAgICAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzYgXSAtaGVscCBzZWVtcyB0byBpbXBseSB0aGF0IG9ubHkgdGNsLXNwZWNpZmljIG9wdGlvbnMgZXhpc3QuCiAgICAgICAgICAgIEFkZGVkIGEgY29tbWVudCB0byBhbGVydCB1c2VyIHRvIG90aGVyIG9wdGlvbnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5ODIwNSBdIFNlZ2ZhdWx0IGluIFNXSUdfQ29udmVydFB0ci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUHJhYmh1IFJhbWFjaGFuZHJhbi4KCjA4LzMwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1vZGlmaWVkIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBpbiBweXRob24vc3RkX2NvbXBsZXguaSB0byB1c2UgdGhlIAoJICAgIG5ldy1zdHlsZSBtYWNybyBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMsIHdoaWNoIGVsaW1pbmF0ZWQgc29tZQoJICAgIHJlZHVuZGFudCBjb2RlLiAgRml4ZWQgYSBmZXcgYnVncyBpbiB0aGVzZSB0eXBlbWFwcyBhcyB3ZWxsLCBhbHRob3VnaAoJICAgIG1vcmUgdGVzdGluZyBpcyBuZWVkZWQuCgowOC8yOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDb21wbGV0ZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBhYnN0cmFjdCBjbGFzc2VzIHdpdGggZGlyZWN0b3JzLgoJICAgIENvbnN0cnVjdG9yIHdyYXBwZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhYnN0cmFjdCBjbGFzc2VzIHRoYXQgaGF2ZQoJICAgIGRpcmVjdG9ycywgYW5kIGluc3RhbmNlcyBvZiB0aGUgZGlyZWN0b3IgY2xhc3NlcyB3aWxsIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcwoJICAgIG9mIHdoZXRoZXIgdGhlIHByb3h5IGNsYXNzIGhhcyBiZWVuIHN1YmNsYXNzZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCSAgICBObyBjaGVja3MgYXJlIG1hZGUgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgcHVyZSB2aXJ0dWFsCgkgICAgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEluc3RlYWQsIGNhbGxzIHRvCgkgICAgdW5pbXBsZW1lbnRlZCBtZXRob2RzIHdpbGwgdGhyb3cgU1dJR19ESVJFQ1RPUl9QVVJFX1ZJUlRVQUxfRVhDRVBUSU9OCgkgICAgZXhjZXB0aW9ucyBpbiBDKysuCgoJICAgIEludGVncmF0ZWQgUHJhYmh1IFJhbWFjaGFuZHJhbidzIHR5cGVtYXAgcGF0Y2hlcywgd2hpY2ggcHJvdmlkZSBkaXJlY3RvcgoJICAgIHR5cGVtYXAgc3VwcG9ydCBmb3IgZW51bXMgYW5kIHN0ZDo6c2l6ZV90LCBhbmQgZml4IGEgY291cGxlIGJ1Z3MgaW4gdGhlIAoJICAgIGRpcmVjdG9yIHN0ZDo6dmVjdG9yPD4gdHlwZW1hcHMuCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXBsZW1lbnRlZCBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHRocm93aW5nIEMjIGV4Y2VwdGlvbnMgZnJvbSBDL0MrKyBjb2RlLgogICAgICAgICAgICBBIGZldyBkZWxlZ2F0ZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgY2FsbGluZyB3aGljaCB0aGVuIHRocm93IHRoZSBDIwogICAgICAgICAgICBleGNlcHRpb24uIFVzZSB0aGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbiBmdW5jdGlvbiBmcm9tIEMvQysrIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgb3IgY3NoYXJwaGVhZC5zd2cgZm9yIGFsbCBhdmFpbGFibGUgZXhjZXB0aW9ucy4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbihTV0lHX0NTaGFycEV4Y2VwdGlvbiwgImV4Y2VwdGlvbiBkZXNjcmlwdGlvbiIpOwoKICAgICAgICAgICAgVGhlICd0aHJvd3MnIHR5cGVtYXBzIGFyZSBhbHNvIG5vdyBpbXBsZW1lbnRlZCwgc28gY29kZSBpcyBhdXRvbWF0aWNhbGx5IAogICAgICAgICAgICBnZW5lcmF0ZWQgdG8gY29udmVydCBhbnkgQysrIGV4Y2VwdGlvbiBpbnRvIGEgQyMgU3lzdGVtLkV4Y2VwdGlvbiB3aGVuIHRoZSBDKysgCiAgICAgICAgICAgIG1ldGhvZCBkZWNsYXJlcyBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBzdWNoIGFzOgoKICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEJhcik7CgogICAgICAgICAgICBBbHNvIGFueSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHJlZmVyZW5jZXMgdG8gYSBDKysgY2xhc3Mgb3IgYSBjbGFzcyBwYXNzZWQgYnkgdmFsdWUKICAgICAgICAgICAgYW5kIGFyZSBwYXNzZWQgYXMgYSBDIyBudWxsIHdpbGwgbm93IHRocm93IGEgQyMgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbi4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCB0byBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIGFsbCBwaW52b2tlIG1ldGhvZHMgc28gdGhhdCB0aGV5CiAgICAgICAgICAgIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBieSBkZWZhdWx0IGluIHRoZSBDIyAnc3RhdGljIGV4dGVybicgZGVjbGFyYXRpb25zIAogICAgICAgICAgICAoX19zdGRjYWxsIGlzIHVzZWQgb24gV2luZG93cykuCgowOC8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJld29ya2VkIHN0ZDo6c3RyaW5nIHR5cGVtYXBzLiBGaXhlcyBhIG51bWJlciBvZiBzdHJpbmcgaW4gc3RkIG5hbWVzcGFjZSAKICAgICAgICAgICAgcHJvYmxlbXMuIEZvciBleGFtcGxlICV0ZW1wbGF0ZSB2ZWN0b3I8c3RyaW5nPi4gVGhlIHRlbXBsYXRlZCBjbGFzcycgZ2V0IG1ldGhvZCAKICAgICAgICAgICAgd2Fzbid0IHJldHVybmluZyBhIEphdmEgU3RyaW5nLCBidXQgYSBTV0lHVFlQRV9wX3N0cmluZy4gUmVwb3J0ZWQKICAgICAgICAgICAgYnkgWmFjaCBCYXVtLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzUyMiBdIDEuMy4xOSBzZWdmYXVsdCBpbiBTd2lnVHlwZV9hZGRfcG9pbnRlci9Eb2hJbnNlcnRpdGVtLgogICAgICAgICAgICBSZWxhdGVkIHRvIHByb2JsZW0gd2l0aCB1bm5hbWVkIGNsYXNzIGhhbmRsaW5nIGluIFBlcmwgbW9kdWxlLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzU2MyBdIE1pc3NpbmcgaW5kaWNhdGlvbiBvZiBvcHRpb25hbCBhcmd1bWVudHMuCiAgICAgICAgICAgIFRjbCBtb2R1bGUuICBSZXBvcnRlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NzQzMiBdIGxvbmcgcGFyYW0gaGFuZGxlZCBhcyBpbnQuICBUY2wgbW9kdWxlCiAgICAgICAgICAgIG5vdyB1c2VzIFRjbF9HZXRMb25nRnJvbU9iaiB0byBjb252ZXJ0IGludGVnZXIgdmFsdWVzLgoKMDgvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTk4OSBdIG51bWVyaWMgdGVtcGxhdGUgcGFyYW1ldGVycy4gICBUaGVyZSB3ZXJlCiAgICAgICAgICAgIHNvbWUgZXJyb3JzIGluIHRlbXBsYXRlIGV4cGFuc2lvbiByZWxhdGVkIHRvIHRoZSB1c2Ugb2YKICAgICAgICAgICAgYXJyYXlzIHdoZXJlIHRoZSBhcnJheSBkaW1lbnNpb24gd2FzIGEgdGVtcGxhdGUgcGFyYW1ldGVyLgogICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBSZXBvcnRlZCBieSBCcnlhbiBHcmVlbi4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIGEgZGlyZWN0b3IgdHlwZW1hcCAob3V0dikgZm9yIHJldHVybiBieSB2YWx1ZSBhbmQgY2xlYW5lZCB1cCB1cCBhIGZldyAKCSAgICBvZiB0aGUgY29tbWVudGVkIGRpcmVjdG9yIHR5cGVtYXBzLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiBmb3IgZGlyZWN0b3IgY2xhc3NlcyB0byBpZ25vcmUgcHJpdmF0ZQoJICAgIGNvbnN0cnVjdG9ycy4gIFByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYXJlIGFsc28gaWdub3JlZCBmb3Igbm93LCBwZW5kaW5nCgkgICAgYSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBvZiB3cmFwcGluZyBjbGFzc2VzIHRoYXQgb25seSBkZWZpbmUgcHJvdGVjdGVkCgkgICAgY29uc3RydWN0b3JzLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW91dGRpciA8ZGlyPiB0byBzcGVjaWZ5IHdoZXJlIHRoZSBsYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBmaWxlcyBhcmUgdG8gYmUgZ2VuZXJhdGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGFyZ2V0IGxhbmd1YWdlcyBsaWtlIFB5dGhvbiwKICAgICAgICAgICAgSmF2YSBldGMgd2hpY2ggZ2VuZXJhdGUgcHJveHkgZmlsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIGxhbmd1YWdlLgogICAgICAgICAgICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byB0aGUgQy9DKysgd3JhcHBlciBmaWxlLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE9uIFdpbmRvd3MgdGhlIGdlbmVyYXRlZCBmaWxlcyAob3RoZXIgdGhhbiB0aGUgX3dyYXAuYyBvciBfd3JhcC5jeHggZmlsZXMpCiAgICAgICAgICAgIHdlcmUgc29tZXRpbWVzIGluY29ycmVjdGx5IGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1bmxlc3MKICAgICAgICAgICAgdGhlIGlucHV0IGZpbGUgdXNlZCB0aGUgVW5peCBwYXRoIHNlcGFyYXRvci4gVGhlIFdpbmRvd3MgcGF0aCBzZXBhcmF0b3IgCiAgICAgICAgICAgIHNob3VsZCBub3cgYmUgdXNlZC4gQnVnIHJlcG9ydGVkIGJ5IFJvYmVydCBEYXZpZXMuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFycmF5IHZhcmlhYmxlIHNldCB0eXBlbWFwIHRvIFBlcmwgbW9kdWxlLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTY3NyBdIEFycmF5IGluaXQgY2F1c2VzIGNvZGVnZW4gYnVnLi4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzkwNjIgXSBDbGFzcyJcbiI6OmZvbyBub3Qgc3VwcG9ydGVkLiAgU1dJRwogICAgICAgICAgICBzaG91bGQgbm93IGNvcnJlY3RseSBoYW5kbGUgd2hpdGVzcGFjZSBpbiBiZXR3ZWVuIAogICAgICAgICAgICBuYW1lc3BhY2UgcXVhbGlmaWVycy4gIEZvciBleGFtcGxlICJBIDo6IEZvbyA6OiBCYXIiLgogICAgICAgICAgICAKMDcvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjbGFzc2VzIHRoYXQgYXJlIHBhc3NlZCBieSB2YWx1ZSBhbmQgaGF2ZSAKICAgICAgICAgICAgYSBkZWZhdWx0IHZhbHVlLiBBIGNvcHkgY29uc3RydWN0b3IgZm9yIFN3aWdWYWx1ZVdyYXBwZXIgaXMgcmVxdWlyZWQgCiAgICAgICAgICAgIChTRiAjNzgwMDU2KS4gQWxzbyBmaXhlZCBtZW1vcnkgbGVhayBpbiB0aGVzZSBjaXJjdW1zdGFuY2VzLiBUaGVzZSBtb2RzCiAgICAgICAgICAgIGFsc28gZml4IFNGICM3ODAwNTQuCgowNy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHJ1bi10aW1lIGVycm9yIG1lc3NhZ2UgZm9yIHBvaW50ZXJzIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFpvb2tvLgoKMDcvMTAvMjAwMzogYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBbQWxtb3N0IGFsbCBsYW5ndWFnZXNdIFdyYXBwZXJzIGZvciBzdGQ6OnBhaXIgYWRkZWQuCgkgICAgVHlwZW1hcHMgZm9yIFB5dGhvbiwgUnVieSwgR3VpbGUgYW5kIE16U2NoZW1lLgoKMDcvMDEvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBIYW5kbGUgdGhlIGNhc2Ugb2YgbW9yZSB0aGFuIG9uZSBhcmdvdXQgdHlwZW1hcAoJICAgIHBlciBmdW5jdGlvbi4KCjA2LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFNGICM2NzA5NDkgcmVxdWVzdC4gVGhlIGRlc3RydWN0b3Igd3JhcHBlciBmdW5jdGlvbiBuYW1lIGlzIG5vdyAKICAgICAgICAgICAgY29uZmlndXJhYmxlLiAgQSBuZXcgYXR0cmlidXRlIGNhbGxlZCBtZXRob2RuYW1lIGluIHRoZSAKICAgICAgICAgICAgamF2YWRlc3RydWN0L2phdmFkZXN0cnVjdF9kZXJpdmVkIChKYXZhKSBvciBjc2Rlc3RydWN0L2NzZGVzdHJ1Y3RfZGVyaXZlZCAoQyMpCiAgICAgICAgICAgIHR5cGVtYXBzIHNwZWNpZmllcyB0aGUgbWV0aG9kIG5hbWUuIEZvciBleGFtcGxlIGluIEphdmEgdGhlIGRlc3RydWN0b3IgaXMgCiAgICAgICAgICAgIHdyYXBwZWQgYnkgZGVmYXVsdCB3aXRoIHRoZSBkZWxldGUgbWV0aG9kOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFkZXN0cnVjdCwgbWV0aG9kbmFtZT0iZGVsZXRlIikgU1dJR1RZUEUgey4uLn0KCjA2LzI3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSB0aHJvd3MgYXR0cmlidXRlIGZvciBhZGRpbmcgZXhjZXB0aW9uIGNsYXNzZXMgdG8gdGhlIHRocm93cwogICAgICAgICAgICBjbGF1c2UgYWxzbyBub3cgd29ya3Mgd2l0aCB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiAKICAgICAgICAgICAgbmV3ZnJlZQogICAgICAgICAgICBqYXZhaW4sIGphdmFvdXQgKEphdmEpCiAgICAgICAgICAgIGNzaW4sIGNzb3V0IChDIykKCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgJ0FuRXhjZXB0aW9uJyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0aHJvd3MgY2xhdXNlIGluIHRoZQogICAgICAgICAgICBwcm94eSBmdW5jdGlvbjoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQsIHRocm93cz0iQW5FeGNlcHRpb24iKSBpbnQgewogICAgICAgICAgICAgICAgaW50IHJldHVyblZhbHVlPSRqbmljYWxsOwogICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlPT0wKSB0aHJvdyBuZXcgQW5FeGNlcHRpb24oIlZhbHVlIG11c3Qgbm90IGJlIHplcm8iKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgfQoKMDYvMjUvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgdHlwZW1hcCBtYXJzaGFsbGluZyBjaGVja3MgZm9yIG51bGwgcG9pbnRlcnMgd2hlbgoJICAgIHdhbGtpbmcgdGhlIHBhcmFtZXRlciBsaXN0IGluc3RlYWQgb2YgcmVseWluZyBzb2xleSBvbiB0aGUgcGFyYW1ldGVyCgkgICAgY291bnQuICBDdXJlcyBhIHNlZ2ZhdWx0IHRoYXQgb2NjdXJyZWQgZm9yIG11bHRpcGxlIGFyZ3VtZW50IGludiB0eXBlbWFwcy4KCSAgICBTb21lb25lIHdpdGggbW9yZSBTd2lnIGV4cGVyaWVuY2Ugc2hvdWxkIHByb2JhYmx5IHJldmlldyB0aGlzIGNvZGUuCgowNi8yNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIERvbid0IGVtaXQgY2FsbHMgdG8gIkNfY2hlY2tfZm9yX2ludGVycnVwdCIsCgkgICAgd2hpY2ggbWF5IHJlc3VsdCBpbiBhbiBlbmRsZXNzIGxvb3AuICBQYXRjaCBieSBmZWxpeEBwcm94aW1hLW10LmRlLgoKMDYvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRmluYWxpemVycyBub3cgdXNlIGRlc3RydWN0b3Igc3ludGF4IGFzIHRoZSBvdmVycmlkZSB3aGljaCB3YXMgdXNlZCBpbiAKICAgICAgICAgICAgdGhlIEZpbmFsaXplIG1ldGhvZCBpcyBub3QgaW4gdGhlIEVDTUEgc3RhbmRhcmRzLCBzcG90dGVkIGJ5IHRoZSBNUyBjb21waWxlci4KCjA2LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEEgbnVtYmVyIG9mIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcmVtb3ZlIHRoZSBKYXZhIG5hbWluZyAKICAgICAgICAgICAgdGhhdCB3YXMgdXNlZCBpbiB0aGUgQyMgbW9kdWxlLgogICAgICAgICAgICAKICAgICAgICAgICAgVHlwZW1hcCBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGpuaSAgICAgICAgICAgICAgICAgICAgICAgICAtPiBjdHlwZQogICAgICAgICAgICBqdHlwZSAgICAgICAgICAgICAgICAgICAgICAgLT4gaW10eXBlCiAgICAgICAgICAgIGpzdHlwZSAgICAgICAgICAgICAgICAgICAgICAtPiBjc3R5cGUKICAgICAgICAgICAgamF2YWluICAgICAgICAgICAgICAgICAgICAgIC0+IGNzaW4KICAgICAgICAgICAgamF2YW91dCAgICAgICAgICAgICAgICAgICAgIC0+IGNzb3V0CiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzICAgICAgICAgICAgICAtPiBjc2ludGVyZmFjZXMKICAgICAgICAgICAgamF2YWJhc2UgICAgICAgICAgICAgICAgICAgIC0+IGNzYmFzZQogICAgICAgICAgICBqYXZhY2xhc3Ntb2RpZmllcnMgICAgICAgICAgLT4gY3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqYXZhY29kZSAgICAgICAgICAgICAgICAgICAgLT4gY3Njb2RlCiAgICAgICAgICAgIGphdmFpbXBvcnRzICAgICAgICAgICAgICAgICAtPiBjc2ltcG9ydHMKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIC0+IGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMKICAgICAgICAgICAgamF2YWdldGNwdHIgICAgICAgICAgICAgICAgIC0+IGNzZ2V0Y3B0cgogICAgICAgICAgICBqYXZhZmluYWxpemUgICAgICAgICAgICAgICAgLT4gY3NmaW5hbGl6ZQoKICAgICAgICAgICAgRmVhdHVyZSBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGphdmFjb25zdCAgICAgICAgICAgICAgICAgICAtPiBjc2NvbnN0CiAgICAgICAgICAgIGphdmFtZXRob2Rtb2RpZmllcnMgICAgICAgICAtPiBjc21ldGhvZG1vZGlmaWVycwoKICAgICAgICAgICAgUHJhZ21hIGNoYW5nZXM6CiAgICAgICAgICAgIHByYWdtYShqYXZhKSAgICAgICAgICAgICAgICAtPiBwcmFnbWEoY3NoYXJwKQogICAgICAgICAgICBqbmljbGFzc2Jhc2UgICAgICAgICAgICAgICAgLT4gaW1jbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycyAgICAgIC0+IGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2NvZGUgICAgICAgICAgICAgICAgLT4gaW1jbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnRzICAgICAgICAgICAgIC0+IGltY2xhc3NpbXBvcnRzCiAgICAgICAgICAgIGpuaWNsYXNzaW50ZXJmYWNlcyAgICAgICAgICAtPiBpbWNsYXNzaW50ZXJmYWNlcwoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZSBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgICRqYXZhY2xhc3NuYW1lICAgICAgICAgICAgICAtPiAkY3NjbGFzc25hbWUKICAgICAgICAgICAgJGphdmFpbnB1dCAgICAgICAgICAgICAgICAgIC0+ICRjc2lucHV0CiAgICAgICAgICAgICRqbmljYWxsICAgICAgICAgICAgICAgICAgICAtPiAkaW1jYWxsCgogICAgICAgICAgICBUaGlzIHdpbGwgYnJlYWsgU1dJRyBpbnRlcmZhY2UgZmlsZXMgdGhhdCB1c2UgdGhlc2UgdHlwZW1hcHMsIGZlYXR1cmVzCiAgICAgICAgICAgIGFuZCBwcmFnbWFzLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSBvciB1c2UgbWFjcm9zIGZvciBiYWNrd2FyZHMKICAgICAgICAgICAgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNi8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBBcHBsaWVkIE16U2NoZW1lIG1vZHVsZSB1cGRhdGVzIGNvbnRyaWJ1dGVkIGJ5CgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LgoKICAgICAgICAgICAgLSBVcGRhdGVkIG16c2NoZW1lIHRvIHVzZSBTV0lHJ3MgY29tbW9uIHJ1bnRpbWUgdHlwZQogICAgICAgICAgICAgIHN5c3RlbSBmcm9tIGNvbW1vbi5zd2cuIAoKCSAgICAtIFRoZSBMaWIvbXpzY2hlbWUgZGlyZWN0b3J5IGhhcyBiZWVuIHJlb3JnYW5pemVkIHRvCiAgICAgICAgICAgICAgc3RhbmRhcmRpemUgbmFtZXMgYWNyb3NzIHRoZSBsYW5ndWFnZSBtb2R1bGVzOgogICAgICAgICAgICAgIG16c2NoZW1lLmkgd2FzIG1vdmVkIHRvIG16c2NoZW1lLnN3ZywgbXpzY2hlbWUuc3dnIGFuZAogICAgICAgICAgICAgIG16c2NoZW1lZGVjLnN3ZyBoYXZlIGJlZW4gcmVtb3ZlZCwgbXpydW4uc3dnICh3aGljaAogICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBydW50aW1lIGNvZGUpIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgLSBUaGUgc3dpZ19wcm94eSBzdHJ1Y3R1cmUgd2FzIHJlbmFtZWQgdG8gc3dpZ19tel9wcm94eS4KICAgICAgICAgICAgICBzd2lnX216X3Byb3h5IG5vdyBjb250YWlucyBhIHBvaW50ZXIgdG8gYSBzd2lnX3R5cGVfaW5mbwogICAgICAgICAgICAgIHN0cnVjdHVyZS4gIAoKCSAgICAtIEFkZGVkIHZhcmluIGFuZCB2YXJvdXQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFIFtdIGFuZAogICAgICAgICAgICAgIFNXSUdUWVBFICYuCgoJICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGJ5IGNhbGxpbmcgc2NoZW1lX2FkZF9maW5hbGl6ZXIoKSBoYXMKICAgICAgICAgICAgICBiZWVuIGFkZGVkLgoKCSAgICAqKiogTkVXIEZFQVRVUkUgW016U2NoZW1lXSAqKioKCjA2LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IHR5cGVtYXBzOiBqYXZhZGVzdHJ1Y3QgYW5kIGphdmFkZXN0cnVjdF9kZXJpdmVkCiAgICAgICAgICAgIGZvciB0aGUgQysrIGRlc3RydWN0b3Igd3JhcHBlci4gVGhlIGphdmFkZXN0cnVjdCB2ZXJzaW9uIGdldHMgdXNlZCBieQogICAgICAgICAgICBjbGFzc2VzIGF0IHRoZSB0b3Agb2YgYW4gaW5oZXJpdGFuY2UgY2hhaW4gYW5kIHRoZSBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCAKICAgICAgICAgICAgdmVyc2lvbiBnZXRzIHVzZWQgYnkgb3RoZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFtDI10gY2lsZGlzcG9zZSBhbmQgY2lsZGlzcG9zZW92ZXJyaWRlIHR5cGVtYXBzIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgIGNzZGVzdHJ1Y3QgYW5kIGNzZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwcy4gVGhlIGRlbGV0ZSgpCiAgICAgICAgICAgIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGFuZCBpdHMgZnVuY3Rpb25hbGl0eSBwdXQgaW50byB0aGVzZQogICAgICAgICAgICB0eXBlbWFwcyBkZXNpZ25lZCBmb3IgdGhlIERpc3Bvc2UoKSBtZXRob2QuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwcyBjc2ludGVyZmFjZXMgYW5kIGNzaW50ZXJmYWNlc19kZXJpdmVkIHJlcGxhY2UKICAgICAgICAgICAgdGhlIGphdmFpbnRlcmZhY2VzIHR5cGVtYXAuIEFsc28gZml4ZXMgdGhlIHBlY3VsaWFyaXR5IG9mIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGNoYWluIGluZGl2aWR1YWxseSBkZXJpdmluZyBmcm9tIHRoZSBJRGlzcG9zYWJsZSAKICAgICAgICAgICAgaW50ZXJmYWNlLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcCBjc2ZpbmFsaXplIGZvciBmaW5hbGl6ZXJzLiBDKysgZGVzdHJ1Y3RvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgICAgICAgYnkgZ2FyYmFnZSBjb2xsZWN0b3IgZHVyaW5nIGZpbmFsaXphdGlvbi4gUHJvYmxlbSByZXBvcnRlZCBieSAKICAgICAgICAgICAgQW5kcmVhcyBTY2j2cmsuCgowNi8xMC8yMDAzOiBUaWdlcgoJICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgZm9yIGVycm9yIG1lc3NhZ2Ugb3V0cHV0LgogICAgICAgICAgICBDb250cmFjdCBjb2RlIGNhbiBub3cgcHJpbnQgb3V0IHNpbXBsZSBlcnJvciBtZXNzYWdlLgogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIHRvIHByZXBhcmUgZm9yIGluaGVyaXRhbmNlCiAgICAgICAgICAgIAowNi8wMy8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlXSBBcHBsaWVkIEd1aWxlIG1vZHVsZSB1cGRhdGVzIGNvbnRyaWJ1dGVkIGJ5IAoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4gCgoJICAgIC0gU1dJRyBjdXJyZW50bHkgdXNlcyBHdWlsZSdzIGdoXyBBUEksIHdoaWNoIGlzIG1hcmtlZCBhcwoJICAgICAgZGVwcmVjYXRlZCBpbiBHdWlsZSAxLjYgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBHdWlsZQoJICAgICAgMS45LiAgVGhpcyBjaGFuZ2UgaW50cm9kdWNlcyBhIGNvbW1hbmQtbGluZSBmbGFnICItc2NtIgoJICAgICAgd2hpY2ggY2F1c2VzIFNXSUcgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgdGhhdCB1c2UgR3VpbGUncwoJICAgICAgU0NNIEFQSSBpbnN0ZWFkOyB0aGlzIHJlcXVpcmVzIEd1aWxlID49IDEuNi4KCSAgICAKCSAgICAtIFRoZSBMaWIvZ3VpbGUgZGlyZWN0b3J5IGhhcyBiZWVuIHJlb3JnYW5pemVkIHRvCiAgICAgICAgICAgICAgc3RhbmRhcmRpemUgbmFtZXMgYWNyb3NzIGxhbmd1YWdlIG1vZHVsZXM6IGd1aWxlZGVjLnN3ZwogICAgICAgICAgICAgIGFuZCBndWlsZS5zd2cgaGF2ZSBiZWVuIG1vdmVkIGludG8gZ3VpbGVfZ2hfcnVuLnN3ZywKICAgICAgICAgICAgICBndWlsZS5pIGhhcyBiZWVuIG1vdmVkIHRvIGd1aWxlX2doLnN3ZywgZ3VpbGVfc2NtLnN3ZwogICAgICAgICAgICAgIGFuZCBndWlsZV9zY21fcnVuLnN3ZyB3aGljaCBjb250YWluIHRoZSBTQ00gQVBJIHN0dWZmCiAgICAgICAgICAgICAgaGF2ZSBiZWVuIGFkZGVkCgoJICAgIC0gZ2hpbnRlcmZhY2UuaSwgd2hpY2ggY29udGFpbnMgdGhlIGRlZmluZXMgZnJvbSB0aGUgZ2hfCiAgICAgICAgICAgICAgZnVuY3Rpb25zIHRvIHRoZSBzY21fZnVuY3Rpb25zIGhhcyBiZWVuIGFkZGVkCgoJICAgIC0gVGhlIEFQSSBmb3IgZGVhbGluZyB3aXRoIHBvaW50ZXIgb2JqZWN0cyBpcyBub3cKCSAgICAgIFNXSUdfQ29udmVydFB0ciwgU1dJR19NdXN0R2V0UHRyLCBTV0lHX05ld1BvaW50ZXJPYmouCgogICAgICAgICAgICAtIEFkZGVkIHZhcmluIGFuZCB2YXJvdXQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFIFtdIGFuZCBTV0lHVFlQRSAmCgogICAgICAgICAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSBbR3VpbGVdICoqKgoJICAgIAkKMDYvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpbWVuc2lvbmxlc3MgYXJyYXlzIHN1Y2ggYXMgCgogICAgICAgICAgICAgICAgaW50IGZvb1tdID0gezEsIDJ9OwogICAgICAgICAgICAgICAgZXh0ZXJuIGludCBiYXJbXTsKCiAgICAgICAgICAgIHByb2R1Y2UgYSB3YXJuaW5nIHRoYXQgdGhlIHZhcmlhYmxlIGlzIHJlYWQtb25seS4gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2UsIHRoaXMgdXNlZCB0byBjYXVzZSBjb21waWxlIGVycm9ycyBvciBnZW5lcmF0ZSBhIHNldHRlciB0aGF0CiAgICAgICAgICAgIGdlbmVyYXRlZCBhIHJ1bnRpbWUgZXJyb3IuIEEgc2V0dGVyIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICAgICAgICAgICBiZWNhdXNlIHRoZSBhcnJheSBzaXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IFNXSUcuIEEgdmFyaW4sIGdsb2JhbGluIAogICAgICAgICAgICBvciBtZW1iZXJpbiB0eXBlbWFwIChkZXBlbmRpbmcgb24gdGhlIHRhcmdldCBsYW5ndWFnZSkgbXVzdCBiZSB3cml0dGVuIAogICAgICAgICAgICBieSB0aGUgdXNlci4KCjA1LzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lbWVudCB0byBkZWZhdWx0IHR5cGVtYXAgbWF0Y2hpbmcgYW5kIGFycmF5cy4gIFdoZW4gYW4KICAgICAgICAgICAgYXJyYXkgaXMgZGVjbGFyZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vWzRdOwoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcCBub3cgcmVzb2x2ZXMgdG8gCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtBTlldCgogICAgICAgICAgICBJZiBubyBtYXRjaCBpcyBmb3VuZCBmb3IgdGhhdCwgaXQgdGhlbiByZXNvbHZlcyB0bwoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbXQoKICAgICAgICAgICAgSWYgbm8gYXJyYXkgZGltZW5zaW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24sCiAgICAgICAgICAgIHRoZSBTV0lHVFlQRSBbXSBpcyB1c2VkIHJpZ2h0IGF3YXkuIAoKICAgICAgICAgICAgTm90ZTogVGhpcyBjaGFuZ2UgaGFzIGJlZW4gbWFkZSB0byByZXNvbHZlIHByb2JsZW1zIHJlbGF0ZWQgdG8KICAgICAgICAgICAgYXJyYXlzIHdpdGggYW5kIHdpdGhvdXQgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBzb21ldGltZXMgU1dJRwogICAgICAgICAgICB3YXMgZ2VuZXJhdGluZyBzZXR0ZXIgZnVuY3Rpb25zIGZvciBhcnJheSB2YXJpYWJsZXMgd2l0aCBubyBkaW1lbnNpb25zCiAgICAgICAgICAgIChhbiBlcnJvcikuIExpa2V3aXNlLCBTV0lHIHNvbWV0aW1lcyBtYWRlIGFycmF5cyB3aXRoIGRpbWVuc2lvbnMKICAgICAgICAgICAgcmVhZC1vbmx5IChhbHNvIGFuIGVycm9yKS4gIFRoaXMgZml4ZXMgdGhlIGFycmF5c19nbG9iYWwgdGVzdAogICAgICAgICAgICBwcm9ibGVtLgogICAgICAgICAgICAgICAgICAgICAgICAKMDUvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdHlwZSBoYW5kbGluZyBidWcgd2l0aCByZWZlcmVuY2VzIGFuZCBwb2ludGVycy4KICAgICAgICAgICAgSWYgeW91IGhhZCBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgICAgICAgRm9vICpmdW5jMSgpOwogICAgICAgICAgICAgICAgICB2b2lkIGZ1bmMyKEJhciAmeCk7CgogICAgICAgICAgICBUaGVuIGZ1bmMyKCkgd291bGRuJ3QgYWNjZXB0IG9iamVjdHMgcmV0dXJuZWQgYnkgZnVuYzEoKQogICAgICAgICAgICBiZWNhdXNlIG9mIGEgdHlwZSBlcnJvci4gICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaWFuIFlhbmcuCgowNS8yMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgdG8gc29tZSBvZiB0aGUgVmlzdWFsIEMrKyBleGFtcGxlIHByb2plY3QgZmlsZXMgd2hpY2ggd291bGQgbm90IAogICAgICAgICAgICB3b3JrIHdpdGggc3BhY2VzIGluIHRoZSBwYXRocyBoZWxkIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCB0byAKICAgICAgICAgICAgcG9pbnQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSdzIGxpYnJhcnkgLyBpbmNsdWRlIGRpcmVjdG9yeS4KICAgICAgICAgICAgU0YgYnVnICM3NDA3NjkKCjA1LzIxLzIwMDM6ICBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1jb250cmFjdHMgb3B0aW9uLgogICAgICAgICAgICBGaXJzdCB0cnkgb2YgdGhlIGlkZWEgb2YgIldyYXAgYnkgQ29udHJhY3QiOiAKICAgICAgICAgICAgYnVpbGQgdXAgcmVhbGlhYmxlIGNyb3NzLWxhbmd1YWdlIG1vZHVsZSBieSB3cmFwcGluZyB3aXRoIFNXSUcuCiAgICAgICAgICAgIEltcGxlbWVudGVkIGJhc2ljIGFzc2VydGlvbgogICAgICAgICAgICAocHJlYXNzZXJ0aW9uICYgcG9zdGFzc2VydGlvbiAmIGludmFyaWFudCkKICAgICAgICAgICAgZm9yIHNpbXBsZSBDL0MrKyBmdW5jdGlvbnMuCiAgICAgICAgICAgIAogICAgICAgICAgICBDdXJyZW50IGZvcm1hdCBvZiBjb250cmFjdHMgYXJlOgogICAgICAgICAgICAlY29udHJhY3QgY2xhc3NfbmFtZSA6OiBmdW5jX25hbWUgKHBhcmFzLi4uKSB7CiAgICAgICAgICAgIHJlcXVpcmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHJzOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGVuc3VyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBpbnZhcmlhbnQ6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoJICAgIAkKMDUvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIHR3ZWFrcy4gVGhlcmUgd2VyZSBhIGZldyBwcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgd2hpY2ggd2VyZQogICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIE1ha2VmaWxlIGZvciBwYXNzaW5nIG9uIHRoZSBjb21tYW5kbGluZSB3aGVuIGNvbXBpbGluZy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5vdyBhbGwgZGVmaW5lZCBpbiBzd2lnY29uZmlnLmguIEF1dG9jb25mIGRvZXNuJ3Qgbm9ybWFsbHkgCiAgICAgICAgICAgIGFsbG93IGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyB0byBiZSBkZWZpbmVkIGluIHRoaXMgY29uZmlnIGhlYWRlciBmaWxlLCAKICAgICAgICAgICAgYnV0IGFuIGF1dG9jb25mIGFyY2hpdmUgbWFjcm8gZW5hYmxlcyB0aGlzLiBUaGlzIG1hY3JvIGFsb25nIHdpdGggZnV0dXJlIAogICAgICAgICAgICBhdXRvY29uZiBtYWNyb3MgYXJlIGdvaW5nIHRvIGJlIHB1dCBpbiB0aGUgVG9vbHMvY29uZmlnIGRpcmVjdG9yeS4KCiAgICAgICAgICAgICdzd2lnIC12ZXJzaW9uJyBub3cgcmVwb3J0cyB0aGUgdGFyZ2V0IGJ1aWxkIHBsYXRmb3JtLgoKMDUvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gRml4IHRvIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6CgogICAgICAgICAgICBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgoKICAgICAgICAgICAgVGhlc2UgYXJlIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nL2dlbmVyYXRpbmcgcHJveHkgY2xhc3Nlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGUgdHlwZW1hcHMgd291bGQgdXNlIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCBub3QgdGhlIAogICAgICAgICAgICBDKysgdHlwZSwgd2hpY2ggd2FzIGluY29uc2lzdGVudCB3aXRoIGFsbCBvdGhlciB0eXBlbWFwcy4gCgogICAgICAgICAgICBJbiBtb3N0IGNpcmN1bXN0YW5jZXMgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIHRoZSBDKysgY2xhc3MgbmFtZS90eXBlIAogICAgICAgICAgICBpcyB0aGUgc2FtZSBleGNlcHQgZm9yIGNsYXNzZXMgaW4gbmFtZXNwYWNlLCB0ZW1wbGF0ZWQgY2xhc3NlcyBldGMuIHNvCiAgICAgICAgICAgIHRoaXMgc2hvdWxkbid0IGFmZmVjdCBtb3N0IGNhc2VzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgYW5kIEMjIE1PRFVMRVMgKioqCgowNS8wOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmlzdWFsIEMrKyBQcm9qZWN0IGZpbGVzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgICBjYW4gYmUgYnVpbHQgb24gV2luZG93cyAoZm9yIFRjbCwgUGVybCwgUHl0aG9uIGFuZCBSdWJ5KS4KCjA1LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHJldHVybiBieSB2YWx1ZSwgY29uc3QsIGFuZCBwcml2YXRlIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgQigpOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgQihjb25zdCBCJik7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBCIHJldHVybkIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByb2JsZW0gYW5kIHBhdGNoIHN1Z2dlc3Rpb24gcmVwb3J0ZWQgYnkgQmlsbCBIb2ZmbWFuLgoKMDQvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gU2luZ2xlIGF1dG9jb25mIGludm9jYXRpb24gLSBhdXRvY29uZiBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5IGhhcyBnb25lLgoKICAgICAgICAgICAgLSBMaWJ0b29sIGJvb3RzdHJhcHBlZCB3aGVuIHJ1bm5pbmcgYXV0b2dlbi5zaC4gVGhpcyByZXF1aXJlcyBhbnlvbmUKICAgICAgICAgICAgICB1c2luZyB0aGUgY3ZzIHZlcnNpb24gb2YgU1dJRyB0byBoYXZlIGxpYnRvb2wgaW5zdGFsbGVkIG9uIHRoZWlyCiAgICAgICAgICAgICAgbWFjaGluZS4gU3VnZ2VzdCB2ZXJzaW9uIDEuNC4yIG9yIGhpZ2hlciwgcHJlZmVyYWJseSB0aGUgbGF0ZXN0IC0gMS41LgoKICAgICAgICAgICAgLSBBdXRvbWFrZSBpcyBub3cgdXNlZCB0byBidWlsZCB0aGUgcnVudGltZSBsaWJyYXJpZXMgaW4gY29uanVuY3Rpb24gCiAgICAgICAgICAgICAgd2l0aCBsaWJ0b29sLgoKICAgICAgICAgICAgLSBSdW50aW1lIGxpYnJhcmllcyBhcmUgbm93IHN1Y2Nlc3NmdWxseSBidWlsdCBhcyBETExzIG9uIEN5Z3dpbi4KCiAgICAgICAgICAgIC0gU2tpcHBpbmcgbGFuZ3VhZ2VzIGlzIG5vIGxvbmdlciBqdXN0IGRldGVybWluZWQgaW4gdGhlIHRvcCBsZXZlbCAKICAgICAgICAgICAgICBtYWtlZmlsZSBidXQgaW4gY29uZmlndXJlLmluLiBUaGlzIGluZm8gaXMgdXNlZCBmb3IgYnVpbGRpbmcKICAgICAgICAgICAgICB0aGUgcnVudGltZSBsaWJyYXJpZXMgYW5kIGZvciBydW5uaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgIC0gVGhlc2UgY2hhbmdlcyBoYXZlIGZpeGVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yeSBidWlsZHMsIHRoYXQgaXMKICAgICAgICAgICAgICBidWlsZGluZyBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuIAogICAgICAgICAgICAgIEluc3RhbGxhdGlvbiBmcm9tIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGFsc28gd29ya2luZy4gQW4gaW5pdGlhbAogICAgICAgICAgICAgIGNvbmZpZ3VyZSBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpcyBubyBsb25nZXIgbmVlZGVkIGFzIGRlc2NyaWJlZAogICAgICAgICAgICAgIGluIDA0LzAyLzIwMDMgZW50cnkuIEEgJ21ha2UgZGlzdGNsZWFuJyB3aWxsIGJlIG5lZWRlZCBiZWZvcmUgYnVpbGRpbmcKICAgICAgICAgICAgICBpbiBhIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlmIHRoZSBhdXRvdG9vbHMgCiAgICAgICAgICAgICAgaGF2ZSBiZWVuIHJ1biBmcm9tIHRoaXMgdG9wIGxldmVsIGRpcmVjdG9yeSBhdCBzb21lIHBvaW50LCBidXQgCiAgICAgICAgICAgICAgYXV0b2NvbmYgd2lsbCB0ZWxsIHlvdSB0aGlzLiBOb3RlIHRoYXQgJ21ha2UgY2hlY2snIG9ubHkgd29ya3MgZnJvbSAKICAgICAgICAgICAgICB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBhdCB0aGUgbW9tZW50LgoKMDQvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDcyMzQ3MSBdIFdyYXBwZXJfcHJpbnQoKSBmYWlscyB3aXRoIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMDQvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBNaW5vciByZWZpbmVtZW50IG9mIGNvbnN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgaGFuZGxpbmcgCiAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBDSEFOR0VTIDA4LzExLzIwMDIuICAgUHJldmlvdXNseSwgU1dJRyBtZXJlbHkKICAgICAgICAgICAgY2hlY2tlZCB0byBzZWUgaWYgdGhlcmUgd2FzIGFuIGluaXRpYWxpemVyIGluIHRoZSBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgTm93LCBTV0lHIGFkZGl0aW9uYWxseSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgbWVtYmVyCiAgICAgICAgICAgIGlzIGNvbnN0LgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEga2luZCBvZiBsaW1pdGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLAogICAgICAgICAgICBhY3RpdmF0ZWQgdXNpbmcgdGhlIC1taW5oZXJpdCBjb21tYW5kLWxpbmUgb3B0aW9uLiBJJ3ZlIGFsc28gdXBkYXRlZAogICAgICAgICAgICB0aGUgIkMrKyBJbmhlcml0YW5jZSIgc2VjdGlvbiBvZiB0aGUgUnVieSBkb2N1bWVudGF0aW9uIHRvIGRpc2N1c3MKICAgICAgICAgICAgaG93IHRoaXMgd29ya3MsIGFuZCBpdHMgbGltaXRhdGlvbnMuIEFsc28gYWxzbyBtb2RpZmllZCB0aGUgbWluaGVyaXQuaQogICAgICAgICAgICB0ZXN0IGNhc2UgdG8gcnVuIGFnYWluc3QgdGhpcy4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgLWdsb2JhbG1vZHVsZSBjb21tYW5kLWxpbmUgb3B0aW9uIGZvciB0aGUgUnVieQogICAgICAgICAgICBtb2R1bGUsIGZvciB3cmFwcGluZyBzdHVmZiBpbnRvIHRoZSBnbG9iYWwgbW9kdWxlIChLZXJuZWwpIGluc3RlYWQKICAgICAgICAgICAgb2YgYSBuZXN0ZWQgbW9kdWxlLiBVcGRhdGVkIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCgowNC8yMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBzeW1uYW1lIGVycm9yIGluIGRpcmVjdG9yIGNhbGxzIHRvIFB5dGhvbiBtZXRob2RzCgkgICAgdGhhdCBleHRlbmQgQysrIG9wZXJhdG9ycy4KCgkgICAgU3RvcHBlZCBkaXJlY3RvciBkZXN0cnVjdG9yIHdyYXBwZXJzIGZyb20gY2FsbGluZyBfX3NldF91cCwKCSAgICB3aGljaCB3YXMgbGVhdmluZyB0aGUgZGlyZWN0b3IgZmxhZyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuCgowNC8yMy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBuYW1lc3BhY2UgcmVzb2x1dGlvbiBhbmQgbmVzdGVkIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFsZnJlZCBMb3JiZXIgKGFuZCBNYXJjZWxvIE1hdHVzKS4KCjA0LzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBQYXRjaCBmb3IgSmF2YSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSB0byBydW4gb24gTWFjIE9TIFguCgowNC8xNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gSW5jb3Jwb3JhdGVkIE5vYnUgTmFrYWRhJ3MgcGF0Y2hlcyBmb3Igc3VwcG9ydGluZyB0aGUgUnVieQogICAgICAgICAgICAxLjggYWxsb2NhdGlvbiBmcmFtZXdvcmsuCgowNC8xNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVwbGFjZWQgYWxsIHVzZXMgb2YgdGhlIGRlcHJlY2F0ZWQgU1RSMkNTVFIoKSBtYWNybyB3aXRoIHRoZQogICAgICAgICAgICBzYWZlciBTdHJpbmdWYWx1ZVB0cigpIG1hY3JvLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHJ1YnktdGFsazo2NzA1OQogICAgICAgICAgICBhbmQgZm9sbG93LXVwcyB0byB0aGF0IHBvc3QuCgowNC8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBwcmVwcm9jZXNzb3IgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgICNkZWZpbmUgbWluKHgseSkgKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkgCiAgICAgICAgICAgICAgICBpbnQgZihpbnQgbWluKTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNlYmFzdGllbiBSZWNpby4KCjA0LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgYSBydW50aW1lIGNoZWNrIHRvIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmkgbGlicmFyeSB0byBjaGVjayAKICAgICAgICAgICAgdGhhdCB0aGUgSmF2YSBhcnJheSBwYXNzZWQgaW4gaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgQyBhcnJheSBhbmQgdGhyb3cgYW4gCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpZiBub3QuCgogICAgICAgICAgICBBbHNvIGZpeCB0byB1c2UgZGVsZXRlIGluc3RlYWQgb2YgZnJlZSBmb3IgYXJyYXlzIGNyZWF0ZWQgdXNpbmcgbmV3LgoKMDQvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJlbW92ZSBHQ0MzIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlOgoKICAgICAgICAgICAgICBjYzFwbHVzOiB3YXJuaW5nOiBjaGFuZ2luZyBzZWFyY2ggb3JkZXIgZm9yIHN5c3RlbSBkaXJlY3RvcnkgIi91c3IvaW5jbHVkZSIKICAgICAgICAgICAgICBjYzFwbHVzOiB3YXJuaW5nOiBhcyBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBhcyBhIG5vbi1zeXN0ZW0gZGlyZWN0b3J5IAoKICAgICAgICAgICAgU2VlIFNGIHBhdGNoICM3MTU1MzEgc3VibWl0dGVkIGJ5IEdlcmFsZCBXaWxsaWFtcwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wcm92ZWQgd3JhcHBpbmcgb2YgZW51bXMgYW5kIGNvbnN0YW50cy4gVGhlc2Ugd2VyZSBwcmV2aW91c2x5CiAgICAgICAgICAgIHdyYXBwZWQgYXMgQyMgdmFyaWFibGVzIHJhdGhlciB0aGFuIGNvbnN0YW50cy4gRWl0aGVyIHRoZXNlIGFyZSB3cmFwcGVkCiAgICAgICAgICAgIGFzIHJlYWRvbmx5IChydW50aW1lKSBjb25zdGFudHMgb3IgY29tcGlsZSB0aW1lIGNvbnN0YW50cywgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgIHRoZSAlamF2YWNvbnN0IGRpcmVjdGl2ZSAoVGhlIGRpcmVjdGl2ZSBpcyBsaWtlbHkgdG8gY2hhbmdlIG5hbWUgc29vbikuCiAgICAgICAgICAgIEZvciBleGFtcGxlIHdyYXBwaW5nOgogICAgICAgICAgICAgICVqYXZhY29uc3QoMCk7CiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMjIKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIFhZWjsKICAgICAgICAgICAgICAjZGVmaW5lIFhZWiAzMwogICAgICAgICAgICBpcyBub3c6CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpbnQgQUJDID0gZXhhbXBsZVBJTlZPS0UuZ2V0X0FCQygpOwogICAgICAgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgWFlaID0gMzM7CgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEdsb2JhbCBjb25zdGFudHMgYW5kIGVudW1zIGFyZSBwdXQgaW4gdGhlaXIgb3duIGludGVyZmFjZSBjYWxsZWQKICAgICAgICAgICAgeHh4Q29uc3RhbnRzLCB3aGVyZSB4eHggaXMgdGhlIG1vZHVsZSBuYW1lLiBUaGlzIGlzIGFuIGltcHJvdmVtZW50IGFzIAogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBkZXJpdmUgKGltcGxlbWVudCkgYSBKYXZhIGNsYXNzIGZyb20gdGhlIHh4eENvbnN0YW50cwogICAgICAgICAgICBpbnRlcmZhY2UgdG8gaW1wcm92ZSB0aGUgc3ludGF4OyBuYW1lbHkgd2hlbiB3cmFwcGluZzoKICAgICAgICAgICAgICBlbnVtIHtPTkU9MSwgVFdPLCBUSFJFRX07CiAgICAgICAgICAgIGFjY2Vzc2luZyB0aGVzZSBmcm9tIGEgSmF2YSBjbGFzcyBpbXBsZW1lbnRpbmcgeHh4Q29uc3RhbnRzIGlzIG5lYXRlcjoKICAgICAgICAgICAgICBpbnQgbnVtYmVyID0gT05FOwogICAgICAgICAgICB0aGFuIHRoZSBwcmV2aW91czoKICAgICAgICAgICAgICBpbnQgbnVtYmVyID0geHh4Lk9ORTsKCiAgICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBEYXZlIERyaWJpbi4KCjA0LzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBpbXByb3ZlbWVudHMgZm9yIG11bHRpcGxlIGJ1aWxkcy4gVGhpcyBhbGxvd3Mgb25lIHRvIGJ1aWxkCiAgICAgICAgICAgIHRoZSBTV0lHIGV4ZWN1dGFibGUgYW5kIHJ1bnRpbWUgbGlicmFyaWVzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zL2NvbXBpbGVycyAKICAgICAgICAgICAgZXRjIGJ5IHJ1bm5pbmcgY29uZmlndXJlIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gVGhpcyBpc24ndCAxMDAlIGp1c3QgCiAgICAgICAgICAgIHlldCBhbmQgd29uJ3QgYmUgdW50aWwgbGlidG9vbCBpcyBiZXR0ZXIgY29uZmlndXJlZC4uLiBhICdjb25maWd1cmUnIGFuZCAKICAgICAgICAgICAgJ21ha2UgZGlzdGNsZWFuJyBuZWVkcyB0byBiZSBydW4gaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGJlZm9yZSBpdCBhbGwgd29ya3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogICAgICAgICAgICAgICQgLi9jb25maWd1cmUKICAgICAgICAgICAgICAkIG1ha2UgZGlzdGNsZWFuCiAgICAgICAgICAgICAgJCBta2RpciBjb25maWcxOyBjZCBjb25maWcxOyAuLi9jb25maWd1cmUgQ0M9Z2NjIENYWD1nKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgICAgJCBta2RpciBjb25maWcyOyBjZCBjb25maWcyOyAuLi9jb25maWd1cmUgQ0M9Y2MgQ1hYPWMrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRvIGJlIGltcHJvdmVkLiBBICdtYWtlIGNoZWNrJyBkb2VzIG5vdCB3b3JrIHlldCBlaXRoZXIuIAoKMDQvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50IGV4cGFuc2lvbiBidWcuCiAgICAgICAgICAgIFRoaXMgc2hvd2VkIHVwIHdoZW4gdHJ5aW5nIHRvIHVzZSBzdGRfdmVjdG9yLmkgd2l0aCB2ZWN0b3JzCiAgICAgICAgICAgIG9mIHBvaW50ZXJzLgoKMDMvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3IgcGFyYWxsZWwgbWFrZSBidWlsZHMgb2YgU1dJRywgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBtYWtlIC1qIDQKICAgICAgICAgICAgQnVpbGQgZmFpbHVyZSByZXBvcnRlZCBieSBCaWxsIENsYXJrZS4KCjAzLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUmVsZWFzZWQgMS4zLjE5LgoKCgpWZXJzaW9uIDEuMy4xOSAoTWFyY2ggMjgsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAzLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgVmFyaWV0eSBvZiBtaW5vciBidWcgZml4ZXMgdG8gdGhlIDEuMy4xOCByZWxlYXNlIGluY2x1ZGluZzoKCiAgICAgICAgICAgICAgICAtIFNlZ21lbnRhdGlvbiBmYXVsdCB3aXRoICVleHRlbmQgZGlyZWN0aXZlLgogICAgICAgICAgICAgICAgLSBUeXBlbWFwIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBidWcuCiAgICAgICAgICAgICAgICAtIEV4cHJlc3Npb24gZXZhbHVhdGlvbiBidWcuCiAgICAgICAgICAgICAgICAtIExhcmdlIG1lbW9yeSBsZWFrIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uLgoKVmVyc2lvbiAxLjMuMTggKE1hcmNoIDIzLCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMy8yMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHR3byBwcm9ibGVtcyB3aXRoIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZSwgb3ZlcmxvYWRpbmcsIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZSBleHBhbnNpb24uICBTZWUgdGhlICd0ZW1wbGF0ZV9leHRlbmRfb3ZlcmxvYWQnIGFuZAogICAgICAgICAgICAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkXzInIHRlc3RzIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUgZm9yCiAgICAgICAgICAgIGRldGFpbHMuCgowMy8yMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBBZGRlZCBzb21lIHR5cGVtYXBzIGFzIHN1Z2dlc3RlZCBieSBBbmRyZWFzIFNjaG9lcmsgZm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIG9yIGJ5IHJlZmVyZW5jZS4gVGhlc2UgaGF2ZQogICAgICAgICAgICBiZWVuIHB1dCBpbiB0eXBlbWFwcy5pLgoKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIEMrKyBzY29waW5nIGJ1ZyByZWxhdGVkIHRvIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBGb286OmJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByZXZpb3VzbHksIFNXSUcganVzdCB0b3NzZWQgb3V0IHRoZSBGb286OmJhcigpIGRlY2xhcmF0aW9uLiBOb3csCiAgICAgICAgICAgIHRoZSBkZWNsYXJhdGlvbiBpcyB3cmFwcGVkIHByb3ZpZGVkIHRoYXQgdGhlIHByZWZpeCBpcyBleGFjdGx5IHRoZQogICAgICAgICAgICBzYW1lIGFzIHRoZSBjdXJyZW50IHNjb3BlIChpbmNsdWRpbmcgYW55IGVuY2xvc2luZyBuYW1lc3BhY2VzKS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJ1Y2UgTG93ZXJ5LgoKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgWyA2OTY1MTYgXSBFbmFibGluZyBleGNlcHRpb24gcHJvY2Vzc2luZyBmb3IgZGF0YSBtZW1iZXIgYWNjZXNzLgogICAgICAgICAgICBJbiBzb21lIGNvbXBpbGVycywgYXR0cmlidXRlIGFjY2VzcyBjYW4gZ2VuZXJhdGUgZXhjZXB0aW9ucy4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgb3JkaW5hcmlseSBhc3N1bWVzIHRoYXQgbm8gZXhjZXB0aW9ucyB3aWxsIGJlIHJhaXNlZC4gIFRvIGRpc2FibGUgdGhpcywKICAgICAgICAgICAgdXNlIHRoZSAlZmVhdHVyZSgiYWxsb3dleGNlcHQiKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikgRm9vOjp4OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IHg7ICAgICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgZW5hYmxlZCAqLwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBZYWtvdiBNYXJrb3ZpdGNoLiAKIAowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBQYXRjaC4gWyA3MDE4NjAgXSBJbXByb3ZlIFBlcmZvcm1hbmNlIChweXRob24gcHJveGllcykuCiAgICAgICAgICAgIEdpdmVzIGEgcGVyZm9ybWFuY2UgYm9vc3QgdG8gcHJveHkgY2xhc3MgY29kZSBhbmQgdGhlIG1hbmFnZW1lbnQgb2YgdGhlCiAgICAgICAgICAgIC50aGlzIGFuZCAudGhpc293biBhdHRyaWJ1dGVzLiAgQ29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMDMvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gQWRkZWQgbWlzc2luZyB2YXJhcmcgc3VwcG9ydC4KCjAzLzE4LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFJlbW92ZWQgY29kZSByZWxhdGVkIHRvIHRhZ2dpbmcgaW5kaXZpZHVhbCBtZXRob2RzIGZvciBkaXJlY3RvcnMuCgkgICAgVGhlIGNvbmNlcHQgb2YgaGF2aW5nIGRpcmVjdG9ycyBmb3Igc29tZSBidXQgbm90IGFsbCB2aXJ0dWFsIG1ldGhvZHMKCSAgICBvZiBhIGNsYXNzIGlzIGRlZXBseSBmbGF3ZWQuICBUaGUgJWZlYXR1cmUoIm5vZGlyZWN0b3IiKSB0YWcgaXMgYWxzbwoJICAgIGdvbmUuICAKCSAgICAKCSAgICBEaXJlY3RvcnMgYXJlIG9mZiBieSBkZWZhdWx0LiAgVG8gZW5hYmxlIHRoZW0gZm9yIGEgY2xhc3MsIGlzc3VlCgkgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgY2xhc3NuYW1lOyB3aGljaCB3aWxsIGNyZWF0ZSBkaXJlY3RvciBtZXRob2RzCgkgICAgZm9yIGV2ZXJ5IHZpcnR1YWwgbWV0aG9kIGluIHRoZSBoaWVyYXJjaHkgb2YgdGhlIGNsYXNzLgoKMDMvMTcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggcGFzc2luZyBhcmd1bWVudHMgb2YgdHlwZSBmdW5jdGlvbi4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgeChpbnQsIGludCkpOwoKICAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgeCk7CgogICAgICAgICAgICBJbiBvbGQgdmVyc2lvbnMsIHRoaXMgd291bGQgcHJvZHVjZSBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZS4gIE5vdywKICAgICAgICAgICAgU1dJRyBtZXJlbHkgYWRkcyBhbiBleHRyYSBwb2ludGVyLCBtYWtpbmcgdGhlc2UgZGVjbGFyYXRpb25zIHRoZSBzYW1lCiAgICAgICAgICAgIGFzOgoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgKCp4KShpbnQsIGludCkpOwoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgYmlub3BfdChpbnQsIGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oYmlub3BfdCAqeCk7CgogICAgICAgICAgICBSZXBvcnRlZCBieSBHYXJ0aCBCdXNoZWxsLgoKMDMvMTcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgdGhlIHJldHVybiBzdGF0ZW1lbnQgZm9yIGRpcmVjdG9yIGJhc2UgY2xhc3MgY2FsbHMgdGhhdCBoYXZlIG5vCiAgICAgICAgICAgIHJldHVybiB2YWx1ZS4KCjAzLzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggY29uc3Qgc21hcnQtcG9pbnRlciB3cmFwcGluZy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcigpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbSgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgY29uc3QgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIG9ubHkgIngiIGFuZCAiYmFyIiBhcmUgdmlzaWJsZSBmcm9tIEJsYWggKHNpbmNlIGFwcGxpY2F0aW9uCiAgICAgICAgICAgIG9mIHNwYW0gdmlvbGF0ZXMgY29uc3RuZXNzKS4gIE1vcmVvdmVyLCBhY2Nlc3MgdG8gIngiIGlzIHJlYWQtb25seS4KICAgICAgICAgICAKMDMvMTUvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQ2xlYW5lZCB1cCB0d28gc2lnbmVkIHZlcnN1cyB1bnNpZ25lZCBjb21wYXJpc29ucyBpbiBweXRob24vc3RkX3ZlY3Rvci5pLgoJICAgIAowMy8xNS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBHbG9iYWwgdmFyaWFibGVzIGFyZSB3cmFwcGVkIHVzaW5nIHByb3BlcnRpZXMgaW5zdGVhZCBvZiBnZXQgYW5kIHNldCBtZXRob2RzLgogICAgICAgICAgICBNZW1iZXIgdmFyaWFibGUgd3JhcHBpbmcgYnVnIGZpeGVzLCBmb3IgZXhhbXBsZSB3cmFwcGluZyBwb2ludGVycyB3b3JrIG5vdy4KICAgICAgICAgICAgVHlwZW1hcHMgYXJlIHVzZWQgZm9yIGFsbCB2YXJpYWJsZSB3cmFwcGluZyB0byBnZW5lcmF0ZSB0aGUgcHJvcGVydHkgY29kZS4KCjAzLzEzLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSB2aXJ0dWFsIG1ldGhvZCB1bnJvbGxpbmcgZm9yIGRpcmVjdG9ycy4gCgkgICAgVGhlIG9yZGVyIG9mIHVucm9sbGluZyBpcyBub3cgZnJvbSBiYXNlIHRvIGRlcml2ZWQsIHRvIGVuc3VyZQoJICAgIHRoYXQgdGhlIG1vc3QgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpcmVjdG9yIG1ldGhvZCBpcwoJICAgIGZvdW5kLgoKCSAgICBEaXJlY3RvciBtZXRob2RzIGZvciBwdXJlIHZpcnR1YWwgbWV0aG9kcyBub3cgdGhyb3cKCSAgICBESVJFQ1RPUl9QVVJFX1ZJUlRVQUxfRVhDRVBUSU9OIGlmIF91cCBpcyBzZXQuCgowMy8xMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBQb2x5bW9ycGhpc20gZml4OiB2aXJ0dWFsIGZ1bmN0aW9ucyBub3cgdXNlIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICAgICBrZXl3b3JkIGluIHRoZSBDIyBwcm94eSBjbGFzcywgdmlydHVhbCBvciBvdmVycmlkZS4KICAgICAgICAgICAgU29tZSAndXNpbmcgU3lzdGVtOycgc3RhdGVtZW50IGZpeGVzIG5lZWRlZCBieSB0aGUgTW9ubyBjb21waWxlci4KCjAzLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24gb2YgU3dpZ1ZhbHVlV3JhcHBlcjw+IHRvCiAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzZXMgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJydWNlIExvd2VyeS4KCjAzLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICRkZXNjcmlwdG9yKHR5cGUpIHZhcmlhYmxlIGlzIG5vdyBleHBhbmRlZCBpbiBjb2RlIHN1cHBsaWVkIHRvCiAgICAgICAgICAgICVleHRlbmQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2VydGFpbiBraW5kcyBvZiBhZHZhbmNlZCB3cmFwcGluZyAKICAgICAgICAgICAgKGVzcGVjaWFsbHkgY29udGFpbmVyIGNsYXNzZXMpLgoKMDMvMTEvMjAwMzogbHVpZ2kKICAgICAgICAgICAgU3VwcG9ydCBmb3Igc3RkOjptYXAuCiAgICAgICAgICAgIChhKSBJbnRlZ3JhdGlvbiB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZSAoYSBsYSBzdGQ6OnZlY3RvcikgZm9yCiAgICAgICAgICAgICAgICBQeXRob24sIFJ1YnksIE16U2NoZW1lLCBhbmQgR3VpbGU7CiAgICAgICAgICAgIChiKSBTaW1wbGUgd3JhcHBlciBmb3Igb3RoZXIgbGFuZ3VhZ2VzCgowMy8xMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBlc2NhcGUgc2VxdWVuY2VzIGluIHN0cmluZyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gIFNXSUcKICAgICAgICAgICAgd2Fzbid0IHBhcnNpbmcgY2VydGFpbiBvY3RhbCBjb2RlcyBjb3JyZWN0bHkuCgowMy8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgdmFyaWV0eSBvZiBzdWJ0bGUgcHJlcHJvY2Vzc29yIHByb2JsZW1zIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNlYmFzdGllbiBSZWNpby4KCiAgICAgICAgICAgIChhKSBFbXB0eSBwcmVwcm9jZXNzb3IgdmFsdWVzIG5vIGxvbmdlciBnZW5lcmF0ZSAiYmFkIGNvbnN0YW50CiAgICAgICAgICAgIHZhbHVlIiBlcnJvcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PIEJBUgoKICAgICAgICAgICAgKGIpIE1hY3JvIG5hbWVzIGNhbiBub3cgc3BhbiBtdWx0aXBsZSBsaW5lcyAodGVjaG5pY2FsbHkgdmFsaWQsCiAgICAgICAgICAgIGFsdGhvdWdoIHF1ZXN0aW9uYWJsZSBwcmFjdGljZSkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQV9MT05HX01BQ1JPX1wKICAgICAgICAgICAgICAgICAgTkFNRSA0MgoKICAgICAgICAgICAgKGMpIFdoaXRlc3BhY2UgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGJlZm9yZSBjZXJ0YWluIG1hY3JvIHZhbHVlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyJIZWxsbyIKICAgICAgICAgICAgICAgICAgI2RlZmluZSBCQVJcCiAgICAgICAgICAgICAgICAgICJIZWxsbyIKIAowMy8wNy8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbWlzc2luZyBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlbWFwcwogICAgICAgICAgICBpbiB0aGUgTGliL3J1YnkvdHlwZW1hcHMuaSBsaWJyYXJ5IGZpbGUuCgowMy8wNy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9weXRob24vY2FsbGJhY2sgdG8gZGVtb3N0cmF0ZSBob3cgZGlyZWN0b3JzIGNhbgoJICAgIGJlIHVzZWQgdG8gaW1wbGVtZW50IGNhbGxiYWNrcyBpbiBQeXRob24KCSAgICBBZGRlZCBFeGFtcGxlcy9weXRob24vZXh0ZW5kIHRvIGRlbW9uc3RyYXRlIHZpcnR1YWwgbWV0aG9kCgkgICAgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uIChyZWFsbHkgdGhlIHNhbWUgYXMgdGhlIGNhbGxiYWNrCgkgICAgZXhhbXBsZSwganVzdCBhIGRpZmZlcmVudCBjb250ZXh0KS4KCSAgICBBZGRlZCBmb3VyIHRlc3RzIGZvciB2ZXJ5IGJhc2ljIGRpcmVjdG9yIGZ1bmN0aW9uYWxpdHkuICBUaGVzZQoJICAgIGhhdmUgcnVudGltZSB0ZXN0cyB1bmRlciBweXRob24uCgkgICAgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVtaXRzICNkZWZpbmUgU1dJR19ESVJFQ1RPUlMgbmVhciB0aGUKCSAgICB0b3Agb2YgdGhlIG91dHB1dCBmaWxlIGlmIGRpcmVjdG9ycyBhcmUgZW5hYmxlZC4gIFRoaXMgaXMgdXNlZnVsCgkgICAgZm9yIGRpc2FibGluZyBwYXJ0cyBvZiB0ZXN0cyBpbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG9uJ3QKCSAgICBzdXBwb3J0IGRpcmVjdG9ycy4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIGEgc2VjdGlvbiB0byBEb2MvTWFudWFsL1B5dGhvbi5odG1sIG9uIGNyb3NzIGxhbmd1YWdlCgkgICAgcG9seW1vcnBoaXNtIChkaXJlY3RvcnMpLgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgVGhlIHNob3J0LWxpdmVkICItZmRpcmVjdG9ycyIgY29tbWFuZCBsaW5lIG9wdGlvbiBoYXMgYmVlbgoJICAgIHJlbW92ZWQuICBUbyBlbmFibGUgZGlyZWN0b3JzLCBpbnN0ZWFkIHVzZSB0aGUgZXh0ZW5kZWQgJW1vZHVsZSAKCSAgICBkaXJlY3RpdmUgYXMgZm9sbG93czoKCgkgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIikgbW9kdWxlbmFtZQoKMDMvMDYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRoZSBsb25nIGxvbmcgdHlwZW1hcHMgaGF2ZSBiZWVuIHJld3JpdHRlbiBzbyB0aGF0IHRoZXkgY2FuIGJlIG1vcmUKICAgICAgICAgICAgZWFzaWx5IHVzZWQgd2l0aCBub24gSVNPIGNvbXBpbGVycywgbGlrZSBWaXN1YWwgQysrLiBGb3IgZXhhbXBsZQogICAgICAgICAgICBpZiB5b3UgYXJlIHdyYXBwaW5nIHRoZSBXaW5kb3dzIDY0IGJpdCB0eXBlIF9faW50NjQgdGhlIGxvbmcgbG9uZwogICAgICAgICAgICB0eXBlbWFwcyBjYW4gYmUgdXNlZCB3aXRoICVhcHBseToKCiAgICAgICAgICAgICAgICAlYXBwbHkgbG9uZyBsb25nIHsgX19pbnQ2NCB9OwogICAgICAgICAgICAgICAgX19pbnQ2NCB2YWx1ZTEoX19pbnQ2NCB4KTsKCiAgICAgICAgICAgIF9faW50NjQgd2lsbCBub3cgYXBwZWFyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBpbnN0ZWFkIG9mIGxvbmcgbG9uZy4KICAgICAgICAgICAgCjAzLzA2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgKioqIERFVkVMT1BFUiBDSEFOR0UgKioqCiAgICAgICAgICAgIFN3aWcgbW9kdWxlIG11dGF0aW9uIGhhcyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBXaGVuIGEgbGFuZ3VhZ2UKICAgICAgICAgICAgY2xhc3MgbWV0aG9kIHdhbnRzIHRvIHNhdmUgbm9kZSBhdHRyaWJ1dGVzLCBpdCBub3cgdXNlcyBvbmUgb2YgdGhlCiAgICAgICAgICAgIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgICAgICAgICBTd2lnX3JlcXVpcmUoKQogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoKQoKICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZXNlIGZ1bmN0aW9ucyBpcyBhIG5hbWVzcGFjZSBpbiB3aGljaAogICAgICAgICAgICBzYXZlZCBhdHRyaWJ1dGVzIGFyZSBwbGFjZWQuICBGb3IgZXhhbXBsZSx0aGlzIGNvZGUKCiAgICAgICAgICAgICAgICAgIE5vZGUgKm47CiAgICAgICAgICAgICAgICAgIFN3aWdfc2F2ZSgiY0RlY2xhcmF0aW9uIixuLCJ0eXBlIiwicGFybXMiLCJuYW1lIixOSUwpOwoKICAgICAgICAgICAgc2F2ZXMgdGhlIGF0dHJpYnV0ZXMgYXMgImNEZWNsYXJhdGlvbjp0eXBlIiwgImNEZWNsYXJhdGlvbjpwYXJtcyIsCiAgICAgICAgICAgIGFuZCBzbyBmb3J0aC4gICBJZiBuZWNlc3NhcnksIGEgbGFuZ3VhZ2UgbW9kdWxlIGNhbiByZWZlciB0bwogICAgICAgICAgICBvbGQgdmFsdWVzIGJ5IHVzaW5nIHRoaXMgc3BlY2lhbCBuYW1lc3BhY2UgcXVhbGlmaWVyLgoKICAgICAgICAgICAgSW4gYWRkaXRpb24gdG8gdGhpcywgYSBzcGVjaWFsIGF0dHJpYnV0ZSAidmlldyIgY29udGFpbnMgdGhlIG5hbWUKICAgICAgICAgICAgb2YgdGhlIGxhc3QgbmFtZXNwYWNlIHVzZWQgdG8gc2F2ZSBhdHRyaWJ1dGVzLiAgSW4gdGhlIGFib3ZlIAogICAgICAgICAgICBleGFtcGxlLCAidmlldyIgd291bGQgaGF2ZSB0aGUgdmFsdWUgImNEZWNsYXJhdGlvbiIuICAgVGhlIHZhbHVlCiAgICAgICAgICAgIG9mICJjRGVjbGFyYXRpb246dmlldyIgd291bGQgaGF2ZSB0aGUgcHJldmlvdXMgdmlldyBhbmQgc28gZm9ydGguCgogICAgICAgICAgICBTd2lnX3Jlc3RvcmUobikgcmVzdG9yZXMgYSBub2RlIHRvIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIGxhc3QKICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkgb3IgU3dpZ19zYXZlKCkgY2FsbC4KCiAgICAgICAgICAgIE5vdGU6ICBUaGlzIGNoYW5nZSBtYWtlcyBpdCBlYXNpZXIgZm9yIGxhbmd1YWdlIG1vZHVsZXMgdG8gcmVmZXIKICAgICAgICAgICAgdG8gb2xkIHZhbHVlcyBvZiBhdHRyaWJ1dGVzLiAgCgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgTWVyZ2VkIHRoZSBjcm9zcy1sYW5ndWFnZSBwb2x5bW9ycGhpc20gcGF0Y2guICBXaGVuIGVuYWJsZWQsIEMrKyAKCSAgICAicHJveHkiIGNsYXNzZXMgKGNhbGxlZCBkaXJlY3RvcnMpIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggc3BlY2lmaWVkIAoJICAgIEMrKyBjbGFzcy4gIERpcmVjdG9ycyBwYXNzIG1ldGhvZCBjYWxscyBmcm9tIEMrKyB0byBQeXRob24sIHNpbWlsYXIgCgkgICAgdG8gdGhlIHdheSB0aGUgdXN1YWwgcHJveHkgKHNoYWRvdykgY2xhc3NlcyBwYXNzIG1ldGhvZCBjYWxscyBmcm9tIAoJICAgIFB5dGhvbiB0byBDKysuICBUb2dldGhlciwgdGhlc2UgdHdvIHR5cGVzIG9mIHByb3hpZXMgYWxsb3cgQysrIAoJICAgIGNsYXNzZXMgdGhhdCBhcmUgZXh0ZW5kZWQgaW4gUHl0aG9uIHRvIGJlaGF2ZSBqdXN0IGxpa2Ugb3JkaW5hcnkgCgkgICAgQysrIGNsYXNzZXMgYW5kIGJlIHVzZWQgaW4gQysrIGxpa2UgbmF0aXZlIG9iamVjdHMuICAKCSAgICAKCSAgICBUaGlzIGZlYXR1cmUgaXMgc3RpbGwgdmVyeSBleHBlcmltZW50YWwgYW5kIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCgkgICAgVG8gZW5hYmxlIGRpcmVjdG9yIHN1cHBvcnQsIHNwZWNpZnkgJy1mZGlyZWN0b3JzJyBvbiB0aGUgU1dJRyBjb21tYW5kCgkgICAgbGluZSBvciBpbiB0aGUgU1dJR19GRUFUVVJFUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEluIHRoZSBpbnRlcmZhY2UKCSAgICBmaWxlLCBhZGQgJWZlYXR1cmUoImRpcmVjdG9yIikgdG8gZ2VuZXJhdGUgZGlyZWN0b3JzIGZvciBhbGwgY2xhc3NlcwoJICAgIHRoYXQgaGF2ZSB2aXJ0dWFsIG1ldGhvZHMuICAKCSAgICAKCSAgICBTZWUgaHR0cDovL3N0bS5sYmwuZ292L350bTIvc3dpZy9Qcm94eURvYy5odG1sIGZvciBtb3JlIGRldGFpbHMuCgkgICAgCgowMy8wMy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc21hbGwgZ2xpdGNoIGluIHR5cGVtYXAgbG9jYWwgdmFyaWFibGUgcmVwbGFjZW1lbnQuICBJZiB5b3UgaGFkCiAgICAgICAgICAgIGEgdHlwZW1hcCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB0eXBlICgkMV90eXBlIHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IC4uLjsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFuZCBubyBvY2N1cnJlbmNlIG9mICIkMV90eXBlIiBhcHBlYXJlZCBpbiB0aGUgYm9keSwgdGhlbiB0aGUgbG9jYWwKICAgICAgICAgICAgdmFyaWFibGUgdHlwZSB3b3VsZG4ndCBiZSBzdWJzdGl0dXRlZC4KCjAzLzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIE5ldyB2ZXJzaW9uIG9mIHRoZSBDU2hhcnAgbW9kdWxlIHdoaWNoIGlzIHR5cGVtYXAgYmFzZWQuCiAgICAgICAgICAgIEl0IGFsc28gdXNlcyBFQ01BIEMjIGFuZCBubyBsb25nZXIgdXNlcyBNaWNyb3NvZnQgVmlzdWFsIEMrKy5ORVQgCiAgICAgICAgICAgIGdsdWUuIFRoaXMgbWVhbnMgdGhhdCBpdCB3aWxsIHdvcmsgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBOZWlsIENhd3NlLgoKMDIvMjcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY1MzU0OCBdIGVycm9yIHBhcnNpbmcgY2FzdGluZyBvcGVyYXRvciBkZWZpbml0aW9uLgogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIGNhc3Rpbmcgb3BlcmF0b3JzIGRlY2xhcmVkIG91dHNpZGUgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW5saW5lIEE6Om9wZXJhdG9yIGNoYXIgKigpIHsgLi4uIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJ0aW4gQ2FzYWRvLgoKMDIvMjcvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhbm9ueW1vdXMgYml0LWZpZWxkcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgIGludCB4IDogNDsKICAgICAgICAgICAgICAgICAgICAgIGludCAgIDogNDsKICAgICAgICAgICAgICAgICAgICAgIGludCB5IDogODsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQW5vbnltb3VzIGJpdC1maWVsZHMgYXJlIGlnbm9yZWQgYnkgU1dJRy4gICBQcm9ibGVtCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEZyYW56IEj2cGZpbmdlci4KCjAyLzI2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHR5cGVtYXBzIGluIHRoZSBFeGFtcGxlcy9qYXZhL3R5cGVtYXAgZXhhbXBsZSBhbmQgYWxzbyAKICAgICAgICAgICAgZml4ZXMgc3VidGxlIGJ1ZyB3aGVuIHVzaW5nIHRoZSBTdHJpbmdCdWZmZXIgdHlwZW1hcHMgbW9yZSB0aGFuIG9uY2UuCgowMi8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjQyMTEyIF0gQ29uc3RhbnRzIGNoYXIgYnVnLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY3NTMzNyBdIFBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gbm90IGVudGlyZWx5IHdvcmtpbmcuCiAgICAgICAgICAgIFRoZXJlIHdhcyBhIHN1YnRsZSBwcm9ibGVtIHJlbGF0ZWQgdG8gdGhlIG5hbWluZyBhbmQgb3JkZXJpbmcgb2YKICAgICAgICAgICAgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhcmd1bWVudHMuICBNYXRjaGluZyB3b3JrZWQgb2theSwKICAgICAgICAgICAgdGhlIHJlc3VsdGluZyB0ZW1wbGF0ZXMgd2VyZW4ndCBleHBhbmRlZCBjb3JyZWN0bHkuCgowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBwYXJzaW5nIChhbmQgZ2VuZXJhdGluZyBjb2RlKSBmb3IgCiAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gYXJyYXlzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgKCZ4KVsxMF0pOwogIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjM1MzQ3IF0gQ29tcGlsYXRpb24gd2FybmluZyBmcm9tIGxpYnB5LmMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhbmllbCBMLiBSYWxsLgogCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHZpcnR1YWwgbWV0aG9kIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIGNoZWNraW5nIGFuZCB0eXBlZGVmLgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAqaW50cHRyOwoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgKmZvbygpID0gMDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50cHRyIGZvbygpIHsgfTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgdHJlYXRpbmcgdGhlc2UgZGVjbGFyYXRpb25zIGFzIGRpZmZlcmVudCBldmVuIHRob3VnaAogICAgICAgICAgICB0aGV5IGFyZSB0aGUgc2FtZSAodmlhIHR5cGVkZWYpLgoKMDIvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHJhbmdlIGNoZWNraW5nIGZvciB0aGUgTlVNMlVTSFJUIG1hY3JvLCBwZXIgWyA2NzUzNTMgXS4KCjAyLzI0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHRoZSBjb2RlIHRoYXQgZGV0ZXJtaW5lZCBpZiBhIGNsYXNzIGlzIGFic3RyYWN0CiAgICAgICAgICAgIGFuZCBjYW4gYmUgaW5zdGFudGlhdGVkLiAgICBJZiB5b3UgaGFkIGNsYXNzZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmb28oaW50KSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogdmlydHVhbCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQyA6IHZpcnR1YWwgQSB7IAogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgLyogTm90ZSBvcmRlciBvZiBiYXNlIGNsYXNzZXMgKi8JCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBEIDogQiwgQyB7IH07ICAgIC8qIE9rICovCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBFIDogQywgQiB7IH07ICAgIC8qIEJyb2tlbiAqLwoKICAgICAgICAgICAgdGhlbiBTV0lHIGRldGVybWluZWQgdGhhdCBpdCBjb3VsZCBpbnN0YW50aWF0ZSBEKCksIGJ1dCBub3QgRSgpLgogICAgICAgICAgICBUaGlzIGluY29uc2lzdGVuY3kgYXJvc2UgZnJvbSB0aGUgZGVwdGgtZmlyc3Qgc2VhcmNoIG9mIHRoZSAKICAgICAgICAgICAgaW5oZXJpdGFuY2UgaGllcmFyY2h5IHRvIGxvY2F0ZSB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHZpcnR1YWwKICAgICAgICAgICAgbWV0aG9kcy4gICBUaGlzIHByb2JsZW0gc2hvdWxkIG5vdyBiZSBmaXhlZC0tLVNXSUcgd2lsbCBhdHRlbXB0CiAgICAgICAgICAgIHRvIGxvY2F0ZSBhbnkgdmFsaWQgaW1wbGVtZW50YXRpb24gb2YgYSB2aXJ0dWFsIG1ldGhvZCBieQogICAgICAgICAgICB0cmF2ZXJzaW5nIG92ZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkuCgowMi8yMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdXNpbmcgZW51bSB0eXBlbWFwcy4gVGhlIEphdmEgZmluYWwgc3RhdGljIHZhcmlhYmxlIHR5cGUKICAgICAgICAgICAgY2FuIGJlIHNldCB1c2luZyB0aGUganN0eXBlIHR5cGVtYXAsIGVuYWJsaW5nIGVudW1zIHRvIGJlIG1hcHBlZCB0byAKICAgICAgICAgICAgc29tZXRoaW5nIG90aGVyIHRoYW4gaW50LiBCdWcgcmVwb3J0ZWQgYnkgSGVpbmVyIFBldGl0aC4KCjAyLzIxLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgQ1NoYXJwIChDIykgbW9kdWxlIHByb3RvdHlwZQogICAgICAgICAgICBpLmUuIGNzaGFycC5jeHggJiBjc2hhcnAuaCBhdCBTb3VyY2UvTW9kdWxlcy8uCiAgICAgICAgICAgIFRoZXkgYXJlIGZvciB0ZXN0IHVzYWdlIG9ubHkgbm93IGFuZCBuZWVkIGltcHJvdmVtZW50LgogICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGFsc28gbmVlZCB0byBiZSBtb2RpZmllZC4KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAKMDIvMjAvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZWRlZiB3aXRoIC1mdmlydHVhbC4KICAgICAgICAgICAgU2ltaWxhciBhcyBiZWF6bGV5J3MgbW9kaWZpY2F0aW9uIHRvZGF5LgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBnY2Mtc3R5bGUgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIAogICAgICAgICAgICBQYXRjaCBbIDYyMzI1OCBdIEdDQy1zdHlsZSB2YXJhcmcgbWFjcm8gc3VwcG9ydC4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgSm9lIE1hc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwNTE2MiBdIFR5cGVtYXAgbG9jYWwgdmFyaWFibGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBMeWxlIEpvaG5zb24uCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBhYnN0cmFjdCBjbGFzc2VzIGFuZCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oaW50IHgpID0gMDsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oSW50ZWdlciB4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIGdldHRpbmcgY29uZnVzZWQgYWJvdXQgdGhlIGxhdHRlciBtZXRob2QtLS1tYWtpbmcgQmFyCiAgICAgICAgICAgIGFic3RyYWN0LiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjAyLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gJWphdmFjb25zdChmbGFnKSBjYW4gYWxzbyBiZSB1c2VkIG9uIGVudW1zIGFzIHdlbGwgYXMgY29uc3RhbnRzLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgZW5hYmxlcyB0cnVlIEphdmEgY29tcGlsZXIgY29uc3RhbnRzIHNvIHRoYXQgdGhleSBjYW4gYmUgCiAgICAgICAgICAgIHVzZWQgaW4gSmF2YSBzd2l0Y2ggc3RhdGVtZW50cy4gVGhhbmtzIHRvIEhlaW5lciBQZXRpdGggZm9yIHBhdGNoZXMuCgowMi8xOS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIE1vZGlmaWVkIC1mY29tcGFjdCBmZWF0dXJlIHRvIGRlYWwgd2l0aCBQUCBsaW5lcwoKMDIvMTgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY4OTA0MCBdIE1pc3NpbmcgcmV0dXJuIHZhbHVlIGluIHN0ZF92ZWN0b3IuaS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUm9iZXJ0IEguIGRlIFZyaWVzLgoKMDIvMTgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGZldyBldmlsIHNjb3BpbmcgcHJvYmxlbXMgd2l0aCB0ZW1wbGF0ZXMsIG5hbWVzcGFjZXMsIGFuZCB0aGUKICAgICAgICAgICAgJWV4dGVuZCBkaXJlY3RpdmUuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKCjAyLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbUnVieV0gSW1wcm92ZWQgc3VwcG9ydCBmb3IgVmlzdWFsIEMrKyBhbmQgb3RoZXIgbmF0aXZlIFdpbmRvd3MgY29tcGlsZXJzLiAKICAgICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBzcGVjaWZ5ICIvRVhQT1JUOkluaXRfPG1vZHVsZT4iLCB3aGVyZSA8bW9kdWxlPiBpcyB0aGUKICAgICAgICAgICAgc3dpZyBtb2R1bGUgbmFtZSB3aGVuIGxpbmtpbmcgdXNpbmcgdGhlc2UgbmF0aXZlIFdpbmRvd3MgY29tcGlsZXJzLgoKMDIvMTUvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCAtZnZpcnR1YWwgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgcmVkaWZpbmVkIHZpcnR1YWwgZnVuY3Rpb24gaW4gY2hpbGRyZW4gY2xhc3Nlcy4KCiAgICAgICAgICAgIE1vZGlmaWVkIC1jb21wYWN0IG9wdGlvbiB0byAtZmNvbXBhY3Qgb3B0aW9uCgogICAgICAgICAgICBBZGRlZCAtc21hbGwgb3B0aW9uLgogICAgICAgICAgICAtc21hbGwgPSAtZnZpcnR1YWwgLWZjb21wYWN0CiAgICAgICAgICAgIEFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgZnV0dXJlIGZlYXR1cmUgb3B0aW9ucywKICAgICAgICAgICAgd2hpY2ggYXJlIHVzZWQgdG8gcmVkdWNlIHdyYXBwZXIgZmlsZSBzemllLgoKICAgICAgICAgICAgQWRkZWQgU1dJR19GRUFUVVJFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjaGVjay4KICAgICAgICAgICAgVG8gZHluYW1pY2FsbHkgc2V0IHRoZSBmZWF0dXJlIG9wdGlvbnMgc3VjaCBhcyAtZmNvbXBhY3QgJiAtZnZpcnR1YWwKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDIvMTMvMjAwMzogbGVuegogICAgICAgICAgICBVcGRhdGVkIERvYy9NYW51YWwvUGVybDUuaHRtbCB0byB0YWxrIGFib3V0IEMrKyBjb21waWxlIHByb2JsZW1zCiAgICAgICAgICAgIGNvbmZpZ3VyZS5pbiBub3cgY2hlY2tzIGZvciBQRVJMNV9DQ0ZMQUdTCiAgICAgICAgICAgIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYW5kIEV4YW1wbGUvTWFrZWZpbGUuaW4gbm93IHVzZSBQRVJMNV9DQ0ZMQUdTCiAgICAgICAgICAgIEFkZGVkIExpYi9wZXJsNS9ub2VtYmVkLmggd2hpY2ggY29udGFpbnMgYWxsIHRoZSBrbm93biBtYWNybyBjb25mbGljdHMKCjAyLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODU0MTAgXSBDKysgRXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBjYXVzZXMgU1dJRyB0byBleGl0LgogICAgICAgICAgICBGaXhlcyBhIHN5bnRheCBlcnJvciB3aXRoIGRlY2xhcmF0aW9ucyBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIHRoZSBpbnN0YW50aWF0aW9uIGFuZCBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UuCiAgICAgICAgICAgIFdlIG1pZ2h0IGRvIG1vcmUgbGF0ZXIuICBSZXBvcnRlZCBieSBUaG9tYXMgV2lsbGlhbXNvbi4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBSZXdyb3RlIGJvb2wgdHlwZW1hcHMgdG8gcmVtb3ZlIHBlcmZvcm1hbmNlIHdhcm5pbmcgZm9yIGNvbXBpbGluZyBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICB1bmRlciBWaXN1YWwgQysrLgoKMDIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3Igd3JhcHBpbmcgcmVmZXJlbmNlIHZhcmlhYmxlcyAoY29uc3Qgbm9uLXByaW1pdGl2ZSBhbmQgYWxsIG5vbi1jb25zdCB0eXBlcykgCiAgICAgICAgICAgIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGludCYgaTsKICAgICAgICAgICAgICBDbGFzcyYgYzsKICAgICAgICAgICAgICBjb25zdCBDbGFzcyYgYzsKCjAyLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgbW9yZSB2ZXJ5IHN1YnRsZSBwcmVwcm9jZXNzb3IgY29ybmVyIGNhc2VzIHJlbGF0ZWQgdG8gcmVjdXJzaXZlCiAgICAgICAgICAgIG1hY3JvIGV4cGFuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgY2F0KHgseSkgeCAjIyB5CgogICAgICAgICAgICAgICAgICAgY2F0KGNhdCgxLDIpLDMpICAgIC8vIFByb2R1Y2VzOiBjYXQoMSwyKTMKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgI2RlZmluZSB4Y2F0KHgseSkgY2F0KHgseSkKCiAgICAgICAgICAgICAgICAgICB4Y2F0KHhjYXQoMSwyKSwzKSAgLy8gUHJvZHVjZXMgMTIzCgogICAgICAgICAgICBTZWUgSyZSLCAybmQgRWQuIHAuIDIzMS4KCjAyLzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDY4Mzg4MiBdIC0gcGF0Y2ggc3VibWl0dGVkIGJ5IEYuIFBvc3RtYSBmb3IgU1dJRyB0byBjb21waWxlIG9uIEhQLVVYLgoKMDIvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV4cGFuc2lvbiBidWcuIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xMC8yMDAzOiBzb25neWFuZgogICAgICAgICAgICBBZGRlZCAtY29tcGFjdCBvcHRpb24uCiAgICAgICAgICAgIFJlZHVjZSB0aGUgbGluZXMgYW5kIHNpemUgb2YgdGhlIHdyYXBwZXIgZmlsZQogICAgICAgICAgICBieSBvbWl0dGluZyBjb21tZW50cyBhbmQgY29tYmluaW5nIHNob3J0IGxpbmVzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAKMDIvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY1MTM1NSBdIFN5bnRheCBlcnJvciB3aXRoIGNzdHJpbmcuaQogICAgICAgICAgICBSZXBvcnRlZCBieSBPbXJpIEJhcmVsLgoKMDIvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY2MzYzMiBdIGluY29tcGF0aWJpbGl0eSB3aXRoIHN0YW5kYXJkIGNwcC4KICAgICAgICAgICAgVGhpcyBpcyBhIHJlZmluZW1lbnQgdGhhdCBmaXhlcyB0aGlzIHByb2JsZW06CgogICAgICAgICAgICAgICAgIC8vIFNvbWUgbWFjcm8gd2l0aCBhbiBhcmd1bWVudAogICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PKHgpICAgICAgIHgKCiAgICAgICAgICAgICAgICAgaW50IEZPTzsgICAgICAgIC8qIE5vdCBhIG1hY3JvLS0tbm8gYXJndW1lbnRzICovCiAKMDIvMDUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY3NTQ5MSBdIHBhcnNlIGVycm9yIHdpdGggZ2xvYmFsIG5hbWVzcGFjZSBxdWFsaWZpY2F0aW9uLgogICAgICAgICAgICBTdWJtaXR0ZWQgYnkgSmVyZW15IFlhbGxvcC4KCjAyLzA0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHZhcmFyZ3MgcHJvY2Vzc2luZyBpbnRyb2R1Y2VkIGJ5IHRoZSBudW1pbnB1dHMgdHlwZW1hcCBwYXJhbWV0ZXIuCgowMS8wOC8yMDAzOiB0dG4KCSAgICBbeG1sXSBGaXggc3RyaW5nLXJlcGxhY2VtZW50IG9yZGVyaW5nIGJ1Z2xldC4KCSAgICBUaGFua3MgdG8gR2FyeSBIZXJyb24uCgoxMi8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRnVydGhlciBidWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIFRoZSBTV0lHIGV4ZWN1dGFibGUgaXMgbm93IGJ1aWx0IHVzaW5nIGEgc2luZ2xlIE1ha2VmaWxlLgogICAgICAgICAgICAtIFRoaXMgbWFrZWZpbGUgaXMgZ2VuZXJhdGVkIGJ5IEF1dG9tYWtlIChTb3VyY2UvTWFrZWZpbGUuYW0pLgogICAgICAgICAgICAtIERlcGVuZGVuY3kgdHJhY2tpbmcgYW5kIHRhZ3Mgc3VwcG9ydCBhcmUgaW4gdGhpcyBtYWtlZmlsZS4KICAgICAgICAgICAgLSBBdXRvbWFrZSAxLjcuMiBhbmQgQXV0b2NvbmYgMi41NCBtaW5pbXVtIHZlcnNpb25zIGFyZSBuZWVkZWQgdG8gYnVpbGQgU1dJRyBmcm9tIENWUy4KICAgICAgICAgICAgLSBSdW5uaW5nIC4vYXV0b2dlbi5zaCBub3cgaW5zdGFsbHMgQXV0b2NvbmYvQXV0b21ha2Ugc3VwcG9ydCBmaWxlcyBpbnRvCiAgICAgICAgICAgICAgVG9vbHMvY29uZmlnIGFuZCB0aGVzZSBmaWxlcyBhcmUgbm8gbG9uZ2VyIHN0b3JlZCBpbiBDVlMuCiAgICAgICAgICAgIC0gQnVnIGZpeGVzIGluICdtYWtlIGluc3RhbGwnIGZvciBzeXN0ZW1zIHVzaW5nIC5leGUgZXhlY3V0YWJsZSBleHRlbnNpb24gYW5kCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXJlbGVhc2Utc3VmZml4PXdoYXRldmVyCgoxMi8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTW9yZSBidWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIEF1dG9jb25mJ3MgQUNfQ0FOT05JQ0FMX0hPU1QgcmVwbGFjZXMgcHJvcHJpZXRhcnkgYXBwcm9hY2ggZm9yIGRldGVjdGluZyBidWlsZCBob3N0LgogICAgICAgICAgICAtIEF1dG9jb25mIHN1cHBvcnQgZmlsZXMgbW92ZWQgdG8gVG9vbHMvY29uZmlnLgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgdG8gcnVuIG9uIE1hY09TLCBzdWJtaXR0ZWQgYnkgQmVybmFyZCBEZXNncmF1cGVzLgogICAgICAgICAgICBNYWlubHkgZW5zdXJpbmcgZ2VuZXJhdGVkIGZpbGVzIGFyZSBvdXRwdXQgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBmb3IKICAgICAgICAgICAgc29tZSBtb2R1bGVzLgoKMTIvMTEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFZhcmlvdXMgYnVpbGQgbW9kaWZpY2F0aW9ucyBhbmQgYnVnIGZpeGVzOgogICAgICAgICAgICAtIFNpbXBsaWZpY2F0aW9uIG9mIHZlcnNpb24gc3RyaW5nLiBVc2UgYXV0b2NvbmYncyBQQUNLQUdFX1ZFUlNJT04gaW5zdGVhZC4KICAgICAgICAgICAgLSBCdWlsZCB0aW1lIHJlbW92ZWQgZnJvbSBTV0lHIHZlcnNpb24uCiAgICAgICAgICAgIC0gVXNpbmcgc3RhbmRhcmQgYXV0b2NvbmYgY29uZmlnIGhlYWRlciBnZW5lcmF0aW9uLgogICAgICAgICAgICAtIFVwZGF0ZWQgb2xkIGF1dG9jb25mIG1hY3JvcyBhcyByZXBvcnRlZCBieSBhdXRvdXBkYXRlLgogICAgICAgICAgICAtIFJlbW92ZWQgJHByZWZpeCBpbiBhdXRvY29uZiBmcm9tIHNlYXJjaCBwYXRocyBhcyBhdXRvY29uZiB3b24ndCBleHBhbmQgdGhlbS4KICAgICAgICAgICAgLSBTdWJ0bGUgYnVnIGZpeCB3aGVyZSAnbWFrZSBwcmVmaXg9L3NvbWV3aGVyZTsgbWFrZSBjbGVhbjsgbWFrZSBwcmVmaXg9L3NvbXdoZXJlL2Vsc2UnCiAgICAgICAgICAgICAgcHJvZHVjZWQgYW4gZXhlY3V0YWJsZSB1c2luZyB0aGUgaW5jb3JyZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIC0gQWRkZWQgLWxkZmxhZ3MgY29tbWFuZGxpbmUgb3B0aW9uIGZvciBNelNjaGVtZSwgT2NhbWwsIFBpa2UgYW5kIFBIUC4KICAgICAgICAgICAgLSBGaXhlZCByZXBvcnRpbmcgb2YgY29tcGlsZXIgdXNlZCB3aGVuIHVzaW5nIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbi4KICAgICAgICAgICAgLSBTV0lHIHdlYiBhZGRyZXNzIGFkZGVkIHRvIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjEyLzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZml4IHRvIFRjbCBkeW5hbWljIGNhc3QgdHlwZW1hcHMuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEtyaXN0b3BoZXIgQmxvbS4KCjEyLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHRlbXBsYXRlIGFyZ3VtZW50IHJlcGxhY2UgYnVnLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQ2hyaXMgRmxhdGxleS4KCjEyLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV2ZXJ0ZWQgQ0hBTkdFUyAwOS8wMy8yMDAyLCBwcmVwcm9jZXNzb3IgYXJndW1lbnQgZXZhbHVhdGlvbi4gIEFyZ3VtZW50cwogICAgICAgICAgICBhcmUgbm90IGV2YWx1YXRlZCBkdXJpbmcgY29sbGVjdGlvbiwgSyZSLCBwLiAyMzAuCgoxMi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjQ5MDIyIF0gQ29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBLQUkvS0NDCgoxMi8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgJ3JlbC0xLTMnIENWUyBicmFuY2ggbWVyZ2VkIGJhY2sgaW50byB0aGUgbWFpbiBicmFuY2guCgoKVmVyc2lvbiAxLjMuMTcgKE5vdmVtYmVyIDIyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjEzOTIyIF0gcHJlcHJvY2Vzc29yIGVycm9ycyB3aXRoIEhBVkVfTE9OR19MT05HLgogICAgICAgICAgICAKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxNTQ4MCBdIG16c2NoZW1lIFNXSUdfTXVzdEdldFB0cl8uCgoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjM1MTE5IF0gU1dJR19jcm9hayBjYXVzZXMgY29tcGlsZXIgd2FybmluZy4KCjExLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdHlwZW1hcHMgZm9yIHBvaW50ZXJzIHRvIGNsYXNzIG1lbWJlcnMuCgoxMS8xNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE92ZXJsb2FkZWQgQysrIGZ1bmN0aW9ucyB3aGljaCBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBpbiBKYXZhIAogICAgICAgICAgICBvbmNlIGFnYWluIGlzc3VlIGEgd2FybmluZy4KCjExLzE0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSGFuZGxpbmcgb2YgTlVMTCBwb2ludGVycyBpcyBpbXByb3ZlZC4gQSBqYXZhIG51bGwgb2JqZWN0IHdpbGwgbm93CiAgICAgICAgICAgIGJlIHRyYW5zbGF0ZWQgdG8gYW5kIGZyb20gYSBOVUxMIEMvQysrIHBvaW50ZXIgYnkgZGVmYXVsdC4gUHJldmlvdXNseSB3aGVuIAogICAgICAgICAgICB3cmFwcGluZzoKCiAgICAgICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3Mgey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhTb21lQ2xhc3MgKnMpOwoKICAgICAgICAgICAgYW5kIGl0IHdhcyBjYWxsZWQgZnJvbSBKYXZhIHdpdGggbnVsbDoKCiAgICAgICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhudWxsKQoKICAgICAgICAgICAgYSBKYXZhIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIEV4dHJhIHR5cGVtYXBzIGhhZCB0byBiZSB3cml0dGVuIGluCiAgICAgICAgICAgIG9yZGVyIHRvIG9idGFpbiBhIE5VTEwgcG9pbnRlciB0byBwYXNzIHRvIGZ1bmN0aW9ucyBsaWtlIHRoaXMgb25lLiBOb3cgdGhlIAogICAgICAgICAgICBkZWZhdWx0IHdyYXBwaW5nIHdpbGwgZGV0ZWN0ICdudWxsJyBhbmQgdHJhbnNsYXRlIGl0IGludG8gYSBOVUxMIHBvaW50ZXIuCiAgICAgICAgICAgIEFsc28gaWYgYSBmdW5jdGlvbiByZXR1cm5zIGEgTlVMTCBwb2ludGVyLCBlZzoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBTb21lQ2xhc3MgKmJhcigpIHsgcmV0dXJuIE5VTEw7IH0KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZW4gdGhpcyB1c2VkIHRvIGJlIHdyYXBwZWQgd2l0aCBhIFNvbWVDbGFzcyBwcm94eSBjbGFzcyBob2xkaW5nIGEgTlVMTAogICAgICAgICAgICBwb2ludGVyLiBOb3cgbnVsbCBpcyByZXR1cm5lZCBpbnN0ZWFkLiBUaGVzZSBjaGFuZ2VzIGFyZSBzdWJ0bGUgYnV0IHVzZWZ1bC4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlIG9yaWdpbmFsIHR5cGVtYXBzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICQmamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICRqYXZhY2xhc3NuYW1lKCRqbmljYWxsLCAkb3duZXIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoKMTEvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgbWV0aG9kcyBhbmQgc2lnbmF0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgY2xhc3MgYWJzdHJhY3RfZm9vIHsgCiAgICAgICAgICAgIHB1YmxpYzogCiAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAgIG1ldGgoaW50IG1ldGhfcGFyYW0pID0gMDsgCiAgICAgICAgICAgIH07IAogCiAKICAgICAgICAgICAgY2xhc3MgYWJzdHJhY3RfYmFyIDogcHVibGljIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgaW50IG1ldGgoaW50IG1ldGhfcGFyYW1fMSwgaW50IG1ldGhfcGFyYW1fMikgeyByZXR1cm4gMDsgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhYnN0cmFjdF9iYXIgaXMgc3RpbGwgYWJzdHJhY3QuCgogICAgICAgICAgICBGaXhlcyBbIDYyODQzOCBdIERlcml2ZWQgYWJzdHJhY3QgY2xhc3Mgbm90IGFic3RyYWN0LgogICAgICAgICAgICBSZXBvcnRlZCBhbmQgcGF0Y2hlZCBieSBTY290dCBNaWNoZWwuCgoxMS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgbWF0Y2hpbmcgcHJvYmxlbSB3aXRoIHR5cGVtYXBzIGFuZCBhcnJheSBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgICBoYWQgdGhpczoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgY2hhciBibGFoWzIwXTsKCiAgICAgICAgICAgIGFuZCBhIHR5cGVtYXA6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICAgLi4uICQxX2RpbTAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZW4gJDFfZGltKiB2YXJpYWJsZXMgd2VyZW4ndCBiZSBleHBhbmRlZCBwcm9wZXJseS4gIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBQYW5rYWogS3VtYXIgR29lbC4KICAgICAgICAgICAgICAgCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBBZGRlZCBhbiBleHBlcmltZW50YWwgbmV3IG1vZHVsZSB0aGF0IGR1bXBzIFNXSUcncyBwYXJzZQoJICAgIHRyZWUgYXMgKENvbW1vbikgTGlzcCBzLWV4cHJlc3Npb25zLiAgVGhlIG1vZHVsZSBpcwoJICAgIGludm9rZWQgd2l0aCBTV0lHJ3MgLXNleHAgY29tbWFuZC1saW5lIHN3aXRjaC4gIFRoZSBvdXRwdXQKCSAgICBjYW4gYmUgcmVhZCBpbnRvIENvbW1vbiBMaXNwLiAgVGhlcmUgaXMgKHByb3RvdHlwZSkKCSAgICBleGFtcGxlIExpc3AgY29kZSB0aGF0IGdlbmVyYXRlcyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQoJICAgIGRlZmluaXRpb25zIGZvciB1c2Ugd2l0aCBLZXZpbiBSb3NlbmJlcmcncyBVRkZJLgoKCSAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMTEvMDcvMjAwMjogbWtvZXBwZQoJICAgIFJlbW92ZWQgZHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mICJjcHBfdGVtcGxhdGVfZGVjbCIgaW4KCSAgICBwYXJzZXIueTsgYmlzb24gMS43NSBjb21wbGFpbmVkLgoKMTEvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHByaW1pdGl2ZSBhcnJheSBoYW5kbGluZyBoYXMgY2hhbmdlZCBsaWtlIGFycmF5cyBvZiBjbGFzc2VzLiAKICAgICAgICAgICAgQyBwcmltaXRpdmUgYXJyYXlzIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBhIEphdmEgYXJyYXkgYnV0IHdpdGggYSBwb2ludGVyIAogICAgICAgICAgICAodHlwZSB3cmFwcGVyIGNsYXNzKS4gQWdhaW4gdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgZm9yIGVmZmljaWVuY3kgcmVhc29ucy4gCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCB0eXBlbWFwcyBoYXZlIGJlZW4gbW92ZWQgaW50byBhcnJheXNfamF2YS5pLCBzbyB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGJlaGF2aW91ciBjYW4gYmUgb2J0YWluZWQgbWVyZWx5IGluY2x1ZGluZyB0aGlzIGZpbGU6CgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCgogICAgICAgICAgICBUaGUgYXJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIG5vIGxvbmdlciBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gVGhleSBhcmUgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBpbmNsdWRpbmcgdGhpcyBmaWxlLCB0aHVzIHRoaXMgb2Z0ZW4gdW51c2VkIGNvZGUgaXMgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBzcGVjaWZpY2FsbHkgcmVxdWlyaW5nIHRoaXMgdHlwZSBvZiBhcnJheSBzdXBwb3J0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTEvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHN1cHBvcnQgZm9yIG5lc3RlZCBtb2R1bGUgZGVjbGFyYXRpb25zIChhcyB3YXMKICAgICAgICAgICAgcHJldmlvdXNseSBhZGRlZCBmb3IgdGhlIFBlcmwgbW9kdWxlKS4gU28gYSAlbW9kdWxlIGRpcmVjdGl2ZQogICAgICAgICAgICBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJPdXRlcjo6SW5uZXI6OkZvbyIKCiAgICAgICAgICAgIHdpbGwgbmVzdCBldmVyeXRoaW5nIGFzIChpbiBSdWJ5IGNvZGUpOgoKICAgICAgICAgICAgICAgIG1vZHVsZSBPdXRlcgogICAgICAgICAgICAgICAgICBtb2R1bGUgSW5uZXIKICAgICAgICAgICAgICAgICAgICBtb2R1bGUgRm9vCiAgICAgICAgICAgICAgICAgICAgICAjIHN0dWZmIGdvZXMgaGVyZQogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgIGVuZAogCjExLzA1LzIwMDI6IG1rb2VwcGUgCgkgICAgW016U2NoZW1lXSBBZGQgYW4gYXJndW1lbnQgKC1kZWNsYXJlbW9kdWxlKSB0aGF0IGdlbmVyYXRlcwoJICAgIGNvZGUgdG8gY29ycmVjdGx5IGRlY2xhcmUgYSBwcmltaXRpdmUgbW9kdWxlIGV4dGVuc2lvbi4KCSAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgQnJ1Y2UgQnV0dGVyZmllbGQuCgoxMS8wMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHBhdGNoIHN1Ym1pdHRlZCBieSBNaWNoYWVsIENhaGlsbCB0byByZW1vdmUgdW51c2VkIHBhcmFtZXRlcgogICAgICAgICAgICB3YXJuaW5ncyBmb3IgdGhlIGplbnYgYW5kIGNscyBwYXJhbWV0ZXJzLiBUaGlzIHBhdGNoIGFsc28gYWxzbyBhbGxvd3Mgb25lCiAgICAgICAgICAgIHRvIHVzZSAidm9pZCIgaW4gdGhlIGpuaSB0eXBlbWFwIGZvciBhbnkgdHlwZSB3aXRob3V0IGNvZGUgYmVpbmcgZ2VuZXJhdGVkCiAgICAgICAgICAgIGF0dGVtcHRpbmcgdG8gcmV0dXJuIGEgdmFsdWUuCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFycmF5IGhhbmRsaW5nIGlzIGRpZmZlcmVudC4gQXJyYXlzIG9mIGNsYXNzZXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkCiAgICAgICAgICAgIHdpdGggcHJveHkgYXJyYXlzLCBlZyB3cmFwcGluZwoKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CiAgICAgICAgICAgIAogICAgICAgICAgICB1c2VkIHRvIGJlIHdyYXBwZWQgd2l0aCB0aGVzZSBKYXZhIGdldHRlcnMgYW5kIHNldHRlcnM6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYW10gdmFsdWUpIHsuLi59CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFhbXSBnZXRGb28oKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBpcyB2ZXJ5IGluZWZmaWNpZW50IGFzIHRoZSBlbnRpcmUgYXJyYXkgaXMgY29waWVkIG51bWVyb3VzCiAgICAgICAgICAgIHRpbWVzIG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgZ2V0dGVyIG9yIHNldHRlci4gVGhlc2UgYXJyYXlzIGFyZSBub3cKICAgICAgICAgICAgd3JhcHBlZCB3aXRoIGEgcG9pbnRlciBzbyBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIGFjY2VzcyB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCAKICAgICAgICAgICAgdXNpbmcgYSBwcm94eSBjbGFzczoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKFggdmFsdWUpIHsuLi59CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFggZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIEFycmF5cyBvZiBlbnVtcyBoYXZlIGFsc28gYmVlbiBzaW1pbGFybHkgY2hhbmdlZC4gVGhpcyBiZWhhdmlvdXIgaXMgbm93IGxpa2UgdGhlIAogICAgICAgICAgICBvdGhlciBTV0lHIGxhbmd1YWdlJ3MgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBhcnJheSBsaWJyYXJ5IHNob3VsZCBiZSB1c2VkIHRvIAogICAgICAgICAgICBhY2Nlc3MgdGhlIG90aGVyIGVsZW1lbnRzLiBUaGUgb3JpZ2luYWwgYmVoYXZpb3VyIGNhbiBiZSBhY2hpZXZlZCB1c2luZyB0aGUgCiAgICAgICAgICAgIG1hY3JvcyBhbmQgdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICBKQVZBX0FSUkFZU09GQ0xBU1NFUyhYKQogICAgICAgICAgICAgICAgY2xhc3MgWCB7Li4ufTsKICAgICAgICAgICAgICAgIFggZm9vWzEwXTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjEwLzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVHdvIG5ldyB0eXBlbWFwcyBqYXZhaW4gYW5kIGphdmFvdXQgZm9yIGdlbmVyYXRpbmcgdGhlIHByb3h5IGNsYXNzIAogICAgICAgICAgICBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzIG1ldGhvZCBjYWxscyB0byB0aGUgSk5JIGNsYXNzLiBUaGUgbmV3IHR5cGVtYXBzIGFyZSAKICAgICAgICAgICAgcmVhbGx5IHVzZWQgZm9yIHRyYW5zZm9ybWluZyB0aGUganN0eXBlICh1c2VkIGluIHByb3h5IGNsYXNzIGFuZCB0eXBlIHdyYXBwZXIKICAgICAgICAgICAgY2xhc3NlcykgdG8gdGhlIGp0eXBlICh1c2VkIGluIHRoZSBKTkkgY2xhc3MpIGFuZCB2aXNhIHZlcnNhLiBBIGphdmFpbiB0eXBlbWFwCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHdoZW5ldmVyIGFuIGluIHR5cGVtYXAgaXMgd3JpdHRlbiBhbmQgc2ltaWxhcmx5IGphdmFvdXQgZm9yIGFuIG91dAogICAgICAgICAgICB0eXBlbWFwLiBBbiBleGFtcGxlIGlzIHByb2JhYmx5IGJlc3QgdG8gc2hvdyB0aGVtIHdvcmtpbmc6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWluKSBDbGFzcyAiQ2xhc3MuZ2V0Q1B0cigkamF2YWlucHV0KSIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgdW5zaWduZWQgc2hvcnQgIiRqYXZhaW5wdXQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBDbGFzcyAqIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzKCRqbmljYWxsLCAkb3duZXIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzIHt9OwogICAgICAgICAgICAgICAgICAgIENsYXNzICogYmFyKENsYXNzIGNscywgdW5zaWduZWQgc2hvcnQgdXNoKSB7IHJldHVybiBuZXcgQ2xhc3MoKTsgfTsKICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIHByb3h5IGNvZGUgaXMgdGhlbjoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzIGJhcihDbGFzcyBjbHMsIGludCB1c2gpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcyhleGFtcGxlSk5JLmJhcihDbGFzcy5nZXRDUHRyKGNscyksIHVzaCksIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBTb21lIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW50cm9kdWNlZCBpbiBvcmRlciB0byB1c2UgdGhlc2UgdHlwZW1hcHMuCiAgICAgICAgICAgIEhlcmUgJGphdmFpbnB1dCBoYXMgYmVlbiByZXBsYWNlZCBieSAnY2xzJyBhbmQgJ3VzaCcuICRqbmljYWxsIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IAogICAgICAgICAgICB0aGUgbmF0aXZlIG1ldGhvZCBjYWxsLCAnZXhhbXBsZUpOSS5iYXIoLi4uKScgYW5kICRvd25lciBoYXMgYmVlbiByZXBsYWNlZCBieSAnZmFsc2UnLgogICAgICAgICAgICAkamF2YWlucHV0IGlzIGFuYWxvZ291cyB0byB0aGUgJGlucHV0IHNwZWNpYWwgdmFyaWFibGUuIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgICAgJGpuaWNhbGwgaXMgYW5hbG9nb3VzIHRvICRhY3Rpb24gaW4gJWV4Y2VwdGlvbi4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNhbGwgdG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gdGhlIEpOSSBjbGFzcy4KICAgICAgICAgICAgJG93bmVyIGlzIHJlcGxhY2VkIGJ5IGVpdGhlciB0cnVlIGlmICVuZXdvYmplY3QgaGFzIGJlZW4gdXNlZCBvdGhlcndpc2UgZmFsc2UuCgogICAgICAgICAgICBUaGUgamF2YS5zd2cgZmlsZSBjb250YWlucyBkZWZhdWx0IGphdmFpbiBhbmQgamF2b3V0IHR5cGVtYXBzIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSBjb2RlCiAgICAgICAgICAgIGFzIHByZXZpb3VzbHkuIFRoaXMgY2hhbmdlIGlzIG9ubHkgb2YgY29uY2VybiB0byB0aG9zZSB3aG8gaGF2ZSB3cml0dGVuIHRoZWlyIG93biB0eXBlbWFwcyBhcwogICAgICAgICAgICB5b3Ugd2lsbCB0aGVuIG1vc3QgbGlrZWx5IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gamF2YWluIGFuZCBqYXZhb3V0IHR5cGVtYXBzLgoKICAgICAgICAgICAgVGhlIGphdmFvdXQgdHlwZW1hcCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBhIEphdmEgZG93bmNhc3QgdG8gYmUgdXNlZCBvbiBhYnN0cmFjdCAKICAgICAgICAgICAgcHJveHkgYmFzZSBjbGFzc2VzLiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBvbiBkeW5hbWljX2Nhc3QuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yNC8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFVwZ2FkZWQgdG8gbGlidG9vbCAxLjQuMywgcHJlc3VtYWJseSB3LyBiZXR0ZXIKCSAgICBzdXBwb3J0IGZvciBuZXdpc2ggcGxhdGZvcm1zIChsaWtlIE1hY09TIFgpLgoKMTAvMjEvMjAwMjogdHRuCgkgICAgRml4ZWQgUnVudGltZS9NYWtlZmlsZS5pbiBidWcgLS0gdGhhbmtzIHRvIFJpY2hhcmQgQ2FsbWJhY2guCgoxMC8xOC8yMDAyOiB0dG4KCSAgICBGaXhlZCB0eXBvIGluIGRvaC5oIC0tIHRoYW5rcyB0byBNYXggSG9ybi4KClZlcnNpb24gMS4zLjE2IChPY3RvYmVyIDE0LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWV4dGVuZCBkaXJlY3RpdmUgYW5kICVmZWF0dXJlIHJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMTAvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBPcGVuVk1TIGJ1aWxkIGRpcmVjdG9yeSAodm1zKS4gIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBKZWFuLUZyYW7nb2lzIFBpZXJvbm5lLgoKMTAvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgY2xhdXNlIHRvIHRoZSBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgIFRoZSB0aHJvd3MgY2xhdXNlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZ2VuZXJhdGVkIGZvciBwcm94eSBmdW5jdGlvbnMKICAgICAgICAgICAgYW5kIG1vZHVsZSBjbGFzcyBmdW5jdGlvbnMuCgowOS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgYW5kIGNsYXNzZXMgdGhhdAogICAgICAgICAgICB3ZXJlIGRlZmluZWQgYnV0IG5vdCB3cmFwcGVkLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMZXNsaWUgQnJvb2tzLAogICAgICAgICAgICBHZXJyeSBXb29kcywgYW5kIG90aGVycy4KCjA5LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29tZSBlcnJvciBjaGVja2luZyBhZGRlZDoKICAgICAgICAgICAgMSkgT3V0T2ZNZW1vcnlFeGNlcHRpb24gY2hlY2sgaW4gdGhlIGNoYXIgKiB0eXBlbWFwcy4gCiAgICAgICAgICAgIDIpIEFzIFNXSUcgdHJlYXRzIHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwYXNzaW5nIGJ5IHZhbHVlIGFsbCB0aGUKICAgICAgICAgICAgc2FtZSwgaXQgaXMgcG9zc2libGUgdG8gcGFzcyBhIE5VTEwgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgZXhwZWN0cwogICAgICAgICAgICBhbiBvYmplY3QgcGFzc2VkIGJ5IHZhbHVlIG9yIGJ5IHJlZmVyZW5jZS4gQSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyAKICAgICAgICAgICAgbm93IHRocm93biB1bmRlciB0aGlzIHNjZW5hcmlvLgoKMDkvMjAvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBSZXdvcmtlZCAibWFrZSBjbGVhbiIgYW5kICJtYWtlIGluc3RhbGwiCgkJCSAgdG8gYmUgbW9yZSB0YWJsZSBkcml2ZW4uCgkgICAgW0RvY3NdIEV4cGxhaW4gaG93IHRvIGV4dGVuZCAibWFrZSBpbnN0YWxsIiB3LyBleHRyYS1pbnN0YWxsLmxpc3QuCgowOS8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0aW9uIG9mIHRoZSAiaWdub3JlIiB0eXBlbWFwLiAgIFRoZSAiaWdub3JlIiB0eXBlbWFwIGhhcwogICAgICAgICAgICBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgImluIiB0eXBlbWFwLgogICAgICAgICAgICBUbyBpZ25vcmUgYW4gYXJndW1lbnQsIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIGluc3RlYWQ6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApIGludCAqb3V0cHV0IChpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24KICAgICAgICAgICAgb2YgdGhlICJpbiIgYW5kICJpZ25vcmUiIHR5cGVtYXBzICh3aGljaCB3ZXJlIHN1cHBvc2VkIHRvIGJlCiAgICAgICAgICAgIG11dHVhbGx5IGV4Y2x1c2l2ZSkuCgogICAgICAgICAgICBUaGUgdXNlIG9mIHRoZSBudW1pbnB1dHMgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24uCiAgICAgICAgICAgIEN1cnJlbnRseSwgdmFsdWVzID4xIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3IuICBIb3dldmVyLCBmdXR1cmUKICAgICAgICAgICAgcmVsZWFzZXMgb2YgU1dJRyBtYXkgdXRpbGl6ZSB0aGF0IHRvIHN1cHBvcnQgbXVsdGktaW5wdXQgdHlwZW1hcHMuCgogICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIHN0aWxsIHdvcmtzLCBidXQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpcwogICAgICAgICAgICB0cmFuc2xhdGVkIHRvICV0eXBlbWFwKGluLG51bWlucHV0cz0wKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCBmb3IgdW5uYW1lZCBzdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgIH0gKmJsYWg7CgoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUm9nZXIgR2lic29uLgogICAgICAgICAgICBOb3RlOiB3ZSBtaWdodCBiZSBhYmxlIHRvIGdlbmVyYXRlIHdyYXBwZXJzIGluIHNwZWNpYWwgY2FzZXMuCgowOS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIG1vZGlmaWNhdGlvbiB0byBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbnMuICBQb2ludGVyIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIGFsd2F5cyBzZXQgdG8gYW4gaW5pdGlhbCB2YWx1ZSBvZiAwLiAgIFNpbXBsaWZpZXMgdHlwZW1hcCB3cml0aW5nIGFuZCBjbGVhbnVwCiAgICAgICAgICAgIGNvZGUgKHNpbmNlIHlvdSBjYW4gcmVseSBvbiB6ZXJvLXZhbHVlIGluaXRpYWxpemF0aW9uKS4gICBUaGlzIGFsc28gZ3JlYXRseQogICAgICAgICAgICByZWR1Y2VzIHRoZSBuZWVkIHRvIGV2ZXIgd3JpdGUgYW4gImFyZ2luaXQiIHR5cGVtYXAuCgowOS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHNtYXJ0LXBvaW50ZXIgc3VwcG9ydC4gIElmIG9wZXJhdG9yLT4oKQogICAgICAgICAgICBpcyBwYXJ0IG9mIGFuIGlnbm9yZWQgYmFzZSBjbGFzcyBsaWtlIHRoaXMsCgogICAgICAgICAgICAgICAgICVpZ25vcmUgQmFyOwoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgICAgICAgIC8qIElnbm9yZWQgKi8KICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBCYXIgeyB9OwoKICAgICAgICAgICAgdGhlbiBtZXRob2RzIGZyb20gRm9vIGFyZSBzdGlsbCBhdmFpbGFibGUuICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkKICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICAgVGhlIG9ubHkgY2F0Y2ggaXMgdGhhdCB0aGUgb3BlcmF0b3ItPigpIGl0c2VsZiBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICAgICAoc2luY2UgaXQgd2Fzbid0IHdyYXBwZWQpLiAgIFRoZXJlZm9yZSwgdGhlcmUgd29uJ3QgYmUgYW55CiAgICAgICAgICAgICBfX2RlcmVmX18oKSBvcGVyYXRpb24gdW5sZXNzIGl0IGlzIGV4cGxpY2l0bHkgYWRkZWQgdG8gU3BhbQogICAgICAgICAgICAgKGVpdGhlciB1c2luZyAlZXh0ZW5kIG9yIGp1c3QgcGxhY2luZyBvcGVyYXRvci0+KCkgaW4gdGhlCiAgICAgICAgICAgICBkZWZpbml0aW9uIG9mIFNwYW0pLgoKMDkvMTEvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBSZXdvcmtlZCAibWFrZSBjaGVjayIgdG8gYmUgbW9yZSB0YWJsZSBkcml2ZW4uCgkgICAgW0RvY3NdIERvY3VlbWVudGVkIG1ldGhvZG9sb2d5IGluIE1hbnVhbC9FeHRlbmRpbmcuaHRtbC4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtEb2NzXSBQcmVmaXhlZCBNYW51YWwvKi5odG1sIHdpdGggIjwhRE9DVFlQRSBodG1sIC4uLj4iIHRvCgkgICAgcGFuZGVyIGRvdGluZ2x5IHRvIChvdmVyLSlzZW5zaXRpdmUgZWRpdG9ycy4KCjA5LzEwLzIwMDI6IHR0bgoJICAgIFtHdWlsZV0gQ29udmVydGVkIEV4YW1wbGVzL2d1aWxlL3NpbXBsZSAibWFrZSBjaGVjayIKCSAgICBiZWhhdmlvciB0byBhY3R1YWxseSBjaGVjayBleGVjdXRpb24gcmVzdWx0cy4gIFJlZHVjZWQKCSAgICBpdGVyYXRpb24gY291bnRzIHNvIHRoYXQgdGhlIHRlc3QgZG9lc24ndCB0YWtlIHRvbyBsb25nLgoKMDkvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHLTEuMy4xNSByZWxlYXNlZC4KCgpWZXJzaW9uIDEuMy4xNSAoU2VwdGVtYmVyIDksIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA5LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgbmFzdHkgcnVudGltZSB0eXBlIGNoZWNraW5nIGJ1ZyB3aXRoIHN1YnR5cGVzIGFuZCBpbmhlcml0YW5jZQogICAgICAgICAgICBhbmQgdGVtcGxhdGVzLiAKCjA5LzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSmF2YSBleGNlcHRpb24gY2xhc3NlcyBmb3IgYSBtZXRob2QncyB0aHJvd3MgY2xhdXNlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgCiAgICAgICAgICAgIHNwZWNpZnlpbmcgdGhlbSBpbiBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IGluIHRoZSB0aHJvd3MgYXR0cmlidXRlIGluIGFueSBvbmUKICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB0eXBlbWFwczogaW4sIG91dCwgY2hlY2ssIGZyZWVhcmcsIGFyZ291dCBhbmQgdGhyb3dzLiBBIGNsYXNzaWMKICAgICAgICAgICAgZXhhbXBsZSB3b3VsZCBiZSB0byBjb252ZXJ0IEMrKyBleGNlcHRpb25zIGludG8gYSBzdGFuZGFyZCBKYXZhIGV4Y2VwdGlvbjoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MsIHRocm93cz0iamF2YS5pby5JT0V4Y2VwdGlvbiIpIGZpbGVfZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICBqY2xhc3MgZXhjZXAgPSBqZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vSU9FeGNlcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXApCiAgICAgICAgICAgICAgICAgICAgICAgIGplbnYtPlRocm93TmV3KGV4Y2VwLCAkMS53aGF0KCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsgLy8gb3IgdXNlIFNXSUdfZmFpbAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIGZpbGVfZXhjZXB0aW9uIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB0aHJvdyhmaWxlX2V4Y2VwdGlvbik7CgogICAgICAgICAgICBUaGUgSmF2YSBtZXRob2Qgd2lsbCB0aGVuIGJlIGRlY2xhcmVkIHdpdGggYSB0aHJvd3MgY2xhdXNlOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gey4uLn0KCjA5LzA4LzIwMDI6IG1rb2VwcGUKCSAgKiBbR3VpbGVdIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBhcmdsaXN0IG5vCgkgICAgbG9uZ2VyIGdldHMgY2x1dHRlcmVkIHdpdGggdHlwZSBzcGVjaWZpY2F0aW9uLCBtYWtpbmcgaXQKCSAgICBtb3JlIHJlYWRhYmxlLiAgKEFsc28gdGhlIElMSVNQIGZ1bmN0aW9uIEMtdSBNLXgKCSAgICBgYXJnbGlzdC1saXNwJyBSRVQgd29ya3MgYmV0dGVyIHRoaXMgd2F5LikgIFRoZSB0eXBlcyBvZgoJICAgIGFyZ3VtZW50cyBhcmUgZXhwbGFpbmVkIGluIGFuIGV4dHJhIHNlbnRlbmNlIGFmdGVyIHRoZQoJICAgIGFyZ2xpc3QuIAoJICAgIAoJICAgIFRoZXJlIGFyZSBub3cgdHdvIGRvY3VtZW50YXRpb24tcmVsYXRlZCB0eXBlbWFwIGFyZ3VtZW50czoKCgkgICAgICAgICV0eXBlbWFwKGluLCBkb2M9IiROQU1FIGlzIGEgdmVjdG9yIG9mIGludGVnZXJzIiwgCgkJCSBhcmdsaXN0PSIkbmFtZSIpICBpbnQgKlZFQ1RPUiB7IC4uLiB9CgkJCSAKICAgICAgICAgICAgVGhlICJhcmdsaXN0IiB0ZXh0cyBvZiBhbGwgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gbWFrZSB1cAoJICAgIGl0cyBhcmdsaXN0IGluIHRoZSBkb2N1bWVudGF0aW9uLiAgVGhlICJkb2MiIHRleHRzIG9mIGFsbAoJICAgIGFyZ3VtZW50cyBhcmUgY29sbGVjdGVkIHRvIG1ha2UgYSBzZW50ZW5jZSB0aGF0IGRlc2NyaWJlcwoJICAgIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLiAgUmVhc29uYWJsZSBkZWZhdWx0cyBhcmUKCSAgICBwcm92aWRlZC4gCgoJICAgIEFzIHVzdWFsLCAkbmFtZSBpcyBzdWJzdGl0dXRlZCBieSB0aGUgbmFtZSBvZiB0aGUKCSAgICBhcmd1bWVudC4gVGhlIG5ldyB0eXBlbWFwIHZhcmlhYmxlICROQU1FIGlzIGxpa2UgJG5hbWUsCgkgICAgYnV0IG1hcmtlZC11cCBhcyBhIHZhcmlhYmxlLiAgVGhpcyBtZWFucyB0aGF0IGl0IGlzCgkgICAgdXBwZXItY2FzZWQ7IGluIFRlWGluZm8gbW9kZSAoIi1wcm9jZG9jZm9ybWF0IHRleGluZm8iKSBpdAoJICAgIGNvbWVzIG91dCBhcyBAdmFye25hbWV9LiAKCSAgICAKCSAgICBUaGUgZGlyZWN0aXZlcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgICVtdWx0aXBsZV92YWx1ZXMgbm93IGFsc28gaGF2ZSBhbiBlZmZlY3Qgb24gdGhlCgkgICAgZG9jdW1lbnRhdGlvbi4gKFRoaXMgaXMgYWNoaWV2ZWQgdmlhIHRoZSBuZXcgcHJhZ21hcwoJICAgIHJldHVybl9ub3RoaW5nX2RvYywgcmV0dXJuX29uZV9kb2MsIHJldHVybl9tdWx0aV9kb2MuKQoKCSAgICBEb2N1bWVudGF0aW9uIGhhcyBhbHNvIGltcHJvdmVkIGZvciB2YXJpYWJsZXMgdGhhdCBhcmUKCSAgICB3cmFwcGVkIGFzIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzIChjb21tYW5kLWxpbmUgc3dpdGNoCgkgICAgIi1lbWl0LXNldHRlcnMiKS4KCiAgICAgICAgICAqIFtHdWlsZV0gRW1pdCBjb25zdGFudHMgYXMgX2ltbXV0YWJsZV8gdmFyaWFibGVzLiAgKFRoaXMKICAgICAgICAgICAgd2FzIGJyb2tlbiByZWNlbnRseS4pCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBVcGRhdGVkIHRoZSB0eXBlbWFwcyBpbiBsaXN0LXZlY3Rvci5pLgoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFNob3J0LWNpcmN1aXQgdGhlIHR5cGVjaGVja3MgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLgoJICAgIChUaGUgY2hhbmdlcyBpbiBjb2RlIGdlbmVyYXRpb24gYXJlIHZpc2libGUgaW4gdGhlIG5ldwoJICAgIHRlc3RjYXNlICJvdmVybG9hZF9jb21wbGljYXRlZCIuKQoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTb2x1dGlvbiBmb3IgWyA1OTY0MTMgXQogICAgICAgICAgICBOZXcgdHlwZW1hcCBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIHdyYXBwZXIgY29uc3RydWN0b3IgbW9kaWZpZXIgY2FuIGJlIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAKICAgICAgICAgICAgcHJvdGVjdGVkLiBOb3JtYWxseSBTV0lHIGdlbmVyYXRlcyBhIGNvbnN0cnVjdG9yIGxpa2UgdGhpcyB3aGljaCBjYW4gb25seSAKICAgICAgICAgICAgYmUgYWNjZXNzZWQgd2l0aGluIG9uZSBwYWNrYWdlOgoKICAgICAgICAgICAgICBwcm90ZWN0ZWQgQmFyKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgSWYgeW91IGFyZSB1c2luZyBTV0lHIGFjcm9zcyBtdWx0aXBsZSBwYWNrYWdlcyBvciB3YW50IHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIGFueXdheSwgaXQgY2FuIG5vdyBiZSBhY2Nlc3NlZCBvdXRzaWRlIHRoZSBwYWNrYWdlLiBUbyBtb2RpZnkgdXNlIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFICJwdWJsaWMiCgogICAgICAgICAgICB0byBjaGFuZ2UgdG8gcHVibGljIGZvciBhbGwgcHJveHkgY2xhc3NlcyBhbmQgc2ltaWxhcmx5IGZvciBhbGwgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICJwdWJsaWMiCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHRocm93cyB0eXBlbWFwcyBmb3IgdGhlIEphdmEgbW9kdWxlLiBDKysgZXhjZXB0aW9ucyBnZXQgY29udmVydGVkIGludG8KICAgICAgICAgICAgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gSmF2YSBleGNlcHRpb25zLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIFdhcm5pbmc6IFRoaXMgbWF5IGNoYW5nZSBmcm9tIGphdmEubGFuZy5SdW50aW1lIGV4Y2VwdGlvbiBpbiB0aGUgZnV0dXJlLgoKMDkvMDUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHZhcmlhYmxlcyBkZWNsYXJlZCBhcyByZWZlcmVuY2VzLgoKMDkvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwNTE2MiBdIFR5cGVtYXAgbG9jYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBMeWxlIEpvaG5zb24uCgowOS8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9yZSB1cGRhdGVzIHRvIHRoZSBSdWJ5IG1vZHVsZSBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcKCSAgICBhIG5ldyB0eXBlbWFwIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGNvbGxlY3Qga2V5LXZhbHVlCgkgICAgcGFpcnMgZnJvbSBhbiBhcmd1bWVudCBsaXN0IGludG8gYSBIYXNoLgoKMDkvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24gYW5kIGNvbnN0cnVjdG9ycy4KCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEZvbzxUPigpIHsgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBleHRyYSA8VD4gaW4gdGhlIGNvbnN0cnVjdG9yIHdhcyBjYXJyaWVkIHRocm91Z2ggaW4gdGhlCiAgICAgICAgICAgIG5hbWUtLWNhdXNpbmcgcnVudGltZSBwcm9ibGVtcyBpbiBnZW5lcmF0ZWQgbW9kdWxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9yZGkgQXJuYWJhdCBCZW5lZGljdG8uCiAKMDkvMDUvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gU3VwcG9ydCBvdmVybG9hZGluZy4KCjA5LzA0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlcwoJICAgIHRvIHVzZSBSdWJ5IDEuNyBzdXBwb3J0IGZvciB0aGVzZSB0eXBlcyB3aGVuIGF2YWlsYWJsZS4KCjA5LzA0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBvdXRwdXQgdHlwZW1hcHMgZm9yIGNvbnN0IHJlZmVyZW5jZSB0byBwcmltaXRpdmUKCSAgICB0eXBlcy4KCjA5LzA0LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBwYXNzLWJ5LXZhbHVlIHR5cGVtYXBzLiAgUmVwb3J0ZWQgYnkgQXJubwoJICAgIFBldGVycyB2aWEgRGViaWFuIGJ1Z3RyYWNraW5nICgjMTU2OTAyKSwgcGF0Y2ggYnkgVG9yc3RlbgoJICAgIExhbmRzY2hvZmYgPHRvcnN0ZW5AZGViaWFuLm9yZz4uCgowOS8wMy8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCgkgICAgQmV0dGVyIHJlZmVyZW5jZSBzdXBwb3J0LgoJICAgIEZ1bmN0aW9ucyB0aGF0IHdhbnQgYSB2b2lkKiogY2FuIHRha2UgYSBOVUxMIGJ5IHJlZmVyZW5jZSBhbmQKCSAgICB0aGUgdm9pZCogd2lsbCBiZSBtYWRlIGZvciB5b3UgYW5kIHRoZW4gcGFzc2VkLWJ5LXJlZmVyZW5jZQoKCSAgICBBbHNvIGFsbCBpbnRlZ2VyLWNsYXNzIG5hdGl2ZSB0eXBlcyBjYW4gYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZQoJICAgIHdoZXJlIGFuIGludCogb3IgaW50JiBldGMgaXMgbmVlZGVkCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZWQgdGhlIGV2YWx1YXRpb24gb3JkZXIgb2YgcHJlcHJvY2Vzc29yIG1hY3JvIGFyZ3VtZW50cy4KICAgICAgICAgICAgQXJndW1lbnRzIGFyZSBub3cgZXhwYW5kZWQgYnkgdGhlIHByZXByb2Nlc3NvciAqYmVmb3JlKiB0aGV5CiAgICAgICAgICAgIGFyZSBwYXNzZWQgdG8gbWFjcm8gZXhwYW5zaW9uLiAgVGhpcyBmaXhlcyBhIHN1YnRsZSBleHBhbnNpb24KICAgICAgICAgICAgYnVnIHJlcG9ydGVkIGJ5IEFudGhvbnkgSGVhZGluZy4KCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGhlIGZpbGUgaW5jbHVkZSBvcmRlciAoYWdhaW4sIGFwcGFyZW50bHkpLiBTZWUgMi8yNy85OS4KCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEJldHRlciBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydC4gIFNpbmNlIFBlcmwgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgICAgcmVsaWVzIG9uIHNldGptcC9sb25nam1wLCB3cmFwcGVyIGZ1bmN0aW9ucyBoYXZlIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkKICAgICAgICAgICAgdG8gcHJvdmlkZSBhbiBleHRyYSBibG9jayBzY29wZToKCiAgICAgICAgICAgICAgICBYUyhmb28pIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgX3N3aWdtc2dbU1dJR19NQVhfRVJSTVNHXSA9ICIiOwogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqX3N3aWdlcnIgPSBfc3dpZ21zZzsKICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIC8qIE5vcm1hbCB3cmFwcGVyIGZ1bmN0aW9uIGhlcmUgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgU1dJR19jcm9haygiQW4gZXJyb3Igb2NjdXJyZWRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBYU1JFVFVSTihhcmd2aSk7ICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gKi8KICAgICAgICAgICAgICAgICAgICAgIGZhaWw6CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgY29kZSAqLwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgY3JvYWsoX3N3aWdfZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBtYWNybyBTV0lHX2Nyb2FrKHgpIHNldHMgdGhlIHZhbHVlIG9mIF9zd2lnZXJyIHRvIHggYW5kCiAgICAgICAgICAgIGV4ZWN1dGVzIGEgImdvdG8gZmFpbCIuICBUaGUgd2hvbGUgd3JhcHBlciBmdW5jdGlvbiBpcyBlbmNsb3NlZAogICAgICAgICAgICBibG9jayBzY29wZSB0byBwcm92aWRlIHByb3BlciBjbGVhbnVwIG9mIEMrKyBvYmplY3RzLiAgU2luY2UKICAgICAgICAgICAgY3JvYWsgZXhlY3V0ZXMgYSBsb25nam1wKCksIHRoZXJlIGlzIG5vIHdheSB0byBwcm9wZXJseSByZWNsYWltCiAgICAgICAgICAgIHJlc291cmNlcyBpZiB0aGlzIGV4ZWN1dGVzIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSB3cmFwcGVyCiAgICAgICAgICAgIGZ1bmN0aW9uLgoKICAgICAgICAgICAgVGhlIF9zd2lnbXNnW10gdmFyaWFibGUgaXMgbm9ybWFsbHkgdW51c2VkLCBidXQgY2FuIGJlIHVzZWQKICAgICAgICAgICAgdG8gc3RvcmUgc21hbGwgZXJyb3IgbWVzc2FnZXMgdXNpbmcgc3ByaW50ZiBvciBzbnByaW50Zi4gSXQKICAgICAgICAgICAgaGFzIGEgY2FwYWNpdHkgb2YgYXQgbGVhc3QgMjU2IGJ5dGVzIChTV0lHX01BWF9FUlJNU0cpLgogICAgICAgICAgICAKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBBZGRlZCBiZXR0ZXIgc3VwcG9ydCBmb3IgZXhjZXB0aW9ucy4gIEluc3RlYWQgb2YgcmV0dXJuaW5nIFRDTF9FUlJPUiwKICAgICAgICAgICAgdXNlIHRoZSBtYWNybyBTV0lHX2ZhaWwgdG8gcmV0dXJuIHdpdGggYW4gZXJyb3IuICBUaGlzIGVuc3VyZXMgdGhhdAogICAgICAgICAgICBhcmd1bWVudHMgYXJlIHByb3Blcmx5IGNsZWFuZWQgdXAuICBFeGNlcHRpb24gc3BlY2lmaWVycyBhcmUgbm93CiAgICAgICAgICAgIGhhbmRsZWQgYnkgZGVmYXVsdC4KCjA5LzAyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBUaGUgdHlwZS1jaGVja2luZyBzeXN0ZW0gZm9yIHRoZSBSdWJ5IG1vZHVsZSBoYXMgaGFkIGEgZmxhdwoJICAgIGluIHRoYXQgc29tZSB0eXBlcyB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVpdmFsZW50CgkgICAgd2VyZW4ndC4gVGhpcyBidWcgd2FzIGJlc3QgZGVtb25zdHJhdGVkIGJ5IHRoZSBpbmhlcml0X21pc3NpbmcuaQoJICAgIHRlc3Qgc3VpdGUgY2FzZSwgd2hpY2ggZGVmaW5lcyBhIGJhc2UgY2xhc3MgIkZvbyIgdGhhdCBpcwoJICAgIHN1YmNsYXNzZWQgYnkgIkJhciIuIFRoZSAiRm9vIiBjbGFzcyBpc24ndCBhY3R1YWxseSB3cmFwcGVkIChpLmUuCgkgICAgaXQncyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIFJ1YnkpIGJ1dCB3ZSdkIHN0aWxsIGxpa2UgdG8gYmUKCSAgICBhYmxlIHRvIHBhc3MgIkJhciIgaW5zdGFuY2VzIHRvIGZ1bmN0aW9ucyBleHBlY3RpbmcgRm9vcyBhbmQgaGF2ZQoJICAgIHRoYXQgd29yazsgaXQgd2Fzbid0LiBUaGUgcmV2aXNlZCBpbXBsZW1lbnRhdGlvbiAoc2ltaWxhciB0byB0aGF0CgkgICAgdXNlZCBmb3Igc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzKSBhZGRzIGEgbmV3IGluc3RhbmNlIHZhcmlhYmxlCgkgICAgKF9fc3dpZ3R5cGVfXykgdG8gZWFjaCBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgaXRzIFNXSUcgdHlwZTsKCSAgICB0aGF0IGlzLCBlYWNoICJCYXIiIGluc3RhbmNlIHdpbGwgbm93IGhhdmUgYSBzdHJpbmcgaW5zdGFuY2UKCSAgICB2YXJpYWJsZSBjYWxsZWQgIl9fc3dpZ3R5cGVfXyIgd2hvc2UgdmFsdWUgaXMgIl9wX0JhciIuCgogICAgICAgICAgICBVbmxlc3MgZGV2ZWxvcGVycyB3ZXJlIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhpcyBsb3ctbGV2ZWwKCSAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHRoZXkgc2hvdWxkbid0IG5vdGljZSBhbnkgY29tcGF0aWJpbGl0eQoJICAgIHByb2JsZW1zOyBuZXZlcnRoZWxlc3MsIEknbSBtYXJraW5nIGl0IGFzIGEgInBvdGVudGlhbAoJICAgIGluY29tcGF0aWJpbGl0eSIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzAxLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBTRiBCdWcgIzYwMzE5OS4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgT1VUUFVULCBJTlBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBmb3IgQysrIAogICAgICAgICAgICByZWZlcmVuY2VzLgoKMDgvMjcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4ZWQgZXJyb3IgaW4gImxpYl9zdGRfdmVjdG9yIiB0ZXN0Y2FzZSBhbmQKCSAgICBjb21waWxlciB3YXJuaW5nIGluICJsaWJfY2RhdGEiIHRlc3RjYXNlLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiJW1peGluIiBkaXJlY3RpdmUsIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0bwoJICAgIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdG8gbWl4LWluIHRvIGEKCSAgICBjbGFzcy4gU28sIGZvciBleGFtcGxlLCBpZiB5b3UnZCBsaWtlIHRvIHNwZWNpZnkgdGhhdCBSdWJ5J3MKCSAgICBFbnVtZXJhYmxlIG1vZHVsZSBzaG91bGQgYmUgbWl4ZWQtaW4gdG8geW91ciBjbGFzcyBGb28sIHlvdSdkCgkgICAgd3JpdGU6CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkVudW1lcmFibGUiOwoJCQogICAgICAgICAgICBvciB0byBzcGVjaWZ5IHRoYXQgdGhlIG1vZHVsZXMgRmVlLCBGaWUgYW5kIEZvIHNob3VsZCBiZSBtaXhlZAoJICAgIGluIHRvIEZvbzoKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRmVlLEZpZSxGbyI7CgkJCgkgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vZGlmaWVkIHRoZSAlYWxpYXMgZGlyZWN0aXZlIHNvIHRoYXQgbXVsdGlwbGUgYWxpYXNlcwoJICAgIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGFuIGluc3RhbmNlIG1ldGhvZCBieSB1c2luZyBhIGNvbW1hLXNlcGFyYXRlZAoJICAgIGxpc3Qgb2YgYWxpYXNlcy4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCAidGhyb3ciIHR5cGVtYXBzIGZvciB0aGUgUnVieSBtb2R1bGUuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFR3byBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIHByaW50aW5nIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgJ3N3aWcgLU0nIGxpc3RzIGFsbCBmaWxlIGRlcGVuZGVuY2llcy4gICdzd2lnIC1NTScgbGlzdHMKICAgICAgICAgICAgZGVwZW5kZW5jaWVzLCBidXQgZXhjbHVkZXMgZmlsZXMgaW4gdGhlIFNXSUcgbGlicmFyeS4gCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgICAlIHN3aWcgLU0gLXB5dGhvbiBleGFtcGxlLmkKICAgICAgICAgICAgICAgZXhhbXBsZV93cmFwLmN4eDogXAogICAgICAgICAgICAgICAgL3UwL2JlYXpsZXkvUHJvamVjdHMvbGliL3N3aWcxLjMvc3dpZy5zd2cgXAogICAgICAgICAgICAgICAgL3UwL2JlYXpsZXkvUHJvamVjdHMvbGliL3N3aWcxLjMvcHl0aG9uL3B5dGhvbi5zd2cgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCiAgICAgICAgICAgICAgICUgc3dpZyAtTU0gLXB5dGhvbiBleGFtcGxlLmkKICAgICAgICAgICAgICAgZXhhbXBsZV93cmFwLmN4eDogXAogICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTc1OTkgXSB1bmlvbiBpbiBjbGFzczogaW5jb3JyZWN0IHNjb3BlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwMDEzMiBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBuYW1lc3BhY2UuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBTaGlidWthd2EgWW9zaGlraS4KIAowOC8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEF1dG9tYXRpYyBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgZm9yIGFsbCBsYW5ndWFnZSBtb2R1bGVzLiAgICBUaGlzIGlzCiAgICAgICAgICAgIHByZXR0eSBzaW1wbGUuICBJZiB5b3UgaGF2ZSBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coRm9vKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgd3JhcF9CYXJfYmxhaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLT5ibGFoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRm9vICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAidGhyb3ciIHR5cGVtYXAgY29kZSBpbnNlcnRlZC4gJDEgPSBfZSAqLwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFRoZSAidGhyb3ciIHR5cGVtYXAgY2FuIGJlIHVzZWQgdG8gcmFpc2UgYW4gZXJyb3IgaW4gdGhlIHRhcmdldCAKICAgICAgICAgICAgbGFuZ3VhZ2UuICBJdCBjYW4gZG8gYW55dGhpbmcuICBIZXJlIGlzIGEgdmVyeSBzaW1wbGUgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoInRocm93IikgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkZvbyBleGNlcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVG8gbWFrZSB0aGlzIHdvcmsgaW4gZWFjaCBsYW5ndWFnZSBtb2R1bGUsIHNpbXBseSBkZWZpbmUgYSBmZXcgZGVmYXVsdAogICAgICAgICAgICAidGhyb3ciIHR5cGVtYXBzIGZvciBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgaW50LCBjb25zdCBjaGFyICosIGFuZCBhCiAgICAgICAgICAgIGZldyBjb21tb24gZXhjZXB0aW9uIHR5cGVzLiAgIFRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQuCgogICAgICAgICAgICBBdXRvbWF0aWMgZXhjZXB0aW9uIGhhbmRsaW5nIGNhbiBiZSBkaXNhYmxlZCB1c2luZyAtbm9leGNlcHQgb3IKICAgICAgICAgICAgc2V0dGluZyB0aGUgTm9FeGNlcHQgZ2xvYmFsIHZhcmlhYmxlIHRvIDEuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgWyBQeXRob24gXQogICAgICAgICAgICBBdXRvbWF0aWMgdHJhbnNsYXRpb24gb2YgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBpbnRvIGVycm9yIGhhbmRsaW5nIGNvZGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coRm9vKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgRm9vIGlzIHdyYXBwZWQgYXMgYSBjbGFzc2ljLXN0eWxlIGNsYXNzIChjb21wYXRpYmxlCiAgICAgICAgICAgIHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nKS4gIEZ1cnRoZXJtb3JlLCB5b3UgY2FuIHdyaXRlIFB5dGhvbiBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBiID0gQmFyKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBGb28sZTogICAgICMgTm90ZSB1c2Ugb2YgZXhjZXB0aW9uIGNsYXNzIGhlcmUhCiAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgRm9vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICBUaGUgb2JqZWN0ICJlIiBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaXMganVzdCBhIHdyYXBwZWQgRm9vCiAgICAgICAgICAgIG9iamVjdC4gIEFjY2VzcyBpdCBsaWtlIGEgbm9ybWFsIG9iamVjdC4KCiAgICAgICAgICAgIElmIGFuIGV4Y2VwdGlvbiBpcyBub3Qgd3JhcHBlZCBhcyBhIGNsYXNzLCBhIFJ1bnRpbWVFcnJvcgogICAgICAgICAgICBleGNlcHRpb24gaXMgcmFpc2VkLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMgZXhjZXB0aW9uIGlzCiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gb2JqZWN0LiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coaW50KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBiID0gQmFyKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcixlOgogICAgICAgICAgICAgICAgICAgcHJpbnQgZS5hcmdzWzBdICAgICAgICMgSW50ZWdlciBleGNlcHRpb24gdmFsdWUKCiAgICAgICAgICAgIENvbW1lbnRzOgoKICAgICAgICAgICAgICAgIC0gIElmIGEgY2xhc3MgaXMgdXNlZCBhcyBhbiBleGNlcHRpb24sIGl0ICptdXN0KiBiZSB3cmFwcGVkCiAgICAgICAgICAgICAgICAgICBhcyBhIFB5dGhvbiBjbGFzc2ljLXN0eWxlIGNsYXNzIChuZXcgY2xhc3NlcyBkb24ndCB3b3JrKS4KCiAgICAgICAgICAgICAgICAtICBBdXRvbWF0aWMgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGNvbXBhdGlibGUgd2l0aCAlZXhjZXB0aW9uLgoKICAgICAgICAgICAgICAgIC0gIFVzZSAtbm9leGNlcHQgdG8gdHVybiBvZmYgdGhpcyBmZWF0dXJlLgoKICAgICAgICAgICAgICAgIC0gIFRoZSBuZXdseSBpbnRyb2R1Y2VkICJ0aHJvdyIgdHlwZW1hcCBpcyB1c2VkIHRvIHJhaXNlCiAgICAgICAgICAgICAgICAgICBQeXRob24gZXJyb3JzIChuYXR1cmFsbHkpLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA4LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW5mb3JtYXRpb24gZnJvbSB0aHJvdygpIHNwZWNpZmllcnMgaXMgbm93IHN0b3JlZCBpbiB0aGUgcGFyc2UKICAgICAgICAgICAgdHJlZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgdGhyb3coc3BhbSxiYXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIHN0b3JlZCBpbmZvcm1hdGlvbiBpcyBmdWxseSBjb3JyZWN0ZWQgZm9yIG5hbWVzcGFjZXMgYW5kIHdvcmtzCiAgICAgICAgICAgIHdpdGggdGVtcGxhdGVzLiAgVXNlcyB3aWxsIGZvbGxvdy4KICAgICAgICAgICAgCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm8gbG9uZ2VyIGFwcGxpZWQgdG8gbWVtYmVyIGFjY2VzcwogICAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBpbiB0aGlzIGNvZGUKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IGNhdGNoKHdoYXRldmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vdCBhcHBsaWVkIHRvIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgICBmb3IgRm9vOjp4LiAgIFRoaXMgc2hvdWxkIHJlZHVjZSB0aGUgYW1vdW50IG9mIGV4dHJhIGNvZGUKICAgICAgICAgICAgZ2VuZXJhdGVkLgoKICAgICAgICAgICAgQ2F2ZWF0OiAgRXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgKmlzKiB1c2VkIHdoZW4gYXR0cmlidXRlcyBhcmUKICAgICAgICAgICAgYWNjZXNzZWQgdGhyb3VnaCBhIHNtYXJ0LXBvaW50ZXIgb3IgYSBzeW50aGVzaXplZCBhdHRyaWJ1dGVkCiAgICAgICAgICAgIGFkZGVkIHdpdGggJWV4dGVuZCBpcyB1c2VkLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWRlIG1vcmUgcGF0Y2hlcyB0byBob3BlZnVsbHkgZWxpbWluYXRlIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIFNXSUcgCiAgICAgICAgICAgIGFzIGEgNjQtYml0IGV4ZWN1dGFibGUuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggY29uc3QgcmVmZXJlbmNlIG1lbWJlcnMsIHZhcmlhYmxlcywgYW5kIHN0YXRpYyBtZW1iZXJzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50ICZyZWY7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cnlpbmcgdG8gZ2VuZXJhdGUgInNldCIgZnVuY3Rpb25zIHdoaWNoIHdvdWxkbid0IGNvbXBpbGUuIAoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2UgZm9yICJDbGFzcyBYIG1pZ2h0IGFic3RyYWN0IiBvZmYgYnkgZGVmYXVsdC4KICAgICAgICAgICAgRW5hYmxlIHdpdGggLVdhbGwuCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgaGFuZGxpbmcgb2YgY29uc3QgYW5kIG5vbi1jb25zdCBvdmVybG9hZGVkIG1ldGhvZHMuICBJZgogICAgICAgICAgICBhIGNsYXNzIGRlZmluZXMgYSBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpOwogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KSBjb25zdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZW4gdGhlIG5vbi1jb25zdCBtZXRob2QgaXMgKmFsd2F5cyogc2VsZWN0ZWQgaW4gb3ZlcmxvYWRpbmcgYW5kCiAgICAgICAgICAgIHRoZSBjb25zdCBtZXRob2Qgc2lsZW50bHkgZGlzY2FyZGVkLiAgSWYgcnVubmluZyB3aXRoIC1XYWxsLCBhIHdhcm5pbmcKICAgICAgICAgICAgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCjA4LzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQmV0dGVyIHN1cHBvcnQgZm9yIHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgaW5oZXJpdGFuY2UuICAgQ29uc2lkZXIgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoaW50IHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJsYWgoZG91YmxlIHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29CYXIgOiBwdWJsaWMgRm9vLCBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJsYWgoY2hhciAqeCk7CiAgICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286OmJsYWg7CiAgICAgICAgICAgICAgICAgICAgICB1c2luZyBCYXI6OmJsYWg7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93IFNXSUcgd3JhcHMgRm9vQmFyOjpibGFoIGFzIGFuIG92ZXJsb2FkZWQgbWV0aG9kIHRoYXQgdXNlcyBhbGwKICAgICAgICAgICAgYWNjZXNzaWJsZSB2ZXJzaW9ucyBvZiBibGFoKCkuICBTZWUgc2VjdGlvbiAxNS4yLjIgaW4gU3Ryb3VzdHJ1cCwgM3JkIEVkLgoKICAgICAgICAgICAgU1dJRyBhbHNvIHN1cHBvcnRzIGFjY2VzcyBjaGFuZ2UgdGhyb3VnaCB1c2luZyBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoaW50IHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjp4OwogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286OmJsYWg7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIENhdmVhdDogICBTV0lHIGRvZXMgbm90IGFjdHVhbGx5IGNoZWNrIHRvIHNlZSBpZiBkZWNsYXJhdGlvbnMgaW1wb3J0ZWQKICAgICAgICAgICAgdmlhICd1c2luZycgYXJlIGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuICBJZiB0aGlzIG9jY3VycywgdGhlCiAgICAgICAgICAgIHdyYXBwZXIgY29kZSB3b24ndCBjb21waWxlIGFueXdheXMtLS1ub3Qgc3VyZSBpdCdzIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgogICAgICAgICAgCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgb3ZlcmxvYWRpbmcgZGlzcGF0Y2ggdG8gbm90IGluY2x1ZGUgbm9kZXMgd2l0aCBhbiAiZXJyb3IiIGF0dHJpYnV0ZS4KICAgICAgICAgICAgQSBsYW5ndWFnZSBtb2R1bGUgY2FuIHNldCB0aGlzIGlmIGEgbm9kZSBjb3VsZG4ndCBiZSB3cmFwcGVkIGFuZCB5b3UgZG9uJ3Qgd2FudAogICAgICAgICAgICBpdCBpbmNsdWRlZCBpbiB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24uCgowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50IHRvIG92ZXJsb2FkZWQgZnVuY3Rpb24gZGlzcGF0Y2guICAgVGhlIGRpc3BhdGNoZXIgaXMgbm93IGF3YXJlIG9mCiAgICAgICAgICAgIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEZvbyAqZik7CiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRpc3BhdGNoZXIgcmUtb3JkZXJzIHRoZSBmdW5jdGlvbnMgc28gdGhhdCBzcGFtKEJhciAqYikgaXMKICAgICAgICAgICAgY2hlY2tlZCBmaXJzdC0tLWl0IGlzIG1vcmUgc3BlY2lmaWMgdGhhbiBzcGFtKEZvbyAqZikuCgowOC8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1XZXJyb3IgY29tbWFuZCBsaW5lIG9wdGlvbi4gICBJZiBzdXBwbGllZCwgd2FybmluZyBtZXNzYWdlcyBhcmUgdHJlYXRlZAogICAgICAgICAgICBhcyBlcnJvcnMgYW5kIFNXSUcgd2lsbCByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUuCgowOC8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk2MTM1IF0gVHlwZWRlZiBvZiByZWZlcmVuY2UgY2FuJ3QgY29tcGlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAmSW50UmVmOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKEludFJlZiBpKTsKCiAgICAgICAgICAgIFNXSUctMS4zLjE0IGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZS4KClZlcnNpb24gMS4zLjE0IChBdWd1c3QgMTIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBTdGF0aWMgY29uc3QgbWVtYmVycyBpbml0aWFsaXplZCBkdXJpbmcgZGVjbGFyYXRpb24sIGFuZAoJICAgIG9ubHkgdGhlbSwgaWU6CgoJICAgIHN0cnVjdCBBCgkgICAgewkJIAoJCXN0YXRpYyBjb25zdCBpbnQgYSA9IDEgOyAgLy8gdGhpcyBvbmUKCQlzdGF0aWMgY29uc3QgaW50IGI7ICAgICAgIC8vIG5vdCB0aGlzIG9uZQogICAgICAgICAgICB9OyAgICAgCgoJICAgIGFyZSBlbWl0dGVkIGxpa2UgY29uc3RhbnRzIChlcXVpdmFsZW50IHRvIGVudW1zIG9yCgkgICAgZXhwbGljaXQgJWNvbnN0YW50KS4KCSAgICAKCSAgICBUaGlzIGlzIGJlY2F1c2UgdGhleSBjYW5ub3QgYmUgYWRkZWQgZGlyZWN0bHkgdG8gJ2N2YXInCgkgICAgc2luY2UgdGhleSBsYWNrIHRoZSBuZWVkZWQgcmVmZXJlbmNlICh3ZWxsLCB5b3UgY2FuIGZvcmNlCgkgICAgdGhlbSB0byBoYXZlIGEgcmVhbCByZWZlcmVuY2UsIGJ1dCBpbiBhbiB1Z2x5IHdheSB3aGljaAoJICAgIGdvZXMgY29tcGxldGVseSBhZ2FpbiB0aGUgb3JpZ2luYWwgcHVycG9zZSBvZiBpbml0aWFsaXplCgkgICAgdGhlbSBkdXJpbmcgZGVjbGFyYXRpb24sIHlvdSBhbHNvIGhhdmUgdG8gZGVhbCB3aXRoIGV4dHJhCgkgICAgbGlua2luZyBtYXR0ZXJzLCBhbmQgaXQgdGFrZSBhIHdoaWxlIHRvIGZpZ3VyZSBvdXQgd2hhdCBpcwoJICAgIHRoZSBwcm9ibGVtIGFuZCBob3cgdG8gc29sdmUgaXQpLgoJICAgIAoJICAgIFBsZWFzZSB0ZXN0IGl0IHdpdGggeW91ciBwcmVmZXJyZWQgdGFyZ2V0IGxhbmd1YWdlLCBhbmQKCSAgICBub3Qgb25seSB0aGUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmVhbGx5IHJ1biB0aGUgZXhhbXBsZQoJICAgIGluIHRoZSB0ZXN0LXN1aXRlIChzdGF0aWMtY29uc3QtbWVtYmVyLTIuaSkgYmVjYXVzZSB0aGUKCSAgICBwcm9ibGVtIGFuZCB0aGUgc29sdXRpb24gY2Fubm90IGJlICJmdWxseSIgYXBwcmVjaWF0ZWQKCSAgICB1bnRpbCB5b3UgdHJ5IHRvIGxvYWQgdGhlIG1vZHVsZSBhbmQgcnVuIGl0LgoKCSAgICBJbiBzb21lIHRhcmdldCBsYW5ndWFnZXMgKHB5dGhvbiBzcGVjaWFsbHkpLCB0aGlzIGNhbgoJICAgIHByb2R1Y2VzIGEgZGlmZmVyZW5jZSBpbiB0aGUgd2F5IHRoYXQgdGhlIHN0YXRpYyBjb25zdGFudAoJICAgIG1lbWJlcnMgJ2EnIGFuZCAnYicgYXJlIGludGVybmFsbHkgd3JhcHBlZC4gSG9wZWZ1bGx5LAoJICAgIHRoZXkgc3RpbGwgY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSBzYW1lIHdheS4KCgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBbcHl0aG9uXSBOb3cgc3RhdGljIGNvbnN0IG1lbWJlcnMgY2FuIGJlIGFjY2Vzc2VkIGluIGEgbW9yZQoJICAgIG5hdHVyYWwgd2F5LCBpZSwgaWYgeW91IGhhdmUKCgkgICAgc3RydWN0IEEKICAgICAgICAgICAgIHsJCSAKCQl0eXBlZGVmIHVuc2lnbmVkIGludCB2aWV3ZmxhZ3M7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBmb3J3YXJkX2ZpZWxkID0gMDsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGJhY2t3YXJkX2ZpZWxkOwogICAgICAgICAgICB9OyAgICAgCgkgICAgCgkgICAgbm93IHlvdSBjYW4gZG86CgoJCXByaW50IEEuYmFja3dhcmRfZmllbGQKCgkgICAgYW5kIGFsc28KCgkgICAgICAgIGEgPSBBKCkKCQlwcmludCBhLmZvcndhcmRfZmllbGQKCQkKCSAgICBOb3RlIHRoYXQgaWYgdGhlIHN0YXRpYyBjb25zdCBtZW1iZXJzIGRvbid0IGhhdmUgYW4KCSAgICBpbml0aWFsaXplciAobGlrZSBiYWNrd2FyZF9maWVsZCksIHN0aWxsIHlvdSBjYW4gYWNjZXNzCgkgICAgdGhlbSBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHB5dGhvbiBzaWRlLCBidXQgdGhlCgkgICAgaW1wbGVtZW50YXRpb24gaXMgYSBxdWl0ZSBkaWZmZXJlbnQ6IGJhY2t3YXJkX2ZpZWxkIHdpbGwKCSAgICBzdGlsbCBhcHBlYXIgaW4gdGhlIGN2YXIgZW50aXR5LCBhbmQgYWxzbywgeW91IGFyZSAKCSAgICByZXNwb25zaWJsZSB0byBpbml0aWFsaXplIGl0IGluIHNvbWUgY29kZSB1bml0LCBhbmQgbGluayBpdAoJICAgIHByb3Blcmx5LiBmb3J3YXJkX2ZpZWxkLCBieSB0aGUgb3RoZXIgaGFuZCwgd2lsbCBub3QKCSAgICBhcHBlYXIgaW4gdGhlIGN2YXIgZW50aXR5IGJ1dCBvbmx5IGFzIGEgQSBtZW1iZXIsIHNpbWlsYXIKCSAgICB0byB3aGF0IGhhcHBlbiB3aXRoIGVudW0gb3IgJWNvbnN0YW50IG1lbWJlcnMuCgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBbcHl0aG9uXSBDb21tb24gY29kZSBpbiB0aGUgX19zZXRhdHRyX18vX19nZXRhdHRyX18gbm93CgkgICAgZ29lcyB0byB0d28gImZyZWUiIG1ldGhvZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJveHkKCSAgICBmaWxlLCBmcm9tIHdoZXJlIGVhY2ggY2xhc3MgdXNlIGl0LiBUaGlzIGNoYW5nZSByZWR1Y2VzCgkgICAgdGhlIHNpemUgb2YgdGhlIHByb3h5IGZpbGUsIHNwZWNpYWxseSBpZiB5b3Ugd3JhcCBhIGxvdCBvZgoJICAgIHNtYWxsIGNsYXNzZXMgaW4gb25lIG1vZHVsZSAodXAgdG8gMzMlIGluIHNvbWUgY2FzZXMpLAoJICAgIG1ha2luZyBpdCBmYXN0ZXIgdG8gbG9hZCB0b28uCgowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gSWYgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgY2hhciAqIHJldHVybnMgTlVMTCwKICAgICAgICAgICAgdW5kZWYgaXMgcmV0dXJuZWQgdG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIuCiAKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggdG8gY29udmVyc2lvbiBvcGVyYXRvcnMgYW5kIG5hbWVzcGFjZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyB9OwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBCYXIgewogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28qKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoZSB3cmFwcGVyIGNvZGUsIFNXSUcgd2FzIHVzaW5nIC0+b3BlcmF0b3IgRm9vKigpCiAgICAgICAgICAgIHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbiB1c2luZyAtPm9wZXJhdG9yIG5zOjpGb28qKCkuCgogICAgICAgICAgICBOb3RlOiBpZiB1c2luZyAlcmVuYW1lIHdpdGggYSBjb252ZXJzaW9uIG9wZXJhdG9yLCB5b3UKICAgICAgICAgICAgbWlnaHQgaGF2ZSB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJXJlbmFtZSh0b0Zvb1B0cikgbnM6Om9wZXJhdG9yIG5zOjpGb28qKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBeXl5eIG5vdGUgZXh0cmEgcXVhbGlmaWVyCiAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICAKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBNaW5vciBlbmhhbmNlbWVudCB0byAnY29uc3QnIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgIE5vcm1hbGx5IGNvbnN0IGRlY2xhcmF0aW9ucyBhcmUgd3JhcHBlZCBhcyByZWFkLW9ubHkgdmFyaWFibGVzCiAgICAgICAgICAgIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIHRoZSBjdmFyIGF0dHJpYnV0ZSAoc2VlIFNXSUcuaHRtbCBmb3IKICAgICAgICAgICAgYSBkaXNjdXNzaW9uIG9mIHdoeSkuICBIb3dldmVyLCBpbiBtYW55IHByb2dyYW1zLCAiY29uc3QiIAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbWF5IGp1c3QgYmUgY29uc3RhbnRzLS0tbWFraW5nIHRoZSBjdmFyLiBhY2Nlc3MKICAgICAgICAgICAgYXdrd2FyZC4gIFRvIGZpeCB0aGlzLCAiY29uc3QiIGRlY2xhcmF0aW9ucyBhcmUgbm93IGF2YWlsYWJsZQogICAgICAgICAgICBib3RoIHRocm91Z2ggY3Zhci4gYW5kIGFzIGEgc2ltcGxlIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY29uc3QgaW50IEZPTyA9IDQyOwoKICAgICAgICAgICAgSW4gUHl0aG9uOgoKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5jdmFyLkZPTwogICAgICAgICAgICAgICAgIDQyCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuRk9PCiAgICAgICAgICAgICAgICAgNDIKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgdmFsdWUgb2YgYSAiY29uc3QiIHZhcmlhYmxlCiAgICAgICAgICAgIG1pZ2h0IGNoYW5nZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCBCQVIgPSAiSGVsbG8gV29ybGQiOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgcG9pbnRlciBpdHNlbGYgY2FuIG5vdCBjaGFuZ2UsIGJ1dCB0aGUgCiAgICAgICAgICAgIGRhdGEgYmVpbmcgcG9pbnRlZCB0byBjb3VsZCBiZSBtb2RpZmllZC4gIEluIHRoZXNlIHNpdHVhdGlvbnMsCiAgICAgICAgICAgIGN2YXIuQkFSIHNob3VsZCBiZSBhY2Nlc3NlZCB0byBvYnRhaW5lZCB0aGUgY3VycmVudCB2YWx1ZS4KCjA4LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgZ2VuZXJhdGlvbiBvZiB0aGUgcHJveHkgY29kZSAoLnB5IGZpbGVzKSB0byBtb3JlCiAgICAgICAgICAgIGNsb3NlbHkgZm9sbG93IHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbnMgYXMgdGhleSBhcHBlYXIgaW4KICAgICAgICAgICAgdGhlIC5pIGZpbGUuICAgSW4gdGhlIHBhc3QsIGFsbCBvZiB0aGUgY2xhc3Mgd3JhcHBlcnMgYXBwZWFyZWQKICAgICAgICAgICAgZmlyc3QsIGZvbGxvd2VkIGJ5IGZ1bmN0aW9uIHN0dWJzLCBpbnNlcnRlZCBQeXRob24gY29kZSwgYW5kCiAgICAgICAgICAgIG90aGVyIGRldGFpbHMuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3h5IG1ldGhvZCBfZGVsZXRlKCkgY2hhbmdlZCB0byBkZWxldGUoKS4gVGhlcmUgc2hvdWxkbid0IGV2ZXIKICAgICAgICAgICAgYmUgYSB3cmFwcGVkIGZ1bmN0aW9uIGNhbGxlZCBkZWxldGUoKSBhcyBpdCBpcyBhIEMrKyBrZXl3b3JkIGFuZCB0aGVyZQogICAgICAgICAgICBpcyBubyBzdWNoIHRoaW5nIGFzIGEgbWVtYmVyIGZ1bmN0aW9uIGluIEMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoZSBmdW5jdGlvbiBiYWNrIGluCiAgICAgICAgICAgIGZvciBhbGwgcHJveHkgY2xhc3NlczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEphdmEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VtbWFyeQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gaW1wcm92aW5nIHRoZSBKYXZhIG1vZHVsZSAKICAgICAgICAgICAgZm9yIHZlciAxLjMuMTQuICBJZiBhdCBhbGwgcG9zc2libGUgY2hhbmdlIHlvdXIgY29kZSB0byB0YWtlIGFkdmFudGFnZXMgb2YgdGhlIAogICAgICAgICAgICBpbXByb3ZlbWVudHMuIElmIHlvdSB3ZXJlIHVzaW5nIHByb3h5IGNsYXNzZXMgeW91IG1heSBub3Qgbm90aWNlIGFueSBiYWNrd2FyZHMgCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgaXNzdWVzLiBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggd2lsbCBoZWxwIHdpdGggbW9zdCBiYWNrd2FyZHMgCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2hlcmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgY29kZSB0aGF0IHVzZXMKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBvdXRwdXQ6CgogICAgICAgICAgICBSZXBsYWNlOgogICAgICAgICAgICAgICAgJW1vZHVsZSBtb2R1bGVuYW1lCgogICAgICAgICAgICBXaXRoOgogICAgICAgICAgICAgICAgJW1vZHVsZSAoam5pY2xhc3NuYW1lPSJtb2R1bGVuYW1lIikgbW9kdWxlbmFtZTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICVwcmFnbWEoamF2YSkgam5pY2xhc3NjbGFzc21vZGlmaWVycz0icHVibGljIjsKCiAgICAgICAgICAgIFRoZSBwcm94eSBjb25zdHJ1Y3RvcnMgdGhhdCB0b29rIHBhcmFtZXRlcnMgKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKQogICAgICAgICAgICB3ZXJlIHB1YmxpYyBhbmQgYXJlIG5vdyBwcm90ZWN0ZWQuIElmIHlvdSB3ZXJlIG1ha2luZyB1c2Ugb2YgdGhlc2UgdGhlbiB5b3UnbGwgCiAgICAgICAgICAgIGhhdmUgdG8gbW9kaWZ5IHlvdXIgY29kZSBhbmQgdGhlIGJlc3Qgc29sdXRpb24gd291bGQgYmUgdG8gdXNlIHRoZSBuZXcgdHlwZSAKICAgICAgICAgICAgd3JhcHBlciBjbGFzc2VzLgoKICAgICAgICAgICAgVGhlIG90aGVyIG1haW4gYXJlYXMgYXJlIHRoZSBwcmFnbWFzIGFuZCBnbG9iYWwgdmFyaWFibGUgd3JhcHBpbmcuIFJlcGxhY2UgCiAgICAgICAgICAgIHRoZSBwcmFnbWFzIHdpdGggb25lIG9mIHRoZSBuZXcgZGlyZWN0aXZlcyBvciB0eXBlbWFwcyBtZW50aW9uZWQgYmVsb3cgYW5kIHVzZQogICAgICAgICAgICAlcmVuYW1lIG9uIHRoZSB2YXJpYWJsZXMuCgogICAgICAgICAgICBJZiB5b3Ugd2VyZSBub3QgdXNpbmcgcHJveHkgY2xhc3NlcywgeW91IHdpbGwgaGF2ZSB0byBkZWZpbmUgYSBqc3R5cGUgdHlwZW1hcAogICAgICAgICAgICBhcyB3ZWxsIGFzIGEganR5cGUgdHlwZW1hcC4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB3cmFwcGluZyB0d28gZGltZW5zaW9uIGFycmF5IHZhcmlhYmxlcy4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbixUY2xdCiAgICAgICAgICAgIE9iamVjdCBtYW5hZ2VtZW50IG5vdyBoYXMgYSBtdWNoIGJldHRlciBzZW5zZSBvZiBvd25lcnNoaXAuCiAgICAgICAgICAgIE93bmVyc2hpcCBiaXRzIGlzIGNoYW5nZWQgd2hlbmV2ZXIgYW4gb2JqZWN0IGlzIHN0b3JlZCBpbiBhCiAgICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSBvciBzdHJ1Y3R1cmUgbWVtYmVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHZhbDsKICAgICAgICAgICAgICAgICAgICBGb28gKm5leHQ7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93IGluIFB5dGhvbgoKICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duCiAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgPj4+IGcgPSBGb28oKQogICAgICAgICAgICAgICA+Pj4gZy5uZXh0ID0gZiAgICAgICAgICAjIEFzc2lnbiBhIHBvaW50ZXIKICAgICAgICAgICAgICAgPj4+IGYudGhpc293biAgICAgICAgICAgIyBOb3RpY2Ugb3duZXJzaGlwIGNoYW5nZQogICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgVGhpcyBzY2hlbWUgaXMgbW9zdGx5IGEgY29uc2VydmF0aXZlIGhldXJpc3RpYyBkZXNpZ25lZCB0byAKICAgICAgICAgICAgcHJvdmlkZSBzZWdtZW50YXRpb24gZmF1bHRzLiAgSXQgY291bGQgY2F1c2UgYSBtZW1vcnkgbGVhawogICAgICAgICAgICBpZiBvd25lcnNoaXAgaXMgY2hhbmdlZCB1bm5lY2Vzc2FyaWx5LiAgSW4gdGhpcyBjYXNlLCB5b3UgY2FuCiAgICAgICAgICAgIGVpdGhlciB3cml0ZSBhIHR5cGVtYXAgKHRoYXQgZG9lc24ndCBjaGFuZ2Ugb3duZXJzaGlwKSwgb3IKICAgICAgICAgICAgbWFudWFsbHkgc2V0IHRoZSB0aGlzb3duIGF0dHJpYnV0ZSBiYWNrIHRvIDEuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIE1ham9yIHVzYWJpbGl0eSBpbXByb3ZlbWVudHMgdG8gdGhlIG9iamVjdCBpbnRlcmZhY2UuCiAgICAgICAgICAgIFN1cHBvc2UgeW91IGhhZCBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IAogICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICB2b2lkICBibGFoKEZvbyAqZik7CgogICAgICAgICAgICBJbiBwYXN0IHZlcnNpb25zIG9mIFNXSUcsIHlvdSBjb3VsZCBjcmVhdGUgb2JqZWN0cyBhbmQgdXNlCiAgICAgICAgICAgIHRoZW0gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICUgRm9vIGYKICAgICAgICAgICAgICAgICUgZiBjb25maWd1cmUgLXggMwogICAgICAgICAgICAgICAgJSBmIHNwYW0KICAgICAgICAgICAgICAgIDM3CiAgICAKICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSBpcyB0aGF0IGlmIHlvdSB0cmllZCB0byBjYWxsIGJsYWgoKSwgaXQgZGlkbid0CiAgICAgICAgICAgIHdvcms6CgogICAgICAgICAgICAgICAgJSBibGFoIGYKICAgICAgICAgICAgICAgIFR5cGUgRXJyb3IuIEV4cGVjdGVkIF9wX0ZvbwogICAgICAgICAgICAgICAgJQoKICAgICAgICAgICAgSW5zdGVhZCwgeW91IGhhZCB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICUgYmxhaCBbZiBjZ2V0IC10aGlzXQogIAogICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGV4dHJhY3RzIHRoZSAtdGhpcyBwb2ludGVyLCBhdm9pZGluZyB0aGlzCiAgICAgICAgICAgIHByb2JsZW0uICBUaGlzIG1lYW5zIHRoYXQgc2F5aW5nICJibGFoIGYiIGlzIHBlcmZlY3RseSBsZWdhbCBhbmQKICAgICAgICAgICAgZXZlcnl0aGluZyB3aWxsIHN0aWxsIHdvcmsgbm9ybWFsbHkuCgogICAgICAgICAgICBDYXZlYXQ6IFNpbmNlIHBvaW50ZXIgc3RyaW5ncyBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlIChfKSwKICAgICAgICAgICAgZG9uJ3QgdXNlIHRoaXMgaW4gb2JqZWN0IG5hbWVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJSBGb28gX2YgCiAgICAgICAgICAgICAgICAlIGJsYWggX2YgICAgICAgICMgUG90ZW50aWFsIGNyYXNoCgogICAgICAgICAgICBPYmplY3RzIG5vdyBoYXZlIGEgLXRoaXNvd24gYXR0cmlidXRlIHRoYXQgc2hvd3MgdGhlIG93bmVyc2hpcC4KICAgICAgICAgICAgVGhpcyBidWlsZHMgdXBvbiB0aGUgQ0hBTkdFUyAxMS8yNC8yMDAxIGVudHJ5LgoKMDgvMDcvMjAwMjogc2FtamFtLCBTYW0gTGlkZGljb3R0CiAgICAgICAgICAgIFByb3Blcmx5IGltcGxlbWVudGVkIHBvaW50ZXIgc3lzdGVtIHVzaW5nIHBocCByZXNvdXJjZXMuCiAgICAgICAgICAgIFN0aWxsIG5lZWQgdG8gd29yayBvdXQgd2hldGhlciBvciBub3QgdG8gbGV0IHNjcmlwdC11c2VycyBjYWxsCiAgICAgICAgICAgIGRlc3RydWN0b3JzIGRpcmVjdGx5CgowOC8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVwZ3JhZGVkIG16c2NoZW1lIG1vZHVsZSB0byBzdXBwb3J0IHZlcnNpb24gMjAxIGFuZCBhZGRlZAogICAgICAgICAgICBvdmVybG9hZGluZyBzdXBwb3J0LgoKMDgvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGV4dHJhIGdyb3VwaW5nIChpbiB2ZXJ5IGxpbWl0ZWQgY2FzZXMpLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKEZ1bmNQdHIpKGludCwgZG91YmxlKTsKCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgKioqCiAgICAgICAgICAgIAowOC8wMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlcyB0byB0eXBlbWFwcy5pIGFzIHRob3NlIGRvbmUgcHJldmlvdXNseSBmb3IgUGVybCwKICAgICAgICAgICAgUHl0aG9uIGFuZCBUY2wgbW9kdWxlcy4gTm93IHN1cHBvcnRzIHJlZmVyZW5jZSB0eXBlcyB3aXRoIElOUFVULAogICAgICAgICAgICBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzLgoKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGNzdHJpbmcuaSBhZGRlZC4gIFByb3ZpZGVzIG1hY3JvcyBmb3IKICAgICAgICAgICAgbWFuaXB1bGF0aW5nIGNoYXIgKiBkYXRhLgogCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICBVc2UgJW5ld29iamVjdCBpbnN0ZWFkLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlbmV3b2JqZWN0IGZvbzsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIGNoYXIgKmZvbygpOwoKICAgICAgICAgICAgJW5ld29iamVjdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLAogICAgICAgICAgICBldGMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IGF0dHJpYnV0ZSAnam5pY2xhc3NuYW1lJyBmb3IgdGhlIG1vZHVsZSBkaXJlY3RpdmUgYWxsb3dzIGEgd2F5IG9mCiAgICAgICAgICAgIGNoYW5naW5nIHRoZSBKTkkgY2xhc3MgbmFtZSBmcm9tIHRoZSBkZWZhdWx0IHdoaWNoIHVzZXMgdGhlIG1vZHVsZW5hbWUgd2l0aCBKTkkKICAgICAgICAgICAgYXBwZW5kZWQgYWZ0ZXIgaXQuCgogICAgICAgICAgICAgICAgJW1vZHVsZSAoam5pY2xhc3NuYW1lPSJuYW1lIikgbW9kdWxlbmFtZQoKICAgICAgICAgICAgSWYgJ25hbWUnIGlzIHRoZSBzYW1lIGFzICdtb2R1bGVuYW1lJyB0aGVuIHRoZSBtb2R1bGUgY2xhc3MgbmFtZSBnZXRzIGNoYW5nZWQKICAgICAgICAgICAgZnJvbSAnbW9kdWxlbmFtZScgdG8gbW9kdWxlbmFtZU1vZHVsZS4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGZpbGUgaW5jbHVkZSBvcmRlci4gIExhbmd1YWdlIHNwZWNpZmljCiAgICAgICAgICAgIGRpcmVjdG9yaWVzIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBnZW5lcmljIGRpcmVjdG9yaWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZTogICJzd2lnX2xpYi9weXRob24vZm9vLmkiIHNob3VsZCBiZSBsb2FkZWQgYmVmb3JlCiAgICAgICAgICAgICJzd2lnX2xpYi9mb28uaSIuICAgIEkgdGhvdWdodCB0aGlzIHdhcyB0aGUgY2FzZSBhbHJlYWR5LCBidXQKICAgICAgICAgICAgYXBwYXJlbnRseSBpdCBoYXMgYmVlbiBicm9rZW4gZm9yIHF1aXRlIHNvbWUgdGltZS4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3RkX2RlcXVlLmkgbGlicmFyeSBmaWxlLiAgV29yayBpbiBwcm9ncmVzcy4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbixUY2wsUGVybF0KICAgICAgICAgICAgSW1wcm92ZW1lbnRzIHRvIHR5cGVtYXBzLmkuICBJTlBVVC9JTk9VVCB0eXBlbWFwcyBwZXJmb3JtIGJldHRlcgogICAgICAgICAgICBlcnJvciBjaGVja2luZy4gIFR5cGVtYXBzIGFyZSBub3cgc3VwcGxpZWQgZm9yIHJlZmVyZW5jZXMgbGlrZSAKICAgICAgICAgICAgaW50ICZPVVRQVVQsIGRvdWJsZSAmSU5PVVQsIGV0Yy4KICAgICAgICAgIAowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIERlcHJlY2F0ZWQgdGhlIFRfKiBhbmQgTF8qIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCiAgICAgICAgICAgIE11bHRpcGxlIHJldHVybiB2YWx1ZXMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gYSB0dXBsZS4gRGVwcmVjYXRlZAogICAgICAgICAgICB0aGUgQk9USCB0eXBlbWFwcy4gIFRoaXMgaXMgbm93IElOT1VUIChlLmcuLCBpbnQgKklOT1VUKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBhcnJheS5pLCBjYXJyYXkuaSwgYW5kIHRpbWVyLmkgbGlicmFyeSBmaWxlcy4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgcG9pbnRlci5pIGxpYnJhcnkgZmlsZS4gIFVzZSBjcG9pbnRlci5pIGluc3RlYWQuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGb3IgY29uc2lzdGVuY3kgdGhlIGdsb2JhbCB2YXJpYWJsZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHVzZSB0aGUgSmF2YUJlYW4gCiAgICAgICAgICAgIHByb3BlcnR5IGRlc2lnbiBwYXR0ZXJuIGxpa2UgbWVtYmVyIHZhcmlhYmxlcyBhbHdheXMgaGF2ZS4gVGhpcyBtZWFucyBpZiB5b3UgYXJlIAogICAgICAgICAgICB3cmFwcGluZyBhIHZhcmlhYmxlIGNhbGxlZCBmb28sIHRoZSBnZXR0ZXIgaXMgY2FsbGVkIGdldEZvbygpIGFuZCB0aGUgc2V0dGVyIGlzIAogICAgICAgICAgICBjYWxsZWQgc2V0Rm9vKCkuIEJlZm9yZSB0aGUgcmVjZW50IGNoYW5nZXMgdG8gdGhlIEphdmEgbW9kdWxlIHRoZSBnZXR0ZXJzIGFuZCAKICAgICAgICAgICAgc2V0dGVycyB3ZXJlIGNhbGxlZCBnZXRfZm9vKCkgYW5kIHNldF9mb28oKS4gSWYgeW91IHJlYWxseSB3YW50IHRoZSBvcmlnaW5hbCAKICAgICAgICAgICAgZnVuY3Rpb24gbmFtZXMgdXNlIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBsaWtlIHRoaXM6ICVyZW5hbWUoX2ZvbykgRm9vOwoKMDcvMzEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjYXN0aW5nIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gIElmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3MgYmFyIDogcHVibGljIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3MgYmF6IDogcHVibGljIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3Mgc3BhbSA6IHB1YmxpYyBiYXIsIHB1YmxpYyBiYXoge307CgogICAgICAgICAgICB0aGVuIHRoZSB3cmFwcGVycyB3b3VsZG4ndCBjb21waWxlIGR1ZSB0byBhbiBhbWJpZ3VvdXMgY2FzdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRHVlIHRvIG5ldyBzdGF0aWMgdHlwZWNoZWNraW5nIGFsbCBwb2ludGVycyBoZWxkIGluIGEgSmF2YSBsb25nIGFyZSBwYXJ0IG9mIAogICAgICAgICAgICB0aGUgaW50ZXJuYWwgd29ya2luZ3MgYW5kIHRoaXMgcG9pbnRlciB2YWx1ZSBpbiB0aGUgSmF2YSBsb25nIGhhcyBiZWNvbWUgYWJzdHJhY3RlZAogICAgICAgICAgICBkYXRhLiBUaGUgdHlwZSB3cmFwcGVyIGNvbnN0cnVjdG9yIGFuZCBnZXRDUHRyKCkgbWV0aG9kcyBhcmUgYXMgc3VjaCBwcm90ZWN0ZWQuCiAgICAgICAgICAgIElmIHlvdSBuZWVkIHRvIG1lc3MgYXJvdW5kIHdpdGggcG9pbnRlcnMgZnJvbSBKYXZhIG9yIGZvciBleGFtcGxlIGNyZWF0ZSBhIHByb3h5IAogICAgICAgICAgICBjbGFzcyBvciB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIGEgbnVsbCBwb2ludGVyLCBhZGQgYSBmdW5jdGlvbi9jb25zdHJ1Y3RvciAKICAgICAgICAgICAgdG8gZG8gc28gd2l0aCB0aGUgJWphdmFjb2RlIHR5cGVtYXAuIFlvdSBjYW4gYWxzbyBtYWtlIGdldENQdHIoKSBwdWJsaWMgYWdhaW4gd2l0aAogICAgICAgICAgICB0aGUgJWphdmFnZXRjcHRyIHR5cGVtYXAuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVzIGZvciAldHlwZW1hcChpZ25vcmUpLiBJbiBwYXJ0aWN1bGFyIHdoZW4gaWdub3JpbmcgdGhlIGxhc3QgcGFyYW1ldGVyCiAgICAgICAgICAgIGluIGEgZnVuY3Rpb24uIEFsc28gZm9yIGFsbCBwYXJhbWV0ZXJzIGluIGNvbnN0cnVjdG9ycy4gVGhlc2UgbW9kcyBoYXZlIGFsc28gZml4ZWQKICAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMgZm9yIHByb3h5IGNsYXNzZXMgLSBTRiA1ODE3OTEuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVuZXdvYmplY3QgKHJlcGxhY2VtZW50IGZvciAlbmV3KSBub3cgaW1wbGVtZW50ZWQgZm9yIEphdmEuIAoKMDcvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZW1hcCBjb3BpZXMsICVhcHBseSwgYW5kICVjbGVhciBpbnNpZGUKICAgICAgICAgICAgQysrIG5hbWVzcGFjZXMuCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBKTkkgY2xhc3Mgbm93IGhhcyBwYWNrYWdlIGFjY2VzcyBhcyB0aGUgY2xhc3MgbW9kaWZpZXIKICAgICAgICAgICAgaGFzIGJlZW4gY2hhbmdlZCBmcm9tICJwdWJsaWMiIHRvIG5vdGhpbmcuIFRoaXMgaGFzIGJlZW4gZG9uZQogICAgICAgICAgICBhcyB0aGlzIGNsYXNzIGlzIG5vdyBtb3JlIGZvciB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgU1dJRyBzaW5jZSB0aGUgbW9kdWxlCiAgICAgICAgICAgIGNsYXNzIGhhcyBzdGF0aWMgdHlwZSBjaGVja2luZyBmb3IgYWxsIHR5cGVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSAlam5pY2xhc3NjbGFzc21vZGlmaWVyIAogICAgICAgICAgICBwcmFnbWEgdG8gY2hhbmdlIGl0IGJhY2sgdG8gInB1YmxpYyIuCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3h5L1NoYWRvdyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gVGhlIC1wcm94eSBhbmQgCiAgICAgICAgICAgIC1zaGFkb3cgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgCiAgICAgICAgICAgIGxvdy1sZXZlbCBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGVuIHVzZSB0aGUgbmV3IC1ub3Byb3h5IGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUmVtYWluaW5nIHByYWdtYXMgc2hha2V1cC4gVGhlc2Ugd2VyZSB0aGUgcmVtYWluaW5nIHByYWdtYXMgYW5kIHRoZWlyCiAgICAgICAgICAgIG5ldyBuYW1lcyB3aGVyZSBjaGFuZ2VkOgoKICAgICAgICAgICAgbW9kdWxlYmFzZQogICAgICAgICAgICBtb2R1bGVjb2RlCiAgICAgICAgICAgIG1vZHVsZWNsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIG1vZHVsZWltcG9ydCA9PiBtb2R1bGVpbXBvcnRzCiAgICAgICAgICAgIG1vZHVsZWludGVyZmFjZSA9PiBtb2R1bGVpbnRlcmZhY2VzCgogICAgICAgICAgICBUaGUgbW9kdWxlaW1wb3J0cyB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnRseSB0byBob3cgdGhlIG1vZHVsZWltcG9ydCBwcmFnbWEgd29ya2VkLiAKICAgICAgICAgICAgTm93IGl0IGFjdHVhbGx5IHRha2VzIGNvZGUgd2hpY2ggZ2V0cyBwbGFjZWQgYmVmb3JlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHNvIHRoZSAKICAgICAgICAgICAgd2hvbGUgaW1wb3J0IHN0YXRlbWVudCBoYXMgdG8gYmUgZ2l2ZW4sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBtb2R1bGVpbXBvcnRzPSV7CiAgICAgICAgICAgIGltcG9ydCBqYXZhLmlvLio7CiAgICAgICAgICAgIGltcG9ydCBqYXZhLm1hdGguKjsKICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbnRlcmZhY2VzIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb2xkIG1vZHVsZWludGVyZmFjZSBpbiB0aGF0IGlmIAogICAgICAgICAgICBtb3JlIHRoYW4gb25lIGludGVyZmFjZSBpcyByZXF1aXJlZCB0aGV5IG11c3QgYmUgY29tbWEgc2VwYXJhdGVkIGluIG9uZSB1c2Ugb2YgCiAgICAgICAgICAgIHRoZSBwcmFnbWEsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBtb2R1bGVpbnRlcmZhY2VzPSJTZXJpYWxpemFibGUsIE15SW50ZXJmYWNlIgoKICAgICAgICAgICAgVGhlc2UgbGFzdCB0d28gcHJhZ21hcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBqYXZhaW50ZXJmYWNlcyBhbmQgamF2YWltcG9ydHMgCiAgICAgICAgICAgIHR5cGVtYXAuCgogICAgICAgICAgICBBIHNpbWlsYXIgc2V0IG9mIHByYWdtYXMgaGFzIGJlZW4gaW50cm9kdWNlZCwgbmFtZWx5OgoKICAgICAgICAgICAgam5pY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0CiAgICAgICAgICAgIGpuaWNsYXNzaW50ZXJmYWNlCgogICAgICAgICAgICBUaGVzZSB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyB0aGVpciBtb2R1bGUgY291bnRlcnBhcnRzLiBOb3RlIHRoYXQgcHJldmlvdXNseQogICAgICAgICAgICB0aGUgbW9kdWxlWFhYIHByYWdtYXMgd29ya2VkIG9uIHRoZSBvbGQgbW9kdWxlIGNsYXNzIHdoaWNoIGlzIG5vdyBjYWxsZWQgdGhlCiAgICAgICAgICAgIEpOSSBjbGFzcyAodGhlIGNsYXNzIHdpdGggdGhlIG5hdGl2ZSBmdW5jdGlvbnMpLiBUaGUgam5pY2xhc3NYWFggcHJhZ21hcyBub3cgCiAgICAgICAgICAgIHdvcmsgb24gdGhlIG5ldyBtb2R1bGUgY2xhc3MgKHRoZSBjbGFzcyB0aGF0IGhhcyBhbGwgdGhlIGdsb2JhbCBmdW5jdGlvbnMgYW5kCiAgICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdoZW4gdXNpbmcgcHJveHkgY2xhc3NlcywgcGx1cyBhbGwgb3RoZXIKICAgICAgICAgICAgcmVtYWluaW5nIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIHRoZSBsb3ctbGV2ZWwgcHJvY2VkdXJhbCBpbnRlcmZhY2UpLgoKICAgICAgICAgICAgSW4gc3VtbWFyeSB0aGUgY29udGVudHMgb2YgdGhlIHByYWdtYXMgbWFrZSB1cCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgIDxqbmljbGFzc2ltcG9ydHM+CiAgICAgICAgICAgIDxqbmljbGFzc21vZGlmaWVycz4gY2xhc3MgbW9kdWxlbmFtZSBleHRlbmRzIDxqbmljbGFzc2Jhc2U+IGltcGxlbWVudHMgPGpuaWNsYXNzaW50ZXJmYWNlcz4gewogICAgICAgICAgICAgICAgPGpuaWNsYXNzY29kZT4KICAgICAgICAgICAgICAgIC4uLiBTV0lHIGdlbmVyYXRlZCBmdW5jdGlvbnMgLi4uCiAgICAgICAgICAgIH0KfQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERlcHJlY2F0ZWQgbW9kdWxlbWV0aG9kbW9kaWZpZXJzIHByYWdtYSBhbmQgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgYSBiZXR0ZXIgJWZlYXR1cmUgYmFzZWQgZGlyZWN0aXZlIGNhbGxlZCAlamF2YW1ldGhvZG1vZGlmaWVycy4KICAgICAgICAgICAgQSB1c2VmdWwgZXhhbXBsZSB3b3VsZCBiZSBmb3Igc3luY2hyb25pc2F0aW9uIGluIG11bHRpLXRocmVhZGVkIGFwcHM6CgogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyBmb28oaW50IGEpICJwdWJsaWMgc3luY2hyb25pemVkIjsKCiAgICAgICAgICAgIENoYW5nZXMgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBkZWZhdWx0ICgicHVibGljIikgdG8gInB1YmxpYyBzeW5jaHJvbml6ZWQiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBTZXZlcmFsIGRpcmVjdGl2ZXMgbm93IGFsbG93IG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KICAgICAgICAgICAgVGhlc2UgaW5jbHVkZToKCiAgICAgICAgICAgICAgICAlbW9kdWxlKG5hbWU9InZhbHVlIiwgbmFtZT0idmFsdWUiLCAuLi4pIG1vZHVsZW5hbWUKICAgICAgICAgICAgICAgICVpbXBvcnQobmFtZT0idmFsdWUiLCAuLi4pICJmaWxlbmFtZS5pIgogICAgICAgICAgICAgICAgJWV4dGVuZChuYW1lPSJ2YWx1ZSIsIC4uLikgY2xhc3NuYW1lIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlc2UgY3VycmVudGx5IGhhdmUgbm8gZWZmZWN0IGFuZCBhcmUgcmVzZXJ2ZWQgZm9yCiAgICAgICAgICAgIGZ1dHVyZSBleHBhbnNpb24uCiAgICAgICAgICAgICAgIAowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50cyB0byBzbWFydC1wb2ludGVyIGhhbmRsaW5nLiAgU1dJRyBvbmx5IHByb3ZpZGVzCiAgICAgICAgICAgIGV4dHJhIHN1cHBvcnQgZm9yIGEgc21hcnQtcG9pbnRlciBpZiBvcGVyYXRvci0+KCkgcmV0dXJucwogICAgICAgICAgICBhIHByb3BlciBwb2ludGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwoKICAgICAgICAgICAgSWYgb3BlcmF0b3ItPigpIHJldHVybnMgYW4gb2JqZWN0IGJ5IHZhbHVlIG9yIHJlZmVyZW5jZSwKICAgICAgICAgICAgdGhlbiBTV0lHIGV4YW1pbmVzIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gc2VlIGlmIGl0IGFsc28KICAgICAgICAgICAgaW1wbGVtZW50cyBvcGVyYXRvci0+KCkuICBJZiBzbywgU1dJRyBjaGFzZXMgb3BlcmF0b3ItPigpCiAgICAgICAgICAgIHVudGlsIGl0IGNhbiBmaW5kIG9uZSB0aGF0IHJldHVybnMgYSBwb2ludGVyLiAgVGhpcyBhbGxvd3MKICAgICAgICAgICAgY2FzZXMgbGlrZSB0aGlzIHRvIHdvcms6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBCYXIgb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICA+Pj4gcyA9IFNwYW0oKQogICAgICAgICAgICAgICAgID4+PiBzLmJsYWgoKSAgICAgICMgSW52b2tlcyBGb286OmJsYWgoKQoKICAgICAgICAgICAgVGhlIHMuYmxhaCgpIGNhbGwgYWN0dWFsbHkgaW52b2tlczoKCiAgICAgICAgICAgICAgICAgICgocy5vcGVyYXRvci0+KCkpLm9wZXJhdG9yLT4oKSktPmJsYWgoKTsKIAowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggdHlwZWRlZiBhbmQgcmVmZXJlbmNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyAmIEZvb1JlZjsKICAgICAgICAgICAgICAgICBGb29SZWYgYmxhaCgpOwoKICAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0CiAgICAgICAgICAgIGNvbXBpbGUuCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFdyYXBwaW5nIG9mIHN0YXRpYyBtZXRob2RzIGhhcyBiZWVuIGltcHJvdmVkIGluIHByb3h5IGNsYXNzZXMuICBJbiBvbGRlcgogICAgICAgICAgICB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoaXM6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkIGJhcigpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIHN0YXRpYyBtZXRob2Qgd2FzIG9ubHkgYXZhaWxhYmxlIGFzIGEgZnVuY3Rpb24gRm9vX2JhcigpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vX2JhcigpCgogICAgICAgICAgICBOb3csIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBhbHNvIGJlIGludm9rZWQgdGhyb3VnaCBhbiBpbnN0YW5jZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgICAgID4+PiBmLmJhcigpICAgICAgICAjIEludm9rZXMgc3RhdGljIG1ldGhvZAoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBQeXRob24uICBBZGRpdGlvbmFsbHksIGZvciBQeXRob24tMi4yLAogICAgICAgICAgICB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBhczoKCiAgICAgICAgICAgICAgICAgID4+PiBGb28uYmFyKCkKCiAgICAgICAgICAgIFRoZSBvbGQtc3R5bGUgZnVuY3Rpb24gaXMgc3RpbGwgc3VwcG9ydCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIElmCiAgICAgICAgICAgIHlvdSBjYXJlIGFib3V0IG1ha2luZyB5b3VyIGNvZGUgYWNyb3NzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBQeXRob24sCiAgICAgICAgICAgIGVpdGhlciB1c2UgRm9vX2JhcigpIG9yIGFjY2VzcyB0aGUgbWV0aG9kIHRocm91Z2ggYW4gaW5zdGFuY2UuCiAKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSBQeXRob24gbW9kdWxlLiAgUHJveHkgY2xhc3NlcyBub3cgdXRpbGl6ZSBuZXcgUHl0aG9uLTIuMgogICAgICAgICAgICBmZWF0dXJlcyBpbmNsdWRpbmcgcHJvcGVydGllcyBhbmQgc3RhdGljIG1ldGhvZHMuICBIb3dldmVyLCB0aGVzZSBmZWF0dXJlcwogICAgICAgICAgICBhcmUgc3VwcG9ydGVkIGluIGEgd2F5IHRoYXQgcHJvdmlkZXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgogICAgICAgICAgICBQeXRob24gdmVyc2lvbnMuICBJbiBvdGhlciB3b3JkcywgcHJveHkgY2xhc3NlcyB3b3JrIHdpdGggYWxsIHZlcnNpb25zCiAgICAgICAgICAgIG9mIFB5dGhvbiBhbmQgb25seSB1c2UgbmV3IGZlYXR1cmVzIHdoZW4gcnVubmluZyBvbiBQeXRob24tMi4yLgoKCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgJWV4dGVuZCBzbyB0aGF0IG92ZXJsb2FkZWQgbWV0aG9kcyBjYW4gYmUgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXh0ZW5kIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB4KSB7IH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKnMpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYm90aCBDKysgKmFuZCogQy4KCjA3LzI0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTW9yZSBuZXcgdHlwZW1hcHMgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICBjYW4gYmUgZnVydGhlciB0YWlsb3JlZCBieSB1c2Vycy4gVGhlc2UgYXJlIHRoZSBkZWZhdWx0IGNvZGUgZm9yIGdlbmVyYXRpbmcgdGhlIAogICAgICAgICAgICBmaW5hbGl6ZSgpIG1ldGhvZHMgKHByb3h5IGNsYXNzZXMgb25seSkgYW5kIHRoZSBnZXRDUHRyKCkgbWV0aG9kcyBmb3IgcHJveHkgCiAgICAgICAgICAgIGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWZpbmFsaXplKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICAgICAgICAgX2RlbGV0ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFnZXRjcHRyKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gJXsKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGphdmFnZXRjcHRyIHR5cGVtYXAgd2lsbCBlbmFibGUgdXNlcnMgdG8gaGFuZGxlIEphdmEgbnVsbCBieSBvdmVycmlkaW5nCiAgICAgICAgICAgIHRoaXMgdHlwZW1hcCAtIGEgcmVxdWVzdGVkIGZlYXR1cmUuCgogICAgICAgICAgICBUaGUgLW5vZmluYWxpemUgY29tbWFuZGxpbmUgb3B0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFRoZSBqYXZhZmluYWxpemUKICAgICAgICAgICAgdHlwZW1hcCBpcyBtb3JlIHBvd2VyZnVsIGFzIGl0IHdpbGwgYWxsb3cgdGhlIHJlbW92YWwgb2YgdGhlIGZpbmFsaXplIG1ldGhvZHMgCiAgICAgICAgICAgIGZvciBhbGwgb3IgYW55IG9uZSBvciBtb3JlIHBhcnRpY3VsYXIgcHJveHkgY2xhc3MuCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBnZXRDUHRyWFhYKCkgZnVuY3Rpb24gaGFzIGJlZW4gY2hhbmdlZCB0byBhIHN0YXRpYyBmdW5jdGlvbiBhbmQKICAgICAgICAgICAgaXMgbm93IG9mIHRoZSBmb3JtOgoKICAgICAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldENQdHIoWFhYIG9iaikgey4uLn0KCiAgICAgICAgICAgIFRoaXMgaXMgYSByZXF1ZXN0ZWQgY2hhbmdlIHdoaWNoIHdpbGwgYWxsb3cgSmF2YSBudWxsIHBvaW50ZXJzIHRvIGJlIHVzZWQgYXMgbnVsbAogICAgICAgICAgICBjYW4gYmUgcGFzc2VkIGluIGZvciBvYmouIEhvd2V2ZXIsIHRvIGFjaGlldmUgdGhpcyB0aGUgYXBwcm9wcmlhdGUgY29kZSBtdXN0IGJlCiAgICAgICAgICAgIHdyaXR0ZW4gdXNpbmcgdGhlIG5ldyBqYXZhZ2V0Y3B0ciB0eXBlbWFwIGRpcmVjdGl2ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhpcyBmdW5jdGlvbiBiYWNrIGluIHVzaW5nIHRoZQogICAgICAgICAgICBuZXcgamF2YWNvZGUgdHlwZW1hcDoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewoKICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMiBhbmQgU1dJRy0xLjMuMTMKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjExIGFuZCBlYXJsaWVyCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0cigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAlfQoKCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IGRpcmVjdGl2ZSB0byBjb250cm9sIGNvbnN0YW50IGNvZGUgZ2VuZXJhdGlvbiAtICVqYXZhY29uc3QuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGhhbmRsaW5nIGZvciBoYW5kbGluZyBjb25zdGFudHMgaXMgdG8gZ2V0IHRoZSB2YWx1ZSB0aHJvdWdoCiAgICAgICAgICAgIGEgSk5JIGNhbGwsIGVnCgogICAgICAgICAgICAjZGVmaW5lIFlFTExPVyA1CiAgICAgICAgICAgICNkZWZpbmUgQklHIDEyMzRMTAoKICAgICAgICAgICAgcmVzdWx0cyBpbjoKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IG1vZHVsZW5hbWUuZ2V0X1lFTExPVygpOwogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gbW9kdWxlbmFtZS5nZXRfQklHKCk7CgogICAgICAgICAgICBFYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBKYXZhIG1vZHVsZSBpbml0aWFsaXNlZCB0aGUgdmFsdWUgdXNpbmcgdGhlIEMgdmFsdWU6CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSA1OwogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gMTIzNExMOwoKICAgICAgICAgICAgVGhpcyB3b3JrcyBpbiBtb3N0IGNhc2VzLCBidXQgdGhlIHZhbHVlIGZvciBCSUcgd29uJ3QgY29tcGlsZSBhcyAxMjM0TEwgaXMgbm90CiAgICAgICAgICAgIHZhbGlkIEphdmEgY29kZSBhbmQgdGhpcyBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgd2h5IHRoZSBkZWZhdWx0IGlzIG5vdyB0byBnZXQgdGhlIAogICAgICAgICAgICB2YWx1ZXMgdGhyb3VnaCBhIEpOSSBjYWxsLiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCB0aGVzZSAnY29uc3RhbnRzJyBjYW5ub3QgYmUgdXNlZCAKICAgICAgICAgICAgaW4gc3dpdGNoIHN0YXRlbWVudHMuIFRoZSAlamF2YWNvbnN0IGRpcmVjdGl2ZSBhbGxvd3Mgb25lIHRvIHNwZWNpZnkgdGhlCiAgICAgICAgICAgIHdheSB0aGUgY29uc3RhbnQgdmFsdWUgaXMgaW5pdGlhbGlzZWQgYW5kIHdvcmtzIGxpa2Ugb3RoZXIgJWZlYXR1cmUKICAgICAgICAgICAgZGlyZWN0aXZlcywgZWcKCiAgICAgICAgICAgICVqYXZhY29uc3QoMCk7ICAgICAvLyBhbGwgY29uc3RhbnRzIGZyb20gdGhpcyBwb2ludCBvbiBhcmUgaW5pdGlhbGlzZWQgdXNpbmcgdGhlIEMgdmFsdWUKICAgICAgICAgICAgJWphdmFjb25zdCgxKSBCSUc7IC8vIGp1c3QgQklHIGluaXRpYWxpc2VkIHVzaW5nIEpOSSBjYWxsIChtdXN0IGJlIHBhcnNlZCBiZWZvcmUgQklHIGlzIGRlZmluZWQpCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBJTVBPUlRBTlQgQ0hBTkdFUyBUTyBUSEUgUFlUSE9OIE1PRFVMRSAqKioKCiAgICAgICAgICAgICgxKSBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW5hYmxlcyBzaGFkb3cvcHJveHkgY2xhc3NlcyBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdHdvIGZpbGVzIGFyZSBhbHdheXMgY3JlYXRlZCBieSBTV0lHLiAgRm9yCiAgICAgICAgICAgIGluc3RhbmNlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICAgICAvLyBmaWxlOiBmb28uaQogICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vCiAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICBUaGVuIHN3aWcgZ2VuZXJhdGVzIHR3byBmaWxlcyAiZm9vX3dyYXAuYyIgYW5kICJmb28ucHkiLgoKICAgICAgICAgICAgKDIpIFRoZSBuYW1lIG9mIHRoZSBsb3ctbGV2ZWwgQyBleHRlbnNpb24gbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQKICAgICAgICAgICAgdG8gc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZS4gICBUaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUKICAgICAgICAgICAgdG8gY29tcGlsZSB0aGUgbW9kdWxlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgJCBjYyAtYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24yLjIgZm9vX3dyYXAuYwogICAgICAgICAgICAgICAgJCBjYyAtc2hhcmVkIGZvb193cmFwLm8gJChPQkpTKSAtbyBfZm9vLnNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSBleHRyYSB1bmRlcnNjb3JlCgogICAgICAgICAgICBUaGlzIG5hbWluZyBzY2hlbWUgaXMgY29uc2lzdGVudCB3aXRoIG90aGVyIFB5dGhvbiBtb2R1bGVzIHRoYXQKICAgICAgICAgICAgdXRpbGl6ZSBleHRlbnNpb24gY29kZS4gIEZvciBpbnN0YW5jZSwgdGhlIHNvY2tldCBtb2R1bGUgY29uc2lzdHMKICAgICAgICAgICAgb2YgIl9zb2NrZXQuc28iIGFuZCAic29ja2V0LnB5Ii4gIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsCiAgICAgICAgICAgIHRoZSBzaGFyZWQgb2JqZWN0IGZpbGUgd2FzIG5hbWVkICJmb29jbW9kdWxlLnNvIi4KCiAgICAgICAgICAgICgzKSBBIG5ldyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IFB5dGhvbiBjb2RlIGludG8KICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgLnB5IGZpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcHl0aG9uY29kZSAlewogICAgICAgICAgICAgICAgZGVmIGZvbygpOgogICAgICAgICAgICAgICAgICAgIHByaW50ICJIZWxsbyBXb3JsZCIKICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBjcmVhdGUgbW9kdWxlcyBhcyBhIG1peCBvZiBDIGFuZCBQeXRob24uCiAgICAgICAgICAgICBQeXRob24gY29kZSBpcyBzZWFtbGVzc2x5IGFkZGVkIHRvIHRoZSBtb2R1bGUuCgogICAgICAgICAgICAoNCkgVGhlIC1zaGFkb3cgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBkZXByZWNhdGVkLiAgVGhpcyBpcyB0dXJuZWQgb24KICAgICAgICAgICAgYnkgZGVmYXVsdC4KCiAgICAgICAgICAgICg1KSBUbyBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBleHRyYSBweXRob24gZmlsZSwgdXNlIHRoZSAiLW5vcHJveHkiCiAgICAgICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBsaWtlbHkgYnJlYWsgdGhlIGJ1aWxkIGVudmlyb25tZW50IG9mIHByb2plY3RzIHRoYXQKICAgICAgICAgICAgdXRpbGl6ZSBzaGFkb3cgY2xhc3Nlcy4gICBUbyBmaXggdGhpcywgeW91IHByb2JhYmx5IG9ubHkgbmVlZCB0bwogICAgICAgICAgICBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCAuc28gZmlsZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBNYWtlZmlsZSBpbmZvcm1hdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gZXhhbXBsZWNtb2R1bGUuc28KCiAgICAgICAgICAgIEp1c3QgY2hhbmdlIGl0IHRvOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IF9leGFtcGxlLnNvCgogICAgICAgICAgICAqKiogRE9DVU1FTlRBVElPTiBVUERBVEUgKioqCiAgICAgICAgICAgIFRoZSBmaWxlIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgaGFzIGJlZW4gdXBkYXRlZCB0byBkZXNjcmliZSB0aGVzZSBjaGFuZ2VzLgoKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLW5vZXh0ZXJuIG9wdGlvbi4gICBJZiBzdXBwbGllZCwgU1dJRyB3aWxsIG5vdCBnZW5lcmF0ZQogICAgICAgICAgICBleHRyYSBleHRlcm4gZGVjbGFyYXRpb25zLiAgVGhpcyBpcyBzb21ldGltZXMgYW4gaXNzdWUgb24gCiAgICAgICAgICAgIG5vbi11bml4IHBsYXRmb3Jtcy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYSB3YXJuaW5nIGZvciBpZ25vcmVkIGZyaWVuZCBmdW5jdGlvbnMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc0NDk4IF0gLXByb3h5IGFuZCAlaW5jbHVkZSAicG9pbnRlci5pIiBjbGFzaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGF2aWQgQ3JlYXN5LgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NjEwMyBdIGdsb2JhbCBkZXN0cnVjdGlvbiB3YXJuaW5nIHdpdGggc2hhZG93LgogICAgICAgICAgICBQZXJsIGV4dGVuc2lvbnMgc2hvdWxkIG5vIGxvbmdlciByZXBvcnQgdGhlIHdhcm5pbmcKCiAgICAgICAgICAgICAgICJVc2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZSBkdXJpbmcgZ2xvYmFsIGRlc3RydWN0aW9uLiIKIAogICAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCAicGVybCAtdyIuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcmV0dCBXaWxsaWFtcy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW4gQysrIG1vZGUsIFNXSUcgbm93IGFsd2F5cyBkZWZpbmVzIG5hbWVzcGFjZSBzdGQuICBCeSBkZWZhdWx0LAogICAgICAgICAgICBpdCdzIGVtcHR5LiAgSG93ZXZlciwgdGhpcyB3aWxsIHNpbGVuY2UgZXJyb3JzIGZyb20gcHJvZ3JhbXMKICAgICAgICAgICAgdGhhdCBpbmNsdWRlIHN0YXRlbWVudHMgc3VjaCBhcyAidXNpbmcgbmFtZXNwYWNlIHN0ZDsiLgogICAgICAgICAgICBUaGlzIGZpeGVzIEJ1ZyBbIDU4NDAxNyBdIHVzaW5nIG5hbWVzcGFjZSBzdGQgZ2VuZXJhdGVzIGVycm9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NlcGggV2luc3Rvbi4KCjA3LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYSBuZXcgd2FybmluZyBtZXNzYWdlIGZvciAlYXBwbHkuICBJZiB5b3UgdXNlICVhcHBseSBidXQgbm8gdHlwZW1hcHMKICAgICAgICAgICAgYXJlIGRlZmluZWQsIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcgbWVzc2FnZS4gIFRoaXMgc2hvdWxkIGhlbHAgd2l0aAogICAgICAgICAgICBwcm9ibGVtcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKk9VVFBVVCB7IC4uLiB9OwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zIG9mIFNXSUcsIHRoaXMgc2lsZW50bHkgZGlkIG5vdGhpbmcuICBOb3cgeW91IGdldCBhbiBlcnJvciBsaWtlIHRoaXM6CiAgCiAgICAgICAgICAgICAgICAgICBmaWxlOmxpbmUuIFdhcm5pbmcuIENhbid0IGFwcGx5IChjaGFyICpPVVRQVVQpLiBObyB0eXBlbWFwcyBhcmUgZGVmaW5lZC4KCjA3LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3RhcnRlZCBKYXZhIHByYWdtYSBkZXByZWNhdGlvbi4gUmVwbGFjZW1lbnRzIHVzZSAldHlwZW1hcCBiYXNlZCAKICAgICAgICAgICAgZGlyZWN0aXZlcyBhbmQgZW5hYmxlIHByb3h5IGNsYXNzZXMgYW5kIHRoZSBuZXcgdHlwZSB3cmFwcGVyIGNsYXNzZXMgdG8gYmUgCiAgICAgICAgICAgIHRhaWxvcmVkIGluIHZhcmlvdXMgd2F5cy4gVGhlc2UgYXJlIHRoZSBuZXcgdHlwZW1hcHM6CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhYmFzZSkgICAgICAgICAgIC0gYmFzZSAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSAtIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIEphdmEgY2xhc3M6IGRlZmF1bHQgaXMgInB1YmxpYyIKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpICAgICAgICAgICAtIGphdmEgY29kZSBpcyBjb3BpZWQgdmVyYmF0aW0gdG8gdGhlIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpICAgICAgICAtIGltcG9ydCBzdGF0ZW1lbnRzIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbnRlcmZhY2VzKSAgICAgLSBpbnRlcmZhY2VzIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAKICAgICAgICAgICAgQW5kIHRoZXNlIGFyZSB0aGUgJXByYWdtYSBkaXJlY3RpdmVzIGJlaW5nIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgIGFsbHNoYWRvd2Jhc2UKICAgICAgICAgICAgYWxsc2hhZG93Y2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYWxsc2hhZG93Y29kZQogICAgICAgICAgICBhbGxzaGFkb3dpbXBvcnQKICAgICAgICAgICAgYWxsc2hhZG93aW50ZXJmYWNlCiAgICAgICAgICAgIHNoYWRvd2Jhc2UKICAgICAgICAgICAgc2hhZG93Y2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgc2hhZG93Y29kZQogICAgICAgICAgICBzaGFkb3dpbXBvcnQKICAgICAgICAgICAgc2hhZG93aW50ZXJmYWNlCiAgICAgICAgICAgIAogICAgICAgICAgICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gdGFyZ2V0IGEgcGFydGljdWxhciBwcm94eSBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIEZvbyAiaW1wb3J0IGphdmEudXRpbC4qIjsKICAgICAgICAgICAgb3IgYSBwYXJ0aWN1bGFyIHR5cGUgd3JhcHBlciBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIGRvdWJsZSogImltcG9ydCBqYXZhLm1hdGguKiI7CiAgICAgICAgICAgIE5vdGUgdGhhdCAkamF2YWNsYXNzbmFtZSBpbiB0aGVzZSB0eXBlbWFwcyBhcmUgc3Vic3RpdHV0ZWQgd2l0aCBlaXRoZXIgdGhlIHByb3h5IAogICAgICAgICAgICBjbGFzc25hbWUgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzIG9yIHRoZSBTV0lHVFlQRSBjbGFzcyBuYW1lLgoKMDcvMTgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIG1vZHVsZSBvdmVyaGF1bCB0byBpbXBsZW1lbnQgc3RhdGljIHR5cGUgY2hlY2tpbmcgb2YgYWxsIAogICAgICAgICAgICB0eXBlcy4gCiAgICAgICAgICAgIAogICAgICAgICAgICAxKSBDaGFuZ2VzIHdoZW4gdXNpbmcgSmF2YSBQcm94eSBjbGFzc2VzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFByZXZpb3VzbHkgd2hlbiB3cmFwcGluZyBnbG9iYWwgZnVuY3Rpb25zOiAKCiAgICAgICAgICAgIGNsYXNzIFNvbWVDbGFzc3t9OwogICAgICAgICAgICB2b2lkIGZvbyhTb21lQ2xhc3MqIHMpOwogICAgICAgICAgICBTb21lQ2xhc3MqIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5hdGl2ZSBtZXRob2QgcHJvdG90eXBlcyB1c2VkIGEgbG9uZyBmb3IgcG9pbnRlcnMgYW5kIGxvb2tlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICBwdWJsaWMgY2xhc3MgbW9kdWxlbmFtZSAgewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGZvbyhsb25nIGphcmcxKTsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIGxvbmcgYmFyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFuZCB1bmxpa2UgbWVtYmVyIGZ1bmN0aW9ucyBvZiBhIEMrKyBjbGFzcyB0aGVyZSB3YXMgbm8gd3JhcHBlciBhcm91bmQgdGhlIG5hdGl2ZSBjYWxscyAKICAgICAgICAgICAgdG8gbWFrZSB0aGUgdXNlIG9mIHRoZW0gbW9yZSB1c2VyIGZyaWVuZGx5LiBUaGV5IHdvdWxkIGJlIHVzZWQgZnJvbSBKYXZhIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNvbWVDbGFzcyBzID0gbmV3IFNvbWVDbGFzcyhtb2R1bGVuYW1lLmJhcigpLCBmYWxzZSk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMuZ2V0Q1B0clNvbWVDbGFzcygpKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QsIGJ1dCB0aGVuIGl0IHdvdWxkIG5vdCBoYXZlIAogICAgICAgICAgICBiZWVuIHBvc3NpYmxlIHRvIGNhbGwgYW55IHByb3h5IG1lbWJlciBmdW5jdGlvbnMgaW4gU29tZUNsYXNzOgoKICAgICAgICAgICAgbG9uZyBzID0gbW9kdWxlbmFtZS5iYXIoKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocyk7CgogICAgICAgICAgICBOb3cgd3JhcHBlciBmdW5jdGlvbnMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9vKFNvbWVDbGFzcyBzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5hdGl2ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU29tZUNsYXNzIGJhcigpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdoaWNoIG1lYW5zIHRoZXNlIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHVzZWQgbW9yZSBuYXR1cmFsbHkgd2l0aCBwcm94eSBjbGFzc2VzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIDIpIENoYW5nZXMgd2hlbiBub3QgdXNpbmcgSmF2YSBQcm94eSBjbGFzc2VzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGUgc28gY2FsbGVkIGxvdy1sZXZlbCBpbnRlcmZhY2Ugd2FzIHJhdGhlciBsb3ctbGV2ZWwgaW5kZWVkLiBUaGUgCiAgICAgICAgICAgIG5ldyBzdGF0aWMgdHlwZSBjaGVja2luZyBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBsZXNzIHNvIGJ1dCBpdCByZW1haW5zIGEKICAgICAgICAgICAgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdG8gdGhlIEMvQysrIHdvcmxkLiBQcm94eSBjbGFzc2VzIGFyZSB0aGUgb2J2aW91cyB3YXkgdG8gdXNlCiAgICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIGNvZGUsIGJ1dCBmb3IgdGhvc2Ugd2hvIHdhbnQgYSBmdW5jdGlvbmFsIGludGVyZmFjZSBhbGwgbm9uLXByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyBub3cgaGF2ZSBhIHNpbXBsZSBKYXZhIGNsYXNzIHdyYXBwZXIgYXJvdW5kIHRoZSBDL0MrKyB0eXBlLiBQb2ludGVycyBhbmQKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUgdHlwZXMgYXJlIGFsc28gd3JhcHBlZCBieSB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHR5cGUKICAgICAgICAgICAgd3JhcHBlciBjbGFzc25hbWVzIGFyZSBiYXNlZCBvbiB0aGUgU1dJRyBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBvdGhlciBsYW5ndWFnZSAKICAgICAgICAgICAgbW9kdWxlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBDL0MrKyB0eXBlICAgICAgSmF2YSB0eXBlIHdyYXBwZXIgY2xhc3MgbmFtZQogICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBpbnQqICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQKICAgICAgICAgICAgZG91YmxlKiogICAgICAgIFNXSUdUWVBFX3BfcF9kb3VibGUKICAgICAgICAgICAgU29tZUNsYXNzKiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyYgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwogICAgICAgICAgICBTb21lQ2xhc3MgICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKCiAgICAgICAgICAgIE5vdGUgdGhhdCBldmVyeXRoaW5nIHdyYXBwZWQgYnkgU1dJRyBpcyBhY2Nlc3NlZCB2aWEgYSBwb2ludGVyIGV2ZW4gd2hlbiB3cmFwcGluZyAKICAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgcGFzcyBieSB2YWx1ZSBvciByZWZlcmVuY2UuIFNvIHRoZSBwcmV2aW91cyBleGFtcGxlIHdvdWxkIG5vdyBiZSAKICAgICAgICAgICAgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcyBzID0gZXhhbXBsZS5iYXIoKTsKICAgICAgICAgICAgZXhhbXBsZS5mb28ocyk7CgogICAgICAgICAgICBOb3RlIHRoYXQgdHlwZWRlZnMgdGhhdCBTV0lHIGtub3dzIGFib3V0IGFyZSByZXNvbHZlZCwgc28gdGhhdCBpZiBvbmUgaGFzIAoKICAgICAgICAgICAgY2xhc3MgRm9ve307CiAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgIHRoZW4gYW55IHVzZSBvZiBCYXIgd2lsbCByZXF1aXJlIG9uZSB0byB1c2UgU1dJR1RZUEVfcF9Gb287CgogICAgICAgICAgICBTb21lIGNvbnNpZGVyYXRpb25zOgogICAgICAgICAgICBNYWtlIHN1cmUgeW91IG1ha2UgYSBmaXJtIGRlY2lzaW9uIHRvIHVzZSBlaXRoZXIgcHJveHkgY2xhc3NlcyBvciB0aGUgZnVuY3Rpb25hbCAKICAgICAgICAgICAgaW50ZXJmYWNlIGVhcmx5IG9uIGFzIHRoZSBjbGFzc25hbWVzIGFyZSBkaWZmZXJlbnQuCgogICAgICAgICAgICAzKSBQb2ludGVycyBhbmQgbm9uLXBhcnNlZCB0eXBlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBTb21ldGltZXMgU1dJRyBjYW5ub3QgZ2VuZXJhdGUgYSBwcm94eSBjbGFzcy4gVGhpcyBvY2N1cnMgd2hlbiB0aGUgZGVmaW5pdGlvbiBvZiAKICAgICAgICAgICAgYSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRywgYnV0IGlzIHRoZW4gdXNlZCBhcyBhIHZhcmlhYmxlIG9yIGEgcGFyYW1ldGVyLiAKICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICB2b2lkIGZvbyhTbmF6enkgc2RzKTsKCiAgICAgICAgICAgIElmIFNXSUcgaGFzIG5vdCBwYXJzZWQgU25henp5IGl0IGhhbmRsZXMgaXQgc2ltcGx5IGFzIGEgcG9pbnRlciB0byBhIFNuYXp6eS4KICAgICAgICAgICAgVGhlIEphdmEgbW9kdWxlIGdpdmVzIGl0IGEgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCB0aGUgcG9pbnRlciBhbmQgY2FsbHMgaXQgCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU25henp5LiBJbiBvdGhlciB3b3JkcyBpdCBoYW5kbGVzIGl0IGluIHRoZSBzYW1lIG1hbm5lciBhcyB0eXBlcyBhcmUgCiAgICAgICAgICAgIGhhbmRsZWQgaW4gdGhlIGxvdy1sZXZlbCBmdW5jdGlvbmFsIGludGVyZmFjZS4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIGZvciBhbGwgCiAgICAgICAgICAgIG5vbi1wcm94eSBjbGFzc2VzLCBlZyBhbGwgcG9pbnRlciB0byBwb2ludGVycyBhbmQgcG9pbnRlcnMgdG8gcHJpbWl0aXZlIHR5cGVzLgoKICAgICAgICAgICAgNCkgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGlmIHlvdSBoYXZlIGJlZW4gdXNpbmcgcHJveHkgY2xhc3NlcyBhbmQgCiAgICAgICAgICAgIG5vIGdsb2JhbCB2YXJpYWJsZXMvZnVuY3Rpb25zLiBPdGhlcndpc2Ugc29tZSBjaGFuZ2VzIHdpbGwgaGF2ZSB0byBiZSBtYWRlLiAKICAgICAgICAgICAgVGhlIG5hdGl2ZSBtZXRob2RzIHN0aWxsIGV4aXN0IGJ1dCB0aGV5IGFyZSBub3cgaW4gYSBKTkkgY2xhc3MsIHdoaWNoIGlzIGNhbGxlZCAKICAgICAgICAgICAgbW9kdWxlbmFtZUpOSS4gQXMgdGhpcyBjbGFzcyBpcyByZWFsbHkgcGFydCBvZiB0aGUgaW50ZXJuYWwgd29ya2luZ3MsCiAgICAgICAgICAgIGl0IHNob3VsZCBub3QgYmUgcmVxdWlyZWQgc28gdGhlIGNsYXNzIGhhcyBiZWNvbWUgcHJvdGVjdGVkLiBTb21lIHByYWdtYXMvZGlyZWN0aXZlcwogICAgICAgICAgICB3aWxsIGhvcGVmdWxseSBiZSBhZGRlZCB0byBoZWxwIHdpdGggYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIHdyYXBwaW5nIG9mIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlcyByZXR1cm5lZCBieQogICAgICAgICAgICB2YWx1ZS4gIEp1c3QgdG8gYmUgc2FmZSwgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgU3dpZ1ZhbHVlV3JhcHBlcjw+CiAgICAgICAgICAgIGp1c3QgaW4gY2FzZSB0aGV5IGRvbid0IGRlZmluZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBUaGlzCiAgICAgICAgICAgIHdvdWxkIGJlIHVzZWQgaWYgeW91IGhhZCBjb2RlIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICBGb288aW50PiBibGFoKCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgbW9yZWJsYWgoRm9vPGludD4geCk7CgogICAgICAgICAgICBidXQgeW91IGRpZG4ndCBpbnN0YW50aWF0ZSBGb288aW50PiB1c2luZyAldGVtcGxhdGUuICAKICAgICAgICAgICAgV2Ugc2hvdWxkIHByb2JhYmx5IGFkZCBhIHdhcm5pbmcgZm9yIHRoaXMuCgowNy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFuIGVycm9yIGNoZWNrIHRvIGRldGVjdCBzaGFkb3dlZCB0ZW1wbGF0ZSBwYXJhbWF0ZXJzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgaW50IFQ7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYW4gZXJyb3IsIG5vdCBhIHdhcm5pbmcuICBUaGlzIHdhcm5pbmcgaXMKICAgICAgICAgICAgYWxzbyBuZWVkZWQgdG8gZml4IHNvbWUgcmF0aGVyIGluc2lkaW91cyBwcm9ibGVtcyBsaWtlCiAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBUIHsKICAgICAgICAgICAgICAgICAgICAgIGludCAgYmxhaDsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgVCBUcmFpdHM7ICAgIC8vIFdoaWNoIFQgaXMgdGhpcz8/Pz8KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFQgc2hhZG93cyB0aGUgb3V0ZXIKICAgICAgICAgICAgc3RydWN0dXJlICh3aGljaCBpcyB3aGF0IHlvdSB3YW50KS4KCjA3LzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBmb3IgdGVtcGxhdGVzIHdpdGggaW50ZWdlciBhcmd1bWVudHMuICBTV0lHIGlzCiAgICAgICAgICAgIG11Y2ggbW9yZSBhd2FyZSBvZiBzaXR1YXRpb25zIHN1Y2ggYXMgdGhpczoKCiAgICAgICAgICAgICAgICBjb25zdCBpbnQgU2l6ZSA9IDEwMDsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vMTAwKSBGb288MTAwPjsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKEZvbzxTaXplPiAqeCk7ICAgLy8gS25vd3MgdGhhdCBGb288U2l6ZT4gaXMgdGhlIHNhbWUgYXMgRm9vPDEwMD47CgowNy8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVmZWF0dXJlLyVpZ25vcmUvJXJlbmFtZSBhbmQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA3LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBjb25zdHJ1Y3RvcnMgdGhhdCB0cnkgdG8gY2F0Y2gKICAgICAgICAgICAgZXhjZXB0aW9ucyBpbiBpbml0aWFsaXplcnMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgQmFyIGI7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEZvbyhpbnQgeCkgdHJ5IAogICAgICAgICAgICAgICAgICAgICA6IGIoeCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIGNhdGNoKGludCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMuICBIb3dldmVyLCB0aGUgdHJ5IGFuZCBjYXRjaAogICAgICAgICAgICBwYXJ0cyBvZiB0aGUgZGVjbGFyYXRpb24gYXJlIGlnbm9yZWQuICBTZWUgU3Ryb3VzdHJ1cCwgM3JkIEVkLCBzZWN0aW9uIAogICAgICAgICAgICAxNC40LjYuMSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICAgICAgIAowNy8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBzeW1ib2wgdGFibGUgbWFuYWdlbWVudC4gIFRoaXMgZml4ZXMKICAgICAgICAgICAgdHdvIGJ1Z3MuICBGaXJzdCwgbWl4aW5nIGFic3RyYWN0IG1ldGhvZHMsIHRlbXBsYXRlcywgYW5kIAogICAgICAgICAgICBpbmhlcml0YW5jZSBubyBsb25nZXIgZ2VuZXJhdGVzIGEgZmFpbGVkIGFzc2VydGlvbi4KIAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKSA9IDA7CiAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEE8VD4KICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQV9pbnQpIEE8aW50PjsKICAgICAgICAgICAgICAgJXRlbXBsYXRlKEJfaW50KSBCPGludD47CgogICAgICAgICAgICBUaGlzIGZpeCBhbHNvIGZpeGVzIGEgc3VidGxlIHByb2JsZW0gd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQKICAgICAgICAgICAgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KICAgICAgICAgICAgICAgc3RydWN0IEIgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90eXBlOwogICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBuaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKHNpemVfdHlwZSBpbmRleCA9IG5pbmRleCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBCdWdzIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgoKMDcvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIENoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIFNXSUdfQ29udmVydFB0cigpIGZ1bmN0aW9uCgkgICAgZm9yIHRoZSBTV0lHL1J1YnkgcnVudGltZSBzdXBwb3J0IHNvIHRoYXQgaXQgbG9va3MgbGlrZSB0aGUKCSAgICBQeXRob24gdmVyc2lvbi4gSWYgdGhlIGxhc3QgYXJndW1lbnQgKGZsYWdzKSBpcyBub24temVybywKCSAgICBTV0lHX0NvbnZlcnRQdHIoKSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgdHlwZSBtaXNtYXRjaGVzCgkgICAgYXMgYmVmb3JlLiBJZiBmbGFncyBpcyB6ZXJvLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC0xIGZvcgoJICAgIHR5cGUgbWlzbWF0Y2hlcyB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBSVUJZIE1PRFVMRSAqKioKCjA3LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMvbWV0aG9kcy9jb25zdHJ1Y3RvcnMgbm93IHdvcmsgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgICBtb2R1bGVzLiAgVGhlIHN1cHBvcnQgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudC0tanVzdCBjYWxsIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBub3JtYWxseSBhbmQgU1dJRyB3aWxsIGRpc3BhdGNoIHRvIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAgICBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGlzc3VlcyBhc3NvY2lhdGVkIHdpdGggdGhpcy4gIFBsZWFzZSByZWZlcgogICAgICAgICAgICB0byB0aGUgb3ZlcmxvYWRpbmcgc2VjdGlvbiBvZiBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwgZm9yIGRldGFpbHMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA3LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBuYW1lc3BhY2VzLCBlbnVtcywgYW5kIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgbmFtZXNwYWNlIGhlbGxvIHsKICAgICAgICAgICAgICAgICAgZW51bSBIZWxsbyB7IEhpLCBIb2xhIH07CiAKICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPEhlbGxvIEg+CiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJhaXRzCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgdmFsdWVfdHlwZTsKICAgICAgICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICB0cmFpdHM8SGk+Ojp2YWx1ZV90eXBlIHNheV9oaSgpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHM8SGk+Ojp2YWx1ZV90eXBlKDEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTV0lHIHdhc24ndCBnZW5lcmF0aW5nIHdyYXBwZXJzIHRoYXQgcHJvcGVybHkgcXVhbGlmaWVkIAogICAgICAgICAgICB0cmFpdHM8SGk+LiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4gICAgICAgICAKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgYXJyYXkgdmFyaWFibGUgdHlwZW1hcHMgZm9yIFRjbCBtb2R1bGUuICAgSWYgeW91IGhhdmUgYQogICAgICAgICAgICB2YXJpYWJsZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgaW50IGZvb1sxMF07CgogICAgICAgICAgICB0aGVuIGEgc2V0IGZ1bmN0aW9uIGxpa2UgdGhpcyBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgdm9pZCBmb29fc2V0KGludCAqeCkgewogICAgICAgICAgICAgICAgICAgbWVtbW92ZShmb28seCwxMCpzaXplb2YoaW50KSk7CiAgICAgICAgICAgICAgICB9CgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyAlZnJhZ21lbnQgZGlyZWN0aXZlLiAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgaXQgY2FuIGJlIGVhc3kgdG8KICAgICAgICAgICAgZ2V0IGNhcnJpZWQgYXdheSBhbmQgd3JpdGUgYSBsb3Qgb2YgY29kZS4gIEhvd2V2ZXIsIGRvaW5nIHNvIGNhdXNlcwogICAgICAgICAgICB0cmVtZW5kb3VzIGNvZGUgYmxvYXQuICAgQSBjb21tb24gd2F5IHRvIHNvbHZlIHRoaXMgaXMgdG8gd3JpdGUgCiAgICAgICAgICAgIGhlbHBlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzb21lX2hlbHBlcl9mdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHRoZSB3cmFwcGVyIGZpbGUgZ2V0cyBwb2xsdXRlZAogICAgICAgICAgICB3aXRoIGhlbHBlciBmdW5jdGlvbnMgZXZlbiBpZiB0aGV5IGFyZW4ndCB1c2VkLiAgICBUbyBmaXggdGhpcywKICAgICAgICAgICAgYSBuZXcgZnJhZ21lbnQgZGlyZWN0aXZlIGlzIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgKGNvcnJlY3RlZCB0eXBvIGluIGxpbmUgYmVsb3cgLSAwNi8yNi8yMDA4KQogICAgICAgICAgICAgICAlZnJhZ21lbnQoInR5cGVfaGVhZGVyIiwiaGVhZGVyIikgJXsKICAgICAgICAgICAgICAgICAgdm9pZCBzb21lX2hlbHBlcl9mdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAldHlwZW1hcChpbiwgZnJhZ21lbnQ9InR5cGVfaGVhZGVyIikgdHlwZSB7CiAgICAgICAgICAgICAgICAgICBzb21lX2hlbHBlcl9mdW5jdGlvbiguLi4pOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBjb2RlIGZyYWdtZW50IGlzIG9ubHkgZW1pdHRlZCBpZiB0aGUgdHlwZW1hcCBpcwogICAgICAgICAgICBhY3R1YWxseSB1c2VkLiAgIEEgc2ltaWxhciBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIGZvciBkZWNsYXJhdGlvbgogICAgICAgICAgICBhbm5vdGF0aW9uIGFuZCB0aGUgJWZlYXR1cmUgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgiZnJhZ21lbnQiLCJ0eXBlX2hlYWRlciIpICBTb21lRGVjbGFyYXRpb247CgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gJWZyYWdtZW50IGlzIHRoZSBmcmFnbWVudCBuYW1lLiAgVGhlIHNlY29uZCBhcmd1bWVudAogICAgICAgICAgICBpcyB0aGUgZmlsZSBzZWN0aW9uIHdoZXJlIHRoZSBmcmFnbWVudCBzaG91bGQgYmUgZW1pdHRlZC4gIAoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgZGlyZWN0aXZlIGlzIGZvciB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgICAgYW5kIGFkdmFuY2VkIHVzZXJzIHdhbnRpbmcgdG8gc3RyZWFtbGluZSB0eXBlbWFwIGNvZGUuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBtZW1iZXJpbiB0eXBlbWFwcyBmb3IgYWxsIGFycmF5cyBpbiBhbiBhdHRlbXB0IHRvIGVsaW1pbmF0ZQogICAgICAgICAgICBjb25mdXNpb24gYWJvdXQgdGhlaXIgdXNlLgoKMDYvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3Igc21hcnQtcG9pbnRlcnMuICBXaGVuIGEgY2xhc3MgZGVmaW5lcwogICAgICAgICAgICBvcGVyYXRvci0+KCkgbGlrZSB0aGlzCgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgQmFyICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyBsb2NhdGVzIGNsYXNzIEJhciBhbmQgdHJpZXMgdG8gd3JhcCBpdHMgbWVtYmVyIHZhcmlhYmxlcyBhbmQKICAgICAgICAgICAgbWV0aG9kcyBhcyBwYXJ0IG9mIEZvby4gIEZvciBleGFtcGxlLCBpZiBCYXIgd2FzIGRlZmluZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBZb3UgY291bGQgZG8gdGhpcyAoaW4gdGhlIHRhcmdldCBsYW5ndWFnZSk6CgogICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgIGYueCA9IDQgICAgICAgICAgICAjIEFjY2Vzc2VzIEJhcjo6eAogICAgICAgICAgICAgIGYuc3BhbSgpICAgICAgICAgICAjIEFjY2Vzc2VzIEJhcjo6c3BhbQoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgZmVhdHVyZSBpcyB0byBlbXVsYXRlIHRoZSBiZWhhdmlvciBvZiBDKysKICAgICAgICAgICAgc21hcnQtcG9pbnRlcnMtLS13aGljaCBhbGxvdyBhdHRyaWJ1dGVzIHRvIGFjY2Vzc2VkIHRyYW5zcGFyZW50bHkKICAgICAgICAgICAgdGhyb3VnaCBvcGVyYXRvci0+LgoKICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBhdXRvbWF0aWNhbGx5IGluIFNXSUctLS1ubyBzcGVjaWFsIGRpcmVjdGl2ZXMKICAgICAgICAgICAgYXJlIG5lZWRlZC4gICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IuICBVc2UgJWlnbm9yZSB0byBpZ25vcmUgCiAgICAgICAgICAgIG9wZXJhdG9yLT4uCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA2LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJWV4Y2VwdCBkaXJlY3RpdmUuICAgJWV4Y2VwdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoKMDYvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWpvciBjbGVhbnVwIG9mIHRoZSBtb2R1bGVzIGRpcmVjdG9yeS4gIEVsaW1pbmF0ZWQgbW9zdAogICAgICAgICAgICBoZWFkZXIgZmlsZXMsIGNvbnNvbGlkYXRlZCBtb2R1bGUgY29kZSBpbnRvIHNpbmdsZSBmaWxlcy4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGluc3RhbnRpYXRpb24gb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEFsbCBsYW5ndWFnZQogICAgICAgICAgICBtb2R1bGVzIG11c3Qgbm93IGRlZmluZSBhIGZhY3RvcnkgZnVuY3Rpb24gc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKgogICAgICAgICAgICAgICAgc3dpZ19weXRob24odm9pZCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQWVRIT04oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlbiBwbGFjZWQgaW4gYSB0YWJsZSBhbmQgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgICAgIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBpbiBzd2lnbWFpbi5jeHguICAKCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaGFzIGEgbnVtYmVyIG9mIGJlbmVmaXRzLiAgSXQgZGVjb3VwbGVzIHRoZSAKICAgICAgICAgICAgU1dJRyBtYWluIHByb2dyYW0gZnJvbSBoYXZpbmcgdG8ga25vdyBhYm91dCB0aGUgY2xhc3MKICAgICAgICAgICAgZGVmaW5pdGlvbnMgZm9yIGVhY2ggbW9kdWxlLiAgQWxzbywgYnkgdXNpbmcgYSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGVhc2llciB0byBpbXBsZW1lbnQgZHluYW1pYyBsb2FkaW5nCiAgICAgICAgICAgIG9mIG1vZHVsZXMgKHNpbXBseSBsb2FkIHRoZSBmaWxlIGFuZCBpbnZva2UgdGhlIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24pLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIHJlZmVyZW5jZSBjb252ZXJzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vICYoKTsKCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciBvcGVyYXRvciBuZXdbXSBhbmQgb3BlcmF0b3IgZGVsZXRlW10uCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBwcm9ibGVtIGZvciBjb25zdGFudHMgYW5kIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIGludm9sdmluZyB0ZW1wbGF0ZXMuCgowNi8xOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgYSBidWcgZm9yIHRoZSAnLWZlYXR1cmUnIGNvbW1hbmQgbGluZSBhcmd1bWVudDsKICAgICAgICAgICAgdGhhdCBzZXR0aW5nIHdhcyBlZmZlY3RpdmVseSBiZWluZyBpZ25vcmVkIGFuZCBzbyB0aGUgZmVhdHVyZQogICAgICAgICAgICBuYW1lIHdhcyBhbHdheXMgc2V0IGVxdWFsIHRvIHRoZSBtb2R1bGUgbmFtZS4KCjA2LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbXMgd2l0aCBzdGF0aWMgbWVtYmVycyBhbmQgZW51bXMgaW4gdGVtcGxhdGVzLgoKVmVyc2lvbiAxLjMuMTMgKEp1bmUgMTcsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIF9fRklMRV9fIGV4cGFuc2lvbiBpbiB0aGUgcHJlcHJvY2Vzc29yLiAgIE9uIFdpbmRvd3MsCiAgICAgICAgICAgIHRoZSBiYWNrc2xhc2ggKFwpIGlzIG5vdyBjb252ZXJ0ZWQgdG8gKFxcKSBpbiB0aGUgc3RyaW5nIGxpdGVyYWwKICAgICAgICAgICAgdXNlZCBmb3IgX19GSUxFX18uICBSZXBvcnRlZCBieSBTdGV2ZSBHbGFzZXIuCgowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAnbmFtZSBwcml2YXRlIGluIHRoaXMgY29udGV4dCcuICBUaGUKICAgICAgICAgICAgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBmb3IgcHVibGljIG1ldGhvZHMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBTY290dCBNaWNoZWwuCiAKMDYvMTQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKICAgICAgICAgICAgYW5kIG5hbWVzcGFjZXMuICAgV2hlbiBTV0lHIGV4cGFuZHMgYSB0ZW1wbGF0ZSwgaXQgZG9lcwogICAgICAgICAgICBzbyB3aXRoIGZ1bGx5IHJlc29sdmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIERvdWJsZTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShmb29fZCkgZm9vPERvdWJsZT47CgogICAgICAgICAgICB0aGVuLCBpdCBpcyBoYW5kbGVkIGFzIGZvbzxkb3VibGU+IGluIHRoZSB0eXBlc3lzdGVtLgogICAgICAgICAgICBUaGlzIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBwcm9ibGVtcyB3aXRoIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuCgowNi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbWlzc2luZyBib29sIHR5cGVtYXBzIGZvciBJTlBVVCwgT1VUUFVUIGFuZAoJICAgIElOT1VUIGluIExpYi9ydWJ5L3R5cGVtYXBzLmkuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgYSBjb3VwbGUgb2YgYnJva2VuIHByYWdtYXMuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB1bm5lY2Vzc2FyeSBjYXN0IHdoZW4gd3JhcHBpbmcgZ2xvYmFsIHZhcmlhYmxlIHdoZXJlIAogICAgICAgICAgICB0aGUgdHlwZSBpcyBub3QgcGFyc2VkIGJ5IFNXSUcgLSBKYXZhIHZhcmlhYmxlcyBleGFtcGxlIAogICAgICAgICAgICBmYWlsdXJlIGFzIHJlcG9ydGVkIGJ5IExhcnJ5IFZpcmRlbi4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgJXRlbXBsYXRlIHRvIGFsbG93IGZvciBlbXB0eSBpbnN0YW50aWF0aW9ucy4KCiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIGZvbzxpbnQsaW50PjsKCiAgICAgICAgICAgIFRoaXMgcmVnaXN0ZXJzIGZvbzxpbnQsaW50PiB3aXRoIHRoZSB0eXBlIHN5c3RlbSwgYnV0CiAgICAgICAgICAgIGRvZXNuJ3Qgd3JhcCBpdCAoc2FtZSBhcyAlaWdub3JlKS4gICBUaGlzIG1heSBvbmx5IGJlIGEKICAgICAgICAgICAgdGVtcG9yYXJ5IG1lYXN1cmUuICAgU1dJRyBtaWdodCBiZSBhYmxlIHRvIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgaW5zdGFudGlhdGUgdGVtcGxhdGVzIGluIGNlcnRhaW4gY2FzZXMuCgowNi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGZ1bmN0aW9uIHByb3RvdHlwZSBwcm9ibGVtcyB3aXRoIFRjbCA4LjQKCjA2LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHRlbXBsYXRlcyBhbmQgbG9jYXRpb24gb2YgYmFzZSBjbGFzc2VzLiAgCiAgICAgICAgICAgIFRoaXMgb25lIGlzIGEgbGl0dGxlIG1pbmQtYmVuZGluZywgYnV0IGhlcmUgaXMgYW4gZXhhbXBsZQogICAgICAgICAgICB0aGF0IGlsbHVzdHJhdGVzOgogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUmVzVHlwZT4KICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBBcmdUeXBlIGFyZ190eXBlOwogICAgICAgICAgICAgICAgICB0eXBlZGVmIFJlc1R5cGUgcmVzX3R5cGU7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUmVzVHlwZT4KICAgICAgICAgICAgIHN0cnVjdCBGdW5jdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFGLCBjbGFzcyBBRz4KICAgICAgICAgICAgIHN0cnVjdCBDbGFzcyA6IEZ1bmN0aW9uPHR5cGVuYW1lIHRyYWl0czxBRiwgQUc+OjphcmdfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxBRiwgQUc+OjpyZXNfdHlwZT4KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgJXRlbXBsYXRlKHRyYWl0c19kZCkgdHJhaXRzIDxkb3VibGUsIGRvdWJsZT47CiAgICAgICAgICAgICAldGVtcGxhdGUoRnVuY3Rpb25fZGQpIEZ1bmN0aW9uIDxkb3VibGUsIGRvdWJsZT47CiAgICAgICAgICAgICAldGVtcGxhdGUoQ2xhc3NfZGQpIENsYXNzIDxkb3VibGUsIGRvdWJsZT47CgoKICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgYmFzZSBjbGFzcyBvZiAnQ2xhc3MnIGlzIGRldGVybWluZWQgZnJvbQogICAgICAgICAgICB0aGUgRnVuY3Rpb24gdGVtcGxhdGUsIGJ1dCB0aGUgdHlwZXMgYXJlIG9idGFpbmVkIHRocm91Z2ggdHlwZWRlZnMuCiAgICAgICAgICAgIEJlY2F1c2Ugb2YgdGhpcywgU1dJRyBjb3VsZCBub3QgbG9jYXRlIHRoZSB3cmFwcGVkIGJhc2UgY2xhc3MKICAgICAgICAgICAgKEZ1bmN0aW9uPGRvdWJsZSxkb3VibGU+KS4gICBTaG91bGQgYmUgZml4ZWQgaW4gMS4zLjEzIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIEkgY2FuIHRoaW5rIG9mIGEgbWlsbGlvbiBvdGhlciB0aGluZ3MgdGhhdCBtaWdodAogICAgICAgICAgICBhbHNvIGJlIGJyb2tlbi4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggY29udmVyc2lvbiBvcGVyYXRvcnMuICBJZiB5b3UgaGFkIGFuCiAgICAgICAgICAgIG9wZXJhdG9yIGxpa2UgdGhpcywKCiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0OwoKICAgICAgICAgICAgU1dJRyB3YXMgb21taXR0aW5nIHRoZSAiY29uc3QiIHF1YWxpZmllci4gIFRoaXMgYWZmZWN0ZWQKICAgICAgICAgICAgJXJlbmFtZSBhbmQgb3RoZXIgZGlyZWN0aXZlcy4gIFJlcG9ydGVkIGJ5IFpob25nIFJlbi4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTGVzc2VuZWQgdGhlIHN0cmljdG5lc3Mgb2YgYWJzdHJhY3QgY2xhc3MgY2hlY2tpbmcuICBJZgogICAgICAgICAgICB5b3UgaGF2ZSBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgbWV0aG9kKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgU1dJRyB3aWxsIGdvIGFoZWFkIGFuZCBnZW5lcmF0ZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9ycwogICAgICAgICAgICAgZm9yIEJhci4gIEhvd2V2ZXIsIGl0IHdpbGwgYWxzbyBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSAKICAgICAgICAgICAgIHRoYXQgIkJhciIgbWlnaHQgYmUgYWJzdHJhY3QgKHNpbmNlIG1ldGhvZCgpIGlzbid0IGRlZmluZWQpLgogICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTIsIFNXSUcgcmVmdXNlZCB0byBnZW5lcmF0ZSBhIGNvbnN0cnVjdG9yIGF0IGFsbC4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBJZiB5b3Ugc3BlY2lmeSBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIEl0IGlzICpleGFjdGx5KiB0aGUgc2FtZSBhcyB0aGlzOgogCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmkpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgU1dJRy0xLjMuMTIgdHJpZWQgdG8gaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG91dHNpZGUgb2YgdGhlIG5hbWVzcGFjZQogICAgICAgICAgICB1c2luZyBzb21lIHRyaWNrLiAgSG93ZXZlciwgdGhpcyB3YXMgZXh0cmVtZWx5IHByb2JsZW1hdGljIGFuZCBmdWxsCiAgICAgICAgICAgIGhvbGVzLiAgIFRoaXMgdmVyc2lvbiBpcyBzYWZlci4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggc2NvcGUgcXVhbGlmaWNhdGlvbiBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIEE8Qjo6Qz46OkRECgogICAgICAgICAgICBCZWZvcmUsIHRoaXMgd2FzIHNlcGFyYXRlZCBhcyBzY29wZXMgQTxCLCBDPiwgYW5kIERELiAgRml4ZWQgbm93LgoKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBBbGxvdyB0aGUgZm9sbG93aW5nIHN5bnRheDogCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBjbGFzcyBBIHsgfTsKICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBIHsgLi4uIH07CgogICAgICAgICAgICBBIGJhc2UgY2xhc3Mgd2l0aG91dCBhIHNwZWNpZmllciBpcyBhc3N1bWVkIHRvIGJlIHB1YmxpYyBmb3IgYSBzdHJ1Y3QuCiAKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3Igd2l0aCB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByb2JsZW1zIHdpdGggJXJlbmFtZSBkaXJlY3RpdmUgYW5kIHRlbXBsYXRlCiAgICAgICAgICAgIGV4cGFuc2lvbi4KCiAgICAgICAgICAgIENvZGUgbGlrZSB0aGlzIHNob3VsZCBub3cgd29yazoKCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaCkgZm9vPGRvdWJsZT46Om1ldGhvZDsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAldGVtcGxhdGUod2hhdGV2ZXIpIGZvbzxkb3VibGU+OwoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXNvbHZlZCBzb21lIHRyaWNreSBpc3N1ZXMgb2YgbXVsdGktcGFzcyBjb21waWxhdGlvbiBhbmQgCiAgICAgICAgICAgIGFuZCBpbmhlcml0YW5jZS4gIFRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uIG5vdyBnZW5lcmF0ZXMKICAgICAgICAgICAgYW4gZXJyb3I6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGluY29tcGxldGUgY2xhc3Nlcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhcjsKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7IH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIGEgd2FybmluZyBhYm91dCBhbiB1bmRlZmluZWQgY2xhc3MuCgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsgIC8vIEJhciB1bmRlZmluZWQKCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIGJ1ZyByZXBvcnRlZCBieSBKYXNvbiBTdGV3YXJ0LgoKMDYvMDUvMjAwMjogbGpvaG5zb24KICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGUgUnVieSBtb2R1bGUgYWJvdXQgdGhlIGxhY2sKICAgICAgICAgICAgb2Ygc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIE9ubHkgdGhlIGZpcnN0IGJhc2UgY2xhc3MKICAgICAgICAgICAgbGlzdGVkIGlzIHVzZWQgYW5kIHRoZSBvdGhlcnMgYXJlIGlnbm9yZWQuIChSZXBvcnRlZCBieSBDcmFpZwogICAgICAgICAgICBGaWxlcykuCiAgICAgICAgICAgIAowNi8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggc3RydWN0IGRlY2xhcmF0aW9ucyBhbmQgdHlwZWRlZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEZvbyBGb287CiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEEgZmV3IG90aGVyIHN1YnRsZSBzdHJ1Y3QgcmVsYXRlZCB0eXBpbmcgcHJvYmxlbXMgd2VyZQogICAgICAgICAgICBhbHNvIHJlc29sdmVkLgoKVmVyc2lvbiAxLjMuMTIgKEp1bmUgMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSByZWxhdGVkIHRvIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgICBuYW1lc3BhY2VzLiAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkICdtYWtlIHVuaW5zdGFsbCcgdGFyZ2V0LiAgQ29udHJpYnV0ZWQgYnkgSm9lbCBSZWVkLgoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCByYXRoZXIgaW5zaWRpb3VzIGJ1ZyB3aXRoICVyZW5hbWUsICVmZWF0dXJlIGFuZCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB2ZWN0b3I6Ol9fZ2V0aXRlbV9fIHsKICAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBGaW5lCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFQgX19nZXRpdGVtX18oaW50IGluZGV4KTsgICAgICAgLy8gT29wcy4KICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3csIHRoZSAlZXhjZXB0aW9uIGRpcmVjdGl2ZSAoYW5kIG90aGVyIGZlYXR1cmVzKSBzaG91bGQgY29ycmVjdGx5IGFwcGx5IHRvCiAgICAgICAgICAgIGJvdGggdmVjdG9yIGFuZCBzcGVjaWFsaXphdGlvbnMuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2VzIHRvICV0ZW1wbGF0ZSgpIGRpcmVjdGl2ZS4gICBUZW1wbGF0ZSBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICByZWR1Y2VkIHRvIHByaW1pdGl2ZSB0eXBlcyBpbiB0ZW1wbGF0ZSBtYXRjaGluZy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgLi4uIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpJbnRQdHI7ICAgICAvLyBHcm9zcyB0eXBlZGVmCgogICAgICAgICAgICAgICAvLyBHZXRzIHRoZSBhYm92ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JJbnRQdHIpIHZlY3RvcjxJbnRQdHI+OwoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgZXh0cmVtZWx5IHN1YnRsZSwgYnV0IGl0IGZpeGVzIGEgbnVtYmVyIG9mIHBvdGVudGlhbAogICAgICAgICAgICBob2xlcyBpbiBMdWlnaSdzIFNUTCBsaWJyYXJ5IG1vZHVsZXMuICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yaSkgdmVjdG9yPGludD47CgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgdHlwZW1hcCBidWcgcmVsYXRlZCB0byBjb25zdC4gIGNvbnN0CiAgICAgICAgICAgIHdhcyBiZWluZyBkaXNjYXJkZWQgdGhyb3VnaCB0eXBlZGVmcy4KCjA1LzI5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBpbnB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgKGluIExpYi9ydWJ5L3J1Ynkuc3dnKS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGphdmEgYXJycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBlbmNsb3NlZCBieSAKICAgICAgICAgICAgYSBTV0lHX05PQVJSQVlTICNkZWZpbmUuIFVzZWZ1bCBpZiBub3QgdXNpbmcgYXJyYXlzIGFuZCAKICAgICAgICAgICAgaXQgaXMgZGVzaXJhYmxlIHRvIG1pbmltaXNlIHRoZSBhbW91bnQgb2YgY29tcGlsZWQgY29kZS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRW51bXMgd2VyZSBub3QgcmVuYW1lZCB3aGVuIHVzaW5nICVuYW1lIG9yICVyZW5hbWUKICAgICAgICAgICAgZml4LgoKMDUvMjgvMjAwMjogbGpvaG5zb24KICAgICAgICAgICAgW1J1YnldIE1vZGlmaWVkIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgdGhlCgkgICAgIm5ldyIgc2luZ2xldG9uIG1ldGhvZCBhbmQgImluaXRpYWxpemUiIGluc3RhbmNlIG1ldGhvZCBmb3IKCSAgICBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzLiBUaGUgd3JhcHBlciBuYW1lCgkgICAgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgIm5ldyIgaXMgYWxsb2NfY2xhc3NuYW1lIGFuZAoJICAgIHRoZSB3cmFwcGVyIG5hbWUgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgImluaXRpYWxpemUiCgkgICAgaXMgbmV3X2NsYXNzbmFtZS4KCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gcnVudGltZS4gIFBvaW50ZXIgY29udmVyc2lvbi9jcmVhdGlvbiBmdW5jdGlvbnMKICAgICAgICAgICAgbm93IGFsbW9zdCBhbHdheXMgaGF2ZSBhbiBleHRyYSAiZmxhZ3MiIGFyZ3VtZW50LiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ29udmVydFB0cihvYmosIHZvaWQgKiosIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl4KICAgICAgICAgICAgVGhpcyBleHRyYSBwYXJhbWV0ZXIgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gYW5kIHdpbGwKICAgICAgICAgICAgYmUgdXNlZCBmb3IgbW9yZSBjb250cm9sIG92ZXIgcG9pbnRlcnMgaW4gZnV0dXJlIHZlcnNpb25zLgoKMDUvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggZm9yIEMrKyBjbGFzc2VzIHdpdGggcHJpdmF0ZSBhc3NpZ25tZW50IG9wZXJhdG9ycy4gIEl0CiAgICAgICAgICAgIGlzIG5vdyBwb3NzaWJsZSB0byBzYWZlbHkgcmV0dXJuIG9iamVjdHMgbGlrZSB0aGlzIGJ5IHZhbHVlLgogICAgICAgICAgICBDYXZlYXQ6ICB0aGUgY2xhc3MgbXVzdCBwcm92aWRlIGEgY29weSBjb25zdHJ1Y3Rvci4KCSAgICAKMDUvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICAtcHJveHkgb3B0aW9uIGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4gIFRoaXMgaXMgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgLXNoYWRvdy4gIFdlIGFyZSBtZXJlbHkgY2hhbmdpbmcgdGVybWlub2xvZ3kuCiAgICAgICAgICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0aGUgLXBhY2thZ2Ugb3B0aW9uLgogICAgICAgICAgICAtcGFja2FnZSBtZXJlbHkgc2V0cyB0aGUgcGFja2FnZSBuYW1lIHRvIGJlIHVzZWQgb24gdGhlCiAgICAgICAgICAgIHdyYXBwZXJzLiAgSXQgZG9lcyBub3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeQogICAgICAgICAgICBmaWxlIG9yIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgLnBtIGZpbGUuICBUaGlzIHdhcwogICAgICAgICAgICBicm9rZW4gYXQgc29tZSBwb2ludCwgYnV0IHdvcmtzIGFnYWluIG5vdy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNDc1NDUyIF0gbWVtb3J5IGxlYWsgaW4gcmV0dXJuLWJ5LXZhbHVlLgogICAgICAgICAgICBQcm9ibGVtIHJlbGF0ZWQgdG8gc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgcmV0dXJuaW5nIG5ld2x5CiAgICAgICAgICAgIGFsbG9jYXRlZCBvYmplY3RzLiBSZXBvcnRlZCBieSBSb3kgTGVjYXRlcy4KIAowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBbIDUxMzEzNCBdICVCTEVTU0VETUVNQkVSUyBpc24ndCBhbHdheXMgcmlnaHQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsZXVyIERpYW5hIERyYWdhbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDA3MzUgXSAtaW1wb3J0YWxsIGFuZCB0aGUgLUkgb3B0aW9uLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbZ3VpbGVdIEZpeGVkIFsgNTMyNzIzIF0gRGVmYXVsdCBhcmcgZm9yIGNoYXIqIGNhbiBTZWdWLiAgCiAgICAgICAgICAgIEVycm9yIGluIGd1aWxlIG1vZHVsZS4gIFJlcG9ydGVkIGJ5IEJyZXR0IFdpbGxpYW1zLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHR5cGVtYXAgYXBwbGljYXRpb24gY29kZS4gIFRoZSAiZnJlZWFyZyIKICAgICAgICAgICAgdHlwZW1hcCBtdXN0IGV4YWN0bHkgbWF0Y2ggdXAgd2l0aCB0aGUgImluIiBvciAiaWdub3JlIgogICAgICAgICAgICB0eXBlbWFwLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoY2hhciAqZGF0YSwgaW50IGxlbikgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBjaGFyICpkYXRhIHsgLi4uIH07IAoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpkYXRhLCBpbnQgbGVuKTsKCiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSAiaW4iIHR5cGVtYXAgaXMgYXBwbGllZCwgYnV0IHRoZQogICAgICAgICAgICAgZnJlZWFyZyB0eXBlbWFwIGlzIG5vdC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgZnJlZWFyZwogICAgICAgICAgICAgdHlwZW1hcCBkb2Vzbid0IG1hdGNoIHVwIHdpdGggdGhlIGlucHV0IGFyZ3VtZW50IHNlcXVlbmNlLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0ODI3MiBdIERlZmF1bHQgYXJndW1lbnQgY29kZSBtaXNzaW5nIGJyYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ3NzMwIF0gU3dpZ1ZhbHVlV3JhcHBlciBuZWVkZWQgZm9yIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVuZGVmaW5lZCBpZGVudGlmaWVycyBub3cgZXZhbHVhdGUgdG8gMCB3aGVuIGV2YWx1YXRpbmcKICAgICAgICAgICAgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjaWYgIUZPTwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgIAogICAgICAgICAgICB3aGVyZSBGT08gaXMgdW5kZWZpbmVkIG9yIHNldCB0byBzb21lIG5vbi1udW1lcmljIHZhbHVlLgoKICAgICAgICAgICAgRml4ZXMgWyA1NDA4NjggXSAjaWYgZGVmaW5lZCB3aGF0ZXZlciAtIG5vdCBwYXJzZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFkYW0gSHVwcC4KCiAKMDUvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIHRoZSBDKysgJ2V4cG9ydCcga2V5d29yZC4KCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSByZWZpbmVtZW50IG9mIHR5cGUtbmFtZSBtYW5nbGluZyB0byBhY2NvdW50IGZvciBwb2ludGVycywgYXJyYXlzLAogICAgICAgICAgICByZWZlcmVuY2VzLCBhbmQgb3RoZXIgZW1iZWRkZWQgdHlwZSBjb25zdHJ1Y3RzLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbml0aWFsIGF0dGVtcHQgYXQgc3VwcG9ydGluZyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgQXQKICAgICAgICAgICAgdGhlIHZlcnkgbGVhc3QsIGl0IGlzIHBhcnNlZCBhbmQgdGhlIGNsYXNzZXMgYXJlIHN0b3JlZC4gIE1hdGNoaW5nCiAgICAgICAgICAgIG9mIGluc3RhbnRpYXRpb25zIHRvIHNwZWNpYWxpemVkIHZlcnNpb24gaXMgbW9yZSBsaW1pdGVkIGFuZCBiYXNlZCBvbgogICAgICAgICAgICB0aGUgU1dJRyBkZWZhdWx0IHR5cGVtYXAgcnVsZXM6CgogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICYKCiAgICAgICAgICAgIE5vdywgd2h5IGluIHRoZSB3b3JsZCB3b3VsZCB5b3Ugd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlPyAgT3RoZXIKICAgICAgICAgICAgdGhhbiBhbGxvd2luZyBmb3Igc2xpZ2h0bHkgbW9kaWZpZWQgY2xhc3MgQVBJcywgdGhpcyBjYXBhYmlsaXR5IGlzCiAgICAgICAgICAgIHByaW1hcmlseSB1c2VkIHRvIHByb3ZpZGUgYWR2YW5jZWQgd3JhcHBpbmcgc3VwcG9ydCBmb3IgU1RMLWxpa2UKICAgICAgICAgICAgb2JqZWN0cy4gIEl0IGNhbiBhbHNvIGJlIG1peGVkIHdpdGggdHlwZW1hcHMuICBIZXJlIGlzIGFuIGV4YW1wbGU6CgoKICAgICAgICAgICAgICAgIC8qIEdlbmVyaWMgdmVyc2lvbiAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPFQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBvYmplY3RzIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvKiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIChwb2ludGVycykgKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvcjxUICo+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPFQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBwb2ludGVycyB0byBvYmplY3RzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvKiBTcGVjaWFsaXphdGlvbiAoaW50ZWdlcnMpLiAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBpbnRlZ2Vycy4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gdHlwZW1hcHMuICAgTm9ybWFsbHksIHR5cGVtYXAgdmFyaWFibGVzIGFyZQogICAgICAgICAgICByZW5hbWVkIHRvIGF2b2lkIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqIChpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBjb2RlIHRoYXQgY3JlYXRlcyBhbmQgdXNlcyB2YXJpYWJsZXMgInRlbXAxIiwidGVtcDIiLCAKICAgICAgICAgICAgInRlbXAzIiBhbmQgc28gZm9ydGggZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRpbWVzIHRoZSB0eXBlbWFwIGlzIHVzZWQuCiAgICAgICAgICAgIFNvbWV0aW1lcyB5b3Ugd2FudCBhIHNpbmdsZSB2YXJpYWJsZSBpbnN0ZWFkLiAgVG8gZG8gdGhhdCwgdXNpbmcKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBuYW1pbmcgc2NoZW1lOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgKihpbnQgX2dsb2JhbF90ZW1wKSB7CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgSXMgdGhpcyBjYXNlLCBhIHNpbmdsZSB2YXJpYWJsZSBfZ2xvYmFsX3RlbXAgaXMgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgd3JhcHBlciBmdW5jdGlvbnMuICBJdCBpcyBzaGFyZWQgYWNyb3NzIGFsbCB0eXBlbWFwcy4gIFJlcGVhdGVkCiAgICAgICAgICAgIHR5cGVtYXBzIGRvIG5vdCByZXBsaWNhdGUgdGhlIHZhcmlhYmxlLS0tdGhleSB1c2UgdGhlIGZpcnN0IG9uZQogICAgICAgICAgICBlbWl0dGVkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gdHlwZW1hcHMuICBJZiB5b3UgaGF2ZSB0aGlzIGNvZGUsCgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vIChpbnQgc29tZXZhciA9IDMpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBzb21ldmFyIGlzIG5vdyBlbWl0dGVkIGludG8gdGhlIHdyYXBwZXIgY29kZS4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgJWV4dGVuZCB0byBiZSBiZXR0ZXIgYmVoYXZlZCBpbiBuYW1lc3BhY2VzLiAgSWYgeW91IGhhdmUgY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiYXIgewogICAgICAgICAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgU1dJRyBtYXRjaGVzIHRoZSBibGFoKCkgbWV0aG9kIHRvIGEgQyBmdW5jdGlvbiBuYW1lZCAKICAgICAgICAgICAgdm9pZCBmb29fYmFyX2JsYWgoZm9vOjpiYXIgKnNlbGYpLgoKICAgICAgICAgICAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1uYW1lc3BhY2UgdmVyc2lvbi4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGVzOiBjcG9pbnRlci5pLCBjYXJyYXlzLmksIGNtYWxsb2MuaS4gIFRoZXNlCiAgICAgICAgICAgIHByb3ZpZGUgYWNjZXNzIHRvIEMgcG9pbnRlcnMgYW5kIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvTGlicmFyeS5odG1sIGZvciBkZXRhaWxzLgoKMDUvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBDIHR5cGUgY2hhciBubyBsb25nZXIgbWFwcyB0byBKYXZhIHR5cGUgYnl0ZSwgYnV0IHRvIEphdmEgdHlwZSBjaGFyLgogICAgICAgICAgICBJdCBpcyBub3cgdHJlYXRlZCBhcyBhIGNoYXJhY3RlciByYXRoZXIgdGhhbiBhIHNpZ25lZCBudW1iZXIuIFRoaXMgZml0cyBpbgogICAgICAgICAgICB3aXRoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIGFuZCBpcyBhIG1vcmUgbmF0dXJhbCBtYXBwaW5nIGFzIGNoYXIqIGlzIAogICAgICAgICAgICBtYXBwZWQgYXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4gTm90ZSB0aGF0IHRoZSBDIHNpZ25lZCBjaGFyIHR5cGUgaXMgc3RpbGwKICAgICAgICAgICAgbWFwcGVkIHRvIGEgSmF2YSBieXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBJbXByb3ZlZCBjb25zdGFudHMgd3JhcHBpbmcuIENvbnN0YW50cyAoI2RlZmluZSBhbmQgJWNvbnN0YW50KSB2YWx1ZXMgCiAgICAgICAgICAgIGFyZSBub3cgb2J0YWluZWQgdGhyb3VnaCBhIEpOSSBjYWxsLiBQcmV2aW91c2x5IHRoZSB2YWx1ZSB3YXMgY29tcGlsZWQgYXMgCiAgICAgICAgICAgIEphdmEgY29kZSwgYnV0IHRoaXMgZGlkbid0IHdvcmsgZm9yIGFsbCBjYXNlcywgZWcgI2RlZmluZSAxMjNVTEwuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJvZ3VzIGVycm9yIG1lc3NhZ2Ugd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZSBhbmQgQysrCiAgICAgICAgICAgIGFjY2VzcyBzcGVjaWZpZXJzLiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmFtZXNwYWNlcyBhbmQgZW51bXMgbm93IHdvcmsgY29ycmVjdGx5LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgZW51bSBCYXIgeyBBLCBCIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0eXBlcyBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIHNwZWNpZnkgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcwogICAgICAgICAgICBpbiB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICV0eXBlcyhGb28gPSBCYXIpOwoKICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgRm9vIGlzYSBCYXIuICAgIFVzaW5nIHRoaXMgaXMgcG90ZW50aWFsbHkgcXVpdGUgZGFuZ2Vyb3VzLgogICAgICAgICAgICBIb3dldmVyLCB0aGlzIGlzIHVzZWZ1bCBpbiBjZXJ0YWluIGNhc2VzIChhbmQgaW4gdGhlIFNXSUcgbGlicmFyeSkuCiAgICAgICAgICAgIAowNS8yMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVub2RlZmF1bHQgYW5kICVtYWtlZGVmYXVsdCBkaXJlY3RpdmVzIG5vdyByZXF1aXJlIGEgdHJhaWxpbmcgc2VtaWNvbG9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0OwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAlbWFrZWRlZmF1bHQ7CgogICAgICAgICAgICBJbiBhZGRpdGlvbiBib3RoIGRpcmVjdGl2ZXMgY2FuIHRha2UgYSBjbGFzcyBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdCBGb287CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgICAvKiBObyBkZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgIC8qIERlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBnZW5lcmF0ZWQgKi8KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSWYgeW91IGRvbid0IHVzZSB0aGUgdHJhaWxpbmcgc2VtaWNvbG9uLCB0aGluZ3Mgd2lsbCBteXN0ZXJpb3VzbHkgYnJlYWsuCgowNS8yMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vcmUgaW1wcm92ZW1lbnRzIHRvIHR5cGUgc3lzdGVtIGhhbmRsaW5nLiAgU1dJRyBub3cgY29ycmVjdGx5IGhhbmRsZXMKICAgICAgICAgICAgdGVtcGxhdGUgbmFtZXMgYW5kIHBhcmFtZXRlcnMgaW4gYSBuYW1lc3BhY2UuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGJhciB7IH07CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhcjxJbnRlZ2VyPiAqeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhlIGdlbmVyYXRlZCBjb2RlLCBhbGwgb2YgdGhlIHR5cGVuYW1lcyBhcmUgcHJvcGVybHkgcXVhbGlmaWVkLgoKMDUvMTcvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBkZXByZWNhdGVkIGJyb2tlbiAtam5pYyBhbmQgLWpuaWNwcCBjb21tYW5kbGluZSBvcHRpb25zLiBUaGUgQyBvciBDKysgCiAgICAgICAgICAgIEpOSSBjYWxsaW5nIGNvbnZlbnRpb24gaXMgbm93IGRldGVybWluZWQgZnJvbSB0aGUgLWMrKyBjb21tYW5kbGluZSBvcHRpb24uCgowNS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBKQ0FMTCBtYWNyb3Mgd2hpY2ggZXhpc3Qgc28gdGhhdCB0aGUgc2FtZSB0eXBlbWFwcyBjYW4gYmUgdXNlZAogICAgICAgICAgICBmb3IgZ2VuZXJhdGluZyBib3RoIHRoZSBDIGFuZCBDKysgSk5JIGNhbGxpbmcgY29udmVudGlvbnMgbm8gbG9uZ2VyIGFwcGVhcgogICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoaXMgaXMgYmVjYXVzZSB0aGUgb3V0cHV0IGlzIG5vdyBwYXNzZWQgdGhyb3VnaCB0aGUgCiAgICAgICAgICAgIFNXSUcgcHJlcHJvY2Vzc29yIHdoaWNoIGRvZXMgdGhlIG1hY3JvIGV4cGFuc2lvbiBmb3IgZWl0aGVyIEMgb3IgQysrIChkZXBlbmRpbmcKICAgICAgICAgICAgb24gd2hldGhlciAtYysrIGlzIHBhc3NlZCBvbiB0aGUgU1dJRyBjb21tYW5kbGluZSkuCgogICAgICAgICAgICBUaGUgZ2VuZXJhdGlvbiBvZiB0aGUgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIGFycmF5IHR5cGVtYXBzIGhhdmUgYmVlbiBhZGp1c3RlZCAKICAgICAgICAgICAgdG8gdGFrZSBhY2NvdW50IG9mIHRoaXMuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IGFueSB0eXBlbWFwcyB3aGljaCBjb250YWluZWQgCiAgICAgICAgICAgIEpDQUxMIG1hY3JvcyB3aXRoaW4gJXsgJX0gYnJhY2tldHMgd2lsbCBoYXZlIHRvIGJlIG1vdmVkIHdpdGhpbiB7fSBicmFja2V0cyAKICAgICAgICAgICAgc28gdGhhdCB0aGUgU1dJRyBwcmVwcm9jZXNzb3IgY2FuIGV4cGFuZCB0aGUgbWFjcm9zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDbGFzcyB0ZW1wbGF0ZXMgbWF5IG5vdyBiZSB1c2VkIGFzIHRlbXBsYXRlIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEM+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb2kpIEZvbzxpbnQsIEJhcj47CiAgICAgCiAgICAgICAgICAgIFNXSUcgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcgc3BlY2lhbCB3aXRoIHRoaXMtLS1pdCdzIGp1c3QKICAgICAgICAgICAgYW5vdGhlciB3YXkgb2Ygc3BlY2lmeWluZyBhIHRlbXBsYXRlIHBhcmFtZXRlci4gIAogICAgICAgICAKMDUvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciByZWZpbmVtZW50IG9mIHRlbXBsYXRlIHN1cHBvcnQuICBUZW1wbGF0ZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIG5vIGxvbmdlcgogICAgICAgICAgICByZXF1aXJlZCBmb3IgdHlwZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxib29sPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE9idmlvdXNseSwgbmFtZXMgYXJlIHJlcXVpcmVkIGZvciB0ZW1wbGF0ZTxjbGFzcyBUPjsKCjA1LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IG1hY3JvIGV4cGFuc2lvbiBpbiB0eXBlbWFwcy4gIFRoZSBzZXF1ZW5jZToKCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcih0eXBlKQoKICAgICAgICAgICAgV2lsbCBleHBhbmQgaW50byB0aGUgU1dJRyB0eXBlIGRlc2NyaXB0b3Igc3RydWN0b3IgZm9yCiAgICAgICAgICAgIHRoZSBnaXZlbiB0eXBlLiAgVHlwZSBtYXkgYmUgYW55IGFic3RyYWN0IGRhdGF0eXBlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcihpbnQgKikKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAoKikoaW50LGRvdWJsZSkpCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcih2ZWN0b3I8aW50PiAqKQoKICAgICAgICAgICAgQ2F2ZWF0OiBJdCBpcyAqTk9UKiBjdXJyZW50bHkgbGVnYWwgdG8gdXNlIG90aGVyIHR5cGVtYXAKICAgICAgICAgICAgc3Vic3RpdHV0aW9uIHZhcmlhYmxlcyBpbiB0aGUgbWFjcm8uICBGb3IgZXhhbXBsZSAKICAgICAgICAgICAgJGRlc2NyaXB0b3IoJDFfdHlwZSkuCgogICAgICAgICAgICBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbW9kaWZpY2F0aW9uIGlzIHRvIGJldHRlcgogICAgICAgICAgICBzdXBwb3J0IHR5cGVtYXBzIGZvciBjb250YWluZXIgb2JqZWN0cyBvciB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IG1pZ2h0IGJlIHBlcmZvcm1pbmcgdHlwZSBjb252ZXJzaW9ucy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgd3JhcHBpbmcgb2YgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUgdHlwZXMgaGFzIGJlZW4KICAgICAgICAgICAgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgQXJndW1lbnRzIG9mIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgbm93IHBhc3NlZAogICAgICAgICAgICBieSB2YWx1ZSBhcyBvcHBvc2VkIHRvIHBvaW50ZXJzLiAgUmV0dXJuIHZhbHVlcyBvZgogICAgICAgICAgICB0eXBlICdjb25zdCBwcmltaXRpdmUgJicgYXJlIHJldHVybmVkIGFzIHZhbHVlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXJzLgoKICAgICAgICAgICAgJ3ByaW1pdGl2ZScgaXMgYW55IG9uZSBvZiBpbnQsIHNob3J0LCBsb25nLCBsb25nIGxvbmcsCiAgICAgICAgICAgIGNoYXIsIGZsb2F0LCBkb3VibGUsIGJvb2wgKGFzIHdlbGwgYXMgdW5zaWduZWQgdmFyaWFudHMpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSB0byBiZXR0ZXIgc3VwcG9ydCBDKysgd3JhcHBpbmctLWVzcGVjaWFsbHkKICAgICAgICAgICAgY29kZSB0aGF0IG1ha2VzIHVzZSBvZiB0ZW1wbGF0ZXMgYW5kIHRoZSBTVEwuCiAgICAgICAgICAgIAowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCB0byBhY2Nlc3MgdGVtcGxhdGVzCiAgICAgICAgICAgIGluIGEgbmFtZXNwYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgY29tcGxleCB7CiAgICAgICAgICAgICAgICAgICAgICAgVCByZSwgaW07CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXgoVCBfciA9IFQoKSwgVCBfaSA9IFQoKSkgOiByZShfciksIGltKF9pKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICBUIHJlYWwoKSB7IHJldHVybiByZTsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgaW1hZygpIHsgcmV0dXJuIGltOyB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoY29tcGxleCkgc3RkOjpjb21wbGV4PGRvdWJsZT47CgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgc29tZSB2ZXJ5IHN1YnRsZSBuYW1lc3BhY2Uvc3ltYm9sIHRhYmxlIAogICAgICAgICAgICBtYW5hZ2VtZW50IGlzc3VlcyBpbnZvbHZlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcy4KICAgICAgICAgICAgSXQgbWF5IG5vdCB3b3JrIGluIGNlcnRhaW4gY2FzZXMuCgowNS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1lbWJlciB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBzdXBwb3J0IGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4gCiAgICAgICAgICAgICAgIHN0cnVjdCBwYWlyIHsKICAgICAgICAgICAgICAgICBfVDEgZmlyc3Q7CiAgICAgICAgICAgICAgICAgX1QyIHNlY29uZDsKICAgICAgICAgICAgICAgICBwYWlyKCkgOiBmaXJzdChfVDEoKSksIHNlY29uZChfVDIoKSkgeyB9CiAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+IHBhaXIoY29uc3QgcGFpcjxfVTEsX1UyPiAmeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUsIHVzZSAldGVtcGxhdGUgYW5kICVleHRlbmQuCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIGV4cGFuZHMgdGhlIGNvbnN0cnVjdG9yIGludG8gYSBkZWZhdWx0CiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3I6CgogICAgICAgICAgICAgICAlZXh0ZW5kIHBhaXIgewogICAgICAgICAgICAgICAgICAldGVtcGxhdGUocGFpcikgcGFpcjxfVDEsX1QyPjsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgSGlnaGx5IGV4cGVyaW1lbnRhbC4gIE90aGVyIHVzZXMgbWF5IGJlIGJyb2tlbi4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICVleHRlbmQgKCVhZGRtZXRob2RzKSBkaXJlY3RpdmUgbm8gbG9uZ2VyIHdvcmtzIHVubGVzcwogICAgICAgICAgICBpdCBhcHBlYXJzIGluIHRoZSBwdWJsaWMgc2VjdGlvbiBvZiBhIGNsYXNzLiAgIEFuIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2UgaXMgbm93IGdlbmVyYXRlZCAoYXMgb3Bwb3NlZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdCkuCgowNS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyAld2FybmZpbHRlcigpIGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIGF0dGFjaGVzIGEgd2FybmluZwogICAgICAgICAgICBmaWx0ZXIgdG8gc3BlY2lmaWMgZGVjbGFyYXRpb25zIGFuZCBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzCiAgICAgICAgICAgICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLCBhbmQgc28gZm9ydGguICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV3YXJuZmlsdGVyKDUwMSkgZm9vOyAgIC8vIFN1cHByZXNzIG92ZXJsb2FkZWQgd2FybmluZwogICAgICAgICAgICAgICBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKTsgCgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBPYmplY3Q6OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgICBjbGFzcyBPYmplY3QgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyBmZWF0dXJlIG9ubHkgc3VwcHJlc3NlcyB3YXJuaW5ncyBpbiBsYXRlciBzdGFnZXMgb2YgY29kZQogICAgICAgICAgICBnZW5lcmF0aW9uLiAgSXQgZG9lcyBub3Qgc3VwcHJlc3Mgd2FybmluZ3MgcmVsYXRlZCB0byBwcmVwcm9jZXNzaW5nCiAgICAgICAgICAgIG9yIHBhcnNpbmcuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgc3VwcG9ydHMgQzk5IHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgZGVidWdmKGZtdCwuLi4pIGZwcmludGYoc3RkZXJyLGZtdCxfX1ZBX0FSR1NfXykKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCAiLi4uIiBpcyB1c2VkIHRvIGluZGljYXRlIHZhcmlhYmxlIGFyZ3VtZW50cyB3aGljaAogICAgICAgICAgICBhcmUgYWxsIHBsYWNlZCBpbnRvIHRoZSBzcGVjaWFsIGFyZ3VtZW50IG5hbWUgX19WQV9BUkdTX18gaW4KICAgICAgICAgICAgdGhlIG1hY3JvIGV4cGFuc2lvbi4gIAoKICAgICAgICAgICAgU1dJRyBhbHNvIGltcGxlbWVudHMgdGhlIEdOVSAoIyMpIGV4dGVuc2lvbiBmb3Igc3dhbGxvd2luZyB0aGUKICAgICAgICAgICAgcHJlY2VkaW5nIGNvbW1hIHdoZW4gX19WQV9BUkdTX18gaXMgZW1wdHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LCAjI19fVkFfQVJHU19fKQoKICAgICAgICAgICAgSGVyZSBpcyBob3cgdGhpcyBpcyBleHBhbmRlZDoKCiAgICAgICAgICAgICAgIGRlYnVnZigiJWQiLCAzKSAgLS0+IGZwcmludGYoc3RkZXJyLCIlZCIsMykKICAgICAgICAgICAgICAgZGVidWdmKCJIZWxsbyIpICAtLT4gZnByaW50ZihzdGRlcnIsIkhlbGxvIiApCgogICAgICAgICAgICAobm90aWNlIHRoZSBkZWxldGVkIGNvbW1hKS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDgvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQogICAgICAgICAgICBNYW55IGNoYW5nZXMgdG8gcGhwIG1vZHVsZS4gIFNoYWRvdyBjbGFzc2VzIGFyZSBub3cgaW1wbGVtZW50ZWQKICAgICAgICAgICAgZW50aXJlbHkgaW4gbmF0aXZlIEMgYW5kIG5vIG5lZWQgZm9yIHBocC1jb2RlIHNoYWRvdyB3cmFwcGVycwogICAgICAgICAgICBQb3B1bGF0ZWQgdGVtcGxhdGUgY29uZmlnLm00IGFuZCBNYWtlZmlsZS5pbiBhcyBuZWVkZWQgYnkKICAgICAgICAgICAgcGhwaXplIGFyZSBnZW5lcmF0ZWQuCgowNS8wOC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQSBjb3B5IGNvbnN0cnVjdG9yIGlzIG5vdyB0dXJuZWQgaW50byBhICJjbG9uZSIKICAgICAgICAgICAgaW5zdGFuY2UgbWV0aG9kIChzZWUgRGF2ZSdzIGNoYW5nZSBmb3IgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgZGF0ZWQgNC83LzIwMDIpLiBUaGlzIHNlZW1zIGxpa2UgdGhlIGFwcHJvcHJpYXRlIHRoaW5nCiAgICAgICAgICAgIHRvIGRvIGZvciBSdWJ5IGNvZGUuCgowNS8wOC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1NTM4NjQgXSBJbmxpbmUgZGVzdHJ1Y3RvciBjb2RlIG5vdCB3cml0dGVuLgoKMDUvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICAlaWdub3JlIGJlaGF2ZXMgYmV0dGVyIHdpdGggY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICB0eXBlIHN5c3RlbSBpbiBnZW5lcmFsLiAgIEZvciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLAogICAgICAgICAgICAlaWdub3JlIG5vdyBzdXBwcmVzc2VzIHRoZSBjcmVhdGlvbiBvZiBhIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgb3IgZGVzdHJ1Y3Rvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlaWdub3JlIH5Gb287CiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbygpOwogICAgICAgICAgICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIFNXSUctMS4zLjExLCB+Rm9vKCkgc2ltcGx5ICJkaXNhcHBlYXJlZCIgYW5kIHRoZSBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgICBjcmVhdGVkIGEgd3JhcHBlciBmb3IgYSBkZWZhdWx0IGRlc3RydWN0b3IgKGFzIGlmIGl0IHdhcyBuZXZlcgogICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgaW50ZXJmYWNlKS4gIEluIFNXSUctMS4zLjEyLCAlaWdub3JlIHN1cHByZXNzZXMKICAgICAgICAgICAgdGhlIGNyZWF0aW9uIG9mIGEgZGVzdHJ1Y3RvciBpZiBvbmUgaXMgYWN0dWFsbHkgZGVmaW5lZC4gCgogICAgICAgICAgICBTaW1pbGFybHksIGV2ZW4gdGhvdWdoIGEgZGVjbGFyYXRpb24gaXMgaWdub3JlZCwgaW5mb3JtYXRpb24KICAgICAgICAgICAgbWF5IHN0aWxsIGJlIG5lZWRlZCB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMuIEZvciBleGFtcGxlLCBoZXJlCiAgICAgICAgICAgIGlzIGEgdmVyeSBzdWJ0bGUgZXJyb3IgdGhhdCBpcyBmaXhlZCBieSB0aGlzIGNoYW5nZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIHN0ZDo6c3RyaW5nOyAgICAgICAgIC8vIFByZXZlbnQgY2xhc3Mgd3JhcHBpbmcKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgY2xhc3Mgc3RyaW5nIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHN0cmluZyAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZvaWQgZm9vKHN0ZDo6c3RyaW5nICpzKTsgICAvLyBCcm9rZW4uCgogICAgICAgICAgICBCZWZvcmUgdGhpcyBmaXgsICVpZ25vcmUgd291bGQgY2F1c2UgdGhlIGNsYXNzIGRlZmluaXRpb24gdG8gZGlzYXBwZWFyLgogICAgICAgICAgICBUaGlzLCBpbiB0dXJuLCB3b3VsZCBjYXVzZSB0aGUgdHlwZW1hcCB0byBiZSBtaXNhcHBsaWVkLiAKIAowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGNoYW5nZXMgdG8gJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMKICAgICAgICAgICAgZm9yIGJldHRlciBzdXBwb3J0IG9mIGRlc3RydWN0b3JzLiAgRGVzdHJ1Y3RvcnMgY2FuIG5vdyBiZSBwcmVjaXNlbHkKICAgICAgICAgICAgdGFnZ2VkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6fkZvbzsKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFjdGlvbiIpIH5CYXIgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAqRGV2ZWxvcGVyIHdhcm5pbmcqIAogICAgICAgICAgICBPcGVyYXRpb25zIHN1Y2ggYXMgcmVuYW1pbmcgYW5kIGZlYXR1cmUgYXR0YWNobWVudCBmb3IgY2xhc3NlcyB1c2VkIHRvCiAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gZGVzdHJ1Y3RvcnMgYXMgd2VsbC4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGRpZCB0aGlzOgogCiAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKCiAgICAgICAgICAgIFRoZSBvcGVyYXRpb24gYXBwbGllZCB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsIGFuZAogICAgICAgICAgICB0aGUgZGVzdHJ1Y3Rvci4gICBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gIE5vdyBzdWNoIG9wZXJhdGlvbnMKICAgICAgICAgICAgd2lsbCBvbmx5IGFwcGx5IHRvIHRoZSBjbGFzcyBhbmQgdGhlIGNvbnN0cnVjdG9yLiAgTm90ZTogaWYgeW91CiAgICAgICAgICAgIHdlcmUgcmVseWluZyBvbiB0aGlzIGZvciBjbGFzcyByZW5hbWluZywgYmUgYXdhcmUgdGhhdCByZW5hbWVkCiAgICAgICAgICAgIGNsYXNzZXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIGhhbmRsZWQgYXQgdGhlIGxldmVsIG9mIHRoZSBjbGFzcyBpdHNlbGYKICAgICAgICAgICAgYW5kIG5vdCB0aGUgbGV2ZWwgb2YgaW5kaXZpZHVhbCBkZWNsYXJhdGlvbnMgaW4gdGhlIGNsYXNzIChhbHRob3VnaAogICAgICAgICAgICB0aGV5IGNhbiBiZSByZW5hbWVkIGluZGl2aWR1YWxseSBpZiBuZWVkZWQpLiAgQXMgZmFyIGFzIEkga25vdywKICAgICAgICAgICAgdGhlIExhbmd1YWdlIGNsYXNzIGlzIGFscmVhZHkgdGFraW5nIGNhcmUgb2YgdGhpcyBjYXNlIGNvcnJlY3RseS4KCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IHNldCBvZiB0ZXN0cy4gIFRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL2Vycm9ycyBkaXJlY3RvcnkgY29udGFpbnMKICAgICAgICAgICAgdGVzdHMgdGhhdCB0cnkgdG8gZXhlcmNpc2UgYWxsIG9mIFNXSUcncyBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcy4KCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3RhcnQgb2YgYSB3YXJuaW5nIGZyYW1ld29yay4gIFdhcm5pbmcgbWVzc2FnZXMgYXJlIG5vdyBhc3NpZ25lZCBudW1lcmljIHZhbHVlcwogICAgICAgICAgICB0aGF0IGFyZSBzaG93biBpbiB3YXJuaW5nIG1lc3NhZ2VzLiAgIFRoZXNlIGNhbiBiZSBzdXBwcmVzc2VkIHVzaW5nIHRoZQogICAgICAgICAgICAtdyBvcHRpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3dpZyAtdzMwMiBleGFtcGxlLmkKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyLDMwNSBleGFtcGxlLmkKCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSAjcHJhZ21hIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGlzOgoKICAgICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPTMwMgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyLDMwNQoKICAgICAgICAgICAgTm90ZTogU2luY2UgU1dJRyBpcyBhIG11bHRpLXBhc3MgY29tcGlsZXIsIHRoaXMgcHJhZ21hIHNob3VsZAogICAgICAgICAgICBvbmx5IGJlIHVzZWQgdG8gY2hhbmdlIGdsb2JhbCBzZXR0aW5ncyBvZiB0aGUgd2FybmluZyBmaWx0ZXIuICBJdCBzaG91bGQKICAgICAgICAgICAgbm90IGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgd2FybmluZ3MgaW4gYW4gaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAgIFRoZSBoYW5kbGluZyBvZiAjcHJhZ21hIG9jY3VycyBpbiB0aGUgQysrIHByZXByb2NvZXNzb3IgYW5kIGFmZmVjdHMgYWxsIAogICAgICAgICAgICBzdWJzZXF1ZW50IHN0YWdlcyBvZiBjb21waWxhdGlvbi4KCiAgICAgICAgICAgIFRoZSAtV2FsbCBvcHRpb24gdHVybnMgb24gYWxsIHdhcm5pbmdzIGFuZCBvdmVycmlkZXMgYW55IGZpbHRlcnMgdGhhdAogICAgICAgICAgICBtaWdodCBoYXZlIGJlZW4gc2V0LgoKICAgICAgICAgICAgV2FybmluZ3MgY2FuIGJlIGlzc3VlZCBmcm9tIGFuIGludGVyZmFjZSB1c2luZyAld2Fybi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAld2FybiAiMTEwOiVzZWN0aW9uIGlzIGRlcHJlY2F0ZWQiCgogICAgICAgICAgICBUaGUgZmlyc3QgcGFydCBvZiBhIHdhcm5pbmcgbWVzc2FnZSBpcyBhbiBvcHRpb25hbCB3YXJuaW5nIG51bWJlci4KICAgICAgICAgICAgQSBjb21wbGV0ZSBzZXQgb2Ygd2FybmluZyBudW1iZXJzIGlzIGZvdW5kIGluIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmguCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgcGFyc2luZyBjaGFuZ2UuICAgRGlyZWN0aXZlcyB0byBpbmNsdWRlIGZpbGVzIG5vdyB1c2UgYnJhY2tldHMgWyAuLi4gXQogICAgICAgICAgICBpbnN0ZWFkIG9mIHsgLi4uIH0uICAgCgogICAgICAgICAgICAgICAgICAlaW5jbHVkZWZpbGUgImZvby5pIiBbCiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBdCgogICAgICAgICAgICBUaGUgdXNlIG9mIHsgLi4uIH0gd2FzIGEgYmFkIGNob2ljZSBiZWNhdXNlIHRoZXkgd2VyZSBpbmNsdWRlZCBpbXBsaWNpdGx5IGJ5CiAgICAgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IgYW5kIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBwcm9wZXJseSBkZXRlY3QgbGVnaXRpbWF0ZSBtaXNzaW5nICd9JyAKICAgICAgICAgICAgZXJyb3JzLgoKMDQvMTYvMjAwMi0KMDUvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIEV1cm9wZWFuIFRvdXI6IFBhcmlzLUFtc3RlcmRhbS1CYXRoLgoKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGhhcyBiZWVuIHJlbmFtZWQgdG8gJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZXh0ZW5kIEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICBpbnQgYmFyKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE1vdGl2YXRpb246IHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgZm9yIG1hbnkKICAgICAgICAgICAgb3RoZXIgdGFza3MgaW5jbHVkaW5nIGFkZGluZyBzeW50aGVzaXplZCBhdHRyaWJ1dGVzLCBjb25zdHJ1Y3RvcnMsCiAgICAgICAgICAgIGFuZCB0eXBlbWFwcy4gQmVjYXVzZSBvZiB0aGlzLCAiYWRkbWV0aG9kcyIgaXMgc29tZXdoYXQgbWlzbGVhZGluZy4KICAgICAgICAgICAgJWV4dGVuZCBtb3JlIHByZWNpc2VseSBkZXNjcmliZXMgdGhpcyBvcGVyYXRpb24tLS1leHRlbnNpb24gb2YgYQogICAgICAgICAgICBjbGFzcyBvciBzdHJ1Y3R1cmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWFkZG1ldGhvZHMgc3RpbGwgd29ya3MgdmlhIGEgbWFjcm8gZGVmaW5pdGlvbi4gICBIb3dldmVyLAogICAgICAgICAgICBhIHdhcm5pbmcgbWVzc2FnZSBtYXkgYmUgZ2VuZXJhdGVkLiAgIEVycm9ycyBpbnZvbHZpbmcgJWFkZG1ldGhvZHMKICAgICAgICAgICAgd2lsbCBhY3R1YWxseSByZWZlciB0byB0aGUgJWV4dGVuZCBkaXJlY3RpdmUuICAKICAgICAgICAgICAgCjA0LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRnVydGhlciByZWZpbmVtZW50IG9mIHRoZSB0eXBlIHN5c3RlbS4gIFR5cGVkZWYgbm93CiAgICAgICAgICAgIHByb3BhZ2F0ZXMgdGhyb3VnaCBmdW5jdGlvbnMsIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywKICAgICAgICAgICAgYW5kIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICgqeCkoaW50KSwgSW50ZWdlciAoKnkpKEludGVnZXIpKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYXJndW1lbnRzICd4JyBhbmQgJ3knIGhhdmUgZXhhY3RseQogICAgICAgICAgICB0aGUgc2FtZSB0eXBlIChhbmQgd291bGQgb2J2aW91c2x5IGFjY2VwdCBvYmplY3RzCiAgICAgICAgICAgIG9mIGVpdGhlciB0eXBlKS4KCiAgICAgICAgICAgIFNpbWlsYXJseSwgY29uc2lkZXIgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CiAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCAoRm9vOjoqeCkoaW50KSwgaW50IChCYXI6Oip5KShpbnQpKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYXJndW1lbnRzIHggYW5kIHkgYXJlIHRoZSBzYW1lIAogICAgICAgICAgICB0eXBlICh2aWEgdHlwZWRlZikuCiAgICAgICAgICAgIAowNC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBpZiBhbnkgcGFydCBvZgogICAgICAgICAgICBhbiBleHByZXNzaW9uIGludm9sdmVzIHZhbHVlcyBmcm9tIGEgcHJpdmF0ZSBwYXJ0IG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgWDsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludCBhLCBpbnQgYiA9IFgpOyAgIC8vIFdhcm5pbmcKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIGlnbm9yZWQuICBUaGVyZQogICAgICAgICAgICBhcmUgd29ya2Fyb3VuZHMsIGJ1dCB0aGV5IGFyZSByYXRoZXIgY2x1bXN5LiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgICB5b3UgbWlnaHQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFjdGlvbiIpIGJsYWgoaW50LGludCkgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmFyZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBibGFoKGFyZzEsYXJnMik7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gMCk7CgoKMDQvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBVc2Ugb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlIGluc2lkZSBhIG5hbWVzcGFjZSBpcwogICAgICAgICAgICBmb3JiaWRkZW4gYW5kIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZS4gICBUaGlzIGlzCiAgICAgICAgICAgIG5vdCBhbGxvd2VkIHNpbmNlIHRoZSBpbmxpbmVkIGNvZGUgdGhhdCBpcyBlbWl0dGVkIGlzCiAgICAgICAgICAgIG5vdCBwbGFjZWQgaW5zaWRlIGEgbmFtZXNwYWNlLiAgVGhpcyBjb25mdXNlcyBvdGhlcgogICAgICAgICAgICBzdGFnZXMgb2YgcGFyc2luZy4KICAgICAgICAgICAgICAgICAgICAKMDQvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGJ1ZyBmaXhlcyB0byBjYXN0aW5nIG9wZXJhdGlvbnMgYW5kIGV4cHJlc3Npb24KICAgICAgICAgICAgcGFyc2luZy4gICBEdWUgdG8gc29tZSBwYXJzaW5nIGlzc3VlcywgaXQgaXMgbm90IAogICAgICAgICAgICBjdXJyZW50bHkgcG9zc2libGUgdG8gdXNlIGNhc3RzIGZvciBhbGwgcG9zc2libGUKICAgICAgICAgICAgZGF0YXR5cGVzLiAgIEhvd2V2ZXIsIHRoZSBjb21tb24gY2FzZXMgd29yay4KCjA0LzIwLzIwMDI6IGJlYXpsZXkgKEFtc3RlcmRhbSkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlcyBub3cgd29yay4gIFNpbXBseSB1c2UgdGhlICV0ZW1wbGF0ZQogICAgICAgICAgICBkaXJlY3RpdmUgaW5zaWRlIGEgY2xhc3Mgb3IgJWFkZG1ldGhvZHMgdG8gY3JlYXRlCiAgICAgICAgICAgIGluc3RhbnRpYXRpb25zIChzZWUgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sKS4gIFN1cHBvcnRpbmcKICAgICAgICAgICAgdGhpcyB3YXMgZWFzeS0tLWVhcmxpZXIgY2hhbmdlcyB0byB0ZW1wbGF0ZXMgbWFkZSBpdAogICAgICAgICAgICBwb3NzaWJsZSB1c2luZyBvbmx5IGEgdHdvLWxpbmUgbW9kaWZpY2F0aW9uIHRvIHRoZSBwYXJzZXIKICAgICAgICAgICAgYW5kIGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgZWxzZXdoZXJlLiAgSG1tbSwgY29tZSB0byAKICAgICAgICAgICAgdGhpbmsgb2YgaXQsIHRoZSBzbW9rZSB3YXMgcmF0aGVyIHRoaWNrIGluIHRoYXQgSW50ZXJuZXQgImNhZmUiLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNC8xOS8yMDAyOiBiZWF6bGV5IChUR1YpCiAgICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgU2ltcGxlIG51bWJlcnMgYW5kIHN0cmluZ3MgY2FuIGJlIHVzZWQgd2l0aCB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBhcyB3ZWxsLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQxMDApIHZlY3RvcjxpbnQsMTAwPjsKCiAgICAgICAgICAgIE5vdGU6IEFyaXRobWV0aWMgZXhwcmVzc2lvbnMgYXJlIG5vdCBjdXJyZW50bHkgYWxsb3dlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgIERlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzIG5vdyB3b3JrIGFuZCBkbyBub3QgaGF2ZSB0bwogICAgICAgICAgICBiZSBnaXZlbiB0byAldGVtcGxhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgIAowNC8xOC8yMDAyOiBiZWF6bGV5IChQYXJpcykKICAgICAgICAgICAgQ2hhbmdlIGluIGludGVybmFsIHRlbXBsYXRlIGhhbmRsaW5nLiAgVGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgbm93IGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgdHlwZQogICAgICAgICAgICBzeXN0ZW0gYW5kIGFyZSBhd2FyZSBvZiB0eXBlZGVmcywgZXRjLiAgVGhpcyBidWlsZHMKICAgICAgICAgICAgdXBvbiB0aGUgY2hhbmdlIGJlbG93LiAgIAoKICAgICAgICAgICAgKioqIERFVkVMT1BFUiBXQVJOSU5HICoqKgogICAgICAgICAgICBXb3JkIG9mIGNhdXRpb24gdG8gbGFuZ3VhZ2UgbW9kdWxlIHdyaXRlcnMuICBUaGUgIm5hbWUiCiAgICAgICAgICAgIHBhcmFtZXRlciBvZiBjZXJ0YWluIHBhcnNlIHRyZWUgbm9kZXMgKGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikKICAgICAgICAgICAgbWF5IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCB0eXBlcy4gICBUaGlzIHBhcmFtZXRlcml6YXRpb24gaXMKICAgICAgICAgICAgZG9uZSB1c2luZyBTV0lHIHR5cGUtc3RyaW5ncyBhbmQgbm90IHRoZSB1bmRlcmx5aW5nIEMgdmVyc2lvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICBpbnQgbWF4PGludCAqPihpbnQgKixpbnQgKikgIAoKICAgICAgICAgICAgaGFzIGEgbmFtZSBvZiAibWF4PChwLmludCk+Ii4gIElmIHlvdSB1c2UgdGhlIG5hbWUgZGlyZWN0bHksCiAgICAgICAgICAgIHlvdSBtYXkgZ2V0IHN5bnRheCBlcnJvcnMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiAgVG8gZml4IHRoaXMsCiAgICAgICAgICAgIHVzZSBTd2lnVHlwZV9uYW1lc3RyKG5hbWUpIHRvIGNvbnZlcnQgYSBwYXJhbWV0ZXJpemVkIG5hbWUgCiAgICAgICAgICAgIHRvIGEgQyBuYW1lIHdpdGggdmFsaWQgc3ludGF4LiAgVGhlIGludGVybmFsIHZlcnNpb24gaXMKICAgICAgICAgICAgdXNlZCB0byByZWR1Y2UgdGVtcGxhdGUgdHlwZXMgdG8gYSBjb21tb24gcmVwcmVzZW50YXRpb24gCiAgICAgICAgICAgIGFuZCB0byBoYW5kbGUgaXNzdWVzIG9mIHR5cGVkZWYuCiAgICAgICAgICAgIAowNC8xNi8yMDAyOiBiZWF6bGV5IChzb21ld2hlcmUgb3ZlciB0aGUgQXRsYW50aWMpCiAgICAgICAgICAgIEVuaGFuY2VtZW50IG9mIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFRoZSB0eXBlIHN5c3RlbSBpcyBub3cKICAgICAgICAgICAgYXdhcmUgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmb28odmVjdG9yPGludD4gKngsIHZlY3RvcjxJbnRlZ2VyPiAqeSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHZlY3RvcjxpbnQ+IGFuZCB2ZWN0b3I8SW50ZWdlcj4gYXJlCiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUuICAgVGhlcmUgaXMgc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoaXMKICAgICAgICAgICAgbWVjaGFuaXNtIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgYSB0eXBlbWFwIGRlZmluZWQgZm9yIHZlY3RvcjxpbnQ+ICogd291bGQgYXBwbHkgdG8gZWl0aGVyIHR5cGUuCiAgICAgICAgICAgIEhvd2V2ZXIsIGEgdHlwZW1hcCBmb3IgdmVjdG9yPEludGVnZXI+ICogd291bGQgb25seSBhcHBseSB0bwogICAgICAgICAgICB0aGF0IHR5cGUuCgogICAgICAgICAgICBUeXBlZGVmcyBhbmQgdHlwZW1hcHMgYW5kIG1hdGNoZWQgYnkgbGVmdC1tb3N0IGV4cGFuc2lvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZlY3RvcjxJbnRlZ2VyLEludGVnZXI+IC0tPiAKICAgICAgICAgICAgICB2ZWN0b3I8aW50LCBJbnRlZ2VyPiAtLT4KICAgICAgICAgICAgICB2ZWN0b3I8aW50LCBpbnQ+CgoKMDQvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBDaGFuZ2VzIHRvIEphdmEgc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICAgIE92ZXJjb21lcyBhIGJ1ZyB3aGVyZSB0aGUgbW9kdWxlIGFzc3VtZWQgdGhhdCBhIHBvaW50ZXIgdG8gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGNvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYSBwb2ludGVyIHRvIGEgYmFzZSBjbGFzcy4gVGhhbmtzIAogICAgICAgICAgICB0byBTdGVwaGVuIE1jQ2F1bCBmb3IgYW5hbHlzaW5nIHRoZSBidWcgYW5kIHN1Ym1pdHRpbmcgcGF0Y2hlcy4KCiAgICAgICAgICAgIEEgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGUgZ2V0Q1B0cigpIG1ldGhvZCBpbiBlYWNoIHNoYWRvdyBjbGFzcyBoYXMKICAgICAgICAgICAgZGlzYXBwZWFyZWQgYW5kIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBnZXRDUHRyWFhYKCksIHdoZXJlIFhYWCBpcyB0aGUgCiAgICAgICAgICAgIHNoYWRvdyBjbGFzcyBuYW1lLiBJZiB5b3UgaGF2ZSBjb2RlIHRoYXQgcHJldmlvdXNseSB1c2VkIGdldENQdHIoKSwgCiAgICAgICAgICAgIGFuZCB0aGUgYXNzb2NpYXRlZCBjbGFzcyBpcyB3cmFwcGluZyBhIEMgc3RydWN0IG9yIGEgQysrIGNsYXNzIHRoYXQKICAgICAgICAgICAgaXMgbm90IGludm9sdmVkIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLCBqdXN0IHVzZSB0aGUgbmV3IG1ldGhvZC4gSWYKICAgICAgICAgICAgaG93ZXZlciwgdGhlIGNsYXNzIGlzIGludm9sdmVkIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLCB5b3UnbGwgaGF2ZQogICAgICAgICAgICB0byBjaG9vc2Ugd2hpY2ggcG9pbnRlciB5b3UgcmVhbGx5IHdhbnQuIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IAogICAgICAgICAgICBoYXMgYmVlbiBicm9rZW4gYXMgbm90IHVzaW5nIHRoZSBjb3JyZWN0IHBvaW50ZXIgY2FuIGxlYWQgdG8gd2VpcmQgYnVncwogICAgICAgICAgICB0aHJvdWdoIGlsbC1kZWZpbmVkIGJlaGF2aW91ci4gSWYgeW91IGFyZSBzdXJlIHlvdSB3YW50IHRoZSBvbGQgbWV0aG9kcywgCiAgICAgICAgICAgIHlvdSBjb3VsZCBhZGQgdGhlbSBiYWNrIGludG8gYWxsIHNoYWRvdyBjbGFzc2VzIGJ5IGFkZGluZyB0aGlzIGF0IHRoZSAKICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHlvdXIgaW50ZXJmYWNlIGZpbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIGFsbHNoYWRvd2NvZGU9JXsKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCl7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgUGxlYXNlIHNlZSBlbnRyeSBkYXRlZCAwNy8yMy8yMDAyIHRvIHNlZSBob3cgdG8gZG8gdGhpcyBhZnRlciB0aGUgZGVwcmVjYXRpb24KICAgICAgICAgICAgb2YgdGhlIGFsbHNoYWRvd2NvZGUgcHJhZ21hLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDQvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIHJlZmVyZW5jZXMuICAgRGVjbGFyYXRpb25zIHN1Y2ggCiAgICAgICAgICAgIGFzIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNvbnN0IHN0cmluZyAmeCA9ICJIZWxsbyIpOwoKMDQvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCB0eXBlbWFwICQqIHN1YnN0aXR1dGlvbnMgZm9yIHR5cGVtYXBzIGludm9sdmluZyBhcnJheXMuCiAgICAgICAgICAgIFJlcXVlc3RlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaXMgbm93IHN1cHBvcnRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgV2hlbiB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBpcyB1c2VkLCBpdCB3aWxsIHVzZSBhIHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGlmIG9uZSBpcyBkZWZpbmVkLiAgIFRoZXJlIGFyZSBzdGlsbCBzb21lIGxpbWl0YXRpb25zLiBQYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICBBIHRlbXBsYXRlIG9mIHR5cGUgPHZvaWQgKj4gZG9lcwogICAgICAgICAgICBub3QgbWF0Y2ggYWxsIHBvaW50ZXJzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNC8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNoYW5nZSB0byB0ZW1wbGF0ZSB3cmFwcGluZyBpbnRlcm5hbHMuIFRlbXBsYXRlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHByb2Nlc3NlZCBhcyBtYWNyb3MgYnV0IG5vdyByZXN1bHQgaW4gcmVhbCBwYXJzZS10cmVlCiAgICAgICAgICAgIG5vZGVzLiAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgZXhwYW5kcyB0aGVzZSBub2RlcyBpbnRvIGEKICAgICAgICAgICAgc3BlY2lmaWMgaW5zdGFudGlhdGlvbi4gICBUaGlzIGNoYW5nZSBlbmFibGVzIGEgbnVtYmVyIG9mCiAgICAgICAgICAgIG5ldyBhbmQgaW50ZXJlc3RpbmcgY2FwYWJpbGl0aWVzOgoKICAgICAgICAgICAgRGlyZWN0aXZlcyBzdWNoIGFzICVyZW5hbWUsICVmZWF0dXJlLCBhbmQgJWFkZG1ldGhvZHMgY2FuCiAgICAgICAgICAgIG5vdyBiZSBhcHBsaWVkIHRvIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcnNpemUpIHZlY3Rvcjo6YmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqYnVmKTsKICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYsIGludCBsZW4pOyAgIC8vIFJlbmFtZWQKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjdG9yKSB2ZWN0b3I8aW50PjsgICAvLyBSZW5hbWluZyBjYXJyaWVzIHRocm91Z2gKCiAgICAgICAgICAgIAogICAgICAgICAgICBCeSBwYXJzaW5nIHRlbXBsYXRlcyBpbnRvIGFuIGludGVybmFsIGRhdGEgc3RydWN0dXJlLCBpdCB3aWxsCiAgICAgICAgICAgIGJlIHBvc3NpYmxlIHRvIHN1cHBvcnQgc3BlY2lhbGl6YXRpb24gKGFuZCBtYXliZSBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBhbmQgYSB3b3JrIGluIHByb2dyZXNzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIEluIFNXSUctMS4zLjExLCB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgd2VyZSBzaW1wbHkgcHJvY2Vzc2VkCiAgICAgICAgICAgIGFzIHdlaXJkIG1hY3Jvcy4gIE5vIG90aGVyIGluZm9ybWF0aW9uIHdhcyByZXRhaW5lZC4gICBUaGlzIAogICAgICAgICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gc3VwcG9ydCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIGFuZCAKICAgICAgICAgICAgY29tcGxpY2F0ZWQgbWFueSBvdGhlciBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24uCgowNC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byB0ZW1wbGF0ZSBjbGFzcyB3cmFwcGluZy4gICBUaGVyZSB3ZXJlIGEgdmFyaWV0eSBvZgogICAgICAgICAgICAiaXNzdWVzIiB3aXRoIHRoZSBvbGQgYXBwcm9hY2ggcmVsYXRlZCB0byBwYXJzaW5nLCB0aGUgdHlwZQogICAgICAgICAgICBzeXN0ZW0sIGFuZCBuYW1lc3BhY2VzLiAgIFRoZXNlIGNoYW5nZXMgYXJlIG1lYW50IHRvIHJlY3RpZnkKICAgICAgICAgICAgc29tZSBvZiB0aGVzZSBwcm9ibGVtczoKCiAgICAgICAgICAgIEEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBvZiBhIHRlbXBsYXRlIGNhbiBub3cgYmUgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5IGluY2x1ZGluZyB0aGUgY2xhc3MgaW5saW5lIGxpa2UgdGhpczoKIAogICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgIH52ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4gd2hhdGV2ZXIgLi4uCgkgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyBpcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgYnV0IHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMKICAgICAgICAgICAgbm90IHlldCBpbXBsZW1lbnRlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGV4cGFuZCByb3VnaGx5IGFzCiAgICAgICAgICAgIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgICAgICAlcmVuYW1lKHZlY2ludD4gdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBzaW1wbHkgYnVpbGRzIHVwb24gdGhlIGNvZGUgYWJvdmUgKHRlbXBsYXRlcwogICAgICAgICAgICBpbmNsdWRlZCBpbmxpbmUpLgoKICAgICAgICAgICAgVGhpcyBtb2RpZmllZCBhcHByb2FjaCB0byB3cmFwcGluZyBmaXhlcyBzb21lIHN1YnRsZSB0eXBlCiAgICAgICAgICAgIGlzc3Vlcy4gIEZvciBpbnN0YW5jZSwgeW91IGNhbiBub3cgZGVmaW5lIHR5cGVtYXBzIGFuZCB0eXBlZGVmcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWN0b3I7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludHZlY3RvciAqdik7ICAgLy8gR2V0cyB0aGUgYWJvdmUgdHlwZW1hcAoKICAgICAgICAgICAgVGhpcyBkaWQgbm90IHdvcmsgaW4gU1dJRy0xLjMuMTEgZHVlIHRvIGEgcGVjdWxpYXJpdHkgb2YKICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAgICAgJXRlbXBsYXRlKG5hbWUpIG5vIGxvbmdlciBpbnN0YWxscyB0aGUgdGVtcGxhdGUgYXMgYSBjbGFzcwogICAgICAgICAgICB3aXRoIG5hbWUgIm5hbWUiLiAgIFRoaXMgbWlnaHQgYnJlYWsgJWFkZG1ldGhvZHMgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgIGluIHRoZSBtYW51YWwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjaW50IHsgICAgLy8gRmFpbHMuIHZlY2ludCBub3QgYSBjbGFzcwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAKICAgICAgICAgICAgVG8gZml4IHRoaXMsIGp1c3QgdXNlIHRoZSB0ZW1wbGF0ZSBuYW1lIGluc3RlYWQ6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogVGhpcyB0ZWNobmlxdWUgbWlnaHQgYmUgYSB3YXkgdG8gaW1wbGVtZW50IHNvbWUgYml6YXJyZQogICAgICAgICAgICB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0ZWNobmlxdWVzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYXBwbGllZCBpZiB2ZWN0b3I8aW50PiBpbnN0YW50aWF0ZWQgbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICAKMDQvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4gIFNXSUcgc2hvdWxkCiAgICAgICAgICAgIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgIAogICAgICAgICAgICBOb3RlOiB3YXMgaW1wbGVtZW50ZWQgcHJldmlvdXNseSwgYnV0IHRoZXJlIHdhcyBhIG1pbm9yIGJ1Zy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgogICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGFyZSBkZXByZWNhdGVkIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUgCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgSW5zdGVhZCBvZiBiZWluZyBwcmFnbWFzLCBtdXRhYmlsaXR5IGlzIG5vdwogICAgICAgICAgICBjb250cm9sbGVkIGFzIGEgImZlYXR1cmUiIHVzaW5nIHRoZSBmb2xsb3dpbmcgdHdvIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICAgICVpbW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHg7ICAgICAgICAgICAvLyByZWFkLW9ubHkgdmFyaWFibGUKICAgICAgICAgICAgICAgICBpbnQgeTsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgICVtdXRhYmxlOwogICAgICAgICAgICAgICAgIGludCB6OyAgICAgICAgICAgLy8gTW9kaWZpYWJsZQoKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgYXJlIG11Y2ggbW9yZSBwb3dlcmZ1bCB0aGFuIHRoZWlyIG9sZGVyCiAgICAgICAgICAgIGNvdW50ZXJwYXJ0cy4gIFRoZXkgY2FuIG5vdyBwaW5wb2ludCBhIHNwZWNpZmljIGRlY2xhcmF0aW9uIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIHg7ICAgICAgICAgLyogQW55IHggKi8KICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OyAgICAvKiB4IGluIGNsYXNzIEZvbyAqLwoKICAgICAgICAgICAgSW4gZmFjdCwgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSBpcyB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZSwgCiAgICAgICAgICAgICVpZ25vcmUsIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGVjbGFyYXRpb24KICAgICAgCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIEZvbzo6eDsKCiAgICAgICAgICAgIHdvdWxkIG5vdCBvbmx5IGFwcGx5IHRvIGNsYXNzIEZvbyBidXQgdG8gYWxsIGRlcml2ZWQgY2xhc3NlcwogICAgICAgICAgICBhcyB3ZWxsLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICVpbW11dGFibGUgYW5kICVtdXRhYmxlIG11c3QgYmUgdGVybWluYXRlZCBieSBhIHNlbWktY29sb24uICBUaGlzCiAgICAgICAgICAgIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aGUgb2xkZXIgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGRpcmVjdGl2ZXMuCiAgICAgICAgICAgIFNpbmNlICVpbW11dGFibGUgYW5kICVtdXRhYmxlIGNhbiBiZSBhcHBsaWVkIHRvIGRlY2xhcmF0aW9ucyB0aGUKICAgICAgICAgICAgc2VtaWNvbG9uIGlzIG5lZWRlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZ2xvYmFsIGZlYXR1cmUgYW5kIAogICAgICAgICAgICBvbmUgdGFyZ2V0ZWQgdG8gYSBzaW5nbGUgZGVjbGFyYXRpb24uICBOb3RlOiB0aGlzIGluY29tcGF0aWJpbGl0eSBpcyB0aGUKICAgICAgICAgICAgcHJpbWFyeSByZWFzb24gZm9yIGNoYW5naW5nIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RpdmUuCgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBoYW5kbGluZyBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gIElmIGEgY2xhc3MgZGVmaW5lcyAKICAgICAgICAgICAgY29uc3RydWN0b3JzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgICBGb28oY29uc3QgRm9vICYpOyAgICAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgYSBmdW5jdGlvbiBjb3B5X0ZvbygpIGZvciB0aGUgY29weQogICAgICAgICAgICBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIEluIHByZXZpb3VzIHZlcmlvbnMsIHRoaXMgZ2VuZXJhdGVkIGEgbmFtZS1jbGFzaCBhbmQgYW4KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZS4gICBUbyBwcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgU1dJRwogICAgICAgICAgICBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yIGlmICVyZW5hbWUgaXMgdXNlZCB0byByZXNvbHZlCiAgICAgICAgICAgIHRoZSBuYW1lIGNvbmZsaWN0LiAgIEhvd2V2ZXIsIGlmIG5vIG5hbWUgcmVzb2x1dGlvbiBpcyBtYWRlLAogICAgICAgICAgICB0aGlzIG5ldyBhcHByb2FjaCBpcyB1c2VkLgoKICAgICAgICAgICAgQ29weSBjb25zdHJ1Y3RvcnMgbWF5IGJlIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UgaW4gdGhlCiAgICAgICAgICAgIHRhcmdldCBsYW5ndWFnZS4gIEhvd2V2ZXIsIHRoaXMgaXMgdXAgdG8gdGhlIGxhbmd1YWdlIG1vZHVsZQogICAgICAgICAgICBpdHNlbGYuCiAgICAgICAgICAgICAgICAgIAowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIG5vdyBuYW1lc3BhY2UgYXdhcmUuICAgVGhpcyBhbGxvd3MKICAgICAgICAgICAgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gbWF4KFQgYSwgVCBiKSB7IHJldHVybiBhID4gYiA/IGEgOiBiOyB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGZvbzsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAgIC8vIE9rCgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGJhciB7CiAgICAgICAgICAgICAgICAgICB1c2luZyBmb286Om1heDsKICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OyAgIC8vIE9rCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBDYXZlYXQ6IHRoZSB0ZW1wbGF0ZSBuYW1lIHN1cHBsaWVkIHRvICV0ZW1wbGF0ZSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlCiAgICAgICAgICAgIHNhbWUgc2NvcGUgaW4gd2hpY2ggdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXBwZWFycy4gICBUaGlzIGNvZGUgaXMKICAgICAgICAgICAgaWxsZWdhbDoKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBmb286Om1heDxpbnQ+OwoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBwcmVwcm9jZXNzb3IuICAgVGhlIHByZXByb2Nlc3NvciBjYW4gbm93IHBlcmZvcm0KICAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24uICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIEEgImhlbGxvIgogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgI2lmIEEgPT0gImhlbGxvIgogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBpcyBpbiBTV0lHIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZGVmaW5lIEZPTyh4KSAKICAgICAgICAgICAgICAjaWYgI3ggPT0gImludCIKICAgICAgICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpbnQgKi8KICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICBOb3JtYWwgdXNlcnMgY2FuIHByb2JhYmx5IHNhZmVseSBpZ25vcmUgdGhpcyBmZWF0dXJlLiAgSG93ZXZlciwgaXQgbWF5CiAgICAgICAgICAgIGJlIHVzZWQgaW4gcGFydHMgb2YgdGhlIFNXSUcgbGlicmFyeS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRnVydGhlciByZWZpbmVtZW50IG9mIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB3cmFwcGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIFNXSUcgaXMgbm93IG11Y2ggbW9yZSBhd2FyZSBvZiBwdXJlIHZpcnR1YWwgbWV0aG9kcy4gRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICBjbGFzcyBBIHsgICAgICAgICAgICAgLyogQWJzdHJhY3QgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDEoKSA9IDA7CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSA9IDA7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgeyAgLyogQWJzdHJhY3QgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDEoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgY2xhc3MgQyA6IHB1YmxpYyBCIHsgIC8qIE9rICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QyKCkgeyB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIFNXSUcgd2lsbCBvbmx5IGdlbmVyYXRlIGRlZmF1bHQgY29uc3RydWN0b3JzIGZvciBDLgogICAgICAgICAgICBFdmVuIHRob3VnaCBCIGxvb2tzIGZpbmUsIGl0J3MgbWlzc2luZyBhIHJlcXVpcmVkIG1ldGhvZCBhbmQgaXMgYWJzdHJhY3QuCgowNC8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gc3RydWN0dXJlIGRhdGEgbWVtYmVyIGFjY2Vzcy4gIElmIHlvdQogICAgICAgICAgICBoYXZlIGEgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBCYXIgICBiOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIGIgYXJlIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgKDEpIElmIGIgaXMgKm5vdCogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgRm9vX2JfZ2V0KEZvbyAqc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLT5iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdm9pZCBGb29fYl9zZXQoRm9vICpzZWxmLCBCYXIgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAoMikgSWYgYiAqaXMqIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgb3IgY2xhc3M6CgogICAgICAgICAgICAgICAgQmFyICpGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZzZWxmLT5iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdm9pZCBGb29fYl9zZXQoRm9vICpzZWxmLCBCYXIgKnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YiA9ICp2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgU2VlIHRoZSAiU3RydWN0dXJlIGRhdGEgbWVtYmVycyIgc2VjdGlvbiBvZiBEb2MvTWFudWFsL1NXSUcuaHRtbAogICAgICAgICAgICBmb3IgZnVydGhlciBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWxpZWQgb24gYSBsb3Qgb2YgYSB1bmRlY2xhcmVkCiAgICAgICAgICAgIHN0cnVjdHVyZSBhbmQgY2xhc3MgbmFtZXMuICAgIFRvIGdldCB0aGUgb2xkIGJlaGF2aW9yLCBzaW1wbHkKICAgICAgICAgICAgdXNlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBzdWNoIGFzICJzdHJ1Y3QgQmFyOyIKICAgICAgICAgICAgCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQysrIG5hbWVzcGFjZSBzdXBwb3J0IGFkZGVkLiAgU1dJRyBzdXBwb3J0cyBhbGwgYXNwZWN0cyBvZgogICAgICAgICAgICBuYW1lc3BhY2VzIGluY2x1ZGluZyBuYW1lc3BhY2UsIHVzaW5nLCBhbmQgbmFtZXNwYWNlIGFsaWFzCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICAgVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgU1dJRyBpcyB0byBmbGF0dGVuCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEhvd2V2ZXIsIG5hbWVzcGFjZXMgYXJlCiAgICAgICAgICAgIGZ1bGx5IHN1cHBvcnRlZCBhdCB0aGUgQysrIGxldmVsIGFuZCBpbiB0aGUgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAgIFNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwgZm9yIGRldGFpbHMgb24gdGhlIGltcGxlbWVudGF0aW9uLgogICAgIAowNC8wMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN1biBoYXMgbW9kaWZpZWQgamF2YWMgaW4gamRrMS40IHRvIG5vIGxvbmdlciBjb21waWxlCiAgICAgICAgICAgIGFuIGltcG9ydCBvZiBhbiB1bm5hbWVkIG5hbWVzcGFjZS4gVG8gZml4IHRoaXMgU1dJRyBubyBsb25nZXIgCiAgICAgICAgICAgIGdlbmVyYXRlcyB0aGUgaW1wb3J0IGZvciBwYWNrYWdlbGVzcyBjbGFzc2VzLgogICAgICAgICAgICBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDM2MTU3NS5odG1sCiAgICAgICAgICAgIEFzIHJlcG9ydGVkIFNGICM1Mzg0MTUuCgowMy8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgc3VwcG9ydCBmb3IgcG9pbnRlci10by1tZW1iZXIsIHNpbWlsYXIgdG8gdGhhdAogICAgICAgICAgICBmb3IgdGhlIFB5dGhvbiBtb2R1bGUuIFJlbWFya2FibHkgc2ltaWxhci4gQWxzbyBhZGRlZCBhIG5ldwogICAgICAgICAgICBleGFtcGxlIGZvciB0aGlzIChFeGFtcGxlcy9ydWJ5L21wb2ludGVyKSwgd2hpY2ggaXMgcmVtYXJrYWJseQogICAgICAgICAgICBzaW1pbGFyIHRvIHRoZSBQeXRob24gZXhhbXBsZSBvZiB0aGUgc2FtZSBuYW1lLgoKMDMvMjYvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hZGUgYSBmZXcgbWlub3IgZWRpdHMgdG8gdGhlICJBZHZhbmNlZCBUb3BpY3MiCiAgICAgICAgICAgIGNoYXB0ZXIgb2YgdGhlIFNXSUcgbWFudWFsIGFuZCBhZGRlZCBhIG5ldyBtYWpvciBzZWN0aW9uCiAgICAgICAgICAgIGFib3V0IGhvdyB0byBjcmVhdGUgbXVsdGktbW9kdWxlIFJ1YnkgcGFja2FnZXMgd2l0aCBTV0lHLgoKMDMvMjYvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlbW92ZWQgYWxsIG9mIHRoZSBvbGQgUnVieSBwcmFnbWFzLiBJZiBhbnkgb2YgdGhpcwogICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGlzIHRydWx5IG1pc3NlZCB3ZSBjYW4gcmVzdXJyZWN0IGl0LCBwcmVmZXJhYmx5CiAgICAgICAgICAgIHdpdGggc29tZSBraW5kIG9mIGZlYXR1cmUtYmFzZWQgZGlyZWN0aXZlLgogICAgICAgICAgICAKMDMvMjUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNXSUcgZXhjZXB0aW9uIGxpYnJhcnkgc3VwcG9ydCBmb3IgUnVieSwgd2hpY2gKICAgICAgICAgICAgaGFzIGFwcGFyZW50bHkgYmVlbiBicm9rZW4gZm9yIHNvbWUgdGltZS4gTHVja2lseSwgbm8gb25lIHNlZW1zCiAgICAgICAgICAgIHRvIGhhdmUgbm90aWNlZC4KCjAzLzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQysrLW5hbWVzcGFjZSBzdXBwb3J0IGluIFNXSUcgZGlyZWN0aXZlcy4KCiAgICAgICAgICAgICVhZGRtZXRob2RzOiAKCiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgbm93IGFjY2VwdHMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lCiAgICAgICAgICAgIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgQysrIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgLy8gQXR0YWNoZXMgdG8gdGhlIGNsYXNzIEZvbzo6QmFyIGJlbG93CiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgRm9vOjpCYXIgewogICAgICAgICAgICAgICAgICAgICBpbnQgc29tZW1ldGhvZCgpIHsgLi4uIH0KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgQmFyIGFib3ZlCiAgICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBvdGhlcm1ldGhvZCgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVmZWF0dXJlLCAlcmVuYW1lLCAlaWdub3JlLCAlZXhjZXB0aW9uLCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgTmFtZXNwYWNlcyBhcmUgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSByZW5hbWluZyBhbmQgZGVjbGFyYXRpb24KICAgICAgICAgICAgbWF0Y2hlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIEZvbzo6cHJpbnQ7ICAgICAgICAgIC8vIFJlbmFtZSBpbiBuYW1lc3BhY2UgRm9vCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcjo6YmxhaDsgICAgICAgICAgICAgICAvLyBJZ25vcmUgYSBkZWNsYXJhdGlvbgoKICAgICAgICAgICAgJXJlbmFtZSBkaXJlY3RpdmVzIGNhbiBiZSBwbGFjZWQgaW5zaWRlIG5hbWVzcGFjZSBibG9ja3MgYXMgd2VsbC4gRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIHByaW50OyAgICAgICAgIC8vIEFwcGxpZXMgdG8gcHJpbnQgYmVsb3cKCiAgICAgICAgICAgICAgICAgICB2b2lkIHByaW50KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW9zdCBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgc2hvdWxkIHdvcmsgcHJvcGVybHkgaW5zaWRlIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIE5vIG90aGVyIGNoYW5nZXMgYXJlIG5lZWRlZC4KICAgICAgCjAzLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIGludGVybmFsIHN5bWJvbCB0YWJsZSBoYW5kbGluZy4gICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgICBtYW5hZ2VzIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyBpbiBhIHNlcGFyYXRlIG5hbWVzcGFjZSB0aGFuIG5vcm1hbAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSBBTlNJIEMuICBUaGlzIG1lYW5zIHlvdSBjYW4ndCBoYXZlIGEgc3RydWN0dXJlCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBGb28oKSB7IC4uLiB9CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIG1vcmUgbGlrZSBDKysuICAgSXQncyBub3QgY2xlYXIgdGhhdCBTV0lHIGV2ZXIKICAgICAgICAgICAgcmVhbGx5IHN1cHBvcnRlZCB0aGUgQU5TSSBDIGFueXdheXMtLS11c2luZyB0aGUgc2FtZSBuYW1lIHdvdWxkCiAgICAgICAgICAgIGFsbW9zdCBjZXJ0YWlubHkgZ2VuZXJhdGUgYSBuYW1lLWNsYXNoIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgowMy8yMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1MTczMDIgXSBmb3IgaGFuZGxpbmcgb2YgcmVuYW1lZCBvdmVybG9hZGVkCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycy4gTm93LCByZW5hbWVkIG92ZXJsb2FkZWQgY29uc3RydWN0b3JzIGFyZSBjb252ZXJ0ZWQKICAgICAgICAgICAgaW50byBjbGFzcyBzaW5nbGV0b24gbWV0aG9kcyAoYmFzaWNhbGx5IGFjdGluZyBhcyAiZmFjdG9yeSIKICAgICAgICAgICAgbWV0aG9kcykuCgowMy8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTMyOTU3IF0gJWlnbm9yZSBwYXJzZSBlcnJvciBhbmQgY2FzdGluZyBvcGVyYXRvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowMy8xOC8yMDAyOiBiZWF6bGV5ICgqKiBBRFZBTkNFRCBVU0VSUyBPTkxZICoqKQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljIGNhc3RpbmcgaW4gcmV0dXJuIHZhbHVlcy4gIEEgc29tZXdoYXQKICAgICAgICAgICAgY29tbW9uIHByb2JsZW0gaW4gY2VydGFpbiBDKysgcHJvZ3JhbXMgaXMgZnVuY3Rpb25zIHRoYXQgaGlkZQogICAgICAgICAgICB0aGUgaWRlbnRpdHkgb2YgdW5kZXJseWluZyBvYmplY3RzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgCiAgICAgICAgICAgIGZyb20gbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGEgcHJvZ3JhbSBtaWdodCBpbmNsdWRlCiAgICAgICAgICAgIHNvbWUgZ2VuZXJpYyBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKmdldE5vZGUoKTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIE5vZGUgKiBtYXkganVzdCBiZSBiYXNlIGNsYXNzIHRvIGEgd2hvbGUgaGllcmFyY2h5CiAgICAgICAgICAgIG9mIGRpZmZlcmVudCBvYmplY3RzLiAgIEluc3RlYWQgb2YgcmV0dXJuaW5nIHRoaXMgZ2VuZXJpYyBOb2RlICosCiAgICAgICAgICAgIGl0IG1pZ2h0IGJlIG5pY2UgdG8gYXV0b21hdGljYWxseSBkb3duY2FzdCB0aGUgb2JqZWN0IGludG8gdGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHR5cGUgdXNpbmcgc29tZSBraW5kIGR5bmFtaWMgY2FzdC4KCiAgICAgICAgICAgIEFzc3VtaW5nIHlvdSB1bmRlcnN0YW5kIHRoZSBwZXJpbCBpbnZvbHZlZCwgYSBkb3duY2FzdCBjYW4gbm93CiAgICAgICAgICAgIGJlIHBlcmZvcm1lZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGluIHRoZSBydW4tdGltZSB0eXBlCiAgICAgICAgICAgIGNoZWNrZXI6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICpTV0lHX1R5cGVEeW5hbWljQ2FzdChzd2lnX3R5cGVfaW5mbyAqLCB2b2lkICoqcHRyKTsKCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIGFub3RoZXIKICAgICAgICAgICAgdHlwZS4gIElmIHNvLCBhIGRpZmZlcmVudCB0eXBlIGRlc2NyaXB0b3IgKGZvciB0aGUgY29udmVydGVkIHR5cGUpCiAgICAgICAgICAgIGlzIHJldHVybmVkLiAgIFRoaXMgdHlwZSBkZXNjcmlwdG9yIHdvdWxkIHRoZW4gYmUgdXNlZCB0byBjcmVhdGUKICAgICAgICAgICAgYSBwb2ludGVyIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgogICAgICAgICAgICBUbyB1c2UgdGhpcywgeW91IHdvdWxkIHdyaXRlIGEgdHlwZW1hcCBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqIHsKICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFNXSUdfVHlwZUR5bmFtaWNDYXN0KCQxX2Rlc2NyaXB0b3IsICh2b2lkICoqKSAmJDEpOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9IFNXSUdfTmV3UG9pbnRlck9iaigkMSwgdHkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksCgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqID0gU1dJR1RZUEUgKkRZTkFNSUM7CgogICAgICAgICAgICBUbyBtYWtlIHRoZSB0eXBlbWFwIGhhdmUgYW55IGVmZmVjdCwgeW91IGhhdmUgdG8gd3JpdGUgYSBzdXBwb3J0aW5nIAogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBwZXJmb3JtIGRvd25jYXN0aW5nLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICBzdGF0aWMgc3dpZ190eXBlX2luZm8gKgogICAgICAgICAgICAgIE5vZGVfZHluYW1pY19jYXN0KHZvaWQgKipwdHIpIHsKICAgICAgICAgICAgICAgICBOb2RlICoqbnB0ciA9IChOb2RlICoqKSBwdHI7CiAgICAgICAgICAgICAgICAgRWxlbWVudCAqZSA9IGR5bmFtaWNfY2FzdDxFbGVtZW50ICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0VsZW1lbnQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERhdGEgKmQgPSBkeW5hbWljX2Nhc3Q8RGF0YSAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9EYXRhOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIGhvdyB0eXBlcyBhcmUgZGV0ZXJtaW5lZC4gZHluYW1pY19jYXN0PD4KICAgICAgICAgICAgdXNlcyBDKysgUlRUSS4gIEhvd2V2ZXIsIGlmIHlvdSBoYWQgc29tZSBvdGhlciBtZWNoYW5pc20gZm9yIGRldGVybWluaW5nCiAgICAgICAgICAgIHRoZSB0eXBlLCB5b3UgY291bGQgdXNlIHRoYXQgaGVyZS4gIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0byBzYXZlCiAgICAgICAgICAgIHRoZSBuZXcgcG9pbnRlciB2YWx1ZSBiYWNrIGludG8gdGhlIGFyZ3VtZW50IGFzIHNob3duLiAgV2hlbiBkb3duY2FzdGluZywKICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIGNvdWxkIGNoYW5nZS4gCgogICAgICAgICAgICBGaW5hbGx5LCB0byBtYWtlIHRoZSBjYXN0aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSwgeW91IGhhdmUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgaXQgd2l0aCB0aGUgcnVuLXRpbWUgdHlwZSBjaGVja2VyLiBQdXQgdGhpcyBtYWNybyBpbiB5b3VyIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAgICAgRFlOQU1JQ19DQVNUKFNXSUdUWVBFX3BfTm9kZSwgTm9kZV9keW5hbWljX2Nhc3QpOwoKICAgICAgICAgICAgTm90ZTogdGhpcyBmZWF0dXJlIGRvZXMgbm90IGludHJvZHVjZSBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gCiAgICAgICAgICAgIG5vcm1hbCBTV0lHIG9wZXJhdGlvbi4gIFRoZSBmZWF0dXJlIGlzIG9ubHkgZW5hYmxlZCBieSB3cml0aW5nCiAgICAgICAgICAgIGEgbmV3IHR5cGVtYXAgdGhhdCBleHBsaWNpdGx5IGNhbGxzIFNXSUdfVHlwZUR5bmFtaWNDYXN0KCkgdG8KICAgICAgICAgICAgbWFrZSBhIGNvbnZlcnNpb24uIAogIAogICAgICAgICAgICBFeGFtcGxlcy90ZXN0LXN1aXRlL2R5bmFtaWNfY2FzdC5pIGNvbnRhaW5zIGEgc2ltcGxlIGV4YW1wbGUuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBKYXZhIG1vZHVsZSBkdWUgdG8gZGlmZmVyZW5jZXMKICAgICAgICAgICAgaW4gdGhlIHR5cGUtY2hlY2tpbmcgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgowMy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNtYWxsIGNoYW5nZSB0byB0eXBlLW5hbWUgaGFuZGxpbmcgb2YgdW5uYW1lZCBzdHJ1Y3R1cmVzIGFuZAogICAgICAgICAgICB0eXBlZGVmLiAgSWYgYSBzdHJ1Y3R1cmUgb2YgdGhpcyBmb3JtIGFwcGVhcnM6CgogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgVGhlbiAnRm9vJyBpcyB1c2VkIGFzIHRoZSBwcm9wZXIgdHlwZW5hbWUgZm9yIHRoZSBzdHJ1Y3R1cmUuCiAgICAgICAgICAgIEZ1cnRoZXJtb3JlLCBGb28gY2FuIG5vdyBiZSB1c2VkIGFzIGEgbmFtZSBpbiBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIFNXSUcgd2FzIGFscmVhZHkga2luZCBvZiBkb2luZyB0aGlzLCBidXQgdGhpcyBtb2RpZmljYXRpb24gcmVmaW5lcwogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gdG8gbW9yZSBjbG9zZWx5IGZvbGxvdyB0aGUgQysrIEFSTSwgc2VjdGlvbgogICAgICAgICAgICA3LjEuMywgcC4gMTA2LiAgVGhpcyBmaXhlcyBhIGNvdXBsZSBvZiBvYnNjdXJlIGNvcm5lciBjYXNlcy4KCjAzLzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgQysrIGluaGVyaXRhbmNlIHdpdGggYSBmZXcgZW5oYW5jZW1lbnRzLiAgRmlyc3QsIHR5cGUgaW5mb3JtYXRpb24KICAgICAgICAgICAgbmVlZGVkIGZvciBjYXN0aW5nIGFuZCB0eXBlLWVxdWl2YWxlbmNlIGlzIGdlbmVyYXRlZCBldmVuIHdoZW4gYmFzZS1jbGFzc2VzCiAgICAgICAgICAgIGFyZW4ndCBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyICB7ICAgIC8qIEJhciB1bnNwZWNpZmllZCAqLwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB2b2lkIGJsYWgoQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJsYWgoKSBmdW5jdGlvbiBzdGlsbCBhY2NlcHRzIEZvbyAqIGV2ZW4gdGhvdWdoIG5vdGhpbmcKICAgICAgICAgICAgaXMgcmVhbGx5IGtub3duIGFib3V0IEJhci4gICBQcmV2aW91cyBTV0lHIHZlcnNpb25zIHdvdWxkIGp1c3QgZ2VuZXJhdGUKICAgICAgICAgICAgYSB0eXBlIGVycm9yLgoKICAgICAgICAgICAgSW5oZXJpdGFuY2UgaGFzIGFsc28gYmVlbiBtb2RpZmllZCB0byB3b3JrIHRocm91Z2ggdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgQmFyIE90aGVyQmFyOwogICAgICAgICAgICAgICBjbGFzcyBGb286IHB1YmxpYyBPdGhlckJhciB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJhc2UgY2xhc3Mgb2YgT3RoZXJCYXIgaXMgY29ycmVjdGx5IHJlc29sdmVkIGJhY2sgdG8KICAgICAgICAgICAgQmFyLiAgIFRoZSB1c2Ugb2YgdGhlIG5hbWUgT3RoZXJCYXIgaXMgbG9zdCBpbiB0aGlzIHJlc29sdXRpb24gKHRoZSB3cmFwcGVycwogICAgICAgICAgICB3aWxsIHNpbXBseSB1c2UgQmFyIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBPdGhlckJhcikuCiAgICAgICAgICAgCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXR5cGVtYXAsICVhcHBseSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBjYW4gbm93IGFwcGVhciBpbnNpZGUKICAgICAgICAgICAgY2xhc3MgZGVmaW5pdGlvbnMuICAgCgowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyByZWxhdGVkIHRvIGNvbXBpbGluZyBTV0lHIG9uIDY0LWJpdAogICAgICAgICAgICBwbGF0Zm9ybXMuCgowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCAiaWdub3JlIiBhbmQgImluIiB0eXBlbWFwcy4gIExvY2FsIHZhcmlhYmxlcwogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggImluIiB3ZXJlIGJlaW5nIGFkZGVkIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIHRoZXkgd2VyZSBuZXZlciB1c2VkLiAgIE1vc3RseSBoYXJtbGVzcywgYnV0IGl0IHdvdWxkIGxlYWQKICAgICAgICAgICAgdG8gYSB2YXJpZXR5IG9mIGNvbXBpbGF0aW9uIHdhcm5pbmdzLgogIAowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byB0aGUgaW50ZXJuYWwgdHlwZSBzeXN0ZW0gYW5kIGhhbmRsaW5nIG9mIG5lc3RlZCBDKysKICAgICAgICAgICAgdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzb21lbWV0aG9kKEJsYWggeCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3b3VsZCBpbXBsaWNpdGx5IGJlIHNldCB0byBCYXI6OkJsYWguCiAgICAgICAgICAgIEFsdGhvdWdoIHRoaXMgaXMgdGVjaG5pY2FsbHkgYWxsb3dlZCwgaXQgYnJlYWtzIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb286OkJsYWggeyAuLi4gfQoKICAgICAgICAgICAgZG9lc24ndCBtYXRjaCBsaWtlIHlvdSBleHBlY3QuICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGluIFNXSUctMS4zLjEyLgogICAgICAgICAgICBOb3csIHR5cGVzIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY2xhc3MgaW4gd2hpY2ggdGhleSB3ZXJlIGRlZmluZWQuCiAgICAgICAgICAgIFNvLCB0aGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd2lsbCBiZSBGb286OkJsYWgtLS1zaW5jZSB0aGUKICAgICAgICAgICAgdHlwZSBCbGFoIHdhcyBkZWZpbmVkIGluIEZvby4KIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgc3VidGxlIHR5cGUgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHR5cGVkZWYgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgQmxhaDsKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhCbGFoIHgsIDo6QmxhaCB5KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsIGNoYW5nZSB0byBoYW5kbGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KICAgICAgICAgICAgRmlyc3QsIHRoZXJlIGlzIG5vIHBvcnRhYmxlIG9yIHJlbGlhYmxlIHdheSB0byB3cmFwCiAgICAgICAgICAgIGEgdmFyYXJncyBmdW5jdGlvbiBpbiBmdWxsIGdlbmVyYWxpdHkuICBIb3dldmVyLCB5b3UgKmNhbiogY2hhbmdlCiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgdXNpbmcgJXZhcmFyZ3MuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICopIGZwcmludGY7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCAuLi4pOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcmFtZXRlciAiLi4uIiBpcwogICAgICAgICAgICBzaW1wbHkgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gJXZhcmFyZ3MuIFRoaXMKICAgICAgICAgICAgcmVzdWx0cyBpbiBhIGZ1bmN0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIGNoYXIgKnMpOwoKICAgICAgICAgICAgTW9yZSB0aGFuIG9uZSBhcmd1bWVudCBjYW4gYmUgdXNlZCBhbmQgZGVmYXVsdCB2YWx1ZXMKICAgICAgICAgICAgY2FuIGJlIGRlZmluZWQuICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIHNwZWNpZmllcyBhCiAgICAgICAgICAgIG1heGltdW0gb2YgZm91ciBhcmd1bWVudHMuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICp4MSA9IDAsIGNoYXIgKngyID0gMCwgY2hhciAqeDMgPSAwLCBjaGFyICp4NCA9IDApIGZwcmludGY7CiAKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byBoYW5kbGluZyBvZiB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLiAgdmFyYXJncwogICAgICAgICAgICBpcyBub3cgaGFuZGxlZCBhcyBhIHByb3BlciBwYXJhbWV0ZXIgYW5kIGlzIHBhc3NlZCB0byB0aGUKICAgICAgICAgICAgY29kZSBnZW5lcmF0b3IuICBIb3dldmVyLCBpdCBzdGlsbCBjYW4ndCBiZSBoYW5kbGVkIGNvcnJlY3RseQogICAgICAgICAgICAoYW5kIHdpbGwgZ2VuZXJhdGUgYSB0eXBlbWFwIHdhcm5pbmcpLiAgIFRoaXMgY2hhbmdlIGhhcyBiZWVuCiAgICAgICAgICAgIG1hZGUgdG8gYmV0dGVyIGluY29ycG9yYXRlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMgd2l0aCBvdGhlcgogICAgICAgICAgICBkaXJlY3RpdmVzIHN1Y2ggYXMgJWlnbm9yZSwgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MjI1NTUgXSBTeW50YXggZXJyb3IgcGFyc2luZyAiZGVmaW5lIiBjb25zdHJ1Y3QuIFNXSUcKICAgICAgICAgICAgaXMgYSBsaXR0bGUgbW9yZSByZXN0cmljdGl2ZSBpbiBkZXRlcm1pbmluZyAjZGVmaW5lIHN0YXRlbWVudHMKICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHdyYXBwZWQgYXMgY29uc3RhbnRzLiAgQWxzbyBhZGRlZCBhIGJldHRlciBwYXJzZXIKICAgICAgICAgICAgZXJyb3IgcnVsZSBmb3IgaGFuZGxpbmcgYmFkIGNvbnN0YW50cy4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogQ2xhc3NlcyByZW5hbWVkIHdpdGggJXJlbmFtZSB0aGF0IGFyZSBkZXJpdmVkIGZyb20gCiAgICAgICAgICAgIGFub3RoZXIgY2xhc3MgZ2VuZXJhdGUgbW9yZSBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgY29kZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgU0YgWyAjNTIzNjMyIF0gYW5kIFsgIzUxMzMzNSBdIGJvdGggcmVwb3J0ZWQgYnkgSXNyYWVsIAogICAgICAgICAgICBUYW5uZXIuIFN1cHBvcnQgZm9yIHR5cGVzIHRoYXQgYXJlIHVzZWQgd2hpY2ggYXJlIGluIGEgdHlwZWRlZi4gVGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBuYW1lIGlzIGdlbmVyYXRlZC4gQWxzbyBnZW5lcmF0ZWQgY29ycmVjdAogICAgICAgICAgICBzaGFkb3cgY2xhc3NuYW1lIHdoZW4gYSB0ZW1wbGF0ZWQgY2xhc3MgaXMgdXNlZCB3aXRoaW4gYW5vdGhlciAKICAgICAgICAgICAgdGVtcGxhdGVkIGNsYXNzLiBTZWUgdGhlIGNwcF90eXBlZGVmLmkgdGVzdGNhc2UuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIHR5cGUgd2FzIGdlbmVyYXRlZCBpbiBzaGFkb3cgY2xhc3NlcyBmb3IgdHlwZXMgCiAgICAgICAgICAgIHRoYXQgd2VyZW4ndCB3cmFwcGVkIGJ5IFNXSUcuICBUaGUgdHlwZSBpcyB0cmVhdGVkIGFzIGEgcmF3IAogICAgICAgICAgICBwb2ludGVyLCBpZSBubyBzaGFkb3cgY2xhc3MuCgowMi8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSB1c2VkIGJ5ICVyZW5hbWUsICVpZ25vcmUsIGFuZAogICAgICAgICAgICAlZmVhdHVyZS4gICBJZiBhIHR5cGUgc2lnbmF0dXJlIGlzIHN1cHBsaWVkLCBpdCBtdXN0IGV4YWN0bHkKICAgICAgICAgICAgbWF0Y2ggdGhhdCB1c2VkIGluIHRoZSBkZWNsYXJhdGlvbi0tLWluY2x1ZGluZyBhbnkgdXNlIG9mCiAgICAgICAgICAgIGNvbnN0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb28xKSAgIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgJXJlbmFtZShiYXIxKSAgIGJhcihpbnQpIGNvbnN0OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsgICAgICAgLy8gTWF0Y2hlZCAtLT4gZm9vMQogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KSBjb25zdDsgLy8gTm90IG1hdGNoZWQgCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOyAgICAgICAvLyBOb3QgbWF0Y2hlZAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KSBjb25zdDsgLy8gTWF0Y2hlZCAtLT4gYmFyMQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgbm9uLWNvbnN0IHNwZWNpZmljYXRpb24gd291bGQgbWF0Y2gKICAgICAgICAgICAgYm90aCB0aGUgbm9uLWNvbnN0IGFuZCBjb25zdCBkZWNsYXJhdGlvbnMuICBIb3dldmVyLCB0aGUgd2hvbGUKICAgICAgICAgICAgcG9pbnQgb2YgJXJlbmFtZSBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGlzIHRoYXQgdGhleSBiZSBhYmxlCiAgICAgICAgICAgIHRvIHByZWNpc2VseSBwaW5wb2ludCBleGFjdCBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgVGhpcwogICAgICAgICAgICBmaXhlcyB0aGUgcHJvYmxlbS4KCjAyLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGhhbmRsaW5nIG9mIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3JzLgogICAgICAgICAgICBTV0lHIG5vdyBtYWtlcyBhIHByZWxpbWluYXJ5IHBhc3Mgb3ZlciB0aGUgcGFyc2UgdHJlZSB0byBkaXNjb3ZlcgogICAgICAgICAgICB3aGljaCBjbGFzc2VzIHN1cHBvcnQgZGVmYXVsdCBhbGxvY2F0aW9uLiAgIFRoaXMgZml4ZXMgYSBudW1iZXIKICAgICAgICAgICAgb2YgdmVyeSBzdWJ0bGUgaXNzdWVzIGluIGNvZGUgZ2VuZXJhdGlvbiBhbmQgY2FsbC9yZXR1cm4gYnkgdmFsdWUuCgowMi8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBvbiBDeWd3aW46IFBlcmwsIFB5dGhvbiwgVGNsLCBSdWJ5IGFuZCBKYXZhIHNob3VsZAogICAgICAgICAgICB3b3JrIG91dCBvZiB0aGUgYm94LCBiYXJyaW5nIHRoZSBydW50aW1lIGxpYnJhcnkuIFJlbW92ZWQgZGxsd3JhcCAKICAgICAgICAgICAgYW5kIHJlcGxhY2VkIHdpdGggbmV3bHkgd29ya2luZyBnY2MgLXNoYXJlZCBpbnN0ZWFkIGZvciBDeWd3aW4uIAogICAgICAgICAgICBBbGwgdGhpcyB3aWxsIHJlcXVpcmUgdGhlIG5ldyBpbXByb3ZlZCBiaW51dGlscyAyMDAxMDgwMiBhbmQgbGF0ZXIsCiAgICAgICAgICAgIGJ1dCB0aGUgbGF0ZXN0IEN5Z3dpbiBpcyB1c3VhbGx5IHRoZSBiZXN0IHJlY29tbWVuZGF0aW9uLgoKMDIvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICBhbmQgUGVybCBzaGFkb3cgY2xhc3Nlcy4gUmVwb3J0ZWQgYnkgQ2hpYS1saWFuZyBLYW8uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZpeCB0byB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciBDKysgY2xhc3MKICAgICAgICAgICAgY29uc3RydWN0b3JzIHNvIHRoYXQgd2UgZ2V0IGJvdGggYSAibmV3IiBzaW5nbGV0b24gbWV0aG9kCiAgICAgICAgICAgIGFuZCBhbiAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvciBlYWNoIGNsYXNzLiBUaGlzCiAgICAgICAgICAgIGNoYW5nZSBlbmFibGVzIGRldmVsb3BlcnMgdG8gZGVyaXZlIG5ldyBSdWJ5IGNsYXNzZXMgZnJvbQogICAgICAgICAgICBTV0lHLXdyYXBwZWQgQysrIGNsYXNzZXMgYW5kIHRoZW4gb3ZlcnJpZGUgdGhlaXIgaW5pdGlhbGl6ZQogICAgICAgICAgICBtZXRob2RzIHRvIHByb3ZpZGUgc3ViY2xhc3Mtc3BlY2lmaWMgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFzc2l2ZSBkb2N1bWVudGF0aW9uIHVwZGF0ZSBmb3IgdGhlIFJ1YnkgbW9kdWxlLAogICAgICAgICAgICBjb250cmlidXRlZCBieSBDcmFpZyBGaWxlcy4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBBbiBlcnJvciBpbiB0aGUgU1dJRyBydW50aW1lIHN1cHBvcnQgZm9yIFJ1YnkKICAgICAgICAgICAgd2FzIGNhdXNpbmcgc2V2ZXJhbCBvZiB0aGUgZXhhbXBsZXMgdG8gZmFpbC4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogRW51bWVyYXRpb25zIGRlZmluZWQgd2l0aGluIGEgY2xhc3MgKHN1Y2gKICAgICAgICAgICAgYXMgdGhvc2Ugc2VlbiBpbiB0aGUgRXhhbXBsZXMvcnVieS9lbnVtIGV4YW1wbGUpIHdlcmUgbm90CiAgICAgICAgICAgIGJlaW5nIGV4cG9ydGVkIHdpdGggdGhlIGNvcnJlY3QgbmFtZXMuIFJlcG9ydGVkIGJ5IFdpbGxpYW0KICAgICAgICAgICAgRnVsdG9uLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIHdoZW4gd2UgcnVuIGFjcm9zcyBvdmVybG9hZGVkCiAgICAgICAgICAgIGNsYXNzIGNvbnN0cnVjdG9ycyBmb3IgQysrIGNvZGUsIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgbm90CiAgICAgICAgICAgIHN1cHBvcnRlZCAoZXZlbiBpZiB0aGUgb3ZlcmxvYWRzIGhhdmUgYmVlbiAlcmVuYW1lZCkuIEZvciBhbgogICAgICAgICAgICBleGFtcGxlIG9mIHdoZXJlIHRoaXMgZG9lc24ndCB3b3JrLCBzZWUgRXhhbXBsZXMvcnVieS9vcGVyYXRvci4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhbiAiaWdub3JlZCIgd2FybmluZyBtZXNzYWdlIHdoZW4gdGhlIHBhcnNlciBydW5zCiAgICAgICAgICAgIGFjcm9zcyBhbiBvcGVyYXRvciE9KCkgZGVjbGFyYXRpb24gZm9yIEMrKyBjb2RlLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiaW1wb3J0IiwgImltcG9ydF90ZW1wbGF0ZSIsICJvcGVyYXRvciIgYW5kCiAgICAgICAgICAgICJ0ZW1wbGF0ZSIgZXhhbXBsZXMuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbXVsdGktbW9kdWxlIHN1cHBvcnQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIG1pc3NpbmcgIiNkZWZpbmUgU1dJR19OT0lOQ0xVREUiIGF0IHRoZSB0b3Agb2YKICAgICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSB3aGVuIHRoZSAnLWMnIG9wdGlvbiBpcyB1c2VkLgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgQ29ycmVjdGVkIGEgbWlub3Igb2ZmLWJ5LW9uZSBlcnJvciBmb3IgdGhlIHNpemUgb2YgdGhlCiAgICAgICAgICAgIHN3aWdfdHlwZXNbXSBhcnJheSB0aGF0J3MgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyIGNvZGUuCgowMi8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFNGIFsgIzUxNTA1OCBdIFdyb25nIGNvZGUgZm9yIEMrKyB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgpWZXJzaW9uIDEuMy4xMSAoSmFudWFyeSAzMSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBwYXNzL3JldHVybiBieSB2YWx1ZSBmb3IgQysrIG9iamVjdHMgdGhhdCBkZWZpbmUKICAgICAgICAgICAgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgdG8gdGhlIHR5cGVtYXAgc3lzdGVtCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byB3cmFwIEMrKyBvYmplY3RzIHdpdGggbm8gZGVmYXVsdAogICAgICAgICAgICBjb25zdHJ1Y3Rvci4gICBUaGlzIGhhcyBiZWVuIGZpeGVkLCBidXQgdGhlIHNvbHV0aW9uIAogICAgICAgICAgICBpbnZvbHZlcyBzb21lIGNsZXZlciB0ZW1wbGF0ZSBtYWdpYyBjb250cmlidXRlZCBieSAKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uICBQbGVhc2Ugc2VlIHRoZSBjb21tZW50cyBpbiB0aGUgZmlsZQogICAgICAgICAgICBMaWIvc3dpZy5zd2cgZm9yIGZ1cnRoZXIgZGV0YWlscy4gIFRoaXMgc29sdXRpb24gaXMKICAgICAgICAgICAgZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmVmaW5lZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBHbG9iYWwgdmFyaWFibGVzIGFuZCBtZW1iZXIgZGF0YSBvZiB0eXBlICJjb25zdCBjaGFyICoiCiAgICAgICAgICAgIGNhbiBiZSBzZXQsIGJ1dCB0aGUgb2xkIHZhbHVlIGlzIHNpbGVudGx5IGRpc2NhcmRlZCB3aXRob3V0CiAgICAgICAgICAgIGFueSBnYXJiYWdlIGNvbGxlY3Rpb24uICAgVGhpcyBtYXkgZ2VuZXJhdGUgYSBtZW1vcnkgbGVhay4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgbmVlZGVkIHRvIG1vcmUgc2FmZWx5IGhhbmRsZSB2YXJpYWJsZXMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvbyA9ICJIZWxsbyBXb3JsZFxuIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQncyBub3Qgc2FmZSB0byBmcmVlIHRoZSBvbGQgdmFsdWUuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIGNhbiBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIG5ldyB2YWx1ZSBhbmQgbWFrZSBmb28gcG9pbnQKICAgICAgICAgICAgdG8gaXQuICAgVG8gZml4IHRoaXMgbWVtb3J5IGxlYWssIHlvdSBjYW4gcHJvYmFibHkgZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjbGVhciBjb25zdCBjaGFyICpmb287CiAgICAgICAgICAgICAgICVhcHBseSBjaGFyICoge2NvbnN0IGNoYXIgKmZvb307CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG1pbm9yIHR5cGVtYXAgZW5oYW5jZW1lbnRzIGhhdmUgYmVlbiBhZGRlZC4gIEZpcnN0LAogICAgICAgICAgICB0eXBlbWFwcyBjYW4gaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgaW5jbHVkaW5nIGEgc3BlY2lhbAogICAgICAgICAgICB3YXJuaW5nIGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoaW4sd2FybmluZz0iSSdtIGdvaW5nIHRvIGRvIHNvbWV0aGluZyBkYW5nZXJvdXMiKSAuLi4KCiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBzaG93IHVwIHdoZW5ldmVyIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFwcGxpZWQuCgogICAgICAgICAgICBTZWNvbmQsIGEgdHlwZW1hcCBjYW4gZm9yY2UgYSBuby1tYXRjaCBieSBkZWZpbmluZwoKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzb21ldHlwZSAicGFzcyI7CgogICAgICAgICAgICBJZiB0aGlzIGlzIHVzZWQsIHRoZSB0eXBlbWFwIHN5c3RlbSB3aWxsICpub3QqIHJlY29yZCBhCiAgICAgICAgICAgIHR5cGVtYXAgbWF0Y2ggZm9yICJzb21ldHlwZSIuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBibG9jawogICAgICAgICAgICBzZWxlY3RlZCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGRpc2FibGUKICAgICAgICAgICAgYSB0eXBlbWFwIGZlYXR1cmUgZm9yIHNvbWUgdHlwZSwgeW91IGNvdWxkIGRvIHRoaXMuCgogICAgICAgICAgICAgICAvLyBEbyBub3QgYWxsb3cgZ2xvYmFsIHZhcmlhYmxlcyBvZiB0eXBlICdjb25zdCBjaGFyIConIHRvIGJlIHNldC4KICAgICAgICAgICAgICAgJXR5cGVtYXAodmFyaW4pIGNvbnN0IGNoYXIgKiAicGFzcyI7CgogICAgICAgICAgICBJdCBtaWdodCBhbHNvIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIHRvIGRvIHN1YnRsZSBhbmQKICAgICAgICAgICAgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgIG1ha2UgJ2JsYWggKicgYW4gb3V0cHV0IHZhbHVlIGFuZCAnY29uc3QgYmxhaCAqJyBhbiBpbnB1dAogICAgICAgICAgICBwYXJhbWV0ZXIsIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgYmxhaCAqKGJsYWggdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogQmxvY2sgdW5xdWFsaWZpZWQgdHlwZW1hcHMgZGVmaW5lZCBhYm92ZSAqLwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pICAgICBjb25zdCBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgaW5wdXQgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgKFRoaXMgcG90ZW50aWFsIGFwcGxpY2F0aW9ucyBvZiB0eXBlbWFwcyBzdWdnZXN0ZWQgYnkgR3JlZyBTdGVpbikuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzI5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyBlbnVtZXJhdGlvbnMgd2VyZSB3cmFwcGVkIHdoZW4gdGhlIC1zaGFkb3cgCiAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLiBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKMDEvMjgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEdsb2JhbCBhcnJheXMgYXJlIHN1Y2Nlc3NmdWxseSB3cmFwcGVkLiBJbiBmYWN0IHRoZXkgc3RhcnRlZAogICAgICAgICAgIG1vc3RseSB3b3JraW5nIGluIFNXSUctMS4zLjEwLgoKMDEvMjgvMjAwMjpyaWNoYXJkcAoJICAgQWRkZWQgZmlyc3QgYXR0ZW1wdCBhdCBDKysgYW5kIC1zaGFkb3cgc3VwcG9ydCBmb3IgUEhQNCBtb2R1bGUsCgkgICBwbGVhc2UgdGVzdCBhbmQgbWFpbCBtZSBpZiBhbnkgcHJvYmxlbXMvaWRlYXMgb24gaW1wcm92aW5nIGl0LgoKCSAgIFRoZXJlIGlzIGEga25vd24gcHJvYmxlbSB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtYmVyIHZhcmlhYmxlcywKCSAgIHBsZWFzZSBzZWUgRXhhbXBsZXMvcGhwNC9zeW5jL1JFQURNRSBmb3IgZGV0YWlscy4KCgkgICBBbHNvIG1vcmUgUEhQIGRvY3VtZW50YXRpb24gYWRkZWQgdG8gRG9jL01hbnVhbC9QaHAuaHRtbAoKMDEvMjcvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgVGhlIEFOU0kgQyBzaXplX3QgdHlwZSBpcyBub3cgcmVjb2duaXplZCBhcyBhbiBpbnRlZ2VyIGJ5IGRlZmF1bHQuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyBzdXBwb3J0IGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICBUaGlzIGlzIG5vdCBhIHBvcnRhYmxlIGZlYXR1cmUgYW5kIHdpbGwgcmVxdWlyZSBjb21waWxlciBzdXBwb3J0CiAgICAgICAgICAgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gIEluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAogICAgICAgICAgIGxvbmcgbG9uZyAoZS5nLiwgVGNsIGFuZCBQZXJsKSwgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgc3RyaW5nCiAgICAgICAgICAgb2YgZGlnaXRzLiAgVGhpcyBwcmV2ZW50cyB0aGVpciB1c2UgaW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbnMsIGJ1dAogICAgICAgICAgIHN0aWxsIGFsbG93cyB2YWx1ZXMgdG8gYmUgc2V0IGZyb20gYSBzdHJpbmcuICAKCiAgICAgICAgICAgbG9uZyBsb25nIHN1cHBvcnQgcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgc3RydG9sbCgpIGFuZCBzdHJ0b3VsbCgpCiAgICAgICAgICAgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlICdsbGQnIGFuZCAnbGx1JyBmb3JtYXQgc3BlY2lmaWVycwogICAgICAgICAgIG9mIHNwcmludGYoKS4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzUwMTgyNyBdIERlbGV0ZSBtZXRob2QgaXMgbm90IGNhbGxlZC4gICBUaGUgVGNsCiAgICAgICAgICAgbW9kdWxlIHdhc24ndCBjb3JyZWN0bHkgY2FsbGluZyBkZXN0cnVjdG9ycyB3aGVuIHRoZXkKICAgICAgICAgICB3ZXJlIGRlZmluZWQgdXNpbmcgJWFkZG1ldGhvZHMuICBUaGlzIGhhcyBiZWVuIGZpeGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFJlaW5oYXJkIEZvYmJlLgoKMDEvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZy4gIFR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIGEgbnVtYmVyIG9mIG1vZHVsZXMgZm9yIGhhbmRsaW5nIHRoZXNlIHR5cGVzLgogICAgICAgICAgIEluIGFkZGl0aW9uLCB0aGUgcGFyc2VyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGFjY2VwdCBsb25nIGxvbmcKICAgICAgICAgICBsaXRlcmFscyBzdWNoIGFzIDEyMzRMTCBhbmQgMTIzNFVMTC4KCjAxLzI3LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBBIEMgY2hhcltdIGlzIG1hcHBlZCB0byBhIEphdmEgU3RyaW5nIHdoaWNoIGlzIHRoZSBkZWZhdWx0IAogICAgICAgICAgIFNXSUcgaGFuZGxpbmcgb2YgY2hhcltdIGFuZCBjaGFyKi4gSXQgdXNlZCB0byBiZSBtYXBwZWQgdG8gYnl0ZVtdLiAKICAgICAgICAgICBOb3RlIHRoYXQgYSBDIHNpZ25lZCBjaGFyW10gYXJyYXkgaXMgbWFwcGVkIHRvIGJ5dGVbXS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowMS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggcmV0dXJuLWJ5LXZhbHVlLCBDKyssIGFuZAogICAgICAgICAgIG9iamVjdHMgdGhhdCBkZWZpbmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2VsIFJlZWQuCgowMS8yNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gT3ZlcmhhdWwgb2YgdGhlIEphdmEgbW9kdWxlLiBUaGUgQyBjb2RlIGdlbmVyYXRpb24gaXMgbm93IAogICAgICAgICAgIGRvbmUgZnJvbSB0eXBlbWFwcy4KCjAxLzI0LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBTdXBwb3J0IGZvciBhcnJheXMgb2YgZW51bSBwb2ludGVycwoKMDEvMjAvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEVycm9yIGNoZWNraW5nIGZvciBudWxsIEphdmEgb2JqZWN0cyBiZWluZyBwYXNzZWQgdG8gbmF0aXZlIAogICAgICAgICAgIGZ1bmN0aW9ucy4gIEV4Y2VwdGlvbiB0aHJvd24gbm93IHdoZXJlYXMgYmVmb3JlIHRoZSBKVk0gY3Jhc2hlZC4KCjAxLzE4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDb3JyZWN0ZWQgYmVoYXZpb3VyIGZvciBmdW5jdGlvbnMgdGhhdCB0YWtlIGFycmF5cy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIHdoZW4gdGhpcyBjIGZ1bmN0aW9uOiAKCiAgICAgICAgICAgdm9pZCBhcnJheWZuKGludCBhcnJheVtdKTsKICAgICAgICAgICAKICAgICAgICAgICBpcyB3cmFwcGVkIHRoZSBjb3JyZXNwb25kaW5nIG5hdGl2ZSBmdW5jdGlvbgoKICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGFycmF5Zm4oaW50W10gYXJyYXkpOwoKICAgICAgICAgICBpcyBwcm9kdWNlZC4gUHJldmlvdXNseSBpZiB0aGUgQyBmdW5jdGlvbiBtYWRlIGFueSBjaGFuZ2VzIHRvIHRoZSAKICAgICAgICAgICBhcnJheSBlbGVtZW50cywgdGhlc2Ugd2VyZSBub3QgcmVmbGVjdGVkIGJhY2sgaW50byB0aGUgSmF2YSBhcnJheS4gCiAgICAgICAgICAgVGhpcyBoYXMgbm93IGJlZW4gY29ycmVjdGVkIHNvIHRoYXQgdGhlIGNoYW5nZXMgYXJlIHByb3BvZ2F0ZWQgYmFjawogICAgICAgICAgIHRvIEphdmEgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHdpbGwgc2VlIHRoZXNlIGNoYW5nZXMuIFRoaXMgaXMgCiAgICAgICAgICAgaG93IHB1cmUgSmF2YSBmdW5jdGlvbnMgd29yaywgaWUgYXJyYXlzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgoKMDEvMTUvMjAwMjpta29lcHBlCiAgICAgICAgICAgW0d1aWxlXSBOZXcgZmlsZSBjcGx1c3BsdXMuaSB3aXRoIEMrKyB0eXBlbWFwcyBjb250cmlidXRlZAogICAgICAgICAgIGJ5IE1hcmNpbyBMdWlzIFRlaXhlaXJhIDxtYXJjaW90QGhvbGx5LmNvbG9zdGF0ZS5lZHU+LgoKMDEvMTEvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENoYW5nZWQgbWFwcGluZyBvZiBDIGxvbmcgdG8gSmF2YSB0eXBlLiBXYXMgbWFwcGVkIHRvIEphdmEKICAgICAgICAgICBsb25nLCBub3cgbWFwcGVkIHRvIEphdmEgaW50LiBJZiB5b3Ugd2FudCB0aGUgcHJldmlvdXMgbWFwcGluZyB0byAKICAgICAgICAgICBKYXZhIGxvbmcgdXNlIHRoaXMgYXBwcm9hY2ggaW4geW91ciBpbnRlcmZhY2UgZmlsZToKICAgICAgICAgICAKICAgICAgICAgICAgICVjbGVhciBsb25nOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nICAgICAgICAgICAgICJqbG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nICAgICAgICAgICAibG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZyAgICAgICAgICAibG9uZyIKCiAgICAgICAgICAgICAlY2xlYXIgbG9uZ1tBTlldOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nW0FOWV0gICAgICAgICJqbG9uZ0FycmF5IgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmdbQU5ZXSAgICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmdbQU5ZXSAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBsb25nW0FOWV0gICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGxvbmdbQU5ZXSAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBsb25nW0FOWV0gICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGxvbmdbQU5ZXSAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBUaGlzIG5ldyBtYXBwaW5nIGlzIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiBpbnRlcmZhY2luZyB0byAzMiBiaXQgCiAgICAgICAgICAgYXBwbGljYXRpb25zIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBjdXJyZW50IDMyLWJpdCBKVk1zLiBGb3IgZnV0dXJlIAogICAgICAgICAgIDY0LWJpdCBKVk1zIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlc2UgbWFwcGluZ3MgLSBlZyBvbiBVbml4IExQNjQgCiAgICAgICAgICAgc3lzdGVtcywgYnV0IG5vdCBvbiBNaWNyb3NvZnQgNjRiaXQgV2luZG93cyB3aGljaCB3aWxsIGJlIHVzaW5nIGEgCiAgICAgICAgICAgUDY0IElMMzIgbW9kZWwuIFRoaXMgbWF5IGJlIGF1dG9tYXRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNXSUcuCgowMS8xMC8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbIDUwMTY3NyBdICVpbml0IGJsb2NrIGluIHdyb25nIHBsYWNlLiBSZXBvcnRlZAogICAgICAgICAgIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDEvMDkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIERlZmF1bHQgc3VwcG9ydCBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiBzaWduZWQgbG9uZyBsb25nIGlzIAogICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgbG9uZy4gdW5zaWduZWQgbG9uZyBsb25nIGlzIG1hcHBlZCB0byBCaWdJbnRlZ2VyLgoKMDEvMDkvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRXhwZXJpbWVudGFsIGNoYW5nZSB0byBwYXJzZXIgdG8gYmV0dGVyIHN1cHBvcnQgbWl4aW5nIG9mCiAgICAgICAgICAgaW50LCBsb25nLCBzaG9ydCwgdW5zaWduZWQsIGZsb2F0LCBhbmQgZG91YmxlLiAgIFRoZSBwYXJzZXIKICAgICAgICAgICBzaG91bGQgbm93IHN1cHBvcnQgdHlwZXMgbGlrZSB0aGlzOgogICAgCiAgICAgICAgICAgICAgICBzaG9ydCB1bnNpZ25lZCBpbnQKICAgICAgICAgICAgICAgIGludCAgIHVuc2lnbmVkIHNob3J0CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaG9ydAoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmFibGVzIGEgdHlwZSBvZiAnbG9uZyBkb3VibGUnIChwcmV2aW91c2x5CiAgICAgICAgICAgIHVuc3VwcG9ydGVkKSB0byBiZSB1c2VkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2FzdGluZyBmaXggZm9yIHdoZW4gZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSBwb2ludGVyIGFzIAogICAgICAgICAgIHJlcG9ydGVkIGJ5IEdhcnkgUGVubmluZ3RvbiAyMDAyLTAxLTA1LiBUaGUgdXBwZXIgMzJiaXRzIG9mIHRoZSAKICAgICAgICAgICA2NCBiaXQgamxvbmcgd2lsbCBoYXZlIGNvbnRhaW5lZCBqdW5rIGZvciAzMmJpdCBwb2ludGVycy4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgcG9pbnRlciBoYW5kbGluZyBpbiBKYXZhIGlzIHBvc3NpYmxlIGFzIHRoZSAKICAgICAgICAgICBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBoYXZlIGJlZW4gYWRkZWQgaW50byB0eXBlbWFwcy5pLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdICRudWxsIGNhbiBiZSB1c2VkIGluIGlucHV0IHR5cGVtYXBzIHRvIHJldHVybiBlYXJseSBmcm9tIEpOSSAKICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBoYXZlIGVpdGhlciB2b2lkIG9yIGEgbm9uLXZvaWQgcmV0dXJuIHR5cGUuIEV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2spIGludCAqICV7IAogICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAlfQoKICAgICAgICAgICBJZiB0aGUgdHlwZW1hcCBnZXRzIHB1dCBpbnRvIGEgZnVuY3Rpb24gd2l0aCB2b2lkIGFzIHJldHVybiwgJG51bGwgCiAgICAgICAgICAgd2lsbCBleHBhbmQgdG8gbm90aGluZzoKCiAgICAgICAgICAgICB2b2lkIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3RoZXJ3aXNlICRudWxsIGV4cGFuZHMgdG8gemVybywgd2hlcmUgamF2YXJldHVybnR5cGUgaXMgZWl0aGVyIGEgCiAgICAgICAgICAgcG9pbnRlciBvciBhIHByaW1pdGl2ZSB0eXBlOgoKICAgICAgICAgICAgIGphdmFyZXR1cm50eXBlIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgowMS8wMi8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gVGhlIEphdmEgbW9kdWxlIGluY29ycmVjdGx5IHVzZWQgYXJnb3V0IHR5cGVtYXBzIGZvciAKICAgICAgICAgICBzdHJpbmdzLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQgYW5kIHRoZSBjb2RlIG5vdyByZXNpZGVzCiAgICAgICAgICAgaW4gdGhlIGZyZWVhcmcgdHlwZW1hcC4gVGhlIGFyZ291dCBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gc3BsaXQgaW50byAKICAgICAgICAgICBhcmdvdXQgYW5kIGZyZWVhcmcgdHlwZW1hcHMuIFRoaXMgY29ycmVjdGlvbiBtYXkgcmVxdWlyZSBzb21lIHVzZXIgCiAgICAgICAgICAgd3JpdHRlbiB0eXBlbWFwcyB0byBiZSBtb2RpZmllZC4gCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gTXVsdGkgdHlwZW1hcHMgbm93IHdvcmtpbmcgZm9yIEphdmEgc2VlIG11bHRpbWFwIGV4YW1wbGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgLSBmcmVlYXJnIHR5cGVtYXAgY29kZSB3YXMgYXBwZWFyaW5nCiAgICAgICAgICAgYmVmb3JlIHRoZSBmdW5jdGlvbiBjYWxsLgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEpDQUxMIG1hY3JvIGZvciBKTkkgY2FsbHMgdGhhdCB3b3JrIGluIGJvdGggQyBhbmQgQysrIHR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggSkNBTEwwLCBKQ0FMTDEsIEpDQUxMMiwgSkNBTEwzIGFuZCBKQ0FMTDQgCiAgICAgICAgICAgbWFjcm9zLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUmVzb2x2ZWQgc29tZSBpbmNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCAlcmVuYW1lIGFuZCBjbGFzcyByZW5hbWluZy4KICAgICAgICAgICBJZiB5b3Ugc3BlY2lmeSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAgQmFyOwoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGVuIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBhcHBsaWVzIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwKICAgICAgICAgICBhbmQgdGhlIGRlc3RydWN0b3IgKGFsbCB3aWxsIGJlIHJlbmFtZWQgdG8gRm9vKS4KCiAgICAgICAgICAgSWYgYSBjbGFzcyBkZWZpbmVzIG1vcmUgdGhhbiBvbmUgY29uc3RydWN0b3IsIHRoZSBvdmVybG9hZGVkIHZhcmlhbnRzCiAgICAgICAgICAgY2FuIHN0aWxsIGJlIHJlbmFtZWQgYnkgc3BlY2lmeWluZyBwYXJhbWV0ZXJzIHRvICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVyZW5hbWUoQmFyX2NvcHkpIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGVyZSBhcmUgc3RpbGwgc29tZSBvZGQgY29ybmVyIGNhc2VzLiAgSWYgeW91IHNwZWNpZnkKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSA6OkJhcjsKCiAgICAgICAgICAgdGhlbiBvbmx5IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBjaGFuZ2VkIGFuZCB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgogICAgICAgICAgIG5hbWVzIGFyZSBsZWZ0IHVubW9kaWZpZWQuICBJZiB5b3Ugc3BlY2lmeSAKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAqOjpCYXI7CgogICAgICAgICAgIHRoZW4gdGhlIG5hbWVzIG9mIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZ1bmN0aW9ucyBhcmUgbW9kaWZpZWQgYnV0CiAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdC4KCjEyLzIxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBqbmksIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMgbm8gbG9uZ2VyIGhhcmRjb2RlZCBidXQgcmVhbCAKICAgICAgICAgICB0eXBlbWFwcy4gTmV3IHZhcmlhYmxlIHN1YnN0aXR1dGlvbiwgJGphdmFjbGFzc25hbWUsIGNhbiBiZSB1c2VkIGluCiAgICAgICAgICAgdGhlIGpzdHlwZSB0eXBlbWFwcy4gSXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgSmF2YSBzaGFkb3cgY2xhc3MgbmFtZQogICAgICAgICAgIHdoZXJlIGFwcGxpY2FibGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgdG8gZG8gd2l0aCBpbmhlcml0YW5jZSB3aGVuIAogICAgICAgICAgIHVzaW5nICVpbXBvcnQuCiAgICAgICAgICAgW0phdmFdIEEgZmV3IG1vcmUgYnVnIGZpeGVzLCB0b2RvIHdpdGggJXJlbmFtZSBhbmQgdXNpbmcgdGhlIGtpbmQKICAgICAgICAgICB3aXRoIHRoZSB0eXBlLCBlZyAKICAgICAgICAgICB2b2lkIGZuKHVuaW9uIHVuaSBteXVuaSwgc3RydWN0IHN0ciBteXN0ciwgY2xhc3MgY2wgbXljbCk7CgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0OTQ1MjQgXSBQcmVwcm9jZXNzb3IgYnVnIC0gYXBvc3Ryb3BoZSBhbmQgI3N1YnN0LgoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgU1dJR19WRVJTSU9OIHByZXByb2Nlc3NvciBzeW1ib2wuICAgVGhpcyBpcyBhIGhleGFkZWNpbWFsCiAgICAgICAgICAgaW50ZWdlciBzdWNoIGFzIDB4MDEwMzExIChjb3JyZXNwb25kaW5nIHRvIFNXSUctMS4zLjExKS4gIFRoaXMgY2FuCiAgICAgICAgICAgYmUgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAjaWYgU1dJR19WRVJTSU9OID49IDB4MDEwMzExCiAgICAgICAgICAgICAgIC8qIFVzZSBzb21lIGZhbmN5IG5ldyBmZWF0dXJlICovCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICBOb3RlOiBUaGUgdmVyc2lvbiBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCBTV0lHCiAgICAgICAgICAgd3JhcHBlciBmaWxlLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMi8yMC8yMDAxOm1rb2VwcGUKCSAgIFtNelNjaGVtZV06IFJlbmFtZWQgbXpzd2lnX21ha2VfYm9vbGVhbiB0bwoJICAgc3dpZ19tYWtlX2Jvb2xlYW4sIGFzIHRoZSBsYXR0ZXIgaXMgdXNlZCBpbiB0aGUgdHlwZW1hcHMuCgkgICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjEyLzE3LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogUmV3cm90ZSBsaXN0LXZlY3Rvci5pIHVzaW5nIG11bHRpLWRpc3BhdGNoCgkgICB0eXBlbWFwcy4gIFVwZGF0ZWQgcG9pbnRlci1pbi1vdXQuaS4gIE1ha2UgdGhlCgkgICBkZXByZWNhdGVkIHR5cGVtYXAtc3Vic3RpdHV0aW9uIG9mICIkc291cmNlIiBpbiAiYXJnb3V0IgoJICAgd29yayBhcyBiZWZvcmUuCgoxMi8xNi8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIG1hY3JvcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgJW11bHRpcGxlX3ZhbHVlcyB0byB1c2UgdGhlIHByb3BlciAlcHJhZ21hIHN5bnRheC4gIE5ldwoJICAgR3VpbGUgZXhhbXBsZS90ZXN0ICJtdWx0aXZhbHVlIjsgbmV3IEd1aWxlIHJ1bi10ZXN0IGZvcgoJICAgdGVzdC1zdWl0ZSBpdGVtICJsaXN0LXZlY3RvciIgKGN1cnJlbnRseSBicm9rZW4pLgoKMTIvMTQvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCB0eXBlbWFwLXN1YnN0aXRpb24gYnVnIGZvciAidmFyaW4iLiAgUmVsYXhlZAoJICAgdmFsaWQtaWRlbnRpZmllciBjaGVjayB0byBhbGxvdyBhbGwgUjVSUyBpZGVudGlmaWVycy4KCgpWZXJzaW9uIDEuMy4xMCAoRGVjZW1iZXIgMTAsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkICV0eXBlbWFwIHNvIHRoYXQgJXsgLi4uICV9IGNhbiBhbHNvIGJlIHVzZWQgYXMgYQogICAgICAgICAgIGNvZGUgYmxvY2sgKG1vc3RseSBmb3IgY29tcGxldGVuZXNzKS4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggJXsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGlzIGZvcm0gZG9lcyBub3QgaW50cm9kdWNlIGEgbmV3IGJsb2NrIHNjb3BlLiAgQWxzbywgdGhlCiAgICAgICAgICAgY29kZSBlbmNsb3NlZCBpbiAleyAuLi4gJX0gaXMgbm90IHByb2Nlc3NlZCBieSB0aGUgcHJlcHJvY2Vzc29yLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDU5NjE0IF0gU1dJRyB3aXRoIG11bHRpcGxlIFRDTCBpbnRlcnByZXRlcnMuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTcxNDEgXSBydWJ5ZGVjLnN3ZyBpcyB3cm9uZwogICAgICAgICAgIFJlcG9ydGVkIGJ5IFBhdWwgQnJhbm5hbi4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxMDU1NyBdIFByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyBvbiBOVC4KICAgICAgICAgICBSZXBvcnRlZCBieSBNYWdudXMgTGp1bmcuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NDUyMzMgXSBFbmhhbmNlbWVudDogaGFuZGxlIGFjY2VzcyBjaGFuZ2UuCiAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIChidXQgaWdub3JlcykgQysrIGFjY2VzcyBjaGFuZ2VzIGZvciB0aGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoKSB7IH0KICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEEoKSB7fQogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBjbGFzcyBCIDogcHJpdmF0ZSBBIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEIoKSA6IEEoKSB7IH0KICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIEE6OnNvbWV0aGluZzsgICAgPC0tLS0gUGFyc2VkLCBidXQgaWdub3JlZAogICAgICAgICAgICAgfTsKIAogICAgICAgICAgIFN1Z2dlc3RlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMTIvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgRml4IGZvciBSdWJ5IHRvIHdvcmsgdXNpbmcgVmlzdWFsIEMrKy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ2NTY4NyBdIHVuc2lnbmVkIHNob3J0IHBhcmFtZXRlcnMgZmFpbC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODk1OTQgXSBQeVN0cmluZ19Gcm9tU3RyaW5nIGNhbid0IHRha2UgTlVMTCBhcmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9obiBNZXJyaXR0LiAgIFNXSUcgbm93IGNvbnZlcnRzIHN0cmluZyB2YWx1ZXMKICAgICAgICAgICB0byBQeXRob24gdXNpbmcgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgIHJlc3VsdG9iaiA9IHJlc3VsdCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0KSA6IFB5X0J1aWxkVmFsdWUoIiIpOwoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDYzNTYxIF0gVHlwZSBjb252ZXJzaW9ucyBub3QgZ2VuZXJhdGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCQoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzAyMTcgXSBUY2wgZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MjA4OCBdIGRlZmluZWQoTUFDUk8pIGV4cGFuZGVkIGV2ZXJ5d2hlcmUuCiAgICAgICAgICAgRW1iZWRkZWQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgc3VjaCBhcwoKICAgICAgICAgICAgICAlI2lmIGRlZmluZWQoRk9PKQoKICAgICAgICAgICBhcmUgbm90IGV4cGFuZGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzY0NjcgXSBQcm9ibGVtcyB3aXRoICNkZWZpbmUgJiBjb21tYXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0Nzc1NDcgXSB3cm9uZyBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBCYWQgcHJvdG90eXBlcyBpbiBMaWIvdGNsL3B0cmxhbmcuaS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4MzE4MiBdIENvbnN0YW50cyBjYW4gdGFrZSBhcmdzIGJ5IG1pc3Rha2UuIAogICAgICAgICAgIFdoZW4gc3dpZyAtcGVybDUgLWNvbnN0IGlzIHVzZWQsIGNvbnN0YW50cyBhcmUgZGVjbGFyZWQKICAgICAgICAgICB3aXRoIGEgdm9pZCBwcm90b3R5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdWIgSUNPTlNUICgpIHsgJGV4YW1wbGVjOjpJQ09OU1QgfQoKICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgUmljaCBXYWxlcy4KCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIE5ldyAlZXhjZXB0aW9uIGRpcmVjdGl2ZS4gICBUaGlzIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgJWV4Y2VwdC4KICAgICAgICAgICBJdCB3b3JrcyBpbiBleGFjdGx5IHRoZSBzYW1lIG1hbm5lciBleGNlcHQgaXQgZG9lcyBub3QgYWNjZXB0IGEgCiAgICAgICAgICAgbGFuZ3VhZ2Ugc3BlY2lmaWVyLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICBjYXRjaChTb21lRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICBlcnJvcgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgICVleGNlcHRpb24gaXMgYWxzbyBuYW1lIGF3YXJlLS0tYWxsb3dpbmcgaXQgdG8gYmUgYXBwbGllZCB0bwogICAgICAgICAgIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBhbnkgZnVuY3Rpb24vbWV0aG9kIGZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyKGRvdWJsZSkgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyKGRvdWJsZSkgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIHNlbWFudGljcyBvZiB0aGlzIG5hbWUgbWF0Y2hpbmcgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnN0YW50aWFsIGNsZWFudXAgb2YgdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgY29kZS4gIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgdXNlZCB0byBiZSBjcmVhdGVkIGluIHRoaXMgcmF0aGVyIGNvbXBsaWNhdGVkIG1hbm5lciBpbnZvbHZpbmcgYWJvdXQKICAgICAgICAgICBhIGhhbGYtZG96ZW4gc3RyaW5ncyBjcmVhdGVkIGluIGJpdHMgYW5kIHBpZWNlcy4gICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkIGluIGEgbW9yZSBzdHJhaWdodGZvcndhcmQgbWFubmVyLS1pbiB0aGUgc2FtZQogICAgICAgICAgIG9yZGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoZSBvcmRlciBpbiB3aGljaCBkZWNsYXJhdGlvbnMgYXBwZWFyIGluIHRoZSBzaGFkb3cgZmlsZSBtYXkgZGlmZmVyLgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJWluc2VydCBkaXJlY3RpdmUgKCV7IC4uLiAlfSwgJXJ1bnRpbWUsICVoZWFkZXIsICV3cmFwcGVyLCBldGMuKQogICAgICAgICAgIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiAgIFRoaXMgaGFzIHBvdGVudGlhbAogICAgICAgICAgIHVzZXMgd2hlbiBnZW5lcmF0aW5nIHNoYWRvdyBjbGFzcyBjb2RlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICVpbnNlcnQoInNoYWRvdyIpICV7CiAgICAgICAgICAgICAgICAgIyBTb21lIHB5dGhvbiBjb2RlCiAgICAgICAgICAgICAgICAgZGVmIGJsYWgoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICBwcmludCAiSSdtIGJsYWghIgogICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBzdXBwb3J0IGZvciBjbGFzcyBjb2RlIGluc2VydGlvbiBkZXBlbmRzIG9uIHRoZSBsYW5ndWFnZSBtb2R1bGUuCiAgICAgICAgICAgSG93ZXZlciwgdGhlIGludGVudCBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gc2ltcGxpZnkgdGhlIHRhc2sgb2YgZXh0ZW5kaW5nCiAgICAgICAgICAgc2hhZG93IGNsYXNzIGNvZGUuICAgSW4gdGhlIFB5dGhvbiBtb2R1bGUsIHRoaXMgaW5zZXJ0cyBjb2RlIHdpdGggdGhlCiAgICAgICAgICAgcHJvcGVyIGxldmVsIG9mIGluZGVuZGF0aW9uIChyZWdhcmRsZXNzIG9mIHdoYXQgd2FzIHVzZWQgaW4gdGhlIFNXSUcKICAgICAgICAgICBpbnRlcmZhY2UpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIEphdmEgYW5kIFB5dGhvbiBtb2R1bGVzIHRvIHdvcmsgb24gY3lnd2luLgogICAgICAgICAgIFVuZm9ydHVuYXRlbHkgYSBsb3Qgb2YgdGhlIHB5dGhvbiBtb2R1bGUgaGFzIHN0YXJ0ZWQgdG8gcHJvZHVjZXMgY29kZSAKICAgICAgICAgICB3aGljaCBjYW5ub3QgYmUgYXV0by1pbXBvcnRlZCB1c2luZyBjeWd3aW4gbGlidG9vbHMgc28gbW9zdCBvZiBpdCBpcyAKICAgICAgICAgICBzdGlsbCBicm9rZW4uCgoxMS8yOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJXJlbmFtZSBhbmQgJWZlYXR1cmUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUKICAgICAgICAgICBvZiBhIGNsYXNzIGRlZmluaXRpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29faSkgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIHRoaXMgbWFubmVyLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgb25seSBhcHBsaWVzCiAgICAgICAgICAgdG8gbWVtYmVycyBvZiB0aGUgY2xhc3MgaW4gd2hpY2ggaXQgYXBwZWFycyBhcyB3ZWxsIGFzIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3Nlcy4gIEluIGZhY3QsIHRoaXMgaXMgcmVhbGx5IGp1c3QgdGhlIHNhbWUKICAgICAgICAgICBhcyBzYXlpbmc6CgogICAgICAgICAgICAgJXJlbmFtZShmb29faSkgRm9vOjpmb28oaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIEZvbzo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCB0aGUgZXhwZXJpbWVudGFsICVmZWF0dXJlIGRpcmVjdGl2ZS4gICVmZWF0dXJlIGNhbiBiZQogICAgICAgICAgIHVzZWQgdG8gYXR0YWNoIGFyYml0cmFyeSBzdHJpbmcgYXR0cmlidXRlcyB0byBwYXJzZSB0cmVlIG5vZGVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGJsYWggewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICB3aGF0ZXZlcjsgICAgICAKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2V0IikgKjo6eF9zZXQgIngiOwoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiYmxhaCIpIEZvbzo6YmFyKGludCxkb3VibGUpIGNvbnN0ICJzcGFtIjsKCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBib3Jyb3dlZCBmcm9tIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4gIEluIGZhY3QsIHRoZQogICAgICAgICAgIGV4YWN0IHNhbWUgc2VtYW50aWNzIGFwcGx5IChpbmhlcml0YW5jZSwgbWF0Y2hpbmcsIGV0Yy4pLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBhIHZlcnkgcG93ZXJmdWwgbG93LWxldmVsIHByaW1pdGl2ZSB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICAgY3VzdG9taXplIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgdG8gcHJvdmlkZSBoaW50cyB0byAKICAgICAgICAgICBhbnkgc3RhZ2Ugb2YgY29kZSBnZW5lcmF0aW9uLiAgIEZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0bwogICAgICAgICAgIHBhcnNlIHRyZWUgbm9kZXMgYXMgYXR0cmlidXRlcyB3aXRoIG5hbWVzIGxpa2UgImZlYXR1cmU6KiIgd2hlcmUgKiAKICAgICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgZmVhdHVyZSBuYW1lIChlLmcuLCAiZmVhdHVyZTpleGNlcHQiLCAiZmVhdHVyZTpzZXQiLCAKICAgICAgICAgICBldGMuKS4gICBMYW5ndWFnZSBtb2R1bGVzIGNhbiB0aGVuIGxvb2sgZm9yIHRoZSBmZWF0dXJlcyB1c2luZyAKICAgICAgICAgICBhIHNpbXBsZSBhdHRyaWJ1dGUgbG9va3VwLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBpbnRlbmRlZCB0byBiZSBhIHJlcGxhY2VtZW50IGZvciBhIG51bWJlciBvZgogICAgICAgICAgIG9sZGVyIFNXSUcgZGlyZWN0aXZlcyBpbmNsdWRpbmcgJWV4Y2VwdCBhbmQgc3BlY2lhbGl6ZWQKICAgICAgICAgICBwcmFnbWFzLiBJdCBpcyBtb3JlIHBvd2VyZnVsIChkdWUgdG8gaXRzIHBhcmFtZXRlcml6ZWQKICAgICAgICAgICBuYW1lIG1hdGNoaW5nKSBhbmQgaXQgcHJvdmlkZXMgdmVyeSBwcmVjaXNlIGNvbnRyb2wgb3ZlcgogICAgICAgICAgIGhvdyBjdXN0b21pemF0aW9uIGZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0byBpbmRpdmlkdWFsCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgIFRoZXJlIGFyZSBmdXR1cmUgZXhwYW5zaW9uIHBsYW5zIHRoYXQgd2lsbAogICAgICAgICAgIGJ1aWxkIHVwb24gdGhpcyBjYXBhYmlsaXR5IGFzIHdlbGwuCgogICAgICAgICAgIEl0J3Mgbm90IGNlcnRhaW4gdGhhdCAlZmVhdHVyZSB3aWxsIGV2ZXIgYmUgdXNlZCBkaXJlY3RseQogICAgICAgICAgIGJ5IFNXSUcgdXNlcnMuICBJbnN0ZWFkLCBpdCBtYXkgYmUgYSBsb3ctbGV2ZWwgcHJpbWl0aXZlCiAgICAgICAgICAgdGhhdCBpcyB1c2VkIGluIGhpZ2gtbGV2ZWwgbWFjcm8gZGVmaW5pdGlvbnMuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgdG8gc3VwcG9ydCBwcm9wZXJ0aWVzLCB5b3UgbWlnaHQgZGVmaW5lIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAlZGVmaW5lICVwcm9wZXJ0eShuYW1lLCBzZXRmLCBnZXRmKQogICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSBzZXRmICNuYW1lOwogICAgICAgICAgICVmZWF0dXJlKCJnZXQiKSBnZXRmICNuYW1lOwogICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgV2hpY2ggYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICVwcm9wZXJ0eShwLCBnZXRfcCwgc2V0X3ApOwoKICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgaW50ICBnZXRfcCgpOwogICAgICAgICAgICAgIHZvaWQgc2V0X3AoaW50KTsKICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogIAoxMS8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgVGNsIG1vZHVsZSBoYXMgYmVlbiBleHBhbmRlZCB3aXRoIHNvbWUgbmV3IGZlYXR1cmVzIGZvcgogICAgICAgICAgIG1hbmFnaW5nIG9iamVjdCBvd25lcnNoaXAuICBGb3IgZXhhbXBsZToKICAgICAgICAgCiAgICAgICAgICAgICAgICBzZXQgYyBbQ2lyY2xlIC1hcmdzIDIwXQogICAgICAgICAgICAgICAgJGMgYXJlYSAgICAgICAgICAgICAjIEludm9rZSBhIG1ldGhvZAogICAgICAgICAgICAgICAgJGMgLWRpc293biAgICAgICAgICAjIFJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CiAgICAgICAgICAgICAgICAkYyAtYWNxdWlyZSAgICAgICAgICMgQWNxdWlyZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKCiAgICAgICAgICAgSWYgVGNsIG93bnMgdGhlIG9iamVjdCwgaXRzIGRlc3RydWN0b3IgaXMgaW52b2tlZCB3aGVuIHRoZSAKICAgICAgICAgICBjb3JyZXNwb25kaW5nIG9iamVjdCBjb21tYW5kIGlzIGRlbGV0ZWQgaW4gVGNsLiAgCgogICAgICAgICAgIFRvIHNpbXBsaWZ5IHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLCB0aGUgZm9sbG93aW5nIHN5bnRheAogICAgICAgICAgIGNhbiBiZSB1c2VkOgoKICAgICAgICAgICAgICAgICRjIC1kZWxldGUgICAgICAgICAjIERlbGV0ZSBhbiBvYmplY3QKCiAgICAgICAgICAgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBmb3IgdGhlIG1vcmUgb2JzY3VyZSB2YXJpYW50IG9mIAoKICAgICAgICAgICAgICAgIHJlbmFtZSAkYyB7fQoKICAgICAgICAgICBUaGVzZSBmZWF0dXJlcyBhbHNvIGFkZCBmdW5jdGlvbmFsaXR5IGF0IHRoZSBDIEFQSSBsZXZlbC4KICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYW5hZ2Ugb3duZXJzaGlwIGZyb20gQyBhbmQKICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcy4KCiAgICAgICAgICAgICAgICBTV0lHX0FjcXVpcmUodm9pZCAqcHRyKTsKICAgICAgICAgICAgICAgIFNXSUdfRGlzb3duKHZvaWQgKnB0cik7CgogICAgICAgICAgIEEgbmV3IGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgaW5zdGFuY2VzIGlzIGFsc28gYXZhaWxhYmxlOgoKICAgICAgICAgICAgICAgIFRjbF9PYmogKgogICAgICAgICAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaihUY2xfSW50ZXJwICppbnRlcnAsIHZvaWQgKnB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5cGUsIGludCBvd24pOwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gYSB0eXBlbWFwLCB0aGlzIGNyZWF0ZXMgYSBwb2ludGVyIG9iamVjdCBhbmQKICAgICAgICAgICBhbiBpbnRlcnByZXRlciBjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gaXNzdWUgbWV0aG9kcyBhbmQKICAgICAgICAgICBhY2Nlc3MgYXR0cmlidXRlcyBhcyBzaG93biBhYm92ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFsbCBQeXRob24tcmVsYXRlZCAlcHJhZ21hIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQuCiAgICAgICAgICAgTW9zdCBvZiB0aGVzZSB3ZXJlIHdyaXR0ZW4gZm9yIG9sZGVyIFNXSUcgdmVyc2lvbnMgaW4gb3JkZXIgdG8KICAgICAgICAgICBjb21wZW5zYXRlIGZvciBsaW1pdGF0aW9ucyBpbiBlYXJsaWVyIHJlbGVhc2VzLiAgSW4gYW4gZWZmb3J0CiAgICAgICAgICAgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgY29kZS1jbHV0dGVyIGFuZCBwb3RlbnRpYWwgZm9yIGVycm9ycywKICAgICAgICAgICBpdCBpcyBlYXNpZXIgdG8gc2ltcGx5IGVsaW1pbmF0ZSB0aGUgcHJhZ21hcyBhbmQgdG8gc3RhcnQgb3ZlcgogICAgICAgICAgIChpZiBuZWVkZWQpLiAgVG8gYmUgaG9uZXN0LCBJJ20gbm90IGV2ZW4gc3VyZSB0aGUgcHJhZ21hcwogICAgICAgICAgIHdvcmtlZCBpbiAxLjMuOSBhbmQgcmVjZW50IHJlbGVhc2VzLgoKICAgICAgICAgICBOb3RlOiBJZiB5b3UgbmVlZCB0byBpbnNlcnQgY29kZSBpbnRvIHRoZSBzaGFkb3cgY2xhc3MgZmlsZQogICAgICAgICAgIGNyZWF0ZWQgYnkgU1dJRywgc2ltcGx5IHVzZSB0aGUgJXNoYWRvdyBkaXJlY3RpdmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlc2hhZG93ICV7CiAgICAgICAgICAgICAgZGVmIHNvbWVfcHl0aG9uX2NvZGUoKTogICAgICAgICAKICAgICAgICAgICAgICAgICAgcHJpbnQgImJsYWghIgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3dlZXBpbmcgY2hhbmdlcyB0byB0aGUgd2F5IGluIHdoaWNoIHRoZSBQeXRob24gbW9kdWxlIGhhbmRsZXMKICAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4gICBJbiBlYXJseSBpbXBsZW1lbnRhdGlvbnMsIHNoYWRvdyBjbGFzc2VzIHdlcmUKICAgICAgICAgICBtZXJlbHkgUHl0aG9uIHdyYXBwZXJzIGFyb3VuZCB0eXBlZCBwb2ludGVyIG9iamVjdHMuIEhvd2V2ZXIsIAogICAgICAgICAgIHNvbWUgdXNlcnMgYWN0dWFsbHkgd2FudGVkIHRvIHJlY2VpdmUgdGhlIHNoYWRvdyBjbGFzcyBvYmplY3QgaW4gQy4KICAgICAgICAgICBUbyBhY2NvbW1vZGF0ZSB0aGlzLCB0aGUgZGVyZWZlcmVuY2luZyBvZiB0aGUgInRoaXMiIHBvaW50ZXIgaW4KICAgICAgICAgICBhIHNoYWRvdyBjbGFzcyB3YXMgbW92ZWQgdG8gQyBhcyBkZXNjcmliZWQgaW4gQ0hBTkdFUyBbOC84Lzk5XS4KICAgICAgICAgICBIb3dldmVyLCB0aGUgcHJvY2VzcyBvZiByZXR1cm5pbmcgcG9pbnRlcnMgdG8gUHl0aG9uIHdhcyBzdGlsbAogICAgICAgICAgIHNvbWV3aGF0IHByb2JsZW1hdGljLiAgU3BlY2lmaWNhbGx5LCBzaGFkb3cgY2xhc3NlcyBuZXZlciB3b3JrZWQKICAgICAgICAgICBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgdGhlc2U6CgogICAgICAgICAgICAgLSAgIFVzZSBvZiBhbnkga2luZCBvZiBvdXRwdXQgdHlwZW1hcCAoJ291dCcgb3IgJ2FyZ291dCcpCiAgICAgICAgICAgICAtICAgR2xvYmFsIHZhcmlhYmxlcyAoYnJva2VuIGFzIGZhciBhcyBJIGNhbiB0ZWxsKS4KCiAgICAgICAgICAgSW4gdGhlIHBhc3QsIHNvbWUgdXNlcnMgaGF2ZSBkZWFsdCB3aXRoIHRoaXMgYnkgbWFudWFsbHkgdHJ5aW5nCiAgICAgICAgICAgdG8gY3JlYXRlIHNoYWRvdyBjbGFzcyBvYmplY3RzIHRoZW1zZWx2ZXMgZnJvbSBDL0MrKy4gIEhvd2V2ZXIsCiAgICAgICAgICAgdGhpcyB3YXMgZGlmZmljdWx0IGJlY2F1c2UgdGhlIEMgd3JhcHBlcnMgZG9uJ3QgcmVhbGx5IGtub3cgaG93CiAgICAgICAgICAgdG8gZ2V0IGFjY2VzcyB0byB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gY2xhc3MuCgogICAgICAgICAgIFRoZSBQeXRob24gbW9kdWxlIGhhcyBub3cgYmVlbiBtb2RpZmllZCB0byBhdXRvbWF0aWNhbGx5IGF0dGFjaAogICAgICAgICAgIHNoYWRvdyBjbGFzcyBvYmplY3RzIHRvIHBvaW50ZXJzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgdG8gCiAgICAgICAgICAgUHl0aG9uLiAgIFRoaXMgcHJvY2VzcyBvY2N1cnMgaW4gdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iaigpCiAgICAgICAgICAgc28gdGhlIHByb2Nlc3MgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCB0byB1c2Vycy4gICAgQXMgYSByZXN1bHQsCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMgYXJlIG5vdyBtb3JlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCB3aXRoIHR5cGVtYXBzCiAgICAgICAgICAgYW5kIG90aGVyIGZlYXR1cmVzIG9mIFNXSUcuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBpbnRyb2R1Y2UgYSBudW1iZXIgb2YgaW5jb21wYXRpYmlsaXRpZXMuICBUaGUKICAgICAgICAgICBTV0lHX05ld1BvaW50ZXJPYmooKSBub3cgdGFrZXMgYW4gZXh0cmEgcGFyYW1ldGVyICJvd24iIHRvIAogICAgICAgICAgIGluZGljYXRlIG9iamVjdCBvd25lcnNoaXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXR1cm4gYSBwb2ludGVyCiAgICAgICAgICAgdG8gUHl0aG9uIHRoYXQgUHl0aG9uIHNob3VsZCBkZXN0cm95LiAgIEluIGFkZGl0aW9uLCBvbGRlciBjb2RlCiAgICAgICAgICAgdGhhdCB0cmllcyB0byBtYW51YWxseSBjb25zdHJ1Y3Qgc2hhZG93IGNsYXNzIG9iamVjdHMgb3Igd2hpY2gKICAgICAgICAgICBleHBlY3RzIGJhcmUgcG9pbnRlcnMgbWF5IGJyZWFrLS0tc3VjaCBwb2ludGVycyBtYXkgYWxyZWFkeSBiZQogICAgICAgICAgIGVuY2Fwc3VsYXRlZCBieSBhIHNoYWRvdyBjbGFzcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSAlaW5zZXJ0IGRpcmVjdGl2ZSB0byBhY2NlcHQgc2luZ2xlIGJyYWNlcyB7IC4uLiB9LgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbnNlcnQoImhlYWRlciIpIHsKICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICV7IC4uLiAlfSBleGNlcHQgdGhhdCB0aGUgY29kZSBpbiB0aGUKICAgICAgICAgICBicmFjZXMgaXMgcHJvY2Vzc2VkIHVzaW5nIHRoZSBwcmVwcm9jZXNzb3IuICAgVGhpcyBjYW4gYmUgdXNlZnVsCiAgICAgICAgICAgaW4gY2VydGFpbiBjb250ZXh0cyBzdWNoIGFzIGxvdy1sZXZlbCBjb2RlIGdlbmVyYXRpb24gaW4gCiAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBub3cgdHJhbnNsYXRlZCBpbnRvIHByZXByb2Nlc3NvcgogICAgICAgICAgIHN5bWJvbHMuICBGb3IgZXhhbXBsZToKCQogICAgICAgICAgICAgIC4vc3dpZyAtcHl0aG9uIC1zaGFkb3cgLW1vZHVsZSBibGFoIGludGVyZmFjZS5pCgogICAgICAgICAgIENyZWF0ZXMgdGhlIHN5bWJvbHM6CgogICAgICAgICAgICAgIFNXSUdPUFRfUFlUSE9OIDEKICAgICAgICAgICAgICBTV0lHT1BUX1NIQURPVyAxCiAgICAgICAgICAgICAgU1dJR09QVF9NT0RVTEUgYmxhaAogICAgICAgICAgICAgIAogICAgICAgICAgIE1vZHVsZXMgY2FuIGxvb2sgZm9yIHRoZXNlIHN5bWJvbHMgdG8gYWx0ZXIgdGhlaXIgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgaWYgbmVlZGVkLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBQZXJsNSBtb2R1bGUuICBBIGxvdCBvZiBjb2RlIGdlbmVyYXRpb24gaXMKICAgICAgICAgICBub3cgZHJpdmVuIGJ5IHRhYmxlcyBhbmQgdHlwZW1hcHMuICAgVGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgCiAgICAgICAgICAgYWxzbyBtYWtlcyB1c2Ugb2YgdGFibGVzIHRvIGluc3RhbGwgY29uc3RhbnRzLCB2YXJpYWJsZXMsIGFuZAogICAgICAgICAgIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGlubGluaW5nIGEgYnVuY2ggb2YgcHJvY2VkdXJlIGNhbGxzLiAgVGhlCiAgICAgICAgICAgc2VwYXJhdGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gaXMgZ29uZS4gICBNb3N0CiAgICAgICAgICAgY29kZSBnZW5lcmF0aW9uIGlzIGNvbnRyb2xsZWQgdmlhIHRoZSBwZXJsNS5zd2cgZmlsZSBpbiB0aGUKICAgICAgICAgICBsaWJyYXJ5LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIAoxMS8xMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSBDKysgdHlwZW5hbWUga2V5d29yZC4gIFByaW1hcmlseSB0aGlzCiAgICAgICAgICAgaXMgYWRkZWQgdG8gYmV0dGVyIHN1cHBvcnQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCAgYmxhaChDJiB2KSB7CiAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6aXRlcmF0b3IgaSA9IHYuYmVnaW4oKTsKICAgICAgICAgICAgIH0KCiAgICAgICAgICAgTm90ZTogdHlwZW5hbWUgaXMgc3VwcG9ydGVkIGluIHRoZSBwYXJzZXIgaW4gdGhlIHNhbWUgd2F5IGFzICdzdHJ1Y3QnCiAgICAgICAgICAgb3IgJ2NsYXNzJy4gIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdXNlIGl0IGFueXdoZXJlIGV4Y2VwdCBpbiB0ZW1wbGF0ZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlIEFQSS4gICBNb3N0IGZ1bmN0aW9ucyBub3cKICAgICAgICAgICB1c2UgYSBjb21tb24sIHZlcnkgc2ltcGxlLCAgQVBJLiAgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mCiAgICAgICAgICAgaW50ZXJlc3Rpbmcgc2VtYW50aWMgc2lkZS1lZmZlY3RzIG9mIGhvdyBjb2RlIGlzIGFjdHVhbGx5IGdlbmVyYXRlZC4KICAgICAgICAgICBEZXRhaWxzIHdpbGwgYmUgZm9ydGhjb21pbmcgaW4gRG9jL01hbnVhbC9FeHRlbmRpbmcuaHRtbC4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIExhbmd1YWdlIG1vZHVsZXMgd3JpdHRlbiBmb3IKICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdvcmssCgoxMS8xMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIHZlcnkgc3VidGxlIGJ1ZyBkdWUgdG8gdW5uYW1lZCBjbGFzcyB3cmFwcGluZy4gRm9yIGV4YW1wbGUsIGlmCiAgICAgICAgICAgeW91IGRpZCB0aGlzCgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgaW50IHgseTsKICAgICAgICAgICAgICB9IGdkUG9pbnQsICpnZFBvaW50UHRyOwoKICAgICAgICAgICAgICB2b2lkIGZvbyhnZFBvaW50UHRyIHgpOwoKICAgICAgICAgICBUaGVuIHRoZSBmb28gZnVuY3Rpb24gd291bGQgZ2V0IGEgdHlwZS1lcnJvci4gICBUaGUgcHJvYmxlbSBoYXMKICAgICAgICAgICB0byBkbyB3aXRoIGludGVybmFsIHR5cGVkZWYgaGFuZGxpbmcgYW5kIHRoZSBmYWN0IHRoYXQgdGhlIHR5cGVkZWYKICAgICAgICAgICBkZWNsYXJhdGlvbnMgYWZ0ZXIgdGhlIHN0cnVjdCBhcHBlYXIgbGF0ZXIgaW4gdGhlIHBhcnNlIHRyZWUuCiAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUHJvYmxlbSByZXBvcnRlZCBieSBWaW4gSm92YW5vdmljLgoKMTEvMDkvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byAib3V0IiB0eXBlbWFwcyAoYW5kIHJlbGF0ZWQgdmFyaWF0aW9ucykuICBUaGUgbmFtZQogICAgICAgICAgIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIHR5cGVtYXAgaXMgbm93IHRoZSByYXcgQyBpZGVudGlmaWVyIHRoYXQKICAgICAgICAgICBhcHBlYXJzIG9uIGEgZGVjbGFyYXRpb24uICBUaGlzIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCiAgICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IGZvbygpOyAgICAvLyB0eXBlbWFwIGdldHMgYXBwbGllZAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG5ldmVyIHJlYWxseSBzcGVjaWZpZWQgaG93IHRoaXMgd2FzIHN1cHBvc2VkIHRvCiAgICAgICAgICAgd29yay4gIEluIFNXSUcxLjEsIHlvdSBjb3VsZCBwcm9iYWJseSB3cml0ZSBhIHR5cGVtYXAgZm9yIHRoZQogICAgICAgICAgIHdyYXBwZXIgbmFtZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgQmxhaF9mb28geyAuLi4gfQoKICAgICAgICAgICBIb3dldmVyLCB0aGlzIG9sZCBiZWhhdmlvciBpcyBub3cgd2l0aGRyYXduIGFuZCBub3Qgc3VwcG9ydGVkLiAKICAgICAgICAgICBKdXN0IHVzZSB0aGUgbWVtYmVyIG5hbWUgd2l0aG91dCBhbnkgc29ydCBvZiBzcGVjaWFsIHByZWZpeC4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gVGNsIG1vZHVsZSBpbml0aWFsaXphdGlvbjoKCiAgICAgICAgICAgKDEpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGNvZGUgbmVlZGVkIHRvIHdvcmsgd2l0aAogICAgICAgICAgICAgICAgVGNsIHN0dWJzLiAgU2ltcGx5IGNvbXBpbGUgd2l0aCAtRFVTRV9UQ0xfU1RVQlMuCgogICAgICAgICAgICgyKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGNhbGxzIFRjbF9Qa2dQcm92aWRlIHRvIHJlZ2lzdGVyCiAgICAgICAgICAgICAgIGEgcGFja2FnZSBuYW1lLiAgVGhlIHBhY2thZ2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZQogICAgICAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuICBUaGUgdmVyc2lvbiBudW1iZXIgaXMKICAgICAgICAgICAgICAgc2V0IHRvICIwLjAiIGJ5IGRlZmF1bHQuICBUbyBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyLCB1c2UKICAgICAgICAgICAgICAgc3dpZyAtcGtndmVyc2lvbiAxLjIgaW50ZXJmYWNlLmkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIE1vZHVsZXMgdGhhdCBwcm92aWRlZCBzdHVicyBhbmQgVGNsX1BrZ1Byb3ZpZGUgb24gdGhlaXIgb3duIG1pZ2h0CiAgICAgICAgICAgYnJlYWsuICBTaW1wbHkgcmVtb3ZlIHRoYXQgY29kZS4KCjExLzA1LzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZWQgY29kZSBnZW5lcmF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgVGNsIG1vZHVsZS4gIENvbnN0YW50cwogICAgICAgICAgIGFyZSBub3cgc3RvcmVkIGluIGEgbGFyZ2UgdGFibGUgdGhhdCBnZXQgaW5zdGFsbGVkIGF0IG1vZHVsZSBzdGFydHVwLgogICAgICAgICAgIFRoZXJlIGFyZSBhbHNvIG5vIGxvbmdlciBhbnkgc3RhdGljIHZhcmlhYmxlcyBzbyBpdCBzaG91bGQgZ2VuZXJhdGUKICAgICAgICAgICBzb21ld2hhdCBsZXNzIGNvZGUuCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgImNvbnN0IiB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gImNvbnN0YW50IiBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcy4gICJjb25zdCIgaXMgYSBDIGtleXdvcmQgd2hpY2ggbWFkZSB0aGUgaGFuZGxpbmcgb2YgdGhlIHR5cGVtYXAKICAgICAgICAgICBkaXJlY3RpdmUgc29tZXdoYXQgYXdrd2FyZCBpbiB0aGUgcGFyc2VyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgJXR5cGVtYXAgZGlyZWN0aXZlIGNhbiBub3cgYWNjZXB0IG5lYXJseSBhcmJpdHJhcnkga2V5d29yZCBwYXJhbWV0ZXJzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbixwYXJzZT0iaSIsZG9jPSJpbnRlZ2VyIikgaW50ICIuLi4iOwoKICAgICAgICAgICBUaGUgcHVycG9zZSBvZiB0aGUga2V5d29yZCBwYXJhbWV0ZXJzIGlzIHRvIHN1cHBseSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBoaW50cyB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIG1vZHVsZS4gICBUaGUgaW50ZXByZXRhdGlvbiBvZiB0aGUKICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGxhbmd1YWdlIHNwZWNpZmljLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFNsaWdodCBzZW1hbnRpYyBjaGFuZ2UgdG8gaW50ZXJuYWwgY2FsbC9yZXR1cm4gYnkgdmFsdWUgaGFuZGxpbmcuCiAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgY2FsbC1ieS12YWx1ZSB3YXMgdHJhbnNsYXRlZAogICAgICAgICAgIGludG8gcG9pbnRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwoKICAgICAgICAgICB0dXJuZWQgaW50byB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHRyYW5zbGF0aW9uIHdhcyBub3JtYWxseSBwZXJmb3JtZWQgYnkgdGhlIFNXSUcgY29yZSwgb3V0c2lkZQogICAgICAgICAgIG9mIHRoZSBjb250cm9sIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBIb3dldmVyLCBhIHNpZGUgZWZmZWN0CiAgICAgICAgICAgb2YgdGhpcyB3YXMgYSBsb3Qgb2YgYml6YXJyZSB0eXBlbWFwIGJlaGF2aW9yLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgIGlmIHlvdSBkaWQgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBZb3Ugd291bGQgZmluZCB0aGF0IGludDMyIHdhcyB0cmFuc2Zvcm1lZCBpbnRvIGEgcG9pbnRlciBldmVyeXdoZXJlIQogICAgICAgICAgIChuZWVkbGVzcyB0byBzYXksIHN1Y2ggYmVoYXZpb3IgaXMgdW5leHBlY3RlZCBhbmQgcXVpdGUgYXdrd2FyZCB0bwogICAgICAgICAgIGRlYWwgd2l0aCkuICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIGlmIGEgdHlwZWRlZiB3YXMgYWxzbyB1c2VkLAogICAgICAgICAgIHRoZSBwb2ludGVyIGJlaGF2aW9yIHN1ZGRlbmx5IGRpc2FwcGVhcmVkLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIHBvaW50ZXIgdHJhbnNmb3JtYXRpb24gaXMgbm93IHB1c2hlZCB0byB0aGUKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiAgIFRoaXMgcHJvZHVjZXMgd3JhcHBlcnMgdGhhdCBsb29rIHJvdWdobHkKICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMSA9ICphOwogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMiA9ICpiOwogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IGVhc3kgdG8gZGVmaW5lIHR5cGVtYXBzIGZvcgogICAgICAgICAgIGFyYml0cmFyeSB1bmRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbyB0aGlzIChhbmQgaXQKICAgICAgICAgICB3aWxsIHdvcmsgcmVnYXJkbGVzcyB3aGF0IGludDMyIGlzKToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICQxID0gKGludDMyKSBQeUludF9Bc0xvbmcoJGlucHV0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElNQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2FsbC9yZXR1cm4gYnkgdmFsdWUgY29kZSBnZW5lcmF0aW9uIGluCiAgICAgICAgICAgc29tZSBsYW5ndWFnZSBtb2R1bGVzLgoKMTEvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCB0eXBlbWFwcyB0byB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAgeyAKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBvYmplY3QgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAqIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAmIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIGVudW0gU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAuLi4gYW4gZW51bSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIChDTEFTUzo6KikgewogICAgICAgICAgICAgICAgICAgLi4uIHBvaW50ZXIgdG8gbWVtYmVyIC4uLgogICAgICAgICAgICAgICB9CgoKICAgICAgICAgICBUaGVzZSB0eXBlcyBhcmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIHR5cGVzIHRoYXQgZG9uJ3QgbWF0Y2gKICAgICAgICAgICBhbnl0aGluZyBlbHNlLiAgU2VlIENIQU5HRVMgbG9nIGVudHJ5IGZvciA4LzI3LzIwMDAgZm9yIHRoZQogICAgICAgICAgIG9sZCBiZWhhdmlvci4gIFRoZSByb2xlIG9mIHRoZXNlIHR5cGVzIGlzIGFsc28gZGVzY3JpYmVkIGluIAogICAgICAgICAgIERvYy9NYW51YWwvVHlwZW1hcHMuaHRtbAoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIAoxMC8yNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCBHdWlsZSBhbmQgTXpzY2hlbWUgbW9kdWxlcyB0byBzdXBwb3J0CiAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRml4IHRvIGhhbmRsZSBwb2ludGVycyB0byBhcnJheXMuCgoxMC8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBEZWZpbmluZyBhIHR5cGVtYXAgcnVsZSBmb3IgZW51bSBTV0lHRU5VTSBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgICB0byBkZWZpbmUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZW51bSB2YXJpYWJsZXMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSdWJ5IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFJ1YnkgbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIGFuIGFyYml0cmFyeQogICAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICBQcmV2aW91cyB2ZXJzaW9ucyB3ZXJlIGxpbWl0ZWQgdG8gCiAgICAgICAgICAgdG8gZnVuY3Rpb25zIHdpdGggb25seSA5IG9yIDE2IGFyZ3VtZW50cyBkZXBlbmRpbmcgb24KICAgICAgICAgICB0aGUgdXNlIG9mIGRlZmF1bHQgYXJndW1lbnRzLiAgIE5vdGU6IGZyb20gc29tZSBpbnNwZWN0aW9uCiAgICAgICAgICAgb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgc291cmNlLCB0aGUgbmV3IGFwcHJvYWNoIG1pZ2h0IGJlCiAgICAgICAgICAgYSBsaXR0bGUgZmFzdGVyIGFzIHdlbGwuCgoxMC8xOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgIHRlbXBsYXRlcy4KCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDxTLFQ+OwoKICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSXJpbmEgS290bG92YS4KCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzIGFkZGVkLiAgVGhlIHR5cGVtYXBzCiAgICAgICAgICAgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgc3ludGF4IGJlbG93LiAgIFdpdGhpbiBlYWNoCiAgICAgICAgICAgdHlwZW1hcCwgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIGhhbmRsZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICRhcmc7ICAvLyBUaGUgaW5wdXQgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgJDE7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQyOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBzZWNvbmQgYXJndW1lbnQKCiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHZhcmlhYmxlcyByZWZlciB0byBlaXRoZXIgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDFfdHlwZSwgJDFfbHR5cGUsICQxX2Jhc2V0eXBlLCBldGMuLi4gIChhcmdjKQogICAgICAgICAgICAgICAgICAkMl90eXBlLCAkMl9sdHlwZSwgJDJfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ3ZbXSkKCiAgICAgICAgICAgICAgICAgIC8vIEFycmF5IGRpbWVuc2lvbiBvZiBhcmd2CiAgICAgICAgICAgICAgICAgICQyX2RpbTAKICAgICAgICAgICAgICB9CgogICAgICAgICAgIEJhc2ljYWxseSBhbnkgdmFyaWFibGUgdGhhdCB3YXMgYXZhaWxhYmxlIGluIG5vcm1hbCB0eXBlbWFwcwogICAgICAgICAgIGlzIGF2YWlsYWJsZSBmb3IgZWl0aGVyIGFyZ3VtZW50IGJ5IHByZWZhY2luZyB0aGUgdmFyaWFibGUKICAgICAgICAgICBuYW1lIGJ5ICckbl8nIHdoZXJlIG4gaXMgdGhlIGFyZ3VtZW50IHBvc2l0aW9uLgoKICAgICAgICAgICBOb3RlczogIAogICAgICAgICAgICgxKSBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIHNpbmdsZQogICAgICAgICAgICAgICBvYmplY3QgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgIHlvdSBjYW4gc3BsaXQgYSBzdHJpbmcgaW50byBhIChjaGFyICosIGludCkgcGFpciBvcgogICAgICAgICAgICAgICBzcGxpdCBhIGxpc3QgaW50byBhIChpbnQsIGNoYXIgW10pIHBhaXIuICBJdCBpcyBub3QKICAgICAgICAgICAgICAgcG9zc2libGUgdG8gbWFwIG11bHRpcGxlIG9iamVjdHMgdG8gbXVsdGlwbGUgYXJndW1lbnRzLgoKICAgICAgICAgICAoMikgVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIFNXSUcgdmVyc2lvbnMsIHRoZQogICAgICAgICAgICAgICB2YXJpYWJsZXMgc3VjaCBhcyAkdGFyZ2V0IGFuZCAkdHlwZSBhcmUgcHJlc2VydmVkIGFuZAogICAgICAgICAgICAgICBhcmUgbWFwcGVkIG9udG8gdGhlIGZpcnN0IGFyZ3VtZW50IG9ubHkuCgogICAgICAgICAgICgzKSBUaGlzIHNob3VsZCBub3QgYWZmZWN0IGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlLgogICAgICAgICAgICAgICBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgYXJlIGFuIGV4dGVuc2lvbiB0byB0eXBlbWFwIGhhbmRsaW5nLgogICAgICAgICAgICAgICBTaW5nbGUgdmFsdWVkIHR5cGVtYXBzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHVzdWFsCiAgICAgICAgICAgICAgIHdheS4KCiAgICAgICAgICAgVGhlIG9sZCAkc291cmNlIGFuZCAkdGFyZ2V0IHZhcmlhYmxlcyBhcmUgb2ZmaWNpYWxseQogICAgICAgICAgIGRlcHJlY2F0ZWQuICBJbnB1dCB2YXJpYWJsZXMgYXJlIHJlZmVyZW5jZWQgdGhyb3VnaAogICAgICAgICAgICRhcmckIGFuZCBvdXRwdXQgdmFsdWVzIGFyZSByZWZlcmVuY2UgdGhyb3VnaCAkcmVzdWx0JC4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcy4gIFRoZSBzeW50YXgKICAgICAgICAgICBpcyBhIGxpdHRsZSBmdW5reSwgYnV0IGhlcmUgZ29lczoKCiAgICAgICAgICAgICAgLy8gRGVmaW5lIGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBNdWx0aXZhbHVlZCB0eXBlbWFwIHdpdGggbG9jYWxzCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKShpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vIENvcHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSA9IChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKCiAgICAgICAgICAgICAgLy8gQXBwbHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJWFwcGx5IChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7IChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSB9OwoKICAgICAgICAgICBOb3RlOiB0aGlzIGV4dHJhIHBhcnNpbmcgc3VwcG9ydCBpcyBhZGRlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbi4KICAgICAgICAgICBObyBsYW5ndWFnZSBtb2R1bGVzIGN1cnJlbnRseSBzdXBwb3J0IG11bHRpLXZhbHVlZCB0eXBlbWFwcy4KCjEwLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1hdGNoaW5nIGNvZGUgdG8gZGlzY2FyZCBxdWFsaWZpZXJzIHdoZW4KICAgICAgICAgICBjaGVja2luZyBmb3IgYSBtYXRjaC4gICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBkZWNsYXJhdGlvbgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGNoYXIgKngpOwoKICAgICAgICAgICBUaGUgdHlwZW1hcCBjaGVja2VyIGNoZWNrcyBmb3IgYSBtYXRjaCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgoKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBJZiB0eXBlZGVmJ3MgYXJlIGludm9sdmVkLCBxdWFsaWZpZXIgc3RyaXBwaW5nIG9jY3VycyBiZWZvcmUKICAgICAgICAgICB0eXBlZGVmIHJlc29sdXRpb24uICBTbyBpZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyICpzdHJpbmc7CiAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3Qgc3RyaW5nIHgpOwoKICAgICAgICAgICB0eXBlbWFwIGNoZWNraW5nIHdvdWxkIGJlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHgKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZwogICAgICAgICAgICAgICAgc3RyaW5nIHgKICAgICAgICAgICAgICAgIHN0cmluZwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgVGhlIHByaW1hcnkgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24KICAgICAgICAgICBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV2l0aG91dCBxdWFsaWZpZXIgc3RyaXBwaW5nLCBvbmUgaGFzIHRvIHdyaXRlCiAgICAgICAgICAgc2VwZXJhdGUgdHlwZW1hcHMgZm9yIGFsbCB2YXJpYXRpb25zIG9mIGNvbnN0IGFuZCB2b2xhdGlsZSAod2hpY2gKICAgICAgICAgICBpcyBhIHBhaW4pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFR5cGVtYXBzIG1pZ2h0IGJlIGFwcGxpZWQgaW4KICAgICAgICAgICBwbGFjZXMgd2hlcmUgdGhleSB3ZXJlbid0IGJlZm9yZS4KCgoxMC85LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBkaXNhbWJpZ3VhdGUKICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBvbmx5IHZhcnkgaW4gY29uc3RuZXNzLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBoYW5kbGUgdGhpcywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIG5vcm1hbGx5LgogICAgICAgICAgIAogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWhfY29uc3QpIGJsYWgoKSBjb25zdDsKCiAgICAgICAgICAgSW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUsIG1ldGhvZCBjYWxscyBsaWtlIHRoaXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgIChvYmopLT5ibGFoKCkgICAgICAgICAgICAgICAvLyBOb24tY29uc3QgdmVyc2lvbgogICAgICAgICAgICAgICAoKEZvbyBjb25zdCAqKW9iaiktPmJsYWgoKSAgLy8gY29uc3QgdmVyc2lvbgoKICAgICAgICAgICBUaGlzIHNob3VsZCBmb3JjZSB0aGUgcmlnaHQgbWV0aG9kIHRvIGJlIGludm9rZWQuCiAgICAgICAgICAgQWRtaXR0ZWRseSwgdGhpcyBpcyBwcm9iYWJseSBvYnNjdXJlLCBidXQgd2UgbWlnaHQKICAgICAgICAgICBhcyB3ZWxsIGdldCBpdCByaWdodC4KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3Igbm93IGlnbm9yZXMgJ1xyJyBpbiB0aGUgaW5wdXQuCiAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHRoZSBmb2xsb3dpbmcgYnVnOgogICAgICAgICAgIFsgIzQ2ODQxNiBdIFNXSUcgdGhpbmtzIG1hY3JvIGRlZnMgYXJlIGRlY2xhcmF0aW9ucz8KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHx8LCAmJiwgYW5kICEgaW4gY29uc3RhbnRzLiAgVGhpcwogICAgICAgICAgIGZpeGVzIFNGIFsgIzQ2ODk4OCBdIExvZ2ljYWwgb3BzIGJyZWFrIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBIb3dldmVyLCBhdCB0aGlzIHRpbWUsIGNvbnN0YW50cyB1c2luZyB0aGVzZSBvcGVyYXRvcnMKICAgICAgICAgICBhcmUgbm90IHN1cHBvcnRlZCAodGhlIHBhcnNlciB3aWxsIGlzc3VlIGEgd2FybmluZykuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAtc2hvd190ZW1wbGF0ZXMgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFRoaXMgbWFrZXMKICAgICAgICAgICBTV0lHIGRpc3BsYXkgdGhlIGNvZGUgaXQgYWN0dWFsbHkgcGFyc2VzIHRvIGdlbmVyYXRlCiAgICAgICAgICAgdGVtcGxhdGUgd3JhcHBlcnMuICBNb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHNlbWFudGljcyBvZiAldGVtcGxhdGUgZGlyZWN0aXZlLiAgV2hlbgogICAgICAgICAgIHVzaW5nICV0ZW1wbGF0ZSwgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgaGFuZGxlZAogICAgICAgICAgIGFzIHR5cGVzIGJ5IGRlZmF1bHQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3Rvcjxkb3VibGU+OwoKICAgICAgICAgICBUbyBzcGVjaWZ5IGEgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCBpcyAqbm90KiBhIHR5cGUsIHlvdQogICAgICAgICAgIG5lZWQgdG8gdXNlIGRlZmF1bHQtdmFsdWUgc3ludGF4LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50LGludD01MD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8aW50LHNpemU9MTAwPjsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci0tb25seQogICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuLCA1MCwgMTAwKSBpcyB1c2VkIGR1cmluZwogICAgICAgICAgIGV4cGFuc2lvbi4gIFRoaXMgZGlmZmVycyBmcm9tIG5vcm1hbCBDKyssIGJ1dCBJIGNvdWxkbid0CiAgICAgICAgICAgZmlndXJlIG91dCBhIGJldHRlciB3YXkgdG8gZG8gaXQgaW4gdGhlIHBhcnNlci4gIE1pZ2h0CiAgICAgICAgICAgaW1wbGVtZW50IGFuIGFsdGVybmF0aXZlIGxhdGVyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1ham9yIGNoYW5nZXMgdG8gdGVtcGxhdGUgaGFuZGxpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZQogICAgICAgICAgIGJldHRlciBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBDKysgdHlwZS1zeXN0ZW0uIFRoZSBtYWluCiAgICAgICAgICAgcHJvYmxlbSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICBTdXBwb3NlIHlvdSBoYXZlIGEgdGVtcGxhdGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGJsYWgoY29uc3QgVCB4KSB7IHN0dWZmIH07CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBOb3cgc3VwcG9zZSwgdGhhdCB5b3UgaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG9uIGEKICAgICAgICAgICB0eXBlIGxpa2UgdGhpcyBpbiBTV0lHOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxpbnQgKj47CgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyAqc3VwcG9zZWQqIHRvIGdlbmVyYXRlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIEhvd2V2ZXIsIGluIFNXSUctMS4zLjksIHRoZSB0ZW1wbGF0ZSBzdWJzdGl0dXRpb24gZ2V0cyBpdCB3cm9uZwogICAgICAgICAgIGFuZCBwcm9kdWNlcwoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgaW50ICp4KSB7IHN0dWZmIH07CgogICAgICAgICAgIChub3RpY2UgdGhlIGJhZCBwbGFjZW1lbnQgb2YgdGhlICdjb25zdCcgcXVhbGlmaWVyKS4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBTV0lHIHBhcnNlciBub3cgZ2VuZXJhdGVzIGltcGxpY2l0IHR5cGVkZWZzCiAgICAgICAgICAgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzIHRoYXQgcHJvZHVjZXMgY29kZSByb3VnaGx5CiAgICAgICAgICAgZXF1aXZhbGVudCB0byBkb2luZyB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCAqX19zd2lndG1wbDE7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8X19zd2lndG1wbDE+OwoKICAgICAgICAgICB3aGljaCBnZW5lcmF0ZXMgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIFNpbmNlIHRoaXMgaXMgY29ycmVjdCBpbiBib3RoIEMrKyBhbmQgU1dJRywgaXQgcHJvdmlkZXMgdGhlIHJpZ2h0CiAgICAgICAgICAgc2VtYW50aWNzIGFuZCBhbGxvd3MgZXZlcnl0aGluZyB0byBjb21waWxlIHByb3Blcmx5LiAgSG93ZXZlciwKICAgICAgICAgICB0byBjbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGNvZGUgYSBsaXR0bGUgYml0LCB0aGUgcGFyc2VyIGtlZXBzCiAgICAgICAgICAgdHJhY2sgb2YgdGhlIHRlbXBsYXRlIHR5cGVzIGFuZCBwZXJmb3JtcyBiYWNrLXN1YnN0aXR1dGlvbiB0bwogICAgICAgICAgIHRoZSBvcmlnaW5hbCB0eXBlIHdoZW4gYnVpbGRpbmcgdGhlIHBhcnNlIHRyZWUuICBUaHVzLCBldmVuCiAgICAgICAgICAgdGhvdWdoIHRoZSBpbXBsaWNpdCB0eXBlZGVmIGlzIHVzZWQgaW4gdGhlIGlucHV0IGFuZCBtYXkgYXBwZWFyCiAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGUgKGZvciBwcm9wZXIgY29tcGlsYXRpb24pLCB0aGUgcGFyc2UKICAgICAgICAgICB0cmVlIHdpbGwgaGlkZSBhIGxvdCBvZiB0aGVzZSBkZXRhaWxzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICB3aWxsIGxvb2sgbGlrZSBpdCB3YXMgZGVjbGFyZWQgYXMgZm9sbG93cyAod2hpY2ggaXMgd2hhdAogICAgICAgICAgIHlvdSB3YW50KToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9CgogICAgICAgICAgIFRoZSBvbmx5IHBsYWNlIHlvdSBhcmUgbGlrZWx5IHRvIG5vdGljZSB0aGUgdHlwZWRlZiBoYWNrCiAgICAgICAgICAgaXMgaW4gYm9kaWVzIG9mIHRlbXBsYXRlIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICBkaWQgdGhpcywKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmxhaCB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHsKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgdGVtcHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgIHlvdSB3aWxsIGZpbmQgdGhhdCAnVCB0ZW1wdmFsdWUnIGdvdCBleHBhbmRlZCBpbnRvIHNvbWUKICAgICAgICAgICBzdHJhbmdlIHR5cGVkZWYgdHlwZS4gIFRoaXMgKnN0aWxsKiBjb21waWxlcyBjb3JyZWN0bHkgCiAgICAgICAgICAgc28gaXQncyBub3QgYSBiaWcgZGVhbCAob3RoZXIgdGhhbiBsb29raW5nIGtpbmQgb2YgdWdseQogICAgICAgICAgIGluIHRoZSB3cmFwcGVyIGZpbGUpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgc29tZSBpbmhlcml0YW5jZSBwcm9ibGVtcyBpbiBUY2wgT2JqZWN0IGludGVyZmFjZS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRjbCBtb2R1bGUgaGFzIGNoYW5nZWQgdG8gdXNlIGJ5dGUtYmFja2VkIHBvaW50ZXIgc3RyaW5ncy4gIFRoaXMKICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgSG93ZXZlciwKICAgICAgICAgICB0aGUgb3JkZXIgaW4gd2hpY2ggZGlnaXRzIGFwcGVhciBpbiBwb2ludGVyIHZhbHVlcyBubyBsb25nZXIKICAgICAgICAgICBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIG51bWVyaWNhbCB2YWx1ZSBvZiBhCiAgICAgICAgICAgcG9pbnRlciAob24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgcGFpcnMgb2YgZGlnaXRzIGFwcGVhcgogICAgICAgICAgIGluIHJldmVyc2Ugb3JkZXIpLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUGVybDUgbW9kdWxlIGlzIG5vdyBkcml2ZW4gYnkgYSBjb25maWd1cmF0aW9uIGZpbGUgJ3Blcmw1LnN3ZycKICAgICAgICAgICBpbiB0aGUgU1dJRyBsaWJyYXJ5LgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHBlcmw1IG1vZHVsZSBubyBsb25nZXIgdHJpZXMgdG8gYXBwbHkgdGhlICJvdXQiIHR5cGVtYXAKICAgICAgICAgICBpbiBjb2RlIGdlbmVyYXRlZCBmb3IgbWFnaWMgdmFyaWFibGVzLiAgSSdtIHN1cnByaXNlZCB0aGF0CiAgICAgICAgICAgdGhpcyBldmVyIHdvcmtlZCBhdCBhbGwgKHNpbmNlIGFsbCBvZiB0aGUgY29kZSB0aGF0IHdhcyB0aGVyZQogICAgICAgICAgIHdhcyB3cm9uZyBhbnl3YXlzKS4gICBVc2UgdGhlICJ2YXJvdXQiIHR5cGVtYXAgdG8gaGFuZGxlCiAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcy4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIGFycmF5IG1lbWJlcnMgb2Ygc3RydWN0dXJlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVszMl07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIGlzIG5vcm1hbGx5IHN1cHBvc2VkIHRvIHJldHVybiBhIHN0cmluZywgYnV0IHRoaXMgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy45LiAgIFRoZSByZWFzb24gaXQgd2FzIGJyb2tlbiB3YXMgYWN0dWFsbHkKICAgICAgICAgICBkdWUgdG8gYSBzdWJ0bGUgbmV3IGZlYXR1cmUgb2YgdHlwZW1hcHMuICBXaGVuIGEgZGF0YSBtZW1iZXIKICAgICAgICAgICBpcyBzZXQgdG8gYW4gYXJyYXkgbGlrZSB0aGlzLCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHJlbGF0ZWQKICAgICAgICAgICBhY2Nlc3NvciBmdW5jdGlvbiBpcyBhY3R1YWxseSBzZXQgdG8gYW4gYXJyYXkuICBUaGlzIG1lYW5zCiAgICAgICAgICAgdGhhdCB5b3UgY2FuIG5vdyB3cml0ZSB0eXBlbWFwcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixvdXQpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICR0YXJnZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgkc291cmNlLCRkaW0wKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHRoZSBkZWZ1bmN0CiAgICAgICAgICAgbWVtYmVyb3V0IHR5cGVtYXAgaW4gYSBtb3JlIGVsZWdhbnQgbWFubmVyLgoKOS8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU29tZSBmdXJ0aGVyIHJlZmluZW1lbnQgb2YgcXVhbGlmaWVkIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAoaSkgVGhlIFNXSUcgcGFyc2VyIHdhcyBleHRlbmRlZCBzbGlnaHRseSB0byBhbGxvdyAndm9sYXRpbGUnCiAgICAgICAgICAgYW5kIGNvbWJpbmF0aW9ucyBvZiAnY29uc3QnIGFuZCAndm9sYXRpbGUnIHRvIGJlIHVzZWQuICBUaGlzCiAgICAgICAgICAgaXMgcHJvYmFibHkgcmFyZSwgYnV0IHRlY2huaWNhbGx5IGxlZ2FsLiAgT25seSBhZGRlZCBmb3IKICAgICAgICAgICBjb21wbGV0ZW5lc3MuCgogICAgICAgICAgIChpaSkgRm9yIHRoZSBwdXJwb3NlcyBvZiBvdmVybG9hZGluZywgcXVhbGlmaWVkIGFuZCBub24tcXVhbGlmaWVkCiAgICAgICAgICAgZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQuICBUaHVzLCB3aGVuIGEgY2xhc3MgaGFzIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CgogICAgICAgICAgIFR3byBkaXN0aW5jdCBtZXRob2RzIGFyZSBkZWNsYXJlZC4gIFRvIGRlYWwgd2l0aCB0aGlzLCAlcmVuYW1lCiAgICAgICAgICAgYW5kIHNpbWlsYXIgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gcmVjb2duaXplIGNvbnN0LgogICAgICAgICAgIFRodXMsIG9uZSBjYW4gZGlzYW1iaWd1YXRlIHRoZSB0d28gZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb2NvbnN0KSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBvciBzaW1wbHkgaWdub3JlIHRoZSBjb25zdCB2YXJpYW50IGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIE5vdGU6IFNXSUcgY3VycmVudGx5IGhhcyBubyB3YXkgdG8gYWN0dWFsbHkgaW52b2tlIHRoZSBjb25zdAogICAgICAgICAgIG1lbWJlciBzaW5jZSB0aGUgJ2NvbnN0JyBpcyBkaXNjYXJkZWQgd2hlbiBnZW5lcmF0aW5nIHdyYXBwZXJzCiAgICAgICAgICAgZm9yIG9iamVjdHMuICAKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIE5ldyBkaXJlY3RpdmUuICVuYW1ld2FybiBjYW4gYmUgdXNlZCB0byBpc3N1ZSB3YXJuaW5nCiAgICAgICAgICAgbWVzc2FnZXMgZm9yIGNlcnRhaW4gZGVjbGFyYXRpb24gbmFtZXMuICAgVGhlIG5hbWUKICAgICAgICAgICBtYXRjaGluZyBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlICVyZW5hbWUgZGlyZWN0aXZlLgogICAgICAgICAgIFRoZSBpbnRlbnQgb2YgdGhpcyBkaXJlY3RpdmUgaXMgdG8gaXNzdWUgd2FybmluZ3MgZm9yCiAgICAgICAgICAgcG9zc2libGUgbmFtZXNwYWNlIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbmFtZXdhcm4oInByaW50IGlzIGEgcHl0aG9uIGtleXdvcmQiKSBwcmludDsKCiAgICAgICAgICAgVGhlIG5hbWUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHBlcmZvcm1lZCBhZnRlciBhIG5hbWUKICAgICAgICAgICBoYXMgYmVlbiByZXNvbHZlZCB1c2luZyAlcmVuYW1lLiAgVGhlcmVmb3JlLCBhCiAgICAgICAgICAgZGVjbGFyYXRpb24gbGlrZSB0aGlzIHdpbGwgbm90IGdlbmVyYXRlIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiUHJpbnQiKSBwcmludDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB2b2lkIHByaW50KCk7ICAgIC8qIE5vIHdhcm5pbmcgZ2VuZXJhdGVkICovCgogICAgICAgICAgIFNpbmNlIHRoZSB3YXJuaW5nIG1lY2hhbmlzbSBmb2xsb3dzICVyZW5hbWUgc2VtYW50aWNzLCBpdCBpcwogICAgICAgICAgIGFsc28gdG8gaXNzdWUgd2FybmluZ3MgZm9yIHNwZWNpZmljIGNsYXNzZXMgb3IganVzdCBmb3IKICAgICAgICAgICBjZXJ0YWluIG1lbWJlciBmdW5jdGlvbiBuYW1lcy4KCiAgICAgICAgICAgKERhdmUgLSBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgYWRkaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKICAgICAgICAgICBmb3IgcXVpdGUgc29tZSB0aW1lLiAgSnVzdCBuZXZlciBnb3QgYXJvdW5kIHRvIGl0KQogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbmhhbmNlZCB0aGUgJWlnbm9yZSBkaXJlY3RpdmUgc28gdGhhdCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgY2FuIGJlIGlzc3VlZCB0byB1c2Vycy4gICBUaGlzIGlzIGRvbmUgdXNpbmcgJWlnbm9yZXdhcm4KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWlnbm9yZXdhcm4oIm9wZXJhdG9yIG5ldyBpZ25vcmVkIikgb3BlcmF0b3IgbmV3OwoKICAgICAgICAgICBUaGUgbmFtZXMgYW5kIHNlbWFudGljcyBvZiAlaWdub3Jld2FybiBpcyBleGFjdGx5IHRoZSAKICAgICAgICAgICBzYW1lIGFzICVpZ25vcmUuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICBpcyBmb3IgbW9kdWxlIHdyaXRlcnMgd2hvIHdhbnQgdG8gaWdub3JlIGNlcnRhaW4gdHlwZXMKICAgICAgICAgICBvZiBkZWNsYXJhdGlvbnMsIGJ1dCB3aG8gYWxzbyB3YW50IHRvIGFsZXJ0IHVzZXJzIGFib3V0IGl0LgogICAgICAgICAgIEEgdXNlciBtaWdodCBhbHNvIHVzZSB0aGlzIGZvciBkZWJ1Z2dpbmcgKHNpbmNlIG1lc3NhZ2VzCiAgICAgICAgICAgd2lsbCBhcHBlYXIgd2hlbmV2ZXIgYW4gaWdub3JlZCBkZWNsYXJhdGlvbiBhcHBlYXJzKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzI2LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTdXBlci1leHBlcmltZW50YWwgc3VwcG9ydCBmb3Igb3ZlcmxvYWRlZCBvcGVyYXRvcnMuIAogICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgYSBmZXcgZGlmZmVyZW50IHBhcnRzLgoKICAgICAgICAgICAoaSkgT3BlcmF0b3IgbmFtZXMgc3VjaCBhcyAnb3BlcmF0b3IrJyBhcmUgbm93IGFsbG93ZWQKICAgICAgICAgICBhcyB2YWxpZCBkZWNsYXJhdG9yIG5hbWVzLiAgVGh1cyB0aGUgJ29wZXJhdG9yJyBzeW50YXgKICAgICAgICAgICBjYW4gYXBwZWFyICphbnlwbGFjZSogYSBub3JtYWwgZGVjbGFyYXRvciBuYW1lIHdhcyB1c2VkCiAgICAgICAgICAgYmVmb3JlLiAgT24gdGhlIHN1cmZhY2UsIHRoaXMgbWVhbnMgdGhhdCBvcGVyYXRvcnMgY2FuCiAgICAgICAgICAgYmUgcGFyc2VkIGp1c3QgbGlrZSBub3JtYWwgZnVuY3Rpb25zIGFuZCBtZXRob2RzLiAKICAgICAgICAgICBIb3dldmVyLCBpdCBhbHNvIG1lYW5zIHRoYXQgb3BlcmF0b3IgbmFtZXMgY2FuIGJlIHVzZWQKICAgICAgICAgICBpbiBtYW55IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVyZW5hbWUoX19hZGRfXykgQ29tcGxleDo6b3BlcmF0b3IrKGNvbnN0IENvbXBsZXggJik7CgogICAgICAgICAgIChpaSkgT3BlcmF0b3JzIGFyZSB3cmFwcGVkICpleGFjdGx5KiBsaWtlIG5vcm1hbCBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgbWV0aG9kcy4gIEludGVybmFsbHksIHRoZSBvcGVyYXRvciBuYW1lIGlzIHVzZWQgCiAgICAgICAgICAgZGlyZWN0bHkgbWVhbmluZyB0aGF0IHRoZSB3cmFwcGVyIGNvZGUgbWlnaHQgY29udGFpbgogICAgICAgICAgIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGFyZzAtPm9wZXJhdG9yKigoQ29tcGxleCBjb25zdCAmKSphcmcxKTsKCiAgICAgICAgICAgVGhpcyBhbGwgc2VlbXMgdG8gcGFyc2UgYW5kIGNvbXBpbGUgY29ycmVjdGx5IChhdCBsZWFzdAogICAgICAgICAgIG9uIG15IG1hY2hpbmUpLgoKICAgICAgICAgICAoaWlpKSBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdyYXAgYSBkZWNsYXJhdGlvbiBpZiBpdHMgc3ltYm9sCiAgICAgICAgICAgdGFibGUgbmFtZSBjb250YWlucyBpbGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycy4gIElmCiAgICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXJzIGFyZSBkZXRlY3RlZCwgeW91IHdpbGwgc2VlIGFuIGVycm9yCiAgICAgICAgICAgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICBXYXJuaW5nLiBDYW4ndCB3cmFwIG9wZXJhdG9yKiB1bmxlc3MgcmVuYW1lZCB0byBhIHZhbGlkIGlkZW50aWZpZXIuCgogICAgICAgICAgIFRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgJXJlbmFtZSBvciAlbmFtZSB0byBiaW5kCiAgICAgICAgICAgdGhlIG9wZXJhdG9yIHRvIGEgbmljZSBuYW1lIGxpa2UgImFkZCIgb3Igc29tZXRoaW5nLiBOb3RlOgogICAgICAgICAgIHRoZSBsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgYXJlIGRldGVybWluZWQgYnkgdGhlIHRhcmdldAogICAgICAgICAgIGxhbmd1YWdlLgoKICAgICAgICAgICBUaGVyZSBhcmUgY2VydGFpbiBpc3N1ZXMgd2l0aCBmcmllbmQgZnVuY3Rpb25zIGFuZCBvcGVyYXRvcnMuCiAgICAgICAgICAgU29tZXRpbWVzLCBmcmllbmRzIGFyZSB1c2VkIHRvIGRlZmluZSBtaXhlZCBvcGVyYXRvcnMgc3VjaAogICAgICAgICAgIGFzIGFkZGluZyBhIENvbXBsZXggYW5kIGEgZG91YmxlIHRvZ2V0aGVyLiAgQ3VycmVudGx5LCBTV0lHCiAgICAgICAgICAgaWdub3JlcyBhbGwgZnJpZW5kIGRlY2xhcmF0aW9ucyBpbiBhIGNsYXNzLiAgQSBnbG9iYWwgb3BlcmF0b3IKICAgICAgICAgICBkZWNsYXJhdGlvbiBjYW4gcHJvYmFibHkgYmUgbWFkZSB0byB3b3JrLCBidXQgeW91J2xsIGhhdmUgdG8KICAgICAgICAgICByZW5hbWUgaXQgYW5kIGl0IHByb2JhYmx5IHdvbid0IHdvcmsgdmVyeSBjbGVhbmx5IGluIHRoZQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSBzaW5jZSBpdCdzIG5vdCBhIGNsYXNzIG1lbWJlci4KCiAgICAgICAgICAgU1dJRyBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBvcGVyYXRvciBzcGVjaWZpY2F0aW9ucyAKICAgICAgICAgICBzb21ldGltZXMgdXNlZCBmb3IgYXV0b21hdGljIHR5cGUgY29udmVyc2lvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIFN0cmluZyB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhciooKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9OwoKICAgICAgICAgICAodGhpcyBkb2Vzbid0IHBhcnNlIGNvcnJlY3RseSBhbmQgZ2VuZXJhdGVzIGEgc3ludGF4IGVycm9yKS4KCiAgICAgICAgICAgQWxzbzogb3BlcmF0b3JzIG5vIGxvbmdlciBzaG93IHVwIGFzIHNlcGFyYXRlIHBhcnNlLXRyZWUKICAgICAgICAgICBub2RlcyAoaW5zdGVhZCB0aGV5IGFyZSBub3JtYWwgJ2NkZWNsJyBub2RlcykuICBJIG1heQogICAgICAgICAgIHNlcGFyYXRlIHRoZW0gYXMgYSBzcGVjaWFsIGNhc2UgbGF0ZXIuCgogICAgICAgICAgIFNlZSBFeGFtcGxlcy9weXRob24vb3BlcmF0b3IgZm9yIGFuIGV4YW1wbGUuCgogICAgICAgICAgICoqKiBTVVBFUi1FWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgpWZXJzaW9uIDEuMy45IChTZXB0ZW1iZXIgMjUsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIHR5cGUgZGVjbGFyYXRpb25zIGxpa2UgCiAgICAgICAgICAgJ2NoYXIgKiogY29uc3QnLiAgU1dJRyBwYXJzZWQgdGhpcyBjb3JyZWN0bHksIGJ1dCB0aGUKICAgICAgICAgICBpbnRlcm5hbCB0eXBlIHdhcyByZXByZXNlbnRlZCBpbmNvcnJlY3RseSAodGhlIHBvaW50ZXJzCiAgICAgICAgICAgYW5kIHF1YWxpZmllcnMgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXIpLgoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgV2l0aGRyZXcgZXhwZXJpbWVudGFsIGZlYXR1cmUgKG5vdGVkIGJlbG93KSB0aGF0IHdhcwogICAgICAgICAgIGNhdXNpbmcgc2VyaW91cyBwYXJzaW5nIHByb2JsZW1zLgoKVmVyc2lvbiAxLjMuOCAoU2VwdGVtYmVyIDIzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCBpbXByb3ZlZCBkaXN0dXRpbHMgc2V0dXAucHkgZmlsZSBpbiB0aGUgVG9vbHMgCiAgICAgICAgICAgZGlyZWN0b3J5IChsb29rIGZvciB0aGUgc2V0dXAucHkudG1wbCBmaWxlKS4gIENvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICAgVG9ueSBTZXdhcmQuCgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCB0d28gbmV3IFJQTSBzcGVjIGZpbGVzIGluIHRoZSBUb29scyBkaXJlY3RvcnkuIENvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgVG9ueSBTZXdhcmQgYW5kIFV3ZSBTdGVpbm1hbm4uCiAgCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjM2MzUgXSBQZXJsNS5zd2cgZG9lcyBub3QgY29tcGlsZSBpbiBWaXN1YWwgQysrCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUd28gbmV3IGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgY3JlYXRpb24gb2YgZGVmYXVsdAogICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdAogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0CgogICAgICAgICAgIFRoZXNlIHJlcGxhY2UgJXByYWdtYSBub2RlZmF1bHQgYW5kICVwcmFnbWEgbWFrZWRlZmF1bHQuCiAgICAgICAgICAgKG9sZCBjb2RlIHdpbGwgc3RpbGwgd29yaywgYnV0IGRvY3VtZW50YXRpb24gd2lsbCBvbmx5CiAgICAgICAgICAgZGVzY3JpYmUgdGhlIG5ldyBkaXJlY3RpdmVzKS4KCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjIzNTQgXSAlaW1wb3J0IGJyb2tlbiBpbiAxLjMuNy4KCjkvMjAvMjAwMTogYmVhemxleQoKICAgICAgICAgICBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIG91dC1vZi1jbGFzcyBjb25zdHJ1Y3RvcgogICAgICAgICAgIGFuZCBkZXN0cnVjdG9yIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6Rm9vKCkgOgogICAgICAgICAgICAgICAgICAgIEJhcigiZm9vIikKICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgIGlubGluZSBGb286On5Gb28oKSB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEphc29uIFN0ZXdhcnQuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciB0byBpZ25vcmUgZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcwogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgViwgbG9uZyBTPiBjbGFzcyBNYXBJdGVyOwoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgYW4gZW1haWwgZXhhbXBsZSBmcm9tIElyaW5hIEtvdGxvdmEuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdW5kZWNsYXJlZCB0Y2xfcmVzdWx0IHZhcmlhYmxlIGluIAogICAgICAgICAgIHRoZSAib3V0IiB0eXBlbWFwIGZvciBUY2wuICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggQWN0aXZlUGVybC4gIAogICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNpbmcgb2YgQysrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBGb28oKSA6IEJhciguLi4pIHsuLi59CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBub3cgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSAoLi4uKSByZWdhcmRsZXNzIG9mIAogICAgICAgICAgIHdoYXQgbWlnaHQgZW5jbG9zZWQgKGV2ZW4gaWYgc3ludGFjdGljYWxseSB3cm9uZykuICBTV0lHCiAgICAgICAgICAgZG9lc24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwogICAgICAgICAgIG5lZWRsZXNzIGFkZCBzeW50YXggcnVsZXMgdG8gaGFuZGxlIGFsbCBvZiB0aGUgcG9zc2liaWxpdGllcwogICAgICAgICAgIGhlcmUuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdHlwZW1hcHMgZm9yIHN0cnVjdHVyZSBtZW1iZXJzLiAgSWYgeW91IGhhdmUgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgaW50ICpiYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIG1lbWJlciBuYW1lICdiYXInIGlzIG5vdyB1c2VkIGluIGFueSBhY2Nlc3NvciBmdW5jdGlvbnMuCiAgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlICJpbiIgdHlwZW1hcCB0byBiZSB1c2VkIHdoZW4gc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgdHlwZW1hcAoKICAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLGluKSBpbnQgKmJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBub3cgbWF0Y2hlcyBWZWN0b3I6OmJhci4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgd2lsbCBhbHNvCiAgICAgICAgICAgbWF0Y2ggYW55IGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgImludCAqYmFyIiAoc28geW91IHNob3VsZAogICAgICAgICAgIGJlIGNhcmVmdWwpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRS4gUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyNjQyIHNldHRpbmcgc3RyaW5nIHZhbHVlcyBpbiBzdHJ1Y3R1cmVzCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjM5OCBwcm9ibGVtIHdpdGggbmVzdGVkIHRlbXBsYXRlcy4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYxNjI2IHByb2JsZW0gd2l0aCBmb3JtYXR0aW5nIGFuZCBDKysgY29tbWVudHMuCiAgICAgICAgICAgIAo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2Mjg0NSBXcm9uZyBvd25lcnNoaXAgb2YgcmV0dXJuZWQgb2JqZWN0cy4KICAgICAgICAgICAKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NTkzNjcuICBEZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgY2xhc3NlcwogICAgICAgICAgIHdpdGggcHVyZSB2aXJ0dWFsIG1ldGhvZHMuCgo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIGNsYXNzIHNjb3BlLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgZW51bSBiYXIgeyBGT08sIEJBUiB9OwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyIGIgPSBGT08pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTV0lHIG5vdyBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgZGVmYXVsdCB2YWx1ZSBvZiAiRm9vOjpGT08iIGZvcgogICAgICAgICAgIHRoZSBibGFoKCkgbWV0aG9kIGFib3ZlLiAgVGhpcyB1c2VkIHRvIHdvcmsgaW4gMS4xLCBidXQgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy43LiAgIEJ1ZyByZXBvcnRlZCBieSBNaWtlIFJvbWJlcmcuCgpWZXJzaW9uIDEuMy43ICAoU2VwdGVtYmVyIDMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHNwZWNpYWwgJWlnbm9yZSBkaXJlY3RpdmUgdG8gaWdub3JlIGRlY2xhcmF0aW9ucy4gIFRoaXMKICAgICAgICAgICBmZWF0dXJlIHdvcmtzIGV4YWN0bHkgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSAgZm9vOyAgICAgICAgLy8gSWdub3JlIGFsbCBkZWNsYXJhdGlvbnMgZm9vCiAgICAgICAgICAgICAlaWdub3JlICA6OmZvbzsgICAgICAvLyBPbmx5IGlnbm9yZSBmb28gaW4gZ2xvYmFsIHNjb3BlCiAgICAgICAgICAgICAlaWdub3JlICBTcGFtOjpmb287ICAvLyBPbmx5IGlnbm9yZSBpbiBjbGFzcyBTcGFtCiAgICAgICAgICAgICAlaWdub3JlICAqOjpmb287ICAgICAvLyBJZ25vcmUgaW4gYWxsIGNsYXNzZXMKCiAgICAgICAgICAgJWlnbm9yZSBjYW4gYWxzbyBiZSBwYXJhbWV0ZXJpemVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgU3BhbTo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlICo6OmZvbyhpbnQpOwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAoKOS8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gc2hhZG93Y29kZSBwcmFnbWEgbW9kaWZpZWQgc28gdGhhdCB0aGUgY29kZSB0aGF0IGlzIG91dHB1dCAKICAgICAgICAgICBpbiB0aGUgc2hhZG93IGZpbGUgaXMgcGxhY2VkIHJlbGF0aXZlIHRvIHdoZXJlIGl0IGlzIHBsYWNlZCBpbiB0aGUgCiAgICAgICAgICAgYy9jKysgY29kZS4gVGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgSmF2YURvYyBmdW5jdGlvbiBjb21tZW50cy4gCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBQYXRjaCBbICM0NDc3OTEgXSBGaXggZm9yIHB5dGhvbiAtaW50ZXJmYWNlIG9wdGlvbi4KICAgICAgICAgICBTdWJtaXR0ZWQgYnkgVGFybiBXZWlzbmVyIEJ1cnRvbi4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycwogICAgICAgICAgIGZvciBhIGNsYXNzIGlmIGl0IG9ubHkgZGVmaW5lcyBhIHByaXZhdGUvcHJvdGVjdGVkIGNvbnN0cnVjdG9yCiAgICAgICAgICAgb3IgZGVzdHJ1Y3RvciBvciBpZiBhbnkgb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMgb25seSBoYXMKICAgICAgICAgICBwcml2YXRlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4gIFRoaXMgd2FzIHJlcG9ydGVkIGluCiAgICAgICAgICAgU0YgUGF0Y2ggWyAjNDQ0MjgxIF0gbm9ucHVibGljL2RlZmF1bHQvaW5oZXJldGVkIGN0b3IvZHRvcgogICAgICAgICAgIGJ5IE1hcmNlbG8gTWF0dXMuCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXRjaCB0byBQZXJsNSBtb2R1bGUgdGhhdCBhbGxvd3MgY29uc3RhbnRzIHRvIGJlCiAgICAgICAgICAgd3JhcHBlZCBhcyBjb25zdGFudHMgdGhhdCBkb24ndCByZXF1aXJlIHRoZSBsZWFkaW5nICQuCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgdXNpbmcgdGhlIC1jb25zdCBvcHRpb24uCiAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgUmljaCBXYWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSAndm9sYXRpbGUnIHR5cGUgcXVhbGlmaWVyLgogICAgICAgICAgIHZvbGF0aWxlIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyB0byBTV0lHLCBidXQgaXQgaXMKICAgICAgICAgICBuZWVkZWQgdG8gcHJvcGVybHkgZ2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgZGVjbGFyYXRpb25zCiAgICAgICAgICAgdGhhdCB1c2UgaXQuICBJdCdzIGFsc28gYmVlbiBhZGRlZCB0byBtYWtlIHRoZSBTV0lHIHR5cGUKICAgICAgICAgICBzeXN0ZW0gbW9yZSBjb21wbGV0ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkICVyZW5hbWUgZGlyZWN0aXZlLiAgKioqIFRoaXMKICAgICAgICAgICBuZXcgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mCiAgICAgICAgICAgcmVzb2x2aW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAqKioKICAgICAgICAgICAKICAgICAgICAgICBJbiBwcmlvciB2ZXJzaW9ucyBvZiBTV0lHLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgd2FzCiAgICAgICAgICAgdXNlZCB0byBjb25zaXN0ZW50bHkgYXBwbHkgYW4gaWRlbnRpZmllciByZW5hbWluZy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdSBzYWlkIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZSBmb28gYmFyOwoKICAgICAgICAgICBFdmVyeSBvY2N1cnJlbmNlIG9mICdmb28nIHdvdWxkIGJlIHJlbmFtZWQgdG8gJ2JhcicuIAogICAgICAgICAgIEFsdGhvdWdoIHRoaXMgd29ya3MgZmluZSBmb3IgcmVzb2x2aW5nIGEgY29uZmxpY3Qgd2l0aCBhCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHJlc2VydmVkIHdvcmQsIGl0IGlzIHVzZWxlc3MgZm9yCiAgICAgICAgICAgZm9yIGRlYWxpbmcgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMuICAgIFRoaXMgaXMgYmVjYXVzZQogICAgICAgICAgIGFsbCBtZXRob2RzIGFyZSBzaW1wbHkgcmVuYW1lZCB0byB0aGUgc2FtZSB0aGluZyAKICAgICAgICAgICAoZ2VuZXJhdGluZyB0aGUgc2FtZSBjb25mbGljdCBhcyBiZWZvcmUpLgoKICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBvbmx5IHdheSB0byBkZWFsIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzCiAgICAgICAgICAgd2FzIHRvIGdvIHRocm91Z2ggYW5kIGluZGl2aWR1YWxseSByZW5hbWUgdGhlbSBhbGwgdXNpbmcKICAgICAgICAgICAlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCB5b3UgaGFkIHRvIGRvIHRoaXMgZm9yIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3NlcyB0b28uCgogICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBtYWtlcyBpdCBleHRyZW1lbHkgaGFyZCB0byByZXNvbHZlCiAgICAgICAgICAgb3ZlcmxvYWRpbmcgd2l0aG91dCBhIGxvdCBvZiB3b3JrIGFuZCBtYWtlcyBpdCBhbG1vc3QKICAgICAgICAgICBpbXBvc3NpYmxlIHRvIHVzZSBTV0lHIG9uIHJhdyBDKysgLmggZmlsZXMuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCAlcmVuYW1lIG5vdyBhY2NlcHRzIHBhcmFtZXRlciBkZWNsYXJhdG9ycy4KICAgICAgICAgICBUaGUgc3ludGF4IGhhcyBhbHNvIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIEZvciBleGFtcGxlLAogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gcmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcihpbnQpJwogICAgICAgICAgIHRvICdiYXJfaScsIGxlYXZpbmcgYW55IG90aGVyIG9jY3VycmVuY2Ugb2YgJ2JhcicgYWxvbmUuCgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CgogICAgICAgICAgIFVzaW5nIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBub3cgc2VsZWN0aXZlbHkgcmVuYW1lIAogICAgICAgICAgIGNlcnRhaW4gZGVjbGFyYXRpb25zIGluIGFkdmFuY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2QpIGJhcihkb3VibGUpOwoKICAgICAgICAgICAgIC8vIEluY2x1ZGUgcmF3IEMrKyBoZWFkZXIgICAgCiAgICAgICAgICAgICAlaW5jbHVkZSAiaGVhZGVyLmgiCgogICAgICAgICAgIFdoZW4gJXJlbmFtZSBpcyB1c2VkIGluIHRoaXMgbWFubmVyLCBhbGwgb2NjdXJyZW5jZSBvZiBiYXIoaW50KQogICAgICAgICAgIGFyZSByZW5hbWVkIHdoZXJldmVyIHRoZXkgbWlnaHQgb2NjdXIuICBNb3JlIGNvbnRyb2wgaXMgb2J0YWluZWQKICAgICAgICAgICB0aHJvdWdoIGV4cGxpY2l0IHF1YWxpZmljYXRpb24uIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSA6OmJhcihpbnQpOwoKICAgICAgICAgICBvbmx5IGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24sCiAgICAgCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgRm9vOjpiYXIoaW50KTsKCiAgICAgICAgICAgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiBhIGNsYXNzIEZvby4KICAgICAgICAgICBUaGlzIGxhdHRlciBmb3JtIGFsc28gc3VwcG9ydHMgaW5oZXJpdGFuY2UuICBUaGVyZWZvcmUsIGlmIHlvdQogICAgICAgICAgIGhhZCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgU3BhbTo6YmFyKGludCkgbWV0aG9kIHdvdWxkIGFsc28gYmUgcmVuYW1lZCAoc2luY2UgU3BhbSAKICAgICAgICAgICBpcyBhIHN1YmNsYXNzIG9mIEZvbykuICAgVGhpcyBsYXR0ZXIgZmVhdHVyZSBtYWtlcyBpdCBlYXN5CiAgICAgICAgICAgZm9yIFNXSUcgdG8gYXBwbHkgYSBjb25zaXN0ZW50IHJlbmFtaW5nIGFjcm9zcyBhbiBlbnRpcmUKICAgICAgICAgICBjbGFzcyBoaWVyYXJjaHkgc2ltcGx5IGJ5IHNwZWNpZnlpbmcgcmVuYW1pbmcgcnVsZXMgZm9yCiAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgIEEgY2xhc3Mgd2lsZGNhcmQgb2YgKiBjYW4gYmUgdXNlZCBpZiB5b3Ugd2FudCB0byByZW5hbWluZwogICAgICAgICAgIGFsbCBtYXRjaGluZyBtZW1iZXJzIG9mIGFsbCBjbGFzc2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpICo6OmJhcihpbnQpOwoKICAgICAgICAgICB3aWxsIHJlbmFtZSBhbGwgbWVtYmVycyBiYXIoaW50KSB0aGF0IGFyZSBkZWZpbmVkIGluIGNsYXNzZXMuCiAgICAgICAgICAgSXQgd2lsbCBub3QgcmVuYW1lZCBkZWZpbml0aW9ucyBvZiBiYXIoaW50KSBpbiB0aGUgZ2xvYmFsCiAgICAgICAgICAgc2NvcGUuCgogICAgICAgICAgIFRoZSBvbGQgdXNlIG9mICVyZW5hbWUgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgaXMgc29tZXdoYXQKICAgICAgICAgICBlbmhhbmNlZC4gIAoKICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgYmFyOyAgICAgIC8vIFJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXInLgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSA6OmJhcjsgICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBnbG9iYWwgc2NvcGUgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgKjo6YmFyOyAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gY2xhc3NlcyBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBGb286OmJhcjsgLy8gUmVuYW1lIGFsbCAnYmFyJyBkZWZpbmVkIGluIGNsYXNzIEZvby4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGF0YS1tZW1iZXIgdG8gbWVtYmVyLWZ1bmN0aW9uIAogICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTm93IHN1cHBvc2UgdGhhdCB5b3Ugd2FudGVkIHRvIGFjY2VzcyB4IGFuZCB5IAogICAgICAgICAgIHRocm91Z2ggYSBtZW1iZXIgZnVuY3Rpb24gaW50ZXJmYWNlIGluc3RlYWQgCiAgICAgICAgICAgb2YgdGhlIHVzdWFsIFNXSUcgYmVoYXZpb3IuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBmLnNldF94KDMuNCkgICAgICAjIGluc3RlYWQgb2YgZi54ID0gMy40CiAgICAgICAgICAgICAgeCA9IGYuZ2V0X3goKSAgICAgIyBpbnN0ZWFkIG9mIHggPSBmLngKCiAgICAgICAgICAgVG8gZG8gdGhpcywgc2ltcGx5IHVzZSB0aGUgbmV3ICVhdHRyaWJ1dGVmdW5jCiAgICAgICAgICAgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldF8lcyxzZXRfJXMpCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICVub2F0dHJpYnV0ZWZ1bmMKCiAgICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byAlYXR0cmlidXRlZnVuYyBhcmUgQy1zdHlsZSBwcmludGYKICAgICAgICAgICBmb3JtYXQgc3RyaW5ncyB0aGF0IGRldGVybWluZSB0aGUgbmFtaW5nIGNvbnZlbnRpb24KICAgICAgICAgICB0byB1c2UuICAlcyBpcyByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUKICAgICAgICAgICBkYXRhIG1lbWJlci4gU1dJRyBwcm92aWRlcyBhIG51bWJlciBvZiBwcmludGYKICAgICAgICAgICBleHRlbnNpb25zIHRoYXQgbWlnaHQgaGVscC4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICB3YW50ZWQgdG8gdGl0bGUgY2FzZSBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMsIHlvdQogICAgICAgICAgIGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldCUodGl0bGUpcyxzZXQlKHRpdGxlKXMpOwoKICAgICAgICAgICBUaGlzIHdpbGwgdHVybiBhbiBhdHRyaWJ1dGUgJ2JhcicgdG8gJ2dldEJhcigpJyBhbmQgJ3NldEJhcigpJy4KCiAgICAgICAgICAgKHNvbWVvbmUgcmVxdWVzdGVkIHRoaXMgbG9uZyBhZ28sIGJ1dCBJIGZpbmFsbHkgZmlndXJlZAogICAgICAgICAgIGhvdyB0byBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgbWFubmVyKS4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBpZiBub25lIGFyZSBkZWZpbmVkLiAgVGhpcyB1c2VkIHRvIGJlCiAgICAgICAgICAgZW5hYmxlZCB3aXRoIGEgY29tbWFuZCBsaW5lIHN3aXRjaCAtbWFrZV9kZWZhdWx0LCBidXQKICAgICAgICAgICBtb3N0IHBlb3BsZSB3YW50IHRoZXNlIGZ1bmN0aW9ucyBhbnl3YXlzLiAgVG8gdHVybgogICAgICAgICAgIG9mZiB0aGlzIGJlaGF2aW9yIHVzZSB0aGUgLW5vX2RlZmF1bHQgb3B0aW9uIG9yIGluY2x1ZGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CiAKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQ7CiAgCiAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgY2VydGFpbiBpbnRlcmZhY2VzIHRoYXQgZGVmaW5lZCB0aGVpcgogICAgICAgICAgIG93biBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgdXNpbmcgdGhlIHNhbWUgbmFtaW5nCiAgICAgICAgICAgY29udmVudGlvbiBhcyBTV0lHLiAgSWYgc28sIHlvdSB3aWxsIGdldCBkdXBsaWNhdGUKICAgICAgICAgICBzeW1ib2xzIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIEl0ZXJhdG9ycwogICAgICAgICAgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIChGSVJTVEtFWSwgTkVYVEtFWSkuICBBbHNvLCBhdHRyaWJ1dGUKICAgICAgICAgICBhY2Nlc3MgaGFzIGJlZW4gY2hhbmdlZCB0byByZWx5IG9uIGluaGVyaXRhbmNlIGluIG9yZGVyCiAgICAgICAgICAgdG8gcHJvdmlkZSBiZXR0ZXIgYmVoYXZpb3IgYWNyb3NzIG1vZHVsZXMuICAKCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIFZhcmlvdXMgb2JzY3VyZSBpbXByb3ZlbWVudHMgdG8gdGhlIHR5cGUgc3lzdGVtIGFuZCBjbGFzc2VzLgogICAgICAgICAgIFN0cmFuZ2UgZGVjbGFyYXRpb25zIGxpa2UgdGhpcyBhcmUgbm93IHdyYXBwZWQgY29ycmVjdGx5CiAgICAgICAgICAgKGkuZS4sIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGRvZXNuJ3QgY2F1c2UgdGhlIEMrKwogICAgICAgICAgICBjb21waWxlciB0byBkaWUgd2l0aCBhIHR5cGUgZXJyb3IpLgoKICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIFJlYWw7CiAgICAgICAgICAgICAgICAgUmVhbCBmb28oUmVhbCAoKm9wKShSZWFsLFJlYWwpLCBSZWFsIHgsIFJlYWwgeSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgIEluaGVyaXRhbmNlIG9mIHR5cGVzIGlzIGFsc28gaGFuZGxlZCBjb3JyZWN0bHkuCiAgICAgICAgICAgCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gY2xhc3Mgd3JhcHBlcnMuICAgV2hlbiBTV0lHIHNlZXMgdHdvIGNsYXNzZXMgbGlrZSB0aGlzLAogCiAgICAgICAgICAgY2xhc3MgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGNsYXNzIFkgOiBwdWJsaWMgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBiYXIoKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGl0IG5vdyBvbmx5IGdlbmVyYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnM6CiAKICAgICAgICAgICAgIFhfZm9vKFggKngpIHsgeC0+Zm9vKCk7IH0KICAgICAgICAgICAgIFlfYmFyKFkgKnkpIHsgeS0+YmFyKCk7IH0KIAogICAgICAgICAgIFVubGlrZSBTV0lHMS4xNSwgdGhlIGZvbygpIG1ldGhvZCBkb2VzICpub3QqIHByb3BhZ2F0ZSB0byBhIHdyYXBwZXIKICAgICAgICAgICBmdW5jdGlvbiBZX2ZvbygpLiBJbnN0ZWFkLCB0aGUgYmFzZSBjbGFzcyBtZXRob2QgWF9mb28oKSBtdXN0IGJlCiAgICAgICAgICAgdXNlZC4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgbW9kdWxlcyB0aGF0IHVzZSBzaGFkb3cgY2xhc3NlcywgYnV0CiAgICAgICAgICAgaXQgbWlnaHQgYnJlYWsgbW9kdWxlcyB0aGF0IGRpcmVjdGx5IHVzZSB0aGUgbG93LWxldmVsIEMgd3JhcHBlcnMuCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSBmb3IgYSBudW1iZXIgb2YgcmVhc29uczoKCiAgICAgICAgICAgICAgIC0gIEl0IGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgU1dJRy0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICB3aXRoIGFudGljaXBhdGVkIGZ1dHVyZSBjaGFuZ2VzIHN1Y2ggYXMgb3ZlcmxvYWRlZCBtZXRob2RzLgoKICAgICAgICAgICAgICAgLSAgSXQgcmVzdWx0cyBpbiBzdWJzdGFudGlhbGx5IGxlc3Mgd3JhcHBlciBjb2RlLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIGZvciBiaWcgQysrIGNsYXNzIGhpZXJhcmNoaWVzIChpbmhlcml0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAgIGFyZSBubyBsb25nZXIgY29waWVkIGludG8gZXZlcnkgc2luZ2xlIGRlcml2ZWQgY2xhc3MpLgoKICAgICAgICAgICAgICAgLSAgSXQgYWxsb3dzIGZvciBiZXR0ZXIgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIChjb2RlIGlzbid0IHJlcGxpY2F0ZWQgaW4KICAgICAgICAgICAgICAgICAgZXZlcnkgc2luZ2xlIG1vZHVsZSkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBQcm92aWRlZCBzb21lIFdpbmRvd3MgZG9jdW1lbnRhdGlvbiBpbiB0aGUgV2luIGRpcmVjdG9yeSBhbmQgc29tZQogICAgICAgICAgIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlcyBmb3IgcnVubmluZyBleGFtcGxlcyBvbiBXaW5kb3dzLgoKOC8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSByZW5hbWVkIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHByb3Blcmx5OwoJICAgdGhhbmtzIHRvIE1hcmMgWm9uem9uIDxNYXJjLlpvbnpvbkB1bml2LXJlbm5lczEuZnI+IGZvciB0aGUKCSAgIHBhdGNoLiAgU2VlIHRoZSBuZXcgdGVzdCBjYXNlIG5hbWVfY3h4LgoKOC8yNy8yMDAxOiBta29lcHBlCgkgICBbVGNsXSBSZW1vdmVkIGxvdHMgb2Ygd2FybmluZ3MgaXNzdWVkIGJ5IHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycywgd2hpY2ggd2VyZSBjYXVzZWQgYnkgbWl4aW5nIGZ1bmN0aW9uIHBvaW50ZXJzCgkgICBvZiBkaWZmZXJlbnQgbGlua2FnZXMgKEMrKy9DKS4gCgo4LzIzLzIwMDE6IG1rb2VwcGUKCSAgIEltcHJvdmVkIHRoZSBNelNjaGVtZSBtb2R1bGUgYnkgcG9ydGluZyBHdWlsZSdzIHBvaW50ZXIKCSAgIHR5cGUgY2hlY2tpbmcgc3lzdGVtIGFuZCBtYWtpbmcgdHlwZSBkaXNwYXRjaAoJICAgdHlwZW1hcC1kcml2ZW4uIAoKOC8yMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW50aXJlbHkgbmV3IHN5bWJvbCB0YWJsZSBwcm9jZXNzaW5nLiAgIFNXSUcgc2hvdWxkIGJlIGFibGUgdG8KICAgICAgICAgICByZXBvcnQgbXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIG11bHRpcGxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgQWxzbywgdGhlIG5ldyBzeW1ib2wgdGFibGUgYWxsb3dzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucwogICAgICAgICAgIChhbHRob3VnaCBvdmVybG9hZGluZyBpc24ndCBxdWl0ZSBzdXBwb3J0ZWQgaW4gdGhlIGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcyB5ZXQpLgoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSAlbmV3IHN1cHBvcnQgYWRkZWQuCiAgICAgICAgICAgKiBbSmF2YV0gUGFja2FnZSBKTkkgbmFtZSByZWZpeGVkIQoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUHl0aG9uIG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IHBvaW50ZXJzIHRvIEMrKyBtZW1iZXJzLiAgVGhpcwogICAgICAgICAgIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbGltaXRlZCBwYXJzaW5nIGFuZCBmdWxsIHR5cGUtc3lzdGVtIHN1cHBvcnQgZm9yIHBvaW50ZXJzIHRvCiAgICAgICAgICAgbWVtYmVycy4gTm9uZSBvZiBTV0lHJ3MgbGFuZ3VhZ2UgbW9kdWxlcyByZWFsbHkga25vdyBob3cgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgdGhpcyBzbyB0aGlzIGlzIHJlYWxseSBvbmx5IHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MgYW5kIGZ1dHVyZQogICAgICAgICAgIGV4cGFuc2lvbi4gIE5vdGU6IFNXSUcgZG9lcyBub3Qgc3VwcG9ydCBwb2ludGVycyB0byBtZW1iZXJzIHdoaWNoIAogICAgICAgICAgIGFyZSB0aGVtc2VsdmVzIHBvaW50ZXJzIHRvIG1lbWJlcnMsIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMgdG8gbWVtYmVycywKICAgICAgICAgICBvciBvdGhlciBjb21wbGljYXRlZCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgaXMgbXVjaCBiZXR0ZXIgYXQgcGFyc2luZyBjZXJ0YWluIEMrKyBkZWNsYXJhdGlvbnMuIE9wZXJhdG9ycyBhbmQKICAgICAgICAgICBmcmllbmRzIGdlbmVyYWxseSBkb24ndCBjYXVzZSBhbnltb3JlIHN5bnRheCBlcnJvcnMuICBIb3dldmVyLCBuZWl0aGVyCiAgICAgICAgICAgYXJlIHJlYWxseSBzdXBwb3J0ZWQuCgo4LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAqaGlnaGx5KiBleHBlcmltZW50YWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgb2YgQysrCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zLiAgU2luY2UgQysrIHRlbXBsYXRlcyBhcmUgZXNzZW50aWFsbHkKICAgICAgICAgICBnbG9yaWZpZWQgbWFjcm9zIGFuZCBTV0lHIGhhcyBhIGZ1bGx5IG9wZXJhdGlvbmFsIEMgCiAgICAgICAgICAgcHJlcHJvY2Vzc29yIHdpdGggbWFjcm8gc3VwcG9ydCwgdGhlIHBhcnNlciBub3cgY29udmVydHMKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgdG8gbWFjcm9zLiAgRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24KICAgICAgICAgICB0ZW1wbGF0ZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IFQgbWF4KFQgYSwgVCBiKTsKCiAgICAgICAgICAgaXMgaW50ZXJuYWxseSBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV9tYXgoX19uYW1lLFQpCiAgICAgICAgICAgICAgICVuYW1lKF9fbmFtZSkgVCBtYXgoVCBhLCBUIGIpOwogICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFRvIGluc3RhbnRpYXRlIGEgdmVyc2lvbiBvZiB0aGUgdGVtcGxhdGUsIGEgc3BlY2lhbCAldGVtcGxhdGUgZGVjbGFyYXRpb24KICAgICAgICAgICBpcyB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47CgogICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgdG8gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSBwcm9wZXIgQyBpZGVudGlmaWVyIHRoYXQncwogICAgICAgICAgIHVzZWQgdG8gdW5pcXVlbHkgbmFtZSB0aGUgcmVzdWx0aW5nIGluc3RhbnRpYXRpb24uICAgV2hlbiB1c2VkLCB0aGUKICAgICAgICAgICB0aGUgZXhwYW5kZWQgbWFjcm8gbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlbmFtZShtYXhpbnQpIGludCBtYXgoaW50IGEsIGludCBiKTsKICAgICAgICAgICAgICAlbmFtZShtYXhkb3VibGUpIGRvdWJsZSBtYXgoZG91YmxlIGEsIGRvdWJsZSBiKTsKCiAgICAgICAgICAgQSBzaW1pbGFyIHRlY2huaXF1ZSBpcyB1c2VkIGZvciB0ZW1wbGF0ZSBjbGFzc2VzLiAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmVjdG9yKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgR2V0cyBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX3ZlY3RvcihfX25hbWUsIFQpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxUPiBfX25hbWU7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBfX25hbWUgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBfX25hbWUoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgX19uYW1lIHZlY3RvcjxUPjsKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIEEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBpcyBjcmVhdGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5OgoKICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWMpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBUaGUgcmVzdWx0aW5nIGNvZGUgcGFyc2VkIGJ5IFNXSUcgaXMgdGhlbjoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlYzsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIGludHZlYyB7CiAgICAgICAgICAgICAgICAgIGludCAqZGF0YTsKICAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50dmVjKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgICBpbnQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBpbnR2ZWMgdmVjdG9yPGludD47CgogICAgICAgICAgIE5vdGU6IHRoZSBsYXN0IHR5cGVkZWYgaXMgbm9uLXN0YW5kYXJkIEMgYW5kIGlzIHVzZWQgYnkgU1dJRyB0byBwcm92aWRlCiAgICAgICAgICAgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgbmFtZSAiaW50dmVjIiBhbmQgdGhlIHRlbXBsYXRlIHR5cGUgCiAgICAgICAgICAgInZlY3RvcjxpbnQ+Ii4KCiAgICAgICAgICAgQ0FVVElPTjogIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIHRoZSBmaXJzdCB0aW1lIFNXSUcgaGFzCiAgICAgICAgICAgc3VwcG9ydGVkIEMrKyB0ZW1wbGF0ZXMuICAgRXJyb3IgcmVwb3J0aW5nIGlzIGVzc2VudGlhbCBub24tZXhpc3RlbnQuCiAgICAgICAgICAgSXQgd2lsbCBwcm9iYWJseSBicmVhayBpbiBjZXJ0YWluIGNhc2VzLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqKgoKOC8xNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHdyYXBwaW5nIG9mIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cy4gIEFycmF5cwogICAgICAgICAgIGFyZSBub3cgcHJvcGVybHkgbWFwcGVkIHRvIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZgogICAgICAgICAgIG9uZSBsZXNzIGRpbWVuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBbMTBdOyAgICAgICAgICAgICAgLS0+ICBpbnQgKgogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdOyAgICAgICAgICAtLT4gIGludCAoKilbMjBdOwogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdWzMwXTsgICAgICAtLT4gIGludCAoKilbMjBdWzMwXTsKCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNlcnRhaW4gU1dJRyBleHRlbnNpb25zIGJlY2F1c2UKICAgICAgICAgICBvbGRlciB2ZXJzaW9ucyBzaW1wbHkgbWFwcGVkIGFsbCBhcnJheXMgaW50byBhIHNpbmdsZQogICAgICAgICAgIHBvaW50ZXIgc3VjaCBhcyAiaW50ICoiLiAgIEFsdGhvdWdoIHBvc3NpYmx5IHVudXN1YWwsIAogICAgICAgICAgIHRoZSBuZXcgdmVyc2lvbiBpcyBjb3JyZWN0IGluIHRlcm1zIG9mIHRoZSBDIHR5cGUgc3lzdGVtLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gQXJyYXkgc2V0dGVycyBnZW5lcmF0ZWQgZm9yIHN0cnVjdC9jbGFzcyBhcnJheSBtZW1iZXJzLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFueSBpbXByb3ZlbWVudHMgdG8gVGNsL1BlcmwvUHl0aG9uIG1vZHVsZXMgdG8gYmV0dGVyCiAgICAgICAgICAgd29yayB3aXRoIG11bHRpcGxlIGludGVyZmFjZSBmaWxlcyBhbmQgdGhlICVpbXBvcnQgZGlyZWN0aXZlLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIGJlaGF2aW9yIG9mICVpbXBvcnQgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgcG9sbHV0ZXMgdGhlIG1vZHVsZSBuYW1lc3BhY2UgYnkgdXNpbmcKICAgICAgICAgICAnZnJvbSBtb2R1bGUgaW1wb3J0IConIHRvIHJlZmVyIHRvIHRoZSBvdGhlciBtb2R1bGUuIAogICAgICAgICAgIEluc3RlYWQsIGl0IGRvZXMgYSBwcm9wZXIgJ2ltcG9ydCBtb2R1bGUnLiAgIEFsc28sIFNXSUcKICAgICAgICAgICBtYXkgd29yayBhIGxvdCBiZXR0ZXIgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcyB0aGF0IGluY2x1ZGUKICAgICAgICAgICByZWZlcmVuY2VzIHRvIG90aGVyIGltcG9ydGVkIG1vZHVsZXMuCgo4LzEzLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIG5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxpemluZyB0aG9zZSBvZiB0aGUKCSAgIEd1aWxlLXNwZWNpZmljIDUvMjcvMjAwMSBjaGFuZ2VzOiAKCSAgICogJGRlc2NyaXB0b3IgaXMgdGhlIHNhbWUgYXMgU1dJR1RZUEUkbWFuZ2xlLCBidXQgYWxzbwoJICAgICBlbnN1cmVzIHRoYXQgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGlzIG5hbWUgZ2V0cwoJICAgICBkZWZpbmVkLgoJICAgKiAkKnR5cGUsICQqbHR5cGUsICQqbWFuZ2xlLCAkKmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IHN0YXIsIGJ1dCB0aGV5IFJFTU9WRSBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgZnJvbSB0aGUgdHlwZS4gKFRoaXMgaXMgb25seSB2YWxpZCBmb3IgcG9pbnRlciAKCSAgICAgdHlwZXMuKQoJICAgKiAkJnR5cGUsICQmbHR5cGUsICQmbWFuZ2xlLCAkJmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IGFtcGVyc2FuZCwgYnV0IHRoZXkgQUREIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyB0byB0aGUgdHlwZS4KCSAgIFRoZSBHdWlsZS1zcGVjaWZpYyBzdWJzdGl0dXRpb24gJGJhc2VkZXNjcmlwdG9yIHdhcyByZW1vdmVkCgkgICBiZWNhdXNlIGl0IHdhcyB1c2VsZXNzLgoKOC8xMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVleHRlcm4gZGlyZWN0aXZlIGlzIG5vdyBkZXByZWNhdGVkIGFuZCB3aXRoZHJhd24uICBUaGUKICAgICAgICAgICBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlIHdhcyB0byBpbXBvcnQgc2VsZWN0ZWQgZGVmaW5pdGlvbnMKICAgICAgICAgICBmcm9tIG90aGVyIGludGVyZmFjZSBmaWxlcyBhbmQgaGVhZGVycy4gIEhvd2V2ZXIsIHRoZSBzYW1lCiAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyBiZXR0ZXIgaGFuZGxlZCB0aHJvdWdoICVpbXBvcnQuICAgVGhpcwogICAgICAgICAgIGxlYXZlcyBTV0lHIHdpdGggdHdvIGZpbGUgaW5jbHVzaW9uIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVpbmNsdWRlIGZpbGVuYW1lICAgICAtIEluc2VydHMgaW50byBjdXJyZW50IGludGVyZmFjZQogICAgICAgICAgICAgICVpbXBvcnQgZmlsZW5hbWUgICAgICAtIEltcG9ydCB0eXBlcyBhbmQgY2xhc3NlcyBmcm9tIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgbW9kdWxlCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbmV3IHN1cHBvcnQgZm9yIHdyYXBwaW5nIEMvQysrIGNhbGxiYWNrIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgQSBjb21tb24gcHJvYmxlbSB3aXRoIHNvbWUgQyBsaWJyYXJpZXMgaXMgdGhhdCBtYW55CiAgICAgICAgICAgZnVuY3Rpb25zIHRha2UgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGFuIGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgaW50ICgqb3ApKGludCxpbnQpLCAuLi4pOwoKICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgb25seSB3YXkgdG8gY2FsbCBzdWNoIGEgZnVuY3Rpb24gaXMgdG8KICAgICAgICAgICBwYXNzIGl0IGEgZnVuY3Rpb24gcG9pbnRlciBvZiBzb21lIGNvbXBhdGlibGUgdHlwZS4gIEluCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgeW91IGhhZCB0byBzb2x2ZSB0aGlzIHByb2JsZW0KICAgICAgICAgICB3aXRoIHNvbWUgcmVhbGx5IGdyb3NzIGhhY2tzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBhcyBhIGNhbGxiYWNrLAoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsIGludCk7CgogICAgICAgICAgIHlvdSBoYWQgdG8gaW5zdGFsbCBhIHBvaW50ZXIgdG8gaXQgYXMgYSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIAoKICAgICAgICAgICAgICAgY29uc3QgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgaWYgeW91IGhhZCBhIHJlYWxseSBvbGQgU1dJRyB2ZXJzaW9uOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpPUF9GVU5DKShpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgT1BfRlVOQywgLi4uKTsKICAgICAgICAgICAgICAgY29uc3QgT1BfRlVOQyBGT08gPSBmb287CgogICAgICAgICAgIAogICAgICAgICAgIE5vdywgeW91IGNhbiBkbyBvbmUgb2YgdHdvIHRoaW5nczoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgZm9vKGludCxpbnQpOwoKICAgICAgICAgICBUaGlzIGNyZWF0ZXMgYSBjb25zdGFudCAnZm9vJyBvZiB0eXBlIGludCAoKikoaW50LGludCkuCiAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb25zIGFyZSBpbnN0YWxsZWQgYXMgY29uc3RhbnRzIHdoZXJlCiAgICAgICAgICAgdGhlIG5hbWUgaXMgZGVmaW5lZCBieSB0aGUgZm9ybWF0IHN0cmluZyBnaXZlbiB0byAlY2FsbGJhY2soKS4KICAgICAgICAgICBJZiB0aGUgbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGRpZmZlciBmcm9tIHRoZQogICAgICAgICAgIGFjdHVhbCBmdW5jdGlvbiBuYW1lLCBib3RoIGEgZnVuY3Rpb24gd3JhcHBlciBhbmQgYSBjYWxsYmFjayAKICAgICAgICAgICBjb25zdGFudCBhcmUgY3JlYXRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlKHVwcGVyKXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CiAgICAgICAgICAgCiAgICAgICAgICAgQ3JlYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnMgJ2ZvbycsICdiYXInIGFuZCBhZGRpdGlvbmFsbHkKICAgICAgICAgICBjcmVhdGVzIHR3byBjYWxsYmFjayBjb25zdGFudHMgJ0ZPTycsICdCQVInLgoKICAgICAgICAgICBOb3RlOiBTV0lHIHN0aWxsIGRvZXMgbm90IHByb3ZpZGUgYXV0b21hdGljIHN1cHBvcnQgZm9yIAogICAgICAgICAgIHdyaXRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIHN0cnVjdCBuZXN0aW5nIGZpeGVzIGFzIHBlciBTRiBidWcgIzQ0NzQ4OC4KCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlbmFtZSBkaXJlY3RpdmUgbm93IGFwcGxpZXMgdG8gY29uc3RhbnRzIGNyZWF0ZWQgd2l0aAogICAgICAgICAgICNkZWZpbmUgYW5kICVjb25zdGFudC4gIEhvd2V2ZXIsIG1vc3QgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgIHdlcmUgbmV2ZXIgd3JpdHRlbiB0byBzdXBwb3J0IHRoaXMgYW5kIHdpbGwgaGF2ZSB0byBiZQogICAgICAgICAgIG1vZGlmaWVkIHRvIG1ha2UgaXQgd29yay4gIFRjbCwgUHl0aG9uLCBhbmQgUGVybCBtb2R1bGVzCiAgICAgICAgICAgYXJlIHdvcmtpbmcgbm93LgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hc3NpdmUgY2hhbmdlcyBhbmQgc2ltcGxpZmljYXRpb24gb2YgQyBkZWNsYXJhdGlvbiBwYXJzaW5nLgogICAgICAgICAgIEFsdGhvdWdoIFNXSUcgaXMgc3RpbGwgbm90IGEgZnVsbCBDIHBhcnNlciwgaXRzIGFiaWxpdHkKICAgICAgICAgICB0byBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgaW5jbHVkaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBwb2ludGVycyB0byBhcnJheXMgaGFzIGJlZW4gdmFzdGx5IGltcHJvdmVkLiAgCgo4LzAzLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogRGlzdHJpYnV0aW9uIGZpeGVzOiBhdXRvY29uZiBubyBsb25nZXIgbmVlZGVkIHRvIGluc3RhbGwgU1dJRy4KCjgvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgdHdvIHVuZG9jdW1lbnRlZCBwYXJzaW5nIGZlYXR1cmVzLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICBzdXBwb3J0cyBvdXQtb2YtY2xhc3Mgc3RhdGljIGZ1bmN0aW9uIG9yIHZhcmlhYmxlCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RhdGljIGludCBGb286OmJhcjsKCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIG1heSByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudCBkZW1hbmQuIAogICAgICAgICAgIEhvd2V2ZXIsIHNpbmNlIFNXSUcgaXMgbW9zdCBvZnRlbiB1c2VkIHdpdGggaGVhZGVyIGZpbGVzLAogICAgICAgICAgIGl0IGlzIG1vcmUgbGlrZWx5IGZvciB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSBpbmNsdWRlZAogICAgICAgICAgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQ2xlYW51cCBvZiB0aGUgR0lGUGxvdCBleGFtcGxlcy4gVXBncmFkZWQgSmF2YSBHSUZQbG90IGV4YW1wbGUuCgo4LzAxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gRWZmaWNpZW5jeSBjaGFuZ2VzOiBfY1B0ciB1c2VkIHdoZXJlIHBvc3NpYmxlIHJhdGhlciB0aGFuCgkgICAgIGdldENQdHIoKS4gQnVnIGZpeGVzIGZvciBpbmhlcml0YW5jZSAtIGRlcml2ZWQgY2xhc3Mgc29tZXRpbWVzCgkgICAgIGRpZG4ndCBkZWxldGUgdGhlIGMgbWVtb3J5IHdoZW4gX2RlbGV0ZSgpIHdhcyBjYWxsZWQuCgkgICAqIFtKYXZhXSBBYnN0cmFjdCBjKysgY2xhc3NlcyBhcmUgd3JhcHBlZCB3aXRoIGEgamF2YSBhYnN0cmFjdCBzaGFkb3cKCSAgICAgY2xhc3MuIEFsc28gYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gaXMgbWFwcGVkIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLgoJICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBoYXMgYWx3YXlzIGJlZW4gPG1vZHVsZT5fd3JhcC5jLiBJdCBpcyBub3cKCSAgICAgPG1vZHVsZT5fd3JhcC5jeHggaWYgdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uIGlzIHBhc3NlZCB0byBzd2lnLgoJICAgICBUaGlzIGhhcyBiZWVuIGRvbmUgYXMgb3RoZXJ3aXNlIGMrKyBjb2RlIHdvdWxkIGFwcGVhciBpbiBhIGMgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCgo3LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSB0byBiZSBtb3JlIEMtbGlrZSBpbiBzeW50YXguCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBub3c6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IE5BTUUgPSBWQUxVRTsKICAgICAgICAgICAgICAgICVjb25zdGFudCBUWVBFIE5BTUUgPSBWQUxVRTsKIAogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBGb28gKkJhciA9ICZTcGFtOwoKICAgICAgICAgICBBIG1vcmUgc3VidGxlIGNhc2UgaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gYmxhaDsKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBNb2R1bGVzIHRoYXQgd2VyZSB1c2luZwogICAgICAgICAgIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIGRpcmVjdGx5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkIGZvcm0gb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgJWlubGluZSBpbnQgYmxhaChpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAogICAgICAgICAgIChub3RlOiB0aGlzIGZlYXR1cmUgd2FzIG5ldmVyIGRvY3VtZW50ZWQgYW5kIGlzIHdpdGhkcmF3bikKCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gZXhwbGljaXRseSBkZWNsYXJlZAogICAgICAgICAgIHJldHVybiB0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBmb28oaW50KTsKCiAgICAgICAgICAgSW4gQywgc3VjaCBmdW5jdGlvbnMgd2VyZSBpbXBsaWNpdGx5IGFzc3VtZWQgdG8gcmV0dXJuIGFuICdpbnQnLgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyBpbGxlZ2FsLiAgRWl0aGVyIHdheSwgaXQncyBjb25zaWRlcmVkIGJhZAogICAgICAgICAgIHN0eWxlLiAgUmVtb3Zpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbiBTV0lHIHdpbGwgc2ltcGxpZnkKICAgICAgICAgICBjZXJ0YWluIGlzc3VlcyBpbiBwYXJzaW5nLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8zMC8yMDAxOiBta29lcHBlCgkgICAqIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rLiAgVGhlIFNvdXJjZS9ET0ggZGlyZWN0b3J5CgkgICAgIGFuZCBtb3N0IG9mIHRoZSBTb3VyY2UvU3dpZyBkaXJlY3RvcnkgaXMgdXAtdG8tZGF0ZSBub3cuCgkgICAqIFtHdWlsZV0gJXNjaGVtZSBpcyBub3cgYSBtYWNybyBmb3IgJWluc2VydCgic2NoZW1lIikuICAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgIkZJTEVOQU1FIjsgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICV7IFNDSEVNRS1DT0RFICV9CgkgICAgIE5ldyBtYWNyb3MgJW11bHRpcGxlX3ZhbHVlcywgJXZhbHVlc19hc19saXN0LAoJICAgICAldmFsdWVzX2FzX3ZlY3Rvci4gCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIFNXSUcgcHJhZ21hcy4KICAgICAgICAgICAlcHJhZ21hKHN3aWcpIHJlYWRvbmx5IGFuZCAlcHJhZ21hKHN3aWcpIHJlYWR3cml0ZS4gIE1hY3JvcwogICAgICAgICAgIGFyZSB1c2VkIHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVwcmFnbWEgZGlyZWN0aXZlLiAgJXByYWdtYSBtdXN0IGFsd2F5cwogICAgICAgICAgIGJlIGRpcmVjdGVkIHRvIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXByYWdtYShzd2lnKSBtYWtlX2RlZmF1bHQ7CiAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJibGFoLmkiOwoKICAgICAgICAgICBBbHNvIGV4dGVuZGVkIHRoZSBwcmFnbWEgZGlyZWN0aXZlIHRvIGFsbG93IGNvZGUgYmxvY2tzCiAKICAgICAgICAgICAgICAlcHJhZ21hKGZvbykgY29kZSA9ICV7CiAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdGhlIHdheSAnY29uc3QnIHZhcmlhYmxlcyBhcmUgd3JhcHBlZC4gIEluIAogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGEgJ2NvbnN0JyB2YXJpYWJsZSB3YXMKICAgICAgICAgICB3cmFwcGVkIGFzIGEgY29uc3RhbnQuICAgTm93LCAnY29uc3QnIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMuICBUaGVyZSBhcmUgc2V2ZXJhbAogICAgICAgICAgIHJlYXNvbnMgZm9yIG1ha2luZyB0aGlzIGNoYW5nZSwgbW9zdGx5IHBlcnRhaW5pbmcgdG8KICAgICAgICAgICBzdWJ0bGUgZGV0YWlscyBvZiBob3cgJ2NvbnN0JyBhY3R1YWxseSB3b3Jrcy4gCgogICAgICAgICAgIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbGQgaW50ZXJmYWNlcyB0aGF0IHVzZWQgJ2NvbnN0JwogICAgICAgICAgIHRvIGNyZWF0ZSBjb25zdGFudHMuICAgQXMgYSByZXBsYWNlbWVudCwgY29uc2lkZXIgdXNpbmcgdGhpczoKCiAgICAgICAgICAgY29uc3QgaW50IGEgPSA0OyAgID09PT4gICAlY29uc3RhbnQgaW50IGEgPSA0OwogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVvcmdhbml6YXRpb24gYW5kIHNpbXBsaWZpY2F0aW9uIG9mIHR5cGUgcGFyc2luZy4KICAgICAgICAgICBUeXBlcyB3aXRoICdjb25zdCcgc2hvdWxkIHdvcmsgY29ycmVjdGx5IG5vdy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vc3Qgc3dpZyBkaXJlY3RpdmVzIHJlbGF0ZWQgdG8gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCiAgICAgICAgICAgYXJlIG5vdyBkZXByZWNhdGVkLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBPYmplY3RpdmUtQyBpbiBvcmRlciB0byBzaW1wbGlmeQogICAgICAgICAgIHBhcnNlciByZWNvbnN0cnVjdGlvbi4gIFdpbGwgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQKICAgICAgICAgICBkZW1hbmQuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDb2RlIGluY2x1c2lvbiBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgcGFyc2VyLiAgQSBjb21tb24KICAgICAgICAgICBkaXJlY3RpdmUgJWluc2VydCBpcyBub3cgdXNlZCBmb3IgZXZlcnl0aGluZy4gIFRoaXMKICAgICAgICAgICBpbnNlcnRzIGEgZmlsZSBpbnRvIHRoZSBvdXRwdXQ6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgImZvby5zd2ciCgogICAgICAgICAgIFRoaXMgaW5zZXJ0cyBzb21lIGlubGluZSBjb2RlIGludG8gdGhlIG91dHB1dAoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICV7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAKICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhlcmUgYXJlIGZpdmUgcHJlZGVmaW5lZCB0YXJnZXRzIGZvciB0aGUgaW5zZXJ0IGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICJoZWFkZXIiICAgIC0gSGVhZGVyIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJydW50aW1lIiAgIC0gUnVudGltZSBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAid3JhcHBlciIgICAtIFdyYXBwZXIgc2VjdGlvbgogICAgICAgICAgICAgICAiaW5pdCIgICAgICAtIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICJudWxsIiAgICAgIC0gTm90aGluZy4gRGlzY2FyZC4KCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGFyZSBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBhcmUKICAgICAgICAgICBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBtYWNyb3M6CgogICAgICAgICAgICAgICAleyAuLi4gJX0gICAgICAgICAgIC0+ICVpbnNlcnQoaGVhZGVyKSAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVpbml0ICV7IC4uLiAlfSAgICAgLT4gJWluc2VydChpbml0KSAgICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXdyYXBwZXIgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHdyYXBwZXIpICV7IC4uLiAlfQogICAgICAgICAgICAgICAlcnVudGltZSAleyAuLi4gJX0gIC0+ICVpbnNlcnQocnVudGltZSkgJXsgLi4uICV9CgogICAgICAgICAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIGRlZmluZSBuZXcgbmFtZWQgdGFyZ2V0cyBieSB1c2luZyB0aGUKICAgICAgICAgICBDIEFQSSBmdW5jdGlvbiBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoKSAoc2VlIG1haW4uY3h4KS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBleHBvc2UgYSBzaGFkb3cgY2xhc3MgZmlsZSwKICAgICAgICAgICB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCJzaGFkb3ciLCBmX3NoYWRvdyk7CgogICAgICAgICAgIFRoZW4gaW4gdGhlIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgICAlaW5zZXJ0KHNoYWRvdykgJXsgLi4uICV9CgogICAgICAgICAgIE5vdGU6IHRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IGFueSBvbGQgaW50ZXJmYWNlcywgYnV0CiAgICAgICAgICAgZG9lcyBvcGVuIHVwIG5ldyBwb3NzaWJpbGl0aWVzIGZvciBlbmhhbmNlbWVudHMuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhbHdheXMgaW5jbHVkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IGZpbGUgJ3N3aWcuc3dnJy4KICAgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucwogICAgICAgICAgIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiB2YXJpb3VzIFNXSUcgZGlyZWN0aXZlcy4KICAgICAgICAgICBQcmV2aW91c2x5LCBhbGwgU1dJRyBkaXJlY3RpdmVzIHdlcmUgaGFuZGxlZCBhcyBzcGVjaWFsCiAgICAgICAgICAgY2FzZXMgaW4gdGhlIHBhcnNlci4gIFRoaXMgbWFkZSB0aGUgcGFyc2VyIGEgbGFyZ2UgCiAgICAgICAgICAgYmxvYXRlZCBtZXNzLiAgTm93LCB0aGUgcGFyc2VyIGlzIHN0cmlwcGVkIGRvd24gdG8gYSBmZXcKICAgICAgICAgICBzaW1wbGUgZGlyZWN0aXZlcyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBldmVyeXRoaW5nIGVsc2UuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBGaXhlcyBmb3IgU291cmNlZm9yZ2UgYnVnICM0NDQ3NDggLSBuZXcgdGVzdGNhc2UgY3BwX3N0YXRpYzoKCSAgICAgW1RDTF0gQ2xhc3Mgd2l0aCBqdXN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUvZnVuY3Rpb24gZml4CgkgICAgIFtKYXZhXSBGaXhlZCBzdGF0aWMgdmFyaWFibGVzIHN1cHBvcnQKCSAgICAgW1J1YnldIFN0YXRpYyB2YXJpYWJsZXMgd29ya2Fyb3VuZCByZW1vdmVkCgo3LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogc3R5cGUuYyAoU3dpZ1R5cGVfZGVmYXVsdCk6IFN0cmlwIHF1YWxpZmllcnMgZmlyc3QuIFRoZQoJICAgICBkZWZhdWx0IHR5cGUgb2YgImludCAqIGNvbnN0IiBpcyBub3cgIlNXSUdQT0lOVEVSICoiLgoJICAgKiBtYWluLmN4eDogRGVmaW5lICJfX2NwbHVzcGx1cyIgaW4gU1dJRydzIHByZXByb2Nlc3NvciBpZgoJICAgICBpbiBDKysgbW9kZS4KCSAgICogW0d1aWxlXTogQWRkZWQgc29tZSBzdXBwb3J0IGZvciBhcnJheXMgYW5kIEMrKwoJICAgICByZWZlcmVuY2VzLCBmaXhpbmcgdGhlICJjb25zdGFudF9wb2ludGVycyIgdGVzdCBjYXNlLgoJICAgKiBNb3ZlZCBtb3N0IHRlc3RzIGZyb20gdGhlIG9sZCBHdWlsZS1zcGVjaWZpYyB0ZXN0LXN1aXRlCgkgICAgIHRvIHRoZSBuZXcgdGVzdC1zdWl0ZS4gIEFsc28gbW92ZWQgcGVybDUvcG9pbnRlci1jeHgKCSAgICAgZXhhbXBsZSB0aGVyZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFRlc3Qtc3VpdGUgYWRkZWQuCgkgICAqIEluaXRpYWwgdGVzdGNhc2VzOiBjb25zdGFudF9wb2ludGVycyBjcHBfZW51bSBkZWZpbmVzCgkgICAgIHNpemVvZl9wb2ludGVycyB1bmlvbnMgdmlydHVhbF9kZXN0cnVjdG9yCgkgICAqIE1ha2UgY2xlYW4gaW1wcm92ZW1lbnRzLgoKNy8yNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIFVuZGVyc2NvcmVzIGluIHRoZSBwYWNrYWdlIG5hbWUgYW5kL29yIG1vZHVsZSBuYW1lCgkgICBubyBsb25nZXIgZ2l2ZSBsaW5raW5nIHByb2JsZW1zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTW9yZSBwYXJzZXIgYnVnIGZpeGVzIGZvciBjb25zdGFudCBwb2ludGVycwoKNy8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV0gQWVzdGhldGljIGltcHJvdmVtZW50IGluIHZhcmlhYmxlIHdyYXBwZXJzLgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBjb3JlLWR1bXAgcHJvYmxlbSBpbiBwb2ludGVyIGxpYnJhcnkgd2hlbiAKICAgICAgICAgICAgIGZyZWVpbmcgY2hhcmFjdGVyIGFycmF5cy4KICAgICAgICAgICAgIFNGIEJ1ZyBbICM0MTU4MzcgXSBwb2ludGVyIGxpYiBjb3JlIGR1bXAKCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgZGVzdHJ1Y3RvcnMgYW5kIHNoYWRvdwogICAgICAgICAgICAgY2xhc3Nlcy4gIFNGIGJ1ZyAjMjIxMTI4LgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBUbyBwcm92aWRlIGJldHRlciBsaW5lLW51bWJlciB0cmFja2luZyBpbiBpbnRlcmZhY2VzCiAgICAgICAgICAgICB3aXRoIGxvdHMgb2YgbWFjcm9zLCBzcGVjaWFsIGxvY2F0b3IgY29tbWVudHMgYXJlCiAgICAgICAgICAgICBub3cgZ2VuZXJhdGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvKkBmb28uaSw0MixCTEFIQCovZXhwYW5kZWQgbWFjcm8vKkBAKi8KCiAgICAgICAgICAgICBUaGUgZmlyc3QgLypALi4uQCovIHNlcXVlbmNlIHNldHMgdGhlIGNvbnRleHQKICAgICAgICAgICAgIHRvIHBvaW50IHRvIHRoZSBtYWNybyBjb2RlLiAgVGhlIC8qQEAqLyBjb21tZW50CiAgICAgICAgICAgICB0ZXJtaW5hdGVzIHRoZSBjb250ZXh0LiAgVGhlIFNXSUcgcGFyc2VyIHNob3VsZAogICAgICAgICAgICAgaWdub3JlIGFsbCBvZiB0aGUgbG9jYXRvciBjb21tZW50cyBhcyBzaG91bGQKICAgICAgICAgICAgIHRoZSBDIGNvbXBpbGVyIChzaG91bGQgc3VjaCBjb21tZW50cyBlbmQgdXAKICAgICAgICAgICAgIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUpLgoKNy8xOC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IGhhbmRsZXMgc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcyBpbgoJICAgdHlwZW1hcHMuICBUaGlzIGludHJvZHVjZWQgYSBuZXcgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LCBidXQKCSAgIG9ubHkgd2l0aCBhIGhldXJpc3RpYyBmdW5jdGlvbi1wb2ludGVyIGNhdGNoLWFsbCBydWxlLiAgCgkgICAqIFtHdWlsZV06IEFkZGVkIHR5cGVtYXBzIGZvciBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzLiAKCSAgICogRml4ZWQgdGhlICJ0ZW1wbGF0ZS13aGl0ZXNwYWNlIiBwcm9ibGVtIGJ5IGNhbm9uaWNhbGl6aW5nCgkgICAgIHdoaXRlc3BhY2UsIGVzcGVjaWFsbHkgYXJvdW5kIGFuZ2xlIGJyYWNrZXRzIGFuZCBjb21tYXMuIAoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEEgU2NoZW1lIGZpbGUgaXMgZW1pdHRlZCBpZiB0aGUgLXNjbXN0dWIgRklMRS5TQ00KCSAgIGNvbW1hbmQtbGluZSBvcHRpb24gaXMgdXNlZC4gIFRoZSAlc2NoZW1lIGRpcmVjdGl2ZQoJICAgKGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yIGEgcHJhZ21hKSBhbGxvd3MgdG8gaW5zZXJ0CgkgICBhcmJpdHJhcnkgY29kZSBoZXJlLiAgSW4gInNpbXBsZSIgYW5kICJwYXNzaXZlIiBsaW5rYWdlLAoJICAgdGhlIGZpbGUgZ2V0cyBmaWxsZWQgd2l0aCBkZWZpbmUtbW9kdWxlIGFuZCBleHBvcnQKCSAgIGRlY2xhcmF0aW9ucy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFBhcnNlciBidWcgZml4IHRvIHN1cHBvcnQgY29uc3RhbnQgcG9pbnRlcnMsIGVnIGludCogY29uc3QgcHRyLgoJICAgRml4ZWQgZXZlcnl3aGVyZSAtIHZhcmlhYmxlcywgcGFyYW1ldGVycywgcmV0dXJuIHR5cGVzIGV0Yy4gTm90ZSB0aGF0CgkgICB3aGVuIHdyYXBwaW5nIGEgY29uc3RhbnQgcG9pbnRlciB2YXJpYWJsZSBvbmx5IHRoZSBnZXR0ZXIgaXMgZ2VuZXJhdGVkLgoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIEZpeGVkIFNGIGJ1ZyAjNDQxNDcwICgjZGVmaW5lIFggIi8vIiB3b3VsZCBub3QgYmUgcGFyc2VkLAoJICAgICBzZWUgdGVzdC1zdWl0ZSBlbnRyeSAicHJlcHJvYy0xIiksIHJlcG9ydGVkIGJ5IFQuIFcuIEJ1cnRvbgoJICAgICA8dHdidXJ0b25AdXNlcnMuc2YubmV0Pi4KCSAgICogQ2hhbmdlZCB0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvICJjaGFyIiwgcmF0aGVyCgkgICAgIHRoYW4gImNoYXIgKiIuICBDaGFuZ2VkIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMKCSAgICAgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgZXhjZXB0IGZvciB0aGUgR3VpbGUgbW9kdWxlLAoJICAgICB3aGVyZSBpdCBpcyBkZXNpcmVkIHRvIG1ha2UgdGhlbSBTY2hlbWUgY2hhcmFjdGVycy4gIFRoaXMKCSAgICAgZml4ZXMgU0YgYnVnICMyMzE0MDksIHRlc3Qtc3VpdGUgZW50cnkgImNoYXItY29uc3RhbnQiLgoJICAgKiBBcHBsaWVkIHBhdGNoIGZvciBET0gvRG9oL21lbW9yeS5jIGJ5IExlcyBTY2hhZmZlcgoJICAgICA8c2NoYWZmZXJAb3B0b25saW5lLm5ldD4gKGF2b2lkIHJlcXVpcmVkIHNpZGUgZWZmZWN0cyBpbgoJICAgICBhc3NlcnQpLiAKCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIGZvciB2aXJ0dWFsIGRlc3RydWN0b3Igd2l0aCB2b2lkIGFzIHBhcmFtZXRlcgoJICAgKiBCdWcgZml4IGluIHBhcnNlciAjZGVmaW5lcyBlbWJlZGRlZCB3aXRoaW4gY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucwoJICAgQ29uc2VxdWVudGx5ICVjb25zdGFudCBjYW4gbm93IGFsc28gYmUgcGxhY2VkIHdpdGhpbiBhIHN0cnVjdC9jbGFzcy91bmlvbi4KCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgdG8gYWxsb3cgc2l6ZW9mKCpJX2FtX2FfcG9pbnRlcikgd2l0aGluIGEgI2RlZmluZQoKNy8xNi8yMDAxOiBta29lcHBlCgkgICAqIEFkZGVkIGNoYW5nZXMgZm9yIHRoZSBNYWNpbnRvc2ggY29udHJpYnV0ZWQgYnkgTHVpZ2kKCSAgIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4gCgkgICAqIFNvbWUgImNvbnN0IiBmaXhlcyBpbiB0aGUgY29kZS4KCSAgICogW0d1aWxlXTogTWFkZSB0aGUgY29uc3RhbnQtd3JhcHBlciBmdW5jdGlvbnMgbXVjaCBzaG9ydGVyLgoKNy8xMy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFNvbWUgImNvbnN0IiBmaXhlcyBmb3IgR3VpbGUgdmVyc2lvbiAxLjMuNC4KCSAgICogSGFuZGxlIGFub255bW91cyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgc3RhdGljCgkgICAgIGFycmF5IG1lbWJlcnMgb2YgY2xhc3Nlcy4gIEJvdGggYnVncyByZXBvcnRlZCBieSBBbm5hbGlzYSBUZXJyYWNpbmEKCSAgICAgPGFubmFsaXNhLnRlcnJhY2luYUBkYXRhbWF0Lml0Pjsgc2VlIHRoZSBmaWxlcwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL3N0YXRpYy1hcnJheS1tZW1iZXIuaSBhbmQKCSAgICAgYW5vbnltb3VzLWFyZy5pLgoKVmVyc2lvbiAxLjMuNiAgKEp1bHkgOSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjcvMDkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IEZPUkVHUk9VTkQgYW5kIEJBQ0tHUk9VTkQgZGVmaW5pdGlvbiBtaXNzaW5nIAoJICAgYWZ0ZXIgVFJBTlNQQVJFTlQgI2RlZmluZSBmaXggaW4gR0lGUGxvdAoKNy8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVycyBzbyB0aGF0IHRoZSByZWxlYXNlIGlzIGtub3duCiAgICAgICAgICAgYXMgMS4zLjYuICBBbGwgZnV0dXJlIHJlbGVhc2VzIHNob3VsZCBoYXZlIGEgc2ltaWxhcgogICAgICAgICAgIHZlcnNpb24gZm9ybWF0LgoKNy8wMi8yMDAxOiBta29lcHBlCgkgICAqIFtQeXRob25dOiBQcmV2ZW50IHRoZSBwcm9ibGVtIG9mIHNlbGYudGhpc293biBub3QgYmVpbmcKCSAgIGRlZmluZWQgaWYgdGhlIEMrKyBjbGFzcyBjb25zdHJ1Y3RvciByYWlzZWQgYW4gZXhjZXB0aW9uLgoJICAgVGhhbmtzIHRvIEx1aWdpIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4KCjYvMjkvMjAwMTogbWtvZXBwZQoJICAgKiBNb3JlIHBvcnRhYmlsaXR5IGZpeGVzOyBmaXhlZCAiZ2NjIC1XYWxsIiB3YXJuaW5ncy4KCjYvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IFRSQU5TUEFSRU5UICNkZWZpbmUgbXVsdGlwbGUgdGltZXMgb24gU29sYXJpcyAKCSAgIChjbGFzaGVzIHdpdGggc3RyZWFtLmgpLgoJICAgKiBNdWx0aXBsZSBkZWZpbml0aW9uIGJ1ZyBmaXggZm9yIHNoYWRvdyBjbGFzc2VzLiBUaGUgcGVybCBhbmQgcHl0aG9uIAoJICAgbW9kdWxlcyBoYWQgd29ya2Fyb3VuZHMgd2hpY2ggaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZml4ZXMgaW4gCgkgICB0aGUgY29yZS4gTWFueSBvZiB0aGUgTGFuZ3VhZ2U6OmNwcF94eHh4IGZ1bmN0aW9ucyBub3cgc2V0IGEgCgkgICBmbGFnIHdoaWNoIHRoZSBkZXJpdmVkIGNsYXNzZXMgY2FuIGFjY2VzcyB0aHJvdWdoIAoJICAgaXNfbXVsdGlwbGVfZGVmaW5pdGlvbigpIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCBjb2RlIHNob3VsZCBiZSAKCSAgIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGJlbG93IHdvdWxkIGhhdmUgcHJvZHVjZWQgdmFyeWluZyBkZWdyZWVzIAoJICAgb2YgaW5jb3JyZWN0IHNoYWRvdyBjbGFzcyBjb2RlIGZvciB0aGUgdmFyaW91cyBtb2R1bGVzOgoJICAgY2xhc3MgVGVzdENsYXNzCgkgICB7CgkgICBwdWJsaWM6CgkgICAgIFRlc3RDbGFzcygpIHt9CgkgICAgIFRlc3RDbGFzcyhpbnQgYSkge30KCSAgICAgflRlc3RDbGFzcygpIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KHNob3J0IGspIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KGludCBuKSB7fQoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYygpIHt9CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKGludCBhKSB7fQoJICAgfTsKCSAgIHZvaWQgZGVsZXRlX1Rlc3RDbGFzcyhpbnQgYSk7Cgo2LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogW1BlcmxdIEFub3RoZXIgY29uc3QtcmVsYXRlZCBwb3J0YWJpbGl0eSBmaXguCgo2LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQWRkZWQgaW4gY3BwX3ByYWdtYSgpIHN1cHBvcnQgd2l0aCBhIGhvc3Qgb2YgbmV3IHByYWdtYXMgLSBzZWUgCgkgICBqc3dpZy5odG1sLiBUaGVzZSBhcmUgZGVzaWduZWQgZm9yIGJldHRlciBtaXhpbmcgb2YgSmF2YSBhbmQgYysrLiBJdCAKCSAgIGVuYWJsZXMgdGhlIHVzZXIgdG8gc3BlY2lmeSBwdXJlIEphdmEgY2xhc3NlcyBhcyBiYXNlcyBhbmQvb3IgaW50ZXJmYWNlcyAKCSAgIGZvciB0aGUgd3JhcHBlZCBjL2MrKy4KCSAgICogW0phdmFdIE9sZCBwcmFnbWFzIHJlbmFtZWQuIFdhcm5pbmcgZ2l2ZW4gZm9yIHRoZSBtb21lbnQgaWYgdXNlZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvMjUvMjAwMTogbWtvZXBwZQoJICAgKiBJbmNvcnBvcmF0ZWQgbW9yZSBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4gZm9yIHN3aWcvcnVieSBvbiBjeWd3aW4uCgo2LzIwLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNYWtlZmlsZSBtb2RzIHNvIHRoYXQgJ21ha2UgY2hlY2snIHVzZXMgdGhlIHN3aWcgb3B0aW9ucyBpbiB0aGUgbWFrZWZpbGVzCgkgICAqIFtKYXZhXSBSZW1vdmVkIEdlbmVyYXRpbmcgd3JhcHBlcnMgbWVzc2FnZQoJICAgKiBbSmF2YV0gTlVMTCBwb2ludGVyIGJ1ZyBmaXgKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIEthZmZlIEpWTQoKNi8yMC8yMDAxOiBta29lcHBlCgkgICAqIFNXSUdfVHlwZVF1ZXJ5IGZyb20gY29tbW9uLnN3ZyBub3cgcmV0dXJucyBhCgkgICBzd2lnX3R5cGVfaW5mbyogcmF0aGVyIHRoYW4gYSB2b2lkKi4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtCgkgICB3aGVuIHVzaW5nIHBvaW50ZXIuaSBhbmQgQysrLCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgbmV3CgkgICB0ZXN0LXN1aXRlIGV4YW1wbGUgcGVybDUvcG9pbnRlci1jeHguCgkgICAqIFBvcnRhYmlsaXR5IGZpeGVzIChjb25zdCBjaGFyICopLiAKCSAgICogSW5jb3Jwb3JhdGVkIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiwgd2hpY2ggbWFrZSBzd2lnIHJ1bm5hYmxlIG9uIGN5Z3dpbi4KCjYvMTkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBTRiBidWcgIzIxMTE0NC4gVGhpcyBmaXggaXMgYSB3b3JrYXJvdW5kIAoJICAgICB1bnRpbCBmaXhlZCBpbiB0aGUgY29yZS4KCjYvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBQb3J0YWJpbGl0eSBmaXhlcyBmb3IgdXNlIHdpdGggdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLiAKCSAgICogW1RjbF06IFBvcnRhYmlsaXR5IGZpeCAoY29uc3QgY2hhciAqKS4KCSAgICogW1RjbF06IENvbmZpZ3VyZSBub3cgZmlyc3QgdHJpZXMgdG8gZmluZCBhIHRjbENvbmZpZy5zaAoJICAgZmlsZSBpbiBvcmRlciB0byBmaW5kIHRoZSBUY2wgaW5jbHVkZSBkaXJlY3RvcnksIGxpYnJhcnkKCSAgIGxvY2F0aW9uIGFuZCBsaWJyYXJ5IG5hbWUuCgkgICAqIFtQeXRob25dOiBBZGRlZCBhIGZldyBwb3NzaWJsZSBsaWJyYXJ5IGxvY2F0aW9ucy4KCjYvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBEb24ndCBjYWxsIHNjbV9jX2V4cG9ydCBpZiBub3RoaW5nIGlzIHRvIGJlCgkgICAgIGV4cG9ydGVkLiAgRG9uJ3Qgd2FybiBvbiAlbW9kdWxlIGlmIG1vZHVsZSBoYXMgYmVlbiBzZXQKCSAgICAgYWxyZWFkeSAodGhpcyBmcmVxdWVudGx5IG9jY3VycyB3aGVuICVpbXBvcnQgaXMgdXNlZCkuCgo2LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogTmV3ICJwYXNzaXZlIiBsaW5rYWdlLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IKCSAgICAgbXVsdGktbW9kdWxlIGV4dGVuc2lvbnMgd2l0aG91dCBHdWlsZSBtb2R1bGUgbWFnaWMuCgo2LzE1LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRml4ZWQgcHJpbnRpbmcgb2Ygc21vYnMgKHNwYWNlIGFuZCBhbmdsZSB3ZXJlCgkgICAgIG1pc3NpbmcpLiAKCSAgICogUHJvcGVybHkgZ2VuZXJhdGUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYmFzZSBjbGFzc2VzCgkgICAgIGltcG9ydGVkIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhhbmtzIHRvIE1hcmNlbG8KCSAgICAgTWF0dXMgPG1tYXR1c0BhY21zLmFyaXpvbmEuZWR1PiBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlCgkgICAgIHBhdGNoOyB0aGlzIGNsb3NlcyBTRiBidWcgIzIzMTYxOTsgc2VlIGFsc28KCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9pbXBvcnQqLiAKCSAgICogW0d1aWxlXTogRml4IGNhc3RpbmcgYmV0d2VlbiBjbGFzcyBhbmQgYmFzZSBjbGFzczsgdGhlCgkgICAgIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gaGFkIGl0IHRoZSB3cm9uZyB3YXkgYXJvdW5kOyBzZWUKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9jYXN0cy5pCgkgICAqIE1ha2UgdHlwZW1hcHMgZm9yIFNXSUdQT0lOVEVSICogd2l0aCBhcmcgbmFtZSB0YWtlCgkgICAgIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSB3aXRob3V0IGFyZyBuYW1lLCB0byBtYXRjaCBub3JtYWwKCSAgICAgdHlwZW1hcCBwcmVjZWRlbmNlIHJ1bGVzLgoJICAgKiBGaXhlZCB0aGUgcmFuZG9tLWxpbmUtbnVtYmVycyBwcm9ibGVtIHJlcG9ydGVkIGFzIFNGIGJ1ZwoJICAgICAjMjE3MzEwOyB0aGFua3MgdG8gTWljaGFlbCBTY2hhcmYgPHNjaGFyZkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBbR3VpbGVdOiBIYW5kbGUgdGhlICVuYW1lIGFuZCAlcmVuYW1lIGRpcmVjdGl2ZXMuCgkgICAqIE5ldyBzeW50YXg6ICVuYW1lIGFuZCAlcmVuYW1lIG5vdyBvcHRpb25hbGx5IHRha2UgZG91YmxlCgkgICAgIHF1b3RlcyBhcm91bmQgdGhlIHNjcmlwdGluZyBuYW1lLiAgVGhpcyBpcyB0byBhbGxvdyBzY3JpcHRpbmcKCSAgICAgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgQyBpZGVudGlmaWVycy4KCjYvMTQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hZGUgYSBtaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBmaWxlcyBhcmUgbG9hZGVkIGluCiAgICAgICAgICAgb3JkZXIgdG8gZ2V0IGZpbGUvbGluZSBudW1iZXIgcmVwb3J0aW5nIGNvcnJlY3QgaW4KICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yLgoKNi8xNC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIHRoZSAobm9uLXN0YW5kYXJkKSAibG9uZyBsb25nIgoJICAgICB0eXBlcy4gSXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyB0bwoJICAgICBwcm92aWRlIHR5cGVtYXBzIGlmIG5lZWRlZC4gUmVwb3J0ZWQgYnkgU2FtIFN0ZWluZ29sZCwgU0YKCSAgICAgYnVnICM0MjkxNzYuCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIGFyZ3VtZW50cyBsaWtlICJjb25zdCBpbnQgKgoJICAgICBjb25zdCBpIi4gVGhpcyBmaXhlcyBTRiBidWcgIzIxNTY0OS4KCSAgICogRml4ZWQgdGhlIEd1aWxlIHRlc3Qtc3VpdGUuCgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAgIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rIGF0IHRhZwoJICAgIm1rb2VwcGUtbWVyZ2UtMSIuIFRoaXMgY292ZXJzIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKCnwgMDEvMTYvMDE6IHR0bgp8CSAgIFdyb3RlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBEb2MvZW5naW5lZXJpbmcuaHRtbC4gIEFkZGVkIHNlY3Rpb24KfAkgICBvbiBDVlMgdGFnZ2luZyBjb252ZW50aW9ucy4gIEFkZGVkIGNvcHlyaWdodCB0byBvdGhlciBkb2NzLgp8IDkvMjUvMDAgOiBiZWF6bGV5CnwgCSAgIE1vZGlmaWVkIHRoZSBwcmVwcm9jZXNzb3Igc28gdGhhdCBtYWNybyBuYW1lcyBjYW4gc3RhcnQgd2l0aCBhICclJy4KfCAJICAgVGhpcyBtYXkgYWxsb3cgbmV3IFNXSUcgImRpcmVjdGl2ZXMiIHRvIGJlIGRlZmluZWQgYXMgbWFjcm9zIGluc3RlYWQKfCAJICAgb2YgaGF2aW5nIHRvIGJlIGhhcmQtY29kZWQgaW50byB0aGUgcGFyc2VyLiAgCnwKfCAqKiogQWxzbyBhIHlldC10by1iZS1kb2N1bWVudGVkIHF1b3RpbmcgbWVjaGFuaXNtIHdpdGggYmFja3F1b3Rlcwp8ICoqKiBoYXMgYmVlbiBpbXBsZW1lbnRlZD8KCjYvMTMvMjAwMTogbWtvZXBwZQoJICogV2hlbiBjb25maWd1cmUgZG9lcyBub3QgZmluZCBhIGxhbmd1YWdlLCBkb24ndCB1c2UgZGVmYXVsdAoJICAgcGF0aHMgbGlrZSAvdXNyL2xvY2FsL2luY2x1ZGU7IHRoaXMgb25seSBjYXVzZXMgYnVpbGQKCSAgIHByb2JsZW1zLgoJICogTmV3IGRpcmVjdG9yeTogRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZSwgd2hlcmUgYSBmZXcKCSAgIGJ1Z3MgaW4gMS4zYTUgYXJlIGRlbW9uc3RyYXRlZC4gCgkgKiBIYW5kbGUgQysrIG1ldGhvZHMgdGhhdCBoYXZlIGJvdGggYSAiY29uc3QiIGFuZCBhICJ0aHJvdyIKCSAgIGRpcmVjdGl2ZSAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvY3BsdXNwbHVzLXRocm93LmkpOyAKCSAgIHRoYW5rcyB0byBTY290dCBCLiBEcnVtbW9uZHMgZm9yIHRoZSByZXBvcnQgYW5kIHRoZSBmaXguIAoJICogSGFuZGxlIEMrKyBwb2ludGVyLXJlZmVyZW5jZSBhcmd1bWVudHMgKGxpa2UgImludCAqJiBhcmciKSAKCSAgIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9wb2ludGVyLXJlZmVyZW5jZS5pLAoJICAgcmVwb3J0ZWQgYXMgU0YgYnVnICM0MzIyMjQpLgoJICogW1J1YnldIEZpeGVkIHR5cG8gaW4gcnVieWRlYy5zd2c7IHRoYW5rcyB0byBMeWxlIEpvaG5zb24hCgkgKiBEb24ndCBzdG9wIHRlc3Rpbmcgd2hlbiBvbmUgdGVzdCBmYWlscy4KCSAqIFtHdWlsZSwgTXpTY2hlbWVdIERvbid0IHByaW50ICJHZW5lcmF0aW5nIHdyYXBwZXJzLi4uIi4KCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBWRUNUT1JMRU5JTlBVVCBhbmQgTElTVExFTklOUFVUIG5vdyBoYXZlIHNlcGFyYXRlCgkgICBsaXN0IGxlbmd0aCB2YXJpYWJsZXMuIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQKCSAgIGF0dGFjaGVzIGFyZ3VtZW50IGRvY3VtZW50YXRpb24gaW52b2x2aW5nIFNDTV9UWVBFIHRvIHRoZQoJICAgc3RhbmRhcmQgcG9pbnRlciB0eXBlbWFwcy4gSU5PVVQgaXMgbm93IGFuIGFsaWFzIGZvciBCT1RILgoKNi8xMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFNvbWUgSmF2YSBkb2N1bWVudGF0aW9uIGFkZGVkLgoJICAgW0phdmFdIEZpeGVkIGJ1Z3MgaW4gaW1wb3J0IHByYWdtYSBhbmQgc2hhZG93IHByYWdtYS4gCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIEZpeCBkZWNsYXJhdGlvbnMgb2YgU1dJR19kZWZpbmVfY2xhc3MKCSAgIChMaWIvcnVieS9ydWJ5ZGVjLnN3ZykgYW5kIFNXSUdfVHlwZVF1ZXJ5CgkgICAoTGliL2NvbW1vbi5zd2cpLiBUaGFua3MgdG8gTHlsZSBKb2huc29uCgkgICA8bGpvaG5zb25AcmVzZ2VuLmNvbT4gZm9yIHRoZSBwYXRjaGVzLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFVzZSBsb25nIGluc3RlYWQgb2Ygc2NtX2JpdHNfdDsgdGhpcyBtYWtlcyB0aGUKCSAgIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgY29tcGF0aWJsZSB3aXRoIEd1aWxlIDEuMy40CgkgICBhZ2Fpbi4gVGhhbmtzIHRvIE1hc2FraSBGdWt1c2hpbWEgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgoKNi8xMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFRoZSBnZW5lcmljIElOU1RBTEwgZmlsZSBmcm9tIGF1dG9jb25mIGFkZGVkLiBGZXcgY2hhbmdlcyB0byBSRUFETUUgZmlsZS4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgRml4ZWQgdHlwbyBpbiBNYWtlZmlsZS5pbjsgdGhhbmtzIHRvIEdyZWcgVHJveGVsCgkgICA8Z2R0QGlyLmJibi5jb20+LiAKCjYvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBtYWtlIGNoZWNrIHdvcmtzIGFnYWluLiBFeGFtcGxlcy9HSUZQbG90IGNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkKCSAgIHRvcCBsZXZlbCBhdXRvY29uZiBub3cuCgo2LzA4LzIwMDE6IG1rb2VwcGUKCSAgIEFub3RoZXIgYnVpbGQgY2hhbmdlOiBUaGUgbmV3IHNjcmlwdCBhdXRvZ2VuLnNoIHJ1bnMKCSAgIGF1dG9jb25mIGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllcy4gIFRoZSB0b3AtbGV2ZWwKCSAgIGNvbmZpZ3VyZSBhbHNvIGNvbmZpZ3VyZXMgaW4gRXhhbXBsZXMvR0lGUGxvdC4KCjYvMDcvMjAwMTogbWtvZXBwZQoJICAgTWFkZSB0aGUgTWFrZWZpbGUgd29yayB3aXRoIG5vbi1HTlUgbWFrZSBhZ2Fpbi4KCjYvMDcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gQ2xhc3Mvc3RydWN0IG1lbWJlcnMgdGhhdCBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRvIGNsYXNzZXMvc3RydWN0cyAtCgkgICBTaGFkb3cgY2xhc3MncyBnZXQvc2V0IGFjY2Vzc29ycyBub3cgdXNlIEphdmEgY2xhc3NlcyBpbnN0ZWFkIG9mIGxvbmdzIChwb2ludGVycykuCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgd2lsbCBub3cgY2xlYW4gdXAgbWVtb3J5IGlmIGZ1bmN0aW9uIHJldHVybiB0eXBlIAoJICAgaXMgYSBjbGFzcy9zdHJ1Y3QuCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcy4KCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4IGFsbG93cyBmb3IKCSAgIGF0dGFjaGluZyBhIHN1ZmZpeCB0byB0aGUgc3dpZyBiaW5hcnkgYW5kIHRoZSBzd2lnIHJ1bnRpbWUKCSAgIGxpYnJhcmllcy4gIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gICJzd2lnCgkgICAtc3dpZ2xpYiIgd29ya3MgYWdhaW4uICBJZiBpbnZva2VkIHdpdGggdGhlIG5ldyBvcHRpb24KCSAgICItbGRmbGFncyIsIFNXSUcgcHJpbnRzIGEgbGluZSBvZiBsaW5rZXIgZmxhZ3MgbmVlZGVkIHRvCgkgICBsaW5rIHdpdGggdGhlIHJ1bnRpbWUgbGlicmFyeSBvZiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UKCSAgIG1vZHVsZS4gCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gZ3N3aWdfbGlzdF9wIGlzIGFuIGludCwgbm90IGEgU0NNLiAgVGhpcyB0eXBvCgkgICBjYXVzZWQgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gSW4gSU5QVVQgYW5kIEJPVEggdHlwZW1hcHMKCSAgIGdlbmVyYXRlZCBieSB0aGUgU0lNUExFX01BUCBtYWNybywgdXNlIHRoZSBTQ01fVE9fQwoJICAgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIEd1aWxlIHRvIEMgKHJhdGhlciB0aGFuIENfVE9fU0NNKS4KCSAgIFVzZSBzY21faW50cHJpbnQgdG8gcHJpbnQgcG9pbnRlcnMgKHJhdGhlciB0aGFuCgkgICBzcHJpbnRmKS4gQWxsb3cgdXNpbmcgIi1saW5rYWdlIiBpbnN0ZWFkIG9mICItTGlua2FnZSIuIAoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBNb2RzIGZvciB1c2luZyBpbmhlcml0ZWQgYysrIGNsYXNzZXMgZnJvbSBKYXZhCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIGNsYXNzIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIGRlc3RydWN0b3IgKF9kZWxldGUoKSkgd2FzIG5vdCBhd2FyZSBvZiAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBub3Qga25vdyBhYm91dCAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBleHRlbmQgZXZlbiB3aGVuIHRoZSBiYXNlY2xhc3Mgd2FzIG5vdCBrbm93biB0byBzd2lnCgkgICBbSmF2YV0gc29tZXRpbWVzIGVudW0tZGVjbGFyYXRpb25zIG9jY3VycmVkIGJlZm9yZSB0aGUgSmF2YSBjbGFzcyBkZWNsYXJhdGlvbgoJICAgW0phdmFdIHVucmVsYXRlZCBlbnVtIGluaXRpYWxpc2F0aW9ucyBubyBsb25nZXIgYXBwZWFyIGluIEphdmEgY2xhc3MKCSAgIFtKYXZhXSBpZiBtb2R1bGUgZW5kcyBpbiAnXycgY29ycmVjdCBKTkkgbmFtZXMgYXJlIG5vdyBwcm9kdWNlZAoKNi8wNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgbW9kcyAtIE1vZGlmaWVkIGNvbnN0cnVjdG9yIHJlcGxhY2VzCgkgICBuZXdJbnN0YW5jZSgpLiBfZGVsZXRlKCkgbm93IHRocmVhZCBzYWZlLiBnZXRDUHRyKCkgcmVwbGFjZXMKCSAgIF9zZWxmLiBfc2VsZkNsYXNzKCkgcmVtb3ZlZCBhcyBub3cgcmVkdW5kYW50LiAKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgkgICBbSmF2YV0gTm90IGFsbCBvdXRwdXQgamF2YSBmaWxlcyBoYWQgU1dJRyBiYW5uZXIuIE5ldyBiYW5uZXIuCgoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBmaW5hbGl6ZXJzIGFyZSBvdXRwdXQgYnkgZGVmYXVsdDogQ29tbWFuZAoJICAgbGluZSBvcHRpb24gLWZpbmFsaXplIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggLW5vZmluYWxpemUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQ2FzdCBTQ01fQ0FSKCkgdG8gc2NtX2JpdHNfdCBiZWZvcmUgc2hpZnRpbmcgaXQuCgkgICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gIAoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBjb25maWd1cmUgb3B0aW9uICItLXdpdGgtc3dpZ2xpYmRpciIuCgo1LzMxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gU3VwcG9ydCBtdWx0aXBsZSBwYXJhbGxlbCBsaXN0cyBvciB2ZWN0b3JzIGluCgkgICB0aGUgdHlwZW1hcHMgcHJvdmlkZWQgYnkgbGlzdC12ZWN0b3IuaS4gIE5ldyB0eXBlbWFwcyBmaWxlLAoJICAgcG9pbnRlci1pbi1vdXQuaS4gCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIEhUTUwgdXBkYXRlIGZvciBleGFtcGxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgQWRkZWQgc3ViZGlyZWN0b3J5IGZvcgoJICAgRGViaWFuIHBhY2thZ2UgY29udHJvbCBmaWxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBCdWlsZCBhIHJ1bnRpbWUgbGlicmFyeSwgbGlic3dpZ2d1aWxlLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbiAkKmRlc2NyaXB0b3IuICBVc2UgdGhlIHt9CgkgICBzeW50YXgsIHJhdGhlciB0aGFuIHRoZSAiIiBzeW50YXggZm9yIHRoZSBzdGFuZGFyZAoJICAgdHlwZW1hcHMsIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN0cmFuZ2UgbWFjcm8tZXhwYW5zaW9uCgkgICBiZWhhdmlvciBvZiB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBUaGlzIGludHJvZHVjZXMgc29tZQoJICAgZXh0cmEgYnJhY2VzLgoKNS8yNy8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSBwb2ludGVyIHR5cGVzIHdpdGggdHlwZW1hcHMsIHJhdGhlciB0aGFuCgkgICBoYXJkLWNvZGVkLiBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zICRkZXNjcmlwdG9yLAoJICAgJGJhc2VkZXNjcmlwdG9yOyBzZWUgZG9jdW1lbnRhdGlvbi4gU29tZSBjbGVhbi11cCBpbiB0aGUKCSAgIHZhcmlhYmxlL2NvbnN0YW50cyB3cmFwcGVyIGdlbmVyYXRvciBjb2RlLiAgTmV3IGNvbnZlbmllbmNlCgkgICBtYWNybyBTV0lHX0d1aWxlX011c3RHZXRQdHIsIHdoaWNoIGFsbG93cyBnZXR0aW5nIHBvaW50ZXJzCgkgICBmcm9tIHNtb2JzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gIE5ldyB0eXBlbWFwIGZpbGUKCSAgICJsaXN0LXZlY3Rvci5pIiwgcHJvdmlkaW5nIG1hY3JvcyB0aGF0IGRlZmluZSB0eXBlbWFwcyBmb3IKCSAgIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGFycmF5cyBhbmQgU2NoZW1lIGxpc3RzIGFuZCB2ZWN0b3JzLgoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTVEwgc3RyaW5nIG1vdmVkIGludG8gaXRzIG93biB0eXBlbWFwIGFzIGl0IGlzIGMrKyBjb2RlIGFuZCAKCSAgIGl0IGJyZWFrIGFueSBjIGNvZGUgdXNpbmcgdGhlIHR5cGVtYXBzLmkgZmlsZS4KCSAgIC0gRml4ZXMgZm9yIHdyYXBwZXJzIGFyb3VuZCBnbG9iYWwgdmFyaWFibGVzIC0gYXBwbGllcyB0byBwcmltaXRpdmUgCgkgICB0eXBlcyBhbmQgdXNlciB0eXBlcyAoY2xhc3Mvc3RydWN0KSBhbmQgcG9pbnRlcnMgdG8gdGhlc2UuCgkgICAtIFN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGFuZCBjbGFzcyBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBnZXR0ZXJzIAoJICAgYW5kIHNldHRlcnMgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlciBhcyB3YXMgaW4gMS4zYTMgYW5kIDEuMSAKCSAgICgxLjNhNSB3YXMgcGFzc2luZyBieSB2YWx1ZSkKCSAgIC0gUGFyYW1ldGVycyB0aGF0IHdlcmUgYXJyYXlzIGFuZCByZXR1cm4gdHlwZXMgd2VyZSBpbmNvcnJlY3RseSAKCSAgIGJlaW5nIHBhc3NlZCB0byBjcmVhdGVfZnVuY3Rpb24oKSBhcyBwb2ludGVycy4KCSAgIC0gRml4IGZvciBhcnJheXMgb2YgZW51bXMuIAoJICAgW0phdmFdIFVwZGF0ZWQgamF2YSBleGFtcGxlcyBhbmQgYWRkZWQgdHdvIG1vcmUuCgkgICBbSmF2YV0gSmF2YSBtb2R1bGUgdXBkYXRlZCBmcm9tIFNXSUcxLjNhMyBpbmNsdWRpbmcgY29kZSBjbGVhbnVwIGV0Yy4KCSAgIFtKYXZhXSBlbnVtIHN1cHBvcnQgYWRkZWQuCgkgICBbSmF2YV0gQXJyYXkgc3VwcG9ydCBpbXBsZW1lbnRlZAoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIGltcHJvdmVkIC0gSmF2YSBvYmplY3RzIHVzZWQgcmF0aGVyIHRoYW4gCgkgICBsb25ncyBob2xkaW5nIHRoZSBjIHBvaW50ZXIgdG8gdGhlIHdyYXBwZWQgc3RydWN0dXJlL2MrK2NsYXNzCgo1LzIyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgaW4gQysrIG1vZGUuIFRoYW5rcwoJICAgdG8gR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPi4KCjUvMjEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgbGlua2FnZSAibW9kdWxlIiBmb3IgY3JlYXRpbmcgR3VpbGUgbW9kdWxlcyBmb3IKCSAgIEd1aWxlIHZlcnNpb25zID49IDEuNS4wLiAKCjQvMTgvMjAwMTogbWtvZXBwZQoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgcGFzc2luZyB0aHJvdWdoIFNjaGVtZV9PYmplY3QKCSAgIHBvaW50ZXJzLiAKCjQvOS8yMDAxIDogbWtvZXBwZSAKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIGBib29sJy4gIEluY2x1c2lvbiBvZiBoZWFkZXJzCgkgICBhbmQgc3VwcG9ydCByb3V0aW5lcyBpcyBub3cgZGF0YS1kcml2ZW4gdmlhIG16c2NoZW1lLmkuCgkgICBIZWFkZXJzIGNvbWUgZnJvbSB0aGUgbmV3IGZpbGUgbXpzY2hlbWRlYy5zd2cuICBEb24ndCBhYm9ydAoJICAgaW1tZWRpYXRlbHkgd2hlbiBhIHR5cGUtaGFuZGxpbmcgZXJyb3IgaXMgcmVwb3J0ZWQuICBXaGVuCgkgICBzZWFyY2hpbmcgZm9yIHR5cGVtYXBzIGZvciBlbnVtcywgZmFsbCBiYWNrIHRvIHVzaW5nIGludCwKCSAgIGxpa2UgdGhlIEd1aWxlIGJhY2tlbmQgZG9lcy4gIFN1cHBvcnQgY2hhciBjb25zdGFudHMuICBFbWl0CgkgICBjb3JyZWN0IHdyYXBwZXIgY29kZSBmb3IgdmFyaWFibGVzLgoKMy8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICoqT1VUUFVULCBjaGFyICoqQk9USC4KCjMvMi8yMDAxIDogbWtvZXBwZSAKCSAgIFtHdWlsZV0gRXZlcnkgd3JhcHBlciBmdW5jdGlvbiBub3cgZ2V0cyBhIGJvb2xlYW4gdmFyaWFibGUKCSAgIGdzd2lnX2xpc3RfcCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgYXJlCgkgICBwcmVzZW50LiBUaGUgbWFjcm9zIEdVSUxFX0FQUEVORF9SRVNVTFQsIEdVSUxFX01BWUJFX1ZBTFVFUwoJICAgYW5kIEdVSUxFX01BWUJFX1ZFQ1RPUiB1c2UgdGhpcyB2YXJpYWJsZSwgcmF0aGVyIHRoYW4KCSAgIGNoZWNraW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdC4gVGhpcwoJICAgYWxsb3dzIGZvciB0eXBlbWFwcyByZXR1cm5pbmcgYSBsaXN0IGFzIGEgc2luZ2xlIHZhbHVlIChhCgkgICBsaXN0IHdhcyBlcnJvbmVvdXNseSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciBvciBhCgkgICBtdWx0aXBsZS12YWx1ZSBvYmplY3QgaW4gdGhpcyBjYXNlKS4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciByZXR1cm5pbmcgbXVsdGlwbGUgdmFsdWVzIGFzCgkgICB2ZWN0b3JzLCBvciBwYXNzaW5nIHRoZW0gdG8gYSBtdWxpcGxlLXZhbHVlCgkgICBjb250aW51YXRpb24uIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHZhbHVlcyBzdGlsbCBnZXQKCSAgIHJldHVybmVkIGFzIGEgbGlzdC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBhICJiZWZvcmVyZXR1cm4iIHByYWdtYS4gVGhlIHZhbHVlIG9mIHRoaXMKCSAgIHByYWdtYSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSBldmVyeSByZXR1cm4gc3RhdGVtZW50LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlIDEuNC4xIHByb2NlZHVyZQoJICAgZG9jdW1lbnRhdGlvbiBmb3JtYXRzLCBzZWUgaW50ZXJuYWxzLmh0bWwuCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTWFkZSB0aGUgd3JhcHBlciBjb2RlIGNvbXBpbGUgd2l0aCBDKysgaWYgdGhlCgkgICAiLWMrKyIgY29tbWFuZC1saW5lIHN3aXRjaCBpcyBnaXZlbi4gIFRoYW5rcyB0bwoJICAgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOb3cgdHdvIHR5cGUgdGFibGVzLCBzd2lnX3R5cGVzIGFuZAoJICAgc3dpZ190eXBlc19pbml0aWFsLCBhcmUgdXNlZCwgYXMgYWxsIG90aGVyIFNXSUcgbGFuZ3VhZ2UKCSAgIG1vZHVsZXMgZG8uICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoZSB0cmlja3kKCSAgIGNvbnN0cnVjdGlvbiB1c2VkIGJlZm9yZSB0aGF0IHRoZSBicm9rZW4gUmVkaGF0IDcuMCBnY2MKCSAgIGRvZXNuJ3QgcGFyc2UuIFJlcG9ydGVkIGJ5IDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKk9VVFBVVCwgY2hhciAqQk9USDsgYSBiYWQKCSAgIGZyZWUoKSB3b3VsZCBiZSBlbWl0dGVkLiAgQWRkZWQgdHlwZW1hcCBmb3IgU0NNLgoKClZlcnNpb24gMS4zIEFscGhhIDUgCj09PT09PT09PT09PT09PT09PT0KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBbUHl0aG9uXSBQeXRob24gbW9kdWxlIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlIGZvcgogICAgICAgICAgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24uIE1vZGlmaWNhdGlvbgogICAgICAgICAgc3VnZ2VzdGVkIGJ5IEpvbiBUcmF2aXMuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgTGlicmFyeSBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWwgb3B0aW9uIGFyZSBub3cgaW5jbHVkZWQgYXQgdGhlCiAgICAgICAgICBlbmQgb2YgdGhlIGludGVyZmFjZSBmaWxlIChyZXZlcnRpbmcgdG8gdGhlIG9sZCBiZWhhdmlvcikuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGVudW0gaGFuZGxpbmcuICBlbnVtcyBhcmUgbm93IG1hbmlwdWxhdGVkIGFzCiAgICAgICAgICAnaW50JywgYnV0IGNhc3QgaW50byB0aGUgZW51bSB0eXBlIHdoZW4gdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIAogICAgICAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLgoKOS8xOS8wMCA6IG1rb2VwcGUKCSAgW0d1aWxlXSBSZW1vdmVkICItd2l0aC1zbW9icyIgY29tbWFuZC1saW5lIG9wdGlvbiwgYXMgdGhpcyBpcyB0aGUKCSAgZGVmYXVsdCBub3cuICBBZGRlZCAiLWVtaXQtc2V0dGVycyIgY29tbWFuZC1saW5lIG9wdGlvbiwKCSAgd2hpY2ggdHVybnMgb24gZ2VuZXJhdGluZyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVyczsgc2VlCgkgIGludGVybmFscy5odG1sLgoKOS8xOC8wMCA6IG1rb2VwcGUKCSAgSW5jb3Jwb3JhdGVkIHBhdGNoICMxMDE0MzAsIGZpeGluZyBidWdzIGluIHRoZSBHdWlsZSBtb2R1bGU6IAoJICAxLiBTb21lIGFyZ3VtZW50cyB3ZXJlIGVycm9uZW91c2x5IHRha2VuIGFzICpvcHRpb25hbCogYXJndW1lbnRzIHdoZW4KCSAgICAgaWdub3JlZCBhcmd1bWVudHMgd2VyZSBwcmVzZW50LiAKCSAgMi4gR3VpbGUgMS4zLjQgd2FzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gR3VpbGUKCSAgICAgIDEuNCB3ZXJlIHVzZWQuCSAgCgkgIDMuIEFkZGVkIGhhbmRsaW5nIG9mIGBjb25zdCBjaGFyIConLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmYWlsZWQgYXNzZXJ0aW9uIGFuZCBsYXJnZSBmaWxlcy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGhlICclJyBjaGFyYWN0ZXIgYXBwZWFyaW5nIGluIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBib2RpZXMuICBQcmVwcm9jZXNzb3IgYnVnLgoKVmVyc2lvbiAxLjMgQWxwaGEgNCAoU2VwdGVtYmVyIDQsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8zLzAwICA6IHR0bgogICAgICAgICAgQWRkZWQgaW5zdHJ1Y3Rpb25zIGZvciBtYWludGFpbmVycyBpbiBFeGFtcGxlcy9SRUFETUUgb24gaG93CiAgICAgICAgICB0byBtYWtlIGV4YW1wbGVzIGFsc28gYmUgdXNlZnVsIGluIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAgICAgIEFsc28sICJtYWtlIGNoZWNrIiBub3cgdXNlcyAuL0xpYiBieSB2aWEgZW52IHZhciBgU1dJR19MSUInLgogICAgICAgICAgVGhpcyBpcyBvdmVycmlkYWJsZSBsaWtlIHNvOgogICAgICAgICAgICAgbWFrZSBjaGstc3dpZ2xpYj0vbXkvZXhwZXJpbWVudGFsL3N3aWcvTGliIGNoZWNrCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQWRkZWQgJHR5cGVtYXAgdmFyaWFibGUgdG8gdHlwZW1hcHMuICBUaGlzIGdldHMgcmVwbGFjZWQgd2l0aAogICAgICAgICAgYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZW1hcCB0aGF0IGlzIGFwcGxpZWQuICBGZWF0dXJlCiAgICAgICAgICByZXF1ZXN0IGZyb20gcnNhbHouCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgRXhwZXJpbWVudGFsIG9wdGltaXphdGlvbiB0byBjb2RlIGdlbmVyYXRpb24gZm9yIHZpcnR1YWwKICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBJZiB5b3UgaGF2ZSB0d28gY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEEoKSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICBjbGFzcyBCKCkgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFN3aWcgbm93IHdpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhpcwoKICAgICAgICAgICAgICAgIEFfZm9vKEEgKmEpIHsKICAgICAgICAgICAgICAgICAgICBhLT5mb28oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBhbmQgdXNlIGl0IGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIEFfZm9vKCkgYW5kIEJfZm9vKCkuCiAgICAgICAgICBUaGlzIG9wdGltaXphdGlvbiBvbmx5IHRha2VzIHBsYWNlIGlmIGJvdGggbWV0aG9kcyBhcmUgZGVjbGFyZWQKICAgICAgICAgIGFzIHZpcnR1YWwgYW5kIGJvdGggdGFrZSBpZGVudGljYWwgcGFyYW1ldGVycy4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZXN0b3JlZCB0aGUgIm1lbWJlcmluIiB0eXBlbWFwIGZvciBzZXR0aW5nIHN0cnVjdHVyZSBtZW1iZXJzLgogICAgICAgICAgVW5saWtlIHRoZSBvbGQgdmVyc2lvbiwgdGhlIG5ldyB2ZXJzaW9uIGlzIGV4cGFuZGVkIGlubGluZSBpbiB0aGUKICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb24gYWxsb3dpbmcgYWNjZXNzIHRvIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgaW50ZXJuYWxzIChhIHNvbWV0aW1lcyByZXF1ZXN0ZWQgZmVhdHVyZSkuIFRoZSAibWVtYmVyb3V0IiB0eXBlbWFwCiAgICAgICAgICBpcyBnb25lLiBVc2UgdGhlICJvdXQiIHR5cGVtYXBzIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBdHRyaWJ1dGUgc2V0IG1ldGhvZHMgbm8gbG9uZ2VyIHJldHVybiB0aGUgdmFsdWUgb2YgYSBtZW1iZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgbm93IGdldHMgc2V0IGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgIHZvaWQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgICBmLT54ID0geDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gU1dJRzEuMSBpdCB1c2VkIHRvIGJlIHRoaXM6CgogICAgICAgICAgICAgIGludCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIChmLT54ID0geCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgY3JlYXRlZCBieSB0cnlpbmcKICAgICAgICAgIHRvIGRvIHRoaXMgd2l0aCBtb3JlIGV4b3RpYyBkYXRhdHlwZXMgc3VjaCBhcyBhcnJheXMuICBJdCBhbHNvCiAgICAgICAgICBjb21wbGljYXRlcyBpbmxpbmluZyBhbmQgaGFuZGxpbmcgb2YgdGhlICJtZW1iZXJpbiIgdHlwZW1hcC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIHB0cmNhc3QoKSBhbmQgcHRybWFwKCkgZnVuY3Rpb25zIGZyb20gdGhlCiAgICAgICAgICBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgT2xkIGltcGxlbWVudGF0aW9uIGlzIGluY29tcGF0aWJsZQogICAgICAgICAgd2l0aCBuZXcgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVRdWVyeShjb25zdCBjaGFyICpuYW1lKSBhZGRlZC4KICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgdHlwZSBpbmZvIHN0cnVjdHVyZQogICAgICAgICAgdGhhdCBpcyB1c2VkIGZvciB0eXBlLWNoZWNraW5nLiAgSXQgd29ya3Mgd2l0aCBlaXRoZXIgdGhlCiAgICAgICAgICBuaWNlIEMgbmFtZSBvciBtYW5nbGVkIHZlcnNpb24gb2YgYSBkYXRhdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiaW50ICoiKTsKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiX3BfaW50Iik7CgogICAgICAgICAgVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIHRoYXQgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBzb21lCiAgICAgICAgICBleG90aWMgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUKICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZSBvYmplY3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBkaXJlY3RpdmUgJXR5cGVzKCkgYWRkZWQuICBUaGlzIGlzIHVzZWQgdG8KICAgICAgICAgIGV4cGxpY2l0bHkgbGlzdCBkYXRhdHlwZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4KICAgICAgICAgIHRoZSBydW50aW1lIHR5cGUtY2hlY2tpbmcgY29kZS4gTm9ybWFsbHkgaXQgaXMgbmV2ZXIKICAgICAgICAgIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBidXQgc29tZXRpbWVzIGFkdmFuY2VkIGV4dGVuc2lvbnMKICAgICAgICAgIChzdWNoIGFzIHRoZSBwb2ludGVyLmkgbGlicmFyeSkgbWF5IG5lZWQgdG8gbWFudWFsbHkKICAgICAgICAgIGFkZCB0eXBlcyB0byB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIHN0cmluZyBhcnJheSB2YXJpYWJsZXMuIEZvciBleGFtcGxlLAogICAgICAgICAgYSBnbG9iYWwgdmFyaWFibGUgb2YgdGhlIGZvcm0gImNoYXIgbmFtZVs2NF0iIGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgIG1hbmFnZWQgYXMgYSA2NCBjaGFyYWN0ZXIgc3RyaW5nLiAgUHJldmlvdXNseSB0aGlzIGRpZG4ndAogICAgICAgICAgd29yayBhdCBhbGwgb3IgcmVxdWlyZWQgdGhlIHVzZSBvZiBhIHNwZWNpYWwgdHlwZW1hcC4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAoVGNsLCBQZXJsLCBQeXRob24pICoqKgoKOC8zMS8wMCA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgYGNoZWNrLWMrKy1leGFtcGxlcycsIHdoaWNoIHVzZXMgbmV3CgkgIGZpbGVzIHVuZGVyIEV4YW1wbGVzL0MrKyBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLiAgTm93ICJtYWtlCgkgIGNoZWNrIiBhbHNvIGRvZXMgIm1ha2UgY2hlY2stYysrLWV4YW1wbGVzIi4gIEFsc28sIGV4cGFuZGVkCgkgIGFjdGlvbnMgaW4gYGNoZWNrLWdpZnBsb3QtZXhhbXBsZScgYW5kIGBjaGVjay1hbGl2ZW5lc3MnLgoKOC8zMC8wMCA6IG1rb2VwcGUKCSAgTWFqb3IgY2xlYW4tdXAgaW4gdGhlIEd1aWxlIG1vZHVsZS4gQWRkZWQgdHlwZW1hcC1kcml2ZW4KCSAgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uIENoYW5nZWQgdG8gaGFuZGxlIG1vcmUgdGhhbiAxMAoJICBhcmdzLiBVcGRhdGVkIGFuZCBleHRlbmRlZCBleGFtcGxlcy4KCSAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlaW5zZXJ0IGRpcmVjdGl2ZSB0aGF0IGluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQogICAgICAgICAgaW50byBhIHBvcnRpb24gb2YgdGhlIG91dHB1dCB3cmFwcGVyIGZpbGUuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKICAgICAgICAgIGZvciB1c2UgYnkgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV29ya3MgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVycykgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQocnVudGltZSkgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQod3JhcHBlcnMpICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQoaW5pdCkgICAgICJmaWxlLnN3ZyI7CgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlcnVudGltZSBkaXJlY3RpdmUgd2hpY2ggaW5jbHVkZXMgY29kZSBpbnRvIHRoZSBydW50aW1lCiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSB3cmFwcGVyIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcnVudGltZSAlewogICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGludGVybmFsIHJ1bnRpbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgIFRoZXJlIGlzIG5vIHByYWN0aWNhbCByZWFzb24gZm9yIG9yZGluYXJ5IHVzZXJzIHRvIHVzZSB0aGlzCiAgICAgICAgICBmZWF0dXJlIChhbG1vc3QgZXZlcnl0aGluZyBjYW4gYmUgZG9uZSB1c2luZyAleyAuLi4gJX0KICAgICAgICAgIGluc3RlYWQpLiAgIEhvd2V2ZXIsIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkgd2FudCB0bwogICAgICAgICAgdXNlIHRoaXMgaW4gbGFuZ3VhZ2UgY29uZmlndXJhdGlvbiBmaWxlcy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBjYW4gbm93IGJlIHNwZWNpZmllZCB1c2luZyBzdHJpbmcgbGl0ZXJhbHMgbGlrZQogICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAiJHRhcmdldCA9IFN2SVYoJHNvdXJjZSk7IjsKCiAgICAgICAgICBXaGVuIGNvZGUgaXMgc3BlY2lmaWVkIGxpa2UgdGhpcywgaXQgaXMgKk5PVCogZW5jbG9zZWQKICAgICAgICAgIGluc2lkZSBhIGxvY2FsIHNjb3BlIChhcyB3aXRoIG9sZGVyIHR5cGVtYXAgZGVjbGFyYXRpb25zKS4KICAgICAgICAgIE5vdGU6IGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpbnRlcnByZXRlZCBpbiB0aGUKICAgICAgICAgIGNvZGUgc3RyaW5nIHNvIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgYSBxdW90ZSBvciBzb21lCiAgICAgICAgICBvdGhlciBzcGVjaWFsIGNoYXJhY3RlciwgbWFrZSBzdXJlIHlvdSB1c2UgYSAoXCkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI3LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGZvbGxvdyB0eXBlZGVmIGRlY2xhcmF0aW9ucy4KICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCBOdW1iZXI7CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBpbnRlZ2VyIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdm9pZCBmb28oTnVtYmVyIGEpOwoKICAgICAgICAgIFRoZSB0eXBlbWFwIGZvciAnaW50JyB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGFyZ3VtZW50ICdOdW1iZXIgYScuCiAgICAgICAgICBPZiBjb3Vyc2UsIGlmIHlvdSBzcGVjaWZ5IGEgdHlwZW1hcCBmb3IgJ051bWJlcicgaXQgd2lsbCB0YWtlCiAgICAgICAgICBwcmVjZWRlbmNlIChub3Igd2lsbCBpdCBldmVyIGJlIGFwcGxpZWQgdG8gYW4gJ2ludCcpLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI3LzAwIDogYmVhemxleQogICAgICAgICAgRGVmYXVsdCB0eXBlbWFwIHNwZWNpZmljYXRpb24gaGFzIGNoYW5nZWQuICAgSW4gb2xkZXIKICAgICAgICAgIHZlcnNpb25zIG9mIHN3aWcsIHlvdSBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgaGFuZGxpbmcgb2YgYSBkYXRhdHlwZS4gICBOb3cgdGhhdAogICAgICAgICAgU1dJRyBmb2xsb3dzIHR5cGVkZWYgZGVjbGFyYXRpb25zLCB0aGlzIGlzIHVubmVjZXNzYXJ5LgogICAgICAgICAgU2ltcGx5IHNwZWNpZnlpbmcgYSB0eXBlbWFwIGZvciAnaW50JyB3aWxsIHdvcmsgZm9yIGFsbAogICAgICAgICAgdmFyaWF0aW9ucyBvZiBpbnRlZ2VycyB0aGF0IGFyZSB0eXBlZGVmJ2QgdG8gJ2ludCcuCgogICAgICAgICAgQ2F2ZWF0LCBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBwb2ludGVycywKICAgICAgICAgIHJlZmVyZW5jZXMsIGFycmF5cywgYW5kIHVzZXIgZGVmaW5lZCB0eXBlcyBpcyBhIGxpdHRsZQogICAgICAgICAgZGlmZmVyZW50LiAgVGhpcyBtdXN0IGJlIGRvbmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1BPSU5URVIgKiB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSBwb2ludGVyIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1JFRkVSRU5DRSAmIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdBUlJBWSBbXSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSB1c2VyLWRlZmluZWQgdHlwZSAoYnkgdmFsdWUpIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMTUvMDAgOiBkdXN0aW4KICAgICAgICAgIFRoZSBmaWxlIHN3aWctMS4zYTEtMS5zcGVjIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBUb29scyBkaXJlY3RvcnkuCiAgICAgICAgICBJdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHJlZGhhdCBwYWNrYWdlIGZvciBTV0lHLCBhbHRob3VnaCBpdAogICAgICAgICAgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIHRoZSBuZXh0IHB1YmxpYyByZWxlYXNlLgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHJld3JpdHRlbi4gIEV2ZW50dWFsbHkgdGhleSBtYXkgYmUKICAgICAgICAgIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nIGJldHRlciwgYnV0IGZvciBub3cgdGhleSBzdGF5LiAgSG93ZXZlciwKICAgICAgICAgIHRoZXJlIGFyZSBhIG51bWJlciBvZiBhIHNpZ25pZmljYW50IGNoYW5nZXMgdGhhdCBtYXkgdHJpcCBzb21lCiAgICAgICAgICBwZW9wbGUgdXA6CgogICAgICAgICAgMS4gIFR5cGVtYXAgc2NvcGluZyBpcyBjdXJyZW50bHkgYnJva2VuLiAgQmVjYXVzZSBvZiB0aGlzLCB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgY29kZSB3b24ndCB3b3JrLgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGJsYWggKngpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAqOyAgIC8qIENsZWFyIHR5cGVtYXAgKi8KCiAgICAgICAgICAgICAgKHRoaXMgYnJlYWtzIGJlY2F1c2UgdGhlIGNvZGUgZm9yIHRoZSBjbGFzcyBGb28gaXMgYWN0dWFsbHkKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYWZ0ZXIgdGhlIGVudGlyZSBpbnRlcmZhY2UgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQpLgogICAgICAgICAgICAgIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBidWcuCgogICAgICAgICAgMi4gIEluIFNXSUcxLjEsIHRoZSAlYXBwbHkgZGlyZWN0aXZlIHdvcmtlZCBieSBwZXJmb3JtaW5nIGEKICAgICAgICAgICAgICB2ZXJ5IGNvbXBsZXggdHlwZS1hbGlhc2luZyBwcm9jZWR1cmUuICBGcm9tIHRoaXMgcG9pbnQgb24sCiAgICAgICAgICAgICAgJWFwcGx5IGlzIHNpbXBseSBhIGdlbmVyYWxpemVkIHR5cGVtYXAgY29weSBvcGVyYXRpb24uCiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKngsIGRvdWJsZSAqeSB9OwoKICAgICAgICAgICAgICBDb3BpZXMgKkFMTCogY3VycmVudGx5IGRlZmluZWQgdHlwZW1hcHMgZm9yICdkb3VibGUgKk9VVFBVVCcgYW5kCiAgICAgICAgICAgICAgY29waWVzIHRoZW0gdG8gJ2RvdWJsZSAqeCcgYW5kICdkb3VibGUgKnknLgoKICAgICAgICAgICAgICBNb3N0IHBlb3BsZSBwcm9iYWJseSB3b24ndCBldmVuIG5vdGljZSB0aGlzIGNoYW5nZSBpbgogICAgICAgICAgICAgICVhcHBseS4gIEhvd2V2ZXIsIHdoZXJlIGl0IHdpbGwgYnJlYWsgdGhpbmdzIGlzIGluIGNvZGUgbGlrZQogICAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKnggfTsKICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqT1VUUFVUIHsKICAgICAgICAgICAgICAgICAgICAgICAuLi4gd2hhdGV2ZXIgLi4uCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqeCk7CgogICAgICAgICAgICAgIEluIFNXSUcxLjEsIHlvdSB3aWxsIGZpbmQgdGhhdCAnZm9vJyB1c2VzIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUKICAgICAgICAgICAgICBldmVuIHRob3VnaCBpdCB3YXMgZGVmaW5lZCBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZSAodGhpcyBpcwogICAgICAgICAgICAgIHRoZSB3ZWlyZCBhbGlhc2luZyBzY2hlbWUgYXQgd29yaykuICBJbiBTV0lHMS4zIGFuZCBsYXRlciwKICAgICAgICAgICAgICB0aGUgJ2RvdWJsZSAqT1VUUFVUJyBydWxlIGlzIGlnbm9yZWQgYmVjYXVzZSBpdCBpcyBkZWZpbmVkCiAgICAgICAgICAgICAgYWZ0ZXIgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgMy4gIFRoZSAlY2xlYXIgZGlyZWN0aXZlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVyYXNlIGFsbCBjdXJyZW50bHkKICAgICAgICAgICAgICBkZWZpbmVkIHR5cGVtYXBzIGZvciBhIHBhcnRpY3VsYXIgdHlwZS4gIFRoaXMgZGlmZmVycyBmcm9tCiAgICAgICAgICAgICAgU1dJRzEuMSB3aGVyZSAlY2xlYXIgb25seSByZW1vdmVkIHJ1bGVzIHRoYXQgd2VyZSBhZGRlZCB1c2luZwogICAgICAgICAgICAgIHRoZSAlYXBwbHkgZGlyZWN0aXZlLgoKICAgICAgICAgIDQuICBUeXBlbWFwIG1hdGNoaW5nIGlzIG5vdyBwZXJmb3JtZWQgdXNpbmcgKmV4YWN0KiB0eXBlcy4KICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhpbmdzIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjaGFyICogeyB9CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAqIHsgfQoKICAgICAgICAgICAgICBhcmUgZGlmZmVyZW50IHR5cGVtYXBzLiAgICBBIHNpbWlsYXIgcnVsZSBhcHBsaWVzIGZvciBwb2ludGVycywKICAgICAgICAgICAgICBhcnJheXMsIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqIHsgfQoKICAgICAgICAgICAgICB1c2VkIHRvIGFwcGx5IHRvICdkb3VibGUgJicsICdkb3VibGUgW10nLCAgTm93LCBpdCBvbmx5IGFwcGxpZXMKICAgICAgICAgICAgICB0byAnZG91YmxlIConLiAgSWYgeW91IHdhbnQgYSAnZG91YmxlICYnLCB5b3UnbGwgbmVlZCB0byBoYW5kbGUKICAgICAgICAgICAgICB0aGF0IHNlcGFyYXRlbHkuCgogICAgICAgICAgNS4gIEFycmF5IG1hdGNoaW5nIGhhcyBiZWVuIHNpbXBsZmllZC4gIEluIFNXSUcxLjEsIGFycmF5IG1hdGNoaW5nCiAgICAgICAgICAgICAgd2FzIHBlcmZvcm1lZCBieSB0cnlpbmcgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgZGltZW5zaW9ucy4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgJ2RvdWJsZSBhWzEwXVsyMF0nIHdhcyBtYXRjaGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVtBTlldCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgICAgICBJbiBTV0lHMS4zLCBvbmx5IHRoZSBmb2xsb3dpbmcgbWF0Y2hlcyBhcmUgYXR0ZW1wdGVkOgoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldW0FOWV0KCiAgICAgICAgICBPbiB0aGUgcG9zaXRpdmUgc2lkZSwgdHlwZW1hcCBtYXRjaGluZyBpcyBub3cgKnNpZ25pZmljYW50bHkqIGZhc3RlcgogICAgICAgICAgdGhhbiBiZWZvcmUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBTZWNyZXQgZGV2ZWxvcGVyIGZlYXR1cmUuICBTaW5jZSBkYXRhdHlwZXMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyAKICAgICAgICAgIHN0cmluZ3MgaW50ZXJuYWxseSwgeW91IGNhbiBieXBhc3MgbGltaXRhdGlvbnMgb2YgdGhlIHBhcnNlciBhbmQKICAgICAgICAgIGNyZWF0ZSBhIHdpbGQgZGF0YXR5cGUgYnkgc2ltcGx5IGVuY2xvc2luZyB0aGUgcmF3IHN0cmluZyBlbmNvZGluZwogICAgICAgICAgaW4gYmFja3RpY2tzIChgYCkgYW5kIHN0aWNraW5nIGl0IGluIHRoZSBpbnRlcmZhY2UgZmlsZSBhbnl3aGVyZSBhCiAgICAgICAgICB0eXBlIGlzIGV4cGVjdGVkLiAgRm9yIGV4YW1wbGUsIGBhKDIwKS5hKDEwKS5wLmYoaW50LGludClgLiAgVGhpcyAKICAgICAgICAgIGZlYXR1cmUgaXMgb25seSBpbnRlbmRlZCBmb3IgdGVzdGluZyAoaS5lLiwgeW91IHdhbnQgdG8gc2VlIHdoYXQKICAgICAgICAgIGhhcHBlbnMgdG8geW91ciBsYW5ndWFnZSBtb2R1bGUgaWYgaXQgZ2V0cyBhIHJlZmVyZW5jZSB0byBhIHBvaW50ZXIKICAgICAgICAgIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvciBzb21ldGhpbmcpLiAKICAgICAgICAgICoqKiBTSUNLIEhBQ0sgKioqCgo4LzE0LzAwIDogYmVhemxleQogICAgICAgICAgQ29tcGxldGVseSBuZXcgdHlwZS1zeXN0ZW0gYWRkZWQgdG8gdGhlIGltcGxlbWVudGF0aW9uLgogICAgICAgICAgTW9yZSBkZXRhaWxzIGxhdGVyLgoKOC8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIENsZWFuZWQgdXAgc29tZSBvZiB0aGUgSS9PIGhhbmRsaW5nLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzCiAgICAgICAgICBhbnkgdGVtcG9yYXJ5IGZpbGVzIHN1Y2ggYXMgX3dyYXAud3JhcCwgX3dyYXAuaWksIF93cmFwLmluaXQuCiAgICAgICAgICBJbnN0ZWFkLCB0aGVzZSAiZmlsZXMiIGFyZSBrZXB0IGFyb3VuZCBpbiBtZW1vcnkgYXMgc3RyaW5ncwogICAgICAgICAgKGFsdGhvdWdoIHRoaXMgaXMgdHJhbnNwYXJlbnQgdG8gbGFuZ3VhZ2UgbW9kdWxlcykuCgo4LzQvMDAgIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCAiY2hlY2siIGFuZCB2YXJpYW50cy4KCSAgVGhpcyBjYW4gYmUgdXNlZCBsaWtlICJtYWtlIGNoZWNrIiBvciwgdG8gZXhwbGljaXRseSBza2lwIGEKCSAgbGFuZ3VhZ2UgTEFORzogIm1ha2Ugc2tpcC1MQU5HPXRydWUgY2hlY2siLiAgTEFORyBpcyBza2lwcGVkCgkgIGF1dG9tYXRpY2FsbHkgaWYgLi9jb25maWd1cmUgZGV0ZXJtaW5lcyB0aGF0IExBTkcgc3VwcG9ydCBpcwoJICBpbnN1ZmZpY2llbnQuCgoJICBDdXJyZW50bHksIHRoZSBjaGVjayBpcyBsaW1pdGVkIHRvIGRvaW5nIHRoZSBlcXVpdmFsZW50IG9mCgkgICJtYWtlIGFsbCIgaW4gc29tZSBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3JpZXMuICBUaGlzIHNob3VsZAoJICBiZSBleHBhbmRlZCBib3RoIGhvcml6b250YWxseSAoZGlmZmVyZW50IHR5cGVzIG9mIHRlc3RzKSBhbmQKCSAgdmVydGljYWxseSAoYWZ0ZXIgIm1ha2UgYWxsIiBpbiBhbiBFeGFtcGxlcyBzdWJkaXIgc3VjY2VlZHMsCgkgIGRvIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyB3aXRoIHRoZSByZXN1bHRpbmcgaW50ZXJwcmV0ZXIsIGV0YykuCgo4LzQvMDAgIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCAiZGlzdGNsZWFuIiwgd2hpY2ggZGVsZXRlcyBhbGwgdGhlCgkgIGZpbGVzIC4vY29uZmlndXJlIGNyZWF0ZXMsIGluY2x1ZGluZyBjb25maWcuc3RhdHVzIGFuZCBmcmllbmRzLgoKOC8zLzAwICA6IGhhcmNvaAoJICBqYXZhIGNoYW5nZXM/Pz8gW3RvZG86IGRvY3VtZW50IGNoYW5nZXNdCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGtleSBvZmYgb2YgdGhlIHJlYWwgZGF0YXR5cGVzCiAgICAgICAgICB1c2VkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4gIFRoaXMgbWVhbnMgdGhhdCB0eXBlbWFwcyBmb3IKICAgICAgICAgICJjb25zdCBjaGFyICoiIGFuZCAiY2hhciAqIiB3aWxsIGJlIGRpZmZlcmVuY2UgYXMgd2lsbCB0eXBlbWFwcwogICAgICAgICAgZm9yICJWZWN0b3IiIGFuZCAiVmVjdG9yICouIgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGlzIGxpa2VseSB0byBicmVhayBpbnRlcmZhY2VzIHRoYXQgcmVseSBvbiB0aGUgb2RkIHR5cGUKICAgICAgICAgIGhhbmRsaW5nIGJlaGF2aW9yIG9mIHR5cGVtYXBzIGluIFNXSUcxLjEtLWVzcGVjaWFsbHkgd2l0aAogICAgICAgICAgcmVzcGVjdCB0byBpbnRlcmZhY2VzIGludm9sdmluZyBwYXNzLWJ5LXZhbHVlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIE5ldyAlY29uc3RhbnQgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIGNyZWF0ZSB0cnVlIGNvbnN0YW50cyBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4KICAgICAgICAgIEl0J3MgbW9zdCBzaW1wbGUgZm9ybSBpcyBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICVjb25zdGFudCBGT08gNDI7CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBzeW50YXggb2YgdGhlCiAgICAgICAgICB2YWx1ZSAoaW4gcmVhbGl0eSwgYWxsICNkZWZpbmUgbWFjcm9zIGFyZSB0cmFuc2xhdGVkIGludG8KICAgICAgICAgIGRpcmVjdGl2ZXMgb2YgdGhpcyBmb3JtKS4KCiAgICAgICAgICBBbiBleHBhbmRlZCB2ZXJzaW9uIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAlY29uc3RhbnQoRm9vICopIEZPTyA9ICZGb29PYmo7CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCBhbiBleHBsaWNpdCB0eXBlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzCiAgICAgICAgICBsYXR0ZXIgZm9ybSBtYXkgYmUgdXNlZnVsIGZvciBjcmVhdGluZyBjb25zdGFudHMgdGhhdAogICAgICAgICAgdXNlZCB0byBiZSBzcGVjaWZpZWQgYXMKCiAgICAgICAgICAgICBjb25zdCBGb28gKkZPTyA9ICZGb29PYmo7CgogICAgICAgICAgKHdoaWNoIGFyZSBub3cgdHJlYXRlZCBhcyB2YXJpYWJsZXMpLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKiBUaGUgc3ludGF4IG1heSBjaGFuZ2UgaW4KICAgICAgICAgIHRoZSBmaW5hbCByZWxlYXNlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgc28gdGhhdCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0KICAgICAgICAgICJjb25zdCB0eXBlICphIiBhcmUgaGFuZGxlZCBhcyB2YXJpYWJsZXMsIG5vdCBjb25zdGFudHMuCiAgICAgICAgICBOb3RlOiBTV0lHMS4xIGhhbmRsZWQgdGhpcyBjYXNlIGVycm9uZW91c2x5IGJlY2F1c2UKICAgICAgICAgIGNvbnN0IGNoYXIgKmEgaXMgYSBwb2ludGVyIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHJlYXNzaWduZWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIE5vdGU6IGp1c3QgYmVjYXVzZSB0aGlzIGlzIHRoZSAicmlnaHQiIHdheSB0byBkbyB0aGluZ3MsCiAgICAgICAgICBkb2Vzbid0IG1lYW4gaXQncyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBpbnRlcnByZXRhdGlvbi4KICAgICAgICAgIEkgc3VzcGVjdCB0aGF0IG1hbnkgQyBwcm9ncmFtbWVycyBtaWdodCB1c2UgJ2NvbnN0IGNoYXIgKicKICAgICAgICAgIHdpdGggdGhlIGludGVudCBvZiBjcmVhdGluZyBhIGNvbnN0YW50LCB3aXRob3V0IHJlYWxpemluZwogICAgICAgICAgdGhhdCB0aGV5J3ZlIGNyZWF0ZWQgYSByZWFzc2lnbmFibGUgZ2xvYmFsIHZhcmlhYmxlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSBDL0MrKyB3cmFwcGluZyBsYXllciBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlZGVzaWduZWQgYW5kCiAgICAgICAgICByZWltcGxlbWVudGVkLiAgVGhpcyBjaGFuZ2Ugc2hvdWxkIGlyb24gb3V0IGEgZmV3IHJvdWdoCiAgICAgICAgICBzcG90cyB3aXRoIHRoZSBoYW5kbGluZyBvZiBkYXRhdHlwZXMuICBJbiBhZGRpdGlvbiwgdGhlCiAgICAgICAgICB3cmFwcGVyIGNvZGUgaXMgc29tZXdoYXQgY2xlYW5lci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdCBpbnZvbHZlCiAgICAgICAgICBzdWJ0bGUgY29ybmVyLWNhc2VzIHdpdGggdHlwZW1hcHMgYW5kIHRoZSAlYWRkbWV0aG9kcwogICAgICAgICAgZGlyZWN0aXZlIHNpbmNlIHNvbWUgb2YgdGhlc2UgZmVhdHVyZXMgaGFkIHNvbWV3aGF0CiAgICAgICAgICB0eXBlIGhhbmRsaW5nIGJlaGF2aW9yIGluIFNXSUcxLjEuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlICJtZW1iZXJpbiIgYW5kICJtZW1iZXJvdXQiIHR5cGVtYXBzIGFyZSBnb25lIGZvciB0aGUKICAgICAgICAgIG1vbWVudCwgYnV0IHRoZXkgbWlnaHQgcmV0dXJuIGFzIHNvb24gYXMgSSBmaWd1cmUgb3V0CiAgICAgICAgICBob3cgdG8gaW50ZWdyYXRlIHRoZW0gd2l0aCBzb21lIG9mIHRoZSBzdHJlYW1saW5lZCBDIHdyYXBwZXIKICAgICAgICAgIGZ1bmN0aW9ucy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBvbGQgdHlwZSBoYW5kbGluZyBmdW5jdGlvbnMgc3VjaCBhcyBwcmludF90eXBlKCksCiAgICAgICAgICBwcmludF9mdWxsKCksIHByaW50X21hbmdsZSgpLCBldGMuLi4gYXJlIGdvbmUgYW5kIGhhdmUgYmVlbgogICAgICAgICAgcmVwbGFjZWQgd2l0aCBhIHNtYWxsZXIgc2V0IG9mIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZmlsZQogICAgICAgICAgRG9jL2ludGVybmFscy5odG1sIGZvciBkZXRhaWxzLiAgVGhpcyB3aWxsIGJyZWFrIGFsbCB0aGlyZAogICAgICAgICAgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICV2YWwgYW5kICVvdXQgZGlyZWN0aXZlcy4gIFRoZXNlIGRpcmVjdGl2ZXMKICAgICAgICAgIHNob3VsZG4ndCByZWFsbHkgYmUgbmVjZXNzYXJ5IHNpbmNlIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICB0byBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cy4gICBUaGlzIGFsc28gY2xlYW5zIHVwIHRoZQogICAgICAgICAgaGFuZGxpbmcgb2YgdHlwZXMgYW5kIHBhcmFtZXRlcnMgcXVpdGUgYSBiaXQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjAvMDAgOiB0dG4KCSAgRml4ZWQgdW5zcGVjaWZpZWQtbW9kdWxlIGJ1ZyBpbiBHdWlsZSBzdXBwb3J0IGFuZCByZW1vdmVkCgkgIG1vcmUgbm9uLSJ3aXRoLXNtb2JzIiBmdW5jdGlvbmFsaXR5IHVzaW5nIHBhdGNoZXMgc3VibWl0dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCgkgIFJlLWVuYWJsZSByZWNvZ25pdGlvbiBvZiAiLXdpdGgtc21vYnMiICh3aXRoIG5vIGVmZmVjdCBzaW5jZQoJICB3ZSB1c2Ugc21vYnMgYnkgZGVmYXVsdCBub3cpIGZvciB0aGUgdGltZSBiZWluZy4gIEFmdGVyIHRoZQoJICAxLjNhNCByZWxlYXNlLCB0aGlzIG9wdGlvbiB3aWxsIHNpZ25hbCBhbiBlcnJvci4KCjcvMTcvMDAgOiB0dG4KCSAgRml4ZWQgTlVMTC1pbnB1dCBidWcgaW4gcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcuCgkgIFJlcG9ydGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjcvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBtZW1vcnkgbGVhayBpbiBQeXRob24gdHlwZS1jaGVja2luZyBjb2RlLiBSZXBvcnRlZCBieQogICAgICAgICAgS2VpdGggRGF2aWRzb24uICBCdWcgIzEwOTM3OS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGhhbmRsaW5nIG9mIHRoZSAlbmFtZSgpIGRpcmVjdGl2ZQogICAgICAgICAgYW5kIGNsYXNzZXMgaW4gdGhlIFRjbCBtb2R1bGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgSmFtZXMgQmFpbGV5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHBhcnNpbmcgYW5kIGVudW0gaGFuZGxpbmcgcHJvYmxlbXMgd2l0aCBjaGFyYWN0ZXIgY29uc3RhbnRzLgogICAgICAgICAgUmVwb3J0ZWQgYnkgR3JlZyBLb2NoYW5za2kuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3MgZnJvbSB0aGUgY29yZSBhbmQgdXBkYXRlZCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgIG1vZHVsZS4gIFRoaXMgd2lsbCBicmVhayB0aGlyZCBwYXJ0eSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzkvMDAgIDogYmVhemxleQogICAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgU1dJRyBubyBsb25nZXIgbWFrZXMgdXNlIG9mIEMrKyBvcGVyYXRvciBvdmVybG9hZGluZy4KICAgICAgICAgIFRoaXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJyZWFrICphbGwqIHRoaXJkIHBhcnR5IGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtYWluIFNXSUcgQ1ZTIHRyZWUuIFNvcnJ5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzgvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgZXhwZXJpbWVudGFsIGFuZCB1bmRvY3VtZW50ZWQgImJ1aWxkIiB0eXBlbWFwIHRoYXQKICAgICAgICAgIHdhcyBpbnRlbmRlZCB0byB3b3JrIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzLiBTaW1wbHkgdG9vIHdlaXJkCiAgICAgICAgICB0byBrZWVwIGFyb3VuZC4gIEJlc2lkZXMsIGEgYmV0dGVyIHJlcGxhY2VtZW50IGlzIGluIHRoZSB3b3Jrcy4KCjcvNi8wMCAgOiB0dG4KICAgICAgICAgIFJlbW92ZWQgbm9uLSJ3aXRoLXNtb2JzIiBmdW5jdGlvbmFsaXR5IChHdWlsZSBzdXBwb3J0KSwgaS5lLiwKICAgICAgICAgICItd2l0aC1zbW9icyIgaXMgbm93IHRoZSBkZWZhdWx0IGFuZCBubyBsb25nZXIgbmVlZHMgdG8gYmUKCSAgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCgo3LzUvMDAgIDogdHRuCiAgICAgICAgICBJbmNvcnBvcmF0ZWQgUnVieSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hc2FraSBGdWt1c2hpbWEuCgo2LzI4LzAwIDogdHRuCiAgICAgICAgICBBcHBsaWVkIG1vcmUtdGhhbi0xMC1hcmdzIGJ1Z2ZpeCBwYXRjaCBjb250cmlidXRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgo2LzI3LzAwIDogYmVhemxleQogICAgICAgICAgUmV3cm90ZSBzb21lIG9mIHRoZSBzdHJpbmcgaGFuZGxpbmcgYW5kIGVsaW1pbmF0ZWQgdGhlIEMrKwogICAgICAgICAgaW1wbGVtZW50YXRpb24gKHdoaWNoIGlzIG5vdyBqdXN0IGEgd3JhcHBlcikuCgo2LzI3LzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBEb2MvaW5kZXguaHRtbCBhbmQgRG9jL2ludGVybmFscy5odG1sLiAgVGhlIHRhcmdldAogICAgICAgICAgYXVkaWVuY2UgZm9yIHRoZSBsYXR0ZXIgaXMgbmV3IFNXSUcgZGV2ZWxvcGVycy4KCgpWZXJzaW9uIDEuMyBBbHBoYSAzIChKdW5lIDE4LCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8xOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIG5hbWluZy5jeHgsIGhhc2guY3h4LCBhbmQgc3ltYm9sLmN4eCBmaWxlcyBmcm9tCiAgICAgICAgICB0aGUgU1dJRzEuMSBkaXJlY3RvcnkuICAgQ29udGludWVkIHRvIG1pZ3JhdGUgdGhpbmdzIGF3YXkKICAgICAgICAgIGZyb20gdGhlIEMrKyBiYXNlIChhbHRob3VnaCB0aGVyZSdzIHN0aWxsIGEgbG90IG9mIHdvcmsgdG8gZG8pLgoKNi8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgZmV3IG1vcmUgZXhhbXBsZXMgdG8gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeS4gIFN0aWxsCiAgICAgICAgICBuZWVkIHRvIGRvIGEgbG90IG9mIHdvcmsgb24gdGhpcy4KCjYvMTYvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtaW5jbHVkZWFsbCB0byBmb2xsb3cgYWxsICNpbmNsdWRlIHN0YXRlbWVudHMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgo2LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHJpZWQgdG8gZml4IGFzIG1hbnkgQysrIHdhcm5pbmdzIGFzIHBvc3NpYmxlIHdoZW4gY29tcGlsaW5nCiAgICAgICAgICB3aXRoIHRoZSBTdW4gV29ya3Nob3AgQysrIGNvbXBpbGVyLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucwogICAgICAgICAgdGhhdCB0aGVyZSBhcmUgYSBsb3Qgb2Ygc3RhdGVtZW50cyB0aGF0IGNvbnRhaW4gc3RyaW5nIGxpdGVyYWxzCiAgICAgICAgICBvZiB0aGUgZm9ybSAoY2hhciopIkJsYWgiLgoKNi8xNS8wMDogIGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBjbGVhbnVwIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaW4gdGhlCiAgICAgICAgICBsb3ctbGV2ZWwgRE9IIGxpYnJhcnkuICAgVGhpcyBzZWVtcyB0byByZXN1bHQgaW4gYSBzcGVlZHVwCiAgICAgICAgICBvZiA1MC0xMDAlIGZvciBwcmVwcm9jZXNzaW5nIGFuZCBvdGhlciByZWxhdGVkIHRhc2tzLgoKNS8xMC8wMCA6IHR0bgoJICBBcHBsaWVkIHZhcmlhYmxlLXdyYXBwaW5nIGJ1Z2ZpeCBwYXRjaCBjb250cmlidXRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgo0LzE3LzAwIDogdHRuCgkgIFVwZGF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgV2Ugbm93IHVzZSBhIGBTY2hlbWVfVHlwZSctYmFzZWQgc3RydWN0dXJlIHRvIHdyYXAgcG9pbnRlcnMuCgo0LzExLzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBmdXJ0aGVyIEd1aWxlLXN1cHBvcnQgcGF0Y2ggYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUeXBlbWFwcyBwcmV2aW91c2x5IGRlbGV0ZWQgaGF2ZSBiZWVuIHJlLWFkZGVkLiAgVGhlcmUgaXMgbm93CgkgIGV4Y2VwdGlvbiBoYW5kbGluZyAoc2VlIERvYy9lbmdpbmVlcmluZy5odG1sKS4gIGBTV0lHX2luaXQnIGlzIG5vdwoJICBkZWNsYXJlZCBleHRlcm4gb25seSBmb3Igc2ltcGxlIGxpbmthZ2UuICBTb21lIGJ1Z3Mgd2VyZSBmaXhlZC4KCjQvMDYvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIE16U2NoZW1lIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgT2xlZyBUb2xtYXRjZXYuCgkgIFRoaXMgaW5jbHVkZXMgbmV3IGRpcmVjdG9yaWVzIExpYi9tenNjaGVtZSBhbmQgRXhhbXBsZXMvbXpzY2hlbWUuCgo0LzAzLzAwIDogdHRuCgkgIEFkZGVkIEV4YW1wbGVzL2d1aWxlIGFuZCBjaGlsZHJlbi4gIFRoaXMgaXMgYW4gYWRhcHRhdGlvbiBvZgoJICB0aGUgc2FtZS1uYW1lZCBkaXJlY3RvcnkgZnJvbSB0aGUgU1dJRy0xLjFwNSBkaXN0cmlidXRpb24uCgkgIEFkZGVkIEd1aWxlLXNwZWNpZmljIHNlY3Rpb24gdG8gRG9jL2VuZ2luZWVyaW5nLmh0bWwuCgo0LzAyLzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBuZXcgZ3VpbGVtYWluLmkgYnkgTWFydGluIEZyb2VobGljaC4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlLXN1cHBvcnQgcmV3cml0ZSBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFRoZSBjb21tYW5kIGxpbmUgb3B0aW9uICItd2l0aC1zbW9icyIgZW5hYmxlcyBpbXBsZW1lbnRhdGlvbiBvZgoJICBwb2ludGVyIHR5cGUgaGFuZGxpbmcgdXNpbmcgc21vYnMsIHRoZSBjYW5vbmljYWwgbWVjaGFuaXNtIGZvcgoJICBkZWZpbmluZyBuZXcgdHlwZXMgaW4gR3VpbGUuICBQcmV2aW91cyBpbXBsZW1lbnRhdGlvbiAodXNpbmcKCSAgc3RyaW5ncykgaXMgYXQgdGhlIG1vbWVudCBzdGlsbCBzdXBwb3J0ZWQgYnV0IGRlcHJlY2F0ZWQuICBBdAoJICBzb21lIHBvaW50LCAiLXdpdGgtc21vYnMiIHdpbGwgYmUgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlcgoJICByZXF1aXJlZC4KCjMvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBwdXJpZnkgcGF0Y2hlcyBzdWJtaXR0ZWQgYnkgUmFtIEJoYW1pZGlwYXR5LgoKMy8wMi8wMCA6IHR0bgogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IEd1aWxlICJsaW5rYWdlIiBzY2hlbWVzLgoJICBDdXJyZW50bHksICItTGlua2FnZSBob2JiaXQiIHdvcmtzLgoKClZlcnNpb24gMS4zIEFscGhhIDIgKE1hcmNoIDEsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzI5LzAwIDogYmVhemxleQogICAgICAgICAgTWFkZSBTV0lHIGlnbm9yZSB0aGUgJ211dGFibGUnIGtleXdvcmQuCgoyLzI5LzAwIDogYmVhemxleQogICAgICAgICAgSW5jb3Jwb3JhdGVkIHNvbWUgcGF0Y2hlcyB0byB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8KICAgICAgICAgIHRoZSAtaGlkZSBvcHRpb24gYW5kIHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLgogICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEthcmwgRm9ybmVyLgoKMi8yNy8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUgc3VwcG9ydCBjb250cmlidXRlZCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFRoaXMgaW5jbHVkZXMgYSBjcHAgbWFjcm8gaW4gTGliL2d1aWxlL2d1aWxlLnN3ZyBhbmQgdGhlCgkgIGVudGlyZSBmaWxlIExpYi9ndWlsZS90eXBlbWFwcy5pLgoKMi8yNS8wMCA6IHR0bgoJICBNb2RpZmllZCBjb25maWd1cmUuaW4gYW5kIE1ha2VmaWxlLmluIGZpbGVzIHRvIHN1cHBvcnQKCSAgbm9uLWxvY2FsIGJ1aWxkICh1c2VmdWwgaW4gbXVsdGktYXJjaCBlbnZpcm9ubWVudHMpLgoKMi8yNC8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUgc3VwcG9ydCBjb250cmlidXRlZCBieSBDbGFyayBNY0dyZXcuCgkgIFRoaXMgd29ya3Mgd2l0aCBHdWlsZSAxLjMsIGJ1dCBzaW5jZSBpdCBkZXBlbmRzIGhlYXZpbHkKCSAgb24gdGhlIGdoXyBpbnRlcmZhY2UsIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgbGF0ZXIgdmVyc2lvbnMuCgkgIEl0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgd2l0aCB2ZXJzaW9ucyBiZWZvcmUgMS4zLgoJICBXQVJOSU5HOiBDb2RlIGlzIHVuc3RhYmxlIGR1ZSB0byBleHBlcmltZW50YXRpb24gYnkgdHRuLgoKMi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIE1hbnkgb2YgdGhlc2UgcmVzdWx0IGluIHN1YnN0YW50aWFsCiAgICAgICAgICBydW50aW1lIHBlcmZvcm1hbmNlIGdhaW5zLiAgSG93ZXZlciwgdGhlc2UgaGF2ZSBjb21lIGF0CiAgICAgICAgICBhIGNvc3Qgb2YgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgUHl0aG9uIDEuNS4yLiAgRm9yIG9sZGVyCiAgICAgICAgICB2ZXJzaW9ucywgdXNlICdzd2lnIC1ub29wdCAtcHl0aG9uJyB0byB0dXJuIG9mZiB0aGVzZQogICAgICAgICAgb3B0aW1pemF0aW9uIGZlYXR1cmVzLgoKVmVyc2lvbiAxLjMgQWxwaGEgMSAoRmVicnVhcnkgMTEsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi8xMS8wMCA6IEFkZGVkICd2b2lkJyB0byBwcm90b3R5cGUgb2YgUHl0aG9uIG1vZHVsZSBpbml0aWFsaXplci4KICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmsgSG93c29uICgxLzIwLzAwKS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBjb2RlIHRvIGRpc2NhcmQgb3duZXJzaGlwIG9mIGFuCiAgICAgICAgICBvYmplY3Qgd2hlbmV2ZXIgaXQgaXMgYXNzaWduZWQgdG8gYSBtZW1iZXIgb2YgYW5vdGhlciBvYmplY3QuCiAgICAgICAgICBUaGlzIHByb2JsZW0gaGFzIGJlZW4gYXJvdW5kIGZvciBhd2hpbGUsIGJ1dCB3YXMgbW9zdCByZWNlbnRseQogICAgICAgICAgcmVwb3J0ZWQgYnkgQnVya2hhcmQgS2xvc3MgKDEyLzMwLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBicmFjZXMgYXJvdW5kIG1hY3JvcyBpbiB0aGUgZXhjZXB0aW9uLmkgbGlicmFyeS4gIFJlcG9ydGVkCiAgICAgICAgICBieSBCdWNrIEhvZGdlcyAoMTIvMTkvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYnVnIGluIHRoZSBjb25zdHJhaW50cy5pIGxpYnJhcnkuIFJlcG9ydGVkIGJ5IEJ1Y2sKICAgICAgICAgIEhvZGdlcyAoMTIvMTQvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgVGhlICVuYXRpdmUgZGlyZWN0aXZlIG5vdyBnZW5lcmF0ZXMgVGNsOCBvYmplY3Qtc3R5bGUgY29tbWFuZCBjYWxscy4KICAgICAgICAgIEEgZnVsbCBzb2x1dGlvbiBmb3IgVGNsNyBhbmQgVGNsOCBpcyBzdGlsbCBuZWVkZWQuIFBhdGNoIHN1Z2dlc3RlZAogICAgICAgICAgYnkgTWlrZSBXZWlibGVuICgxMS8yOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgdHlwZW1hcCBjb2RlIHRvIGluY2x1ZGUgdGhlICRuZGltIHZhcmlhYmxlIGZvciBhcnJheXMuCiAgICAgICAgICBQYXRjaCBwcm92aWRlZCBieSBNaWNoZWwgU2FubmVyICgxMS8xMi85OSkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gcmFpc2UgYSBSdW50aW1lIGVycm9yIGlmIGFuIGF0dGVtcHQKICAgICAgICAgIGlzIG1hZGUgdG8gc2V0IGEgcmVhZC1vbmx5IG1lbWJlciBvZiBhIHNoYWRvdyBjbGFzcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICBNaWNoZWwgU2FubmVyICgxMS81Lzk5KS4KCjIvMTAvMDAgOiBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gcmVtb3ZlZC4gSG93ZXZlciwgaXQgaXMgbGlrZWx5CiAgICAgICAgICB0byByZXR1cm4gYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgoKMi8xLzAwICA6IEFkZGVkIGEgbnVtYmVyIG9mIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3NpbmcgYW5kIHR5cGUtY2hlY2tpbmcgY29kZS4gIENvbnRyaWJ1dGVkIGJ5IFZhZGltIENodWd1bm92LgoKICAgICAgICAgIDEuIFJlbW92ZSBfa3dhcmdzIGFyZ3VtZW50IGZyb20gdGhlIHNoYWRvdyB3cmFwcGVycyB3aGVuIC1rZXl3b3JkCiAgICAgICAgICAgICBvcHRpb24gaXMgbm90IHNwZWNpZmllZC4gVGhpcyBzYXZlcyB1cyBhIGNvbnN0cnVjdGlvbiBvZiBrZXl3b3JkCiAgICAgICAgICAgICBkaWN0aW9uYXJ5IG9uIGVhY2ggbWV0aG9kIGNhbGwuCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzLCAqKl9rd2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MsIF9rd2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIDIuIEluY29ycG9yYXRlIHNlbGYgaW50byB0aGUgX2FyZ3MgdHVwbGUuICBUaGlzIHNhdmVzIGF0IGxlYXN0IG9uZSB0dXBsZQogICAgICAgICAgICAgYWxsb2NhdGlvbiBwZXIgbWV0aG9kIGNhbGwuCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIDMuIFJlbW92ZSAqUHRyIGNsYXNzZXMuCiAgICAgICAgICAgICBBc3N1bWUgdGhhdCB3ZSBhcmUgU1dJR2dpbmcgYSBjKysgY2xhc3MgQ3BwQ2xhc3MuCiAgICAgICAgICAgICBDdXJyZW50bHkgU1dJRyB3aWxsIGdlbmVyYXRlIGJvdGggQ3BwQ2xhc3NQdHIgY2xhc3MKICAgICAgICAgICAgIHRoYXQgaG9zdHMgYWxsIG1ldGhvZHMgYW5kIGFsc28gQ3BwQ2xhc3MgdGhhdCBpcyBkZXJpdmVkCiAgICAgICAgICAgICBmcm9tIHRoZSBmb3JtZXIgYW5kIGNvbnRhaW5zIGp1c3QgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAgICAgV2hlbiBDcHBDbGFzcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW50ZXJwcmV0ZXIgd2lsbCB0cnkKICAgICAgICAgICAgIHRvIGZpbmQgaXQgaW4gdGhlIENwcENsYXNzJ3MgZGljdGlvbmFyeSBmaXJzdCwgYW5kIG9ubHkgdGhlbgogICAgICAgICAgICAgY2hlY2sgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAgQ3BwQ2xhc3NQdHIgZnVuY3Rpb25hbGl0eSBtYXkgYmUgZW11bGF0ZWQgd2l0aDoKCiAgICAgICAgICAgICBpbXBvcnQgbmV3CiAgICAgICAgICAgICBfbmV3X2luc3RhbmNlID0gbmV3Lmluc3RhbmNlCiAgICAgICAgICAgICBkZWYgQ3BwQ2xhc3NQdHIodGhpcyk6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfbmV3X2luc3RhbmNlKENwcENsYXNzLCB7InRoaXMiOnRoaXMsInRoaXNvd24iOjB9KQoKICAgICAgICAgICAgIFRoaXMgc2F2ZXMgdXMgb25lIGRpY3Rpb25hcnkgbG9va3VwIHBlciBjYWxsLgoKICAgICAgICAgICAgIDxEQj5UaGUgbmV3IG1vZHVsZSB3YXMgZmlyc3QgYWRkZWQgaW4gUHl0aG9uLTEuNS4yIHNvIGl0CiAgICAgICAgICAgICB3b24ndCB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMuICBJJ3ZlIGltcGxlbWVudGVkIGFuCiAgICAgICAgICAgICBhbHRlcm5hdGl2ZSB0aGF0IGFjaGlldmVzIHRoZSBzYW1lIHRoaW5nPC9EQj4KCiAgICAgICAgICA0LiBVc2UgQ09iamVjdHMgaW5zdGVhZCBvZiBzdHJpbmdzIGZvciBwb2ludGVycy4KCiAgICAgICAgICBEYXZlOiBUaGlzIGVuaGFuY2VtZW50cyByZXN1bHQgaW4gc3BlZWR1cHMgb2YgdXAgdG8gNTAlIGluIHNvbWUKICAgICAgICAgIG9mIHRoZSBwcmVsaW1pbmFyeSB0ZXN0cyBJIHJhbi4KCjIvMS8wMCAgOiBVcGdyYWRlZCB0aGUgUHl0aG9uIG1vZHVsZSB0byB1c2UgYSBuZXcgdHlwZS1jaGVja2luZyBzY2hlbWUgdGhhdAogICAgICAgICAgaXMgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UsIGFuZAogICAgICAgICAgaXMgbGVzcyBlcnJvciBwcm9uZS4gVW5mb3J0dW5hdGVseSwgaXQgd2lsbCBicmVhayBhbGwgY29kZSB0aGF0CiAgICAgICAgICBkZXBlbmRzIG9uIHRoZSBTV0lHX0dldFB0cigpIGZ1bmN0aW9uIGNhbGwgaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGNoYW5nZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoU1dJR19HZXRQdHIoc3RyaW5nLCZwdHIsIl9Gb29fcCIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0NvbnZlcnRQdHIocHlvYmosICZwdHIsIFNXSUdfVFlQRV9Gb29fcCkgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3RlOiBJbiB0aGUgbmV3IGltcGxlbWVudGF0aW9uIFNXSUdfVFlQRV9Gb29fcCBpcyBubyBsb25nZXIKICAgICAgICAgIGEgdHlwZS1zaWduYXR1cmUgc3RyaW5nLCBidXQgcmF0aGVyIGFuIGluZGV4IGludG8gYSB0eXBlCiAgICAgICAgICBlbmNvZGluZyB0YWJsZSB0aGF0IGNvbnRhaW5zIHR5cGUgaW5mb3JtYXRpb24uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMzAvMDAgOiBsb2ljCgkgIENvbmRpdGlvbmFsbHkgY29tcGlsZSBleHBlcmltZW50YWwgY29kZSB3aXRoIC0tZW5hYmxlLWV4cGVyaW1lbnQKCSAgY29uZmlndXJlIGZsYWcuCgkgIEZpeCAuY3ZzaWdub3JlIHRvIGlnbm9yZSBjb25maWd1cmUgJiB5YWNjIGdlbmVyYXRlZCBmaWxlcwoKMS8yOC8wMCA6IGxvaWMKCSAgQXBwbHkgYXV0b21ha2UgZXZlcnl3aGVyZQoJICBLZWVwIGNvbmZpZ3VyZSBzY3JpcHRzIHNvIHRoYXQgcGVvcGxlIGFyZSBub3QgKmZvcmNlZCogdG8gYXV0b2NvbmYKICAgICAgICAgIEtlZXAgc291cmNlcyBnZW5lcmF0ZWQgYnkgeWFjYyBzbyB0aGF0IGNvbXBpbGF0aW9uIHdpdGhvdXQgeWFjYwoJICBpcyBwb3NzaWJsZS4KCSAgU291cmNlL0xQYXJzZS9jc2Nhbm5lci5jOiBjaGFuZ2UgbHlhY2MuaCBpbnRvIHBhcnNlci5oIHRvIHBsZWFzZQoJICBkZWZhdWx0IHlhY2MgZ2VuZXJhdGlvbiBydWxlcy4KCSAgVXNlIEFDX0NPTkZJR19TVUJESVJTIGluIGNvbmZpZ3VyZS5pbiBpbnN0ZWFkIG9mIGhhbmQgbWFkZSBzY3JpcHQuCgkgIFVwZGF0ZSBhbGwgcmVsZXZhbnQgLmN2c2lnbm9yZSB0byBpbmNsdWRlIC5kZXBzCgkgIEZpeGVkIG1pc3NpbmcgOyBsaW5lIDEzNiBTb3VyY2UvU3dpZy9zd2lnLmgKCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIG51bWJlciBvZiBtaW5vciBlbmQtb2YtZmlsZSBwYXJzaW5nIHByb2JsZW1zIGluIHRoZQogICAgICAgICAgcHJlcHJvY2Vzc29yLgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1mcmVlemUgb3B0aW9uIHRoYXQgZm9yY2VzIFNXSUcgdG8gZnJlZXplIHVwb24gZXhpdC4KICAgICAgICAgIFRoaXMgaXMgb25seSB1c2VkIGFzIGEgZGVidWdnaW5nIHRvb2wgc28gdGhhdCBJIGNhbiBtb3JlCiAgICAgICAgICBlYXNpbHkgZXhhbWluZSBTV0lHJ3MgbWVtb3J5IGZvb3RwcmludC4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBwYXRjaCB0byBndWlsZSBtb2R1bGUgZm9yIHN1cHBvcnRpbmcgb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEaWV0ZXIgQmFyb24uCgoxLzEzLzAwIDogbG9pYwoJICBBZGRlZCAuY3ZzaWdub3JlLCBFeGFtcGxlcy8uY3ZzaWdub3JlLCBTb3VyY2UvRE9IL0RvaC8uY3ZzaWdub3JlCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBGaXhlZCAtSSBoYW5kbGluZyBidWcKCSAgU291cmNlL01vZHVsZXMxLjEvamF2YS5jeHg6IGZpeGVkIGNoYXIqIC0+IGNvbnN0IGNoYXIqIHdhcm5pbmdzIHRoYXQgYXJlCgkgIGVycm9ycyB3aGVuIGNvbXBpbGluZyB3aXRoIGdjYy0yLjk1LjIKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IGNhc3QgY29uc3QgY2hhciogdG8gY2hhciogZm9yIFN0cmluZ19yZXBsYWNlCgkgIHRva2VuIGFuZCByZXAgc2hvdWxkIHJlYWxseSBiZSBjb25zdC4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBIYXJjbydzIEphdmEgbW9kdWxlcy4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXZva2VkIHRoZSAlaWZkZWYsICVpZm5kZWYsICVlbmRpZiwgJWlmLCAlZWxpZiwgYW5kICVlbHNlCiAgICAgICAgICBkaXJlY3RpdmVzLiAgVGhlc2UgYXJlIG5vIGxvbmdlciBuZWVkZWQgYXMgU1dJRyBub3cgaGFzIGEgcmVhbAogICAgICAgICAgcHJlcHJvY2Vzc29yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgTW92ZWQgdGhlIGRvY3VtZW50YXRpb24gbW9kdWxlcyBmcm9tIHRoZSBTV0lHIGRpcmVjdG9yeQogICAgICAgICAgdG8gdGhlIE1vZHVsZXMgZGlyZWN0b3J5ICh3aGVyZSB0aGV5IHJlYWxseSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICB0byBiZWdpbiB3aXRoKS4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtc3RhdCBvcHRpb24gZm9yIHByaW50aW5nIHN0YXRpc3RpY3MuIFRoZQogICAgICAgICAgc3RhdGlzdGljcyByZXBvcnRpbmcgd2FzIGluYWRlcXVhdGUgYW5kIG1vc3RseSBicm9rZW4KICAgICAgICAgIGFueXdheS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC10IG9wdGlvbiBmb3IgcmVhZGluZyBhIHR5cGVtYXAgZmlsZS4gIE1vcmUKICAgICAgICAgIHRyb3VibGUgdGhhbiBpdCdzIHdvcnRoLiAgSnVzdCBpbmNsdWRlIHR5cGVtYXBzIGF0IHRoZSB0b3AKICAgICAgICAgIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlICVjaGVja291dCBkaXJlY3RpdmUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtY2kgb3B0aW9uIGZvciBmaWxlIGNoZWNraW4uICAgVG9vIHByb2JsZW1hdGljCiAgICAgICAgICB0byBpbXBsZW1lbnQuICBQcm9iYWJseSBiZXR0ZXIgdG8ganVzdCBwdXQgeW91ciBTV0lHIGxpYnJhcnkKICAgICAgICAgIHVuZGVyIENWUyBpbnN0ZWFkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlbGV0ZWQgdGhlIExBVEVYIG1vZHVsZS4gIFNvcnJ5Li4uIERpZG4ndCBrbm93IGFueW9uZQogICAgICAgICAgd2hvIHdhcyB1c2luZyBpdC4gIEJlc2lkZXMsIEknbSBsb29raW5nIHRvIHNpbXBsaWZ5CiAgICAgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbiBtb2R1bGUgdG8gdXNlIGEgLnR4dAogICAgICAgICAgc3VmZml4IGZvciBpdHMgb3V0cHV0IGZpbGUgaW5zdGVhZCBvZiAuZG9jLgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHRoZSBsb25nLWxvc3QgU1dJRyBwcmVwcm9jZXNzb3IgYmFjayB0byB0aGUgc3lzdGVtLgogICAgICAgICAgSXQgc2hvdWxkIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFJhdyBwcmVwcm9jZXNzZWQgb3V0cHV0CiAgICAgICAgICBjYW4gYmUgdmlld2VkIHVzaW5nIHN3aWcgLUUgZmlsZS5pLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkgYW5kIGRqbWl0Y2hlCiAgICAgICAgICBDb21wbGV0ZWx5IHJlb3JnYW5pemVkIHRoZSBTV0lHIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuICBUaGUKICAgICAgICAgIGJhc2ljIG9yZ2FuaXphdGlvbiBpcyBub3c6CgogICAgICAgICAgICAgICAgU291cmNlLyAgICAgICAgIFNXSUcgc291cmNlIGNvZGUKICAgICAgICAgICAgICAgIExpYi8gICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgKHN3aWdfbGliKQogICAgICAgICAgICAgICAgRG9jLyAgICAgICAgICAgIERvY3VtZW50YXRpb24KICAgICAgICAgICAgICAgIEV4YW1wbGVzLyAgICAgICBFeGFtcGxlcwoKICAgICAgICAgIE1vcmUgZGlyZWN0b3JpZXMgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQuCgoxMi8wOC85OTogTG9pYyBEYWNoYXJ5IChsb2ljQHNlbmdhLm9yZykKCSAgRW5oYW5jZWQgcGFja2FnZSBoYW5kbGluZyBmb3IgcGVybDUgYW5kIGMrKy4KCgkgIFdpdGggbmV3IG9wdGlvbiAtaGlkZSBGb286OkJhciwgZXZlcnkgcGVybDUgb2JqZWN0IChGcm9iKSBpcwoJICBxdWFsaWZpZWQgYnkgRm9vOjpCYXI6OkZyb2IuIFRoZSBwYWNrYWdlIG5hbWUgaXMgc29sZWx5IHVzZWQKCSAgdG8gZW5jYXBzdWxhdGUgQy9DKysgd3JhcHBlcnMgb3V0cHV0IGluIDxtb2R1bGU+X3dyYXAuYyBhbmQgdGhlCgkgIGNvcnJlc3BvbmRpbmcgcGVybCBwYWNrYWdlIGluIDxtb2R1bGU+LnBtLiBOb3RlIHRoYXQgYSBwYWNrYWdlCgkgIG5hbWUgbWF5IGNvbnRhaW4gOjogKEZyb2I6Ok5pdHopIGFuZCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZQoJICBwYWNrYWdlIG5hbWUgcHJvdmlkZWQgYnkgLWhpZGUgKEZvbzo6QmFyOjpGcm9iOjpOaXR6KS4KCgkgIEluICpfd3JhcC5jLCBTV0lHX2luaXQgbWFjcm8gaXMgdXNlZC4gV2FzIHByZXZpb3VzbHkgZGVmaW5lZAoJICBidXQgbm90IHVzZWQgYW5kIHNpbXBsaWZpZXMgY29kZS4KCgkgIEFkZGVkIHR5cGVtYXAocGVybDUscGVybDVpbikgYW5kIHR5cGVtYXAocGVybDUscGVybDVvdXQpIHRoYXQKCSAgZG8gdGhlIGVxdWl2YWxlbnQgb2YgdHlwZW1hcChwZXJsNSxpbikgYW5kIHR5cGVtYXAocGVybDUsb3V0KQoJICBidXQgY29udGFpbiBwZXJsIGNvZGUgYW5kIGFwcGxpZXMgdG8gd3JhcHBlcnMgZ2VuZXJhdGVkIGJ5CgkgIC1zaGFkb3cuCgoJICBMYWNraW5nIHByb3BlciByZWdyZXNzaW9uIHRlc3RzIEkgdXNlZAoJICBFeGFtcGxlcy9wZXJsNS97YysrLGNvbnN0cmFpbnQsZGVmYXJnLGV4Y2VwdCwKCSAgZ3JhcGgvZ3JhcGhbMTIzNF0sbXVsdGluaGVyaXQsbmVzdGVkLHNoYWRvdyxzaW1wbGUsdHJlZSwKCSAgdHlwZW1hcHMve2FyZ3YsYXJndjIsYXJyYXltZW1iZXIsZGF0YWJhc2UsZmlsZSxpZ25vcmUsaW50ZWdlciwKCSAgb3V0cHV0LHBhc3NyZWYscmVmZXJlbmNlLHJldHVybn19Ly4gSSByYW4gc3dpZyB3aXRoIGFuZCB3aXRob3V0CgkgIHRoZSBwYXRjaGVzLCBkaWZmIHRoZSBnZW5lcmF0ZWRzb3VyY2VzLCBydW4gdGhlIC5wbCBmaWxlcwoJICBhbmQgY2hlY2tlZCB0aGF0IHRoZSByZXN1bHRzIGFyZSBpZGVudGljYWwuIEluIGFsbCB0aG9zZSBleGFtcGxlcwoJICBJIGhhZCBubyBlcnJvci4KCjExLzIxLzk5OiBNb2RpZmllZCB0aGUgVGNsIG1vZHVsZSB0byBwcm92aWRlIGZ1bGwgdmFyaWFibGUgbGlua2luZyBjYXBhYmlsaXRpZXMKICAgICAgICAgIHRvIGFsbCBkYXRhdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgcGFpciBvZiBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgIHdlcmUgY3JlYXRlZCBmb3IgZGF0YXR5cGVzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBUY2xfTGlua1ZhcigpIGZ1bmN0aW9uLgogICAgICAgICAgTm93LCB3ZSBzaW1wbHkgdXNlIHZhcmlhYmxlIHRyYWNlcyB0byBzdXBwb3J0IGV2ZXJ5dGhpbmcuIFRoaXMgbWF5CiAgICAgICAgICBicmVhayBzY3JpcHRzIHRoYXQgcmVseSB1cG9uIHRoZSBvbGRlciBiZWhhdmlvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjEvOTk6IEFkZGVkIHNsaWdodCB0d2VhayB0byB3cmFwcGVyIGdlbmVyYXRvciB0byBjb2xsZWN0IGxvY2FsIHZhcmlhYmxlcwogICAgICAgICAgb2Ygc2ltaWxhciB0eXBlLiAgUHJvZHVjZXMgc29tZXdoYXQgbW9yZSBjb21wYWN0IHdyYXBwZXIgY29kZS4KCjExLzIwLzk5OiBNb2RpZmllZCB0aGUgVGNsIG1vZHVsZSB0byB1c2UgU1dJR19HZXRBcmdzKCkgdG8gcGFyc2UKICAgICAgICAgIGFyZ3VtZW50cy4gICAgVGhpcyBpcyBhIHRlY2huaXF1ZSBib3Jyb3dlZCBmcm9tIFB5dGhvbiBpbiB3aGljaAogICAgICAgICAgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdXNpbmcgYSBmb3JtYXQgc3RyaW5nIGNvbnZlbnRpb24gc2ltaWxpYXIKICAgICAgICAgIHRvIGZwcmludGYoKS4gICBUaGlzIHJlc3VsdHMgaW4gYSAqc3Vic3RhbnRpYWwqIHJlZHVjdGlvbiBpbiB0aGUKICAgICAgICAgIHNpemUgb2YgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgd2l0aCBvbmx5IGEgbW9kZXN0IHJ1bnRpbWUgb3ZlcmhlYWQKICAgICAgICAgIGluIGdvaW5nIHRocm91Z2ggdGhlIGV4dHJhIGNvbnZlcnNpb24gZnVuY3Rpb24uCgoxMS8xMy85OTogQ29tcGxldGVseSByZXdyb3RlIHRoZSBjbGFzcy9zdHJ1Y3R1cmUgZ2VuZXJhdGlvbiBjb2RlIGZvciB0aGUKICAgICAgICAgIFRjbCBtb2R1bGUuICBOb3csIGEgc21hbGwgc2V0IG9mIHJ1bnRpbWUgZnVuY3Rpb25zIGFyZSB1c2VkCiAgICAgICAgICB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBjbGFzc2VzIChpbnN0ZWFkIG9mIGEKICAgICAgICAgIG1hc3NpdmUgYW1vdW50IG9mIHJ1bnRpbWUgY29kZSBiZWluZyBnZW5lcmF0ZWQgZm9yIGVhY2ggY2xhc3MpLgogICAgICAgICAgQ2xhc3Mgc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgc2ltcGx5IGVuY29kZWQgaW4gYSBzZXJpZXMgb2YKICAgICAgICAgIHN0YXRpYyB0YWJsZXMuICAgVGhpcyByZXN1bHRzIGluIGEgKkhVR0UqIHJlZHVjdGlvbiBpbiB3cmFwcGVyCiAgICAgICAgICBjb2RlIHNpemUtLWVzcGVjaWFsbHkgZm9yIEMrKy4KCjExLzEzLzk5OiBSZW1vdmVkIHRoZSAtdGNsIChUY2wgNy54KSBtb2R1bGUuICBUY2wgOC4wIGlzIG5vdyBzZXZlcmFsCiAgICAgICAgICB5ZWFycyBvbGQgYW5kIHRoZSBkZWZhY3RvIHN0YW5kYXJkLS1ubyByZWFsIHJlYXNvbiB0byBrZWVwCiAgICAgICAgICBzdXBwb3J0aW5nIHRoZSBvbGQgdmVyc2lvbiBhdCB0aGlzIHBvaW50LgoKMTEvMTMvOTk6IENsZWFuZWQgdXAgLWMgb3B0aW9uIGZvciBQeXRob24gbW9kdWxlLiAgVGhlIHB5ZXhwLnN3ZyBmaWxlCiAgICAgICAgICBpcyBub3cgZ29uZS4KCjExLzEzLzk5OiBGaXhlZCBleHRlcm5hbCBkZWNsYXJhdGlvbnMgdG8gd29yayBiZXR0ZXIgd2l0aCBzdGF0aWMgbGlua2luZwogICAgICAgICAgb24gV2luZG93cy4gIFN0YXRpYyBsaW5raW5nIHNob3VsZCBub3cgYmUgcG9zc2libGUgYnkgZGVmaW5pbmcKICAgICAgICAgIHRoZSAtRFNUQVRJQ19MSU5LIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgUGF0Y2ggY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEFsYmVydG8gRm9uc2VjYS4KCjExLzUvOTkgOiBGaXhlZCBhbiBvYnNjdXJlIGNvZGUgZ2VuZXJhdGlvbiBidWcgcmVsYXRlZCB0byB0aGUgZ2VuZXJhdGlvbgogICAgICAgICAgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICAgQnVnIHJlcG9ydGVkIGJ5IEJyYWQgQ2xlbWVudHMuCgoxMS81Lzk5IDogRml4ZWQgYSBmZXcgbWVtb3J5IHByb2JsZW1zIGZvdW5kIGJ5IHB1cmlmeS4KCjExLzUvOTkgOiBPZmZpY2lhbGx5IGRlcHJlY2F0ZWQgdGhlIC1odGNsLCAtaHRrLCBhbmQgLXBsdWdpbiBvcHRpb25zCiAgICAgICAgICBmcm9tIHRoZSBUY2wgYW5kIFRjbDggbW9kdWxlcy4KCjEwLzI2Lzk5OiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBmcm9tIHB5dGhvbi90eXBlbWFwcy5pLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IEtlaXRoIERhdmlkc29uLgoKOC8xNi85OSA6IEFkZGVkIF9XSU4zMiBzeW1ib2wgdG8gbGlicmFyaWVzIHRvIGJldHRlciBzdXBwb3J0IFdpbmRvd3MuCgo4LzE2Lzk5IDogRGVwcmVjYXRlZCB0aGUgUGVybDQgbW9kdWxlLiAgIEl0IGlzIG5vIGxvbmdlciBpbmNsdWRlZCBpbiB0aGUKICAgICAgICAgIGRpc3RyaWJ1dGlvbiBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIEluIHRoZSBlbnRpcmUgMyB5ZWFycyBTV0lHCiAgICAgICAgICBoYXMgYmVlbiBhcm91bmQgSSBuZXZlciByZWNlaXZlZCBhIHNpbmdsZSBjb21tZW50IGFib3V0IGl0IHNvIEknbQogICAgICAgICAgYXNzdW1pbmcgbm8gb25lIHdpbGwgbWlzcyBpdC4uLgoKOC8xNi85OSA6IE1vZGlmaWVkIHRoZSB0eXBlLWNoZWNraW5nIGNvZGUgdG8gcmVnaXN0ZXIgdHlwZSBtYXBwaW5ncyB1c2luZyBhCiAgICAgICAgICB0YWJsZSBpbnN0ZWFkIG9mIHJlcGVhdGVkIGNhbGxzIHRvIFNXSUdfUmVnaXN0ZXJNYXBwaW5nKCkuICBUaGlzCiAgICAgICAgICByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gc29tZXdoYXQuCgo4LzE1Lzk5IDogQ2xlYW5lZCB1cCB0aGUgcG9pbnRlciB0eXBlLWNoZWNraW5nIGNvZGUgaW4gdGhlIFRjbCBtb2R1bGUuCgo4LzE1Lzk5IDogTWFueSBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJpZXMgdG8gc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcy4KCjgvMTMvOTkgOiBFbGltaW5hdGVkIEMrKyBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0IGV4dGVybiAiQyIgbGlua2FnZS4KCjgvMTMvOTkgOiBTb21lIGNsZWFudXAgb2YgUHl0aG9uIC5zd2cgZmlsZXMgdG8gYmV0dGVyIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgIG9uIFdpbmRvd3MuCgo4LzEzLzk5IDogTW9kaWZpZWQgdGhlICVwcmFnbWEgZGlyZWN0aXZlIHRvIGF0dGFjaCBwcmFnbWFzIGRlY2xhcmVkIGluc2lkZQogICAgICAgICAgYSBjbGFzcyBkZWZpbml0aW9uIHRvIHRoZSBjbGFzcyBpdHNlbGYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAlcHJhZ21hKHB5dGhvbikgYWRkdG9tZXRob2QgPSAiaW5zZXJ0OnByaW50IGBoZWxsbyB3b3JsZCciCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBNb3N0IHBlb3BsZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGhvdyB0aGlzIHdvcmtzLiAgRm9yIHBlb3BsZQogICAgICAgICAgd3JpdGluZyBiYWNrZW5kIG1vZHVsZXMsIGNsYXNzLWJhc2VkIHByYWdtYXMgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIGxhbmctPmNwcF9vcGVuX2NsYXNzKCkgICAgICAgICAgICAgLy8gT3BlbiBhIGNsYXNzCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX3ByYWdtYSgpICAgICAgICAgICAgICAgICAvLyBTdXBwbHkgcHJhZ21hcwogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCBtZW1iZXJzCgogICAgICAgICAgICAgIGxhbmctPmNwcF9jbG9zZV9jbGFzcygpICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNsYXNzCgogICAgICAgICAgQWxsIG9mIHRoZSBwcmFnbWFzIGFyZSBwYXNzZWQgZmlyc3Qgc2luY2UgdGhleSBtaWdodCBiZSB1c2VkIHRvCiAgICAgICAgICBhZmZlY3QgdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBvdGhlciBtZW1iZXJzLiAgIFBsZWFzZSBzZWUKICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlIGZvciBhbiBleGFtcGxlLiAgIFBhdGNoZXMgY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IFJvYmluIER1bm4uCgo4LzEzLzk5IDogUGF0Y2ggdG8gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIGVsaW1pbmF0ZSBpZ25vcmVkCiAgICAgICAgICBleGNlcHRpb24gZXJyb3JzIGluIGRlc3RydWN0b3JzLiAgUGF0Y2ggY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IFJvYmluIER1bm4uCgo4LzExLzk5IDogTWlub3IgcGF0Y2ggdG8gc3dpZ19saWIvcHl0aG9uL3N3aWdwdHIuc3dnICAoYWRkZWQgU1dJR1NUQVRJQwogICAgICAgICAgZGVjbGFyYXRpb24pLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTHlsZSBKb2huc29uLgoKOC8xMS85OSA6IEFkZGVkIEZJUlNUS0VZL05FWFRLRVkgbWV0aG9kcyB0byBQZXJsNSBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKOC8xMS85OSA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSByZXR1cm5lZAogICAgICAgICAgYW5kIHBhc3NlZCBhcyAnTm9uZS4nICBQYXRjaCBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLgoKOC8xMC85OSA6IEZpeGVkIG1pc3NpbmcgJ2ludCcgc3BlY2lmaWVycyBpbiB2YXJpb3VzIHBsYWNlcy4KCjgvMTAvOTkgOiBBZGRlZCBXaW5kb3dzIG1ha2VmaWxlIGZvciBSdW50aW1lIGxpYnJhcmllcy4gIENvbnRyaWJ1dGVkCiAgICAgICAgICBieSBCb2IgVGVjaGVudGluLgoKOC8xMC85OSA6IEZpeGVkIG1pbm9yIHByb2JsZW0gaW4gUHl0aG9uIHJ1bnRpbWUgbWFrZWZpbGUgaW50cm9kdWNlZAogICAgICAgICAgYnkga2V5d29yZCBhcmd1bWVudHMuCgo4LzgvOTkgIDogQ2hhbmdlZCAkdGFyZ2V0IG9mIHBlcmw1KG91dCkgdHlwZW1hcCBmcm9tIFNUKDApIHRvCiAgICAgICAgICBTVChhcmd2aSkuICBQYXRjaCBjb250cmlidXRlZCBieSBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6IEZpeGVkIGJ1ZyBpbiB0eXBlbWFwIGNoZWNraW5nIHJlbGF0ZWQgdG8gdGhlIEFOWSBrZXl3b3JkCiAgICAgICAgICBpbiBhcnJheXMgYW5kIGlnbm9yZWQgYXJndW1lbnRzLiAgRXJyb3IgcmVwb3J0ZWQgYnkKICAgICAgICAgIEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogJWVuYWJsZWRvYyBhbmQgJWRpc2FibGVkb2MgZGlyZWN0aXZlcyBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgIGluc2lkZSBjbGFzcy9zdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAgSG93ZXZlciwgbm8gY2hlY2sKICAgICAgICAgIGlzIG1hZGUgdG8gc2VlIGlmIHRoZXkgYXJlIGJhbGFuY2VkIChpLmUuLCBhICVkaXNhYmxlZG9jCiAgICAgICAgICBkaXJlY3RpdmUgaW5zaWRlIGEgY2xhc3MgZG9lcyBub3QgaGF2ZSB0byBoYXZlIGEgbWF0Y2hpbmcKICAgICAgICAgICVlbmFibGVkb2MgaW4gdGhlIHNhbWUgY2xhc3MpLgoKOC84Lzk5ICA6IEtleXdvcmQgYXJndW1lbnQgaGFuZGxpbmcgaXMgbm93IHN1cHBvcnRlZCBpbiB0aGUgUHl0aG9uCiAgICAgICAgICBtb2R1bGUuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGNoYXIgKmJhciwgaW50IHNwYW0sIGRvdWJsZSB4KTsKCiAgICAgICAgICBDYW4gYmUgY2FsbGVkIGZyb20gUHl0aG9uIGFzCgogICAgICAgICAgICAgICBmb28oeCA9IDMuNCwgYmFyPSJoZWxsbyIsIHNwYW09NDIpCgogICAgICAgICAgVG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgcnVuIFNXSUcgd2l0aCB0aGUgJy1rZXl3b3JkJyBjb21tYW5kCiAgICAgICAgICBsaW5lIG9wdGlvbi4gICAgTWl4aW5nIGtleXdvcmQgYW5kIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICBzaG91bGQgd29yayBhcyB3ZWxsLiAgIFVubmFtZWQgYXJndW1lbnRzIGFyZSBhc3NpZ25lZCBuYW1lcwogICAgICAgICAgc3VjaCBhcyAiYXJnMSIsICJhcmcyIiwgZXRjLi4uCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBGdW5jdGlvbnMgd2l0aCBkdXBsaWNhdGUgYXJndW1lbnQgbmFtZXMgc3VjaCBhcwogICAgICAgICAgYmFyKGludCAqT1VUUFVULCBpbnQgKk9VVFBVVCkgd2lsbCBsaWtlbHkgY2F1c2UgcHJvYmxlbWF0aWMKICAgICAgICAgIHdyYXBwZXIgY29kZSB0byBiZSBnZW5lcmF0ZWQuICAgVG8gZml4IHRoaXMsICB1c2UgZGlmZmVyZW50CiAgICAgICAgICBuYW1lcyBvciB1c2UgJWFwcGx5IHRvIG1hcCB0eXBlbWFwcyB0byBhbHRlcm5hdGUgbmFtZXMuCgo4LzgvOTkgIDogSGFuZGxpbmcgb2YgdGhlICd0aGlzJyBwb2ludGVyIGhhcyBiZWVuIGNoYW5nZWQgaW4gUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFByZXZpb3VzbHksIGRlcmVmZXJlbmNpbmcgb2YgJy50aGlzJyBvY2N1cnJlZCBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBzaGFkb3cgY2xhc3MgaXRzZWxmLiAgIE5vdywgdGhpcyBzdGVwIG9jY3VycyBpbiB0aGUgQwogICAgICAgICAgd3JhcHBlcnMgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgICBTV0lHX0dldFB0ck9iaihQeU9iamVjdCAqLCB2b2lkICoqcHRyLCBjaGFyICp0eXBlKQoKICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgY29udGFpbmluZyBhIHBvaW50ZXIKICAgICAgICAgIG9yIGEgc2hhZG93IGNsYXNzIGluc3RhbmNlIHdpdGggYSAnLnRoaXMnIGF0dHJpYnV0ZSBvZgogICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZS4gIFRoaXMgY2hhbmdlIGFsbG93cyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgIDEuICBUaGUgcmVhbCBzaGFkb3cgY2xhc3MgaW5zdGFuY2UgZm9yIGFuIG9iamVjdCBpcwogICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgQyB3cmFwcGVycyB3aGVyZSBpdCBjYW4gYmUgZXhhbWluZWQvbW9kaWZpZWQKICAgICAgICAgICAgICBieSB0eXBlbWFwcy4KCiAgICAgICAgICAyLiAgSGFuZGxpbmcgb2YgZGVmYXVsdC9rZXl3b3JkIGFyZ3VtZW50cyBpcyBub3cgZ3JlYXRseQogICAgICAgICAgICAgIHNpbXBsaWZpZWQuCgogICAgICAgICAgMy4gIFRoZSBQeXRob24gd3JhcHBlciBjb2RlIGlzIG11Y2ggbW9yZSBzaW1wbGUuCgogICAgICAgICAgUGx1cywgaXQgZWxpbWluYXRlZCBtb3JlIHRoYW4gMzAwIGxpbmVzIG9mIEMrKyBjb2RlIGluIHRoZQogICAgICAgICAgUHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAqKiogQ0FWRUFUIDogVGhpcyByZXF1aXJlcyB0aGUgYWJzdHJhY3Qgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgIEl0IHNob3VsZCB3b3JrIHdpdGggUHl0aG9uIDEuNCwgYnV0IHByb2JhYmx5IG5vdGhpbmcgb2xkZXIKICAgICAgICAgIHRoYW4gdGhhdC4KCgo4LzgvOTkgIDogRml4ZWQgaGFuZGxpbmcgb2YgImNvbnN0IiBhbmQgcG9pbnRlcnMgaW4gY2xhc3Nlcy4gIEluIHBhcnRpY3VsYXIsCiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcwoKICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptc2c7CiAgICAgICAgICAgICBjb25zdCBpbnQgICppcHRyOwogICAgICAgICAgfQoKICAgICAgICAgIGFyZSBoYW5kbGVkIGFzIGFzc2lnbmFibGUgdmFyaWFibGVzIGFzIG9wcG9zZWQgdG8gY29uc3RhbnQKICAgICAgICAgIHZhbHVlcyAodGhpcyBpcyB0aGUgY29ycmVjdCBiZWhhdmlvciBpbiBDL0MrKykuICAgTm90ZToKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzICJjaGFyICpjb25zdCBtc2ciIGFyZSBzdGlsbCB1bnN1cHBvcnRlZC4KICAgICAgICAgIENvbnN0YW50cyBkZWNsYXJlZCBhdCB0aGUgZ2xvYmFsIGxldmVsIHVzaW5nIGNvbnN0IGFyZSBhbHNvCiAgICAgICAgICBicm9rZW4gKGJlY2F1c2UgSSBoYXZlIGEgbnVtYmVyIG9mIGludGVyZmFjZXMgdGhhdCByZWx5IHVwb24KICAgICAgICAgIHRoaXMgYmVoYXZpb3IpLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0CiAgICAgICAgICBtaXN0YWtlbmx5IHRyZWF0ICdjb25zdCBjaGFyIConIHR5cGVzIGFzIGNvbnN0YW50IHZhbHVlcy4KCjgvOC85OSAgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHN1cHBvcnQgYml0LWZpZWxkcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19rZXl3b3JkIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfZXh0ZXJuICA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX3N0YXRpYyAgOiAxOwogICAgICAgICAgfSBmbGFnczsKCiAgICAgICAgICBCaXQtZmllbGRzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gaW50ZWdlciB0eXBlcyBhbmQgdGhlaXIKICAgICAgICAgIGFyZSBvdGhlciByZXN0cmljdGlvbnMuICBTV0lHIHBlcmZvcm1zIG5vIHN1Y2ggdHlwZS1jaGVja2luZwogICAgICAgICAgKGFsdGhvdWdoIHRoZSBDIGNvbXBpbGVyIHdpbGwgY2F0Y2ggcHJvYmxlbXMgd2hlbiBpdCB0cmllcyB0bwogICAgICAgICAgY29tcGlsZSB0aGUgd3JhcHBlciBjb2RlKS4KCjgvOC85OSAgOiBSZW1vdmVkIHRyYWlsaW5nIHNwYWNlIG9mICRiYXNldHlwZSBzdWJzdGl0dXRpb24gaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGlzIGlzIHRvIGFsbG93IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgJXR5cGVtYXAocHl0aG9uLCBhcmdvdXQpIHNwYW0qKiBPVVRQVVR7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgY2hhciogYSA9ICIkYmFzZXR5cGVfcCI7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICB9CgogICAgICAgICAgKFBhdGNoIHN1Z2dlc3RlZCBieSBOYXRoYW4gRHVuZmllbGQpLgoKNi8yMi85OSA6IE1hZGUgYSB2ZXJ5IHNsaWdodCB0d2VhayB0byB0aGUgUGVybDUgc2hhZG93IGNsYXNzCiAgICAgICAgICBjb2RlIHRoYXQgYWxsb3dzIHR5cGVtYXBzIHRvIGFsdGVyIHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgb2Ygb2JqZWN0cyAodG8gc3VwcG9ydCBwb2x5bW9ycGhpYyB0eXBlcykuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgRHJha2UgRGllZHJpY2guCgo0LzgvOTkgIDogRml4ZWQgbnVsbCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsIG1vZHVsZS4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjMvMTcvOTkgOiBGaXhlZCBidWcgaW4gcGVybDVwdHIuc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR3JlZyBBbmRlcnNvbi4KCjIvMjcvOTkgOiBFbGltaW5hdGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIFN3aWcgcnVucyBvbgogICAgICAgICAgZW1wdHkgZmlsZXMuCgoyLzI3Lzk5IDogQWRkZWQgcGF0Y2ggdG8gR3VpbGUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB1bnVzZWQKICAgICAgICAgIHZhcmlhYmxlcy4gICBDb250cmlidXRlZCBieSBNaWtlIFNpbW9ucy4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgcmV0dXJuaW5nIHJlZmVyZW5jZXMuCgoyLzI3Lzk5IDogRml4ZWQgUnVudGltZS9NYWtlZmlsZS4gUGF0Y2ggY29udHJpYnV0ZWQgYnkKICAgICAgICAgIE1pa2UgUm9tYmVyZy4KCjIvMjcvOTkgOiBJbmNvcnBvcmF0ZWQgcGF0Y2hlcyB0byB0aGUgdHlwZS1jaGVja2VyLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAtZXhwb3J0YWxsIHN3aXRjaCBhbmQgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIGluIFBlcmw1IG1vZHVsZS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjIvMjcvOTkgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgdG8gcmVjb2duaXplICd1bmRlZicgYXMgYSBOVUxMIGNoYXIgKi4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgUGVybDUgbW9kdWxlIHRvIHN1cHBvcnQgdGhlIG5ld2VyIHZlcnNpb25zIG9mCiAgICAgICAgICBBY3RpdmVTdGF0ZSBQZXJsIGZvciBXaW4zMi4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgaW5jbHVkZSBvcmRlciBvZiBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgIC1JIG9wdGlvbi4KCjIvNS85OC0gOiBEYXZlIGZpbmlzaGVzIGhpcyBkaXNzZXJ0YXRpb24sIGdvZXMgam9iIGh1bnRpbmcsIG1vdmVzIHRvCjIvNS85OSAgICBDaGljYWdvIGFuZCBnZW5lcmFsbHkgdGhyYXNoZXMgYWJvdXQuCgpWZXJzaW9uIDEuMSBQYXRjaCA1IChGZWJydWFyeSA1LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi80Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoZW4gZGlmZmVyZW50IHBhY2thZ2UKICAgICAgICAgIGxvY2F0aW9ucyBhcmUgc3BlY2lmaWVkICgtLXdpdGgtdGNsaW5jbCwgZXRjLi4uKS4KCjIvMi85OCAgOiBGaXhlZCBuYW1lLWNsYXNoIGJ1ZyByZWxhdGVkIHRvIHRoZSBzd2l0Y2ggdG8gQyBtYWNyb3MgZm9yIGFjY2Vzc29yCiAgICAgICAgICBmdW5jdGlvbnMuICBUaGUgbmV3IHNjaGVtZSBkaWQgbm90IHdvcmsgY29ycmVjdGx5IGZvciBvYmplY3RzCiAgICAgICAgICB3aXRoIG1lbWJlcnMgc3VjaCBhcyAnb2JqJywgJ3ZhbCcsIGV0Yy4uLiAgIEZpeGVkIHRoZSBidWcgYnkKICAgICAgICAgIGFwcGVuZGluZyB0aGUgd29yZCAnc3dpZycgdG8gbWFjcm8gYXJndW1lbnQgbmFtZXMuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgUnVkeSBBbGJhY2h0ZW4uCgoyLzIvOTggIDogU2xpZ2h0IGZpeCB0byB0aGUgUGVybDUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICBhYm91dCAndmFybmFtZSB1c2VkIG9ubHkgb25jZSA6IHBvc3NpYmxlIHR5cG8nLiAgRml4CiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjEvOS85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUGVybCA1IG1vZHVsZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvZgogICAgICAgICAgY29uc3RhbnRzIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjEvOS85OCAgOiBGaXhlZCBsaW5raW5nIGJ1ZyB3aXRoIFB5dGhvbiAxLjUgZW1iZWQuaSBsaWJyYXJ5IGZpbGUuCgpWZXJzaW9uIDEuMSBQYXRjaCA0IChKYW51YXJ5IDQsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEvNC85OCAgOiBDaGFuZ2VkIHN0cnVjdHVyZWQgb2YgdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB0byBiZSBtb3JlIGZyaWVuZGx5CiAgICAgICAgICB0byBCb3JsYW5kIEMrKy4KCjEvNC85OCAgOiBBZGRlZCB0aGUgZnVuY3Rpb24gTWFrZWZpbGUud2luLmJjIGZvciBjb21waWxpbmcgdGhlIGV4YW1wbGVzCiAgICAgICAgICB1bmRlciBCb3JsYW5kIDUuMi4KCjEvNC85OCAgOiBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwZXJsNSBtb2R1bGUgYW5kIEMrKyBjb21waWxhdGlvbi4gIFRoZQogICAgICAgICAgPG1hdGguaD4gbGlicmFyeSBpcyBub3cgaW5jbHVkZWQgYmVmb3JlIGFueSBQZXJsIGhlYWRlcnMKICAgICAgICAgIGJlY2F1c2UgUGVybCB0aGUgZXh0ZXJuICJDIiBsaW5rYWdlIG9mIG1hdGguaCBzY3Jld3MgYWxvdAogICAgICAgICAgb2YgdGhpbmdzIHVwIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MpLgoKMS8yLzk4ICA6IENoYW5nZSB0byB0aGUgUHl0aG9uIG1vZHVsZSB0aGF0IHJlZHVjZXMgdGhlIG51bWJlciBvZiBjb25zdGFudHMKICAgICAgICAgIGNyZWF0ZWQgYnkgQysrIGNsYXNzZXMsIGluaGVyaXRhbmNlLCBhbmQgc2hhZG93IGNsYXNzZXMuICAgVGhpcwogICAgICAgICAgbW9kaWZpY2F0aW9uIG1heSBpbnRyb2R1Y2UgYSBmZXcgc2xpZ2h0IGluY29tcGF0aWJpbGl0aWVzIGlmCiAgICAgICAgICB5b3UgYXR0ZW1wdCB0byB1c2UgdGhlIG5vbi1zaGFkb3cgY2xhc3MgaW50ZXJmYWNlIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzIGVuYWJsZWQuICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjEvMi85OCAgOiBTdXBwb3J0IGZvciBUY2wgOC4wIG5hbWVzcGFjZXMgaGFzIGJlZW4gYWRkZWQuICAgVGhpcyAqcmVwbGFjZXMqCiAgICAgICAgICB0aGUgb3JpZ2luYWwgU1dJRyBtZWNoYW5pc20gdGhhdCBhc3N1bWVkIFtpbmNyIFRjbF0gbmFtZXNwYWNlcy4KICAgICAgICAgIFRvIHVzZSBuYW1lc3BhY2VzLCBzaW1wbHkgcnVuIFNXSUcgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnMKCiAgICAgICAgICAgICBzd2lnIC10Y2wgLW5hbWVzcGFjZSAgZm9vLmkKCiAgICAgICAgICAgICAgICAgICAgVGhpcyBwbGFjZXMgZXZlcnl0aGluZyBpbiBhIG5hbWVzcGFjZSB0aGF0IG1hdGNoZXMKICAgICAgICAgICAgICAgICAgICB0aGUgbW9kdWxlIG5hbWUKCiAgICAgICAgICAgICBzd2lnIC10Y2wgLW5hbWVzcGFjZSAtcHJlZml4IGJhciBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIHRoZSBuYW1lc3BhY2UgJ2JhcicKCiAgICAgICAgICBUaGUgdXNlIG9mIG5hbWVzcGFjZXMgaXMgbmV3IGluIFRjbCA4LjAuICBIb3dldmVyLCB0aGUgd3JhcHBlciBjb2RlCiAgICAgICAgICBnZW5lcmF0ZWQgYnkgU1dJRyB3aWxsIHN0aWxsIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMgb2YgVGNsIG5ld2VyCiAgICAgICAgICB0aGFuIGFuZCBpbmNsdWRpbmcgVGNsIDcuMy9UazMuNiBldmVuIGlmIHRoZSAtbmFtZXNwYWNlIG9wdGlvbiBpcwogICAgICAgICAgdXNlZC4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCByZWxpZWQgb24gdGhlCiAgICAgICAgICAtcHJlZml4IGFuZCAtbmFtZXNwYWNlIG9wdGlvbnMuCgoxLzIvOTggIDogQWRkZWQgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgdG8gdGhlIFRjbCB3cmFwcGVyIGNvZGUKCiAgICAgICAgICAgICAgICAgU1dJR19uYW1lICAgICAgLSBOYW1lIG9mIHRoZSBTV0lHIG1vZHVsZQogICAgICAgICAgICAgICAgIFNXSUdfcHJlZml4ICAgIC0gUHJlZml4L25hbWVzcGFjZSBhcHBlbmRlZCB0byBjb21tYW5kIG5hbWVzCiAgICAgICAgICAgICAgICAgU1dJR19uYW1lc3BhY2UgLSBOYW1lIG9mIHRoZSBuYW1lc3BhY2UKCiAgICAgICAgICBTV0lHIGxpYnJhcnkgd3JpdGVycyBjYW4gdXNlIHRoZXNlIHRvIHRoZWlyIGFkdmFudGFnZXMuCgoxLzIvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIFRjbDggbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBwb2ludGVyIGNvbnN0YW50cyAodGhlIGZ1bmN0aW9uIFNXSUdfTWFrZVB0ciB3YXMgbWlzc2luZyBmcm9tCiAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlKS4KCjEvMi85OCAgOiBBZGRlZCB0aGUgY29uc3RoYXNoLmkgbGlicmFyeSBmaWxlIHRvIHRoZSBUY2wgYW5kIFRjbDggbW9kdWxlcy4KCjEvMS85OCAgOiBDaGFuZ2VkIGFuZCBjbGVhbmVkIHVwIHRoZSBQeXRob24gdHlwZW1hcHMuaSBmaWxlLiAgIFRoZSBmb2xsb3dpbmcKICAgICAgICAgIHNpZ25pZmljYW50IGNoYW5nZXMgd2VyZSBtYWRlIDoKCiAgICAgICAgICAgICAgICAxLiAgVGhlIE9VVFBVVCB0eXBlbWFwIG5vdyByZXR1cm5zIFB5dGhvbiB0dXBsZXMgaW5zdGVhZCBvZgogICAgICAgICAgICAgICAgICAgIGxpc3RzLiAgIExpc3RzIGNhbiBiZSByZXR1cm5lZCBhcyBiZWZvcmUgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgTF9PVVRQVVQgdHlwZS4gICAgSWYgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zCiAgICAgICAgICAgICAgICAgICAgaXMgbmVlZGVkLCBydW4gU1dJRyB3aXRoIHRoZSAtRE9VVFBVVF9MSVNUIG9wdGlvbi4KCiAgICAgICAgICAgICAgICAyLiAgVGhlIEJPVEggdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvIElOT1VULiAgRm9yIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHksIHRoZSAiQk9USCIgbWV0aG9kIHN0aWxsIGV4aXN0cyBob3dldmVyLgoKICAgICAgICAgICAgICAgIDMuICBPdXRwdXQgdHlwZW1hcHMgbm93IGdlbmVyYXRlIGxlc3MgY29kZSB0aGFuIGJlZm9yZS4KCiAgICAgICAgICBDaGFuZ2VzIHRvIHR5cGVtYXBzLmkgbWF5IGJyZWFrIGV4aXN0aW5nIFB5dGhvbiBzY3JpcHRzIHRoYXQgYXNzdW1lCiAgICAgICAgICBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBsaXN0LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8zMS85NzogRml4ZWQgbG9uZyBvdmVyZHVlIHByb2JsZW1zIHdpdGggdGhlIHRlc3Rpbmcgc2NyaXB0cyBhbmQgY2VydGFpbgogICAgICAgICAgbWFrZWZpbGVzIHRoYXQgcmVxdWlyZWQgdGhlIHVzZSBvZiB0aGUgYmFzaCBzaGVsbC4gICBFdmVyeXRoaW5nIHNob3VsZAogICAgICAgICAgd29yayBwcm9wZXJseSB3aXRoIHRoZSBzdGFuZGFyZCBCb3VybmUgc2hlbGwgKHNoKSBub3cuCgoxMi8zMS85NzogTW9kaWZpZWQgdHlwZW1hcHMgdG8gYWxsb3cgJGJhc2V0eXBlIGFzIGEgdmFsaWQgbG9jYWwgdmFyaWFibGUuCiAgICAgICAgICBUaGlzIGFsbG93cyBmb3IgYWxsIHNvcnRzIG9mIGJpemFycmUgaGFja2lzaCB0eXBlbWFwcyB0aGF0CiAgICAgICAgICBkbyBjb29sIHRoaW5ncy4gICBQYXRjaCBjb250cmlidXRlZCBieSBEb21pbmlxdWUgRHVtb250LgoKMTIvMzEvOTc6IFN3aXRjaGVkIGFjY2Vzc29yIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIG1lbWJlciBkYXRhIHRvCiAgICAgICAgICBDIHByZXByb2Nlc3NvciBtYWNyb3MgKGV4Y2VwdCBpbiBjYXNlcyBpbnZvbHZpbmcgdHlwZW1hcHMKICAgICAgICAgIG9yIGNoYXIgKikuCgoxMi8zMS85NzogRml4ZWQgYSBidWcgcmVsYXRlZCB0byBDKysgbWVtYmVyIGRhdGEgaW52b2x2aW5nIHJlZmVyZW5jZXMuCgoxMi8zMS85NzogQ2hhbmdlZCBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIEMrKyBtZW1iZXIgZnVuY3Rpb25zIHRvCiAgICAgICAgICBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgIFRoaXMgY2xlYW5zIHVwIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGFuZCByZXN1bHRzIGluIGZld2VyIGZ1bmN0aW9uIGRlZmluaXRpb25zLgoKMTIvMzEvOTc6IENoYW5nZWQgdGhlIGRlZmF1bHQgQyBjb25zdHJ1Y3RvciB0byB1c2UgY2FsbG9jKCkgaW5zdGVhZAogICAgICAgICAgb2YgbWFsbG9jKCkKCjEyLzMwLzk3OiBDaGFuZ2VkIHRoZSBjcmVhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFBlcmw1IG1vZHVsZS4KICAgICAgICAgIEZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGV5IHNob3VsZCB3b3JrIGluIGV4YWN0bHkgdGhlCiAgICAgICAgICBzYW1lIHdheSBhcyBiZWZvcmUgZXhjZXB0IHRoYXQgdGhleSBub3cgcmVxdWlyZSBtdWNoIGxlc3MKICAgICAgICAgIHdyYXBwZXIgY29kZS4gICBNb2R1bGVzIGNvbnRhaW5pbmcgbGFyZ2UgbnVtYmVycyBvZgogICAgICAgICAgY29uc3RhbnRzIG1heSBzZWUgZ3JlYXRlciB0aGFuIGEgNTAlIHJlZHVjdGlvbiBpbiB3cmFwcGVyCiAgICAgICAgICBjb2RlIHNpemUuCgoxMi8zMC85NzogTW9kaWZpZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gYmUgbW9yZSBpbnRlbGxpZ2VudCBhYm91dCB0aGUKICAgICAgICAgIGNyZWF0aW9uIG9mIGNvbnN0YW50cy4gIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyByZWR1bmRhbnQKICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24KICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSByZWR1Y2VkLiAgIChNYW55IHRoYW5rcyB0byBKaW0gRnVsdG9uKS4KCjEyLzI5Lzk3OiBGaXhlZCBhIGJ1ZyBpbiBDKysgY29kZSBnZW5lcmF0aW9uIHJlbGF0ZWQgdG8gbWVtYmVyIGZ1bmN0aW9ucywKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLCBhbmQgcmVmZXJlbmNlcy4KCjEyLzI5Lzk3OiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBhIGZldyBtYWtlZmlsZXMgdG8gc3VwcG9ydCBQeXRob24gMS41CgoxMi8yOS85NzogQWRkZWQgJ2VtYmVkMTUuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBmaWxlIHNob3VsZCBiZSB1c2VkIHRvCiAgICAgICAgICBzdGF0aWNhbGx5IGxpbmsgdmVyc2lvbnMgb2YgUHl0aG9uIDEuNS4gICAgVG8gbWFrZSBpdCB0aGUgZGVmYXVsdCwKICAgICAgICAgIHNpbXBseSBjb3B5ICdzd2lnX2xpYi9weXRob24vZW1iZWQxNS5pJyB0byAnc3dpZ19saWIvcHl0aG9uL2VtYmVkLmknCgpWZXJzaW9uIDEuMSBQYXRjaCAzIChOb3ZlbWJlciAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2l0aCBzaGFkb3cgY2xhc3NlcyBhbmQKICAgICAgICAgIHN0YXRpYyBjbGFzcyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gY2xhc3MgaW5zdGFuY2VzLgogICAgICAgICAgTm90ZSA6IFRoZSBmaXggZm9yIHRoaXMgYnVnIHJlcXVpcmVzIGEgc2xpZ2h0IHJlc3RydWN0dXJpbmcgb2YKICAgICAgICAgIG9mIHRoZSAucG0gZmlsZXMgY3JlYXRlZCBieSBTV0lHLgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2wvVGNsOCBtb2R1bGVzIHJlbGF0ZWQgdG8gdmFyaWFibGUgbGlua2luZwogICAgICAgICAgb2YgY2hhcmFjdGVyIGFycmF5cy4gIElmIHlvdSBkZWNsYXJlZCBhIGdsb2JhbCB2YXJpYWJsZSAnY2hhciBmb29bMTBdJywKICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIHdvdWxkIGVpdGhlciBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdAogICAgICAgICAgaW1tZWRpYXRlbHkgdXBvbiBsb2FkaW5nIG9yIHdlaXJkIG1lbW9yeSBjb3JydXB0aW9uIGVsc2V3aGVyZS4KICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdyBiZSBmaXhlZCBhbHRob3VnaCBjaGFyYWN0ZXIgYXJyYXlzIGNhbiBvbmx5IGJlCiAgICAgICAgICByZWFkLW9ubHkuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgdGhhdCBjYXVzZWQgaXQgdG8KICAgICAgICAgIGZhaWwgaWYgZmlsZXMgd2VyZSBpbXBvcnRlZCBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4KICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgoKMTEvMjMvOTc6IEZpeGVkIGluY29ycmVjdCBkaWFnbm9zdGljIG1lc3NhZ2UgaW4gdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24KICAgICAgICAgIG1vZHVsZS4KCjExLzIzLzk3OiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgLW8gb3B0aW9uIHdoZW4gdXNlZCB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gSWYgLW8gd2FzIHVzZWQgdG8gc3BlY2lmeSBib3RoIHRoZSBwYXRobmFtZSBhbmQgZmlsZW5hbWUKICAgICAgICAgIG9mIFNXSUcncyBvdXRwdXQgc3VjaCBhcwoKICAgICAgICAgICAgICAgICBzd2lnIC1vIC9ob21lL3N3aWcvd3JhcHBlci5jIC1zaGFkb3cgLXBlcmw1IGZvby5pCgogICAgICAgICAgVGhlIHdyYXBwZXIgY29kZSB3b3VsZCBiZSBwbGFjZWQgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLW8sCiAgICAgICAgICBidXQgdGhlIC5wbSBmaWxlIGFuZCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIHBsYWNlZCBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSBTV0lHIHdhcyBydW4uICAgTm93LCB0aGVzZSBmaWxlcyBhcmUgcGxhY2VkCiAgICAgICAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggdGhlIC1vIG9wdGlvbi4KICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGFsc28gbmVlZGVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIG9uIHRoZQogICAgICAgICAgTWFjaW50b3NoLgoKMTEvMjMvOTc6IEFkZGVkIGEgJ3RoaXMoKScgbWV0aG9kIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIHJldHVybiB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUgZnJvbSBhIHNoYWRvdwogICAgICAgICAgY2xhc3MgdGhhdCBpcyByZXByZXNlbnRlZCBhcyBhIHRpZWQgaGFzaC4gICBUbyB1c2UganVzdAogICAgICAgICAgaW52b2tlIGFzIGEgbWV0aG9kIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICRsID0gbmV3IExpc3Q7ICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICRwdHIgPSAkbC0+dGhpcygpOyAgICMgR2V0IHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZQoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsIDggcG9pbnRlci5pIGxpYnJhcnkgZmlsZSAod2hpY2ggd2FzIGNvbXBsZXRlbHkKICAgICAgICAgIGJyb2tlbiBpbiAxLjFwMikuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIFBlcmw1IHR5cGUtY2hlY2tlciB0byBmaXggYSBmZXcgcHJvYmxlbXMKICAgICAgICAgIHdpdGggZ2xvYmFsIHZhcmlhYmxlcyBvZiBwb2ludGVyIHR5cGVzIGFuZCB0byBhbGxvdwogICAgICAgICAgdGllZCBoYXNoZXMgdG8gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSB3aXRoIG5vcm1hbAogICAgICAgICAgcG9pbnRlciB2YWx1ZXMuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWVjaGFuaXNtIHRvIGFsbG93IG91dHB1dAogICAgICAgICAgdHlwZW1hcHMgb2YgdHlwZSAndm9pZCcuICAgVGhlc2Ugd2VyZSBpZ25vcmVkIHByZXZpb3VzbHksCiAgICAgICAgICBidXQgbm93IGlmIHlvdSBzcGVjaWZ5LAoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGxhbmcsb3V0KSB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2b2lkIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFlvdSBjYW4gY2hhbmdlIG9yIGFzc2lnbiBhIHJldHVybiB2YWx1ZSB0byB0aGUgZnVuY3Rpb24uCgoxMS8yMy85NzogRml4ZWQgcHJvY2Vzc2luZyBvZiAnYm9vbCcgZGF0YXR5cGVzIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMTEvMjMvOTc6IEZpeGVkIG1pbm9yIHBhcnNpbmcgZXJyb3Igd2l0aCBDKysgaW5pdGlhbGl6ZXJzLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgQigpIDogQSgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2w4IG1vZHVsZSBzbyB0aGF0IEMgZnVuY3Rpb25zIHRoYXQgY2FsbCBiYWNrIGludG8KICAgICAgICAgIFRjbCBkb24ndCBjb3JydXB0IHRoZSByZXR1cm4gcmVzdWx0IG9iamVjdCAoU1dJRyB3YXMgZ2F0aGVyaW5nCiAgICAgICAgICB0aGUgcmVzdWx0IG9iamVjdCB0b28gZWFybHkgd2hpY2ggbGVhZHMgdG8gcHJvYmxlbXMgaWYgc3Vic2VxdWVudAogICAgICAgICAgVGNsIGNhbGxzIGFyZSBtYWRlKS4KCjExLzIzLzk3OiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gdGhlIFB5dGhvbiBtb2R1bGUgd2hlbiB0d28gb3IKICAgICAgICAgIG1vcmUgb3V0cHV0IHBhcmFtZXRlcnMgd2VyZSB1c2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudHMgb2YgYQogICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVpbmNsdWRlIHR5cGVtYXBzLmkKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKk9VVFBVVCwgZG91YmxlICpPVVRQVVQsIGRvdWJsZSBhKTsKCiAgICAgICAgICBQcmV2aW91c2x5LCBkb2luZyB0aGlzIHJlc3VsdGVkIGluIHRoZSBjcmVhdGlvbiBvZiBhbgogICAgICAgICAgZXh0cmFuZW91cyBjb21tYSBpbiB0aGUgb3V0cHV0LCByZXN1bHRpbmcgaW4gYSBDIHN5bnRheCBlcnJvci4KCjExLzIyLzk3OiBGaXhlZCBhIGJ1ZyB3aGVuIHRlbXBsYXRlIGhhbmRsaW5nIHRoYXQgd2FzIHN0cmlwcGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICBhcm91bmQgbmVzdGVkIHRlbXBsYXRlcy4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIEZvbzxCYXI8ZG91YmxlPiA+CgogICAgICAgICAgd2FzIGdldHRpbmcgbXVuZ2VkIGludG8gRm9vPEJhcj4+IHdoaWNoIGlzIGEgc3ludGF4IGVycm9yIGluCiAgICAgICAgICBpbiB0aGUgQysrIGNvbXBpbGVyLgoKMTEvMjIvOTc6IEZpeGVkIGJ1Z3MgaW4gdGhlIEJvcmxhbmQgQysrIG1ha2VmaWxlcy4KCjExLzIyLzk3OiBGaXhlZCBtZW1vcnkgY29ycnVwdGlvbiBidWcgd2hlbiBwcm9jZXNzaW5nIGludGVnZXIKICAgICAgICAgIGFyZ3VtZW50cyBpbiBUY2w4IG1vZHVsZS4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUnVudGltZS9NYWtlZmlsZSByZWxhdGVkIHRvIFRjbCA4LgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE5vIGxvbmdlciBnZW5lcmF0ZXMgYSBwZXJsIHN5bnRheCBlcnJvci4KCjExLzkvOTcgOiBDaGFuZ2VkIGEgc3RybmNweSgpIHRvIHN0cmNweSgpIGluIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tlci4KICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluCiAgICAgICAgICB0eXBlLWNoZWNraW5nLgoKMTAvMjkvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBjb2RlIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMgYW5kCiAgICAgICAgICB1c2VyLWRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKFZlY3RvciBhLCBWZWN0b3IgYiA9IGQpOwoKICAgICAgICAgIHNob3VsZCBub3cgd29yayBwcm9wZXJseS4KClZlcnNpb24gMS4xIFBhdGNoIDIgKFNlcHRlbWJlciA0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvNC85NyAgOiBGaXhlZCBwcm9ibGVtIHdpdGggaGFuZGxpbmcgb2YgdmlydHVhbCBmdW5jdGlvbnMgdGhhdAogICAgICAgICAgd2FzIGludHJvZHVjZWQgYnkgc29tZSBjaGFuZ2VzIGluIHRoZSBDKysgbW9kdWxlLgoKVmVyc2lvbiAxLjEgUGF0Y2ggMSAoQXVndXN0IDI3LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo4LzI2Lzk3IDogRml4ZWQgY29tcGlsYXRpb24gYW5kIHJ1bi10aW1lIGJ1Z3Mgd2l0aCBUY2wgOC4wIGZpbmFsLgoKOC8yMS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2l0aCBhcnJheXMgYXBwZWFyaW5nIGFzIGFyZ3VtZW50cwogICAgICAgICAgdG8gQysrIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgQmFyKGludCBhWzIwXVsyMF0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB1c2luZyBhcnJheXMgd2l0aCBhZGRlZCBtZXRob2RzCiAgICAgICAgICBob3dldmVyLgoKOC8yMC85NyA6IEZpeGVkIGEgYnVnIHdpdGggZ2VuZXJhdGluZyB0aGUgY29kZSBmb3IgYWRkZWQgbWV0aG9kcwogICAgICAgICAgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo4LzE5Lzk3IDogTW9kaWZpZWQgdGhlIHR5cGVtYXBwZXIgdG8gc3Vic3RpdHV0ZSB0aGUgJyRhcmcnIHZhbHVlCiAgICAgICAgICB3aGVuIGRlY2xhcmluZyBsb2NhbCB2YXJpYWJsZXMuICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqIChkb3VibGUgdGVtcF8kYXJnKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIGRvIHNvbWV0aGluZyAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV2hlbiBhcHBsaWVkIHRvIGEgcmVhbCBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKmEsIGRvdWJsZSAqYiwgZG91YmxlICpyZXN1bHQpOwoKICAgICAgICAgIHRocmVlIGxvY2FsIHZhcmlhYmxlcyB3aWxsIGJlIGNyZWF0ZWQgYXMgZm9sbG93cyA6CgogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX2E7CiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYjsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9yZXN1bHQ7CgogICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB3aGVuIHdyaXRpbmcgbXVsdGlwbGUgdHlwZW1hcHMgdGhhdCBuZWVkCiAgICAgICAgICB0byBhY2Nlc3MgdGhlIHNhbWUgbG9jYWwgdmFyaWFibGVzLgoKCjcvMjcvOTcgOiBGaXhlZCBhIHZhcmlldHkgb2YgcHJvYmxlbXMgd2l0aCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBhbmQgYXJyYXlzLgogICAgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdyB3b3JrIDoKCiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgW0FOWV0geyBSZWFsIFtBTlldIH07CiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgWzRdIHsgZG91YmxlIFsxMF0gfTsKCiAgICAgICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiBhcHBseSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSB7IFJlYWwgfTsKCiAgICAgICAgICBzaG91bGQgbm93IHdvcmstLWV2ZW4gaWYgYXJyYXlzIGludm9sdmluZyBkb3VibGVzIGFuZCBSZWFscyBhcmUKICAgICAgICAgIHVzZWQgbGF0ZXIuCgo3LzI3Lzk3IDogQ2hhbmdlZCB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgIkFycmF5IFggaGFzIGJlZW4gY29udmVydGVkIHRvIFkiIHRvCiAgICAgICAgICBvbmx5IGFwcGVhciBpZiBydW5uaW5nIFNXSUcgaW4gdmVyYm9zZSBtb2RlLgoKNy8yNy85NyA6IEFkZGVkIHRoZSB2YXJpYWJsZXMgJHBhcm1uYW1lIGFuZCAkYmFzZW1hbmdsZSB0byB0aGUgdHlwZW1hcAogICAgICAgICAgZ2VuZXJhdG9yLiAgICAkcGFybW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB1c2VkCiAgICAgICAgICB3aGVuIHRoZSB0eXBlbWFwIHdhcyBtYXRjaGVkLiAgSXQgbWF5IGJlICIiIGlmIG5vIHBhcmFtZXRlcgogICAgICAgICAgd2FzIHVzZWQuICAgJGJhc2VtYW5nbGUgaXMgYSBtYW5nbGVkIHZlcnNpb24gb2YgdGhlIGJhc2UKICAgICAgICAgIGRhdGF0eXBlLiAgICBTb21ldGltZXMgdXNlZCBmb3IgYXJyYXkgaGFuZGxpbmcuCgo3LzI3Lzk3IDogQ2hhbmdlZCB0aGUgYmVoYXZpb3Igb2Ygb3V0cHV0IGFyZ3VtZW50cyB3aXRoIFB5dGhvbiBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE9yaWdpbmFsbHksIGlmIGEgZnVuY3Rpb24gcmV0dXJuZWQgYW4gb2JqZWN0ICdGb28nLCB0aGUgc2hhZG93IGNsYXNzCiAgICAgICAgICBtZWNoYW5pc20gd291bGQgY3JlYXRlIGNvZGUgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICBkZWYgcmV0dXJuX2ZvbygpOgogICAgICAgICAgICAgICAgICAgICAgdmFsID0gRm9vUHRyKHNoYWRvd2MucmV0dXJuX2ZvbygpKQogICAgICAgICAgICAgICAgICAgICAgdmFsLnRoaXMgPSAxCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdHlwZW1hcHMgYWxsb3cgYSB1c2VyIHRvIHJlZGVmaW5lCiAgICAgICAgICB0aGUgb3V0cHV0IGJlaGF2aW9yIG9mIGEgZnVuY3Rpb24tLWFzIGEgcmVzdWx0LCB3ZSBjYW4gbm8gbG9uZ2VyCiAgICAgICAgICBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcmV0dXJuIHR5cGUgYmVpbmcgYSBwb2ludGVyIG9yCiAgICAgICAgICBldmVuIGJlaW5nIGEgc2luZ2xlIHZhbHVlIGZvciB0aGF0IG1hdHRlciAoaXQgY291bGQgYmUgYSBsaXN0LAogICAgICAgICAgdHVwbGUsIGV0Yy4uLikuICAgSWYgU1dJRyBkZXRlY3RzIHRoZSB1c2Ugb2Ygb3V0cHV0IHR5cGVtYXBzCiAgICAgICAgICAoZWl0aGVyICJvdXQiIG9yICJhcmdvdXQiKSBpdCByZXR1cm5zIHRoZSByZXN1bHQgdW5tb2RpZmllZCBsaWtlCiAgICAgICAgICB0aGlzIDoKCiAgICAgICAgICAgICAgICBkZWYgcmV0dXJuX2ZvbygpOgogICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2hhZG93Yy5yZXR1cm5fZm9vKCkKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbwogICAgICAgICAgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIChpbmNsdWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIGNvbnZlcnRpbmcgaXQKICAgICAgICAgIGludG8gYSBQeXRob24gY2xhc3MpLgoKNy8yNi85NyA6IEZpeGVkIGEgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZXMgbGlrZSAndW5zaWduZWQgbG9uZyBpbnQnLAogICAgICAgICAgJ3Vuc2lnbmVkIHNob3J0IGludCcsIGV0Yy4uLgoKNy8yNC85NyA6IE1pbm9yIGJ1ZyBmaXggdG8gVGNsIDggbW9kdWxlIHRvIHBhcnNlIGVudW1zIHByb3Blcmx5LiAgQWxzbwogICAgICAgICAgZml4ZWQgYSBtZW1vcnkgY29ycnVwdGlvbiBwcm9ibGVtIGluIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAocGF0Y2ggY29udHJpYnV0ZWQgYnkgSGVucnkgUm93bGV5LgoKNy8yNC85NyA6IEFkZGVkIFB5dGhvbi10dXBsZSB0eXBlbWFwcyBjb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKNy8yNC85NyA6IEluY29ycG9yYXRlZCBzb21lIGNoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUgaW4gc3VwcG9ydCBvZgogICAgICAgICAgTWFyayBIYW1tb25kJ3MgQ09NIHN1cHBvcnQuICBJJ20gbm90IGVudGlyZWx5IHN1cmUgdGhleQogICAgICAgICAgd29yayB5ZXQgaG93ZXZlci4gIE5lZWRzIGRvY3VtZW50YXRpb24gYW5kIHRlc3RpbmcuCgo3LzI0Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2hlbiBzdHJ1Y3R1cmVzIGhhZCBhcnJheSBtZW1iZXJzCiAgICAgICAgICBhbmQgdHlwZW1hcHMgd2VyZSB1c2VkLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChtZW1iZXJpbikgZG91YmxlIFsyMF1bMjBdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYSBkb3VibGUgWzIwXVsyMF0gLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICBkb3VibGUgYVsyMF1bMjBdOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBPcmlnaW5hbGx5LCB0aGlzIHdvdWxkIGdlbmVyYXRlIGEgY29tcGlsZXItdHlwZSBlcnJvciB3aGVuCiAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdhcyBjb21waWxlZC4gICBOb3csIGEgaGVscGVyIGZ1bmN0aW9uIGxpa2UKICAgICAgICAgIHRoaXMgaXMgZ2VuZXJhdGVkIDoKCiAgICAgICAgICAgICAgICBkb3VibGUgKkZvb19hX3NldChGb28gKmEsIGRvdWJsZSB2YWxbMjBdWzIwXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uIG1lbWJlcmluIHR5cGVtYXAgaGVyZSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlICopIHZhbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIHdyaXRpbmcgdHlwZW1hcHMsIG9uZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHNvdXJjZSB2YXJpYWJsZQogICAgICAgICAgaXMgYW4gYXJyYXkgb2YgdGhlICpzYW1lKiB0eXBlIGFzIHRoZSBzdHJ1Y3R1cmUgbWVtYmVyLiBUaGlzCiAgICAgICAgICBtYXkgYnJlYWsgc29tZSBjb2RlcyB0aGF0IG1hbmFnZWQgdG8gd29yayBhcm91bmQgdGhlIGFycmF5IGJ1Zy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbiB1c2luZyBDIGdsb2JhbCB2YXJpYWJsZXMgdGhhdAogICAgICAgICAgYXJlIHBvaW50ZXJzLiAgV2hlbiB1c2VkIGluIGZ1bmN0aW9uIGNhbGxzIGFuZCBvdGhlciBvcGVyYXRpb25zLAogICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIHdvdWxkIGJlIGludmFsaWQtLS1jYXVzaW5nIGNvcmUKICAgICAgICAgIGR1bXBzIGFuZCBvdGhlciBwcm9ibGVtcy4gIFNXSUcgaW1wbGVtZW50cyBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICB1c2luZyBQZXJsIG1hZ2ljIHZhcmlhYmxlcy4gIEFzIGl0IHR1cm5zIG91dCwgdGhlIGVycm9yCiAgICAgICAgICB3YXMgY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHBvaW50ZXItZXh0cmFjdGlvbiBjb2RlCiAgICAgICAgICB3YXMgc29tZWhvdyBieXBhc3NpbmcgdGhlIHByb2NlZHVyZSB1c2VkIHRvIHJlc29sdmUgbWFnaWNhbAogICAgICAgICAgdmFyaWFibGVzIChoZW5jZSwgbGVhdmluZyB0aGUgdmFsdWUgdW5kZWZpbmVkKS4gIFRvIGZpeAogICAgICAgICAgdGhlIHByb2JsZW0sIFNXSUcgbm93IGV4cGxpY2l0bHkgcmVzb2x2ZXMgbWFnaWMgYmVmb3JlCiAgICAgICAgICBleHRyYWN0aW5nIHBvaW50ZXIgdmFsdWVzLgoKNy8xMi85NyA6IEVsaW1pbmF0ZWQgdGhlIGxhc3QgcmVtbmFudHMgb2YgZnJlZSgpIGFuZCBtYWxsb2MoKSBmcm9tCiAgICAgICAgICB0aGUgU1dJRyBjb21waWxlci4KCjcvMTIvOTcgOiBGaXhlZCBwYXJzaW5nIHByb2JsZW1zIHdpdGggdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cyBhbmQKICAgICAgICAgIHRlbXBvcmFyeSB2YXJpYWJsZXMgb2YgYXJyYXlzLiAgICBBbHNvIG1hZGUgaXQgcG9zc2libGUgZm9yCiAgICAgICAgICBTV0lHIHRvIGhhbmRsZSB0eXBlbWFwcyBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldIChkb3VibGUgdGVtcFskZGltMF0pIHsKCQkgICAgICAuLi4gc3RvcmUgZGF0YSBpbiB0ZW1wWyRkaW0wXSAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgTm90IG9ubHkgZG9lcyB0aGlzIHR5cGVtYXAgbWF0Y2ggYW55IGRvdWJsZSBbXSBhcnJheSwgaXQKICAgICAgICAgIGNyZWF0ZXMgYSBsb2NhbCB2YXJpYWJsZSB3aXRoIHByZWNpc2VseSB0aGUgcmlnaHQgZGltZW5zaW9ucy4KICAgICAgICAgIChpZS4gJGRpbTAgZ2V0cyBmaWxsZWQgaW4gd2l0aCB0aGUgcmVhbCBudW1iZXIgb2YgZGltZW5zaW9ucykuCiAgICAgICAgICBPZiBjb3Vyc2UsIG9mZiB0aGUgcmVjb3JkLCB0aGlzIHdpbGwgYmUgYSB3YXkgdG8gYWRkIG1vcmUKICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHR5cGVtYXBzLmkgbGlicmFyaWVzLgoKNy85Lzk3ICA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBQZXJsNSwgc3RhdGljIGxpbmtpbmcsIGFuZCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBXaGVuIHN0YXRpY2FsbHkgbGlua2luZyBtdWx0aXBsZSBtb2R1bGVzIHRvZ2V0aGVyLCB3cml0ZQogICAgICAgICAgYSB0b3AtbGV2ZWwgaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIHdoZW4gc2hhZG93IGNsYXNzZXMgYXJlIG5vdAogICAgICAgICAgdXNlZCA6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgc3dpZywgZm9vLCBiYXIsIGdsb2I7CiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgcGVybG1haW4uaQoKICAgICAgICAgIFdoZW4gc2hhZG93IGNsYXNzZXMgYXJlIHVzZWQsIHRoZSBtb2R1bGUgbmFtZXMgaGF2ZSBhbiBleHRyYSAnYycKICAgICAgICAgIGFwcGVuZGVkIHNvIGl0IHNob3VsZCByZWFkIGFzIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb29jLCBiYXJjLCBnbG9iYzsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMsIGNvbnNpZGVyIHVzaW5nIHRoZSBTV0lHIHJ1bnRpbWUKICAgICAgICAgIGxpYnJhcnkuCgo3LzgvOTcgIDogSW5jb3Jwb3JhdGVkIGZpeGVkIHZlcnNpb25zIG9mIHRoZSBCb3JsYW5kIEMrKyBNYWtlZmlsZXMuCgo3LzgvOTcgIDogRmlyc3QgY3V0IGF0IHRyeWluZyB0byBlbGltaW5hdGUgZXhjZXNzaXZlIGNvbXBpbGVyIHdhcm5pbmdzLgogICAgICAgICAgQXMgaXQgdHVybnMgb3V0LCBhbG90IG9mIHdhcm5pbmdzIGdvIGF3YXkgaWYgeW91IGp1c3QgbWFrZQogICAgICAgICAgZGVjbGFyYXRpb25zIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICAgY2xpZW50RGF0YSA9IGNsaWVudERhdGE7CgogICAgICAgICAgaW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUuICBNb3N0IGNvbXBpbGVycyBzaG91bGQganVzdAogICAgICAgICAgaWdub3JlIHRoaXMgY29kZSAoYXQgbGVhc3Qgd291bGQgY2FuIGhvcGUpLgoKNy84Lzk3ICA6IEZpeGVkIGJpemFycmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIHR5cGVtYXBzIGFuZCBDKysgY2xhc3Nlcy4KICAgICAgICAgIEluIHNvbWUgY2FzZXMsIHR5cGVtYXBzIGNvbnRhaW5pbmcgcHJpbnRmIGZvcm1hdHRpbmcgc3RyaW5ncyBzdWNoIGFzCgogICAgICAgICAgICAgICAgICAldHlwZW1hcChtZW1iZXJvdXQpIGludCAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLDQyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGdlbmVyYXRlIGNvbXBsZXRlbHkgYm9ndXMgY29kZSB3aXRoIGdhcmJhZ2UgcmVwbGFjaW5nCiAgICAgICAgICB0aGUgJyVkJy4gICBDYXVzZWQgYnkgb25lIGZhdWx0eSB1c2Ugb2YgcHJpbnRmICh3YXNuJ3QgYWJsZSB0byBmaW5kCiAgICAgICAgICBhbnkgb3RoZXIgb2NjdXJyZW5jZXMpLgoKNy83Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gc2hhZG93IGNsYXNzIGdlbmVyYXRpb24gd2l0aCBub24tbWVtYmVyCiAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBhcmUgcmV0dXJuaW5nIG1vcmUgdGhhbiBvbmUgdmFsdWUuCgo3LzcvOTcgIDogSW5jb3Jwb3JhdGVkIG1vZGlmaWNhdGlvbnMgdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCBHdWlsZSAxLjIuCiAgICAgICAgICBTdGlsbCBuZWVkIHRvIHRlc3QgaXQgb3V0LCBidXQgaXQgaXMgcnVtb3JlZCB0byB3b3JrLgoKNy8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyByZWxhdGVkIHRvIG91dHB1dCBhcmd1bWVudHMgYW5kIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICAgIElmIGFuIG91dHB1dCBhcmd1bWVudCBpcyBkZXRlY3RlZCwgU1dJRyBhc3N1bWVzCiAgICAgICAgICB0aGF0IHRoZSByZXN1bHQgaXMgYSBsaXN0IGFuZCBoYW5kbGVzIGl0IGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICBJZiB0aGUgbm9ybWFsIHJldHVybiB0eXBlIG9mIGFuIGZ1bmN0aW9uIGlzIGFuIG9iamVjdCwKICAgICAgICAgIGl0IHdpbGwgYmUgY29udmVydGVkIGludG8gYSBzaGFkb3cgY2xhc3MgYXMgYmVmb3JlLCBidXQKICAgICAgICAgIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhCiAgICAgICAgICBsaXN0LiAgKioqIE5PVEUgOiBUaGlzIGJlaGF2aW9yIGhhcyBiZWVuIHN1YnNlcXVlbnRseSBjaGFuZ2VkICoqKgoKNi8yOS85NyA6IENoYW5nZWQgRVhQT1JUIHRvIFNXSUdFWFBPUlQgaW4gYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgU2hvdWxkIHByb3ZpZGUgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLgoKNi8yOS85NyA6IE1vZGlmaWVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyBzbyB0aGF0IG91dHB1dCBhcmd1bWVudHMKICAgICAgICAgIHdvcmsgY29ycmVjdGx5ICh3aGVuIHR5cGVtYXBzIGFyZSB1c2VkKS4KClZlcnNpb24gMS4xIChKdW5lIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjYvMjQvOTcgOiBGaXhlZCBPYmplY3RpdmUtQyBjb25zdHJ1Y3RvciBidWcgd2hlbiB3b3JraW5nIHdpdGggUGVybDUKICAgICAgICAgIHNoYWRvdyBjbGFzc2VzLgoKNi8yMy85NyA6IEZpeGVkIHNvbWUgcGFyc2luZyBwcm9ibGVtcyB3aXRoIE9iamVjdGl2ZS1DLiAgRGVjbGFyYXRpb25zCiAgICAgICAgICBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgbm93IDoKCiAgICAgICAgICAgICAgIC0gZm9vIDogKGludCkgYSB3aXRoOiAoaW50KSBiOwoKNi8yMi85NyA6IEFkZGVkIFNXSUcgUnVudGltZSBsaWJyYXJ5LiAgIFRoaXMgbGlicmFyeSBjb250YWlucwogICAgICAgICAgdGhlIFNXSUcgcG9pbnRlciB0eXBlLWNoZWNrZXIgYW5kIHN1cHBvcnQgZnVuY3Rpb25zCiAgICAgICAgICB0aGF0IGFyZSBub3JtYWxseSBpbmNsdWRlZCBpbiBldmVyeSBtb2R1bGUuICBCeSB1c2luZwogICAgICAgICAgdGhlIGxpYnJhcnksIGl0IGlzIGVhc2llciB0byB3b3JrIHdpdGggbXVsdGlwbGUgU1dJRwogICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgbWlub3IgYnVnIGluIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvZiBtdWx0aXBsZSBtb2R1bGVzLgoKNi8yMi85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gV2hlbiB1c2VkIHdpdGgKICAgICAgICAgIFBlcmw1IHNoYWRvdyBjbGFzc2VzLCB0aGlzIGdlbmVyYXRlcyBhICdyZXF1aXJlJyBzdGF0ZW1lbnQKICAgICAgICAgIHRvIGxvYWQgaW4gZXh0ZXJuYWwgbW9kdWxlcy4KCjYvMjIvOTcgOiBBZGRlZCAtc3dpZ2xpYiBvcHRpb24uICBUaGlzIHByaW50cyBvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZQogICAgICAgICAgU1dJRyBsaWJyYXJ5IGFuZCBleGl0cy4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgcmVhbGx5IHVzZWZ1bCB0bwogICAgICAgICAgY29uZmlndXJhdGlvbiB0b29scyB0aGF0IGFyZSBsb29raW5nIGZvciBTV0lHIGFuZCBpdHMgbGlicmFyeQogICAgICAgICAgbG9jYXRpb24gKGUuZy4gYXV0b2NvbmYsIGNvbmZpZ3VyZSwgZXRjLi4uKS4KCjYvMjEvOTcgOiBGaXhlZCBleHBvcnQgYnVnIHdpdGggUGVybDUuMDA0IG9uIFdpbmRvd3MtTlQuCgo2LzIwLzk3IDogTWlub3IgY2hhbmdlIHRvIGNvZGUgZ2VuZXJhdGlvbiBvZiBjbGFzcy9zdHJ1Y3R1cmUgbWVtYmVycyBpbgogICAgICAgICAgb3JkZXIgdG8gd29yayBiZXR0ZXIgd2l0aCB0eXBlbWFwcy4gU2hvdWxkIGhhdmUgbm8gbm90aWNhYmxlCiAgICAgICAgICBpbXBhY3Qgb24gZXhpc3RpbmcgU1dJRyBtb2R1bGVzLgoKNi8xOS85NyA6IEFkZGVkIC10IG9wdGlvbi4gVGhpcyBhbGxvd3MgU1dJRyB0byBsb2FkIGEgdHlwZW1hcCBmaWxlIGJlZm9yZQogICAgICAgICAgcHJvY2Vzc2luZyBhbnkgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICBzd2lnIC10IHR5cGVtYXBzLmkgLXB5dGhvbiBleGFtcGxlLmkKCiAgICAgICAgICBBdCBtb3N0LCBvbmx5IG9uZSB0eXBlbWFwIGZpbGUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIG1hbm5lci4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTgvOTcgOiBOZWVkIGEgTWFrZWZpbGUgZmFzdD8gVHlwZQoKICAgICAgICAgICAgICAgICBzd2lnIFstdGNsLCAtcGVybDUsIC1weXRob25dIC1jbyBNYWtlZmlsZQoKICAgICAgICAgIGFuZCB5b3Ugd2lsbCBnZXQgYSBNYWtlZmlsZSBzcGVjaWZpYyB0byB0aGF0IHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgIFlvdSBqdXN0IG5lZWQgdG8gbW9kaWZ5IGl0IGZvciB5b3VyIGFwcGxpY2F0aW9uIGFuZCB5b3UncmUKICAgICAgICAgIHJlYWR5IHRvIHJ1bi4KCjYvMTgvOTcgOiBDb21wbGV0ZWQgdGhlIC1jaSBvcHRpb24uICBUaGlzIG9wdGlvbiBjaGVja3MgYSBmaWxlIGludG8gdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkuICAgSXQgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhCiAgICAgICAgICBsYW5ndWFnZSBvcHRpb24uIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRjbCAtY2kgZm9vYmFyLmkKCiAgICAgICAgICBDaGVja3MgdGhlIGZpbGUgZm9vYmFyLmkgaW50byB0aGUgVGNsIHBhcnQgb2YgdGhlIGxpYnJhcnkuCiAgICAgICAgICBJbiBvcmRlciB0byBjaGVjayBhIGZpbGUgaW50byB0aGUgZ2VuZXJhbCBsaWJyYXJ5IChhY2Nlc3NpYmxlCiAgICAgICAgICB0byBhbGwgbGFuZ3VhZ2VzIG1vZHVsZXMpLCBkbyB0aGUgZm9sbG93aW5nCgogICAgICAgICAgICAgICAgICBzd2lnIC1jaSAtbyAuLi9mb29iYXIuaSBmb29iYXIuaQoKICAgICAgICAgIChBZG1pdHRlZGx5IHRoaXMgbG9va3MgYSBsaXR0bGUgc3RyYW5nZSBidXQgaXMgdW5hdm9pZGFibGUpLgogICAgICAgICAgVGhlIGNoZWNrLWluIG9wdGlvbiBpcyBwcmltYXJpbHkgZGVzaWduZWQgZm9yIFNXSUcgbWFpbnRlbmFuY2UKICAgICAgICAgIGFuZCBsaWJyYXJ5IGRldmVsb3BtZW50LiBUaGUgY29tbWFuZCB3aWxsIGZhaWwgaWYgdGhlIHVzZXIgZG9lcwogICAgICAgICAgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbiB0byB0aGUgU1dJRyBsaWJyYXJ5LiAgVGhpcmQgcGFydHkgbGlicmFyeQogICAgICAgICAgZXh0ZW5zaW9ucyBjYW4gZWFzaWx5IGluc3RhbGwgdGhlbXNlbHZlcyBieSBzaW1wbHkgcHJvdmlkaW5nCiAgICAgICAgICBhIHNoZWxsIHNjcmlwdCB0aGF0IHVzZXMgJ3N3aWcgLWNpJyB0byBpbnN0YWxsIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICAgbGlicmFyeSBmaWxlcy4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8ga25vdyB3aGVyZSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICBpcyBsb2NhdGVkIGlmIHlvdSB1c2UgdGhpcyBtZWNoYW5pc20uCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE2Lzk3IDogRml4ZWQgYSBidWcgaW4gc2hhZG93IGNsYXNzIGdlbmVyYXRpb24gd2hlbiAlbmFtZSgpIHdhcyBhcHBsaWVkCiAgICAgICAgICB0byBhIGNsYXNzIGRlZmluaXRpb24uICAgVW5mb3J0dW5hdGVseSwgZml4aW5nIHRoZSBidWcgcmVxdWlyZWQKICAgICAgICAgIGEgY2hhbmdlIGluIHRoZSBMYW5ndWFnZSBDIEFQSSBieSBhZGRpbmcgYW4gZXh0cmEgYXJndW1lbnQgdG8KICAgICAgICAgIHRoZSBMYW5ndWFnZTo6Y3BwX2NsYXNzX2RlY2woKSBmdW5jdGlvbi4gIFRoaXMgbWF5IGJyZWFrCiAgICAgICAgICBTV0lHIEMrKyBleHRlbnNpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo2LzE1Lzk3IDogQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgbm8gbW9kdWxlIG5hbWUgaXMgc3BlY2lmaWVkIHdpdGggdGhlCiAgICAgICAgICAlbW9kdWxlIGRpcmVjdGl2ZSBvciAtbW9kdWxlIG9wdGlvbi4KCjYvMTUvOTcgOiBGaXhlZCBsaW5lIG51bWJlciBidWcgd2hlbiByZXBvcnRpbmcgZXJyb3JzIGZvciB1bmRlZmluZWQKICAgICAgICAgIGJhc2UgY2xhc3Nlcy4KCjYvMTUvOTcgOiBBZGRlZCBuZXcgJXJlbmFtZSBkaXJlY3RpdmUuICBUaGlzIGFsbG93cyB0aGUgZm9yd2FyZCBkZWNsYXJhdGlvbgogICAgICAgICAgb2YgYSByZW5hbWluZy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSBPbGROYW1lIE5ld05hbWU7CgogICAgICAgICAgICAgICAgIC4uLi4gbGF0ZXIgLi4uCiAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCiAgICAgICAgICBVbmxpa2UgJW5hbWUsICVyZW5hbWUgd2lsbCByZW5hbWUgYW55IG9jY3VycmVuY2Ugb2YgdGhlIG9sZCBuYW1lLgogICAgICAgICAgVGhpcyBhcHBsaWVzIHRvIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjbGFzcyBtZW1iZXJzIGFuZCBzbyBmb3J0aC4KICAgICAgICAgIFRoZXJlIGlzIG5vIHdheSB0byBkaXNhYmxlICVyZW5hbWUgb25jZSBzZXQsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGUKICAgICAgICAgIG5hbWUgYnkgcmVkZWNsYXJpbmcgaXQgdG8gc29tZXRoaW5nIGVsc2UuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE1Lzk3IDogSW1wcm92ZWQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgc28gdGhhdCBpdAogICAgICAgICAgY291bGQgYmUgdXNlZCB3aXRoIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIDoKCiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFNXSUcKICAgICAgICAgICAgICAgICAgICAlbmFtZShOZXdOYW1lKQogICAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7Cgo2LzE1Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gcmV0dXJuIGRhdGF0eXBlLiAgSW4gdGhpcyBjYXNlLAogICAgICAgICAgU1dJRyBhc3N1bWVzIGEgcmV0dXJuIHR5cGUgb2YgJ2ludCcuCgo2LzExLzk3IDogSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5nIGluIHRoZSBwYXJzZXIuICBJdCBzaG91bGQgYmUgYSBsaXR0bGUKICAgICAgICAgIGxlc3Mgc2Vuc2l0aXZlIHRvIGVycm9ycyB0aGF0IG9jY3VyIGluc2lkZSBjbGFzcyBkZWZpbml0aW9ucwogICAgICAgICAgbm93LiAgQWxzbyByZXBvcnRzIGVycm9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCgo2LzExLzk3IDogTWFkZSAnJCcgYSBsZWdhbCBzeW1ib2wgaW4gaWRlbnRpZmllcnMuICBUaGlzIGlzIHRvIHN1cHBvcnQKICAgICAgICAgIHNvbWUgT2JqZWN0aXZlLUMgbGlicmFyaWVzLiAgU29tZSBjb21waWxlcnMgKHN1Y2ggYXMgZ2NjKSBtYXkgYWxzbwogICAgICAgICAgYWxsb3cgaWRlbnRpZmllcnMgdG8gY29udGFpbiBhICQgaW4gQy9DKysgY29kZSBhcyB3ZWxsICh0aGlzIGlzCiAgICAgICAgICBhbiBvYnNjdXJlIGZlYXR1cmUgb2YgQykuIFdoZW4gJyQnIGFwcGVhcnMgaW4gaWRlbnRpZmllciwgU1dJRwogICAgICAgICAgcmVtYXBzIGl0IHRvIHRoZSBzdHJpbmcgJ19TXycgd2hlbiBjcmVhdGluZyB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBmdW5jdGlvbi4gVGh1cyBhIGZ1bmN0aW9uICdmb28kYmFyJyB3b3VsZCBiZSBjYWxsZWQgJ2Zvb19TX2JhcicuCgo2LzExLzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB3aXRoIF9fcmVwcl9fIG1ldGhvZC4gIElmCiAgICAgICAgICBzdXBwbGllZCBieSB0aGUgdXNlciwgaXQgd2FzIGlnbm9yZWQsIGJ1dCBub3cgaXQgc2hvdWxkIHdvcmsuCgo2LzkvOTcgIDogRml4ZWQgdGhlIFRjbCA4LjAgbW9kdWxlIHRvIHdvcmsgd2l0aCBUY2wgOC4wYjEuICAgU1dJRyBpcyBubwogICAgICAgICAgbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCAqYW55KiBhbHBoYSByZWxlYXNlIG9mIFRjbCA4LjAuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvNy85NyAgOiBQdXQgYSBtYXhpbWFsIGVycm9yIGNvdW50IGluIChjdXJyZW50bHkgc2V0IHRvIDIwKS4gU1dJRyB3aWxsIGJhaWwgb3V0CiAgICAgICAgICBpZiBpdCBnZW5lcmF0ZXMgbW9yZSBlcnJvcnMgdGhhbiB0aGlzICh1c2VmdWwgZm9yIHByZXZlbnRpbmcgU1dJRwogICAgICAgICAgZnJvbSBwcmludGluZyA0MDAwIHN5bnRheCBlcnJvcnMgd2hlbiBpdCBnZXRzIGNvbmZ1c2VkKS4KCjYvNy85NyAgOiBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBwYXJzaW5nIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCgo2LzcvOTcgIDogTWlub3IgY2hhbmdlIHRvIFBlcmw1IG1vZHVsZS4gIEMrKyBzdGF0aWMgZnVuY3Rpb25zIGFyZSBub3cKICAgICAgICAgIHB1dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZWlyIGNsYXNzIHdoZW4gdXNpbmcgc2hhZG93IGNsYXNzZXMuCgo2LzcvOTcgIDogQ2VudHJhbGl6ZWQgdGhlIG5hbWluZyBvZiBmdW5jdGlvbnMsIG1lbWJlcnMsIHdyYXBwZXJzIGV0Yy4uLiBCeQogICAgICAgICAgY2VudHJhbGl6aW5nIHRoZSBuYW1pbmcgc2NoZW1lLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbWFrZQogICAgICAgICAgc29tZSBtdWx0aS1maWxlIG9wdGltaXphdGlvbnMuICBBbHNvLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8KICAgICAgICAgIGNoYW5nZSBTV0lHJ3MgbmFtaW5nIHNjaGVtZSAocGVyaGFwcyBhIG5ldyBmZWF0dXJlIHRvIGJlIGFkZGVkCiAgICAgICAgICBsYXRlcikuCgo2LzIvOTcgIDogQWRkZWQgJ2FyZ2luaXQnIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBhc3NpZ24gaW5pdGlhbCB2YWx1ZXMKICAgICAgICAgIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIERvaW5nIHNvIG1ha2VzIGl0IHNvbWV3aGF0IGVhc2llciB0byBkZXRlY3QKICAgICAgICAgIGltcHJvcGVyIGFyZ3VtZW50IHBhc3Npbmcgd2hlbiB3b3JraW5nIHdpdGggb3RoZXIgdHlwZW1hcHMuCgo2LzIvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHJlYWQtb25seSB2YXJpYWJsZXMgd2VyZSBpbmhlcml0ZWQKICAgICAgICAgIGludG8gb3RoZXIgY2xhc3Nlcy4gIFVuZGVyIGluaGVyaXRhbmNlLCB0aGUgdmFyaWFibGVzIHdvdWxkCiAgICAgICAgICBiZWNvbWUgd3JpdGFibGUsIGJ1dCB0aGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQuCgo1LzMwLzk3IDogQW4gZW1wdHkgJW5hbWUoKSBkaXJlY3RpdmUgaXMgbm8gbG9uZ2VyIGFsbG93ZWQgb3Igc3VwcG9ydGVkLgogICAgICAgICAgVGhpcyBkaXJlY3RpdmUgd2FzIG9yaWdpbmFsbHkgdXNlZCB0byBzdHJpcCB0aGUgcHJlZml4CiAgICAgICAgICBvZmYgb2YgYSBjbGFzcyBvciBzdHJ1Y3R1cmUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG5ldmVyIHJlYWxseQogICAgICAgICAgc2VlbWVkIHRvIHdvcmsgcmlnaHQgYW5kIGl0IGNvbXBsaWNhdGVkIHRoZSBDKysgY29kZSBnZW5lcmF0b3IKICAgICAgICAgIHNpZ25pZmljYW50bHkuICAgQXMgZmFyIGFzIEkgY2FuIHRlbGwgbm8gb25lIHVzZXMgaXQsIHNvIGl0CiAgICAgICAgICBpcyBub3cgaGlzdG9yeS4gICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS8yOC85NyA6IEZpeGVkIGEgcGFyc2luZyBidWcgd2l0aCAjZGVmaW5lIGFuZCBDKysgY29tbWVudHMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBub3cgd29yayBwcm9wZXJseSA6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBDT05TVCAgIDQgICAgIC8vIEEgQ29tbWVudAoKNS8yOC85NyA6IE1hZGUgc29tZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFNXSUcgU3RyaW5nIGNsYXNzLgogICAgICAgICAgKG9ubHkgYWZmZWN0cyB0aGUgU1dJRyBjb21waWxlciBpdHNlbGYpLgoKNS8yOC85NyA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc2tpcCB0ZW1wbGF0ZSBkZWZpbml0aW9ucyBhbmQgaXNzdWUgYQogICAgICAgICAgd2FybmluZyBtZXNzYWdlLgoKNS8yOC85NyA6IFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMgYWRkZWQgKGllLiB0ZW1wbGF0ZXMpLgogICAgICAgICAgVHlwZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCBwYXNzIHRocm91Z2ggdGhlIFNXSUcgY29tcGlsZXIKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28odmVjdG9yPGNvbXBsZXg+ICphLCB2ZWN0b3I8ZG91YmxlPiAqYik7CgogICAgICAgICAgV2hlbiB1c2VkLCB0aGUgZW50aXJlIG5hbWUgJ3ZlY3Rvcjxjb21wbGV4PicgYmVjb21lcyB0aGUgbmFtZQogICAgICAgICAgb2YgdGhlIGRhdGF0eXBlLiAgICAgIER1ZSB0byBzcGFjZSBsaW1pdGF0aW9ucyBpbiBkYXRhdHlwZQogICAgICAgICAgcmVwcmVzZW50YXRpb25zLCB0aGUgbmFtZSBzaG91bGQgbm90IGV4Y2VlZCA5NiBjaGFyYWN0ZXJzLgoKICAgICAgICAgIE5vdGUgOiBUaGlzIGlzIG9ubHkgcGFydCBvZiB3aGF0IGlzIG5lZWRlZCBmb3IgdGVtcGxhdGUgc3VwcG9ydC4KICAgICAgICAgIFRlbXBsYXRlIGNsYXNzIGRlZmluaXRpb25zIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBieSBTV0lHLgoKICAgICAgICAgIFRoZSB0ZW1wbGF0ZSBub3RhdGlvbiBhYm92ZSBtYXkgYWxzbyBiZSB1c2VkIHdoZW4gc3BlY2lmeWluZwogICAgICAgICAgT2JqZWN0aXZlLUMgcHJvdG9jb2wgbGlzdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzI0Lzk3IDogRmlyc3QgY3V0IGF0IE9iamVjdGl2ZS1DIHN1cHBvcnQgYWRkZWQuICAgQXMgaXQgdHVybnMgb3V0LCBhbG1vc3QKICAgICAgICAgIGV2ZXJ5dGhpbmcgY2FuIGJlIGhhbmRsZWQgd2l0aCBvbmx5IGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8KICAgICAgICAgIHRoZSBDKysgbW9kdWxlLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNS8yMy85NyA6IEZpeGVkIHJlcGVhdGVkIGRlZmluaXRpb24gYnVnIGluIG11bHRpcGxlIGluaGVyaXRhbmNlIGhhbmRsaW5nCiAgICAgICAgICB3aGVuIG11bHRpcGxlIGJhc2UgY2xhc3NlcyBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzIChpZS4KICAgICAgICAgIHRoZSBldmlsIGRpYW1vbmQpLgoKNS8yMS85NyA6IEZpeGVkIHJhdGhlciBlbWJhcnJhc3NpbmcgdHlwbyB0aGF0IHdvcmtlZCBpdHMgd2F5IGludG8gdGhlCiAgICAgICAgICBUZXN0cy9CdWlsZCBkaXJlY3RvcnkuCgo1LzE5Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIG5hdGl2ZSBtZXRob2RzIGFuZAogICAgICAgICAgc2hhZG93IGNsYXNzZXMgd2l0aCBQeXRob24gYW5kIFBlcmw1IG1vZHVsZXMuCgo1LzE5Lzk3IDogTW9kaWZpZWQgdGhlICVhcHBseSBkaXJlY3RpdmUgc2xpZ2h0bHkgc28gdGhhdCBpdCB3b3VsZCB3b3JrCiAgICAgICAgICB3aXRoIHBvaW50ZXJzIGEgbGl0dGxlIGJldHRlci4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJWFwcGx5IHVuc2lnbmVkIGxvbmcgeyBEV09SRCB9OwoKICAgICAgICAgIEFwcGxpZXMgKmFsbCogdHlwZW1hcHMgYXNzb2NpYXRlZCB3aXRoICJ1bnNpZ25lZCBsb25nIiB0bwogICAgICAgICAgIkRXT1JEIi4gICBUaGlzIG5vdyBpbmNsdWRlcyBwb2ludGVycyB0byB0aGUgdHdvIGRhdGF0eXBlcy4KICAgICAgICAgIEZvciBleGFtcGxlLCBhIHR5cGVtYXAgYXBwbGllZCB0byAidW5zaWduZWQgbG9uZyAqKiIgd291bGQKICAgICAgICAgIGFsc28gYmUgYXBwbGllZCB0byBhbnkgb2NjdXJyZW5jZSBvZiAiRFdPUkQgKioiIGFzIHdlbGwuCgo1LzE5Lzk3IDogRml4ZWQgYW4gb3duZXJzaGlwIGFzc2lnbm1lbnQgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgY2xhc3MgbWVtYmVycyB3ZXJlIHJldHVybmluZyBuZXcgb2JqZWN0cyBiZWxvbmdpbmcgdG8KICAgICAgICAgIGRpZmZlcmVudCBjbGFzc2VzLgoKNS8xNy85NyA6IEFkZGVkIGEgZmV3IG1vcmUgdHlwZW1hcCB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICAgICAkbmFtZSAgICAgICAgICAtIE5hbWUgb2YgZnVuY3Rpb24vdmFyaWFibGUvbWVtYmVyCiAgICAgICAgICAgICAgICAgICRiYXNldHlwZSAgICAgIC0gQmFzZSBkYXRhdHlwZSAodHlwZSB3aXRob3V0IHBvaW50ZXJzKQogICAgICAgICAgICAgICAgICAkYXJnbnVtICAgICAgICAtIEFyZ3VtZW50IG51bWJlcgoKNS8xNi85NyA6IEZpeGVkIGVtYmFycmFzc2luZyB1bmRlcnNjb3JlIGVycm9yIGluIGxvY2FsIHZhcmlhYmxlCiAgICAgICAgICBhbGxvY2F0b3IuCgo1LzE2Lzk3IDogRml4ZWQgbmFtZXNwYWNlIGNsYXNoIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzCiAgICAgICAgICB3aGVuIGNyZWF0aW5nIGFycmF5cyBhcyBuZXcgbG9jYWwgdmFyaWFibGVzLgoKNS8xNS85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIGluaGVyaXRhbmNlIG9mIGFkZGVkIG1ldGhvZHMgYWNyb3NzCiAgICAgICAgICBtdWx0aXBsZSBmaWxlcy4gICBTV0lHIG5vdyB1c2VzIG5hbWVzIG9mIGJhc2UgY2xhc3NlcwogICAgICAgICAgd2hlbiBnZW5lcmF0aW5nIHN1Y2ggZnVuY3Rpb25zLgoKNS8xNC85NyA6IEZpbmlzaGVkIHN1cHBvcnQgZm9yIGRlZmF1bHQgdHlwZW1hcHMuICBQcmltYXJpbHkgdXNlZAogICAgICAgICAgaW50ZXJuYWxseSwgdGhleSBjYW4gYmUgdXNlZCB0byBtYXRjaCB0aGUgYmFzaWMKICAgICAgICAgIGJ1aWx0LWluIGRhdGF0eXBlcyB1c2VkIGluc2lkZSBvZiBTV0lHLiAgIFlvdSBjYW4KICAgICAgICAgIHNwZWNpZnkgdGhlbSBpbiBpbnRlcmZhY2UgZmlsZXMgYXMgd2VsbCBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgU1dJR19ERUZBVUxUX1RZUEUgewogICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gYXRvaSgkdGFyZ2V0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFVubGlrZSBub3JtYWwgdHlwZW1hcHMsIHRoaXMgZGVmYXVsdCBtYXAgd2lsbCBnZXQgYXBwbGllZAogICAgICAgICAgdG8gKmFsbCogaW50ZWdlciBkYXRhdHlwZXMgZW5jb3VudGVyZWQsIGluY2x1ZGluZyB0aG9zZQogICAgICAgICAgcmVuYW1lZCB3aXRoIHR5cGVkZWYsIGV0Yy4uLgoKNS8xMy85NyA6IEZpeGVkIHN1YnN0cmluZyBidWcgaW4gdHlwZSBjaGVja2VyLgoKNS8xMi85NyA6IEZpeGVkIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzIHdoZW4gZGVjbGFyaW5nIGxvY2FsCiAgICAgICAgICB2YXJpYWJsZXMgb2Ygc3RydWN0dXJlcy4KClZlcnNpb24gMS4xIEJldGE2IChNYXkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNS85Lzk3ICA6IEZpeGVkIGJpemFycmUgTlVMTCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBtb2R1bGUuCgo1LzgvOTcgIDogRml4ZWQgbXlzdGVyaW91cyBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBydW5uaW5nIFNXSUcgb24gYW4KICAgICAgICAgIGVtcHR5IGZpbGUuCgo1LzcvOTcgIDogVGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgbm93IHJlcGxhY2UgdGhlIHNwZWNpYWwgc3ltYm9sICIkY2xlYW51cCIKICAgICAgICAgIHdpdGggdGhlIGNsZWFudXAgY29kZSBzcGVjaWZpZWQgd2l0aCB0aGUgImZyZWVhcmciIHR5cGVtYXAuCiAgICAgICAgICBUaGlzIGNoYW5nZSBuZWVkZWQgdG8gcHJvcGVybHkgbWFuYWdlIG1lbW9yeSBhbmQgZXhjZXB0aW9ucy4KCjUvNS85NyAgOiBBZGRlZCB0aGUgJ3R5cGVtYXBzLmknIGxpYnJhcnkgZmlsZS4gIFRoaXMgY29udGFpbnMgYQogICAgICAgICAgdmFyaWV0eSBvZiBjb21tb24gdHlwZW1hcHMgZm9yIGlucHV0IHZhbHVlcywgcG9pbnRlcnMsCiAgICAgICAgICBhbmQgc28gb24uCgo1LzUvOTcgIDogQ2hhbmdlZCBiZWhhdmlvciBvZiAiYXJnb3V0IiB0eXBlbWFwIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICBPbGQgdmVyc2lvbnMgYXV0b21hdGljYWxseSB0dXJuZWQgdGhlIHJlc3VsdCBpbnRvIGEKICAgICAgICAgIFB5dGhvbiBsaXN0LiAgVGhlIG5ldyB2ZXJzaW9uIGRvZXMgbm90aGluZywgbGVhdmluZyB0aGUKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHVwIHRvIHRoZSB1c2VyLiAgVGhpcyBwcm92aWRlcyBtb3JlIGZsZXhpYmlsaXR5CiAgICAgICAgICBidXQgbWF5IGJyZWFrIG9sZGVyIGNvZGVzIHRoYXQgcmVseSBvbiB0eXBlbWFwcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS81Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uIG9mCiAgICAgICAgICAiYXJnb3V0IiBhbmQgImlnbm9yZSIgdHlwZW1hcHMuCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgdGhhdCB3b3VsZCBnZW5lcmF0ZSBpbmNvcnJlY3QgY29kZQogICAgICAgICAgaWYgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgImlnbm9yZWQiLgoKNS80Lzk3ICA6IEFkZGVkICVhcHBseSBhbmQgJWNsZWFyIGRpcmVjdGl2ZXMuICAgVGhlc2UgZm9ybSBhIGhpZ2hlciBsZXZlbAogICAgICAgICAgaW50ZXJmYWNlIHRvIHRoZSB0eXBlbWFwIG1lY2hhbmlzbS4gIEluIGEgbnV0c2hlbGwsIHRoZXkKICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgcHJvY2Vzc2luZyBvZiB2YXJpb3VzIGRhdGF0eXBlcyB3aXRob3V0CiAgICAgICAgICBldmVyIGhhdmluZyB0byB3cml0ZSBhIHR5cGVtYXAuICBTZWUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbgogICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gICoqIE5FVyBGRUFUVVJFICoqCgo1LzQvOTcgIDogQWRkZWQgYSBsb2NhbCB2YXJpYWJsZSBleHRlbnNpb24gdG8gdGhlIHR5cGVtYXAgaGFuZGxlci4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgKihkb3VibGUgdGVtcCkgewoJCSAgICAgICAgdGVtcCA9IGF0b2YoJHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSAmdGVtcDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCAndGVtcCcgaXMgYSBsb2NhbCB2YXJpYWJsZSB0aGF0IGV4aXN0cwogICAgICAgICAgaW4gdGhlIGVudGlyZSB3cmFwcGVyIGZ1bmN0aW9uIChub3QganVzdCB0aGUgdHlwZW1hcAogICAgICAgICAgY29kZSkuICBUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyBiZXR0ZXIgc3VwcG9ydCBmb3IKICAgICAgICAgIGNlcnRhaW4gdHlwZXMgb2YgYXJndW1lbnQgaGFuZGxpbmcgYW5kIGFsc28gbWFrZXMgaXQKICAgICAgICAgIHBvc3NpYmxlIHRvIHdyaXRlIHRocmVhZC1zYWZlIHR5cGVtYXBzLiAgQW55IG51bWJlcgogICAgICAgICAgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBkZWNsYXJlZCBieSBzdXBwbHlpbmcgYSBjb21tYQogICAgICAgICAgc2VwYXJhdGVkIGxpc3QuICAgTG9jYWwgdmFyaWFibGVzIGFyZSBndWFyYW50ZWVkIHRvIGJlCiAgICAgICAgICB1bmlxdWUsIGV2ZW4gaWYgdGhlIHNhbWUgdHlwZW1hcCBpcyBhcHBsaWVkIG1hbnkgdGltZXMKICAgICAgICAgIGluIGEgZ2l2ZW4gZnVuY3Rpb24uCiAgICAgICAgICAqKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBQZXJsNCBvciBHdWlsZSBtb2R1bGVzLgoKNS8yLzk3ICA6IEZpeGVkIHByb2Nlc3Npbmcgb2YgJWlmZGVmLCAlZW5kaWYsICVpZiwgZXRjLi4uICAoVGhlc2UgYXJlCiAgICAgICAgICBTV0lHIGVxdWl2YWxlbnRzIG9mIHRoZSBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgIGNhbiBwYXNzIHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKS4KCjUvMi85NyAgOiBGaXhlZCBtYWpvciAoYnV0IHN1YnRsZSkgYnVnIGluIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIKICAgICAgICAgIHJlbGF0ZWQgdG8gc2VhcmNoaW5nIGFuZCB0eXBlLWNoZWNraW5nIGZvciBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICBUbyBtYWtlIGEgbG9uZyBzdG9yeSBzaG9ydCwgaWYgeW91IGhhZCB0d28gY2xhc3NlcyBuYW1lZAogICAgICAgICAgIkZvbyIgYW5kICJGb29PYmplY3QiIHRoZSB0eXBlIGNoZWNrZXIgd291bGQgc29tZXRpbWVzCiAgICAgICAgICBnZXQgY29uZnVzZWQgYW5kIGJlIHVuYWJsZSB0byBsb2NhdGUgIkZvbyIgaW4gYW4gaW50ZXJuYWwKICAgICAgICAgIHRhYmxlLgoKNS8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgLWNvIG9wdGlvbi4KCjQvMjQvOTcgOiBQb2ludGVyIGxpYnJhcnkgYWRkZWQgdG8gdGhlIFNXSUcgbGlicmFyeS4KCjQvMTkvOTcgOiBBZGRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICAgVGhpcyBpcyBhICJoaW50IiB0aGF0IGNhbiBiZSB1c2VkCiAgICAgICAgICB0byB0ZWxsIFNXSUcgdGhhdCBhIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIG5ldyBvYmplY3QuIEZvcgogICAgICAgICAgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlbmV3IEZvbyAqY3JlYXRlX2ZvbygpOwoKICAgICAgICAgIFRoaXMgdGVsbHMgU1dJRyB0aGF0IGNyZWF0ZV9mb28oKSBpcyBjcmVhdGluZyBhIG5ldyBvYmplY3QKICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGl0LiAgIE1hbnkgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkKICAgICAgICAgIGNob29zZSB0byBpZ25vcmUgdGhlIGhpbnQsIGJ1dCB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3NlcywKICAgICAgICAgIHRoZSAlbmV3IGlzIHVzZWQgdG8gaGFuZGxlIHByb3BlciBvd25lcnNoaXAgb2Ygb2JqZWN0cy4KCiAgICAgICAgICAlbmV3IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5ncy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgY2hhciAqY3JlYXRlX3N0cmluZygpOwoKICAgICAgICAgIFdoZW4gdXNlZCwgYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHdpbGwgYXV0b21hdGljYWxseSBjbGVhbnVwCiAgICAgICAgICB0aGUgcmV0dXJuZWQgc3RyaW5nLS1lbGltaW5hdGluZyBtZW1vcnkgbGVha3MuCiAgICAgICAgICAqKiBORVcgRkVBVFVSRSAqKgoKNC8xOS85NyA6IEFkZGVkIGEgbmV3IHR5cGVtYXAgIm5ld2ZyZWUiLiAgIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCiAgICAgICAgICB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgbWV0aG9kIGJ5IHdoaWNoCiAgICAgICAgICBhIG5ldyBvYmplY3QgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBpcyBkZWxldGVkLgoKNC8xOS85NyA6IFRoZSBzeW1ib2wgIl9fY3BsdXNwbHVzIiBpcyBub3cgZGVmaW5lZCBpbiB0aGUgU1dJRyBpbnRlcnByZXRlcgogICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggdGhlIC1jKysgb3B0aW9uLgoKNC8xNy85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIHdoZW4gdXNlZCBpbnNpZGUgdGhlCiAgICAgICAgICAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgo0LzE1Lzk3IDogQWRkZWQgYSBzcGVjaWFsIHR5cGVtYXAgc3ltYm9sIFBSRVZJT1VTIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIHJlc3RvcmUgYSBwcmV2aW91cyB0eXBlbWFwLiBGb3IgZXhhbXBsZSA6CgoJICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgKiA9IFBSRVZJT1VTOwoKICAgICAgICAgIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgaW4gbGlicmFyeSBmaWxlcy4KCjQvMTMvOTcgOiBBZGRlZCAlcHJhZ21hIGRpcmVjdGl2ZSBmb3IgUGVybDUgbW9kdWxlLiAgIFR3byBuZXcgcHJhZ21hcyBhcmUKICAgICAgICAgIGF2YWlsYWJsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGNvZGUgPSAic3RyaW5nIgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiZmlsZS5wbCIKCiAgICAgICAgICBCb3RoIGluc2VydCBjb2RlIGludG8gdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4gIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY3VzdG9taXplIHRoZSAucG0gZmlsZSBjcmVhdGVkIGJ5IFNXSUcuCgo0LzEzLzk3IDogU2Nhbm5lciBtb2RpZmllZCB0byBvbmx5IHJlY29nbml6ZSBDKysga2V5d29yZHMgd2hlbiB0aGUgLWMrKwogICAgICAgICAgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4gIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgQyBwcm9ncmFtcwogICAgICAgICAgdGhhdCBtYWtlIHVzZSBvZiB0aGVzZSBrZXl3b3JkcyBmb3IgaWRlbnRpZmllcnMuCiAgICAgICAgICBTV0lHIG1heSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgcnVuIHdpdGggdGhlIC1jKysgb3B0aW9uIHdoZW4KICAgICAgICAgIGNvbXBpbGluZyBDKysgY29kZSAodGhpcyB3YXMgYWxsb3dlZCwgYnV0IG5vdCByZWNvbW1lbmRlZCBpbgogICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMpLiAqKlBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkqKgoKNC8xMS85NyA6IEZpeGVkIGEgcmF0aGVyIG5hc3R5IGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gdXNpbmcKICAgICAgICAgIHZhcmlhYmxlIGxpbmtpbmcgd2l0aCBjb21wbGV4IGRhdGF0eXBlcyBhbmQgcG9pbnRlcnMuICAgT24gVW5peCwKICAgICAgICAgIGNvZGUgd291bGQgd29yayAoc29tZWhvdyksIGJ1dCB3b3VsZCBjYXVzZSBhbiBhY2Nlc3MgdmlvbGF0aW9uCiAgICAgICAgICB1bmRlciBXaW5kb3dzLU5ULiAgVGhlIGZpeCBzaG91bGQgY29ycmVjdCB0aGUgcHJvYmxlbSwKICAgICAgICAgIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgYSBwcm9ibGVtIHVzaW5nIGdsb2JhbCB2YXJpYWJsZXMgb2YKICAgICAgICAgIGNvbXBsZXggZGF0YXR5cGVzIGluIGNvbmp1bmN0aW9uIHdpdGggc2hhZG93IGNsYXNzZXMuICBGb3J0dW5hdGVseSwKICAgICAgICAgIHRoaXMgc29ydCBvZiB0aGluZyBzZWVtcyB0byBiZSByZWxhdGl2ZWx5IHJhcmUgKGNvbnNpZGVyaW5nCiAgICAgICAgICB0aGF0IHRoZSBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBtb3JlIHRoYW4gYSB5ZWFyIC0geWlrZXMhKS4KCjQvMTEvOTcgOiBGaXhlZCBiaXphcnJlIGNvbnN0YW50IGV2YWx1YXRpb24gYnVnIGluIFBlcmw1IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MtTlQuCgo0LzgvOTcgIDogQnVnIHdoZW4gdXNpbmcgZGVmYXVsdCBhcmd1bWVudHMgYW5kIEMrKyByZWZlcmVuY2VzIGZpeGVkLgoKNC84Lzk3ICA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWdzIGluIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcyByZWxhdGVkIHRvCiAgICAgICAgICB1c2luZyBjbGFzcyByZW5hbWluZyAoYXBwbHlpbmcgdGhlICVuYW1lIGRpcmVjdGl2ZSB0byBhIGNsYXNzCiAgICAgICAgICBkZWZpbml0aW9uKSBhbmQgc2hhZG93IGNsYXNzZXMuCgo0LzcvOTcgIDogRml4ZWQgbWlub3IgYnVncyBpbiBzd2lncHRyLnN3ZywgdGNsOHB0ci5zd2csIGFuZCBwZXJsNXB0ci5zd2cgdG8KICAgICAgICAgIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlbiB3ZWlyZCBkYXRhdHlwZXMgYXJlIHBhc3NlZC4KCjMvMjkvOTcgOiAnTWFrZWZpbGUud2luJyBhZGRlZC4gICBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgbW9zdCBvZiB0aGUgZXhhbXBsZXMKICAgICAgICAgIGluIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgdW5kZXIgV2luZG93cyBOVC85NS4KCjMvMjcvOTcgOiBGaXhlcyB0byBTV0lHJ3MgZXJyb3IgcmV0dXJuIGNvZGVzLiAgIFNXSUcgbm93IHJldHVybnMgbm9uLXplcm8KICAgICAgICAgIGV4aXQgY29kZXMgZm9yIGNlcnRhaW4ga2luZHMgb2YgZXJyb3JzICh3aGljaCBtYWtlcyBpdCBtb3JlCiAgICAgICAgICBmcmllbmRseSB0byBtYWtlZmlsZXMpLiAgICAgQW4gb3ZlcmhhdWwgb2YgdGhlIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICBpcyBvbiB0aGUgdG8tZG8gbGlzdCBhbmQgd2lsbCBwcm9iYWJseSBzaG93IHVwIGluIGEgbGF0ZXIgcmVsZWFzZS4KCjMvMjUvOTcgOiBCdWcgZml4LiAgImZyZWVhcmciIGFuZCAiYXJnb3V0IiB0eXBlbWFwcyBoYXZlIGJlZW4gZml4ZWQgaW4KICAgICAgICAgIHRoZSBQZXJsNSBtb2R1bGUuICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycwogICAgICAgICAgYW5kIGZ1bmN0aW9uIG91dHB1dCBwYXJhbWV0ZXJzIHNoYXJlZCB0aGUgc2FtZSBtZW1vcnkgc3BhY2UtLWNhdXNpbmcKICAgICAgICAgIGFsbCBzb3J0cyBvZiBuYXN0eSBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBwYXNzIHBlcmwgdmFsdWVzIGJ5CiAgICAgICAgICByZWZlcmVuY2UuICAgU1dJRyBub3cgaW50ZXJuYWxseSBtYWtlcyBhICJjb3B5IiAod2hpY2ggaXMgcmVhbGx5CiAgICAgICAgICBqdXN0IGEgcG9pbnRlcikgb2YgYWZmZWN0ZWQgcGFyYW1ldGVycyBhbmQgdXNlcyB0aGF0LiAgIFRoaXMKICAgICAgICAgIGlzIGRvbmUgdHJhbnNwYXJlbnRseSBzbyB0aGVyZSBpcyBubyBub3RpY2FibGUgaW1wYWN0IG9uIGFueQogICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcy4gICBUaGlzIGNoYW5nZSBpcyBwcm9iYWJseSBvbmx5IG5vdGljYWJsZQogICAgICAgICAgdG8gZXhwZXJ0IHVzZXJzLgoKMy8yNS85NyA6IEFkZGVkIHR5cGUtY2hlY2sgdG8gdmVyYm9zZSBhbmQgc3RhdCBtb2RlLiAgU1dJRyB3aWxsIG5vdyBnZW5lcmF0ZSBhIGxpc3QKICAgICAgICAgIG9mIGFsbCBkYXRhdHlwZXMgdGhhdCB3ZXJlIHVzZWQgYnV0IHVuZGVmaW5lZCAodXNlZnVsIGZvciB0cmFja2luZwogICAgICAgICAgZG93biB3ZWlyZCBidWdzKS4gICBUaGlzIGlzIGVuYWJsZWQgd2l0aCB0aGUgLXYgb3B0aW9uICh3aGljaAogICAgICAgICAgaXMgbm93IG9mZmljaWFsbHkga25vd24gYXMgIm92ZXJseSB2ZXJib3NlIiBtb2RlKSBvciB0aGUgLXN0YXQgb3B0aW9uLgoKMy8yNS85NyA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNlciB0byBtYWtlIGluY2x1ZGUgZ3VhcmRzIHdvcmsgY29ycmVjdGx5LgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICNpZm5kZWYgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICNkZWZpbmUgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vYmFyLmkKICAgICAgICAgICAgICAgIC4uLiBkZWNsYXJhdGlvbnMgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKCjMvMjQvOTcgOiAlY2hlY2tvdXQgZGlyZWN0aXZlIGFkZGVkLiAgIFRoaXMgYWxsb3dzIGFuIGludGVyZmFjZSBmaWxlIHRvCiAgICAgICAgICBleHRyYWN0IGZpbGVzIGZyb20gdGhlIFNXSUcgbGlicmFyeSBhbmQgcGxhY2UgdGhlbSBpbiB0aGUKICAgICAgICAgIGN1cnJlbnQgZGlyZWN0b3J5LiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCBzY3JpcHRzIGFuZAogICAgICAgICAgb3RoZXIgaGVscGVyIGNvZGUgdGhhdCBtaWdodCBiZSBhc3NvY2lhdGVkIHdpdGggbGlicmFyeSBmaWxlcy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAlY2hlY2tvdXQgYXJyYXkudGNsCgogICAgICAgICAgV2lsbCBsb29rIGZvciBhIGZpbGUgImFycmF5LnRjbCIgaW4gdGhlIGxpYnJhcnkgYW5kIGNvcHkgaXQKICAgICAgICAgIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gICAgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlCiAgICAgICAgICBkaXJlY3RvcnksIHRoaXMgZGlyZWN0aXZlIGRvZXMgbm90aGluZyAoaXQgd2lsbCBub3Qgb3ZlcndyaXRlIGFuCiAgICAgICAgICBleGlzdGluZyBmaWxlKS4gIFRoaXMgb25seSBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBmb3Igbm93LgoKMy8yNC85NyA6IFNXSUcgd2lsbCBub3cgbG9vayBpbiB0aGUgU1dJRyBMaWJyYXJ5IGZvciBhIGZpbGUgaWYgaXQgY2FuJ3QKICAgICAgICAgIGZpbmQgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQXMgYSByZXN1bHQsIGl0IGlzIGVhc3kgdG8KICAgICAgICAgIG1ha2UgbW9kdWxlcyBmcm9tIFNXSUcgbGlicmFyeSBmaWxlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgIHdhbnQgdG8gbWFrZSBhIFB5dGhvbiBtb2R1bGUgZnJvbSB0aGUgU1dJRyB0aW1lcnMgbGlicmFyeSwganVzdAogICAgICAgICAgdHlwZSB0aGlzIGluIGFueSBkaXJlY3RvcnkgOgoKICAgICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiB0aW1lcnMuaQoKICAgICAgICAgIFlvdSB3aWxsIGdldCB0aGUgZmlsZXMgdGltZXJzX3dyYXAuYyBhbmQgdGltZXJzX3dyYXAuZG9jIGluCiAgICAgICAgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCB5b3UgY2FuIG5vdyBjb21waWxlLiAgIFRoZSBmaWxlCiAgICAgICAgICByZW1haW5zIGluIHRoZSBTV0lHIGxpYnJhcnkgKGFsdGhvdWdoIHlvdSBjYW4gY2hlY2sgaXQgb3V0CiAgICAgICAgICB1c2luZyB0aGUgLWNvIG9wdGlvbikuICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogLWNvIG9wdGlvbiBhZGRlZCB0byBTV0lHIHRvIGFsbG93IGVhc3kgYWNjZXNzIHRvIHRoZSBTV0lHIGxpYnJhcnkuCiAgICAgICAgICBXaGVuIHVzZWQsIHRoaXMgaW5zdHJ1Y3RzIFNXSUcgdG8gY2hlY2sgb3V0IGEgbGlicmFyeSBmaWxlIGFuZAogICAgICAgICAgcGxhY2UgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgIHVuaXggPiBzd2lnIC1jbyBhcnJheS5pCiAgICAgICAgICAgICAgICBhcnJheS5pIGNoZWNrZWQgb3V0IGZyb20gdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgICAgICAgdW5peCA+CgogICAgICAgICAgT25jZSBpbiB5b3VyIGRpcmVjdG9yeSB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgZmlsZSB0byBzdWl0IHlvdXIKICAgICAgICAgIHBhcnRpY3VsYXIgcHVycG9zZXMuICBUaGUgY2hlY2tvdXQgb3B0aW9uIG1ha2VzIGl0IGVhc3kgdG8KICAgICAgICAgIGdyYWIgbGlicmFyeSBmaWxlcyB3aXRob3V0IGtub3dpbmcgYW55dGhpbmcgYWJvdXQgdGhlIFNXSUcKICAgICAgICAgIGluc3RhbGxhdGlvbiwgYnV0IGl0IGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gc3RhcnQKICAgICAgICAgIGluY2x1ZGluZyBzY3JpcHRzLCBDIGNvZGUsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzIGZpbGVzCiAgICAgICAgICBpbiB0aGUgbGlicmFyeS4gIEZvciBleGFtcGxlLCB5b3UgY291bGQgcHV0IGEgY29vbCBzY3JpcHQKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5IGFuZCBjaGVjayBpdCBvdXQgd2hlbmV2ZXIgeW91IHdhbnRlZCB0byB1c2UgaXQuCiAgICAgICAgICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogI3ByYWdtYSBleHBvcnQgZGlyZWN0aXZlcyBhZGRlZCB0byBUY2wgb3V0cHV0IGZvciBjb21waWxpbmcKICAgICAgICAgIHNoYXJlZCBsaWJyYXJpZXMgb24gdGhlIE1hYy4KCjMvMjQvOTcgOiBNaW5vciBjaGFuZ2VzIHRvIHdpc2guaSBhbmQgdGNsc2guaSBsaWJyYXJ5IGZpbGVzIHRvIHByb3ZpZGUKICAgICAgICAgIHN1cHBvcnQgZm9yIHRoZSBNYWNpbnRvc2guCgozLzE5Lzk3IDogU1dJRydzIHBvbGljeSB0b3dhcmRzIE5VTEwgcG9pbnRlcnMgaGFzIGJlZW4gcmVsYXhlZC4gIFRoZQogICAgICAgICAgcG9saWN5IG9mIHJlcXVpcmluZyBhIHNwZWNpYWwgY29tcGlsZXIgZGlyZWN0aXZlIC1EQUxMT1dfTlVMTAogICAgICAgICAgdG8gdXNlIE5VTEwgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIFdoaWxlIHRoaXMgbWF5CiAgICAgICAgICBzZWVtICJ1bnNhZmUiLCBpdCB0dXJucyBvdXQgdGhhdCB5b3UgY2FuIHVzZSBhICJjaGVjayIKICAgICAgICAgIHR5cGVtYXAgdG8gYWNoaWV2ZSBzb21lIHNhZmV0eS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIE5vZGUgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIk5VTEwgUG9pbnRlcnMgbm90IGFsbG93ZWQuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBwcmV2ZW50cyBhbnkgTlVMTCB2YWx1ZSBvZiBhICJOb2RlICoiIHBvaW50ZXIgdG8gYmUKICAgICAgICAgIHBhc3NlZCB0byBhIGZ1bmN0aW9uLiAgIChJIHRoaW5rIHRoaXMgaXMgbXVjaCBjbGVhbmVyCiAgICAgICAgICB0aGFuIHRoZSBvbGQgLURBTExPV19OVUxMIGhhY2sgYW55d2F5cykuCgozLzE5Lzk3IDogRml4ZWQgcG9pbnRlciBoYW5kbGluZyBlcnJvcnMgaW4gUGVybDUgbW9kdWxlLiAgTW9kdWxlcyBubwogICAgICAgICAgbG9uZ2VyIGNvcmUgZHVtcCB3aGVuIGEgUGVybCByZWZlcmVuY2UgaXMgaW5hZHZlcnRlbnRseQogICAgICAgICAgcGFzc2VkIGluIGFzIGEgQyBwb2ludGVyLgoKMy8xOC85NyA6IEFkZGVkIGEgImNoZWNrIiB0eXBlbWFwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlCiAgICAgICAgICB2YWxpZGl0eSBvZiBmdW5jdGlvbiBpbnB1dCB2YWx1ZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIGludCBwb3NpbnQgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGFyZ2V0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIkFyZ3VtZW50IGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIiKTsKICAgICAgICAgICAgICAgIH0KCjMvMTgvOTcgOiBBZGRlZCBhbiAkYXJnIHZhcmlhYmxlIHRvIFRjbCB0eXBlbWFwcy4gICBUaGlzIG1ha2VzIGl0IGVhc2llcgogICAgICAgICAgdG8gcmV0dXJuIGFyZ3VtZW50IHZhbHVlcyBieSAicmVmZXJlbmNlIi4KCjMvMTgvOTcgOiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiB1c2luZyBDKysgcmVmZXJlbmNlcyBhbmQKICAgICAgICAgIHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgozLzE4Lzk3IDogRml4ZWQgYSBmZXcgZ2xpdGNoZXMgaW4gdGhlIHR5cGVtYXAgbW9kdWxlIHdpdGggcmVzcGVjdCB0bwogICAgICAgICAgY2hhaW5pbmcuIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAgJGluICAgICAgICAgICAgICAgIC8vIEluc2VydHMgcHJleGlzdGluZyB0eXBlbWFwCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWNlaXZlZCBhICVkXG4iLCAkdGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIGhhcyBiZWVuIGFsbG93ZWQgZm9yIHF1aXRlIHNvbWUgdGltZSwgYnV0IGRpZG4ndCB3b3JrCiAgICAgICAgICBpZiBubyBleGlzdGluZyB0eXBlbWFwIHdhcyBkZWZpbmVkLiAgTm93LCBpdCBzdGlsbCBkb2Vzbid0CiAgICAgICAgICB3b3JrIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgaXMgZGVmaW5lZCwgYnV0IGl0IGlzc3VlcyBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuICAgVGhlcmUgaXMgc29tZSBzdXBwb3J0IHVzaW5nIGRlZmF1bHQgdHlwZW1hcHMsCiAgICAgICAgICBidXQgbm9uZSBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyB0YWtlIGFkdmFudGFnZSBvZiBpdC4gIFRoaXMKICAgICAgICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCBhdCB0aGlzIHRpbWUuCgpWZXJzaW9uIDEuMWI1IFBhdGNoIDEgKE1hcmNoIDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMy8xNi85NyA6IEZpeGVkIHJlZmVyZW5jZXMgYnVnIHdpdGggQysrIGNvZGUgZ2VuZXJhdGlvbi4KCjMvMTYvOTcgOiBGaXhlZCBpbml0aWFsaXphdGlvbiBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIHRoYXQKICAgICAgICAgIHdhcyBjYXVzaW5nIHdlaXJkIHByb2JsZW1zLgoKMy8xNi85NyA6IEZpeGVkIGZhdGFsIGJ1ZyB3aXRoIC1jIG9wdGlvbiBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KCjMvMTMvOTcgOiBGaXhlZCBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGludm9sdmluZyB0aGUgJXRleHQgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgc29ydGluZy4gSW4gdGhlIG9sZCBzeXN0ZW0sICV0ZXh0IGVudHJpZXMgd291bGQgZmxvYXQgdG8gdGhlCiAgICAgICAgICB0b3Agb2YgYSBzZWN0aW9uIGJlY2F1c2UgdGhleSB3ZXJlICJuYW1lbGVzcyIuICAgTm93IHRoZXkgYXJlCiAgICAgICAgICBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24gYW5kIHdpbGwgc3RheSBpbiB0aGUgcHJvcGVyCiAgICAgICAgICBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgZW50cnkuCgpWZXJzaW9uIDEuMWI1IChNYXJjaCAxMiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzExLzk3IDogRml4ZWQgY29tcGlsYXRpb24gcHJvYmxlbXMgaW50cm9kdWNlZCBieSBUY2wvVGsgOC4wYTIuCiAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZICoqKiBTV0lHIG5vIGxvbmdlciB3b3JrcyB3aXRoIFRjbC9UayA4LjBhMS4KCjMvMTAvOTcgOiBGaXhlZCBidWcgd2l0aCBpZ25vcmVkIGFyZ3VtZW50cyBhbmQgQysrIG1lbWJlciBmdW5jdGlvbnMgaW4KICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlLgoKMy85Lzk3ICA6IFBhcnNpbmcgYnVncyB3aXRoIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBhbmQgcHJpdmF0ZWx5CiAgICAgICAgICBkZWNsYXJlZCBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMgZml4ZWQuCgozLzkvOTcgIDogRml4ZWQgYSBmZXcgbWlub3IgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2l0aCBDKysgY2xhc3NlcyBhbmQKICAgICAgICAgIGNvbnN0cnVjdG9ycy4gICBJbiBzb21lIGNhc2VzLCB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZQogICAgICAgICAgd291bGQgbm90IGNvbXBpbGUgcHJvcGVybHkuICAgU1dJRyBub3cgYXR0ZW1wdHMgdG8gdXNlCiAgICAgICAgICB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQuCgozLzgvOTcgIDogQWRkZWQgYSAtbCBvcHRpb24gdG8gU1dJRyB0aGF0IGFsbG93cyBhZGRpdGlvbmFsIFNXSUcgbGlicmFyeSBmaWxlcwogICAgICAgICAgdG8gYmUgZ3JhYmJlZCB3aXRob3V0IGhhdmluZyB0aGVtIHNwZWNpZmllZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHRoZSBpbnRlcmZhY2UgZmlsZSBjbGVhbiBhbmQgbW92ZSBjZXJ0YWluCiAgICAgICAgICBvcHRpb25zIGludG8gYSBNYWtlZmlsZS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgIHN3aWcgLXRjbCBleGFtcGxlLmkgICAgICAgICAgICAgICMgIEJ1aWxkIGEgbm9ybWFsIFRjbCBleHRlbnNpb24KICAgICAgICAgICAgICBzd2lnIC10Y2wgLWx3aXNoLmkgZXhhbXBsZS5pICAgICAjICBCdWlsZCBpdCBhcyBhIHdpc2ggZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgYnkgaW5jbHVkaW5nIHRoZSAnd2lzaC5pJyBmaWxlLgoKICAgICAgICAgICAgICBzd2lnIC1weXRob24gZXhhbXBsZS5pICAgICAgICAgICAjIEJ1aWxkIGEgZHluYW1pY2FsbHkgbG9hZGVkIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtbGVtYmVkLmkgZXhhbXBsZS5pICMgQnVpbGQgYSBzdGF0aWMgZXh0ZW5zaW9uCgogICAgICAgICAgVGhlc2Uga2luZHMgb2Ygb3B0aW9ucyBjb3VsZCBwcmV2aW91c2x5IGJlIGFjY29tcGxpc2hlZCB3aXRoCiAgICAgICAgICBjb25kaXRpb25hbCBjb21waWxhdGlvbiBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgICAgICAlbW9kdWxlIGV4YW1wbGUKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgI2lmZGVmIFNUQVRJQwogICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgZW1iZWQuaQogICAgICAgICAgICAgICAgICAgI2VuZGlmCgozLzgvOTcgIDogSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gR3VpbGUgbW9kdWxlIHRvIHVzZSB0aGUgbmV3IGdoIGludGVyZmFjZQogICAgICAgICAgaW4gRlNGIEd1aWxlIDEuMC4gICAgVGhlIG9sZGVyIGdzY20gaW50ZXJmYWNlIHVzZWQgaW4gQ3lnbnVzCiAgICAgICAgICBHdWlsZSByZWxlYXNlcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IFNXSUcuCgozLzgvOTcgIDogQ2xlYW5lZCB1cCB0aGUgVGNsIE5ldHNjYXBlIHBsdWdpbiBleGFtcGxlLiAgIEl0IHNob3VsZCB3b3JrIHdpdGgKICAgICAgICAgIHZlcnNpb24gMS4xIG9mIHRoZSBwbHVnaW4gbm93LgoKMy84Lzk3ICA6IEFkZGVkIGJldHRlciBhcnJheSBzdXBwb3J0IHRvIHRoZSB0eXBlbWFwIG1vZHVsZS4gIFRoZSBrZXl3b3JkCiAgICAgICAgICBBTlkgY2FuIG5vdyBiZSB1c2VkIHRvIG1hdGNoIGFueSBhcnJheSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyB3aWxsIG1hdGNoIGFueSBzaW5nbGUtZGltZW5zaW9uYWwgZG91YmxlIGFycmF5LiAgIFRoZSBhcnJheQogICAgICAgICAgZGltZW5zaW9uIGlzIHBhc3NlZCBpbiB0aGUgdmFyaWFibGVzICRkaW0wLCAkZGltMSwgLi4uICRkaW05LiAgRm9yCiAgICAgICAgICBleGFtcGxlIDoKCgkJICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldW0FOWV1bQU5ZXSB7CgkJCXByaW50ZigiUmVjZWl2ZWQgYSBkb3VibGVbJWRdWyVkXVslZF1cbiIsJGRpbTAsJGRpbTEsJGRpbTIpOwoJICAgICAgICAgICAgfQoKICAgICAgICAgIEFueSB0eXBlbWFwIGludm9sdmluZyBhIHNwZWNpZmljIGFycmF5IGRpbWVuc2lvbiB3aWxsIG92ZXJyaWRlIGFueQogICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlIEFOWSB0YWcuICBUaHVzLCBhICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFs1XVs0XVtBTlldIHt9CiAgICAgICAgICB3b3VsZCBvdmVycmlkZSBhIGRvdWJsZSBbQU5ZXVtBTlldW0FOWV0uICBIb3dldmVyLCBvdmVydXNlIG9mIHRoZSBBTlkKICAgICAgICAgIHRhZyBpbiBhcnJheXMgb2YgaGlnaC1kaW1lbnNpb25zIG1heSBub3Qgd29yayBhcyB5b3UgZXhwZWN0IGR1ZSB0bwogICAgICAgICAgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZSB1c2VkLiBGb3IgZXhhbXBsZSwgd2hpY2ggb2YgdGhlIGZvbGxvd2luZwogICAgICAgICAgdHlwZW1hcHMgaGFzIHByZWNlZGVuY2U/CgogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbQU5ZXVs1XSB7fSAgICAgLy8gQXZvaWQgdGhpcyEKICAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgWzVdW0FOWV0ge30KCjMvNy85NyAgOiBGaXhlZCBhIG51bWJlciBvZiBidWdzIHJlbGF0ZWQgdG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgaGFuZGxpbmcuCiAgICAgICAgICBUeXBlZGVmcyBpbnZvbHZpbmcgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG5vdyB3b3JrcyBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIE1BVFJJWFs0XVs0XTsKCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGRvdWJsZSBmb28oTUFUUklYIGEpOwoKICAgICAgICAgIFR5cGVjYXN0aW5nIG9mIHBvaW50ZXJzIGludG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGlzIG5vdwogICAgICAgICAgaW1wbGVtZW50ZWQgcHJvcGVybHkgd2hlbiBtYWtpbmcgQy9DKysgZnVuY3Rpb24gY2FsbHMuCgozLzYvOTcgIDogRml4ZWQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGJ1ZyBpbiB0aGUgVGNsIE9iamVjdC1vcmllbnRlZAogICAgICAgICAgaW50ZXJmYWNlLiAgV2VsbCwgYWN0dWFsbHksIGRpZG4ndCBmaXggaXQgYnV0IGlzc3VlZCBhCiAgICAgICAgICBUY2wgZXJyb3IgaW5zdGVhZC4gICBUaGUgYnVnIHdvdWxkIG1hbmlmZXN0IGl0c2VsZiBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XSAgICAgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJSBzZXQgbSBbTGlzdCAtdGhpcyAkbF0gICMgTWFrZSAkbSBpbnRvIGFuIG9iamVjdCBhc3N1bWluZyAkbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIGEgcG9pbnRlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTaW5jZSAkbSA9PSAkbCwgJGwgZ2V0cyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoc2luY2UgaXRzIHRoZSBzYW1lIGNvbW1hbmQgbmFtZSkKICAgICAgICAgICAgICAgICAlICRtIGluc2VydCBGb28KICAgICAgICAgICAgICAgICBTZWdtZW50YXRpb24gZmF1bHQgICAgICAgIyBOb3RlIDogdGhlIGxpc3Qgbm8gbG9uZ2VyIGV4aXN0cyEKCiAgICAgICAgICBOb3csIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIGluc3RlYWQgb2YgcmVkZWZpbmluZyB0aGUgY29tbWFuZC4KICAgICAgICAgIEFzIGluIDoKCiAgICAgICAgICAgICAgICAgJSBzZXQgbCBbTGlzdF0KICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXQogICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lIGFscmVhZHkgZXhpc3RzIQoKICAgICAgICAgIFVzZSBjYXRjaHt9IHRvIGlnbm9yZSB0aGUgZXJyb3IuCgozLzMvOTcgIDogQmV0dGVyIHN1cHBvcnQgZm9yIGVudW1zIGFkZGVkLiAgIERhdGF0eXBlcyBvZiAnZW51bSBNeUVudW0nCiAgICAgICAgICBhbmQgdHlwZWRlZnMgc3VjaCBhcyAndHlwZWRlZiBlbnVtIE15RW51bSBGb287JyBub3cgd29yay4KCjMvMy85NyAgOiBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICBpbnQgYSxiOwogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyhpbnQgaSkgOiBhKDApLCBiKGkpLCBCYXIoaSwwKSB7IH07CiAgICAgICAgICAgICAgIH07CgozLzMvOTcgIDogTW9kaWZpZWQgcGFyc2VyIHRvIGlnbm9yZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpIHRocm93KFgsWSk7CgozLzMvOTcgIDogQWRkZWQgJWltcG9ydCBkaXJlY3RpdmUuICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAlZXh0ZXJuCiAgICAgICAgICBleGNlcHQgaXQgdGVsbHMgdGhlIGxhbmd1YWdlIG1vZHVsZSB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICBjb21pbmcgZnJvbSBhIHNlcGFyYXRlIG1vZHVsZS4gICBUaGlzIGlzIHVzdWFsbHkgb25seQogICAgICAgICAgbmVlZGVkIHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLgoKMy8yLzk3ICA6IENoYW5nZWQgcG9pbnRlciB0eXBlLWNoZWNrZXIgdG8gYmUgc2lnbmlmaWNhbnRseSBtb3JlCiAgICAgICAgICBlZmZpY2llbnQgd2hlbiB3b3JraW5nIHdpdGggZGVyaXZlZCBkYXRhdHlwZXMuICBUaGlzCiAgICAgICAgICBoYXMgYmVlbiBhY2NvbXBsaXNoZWQgYnkgc3RvcmluZyB0eXBlLW1hcHBpbmdzIGluIHNvcnRlZAogICAgICAgICAgb3JkZXIsIHVzaW5nIGJpbmFyeSBzZWFyY2ggc2NoZW1lcywgYW5kIGNhY2hpbmcgcmVjZW50bHkKICAgICAgICAgIHVzZWQgZGF0YXR5cGVzLiAgIEZvciBTV0lHIGdlbmVyYXRlZCBDKysgbW9kdWxlcyB0aGF0CiAgICAgICAgICBtYWtlIGEgbGFyZ2UgbnVtYmVyIG9mIEMgZnVuY3Rpb24gY2FsbHMgd2l0aCBkZXJpdmVkIHR5cGVzLAogICAgICAgICAgdGhpcyBjb3VsZCByZXN1bHQgaW4gc3BlZWR1cHMgb2YgYmV0d2VlbiAxMDAgYW5kIDUwMDAwIHBlcmNlbnQuCiAgICAgICAgICBIb3dldmVyLCBkdWUgdG8gdGhlIHJlcXVpcmVkIHNvcnRpbmcgb3BlcmF0aW9uLCBtb2R1bGUKICAgICAgICAgIGxvYWRpbmcgdGltZSBtYXkgaW5jcmVhc2VkIHNsaWdodGx5IHdoZW4gdGhlcmUgYXJlIGxvdHMgb2YKICAgICAgICAgIGRhdGF0eXBlcy4KCjMvMi85NyAgOiBGaXhlZCBzb21lIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIFB5dGhvbgogICAgICAgICAgZW1iZWQuaSBsaWJyYXJ5IGZpbGVzLgoKMi8yNy85NyA6IFNsaWdodCBjaGFuZ2UgdG8gQysrIGNvZGUgZ2VuZXJhdGlvbiB0byB1c2UgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgIHdoZW4gcmV0dXJuaW5nIGNvbXBsZXggZGF0YSB0eXBlIGJ5IHZhbHVlLgoKMi8yNi85NyA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHdpdGggLWMgb3B0aW9uLgoKMi8yNi85NyA6IFNsaWdodCB0d2VhayBvZiBwYXJzZXIgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bWVyYXRpb25zCiAgICAgICAgICBzdWNoIGFzCgogICAgICAgICAgICAgICAgZW51bSBWYWx1ZSAoQUxFLCBTVE9VVCwgTEFHRVIsIH07CgoyLzI1Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiBUY2wgbW9kdWxlIHdoZW4gdXNpbmcgdGhlCiAgICAgICAgICAlbmFtZSgpIGRpcmVjdGl2ZSBvbiBhIGNsYXNzbmFtZS4KCjIvMjUvOTcgOiBGaW5pc2hlZCBjb2RlLXNpemUgb3B0aW1pemF0aW9uIG9mIEMrKyBjb2RlIGdlbmVyYXRpb24gd2l0aAogICAgICAgICAgaW5oZXJpdGFuY2Ugb2YgYXR0cmlidXRlcy4gICAgSW5oZXJpdGVkIGF0dHJpYnV0ZXMgbm93CiAgICAgICAgICBvbmx5IGdlbmVyYXRlIG9uZSBzZXQgb2Ygd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgcmUtdXNlZAogICAgICAgICAgaW4gYW55IGRlcml2ZWQgY2xhc3Nlcy4gICBUaGlzIGNvdWxkIHByb3ZpZGUgYmlnIGNvZGUKICAgICAgICAgIHNpemUgaW1wcm92ZW1lbnRzIGluIHNvbWUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMuCgoyLzI1Lzk3IDogUGVybDUgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgYm90aCB0aGUgVW5peCBhbmQgV2luZG93cwogICAgICAgICAgdmVyc2lvbnMuICBUaGUgd2luZG93cyB2ZXJzaW9uIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHRoZQogICAgICAgICAgQWN0aXZld2FyZSBwb3J0IG9mIFBlcmwgNS4wMDMgcnVubmluZyB1bmRlciBXaW5kb3dzIDk1LgogICAgICAgICAgVGhlIEMgc291cmNlIGdlbmVyYXRlZCBieSBTV0lHIHNob3VsZCBjb21waWxlIHdpdGhvdXQKICAgICAgICAgIG1vZGlmaWNhdGlvbiB1bmRlciBib3RoIHZlcnNpb25zIG9mIFBlcmwsIGJ1dCBpcyBub3cKICAgICAgICAgIGV2ZW4gbW9yZSBoaWRlb3VzIHRoYW4gYmVmb3JlLgoKMi8yNS85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBzY29wZSByZXNvbHV0aW9uIG9wZXJhdGlvbiB0bwogICAgICAgICAgYXBwZWFyIGluIGV4cHJlc3Npb25zIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBhcyBpbiA6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IGEgPSAgQmFyOjpkZWZ2YWx1ZSk7CgoyLzI1Lzk3IDogRml4ZWQgYnVnIHdoZW4gcmVzb2x2aW5nIHN5bWJvbHMgaW5zaWRlIEMrKyBjbGFzc2VzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZW51bSBWYWx1ZSB7QUxFLCBTVE9VVCwgTEFHRVJ9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB2b2lkIGRlZmFyZyhWYWx1ZSB2ID0gU1RPVVQpOwoKICAgICAgICAgICAgICB9OwoKMi8yNC85NyA6IEZpeGVkIGJ1ZyB3aXRoIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjIvMjMvOTcgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHRvIGJlIGJldHRlciBiZWhhdmVkIHVuZGVyIFdpbmRvd3MKCiAgICAgICAgICAgIC0gIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBub3cgcHJvcGVybHkgZXhwb3J0ZWQuCiAgICAgICAgICAgICAgIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGV4cGxpY2l0bHkgZXhwb3J0IHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAgeW91cnNlbGYuCgogICAgICAgICAgICAtICBCaXphcnJlIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIKICAgICAgICAgICAgICAgY29kZSBhcyBBTlNJIEMgdW5kZXIgVmlzdWFsIEMrKyA0LnggZml4ZWQuCgogICAgICAgICAgICAtICBUZXN0ZWQgd2l0aCBib3RoIHRoZSBzdG9jayBQeXRob24tMS40IGRpc3RyaWJ1dGlvbiBhbmQgUHl0aG9ud2luCiAgICAgICAgICAgICAgIHJ1bm5pbmcgdW5kZXIgV2luOTUuCgoyLzE5Lzk3IDogRml4ZWQgdHlwZWRlZiBoYW5kbGluZyBidWcgaW4gUGVybDUgc2hhZG93IGNsYXNzZXMuCgoyLzE5Lzk3IDogQWRkZWQgZXhjZXB0aW9uIHN1cHBvcnQuICBUbyB1c2UgaXQsIGRvIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICAlZXhjZXB0KGxhbmcpIHsKICAgICAgICAgICAgICAgICAgLi4uIHRyeSBwYXJ0IG9mIHRoZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAuLi4gY2F0Y2ggcGFydCBvZiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICRmdW5jdGlvbiBpcyBhIFNXSUcgdmFyaWFibGUgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZQogICAgICAgICAgYWN0dWFsIEMvQysrIGZ1bmN0aW9uIGNhbGwgaW4gYSB3cmFwcGVyIGZ1bmN0aW9uLiAgVGh1cywKICAgICAgICAgIGEgcmVhbCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgJWV4Y2VwdChwZXJsNSkgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoY2hhciAqJiBzeikgewogICAgICAgICAgICAgICAgICAgIC4uLiBwcm9jZXNzIGFuIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgfSBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICBjcm9haygiVW5rbm93biBleGNlcHRpb24uIEJhaWxpbmcgb3V0Li4uIik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KCjIvMTkvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBtYW5hZ2luZyBnZW5lcmljIGNvZGUgZnJhZ21lbnRzIChuZWVkZWQKICAgICAgICAgIGZvciBleGNlcHRpb25zKS4KCjIvMTkvOTcgOiBGaXhlZCBzb21lIHJlYWxseSBvYnNjdXJlIHR5cGVtYXAgc2NvcGluZyBidWdzIGluIHRoZSBDKysKICAgICAgICAgIGhhbmRsZXIuCgoyLzE4Lzk3IDogQ2xlYW5lZCB1cCBwZXJsbWFpbi5pIGZpbGUgYnkgcmVtb3Zpbmcgc29tZSBwcm9ibGVtYXRpYywKICAgICAgICAgIGJ1dCBzZWVtaW5nbHkgdW5uZWNlc3NhcnkgZGVjbGFyYXRpb25zLgoKMi8xOC85NyA6IE9wdGltaXplZCBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb25zIHVuZGVyIGluaGVyaXRhbmNlLgogICAgICAgICAgU1dJRyBjYW4gbm93IHVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIGEKICAgICAgICAgIGJhc2UgY2xhc3MgaW5zdGVhZCBvZiByZWdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yCiAgICAgICAgICB0aGUgc2FtZSBmdW5jdGlvbnMgaW4gYSBkZXJpdmVkIGNsYXNzLiAgICBUaGlzIGNvdWxkCiAgICAgICAgICBtYWtlIGEgZHJhc3RpYyByZWR1Y3Rpb24gaW4gd3JhcHBlciBjb2RlIHNpemUgZm9yIEMrKwogICAgICAgICAgYXBwbGljYXRpb25zIHdpdGggZGVlcCBpbmhlcml0YW5jZSBoaWVyYXJjaGllcyBhbmQKICAgICAgICAgIGxvdHMgb2YgZnVuY3Rpb25zLgoKMi8xOC85NyA6IEFkZGl0aW9uYWwgbWV0aG9kcyBzcGVjaWZpZWQgd2l0aCAlYWRkbWV0aG9kcyBjYW4gbm93CiAgICAgICAgICBiZSBpbmhlcml0ZWQgYWxvbmcgd2l0aCBub3JtYWwgQysrIG1lbWJlciBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogTWlub3IgaW50ZXJuYWwgZml4ZXMgdG8gbWFrZSBTV0lHJ3Mgc3RyaW5nIGhhbmRsaW5nIGEgbGl0dGxlCiAgICAgICAgICBzYWZlci4KCjIvMTYvOTcgOiBNb3ZlZCBzb21lIGNvZGUgZ2VuZXJhdGlvbiBvZiBUY2wgc2hhZG93IGNsYXNzZXMgdG8KICAgICAgICAgIGxpYnJhcnkgZmlsZXMuCgoyLzE2Lzk3IDogRml4ZWQgZG9jdW1lbnRhdGlvbiBlcnJvciBvZiAnLWNvbmZpZ3VyZScgbWV0aG9kIGluCiAgICAgICAgICBUY2wgbW9kdWxlcy4KCjIvMTYvOTcgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgc2xpZ2h0bHkgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgIHRvIHVzZSBQZXJsIHJlZmVyZW5jZXMuCgoyLzEyLzk3IDogRml4ZWQgYXJndW1lbnQgY2hlY2tpbmcgYnVnIHRoYXQgd2FzIGludHJvZHVjZWQgYnkKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIChmdW5jdGlvbiBjYWxscyB3aXRoIHRvbyBtYW55CiAgICAgICAgICBhcmd1bWVudHMgd291bGQgc3RpbGwgYmUgZXhlY3V0ZWQpLiAgRnVuY3Rpb25zIG5vdwogICAgICAgICAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYXMgQyB2ZXJzaW9uCiAgICAgICAgICAod2l0aCBwb3NzaWJpbGl0eSBvZiBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgc3RpbGwgc3VwcG9ydGVkKS4KCjIvMTIvOTcgOiBGaXhlZCBkZWZhdWx0IGFyZ3VtZW50IGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgZ2VuZXJhdGluZyB3cmFwcGVyIGZ1bmN0aW9ucyBpbnZvbHZpbmcgZGVmYXVsdAogICAgICAgICAgYXJndW1lbnRzIG9mIGNvbXBsZXggZGF0YXR5cGVzLgoKMi8xMi85NyA6IEZpeGVkIHR5cGVtYXAgc2NvcGluZyBwcm9ibGVtcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIGdldCBhIGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBkb3VibGUgYmFyKGRvdWJsZSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gbmV3IGdldCBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgYXBwbHkgdGhlIHNlY29uZCB0eXBlbWFwIHRvIGFsbCBmdW5jdGlvbnMgaW4gRm9vCiAgICAgICAgICBkdWUgdG8gZGVsYXllZCBnZW5lcmF0aW9uIG9mIEMrKyB3cmFwcGVyIGNvZGUgKGNsZWFybHkgdGhpcwogICAgICAgICAgaXMgbm90IHRoZSBkZXNpcmVkIGVmZmVjdCkuICAgUHJvYmxlbSBoYXMgYmVlbiBmaXhlZCBieQogICAgICAgICAgYXNzaWduaW5nIHVuaXF1ZSBudW1lcmljYWwgaWRlbnRpZmllcnMgdG8gZXZlcnkgZGF0YXR5cGUgaW4KICAgICAgICAgIGFuIGludGVyZmFjZSBmaWxlIGFuZCByZWNvcmRpbmcgdGhlICJyYW5nZSBvZiBlZmZlY3QiIG9mIGVhY2gKICAgICAgICAgIHR5cGVtYXAuCgoyLzExLzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgImlnbm9yZSIgYW5kICJkZWZhdWx0IiB0eXBlbWFwcy4gIE9ubHkgdXNlCiAgICAgICAgICBpZiB5b3UgYWJzb2x1dGVseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgoKMi85Lzk3ICA6IEFkZGVkIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvcgogICAgICAgICAgQyBzdHJ1Y3RzIGFuZCBDKysgY2xhc3NlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGFueSBzb3J0IG9mCiAgICAgICAgICBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZCBieQogICAgICAgICAgcnVubmluZyBTV0lHIHdpdGggdGhlICctbWFrZV9kZWZhdWx0JyBvcHRpb24gb3IgYnkgaW5zZXJ0aW5nCiAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbnRvIGFuIGludGVyZmFjZSBmaWxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYSBtYWtlX2RlZmF1bHQKCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHByYWdtYSBkaXNhYmxlcyBhdXRvbWF0aWMgY29uc3RydWN0b3IgZ2VuZXJhdGlvbgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQKCjIvOS85NyAgOiBBZGRlZCAtbWFrZV9kZWZhdWx0IG9wdGlvbiBmb3IgcHJvZHVjaW5nIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgZm9yIGNsYXNzZXMgd2l0aG91dCB0aGVtLgoKMi85Lzk3ICA6IENoYW5nZWQgdGhlIHN5bnRheCBvZiB0aGUgU1dJRyAlcHJhZ21hIGRpcmVjdGl2ZSB0bwogICAgICAgICAgJXByYWdtYSBvcHRpb249dmFsdWUgb3IgJXByYWdtYShsYW5nKSBvcHRpb249dmFsdWUuCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYWtlcyB0aGUgc3ludGF4IGEgbGl0dGxlIG1vcmUgY29uc2lzdGVudAogICAgICAgICAgYmV0d2VlbiBnZW5lcmFsIHByYWdtYXMgYW5kIGxhbmd1YWdlLXNwZWNpZmljIHByYWdtYXMuCiAgICAgICAgICBUaGUgb2xkIHN5bnRheCBzdGlsbCB3b3JrcywgYnV0IHdpbGwgcHJvYmFibHkgYmUgcGhhc2VkCiAgICAgICAgICBvdXQgKGEgd2FybmluZyBtZXNzYWdlIGlzIGN1cnJlbnRseSBwcmludGVkKS4KCjIvOS85NyAgOiBJbXByb3ZlZCBUY2wgc3VwcG9ydCBvZiBnbG9iYWwgdmFyaWFibGVzIHRoYXQgYXJlIG9mCiAgICAgICAgICBzdHJ1Y3R1cmVzLCBjbGFzc2VzLCBhbmQgdW5pb25zLgoKMi85Lzk3ICA6IEZpeGVkIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtIGluIFB5dGhvbiAnZW1iZWQuaScgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIG1pc3NpbmcgcmV0dXJuIHZhbHVlIGluIHBlcmxtYWluLmkgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byByZXR1cm4gYW4gQXR0cmlidXRlRXJyb3Igd2hlbgogICAgICAgICAgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2VkIChvbGRlciB2ZXJzaW9ucyByZXR1cm5lZAogICAgICAgICAgYSBOYW1lRXJyb3IpLgoKMi85Lzk3ICA6IEZpeGVkIGJ1ZyB3aGVuICVhZGRtZXRob2RzIGlzIHVzZWQgYWZ0ZXIgYSBjbGFzcyBkZWZpbml0aW9uIHdob3NlCiAgICAgICAgICBsYXN0IHNlY3Rpb24gaXMgcHJvdGVjdGVkIG9yIHByaXZhdGUuCgoyLzgvOTcgIDogTWFkZSBzbGlnaHQgY2hhbmdlcyBpbiBpbmNsdWRlIGZpbGUgcHJvY2Vzc2luZyB0byBzdXBwb3J0CiAgICAgICAgICB0aGUgTWFjaW50b3NoLgoKMi84Lzk3ICA6IEV4dGVuZGVkIHN3aWdtYWluLmN4eCB0byBwcm92aWRlIGEgcnVkaW1lbnRhcnkgTWFjaW50b3NoIGludGVyZmFjZS4KICAgICAgICAgIEl0J3MgYSByZWFsbHkgYmFkIGludGVyZmFjZSwgYnV0IHdvcmtzIHVudGlsIHNvbWV0aGluZyBiZXR0ZXIKICAgICAgICAgIGlzIHdyaXR0ZW4uCgoxLzI5Lzk3IDogRml4ZWQgdHlwZS1jYXN0aW5nIGJ1ZyBpbnRyb2R1Y2VkIGJ5IDEuMWI0IHdoZW4gc2V0dGluZy9nZXR0aW5nIHRoZQogICAgICAgICAgdmFsdWUgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbnZvbHZpbmcgY29tcGxleCBkYXRhIHR5cGVzLgoKMS8yOS85NyA6IFJlbW92ZWQgZXJyb25lb3VzIHdoaXRlIHNwYWNlIGJlZm9yZSBhbiAjZW5kaWYgaW4gdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICBieSB0aGUgUHl0aG9uIG1vZHVsZSAod2FzIGNhdXNpbmcgZXJyb3JzIG9uIERFQyBBbHBoYSBjb21waWxlcnMpLgoKMS8yNi85NyA6IEZpeGVkIGVycm9ycyB3aGVuIHVzaW5nIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGluIFB5dGhvbiBzaGFkb3cKCSAgc2hhZG93IGNsYXNzZXMuCgoxLzIzLzk3IDogRml4ZWQgYnVnIHdpdGggbmVzdGVkICVleHRlcm4gZGVjbGFyYXRpb25zLgoKMS8yMS85NyA6IEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIGludm9sdmluZyBjb25zdCBkYXRhdHlwZXMuCgoxLzIxLzk3IDogU29tZXdoYXQgb2JzY3VyZSwgYnV0IHNlcmlvdXMgYnVnIHdpdGggaGF2aW5nIG11bHRpcGxlIGxldmVscwogICAgICAgICAgb2YgdHlwZWRlZnMgZml4ZWQuICBGb3IgZXhhbXBsZSA6CgoJCXR5cGVkZWYgY2hhciAqU3RyaW5nOwogICAgICAgICAgICAgICAgdHlwZWRlZiBTdHJpbmcgIE5hbWU7CgpWZXJzaW9uIDEuMSBCZXRhNCAoSmFudWFyeSAxNiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogU1dJRyAxLjFiMyBjcmFzaGVkIGFuZCBidXJuZWQgc2hvcnRseSBhZnRlciB0YWtlIG9mZiBkdWUKdG8gYSBmZXcgbWFqb3IgcnVuLXRpbWUgcHJvYmxlbXMgdGhhdCBzdXJmYWNlZCBhZnRlciByZWxlYXNlLgpUaGlzIHJlbGVhc2Ugc2hvdWxkIGZpeCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aG9zZSBwcm9ibGVtcy4KCjEvMTYvOTcgOiBGaXhlZCBtYWpvciBtZW1vcnkgbWFuYWdlbWVudCBidWcgb24gTGludXgKCjEvMTQvOTcgOiBGaXhlZCBidWcgaW4gZnVuY3Rpb25zIHJldHVybmluZyBjb25zdGFudCBDKysgcmVmZXJlbmNlcy4KCjEvMTQvOTcgOiBNb2RpZmllZCBDKysgbW9kdWxlIHRvIGhhbmRsZSBkYXRhdHlwZXMgYmV0dGVyLgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBhICpzaW5nbGUqIHNjb3BlIHJlc29sdXRpb24KICAgICAgICAgIG9wZXJhdG9yIGluIGRhdGF0eXBlcy4gIEllIDogRm9vOjpiYXIuICAgU1dJRyBkb2Vzbid0CiAgICAgICAgICB5ZXQgaGFuZGxlIG5lc3RlZCBjbGFzc2VzLCBzbyB0aGlzIHNob3VsZCBiZQogICAgICAgICAgc3VmZmljaWVudCBmb3Igbm93LgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyB0eXBlZGVmIGluc2lkZSBhIEMrKyBjbGFzcy4KCjEvMTQvOTcgOiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gZGF0YXR5cGVzIGRlZmluZWQgaW5zaWRlCiAgICAgICAgICBhIEMrKyBjbGFzcy4gIFNXSUcgd2FzIG5vdCBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZSwKICAgICAgICAgIGJ1dCBhIG5ldyBzY29waW5nIG1lY2hhbmlzbSBhbmQgbWV0aG9kIGZvciBoYW5kbGluZwogICAgICAgICAgZGF0YXR5cGVzIGluc2lkZSBhIEMrKyBjbGFzcyBoYXZlIGJlZW4gYWRkZWQuCgoxLzE0Lzk3IDogQ2hhbmdlZCBlbnVtZXJhdGlvbnMgdG8gdXNlIHRoZSB2YWx1ZSBuYW1lIGluc3RlYWQKICAgICAgICAgIG9mIGFueSB2YWx1ZXMgdGhhdCBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnRlcmZhY2UKICAgICAgICAgIGZpbGUuICBUaGlzIG1ha2VzIHRoZSBjb2RlIGEgbGl0dGxlIG1vcmUgZnJpZW5kbHkgdG8KICAgICAgICAgIEMrKyBjb21waWxlcnMuCgoxLzE0Lzk3IDogUmVtb3ZlZCB0eXBlZGVmIGJ1ZyB0aGF0IG1hZGUgYWxsIGVudW1lcmF0aW9ucwogICAgICAgICAgZXF1aXZhbGVudCB0byBlYWNoIG90aGVyIGluIHRoZSB0eXBlIGNoZWNrZXIgKHNpbmNlCiAgICAgICAgICBpdCBnZW5lcmF0ZWQgYWxvdCBvZiB1bm5lY2Vzc2FyeSBjb2RlKS4KClZlcnNpb24gMS4xIEJldGEzIChKYW51YXJ5IDksIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogQSAqaHVnZSogbnVtYmVyIG9mIGNoYW5nZXMgcmVsYXRlZCB0byBvbmdvaW5nIG1vZGlmaWNhdGlvbnMuCgoxLiAgU3VwcG9ydCBmb3IgQysrIG11bHRpcGxlIGluaGVyaXRhbmNlIGFkZGVkLgoKMi4gIFR5cGVtYXBzIGFkZGVkLgoKMy4gIFNvbWUgc3VwcG9ydCBmb3IgbmVzdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhZGRlZC4KCjQuICBEZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nIGFkZGVkLgoKNS4gIC1jIG9wdGlvbiBhZGRlZCBmb3IgYnVpbGRpbmcgYmFyZSB3cmFwcGVyIGNvZGUgbW9kdWxlcy4KCjYuICBSZXdyb3RlIFBvaW50ZXIgdHlwZS1jaGVja2luZyB0byBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlCiAgICBjb3JyZWN0bHkuCgo3LiAgVGNsIDguMCBtb2R1bGUgYWRkZWQuCgo4LiAgUGVybDQgYW5kIEd1aWxlIG1vZHVsZXMgcmVzdXJyZWN0ZWQgZnJvbSB0aGUgZGVhZCAod2VsbCwgdGhleQogICAgYXQgbGVhc3Qgd29yayBhZ2FpbikuCgo5LiAgTmV3IE9iamVjdCBPcmllbnRlZCBUY2wgaW50ZXJmYWNlIGFkZGVkLgoKMTAuIEJ1ZyBmaXhlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjExLiBDbGVhbmVkIHVwIG1hbnkgb2YgdGhlIGludGVybmFsIG1vZHVsZXMgb2YgdGhlIHBhcnNlci4KCjEyLiBUb25zIG9mIGV4YW1wbGVzIGFuZCB0ZXN0aW5nIG1vZHVsZXMgYWRkZWQuCgoxMy4gRml4ZWQgYnVncyByZWxhdGVkIHRvIHVzZSBvZiAiY29uc3QiIHJldHVybiB2YWx1ZXMuCgoxNC4gRml4ZWQgYnVnIHdpdGggQysrIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjE1LiBDaGFuZ2VkIFNXSUcgY29uZmlndXJhdGlvbiBzY3JpcHQuCgpWZXJzaW9uIDEuMSBCZXRhMiAoRGVjZW1iZXIgMywgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgY2hhbmdlcwogICBpbnZvbHZlZCBhcmUgdG9vIG51bWVyb3VzIHRvIG1lbnRpb24uICBCYXNpY2FsbHksIHRha2UgZXZlcnl0aGluZwogICB5b3Uga25ldyBhYm91dCB0aGUgb2xkIHN5c3RlbSwgdGhyb3cgdGhlbSBvdXQsIGFuZCByZWFkIHRoZQogICBmaWxlIERvYy9kb2MucHMuCgoyLiBMaW1pdGVkIHN1cHBvcnQgZm9yICNpZiBkZWZpbmVkKCkgYWRkZWQuCgozLiBUeXBlIGNhc3RzIGFyZSBub3cgYWxsb3dlZCBpbiBjb25zdGFudCBleHByZXNzaW9ucy4gIGllCgogICAgICAgICAjZGVmaW5lICBBICAgKGludCkgMwoKNC4gQWRkZWQgc3VwcG9ydCBmb3IgdHlwZWRlZiBsaXN0cy4gIEZvciBleGFtcGxlIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgICAgIGRvdWJsZSB4LHksejsKICAgICAgICB9IFZlY3RvciwgKlZlY3RvclB0cjsKCjUuIE5ldyBTV0lHIGRpcmVjdGl2ZXMgKHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbiBzeXN0ZW0pCgoJJXN0eWxlCgklbG9jYWxzdHlsZQoJJXN1YnNlY3Rpb24KCSVzdWJzdWJzZWN0aW9uCgo2LiBSZW9yZ2FuaXplZCB0aGUgQysrIGhhbmRsaW5nIGFuZCBtYWRlIGl0IGEgbGl0dGxlIGVhc2llciB0bwogICB3b3JrIHdpdGggaW50ZXJuYWxseS4KCjcuICBGaXhlZCBwcm9ibGVtIHdpdGggaW5oZXJpdGluZyBkYXRhIG1lbWJlcnMgaW4gUHl0aG9uCiAgICBzaGFkb3cgY2xhc3Nlcy4KCjguICBGaXhlZCBzeW1ib2wgdGFibGUgcHJvYmxlbXMgd2l0aCBzaGFkb3cgY2xhc3NlcyBpbiBib3RoCiAgICBQeXRob24gYW5kIFBlcmwuCgo5LiAgRml4ZWQgYW5ub3lpbmcgc2VnbWVudGF0aW9uIGZhdWx0IGJ1ZyBpbiB3cmFwcGVyIGNvZGUKICAgIGdlbmVyYXRlZCBmb3IgUGVybDUuCgoxMC4gRml4ZWQgYnVnIHdpdGggJWFkZG1ldGhvZHMgZGlyZWN0aXZlLiAgTm93IGl0IGNhbiBiZSBwbGFjZWQKICAgIGFueXdoZXJlIGluIGEgY2xhc3MuCgoxMS4gTW9yZSB0ZXN0IGNhc2VzIGFkZGVkIHRvIHRoZSBTV0lHIHNlbGYtdGVzdC4gICBEb2N1bWVudGF0aW9uCiAgICB0ZXN0cyBhcmUgbm93IHBlcmZvcm1lZCBhbG9uZyB3aXRoIG90aGVyIHRoaW5ncy4KCjEyLiBSZW9yZ2FuaXplZCB0aGUgU1dJRyBsaWJyYXJ5IGEgbGl0dGxlIGJpdCBhbmQgc2V0IGl0IHVwIHRvCiAgICBzZWxmLWRvY3VtZW50IGl0c2VsZiB1c2luZyBTV0lHLgoKMTMuIExvdHMgYW5kIGxvdHMgb2YgbWlub3IgYnVnIGZpeGVzIChtb3N0bHkgb2JzY3VyZSwgYnV0IGJ1Z3MKICAgIG5vbmV0aGVsZXNzKS4KCgpWZXJzaW9uIDEuMSBCZXRhMSAoT2N0b2JlciAzMCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBBZGRlZCBuZXcgJWV4dGVybiBkaXJlY3RpdmUgZm9yIGhhbmRsaW5nIG11bHRpcGxlIGZpbGVzCgoyLiBQZXJsNSBzaGFkb3cgY2xhc3NlcyBhZGRlZAoKMy4gUmV3cm90ZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byB3b3JrIGJldHRlcgoKNC4gQWRkZWQgJ2Jvb2wnIGRhdGF0eXBlCgo1LiAleywlfSBibG9jayBpcyBub3cgb3B0aW9uYWwuCgo2LiBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgbW9kdWxlCgo3LiBSZXdyb3RlIGFsbCBvZiB0aGUgU1dJRyB0ZXN0cyB0byBiZSBtb3JlIGluZm9ybWF0aXZlCiAgIChhbmQgbGVzcyBzY2FyeSkuCgo4LiBSZXdyb3RlIHBhcmFtZXRlciBsaXN0IGhhbmRsaW5nIHRvIGJlIG1vcmUgbWVtb3J5CiAgIGVmZmljaWVudCBhbmQgZmxleGlibGUuCgo5LiBDaGFuZ2VkIHBhcnNlciB0byBpZ25vcmUgJ3N0YXRpYycgZGVjbGFyYXRpb25zLgoKMTAuIEluaXRpYWxpemVycyBhcmUgbm93IGlnbm9yZWQuICBGb3IgZXhhbXBsZSA6CgoJc3RydWN0IEZvb0JhciBhID0gezMsNCw1fTsKCjExLiBTb21ld2hhdCBiZXR0ZXIgcGFyc2luZyBvZiBhcnJheXMgKGFsdGhvdWdoIGl0J3MKICAgIHVzdWFsbHkganVzdCBhIGJldHRlciBlcnJvciBtZXNzYWdlIG5vdykuCgoxMi4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzLgoKClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMzEsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBGaXhlZCBtaW5vciBidWcgaW4gQysrIG1vZHVsZQoKMi4gRml4ZWQgbWlub3IgYnVnIGluIHBvaW50ZXIgdHlwZS1jaGVja2VyIHdoZW4gdXNpbmcKICAgLURBTExPV19OVUxMLgoKMy4gRml4ZWQgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrIHdpdGggUHl0aG9uIDEuNGJldGEzCgo0LiBDaGFuZ2VkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aG91dAogICB5YWNjIG9yIGJpc29uLgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAyOCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBDaGFuZ2VkIHBhcnNlciB0byBzdXBwb3J0IG1vcmUgQy9DKysgZGF0YXR5cGVzICh3ZWxsLAogICAgbW9yZSB2YXJpYW50cykuICAgVHlwZXMgbGlrZSAidW5zaWduZWQiLCAic2hvcnQgaW50IiwKICAgICJsb25nIGludCIsIGV0Yy4uLiBub3cgd29yay4KCjIuICAidW5pb25zIiBhZGRlZCB0byBwYXJzZXIuCgozLiAgVXNlIG9mICJ0eXBlZGVmIiBhcyBpbiA6CgoJdHlwZWRlZiBzdHJ1Y3QgewoJICAgICBkb3VibGUgeCx5LHo7Cgl9IFZlY3RvcjsKCiAgICBOb3cgd29ya3MgY29ycmVjdGx5LiAgIFRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGlzIHVzZWQgYXMKICAgIHRoZSBzdHJ1Y3R1cmUgbmFtZS4KCjQuICBDb25kaXRpb25hbCBjb21waWxhdGlvbiB3aXRoICNpZmRlZiwgI2Vsc2UsICNlbmRpZiwgZXRjLi4uCiAgICBhZGRlZC4KCjUuICBOZXcgJWRpc2FibGVkb2MsICVlbmFibGVkb2MgZGlyZWN0aXZlcyBhbGxvdyBkb2N1bWVudGF0aW9uCiAgICB0byBzZWxlY3RpdmVseSBiZSBkaXNhYmxlZCBmb3IgY2VydGFpbiBwYXJ0cyBvZiBhIHdyYXBwZXIKICAgIGZpbGUuCgo2LiAgTmV3IFB5dGhvbiBtb2R1bGUgc3VwcG9ydHMgYmV0dGVyIHZhcmlhYmxlIGxpbmtpbmcsIGNvbnN0YW50cywKICAgIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjcuICBQZXJsNSBtb2R1bGUgaW1wcm92ZWQgd2l0aCBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFhTCiAgICBhbmQgeHN1YnBwLiAgIFNXSUcgcG9pbnRlcnMgYW5kIG5vdyBjcmVhdGVkIHNvIHRoYXQgdGhleQogICAgYXJlIGNvbXBhdGlibGUgd2l0aCB4c3VicHAgcG9pbnRlcnMuCgo4LiAgU3VwcG9ydCBmb3IgW2luY3IgVGNsXSBuYW1lc3BhY2VzIGFkZGVkIHRvIFRjbCBtb2R1bGUuCgo5LiAgJXByYWdtYSBkaXJlY3RpdmUgYWRkZWQuCgoxMC4gJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGFkZGVkLgoKMTEuICVuYXRpdmUgZGlyZWN0aXZlIGFkZGVkIHRvIGFsbG93IHByZS1leGlzdGluZyB3cmFwcGVyIGZ1bmN0aW9ucwogICAgdG8gYmUgdXNlZC4KCjEyLiBXcm90ZSBjb25maWd1cmUgc2NyaXB0IGZvciBTV0lHIGluc3RhbGxhdGlvbi4KCjEzLiBGdW5jdGlvbiBwb2ludGVycyBub3cgYWxsb3dlZCB3aXRoIHR5cGVkZWYgc3RhdGVtZW50cy4KCjE0LiAldHlwZWRlZiBtb2RpZmllZCB0byBpbnNlcnQgYSBjb3JyZXNwb25kaW5nIEMgdHlwZWRlZiBpbnRvCiAgICB0aGUgb3V0cHV0IGZpbGUuCgoxNS4gRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIEMrKyByZWZlcmVuY2VzLgoKMTYuIE5ldyBTdHJpbmcgYW5kIFdyYXBwZXJGdW5jdGlvbiBjbGFzc2VzIGFkZCB0byBtYWtlIGdlbmVyYXRpbmcKICAgIHdyYXBwZXIgY29kZSBlYXNpZXIuCgoxNy4gRml4ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiBwcm9jZXNzaW5nIHRvIGVsaW1pbmF0ZSBjb3JlIGR1bXBzCiAgICBhbmQgdG8gYWxsb3cgaGVscCBtZXNzYWdlcy4KCjE4LiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMgdG8gYWxtb3N0IGFsbCBjb2RlIG1vZHVsZXMKCgpWZXJzaW9uIDEuMCBCZXRhIDMgKFBhdGNoIDEpIEp1bHkgMTcsIDE5OTYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLjAgRmluYWwgaXMgbm90IHF1aXRlIHJlYWR5IHlldCwgYnV0IHRoaXMgcmVsZWFzZSBmaXhlcyBhCm51bWJlciBvZiBpbW1lZGlhdGUgcHJvYmxlbXMgOgoKMS4gIENvbXBpbGVyIGVycm9ycyB3aGVuIHVzaW5nIC1zdHJpY3QgMSB0eXBlIGNoZWNraW5nIGhhdmUgYmVlbiBmaXhlZC4KCjIuICBQb2ludGVyIHR5cGUgY2hlY2tlciBub3cgcmVjb2duaXplcyBwb2ludGVycyBvZiB0aGUgZm9ybQogICAgXzBfVHlwZSBjb3JyZWN0bHkuCgozLiAgQSBmZXcgbWlub3IgZml4ZXMgd2VyZSBtYWRlIGluIHRoZSBNYWtlZmlsZQoKVmVyc2lvbiAxLjAgQmV0YSAzIChKdW5lIDE0LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKVGhlcmUgYXJlIGxvdHMgb2YgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2UgOgoKMS4gIFNXSUcgaXMgbm93IGludm9rZWQgdXNpbmcgdGhlICJzd2lnIiBjb21tYW5kIGluc3RlYWQgb2YgIndyYXAiLgogICAgSGV5LCBzd2lnIHNvdW5kcyBjb29sZXIuCgoyLiAgVGhlIFNXSUdfTElCIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gY2hhbmdlIHRoZQogICAgbG9jYXRpb24gd2hlcmUgU1dJRyBsb29rcyBmb3IgbGlicmFyeSBmaWxlcy4KCjMuICBDKysgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gICBZb3Ugc2hvdWxkIHVzZSB0aGUgLWMrKyBvcHRpb24KICAgIHRvIGVuYWJsZSBpdC4KCjQuICBUaGUgJWluaXQgZGlyZWN0aXZlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4KICAgICVtb2R1bGUgY29uc3RydWN0cyBhIHZhbGlkIG5hbWUgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgZm9yIHdoYXRldmVyIHRhcmdldCBsYW5ndWFnZSB5b3UncmUgdXNpbmcgKGFjdHVhbGx5IHRoaXMgbWFrZXMKICAgIFNXSUcgZmlsZXMgYSBsaXR0bGUgY2xlYW5lcikuICBUaGUgb2xkICVpbml0IGRpcmVjdGl2ZSBzdGlsbCB3b3Jrcy4KCjUuICBUaGUgc3ludGF4IG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgaGFzIGJlZW4gY2hhbmdlZC4gICBVc2Ugb2YgdGhlCiAgICBvbGQgb25lIHNob3VsZCBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IG1heSBzdGlsbCB3b3JrLgoKNi4gIFRvIHN1cHBvcnQgVGNsL1RrIG9uIG5vbi11bml4IHBsYXRmb3JtcywgU1dJRyBpbXBvcnRzIGEgZmlsZSBjYWxsZWQKICAgIHN3aWd0Y2wuY2ZnIGZyb20gdGhlICQoU1dJR19MSUIpL3RjbCBkaXJlY3RvcnkuICAgSSBkb24ndCBoYXZlIGFjY2VzcwogICAgdG8gYW4gTlQgbWFjaGluZSwgYnV0IHRoaXMgZmlsZSBpcyBzdXBwb3NlZGx5IGFsbG93cyBTV0lHIHRvCiAgICBwcm9kdWNlIHdyYXBwZXIgY29kZSB0aGF0IGNvbXBpbGVzIG9uIGJvdGggVU5JWCBhbmQgbm9uIFVOSVggbWFjaGluZXMuCiAgICBJZiB0aGlzIGRvZXNuJ3Qgd29yaywgeW91J2xsIGhhdmUgdG8gZWRpdCB0aGUgZmlsZSBzd2lndGNsLmNmZy4gUGxlYXNlCiAgICBsZXQgbWUga25vdyBpZiB0aGlzIGRvZXNuJ3Qgd29yayBzbyBJIGNhbiB1cGRhdGUgdGhlIGZpbGUgYXMKICAgIG5lY2Vzc2FyeS4KCjcuICBUaGUgU1dJRyBydW4tdGltZSB0eXBlY2hlY2tlciBoYXMgYmVlbiBpbXByb3ZlZC4gICAgWW91IGNhbiBhbHNvCiAgICBub3cgcmVkZWZpbmUgaG93IGl0IHdvcmtzIGJ5IHN1cHBseWluZyBhIGZpbGUgY2FsbGVkICJzd2lncHRyLmNmZyIKICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIFNXSUcgaW50ZXJmYWNlIGZpbGVzLiAgIEJ5IGRlZmF1bHQsCiAgICBTV0lHIHJlYWRzIHRoaXMgZmlsZSBmcm9tICQoU1dJR19MSUIpL2NvbmZpZy4KCjguICBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgOgoKCS0gIERvY3VtZW50YXRpb24gb3JkZXIgaXMgcHJpbnRlZCBpbiBpbnRlcmZhY2UgZmlsZSBvcmRlciBieQogICAgICAgICAgIGRlZmF1bHQuICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwdXR0aW5nIGFuICVhbHBoYQogICAgICAgICAgIGRpcmVjdGl2ZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgLSAgWW91IGNhbiBzdXBwbHkgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIHRleHQgdXNpbmcKCiAgICAgICAgICAgJXRleHQgJXsgcHV0IHlvdXIgdGV4dCBoZXJlICV9CgogICAgICAgIC0gIEEgZmV3IG1pbm9yIGJ1Z3Mgd2VyZSBmaXhlZC4KCjkuICBBIGZldyBpbXByb3ZlbWVudHMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGhhbmRsaW5nIG9mIGNvbW1hbmQgbGluZQogICAgb3B0aW9ucyAoYnV0IGl0J3Mgc3RpbGwgbm90IGZpbmlzaGVkKS4KCjEwLiAgTG90cyBvZiBtaW5vciBidWcgZml4ZXMgaW4gbW9zdCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyBoYXZlIGJlZW4KICAgICBtYWRlLgoKMTEuIEZpbGVuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB0byA4LjMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhIFNXSUcKICAgIHBvcnQgdG8gbm9uLXVuaXggcGxhdGZvcm1zICh3b3JrIGluIHByb2dyZXNzKS4KCjEyLiBDKysgZmlsZSBzdWZmaXggaXMgbm93IC5jeHggKGZvciBzYW1lIHJlYXNvbikuCgoxMy4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBncmFkZWQgc2lnbmlmaWNhbnRseSBhbmQgaXMgbm93CiAgICBhcm91bmQgMTAwIHBhZ2VzLiAgICBJIGFkZGVkIG5ldyBleGFtcGxlcyBhbmQgYSBzZWN0aW9uIG9uCiAgICBDKysuICBUaGUgZG9jdW1lbnRhdGlvbiBub3cgaW5jbHVkZXMgYSBUYWJsZSBvZiBDb250ZW50cy4KCjE0LiBUaGUgU1dJRyBFeGFtcGxlcyBkaXJlY3RvcnkgaXMgc3RpbGwgd29lZnVsbHkgc3BhcnNlLCBidXQgaXMKICAgIGdldHRpbmcgYmV0dGVyLgoKU3BlY2lhbCBub3RpY2UgYWJvdXQgQysrCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGlzIGlzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIFNXSUcgdG8gc3VwcG9ydCBDKysgcGFyc2luZy4gIEN1cnJlbnRseQp0aGUgQysrIGlzIGZhciBmcm9tIGNvbXBsZXRlLCBidXQgc2VlbXMgdG8gd29yayBmb3Igc2ltcGxlIGNhc2VzLgpObyB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gYWRkIHNwZWNpYWwgQysrIHByb2Nlc3NpbmcgdG8gYW55IG9mCnRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiAgIFNlZSB0aGUgdXNlciBtYW51YWwgZm9yIGRldGFpbHMgYWJvdXQgaG93CkMrKyBpcyBoYW5kbGVkLiAgIElmIHlvdSBmaW5kIHByb2JsZW1zIHdpdGggdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwKcGxlYXNlIGxldCBtZSBrbm93LiAgRXhwZWN0IG1ham9yIGltcHJvdmVtZW50cyBpbiB0aGlzIGFyZWEuCgpOb3RlIDogSSBoYXZlIG9ubHkgc3VjY2Vzc2Z1bGx5IHVzZWQgU1dJRyBhbmQgQysrIHdpdGggVGNsIGFuZApQeXRob24uCgpOb3RpY2UgYWJvdXQgVmVyc2lvbiAxLjBGaW5hbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVmVyc2lvbiAxLjBCMyBpcyB0aGUgbGFzdCBCZXRhIHJlbGVhc2UgYmVmb3JlIHZlcnNpb24gMS4wIEZpbmFsIGlzCnJlbGVhc2VkLiAgSSBoYXZlIGZyb3plbiB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAxLjAKYW5kIHdpbGwgb25seSBmaXggYnVncyBhcyB0aGV5IHNob3cgdXAuICBXb3JrIG9uIFNXSUcgdmVyc2lvbiAyLjAgaXMKYWxyZWFkeSBpbiBwcm9ncmVzcywgYnV0IGlzIGdvaW5nIHRvIHJlc3VsdCBpbiByYXRoZXIgc2lnbmlmaWNhbnQKY2hhbmdlcyB0byBTV0lHJ3MgaW50ZXJuYWwgc3RydWN0dXJlIChob3BlZnVsbHkgZm9yIHRoZSBiZXR0ZXIpLiAgTm8KYW50aWNpcGF0ZWQgZGF0ZSBmb3IgdmVyc2lvbiAyLjAgaXMgc2V0LCBidXQgaWYgeW91J3ZlIGdvdCBhbiBpZGVhLApsZXQgbWUga25vdy4KClZlcnNpb24gMS4wIEJldGEgMiAoQXByaWwgMjYsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIHJlbGVhc2UgaXMgaWRlbnRpY2FsIHRvIEJldGExIGV4Y2VwdCBhIGZldyBtaW5vciBidWdzIGFyZQpmaXhlZCBhbmQgdGhlIFNXSUcgbGlicmFyeSBoYXMgYmVlbiB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41L1RrIDQuMS4KQSB0Y2w3LjUgZXhhbXBsZXMgZGlyZWN0b3J5IGlzIG5vdyBpbmNsdWRlZC4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIE1ha2VmaWxlIHRoYXQgZGlkbid0IGluc3RhbGwgdGhlIGxpYnJhcmllcwogIGNvcnJlY3RseS4KCi0gU1dJRyBMaWJyYXJ5IGZpbGVzIGFyZSBub3cgdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNSBhbmQgVGsgNC4xLgoKLSBNaW5vciBidWcgZml4ZXMgaW4gb3RoZXIgbW9kdWxlcy4KCgpWZXJzaW9uIDEuMCBCZXRhIDEgIChBcHJpbCAxMCwgMTk5NikuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgaXMgdGhlIGZpcnN0ICJzZW1pLW9mZmljaWFsIiByZWxlYXNlIG9mIFNXSUcuICAgIEl0IGhhcyBhCm51bWJlciBvZiBzdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgb3ZlciB0aGUgQWxwaGEgcmVsZWFzZS4gICBUaGVzZQpub3RlcyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci0taG9wZSBJIHJlbWVtYmVyZWQgZXZlcnl0aGluZy4uLi4KCjEuICBUY2wvVGsKClNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFRjbDcuMywgVGszLjYgYW5kIGxhdGVyIHZlcnNpb25zLgpJJ3ZlIGFsc28gdGVzdGVkIFNXSUcgd2l0aCBleHBlY3QtNS4xOS4KCk5vcm1hbGx5IFNXSUcgZXhwZWN0cyB0byB1c2UgdGhlIGhlYWRlciBmaWxlcyAidGNsLmgiIGFuZCAidGsuaCIuCk5ld2VyIHZlcnNpb25zIG9mIFRjbC9UayB1c2UgdmVyc2lvbiBudW1iZXJzLiAgIFlvdSBjYW4gc3BlY2lmeSB0aGVzZQppbiBTV0lHIGFzIGZvbGxvd3MgOgoKICAgICAgICAlIHdyYXAgLWh0Y2wgdGNsNy40LmggLWh0ayB0azQuMC5oIGV4YW1wbGUuaQoKT2YgY291cnNlLCBJIHByZWZlciB0byBzaW1wbHkgc2V0IHVwIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gInRjbC5oIiBhbmQKdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIG9uIHRoZSBtYWNoaW5lLgoKMi4gIFBlcmw0CgpUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGJhc2VkIG9uIFBlcmwtNC4wMzUuICBTV0lHJ3MgaW50ZXJmYWNlIHRvClBlcmw0IGlzIGJhc2VkIG9uIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGluIHRoZSAiUHJvZ3JhbW1pbmcgUGVybCIKYm9vayBieSBMYXJyeSBXYWxsLCBhbmQgZmlsZXMgbG9jYXRlZCBpbiB0aGUgInVzdWIiIGRpcmVjdG9yeSBvZiB0aGUKUGVybDQgZGlzdHJpYnV0aW9uLgoKSW4gb3JkZXIgdG8gY29tcGlsZSB3aXRoIFBlcmw0LCB5b3UnbGwgbmVlZCB0byBsaW5rIHdpdGggdGhlIHVwZXJsLm8KZmlsZSBmb3VuZCBpbiB0aGUgUGVybDQgc291cmNlIGRpcmVjdG9yeS4gIFlvdSBtYXkgd2FudCB0byBtb3ZlIHRoaXMKZmlsZSB0byBhIG1vcmUgY29udmVuaWVudCBsb2NhdGlvbi4KCjMuICBQZXJsNQoKVGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiwgYnV0IGlzIGFsb3QgbGVzcwpidWdneSB0aGFuIHRoZSBhbHBoYSByZWxlYXNlLiAgICAgU1dJRyBvcGVyYXRlcyBpbmRlcGVuZGVudGx5IG9mCnRoZSBYUyBsYW5ndWFnZSBhbmQgeHN1YnBwIHN1cHBsaWVkIHdpdGggUGVybDUuICBDdXJyZW50bHkgU1dJRwpwcm9kdWNlcyB0aGUgbmVjZXNzYXJ5IEMgY29kZSBhbmQgLnBtIGZpbGUgbmVlZGVkIHRvIGR5bmFtaWNhbGx5CmxvYWQgYSBtb2R1bGUgaW50byBQZXJsNS4KClRvIHN1cHBvcnQgUGVybDUncyBub3Rpb24gb2YgbW9kdWxlcyBhbmQgcGFja2FnZXMgKGFzIHdpdGggeHN1YnBwKSwKeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyA6CgogICAgICAgICUgd3JhcCAtcGVybDUgLW1vZHVsZSBNeU1vZHVsZSAtcGFja2FnZSBNeVBhY2thZ2UgZXhhbXBsZS5pCgpOb3RlIDogSW4gb3JkZXIgZm9yIGR5bmFtaWMgbG9hZGluZyB0byBiZSBlZmZlY3RpdmUsIHlvdSBuZWVkIHRvIGJlCmNhcmVmdWwgYWJvdXQgbmFtaW5nLiAgICBGb3IgYSBtb2R1bGUgbmFtZWQgIk15TW9kdWxlIiwgeW91J2xsIG5lZWQgdG8KY3JlYXRlIGEgc2hhcmVkIG9iamVjdCBmaWxlIGNhbGxlZCAiTXlNb2R1bGUuc28iIHVzaW5nIHNvbWV0aGluZyBsaWtlCgogICAgICAgICUgbGQgLXNoYXJlZCBteV9vYmoubyAtbyBNeU1vZHVsZS5zbwoKVGhlIHVzZSBvZiB0aGUgJWluaXQgZGlyZWN0aXZlIG11c3QgbWF0Y2ggdGhlIG1vZHVsZSBuYW1lIHNpbmNlIFBlcmw1CmNhbGxzIGEgZnVuY3Rpb24gImJvb3RfTW9kdWxlTmFtZSIgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGluZ3MuClNlZSB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBnZXQgdGhpbmdzCnRvIHdvcmsuCgo0LiAgUHl0aG9uMS4zCgpUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlIHN1cHBvcnRpbmcgUHl0aG9uLiAgICBUaGUgUHl0aG9uIHBvcnQgaXMKZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmV3cml0dGVuLiAgIFZhcmlhYmxlIGxpbmthZ2UgaXMgZG9uZSB0aHJvdWdoCmZ1bmN0aW9ucyB3aGljaCBpcyBzb3J0IG9mIGEga2x1ZGdlLiAgSSBhbHNvIHRoaW5rIGl0IHdvdWxkIGJlIG5pY2UKdG8gaW1wb3J0IFNXSUcgcG9pbnRlcnMgaW50byBQeXRob24gYXMgYSBuZXcgb2JqZWN0IChpbnN0ZWFkIG9mIHN0cmluZ3MpLgpPZiBjb3Vyc2UsIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrLgoKNS4gIEd1aWxlMwoKSWYgeW91IHJlYWxseSB3YW50IHRvIGxpdmUgb24gdGhlIGVkZ2UsIHBpY2sgdXAgYSBjb3B5IG9mIEd1aWxlLWlpaSBhbmQKcGxheSBhcm91bmQgd2l0aCB0aGlzLiAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC0tLWVzcGVjaWFsbHkgc2luY2UKSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9mZmljaWFsIHN0YXRlIG9mIEd1aWxlIGlzIHRoZXNlIGRheXMuICBUaGlzCmltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgc2hvdWxkIEkgc3VkZGVubHkgZmlndXJlIG91dCBiZXR0ZXIKd2F5cyB0byBkbyB0aGluZ3MuCgo2LiAgRXh0ZW5kaW5nIFNXSUcKClNXSUcgaXMgd3JpdHRlbiBpbiBDKysgYWx0aG91Z2ggSSB0ZW5kIHRvIHRoaW5rIG9mIHRoZSBjb2RlIGFzIG1vc3RseQpiZWluZyBBTlNJIEMgd2l0aCBhIGxpdHRsZSBpbmhlcml0YW5jZSB0aHJvd24gaW4uICAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UKaXMgaW1wbGVtZW50ZWQgYXMgYSBDKysgY2xhc3MgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBzeXN0ZW0uCklmIHlvdSB3YW50IHRvIGFkZCB5b3VyIG93biBtb2RpZmljYXRpb25zLCBzZWUgQXBwZW5kaXggQyBvZiB0aGUgdXNlcgptYW51YWwuICAgVGhlbiB0YWtlIGEgbG9vayBhdCB0aGUgInVzZXIiIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb21lCmNvZGUgZm9yIGJ1aWxkaW5nIHlvdXIgb3duIGV4dGVuaW9ucy4KCjcuIFRoZSBTV0lHIGxpYnJhcnkKClRoZSBTV0lHIGxpYnJhcnkgaXMgc3RpbGwgaW5jb21wbGV0ZS4gIFNvbWUgb2YgdGhlIGZpbGVzIG1lbnRpb25lZCBpbgp0aGUgdXNlciBtYW51YWwgYXJlIHVuYXZhaWxhYmxlLiAgICBUaGVzZSBmaWxlcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlCndoZW4gdGhleSBhcmUgcmVhZHkuICAgU3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBmb3IgYW5ub3VuY2VtZW50cwphbmQgdXBkYXRlcy4KCjguIFNXSUcgRG9jdW1lbnRhdGlvbgoKSSBoYXZlIHNvbWV0aW1lcyBleHBlcmllbmNlZCBwcm9ibGVtcyB2aWV3aW5nIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gaW4Kc29tZSBwb3N0c2NyaXB0IHZpZXdlcnMuICAgSG93ZXZlciwgdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gcHJpbnQKbm9ybWFsbHkuICAgIEknbSB3b3JraW5nIG9uIG1ha2luZyBtdWNoIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9ubGluZSwKYnV0IHRoaXMgdGFrZXMgdGltZS4KClZlcnNpb24gMC4xIEFscGhhIChGZWJydWFyeSA5LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBSdW4tdGltZSB0eXBlLWNoZWNraW5nIG9mIFNXSUcgcG9pbnRlcnMuICAgUG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZAogICAgYXMgc3RyaW5ncyB3aXRoIGJvdGggbnVtZXJpYyBhbmQgZW5jb2RlZCB0eXBlIGluZm9ybWF0aW9uLiAgICBUaGlzIG1ha2VzCiAgICBpdCBhIGxpdHRsZSBoYXJkZXIgdG8gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QgKGFuZCBpdCBlbGltaW5hdGVzCiAgICBzb21lIHNlZ21lbnRhdGlvbiBmYXVsdHMgYW5kIG90aGVyIG9kZGl0aWVzKS4KCjIuICBQeXRob24gMS4zIG5vdyBzdXBwb3J0ZWQuCgozLiAgI2RlZmluZSBhbmQgZW51bSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsIGNvbnN0YW50cy4KCjQuICBDb21wbGV0ZWx5IHJld3JvdGUgdGhlICVpbmNsdWRlIGRpcmVjdGl2ZSBhbmQgbWFkZSBpdCBhbG90IG1vcmUgcG93ZXJmdWwuCgo1LiAgUmVzdHJ1Y3R1cmVkIHRoZSBTV0lHIGxpYnJhcnkgdG8gbWFrZSBpdCB3b3JrIGJldHRlci4KCjYuICBWYXJpb3VzIGJ1ZyBmaXhlcyB0byBUY2wsIFBlcmw0LCBQZXJsNSwgYW5kIEd1aWxlIGltcGxlbWVudGF0aW9ucy4KCjcuICBCZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgJXR5cGVkZWYgZGlyZWN0aXZlLgoKOC4gIE1hZGUgc29tZSBjaGFuZ2VzIHRvIFNXSUcncyBjbGFzcyBzdHJ1Y3R1cmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZXhwYW5kLgogICAgU1dJRyBpcyBub3cgYnVpbHQgaW50byBhIGxpYnJhcnkgZmlsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIG1ha2UgeW91cgogICAgb3duIGV4dGVuaW9ucy4KCjkuICBNYWRlIGV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudGF0aW9uLgoKMTAuIE1pbm9yIGNoYW5nZXMgdG8gdGhlIFNXSUcgcGFyc2VyIHRvIG1ha2UgaXQgdXNlIGxlc3MgbWVtb3J5LgogICAgQWxzbyB0b29rIG91dCBzb21lIGV4dHJhbmVvdXMgcnVsZXMgdGhhdCB3ZXJlIHVuZG9jdW1lbnRlZCBhbmQKICAgIGRpZG4ndCB3b3JrIGluIHRoZSBmaXJzdCBwbGFjZS4KCjExLiBUaGUgU1dJRyBsaWJyYXJ5IGZpbGVzICJ0Y2xzaCIsICJ3aXNoIiwgImV4cGVjdCIsIGV0Yy4uLiBpbiB0aGUgZmlyc3QKICAgIHJlbGVhc2UgaGF2ZSBiZWVuIHJlc3RydWN0dXJlZCBhbmQgcmVuYW1lZCB0byAidGNsc2guaSIsICJ3aXNoLmkiLAogICAgYW5kIHNvIG9uLgo=