TW9uIERlYyAzMCAxMDo1NzowMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKCglNYWlubHkgc3R1ZmYgdG8gaW1wcm92ZSBoYW5kbGluZyBvZiBUWVBFX0NPREVfUkVGIHZhbHVlcy4KCSogdmFsb3BzLmMgKHZhbHVlX2FkZHIpOiAgSWYgdGFraW5nIHRoZSBhZGRyZXMgb2YgYQoJVFlQRV9DT0RFX1JFRiwganVzdCBjYXN0IHRoZSBvYmplY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcKCVRZUEVfQ09ERV9QVFIuICBUaGlzIHlpZWxkcyBjb3JyZWN0IEMrKyBzZW1hbnRpY3MsIGFuZAoJcHJlc2VydmVzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgd2hpY2ggaGFzIHRoZSBuaWNlIGVmZmVjdAoJdGhhdCAmKCZSKSBnaXZlbiB0aGUgbG9jYXRpb24gY29udGFpbmluZyBSLgoJKiB2YWx1ZXMuYyAodmFsdWVfY29weSk6ICBNYWtlIG5vbi1zdGF0aWMgKHVzZWQgYnkgdmFsdWVfYWRkcikuCgkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX2Zvcl9hZGRyZXNzKTogIFVzZSB0aGUgZGVmYXVsdAoJc2NoZW1lICh3aXRoIHZhbHVlX2FkZHIpIGZvciBhIHZhcmlhYmxlIGlmIGl0IGhhcyBUWVBFX0NPREVfUkVGLgoJKiB2YWxvcHMuYyAodmFsdWVfYWRkciksIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX2Zvcl9hZGRyZXNzLAoJZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24pOiAgRmFjdG9yIG91dCBzb21lIGNvbW1vbgoJZXhwcmVzc2lvbnMgaW50byB2YXJpYWJsZXMsIGZvciBlYXNpZXIgcmVhZGluZy4KCSogZmluZHZhci5jIChsb2NhdGVfdmFyX3ZhbHVlKTogIFJlbW92ZSBjb2RlIHRvIGhhbmRsZQoJVFlQRV9DT0RFX1JFRiAtIGl0IHNob3VsZCBubyBsb25nZXIgYmUgbmVlZGVkLgoJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogIERvIGEgQ09FUkNFX1JFRiBvbiB0aGUKCWRlc3RpbmF0aW9uIG9wZXJhbmQsIGZvciBjb3JyZWN0IEMrKyBzZW1hbnRpY3MuCgkqIHZhbGFyaXRoLmMgKHZhbHVlX3hfYmlub3ApOiAgRGl0dG86ICBEZS1yZWZlcmVuY2UgQysrCglyZWZlcmVuY2VzIGluIHRoZSBhcmd1bWVudHMuCgkqIHZhbG9wcy5jOiAgQU5TSS1meTogYmNvcHktPm1lbWNweSwgYnplcm8tPm1lbXNldC4KClNhdCBEZWMgMjggMTE6MzA6MjYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCgoJKiBkd2FyZnJlYWQuYywgY29mZnJlYWQuYzogIFVzZSBJTklUX0NQTFVTX1NQRUNJRklDLgoJKiBzeW10YWIuYyAoZ2RiX21hbmdsZV9uYW1lKTogIFJlY29nbml6ZSBhbmQgaGFuZGxlCgljb25zdHJ1Y3RvcnMgc3BlY2lhbGx5LgoJKiBzeW10YWIuYyAoY2hlY2tfc3R1Yl9tZXRob2QpOiAgVGVzdCBmb3IgZmFpbHVyZSBmcm9tCgljcGx1cy1kZW1hbmdsZSBieSBjYWxsaW5nIGVycm9yKCkgaW5zdGVhZCBvZiBzZWctZmF1bHRpbmcgLi4uCgpGcmkgRGVjIDI3IDIyOjIxOjMwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogZGVmcy5oOiAgQWRkIGRlZmluaXRpb24gb2YgbnVsbF9jbGVhbnVwKCkKCgkqIHByb2Nmcy5jOiAgTWFueSBzbWFsbCBjaGFuZ2VzIHRvIGFkZCBiYXNlIHN1cHBvcnQgZm9yIGEgbmV3CgkiaW5mbyBwcm9jIiBjb21tYW5kIChjdXJyZW50bHkgb25seSBwcmludGluZyBvZiB0aGUgYWRkcmVzcwoJc3BhY2UgbWFwcGluZyBpcyBpbXBsZW1lbnRlZCkgYW5kIGFsbG93IGl0ZXJhdGlvbiBvdmVyIHRoZQoJYWRkcmVzcyBzcGFjZSBtYXBwaW5nLCBjYWxsaW5nIGFuIGFyYml0cmFyeSBmdW5jdGlvbiBmb3IgZWFjaAoJbWFwcGluZyAodXNlZCBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCkuCgoJKiBzb2xpYi5jOiAgQ2hhbmdlIGFsbCBpZmRlZnMgdGhhdCBjaGVja2VkIGZvciAic3VuIiB0byBjaGVjawoJZm9yICIhU1ZSNF9TSEFSRURfTElCUyIgaW5zdGVhZC4gIFJld3JpdGUgbG9va3VwX2Jhc2UoKSB0bwoJaGFuZGxlIGxvY2F0aW5nIHRoZSBkZWJ1ZyBiYXNlIGFkZHJlc3MgZXZlbiB3aGVuIG5vdCBjdXJyZW50bHkKCXN0b3BwZWQgYXQgdGhlIGR5bmFtaWMgbGlua2VyIGVudHJ5IHBvaW50LgoKCSogdXRpbHMuYzogIEFkZCBudWxsX2NsZWFudXAoKSBhcyBhIGtub3duIGZ1bmN0aW9uIHRoYXQgZG9lcwoJbm90aGluZyB0byBzZXJ2ZSBhcyBhIGJhc2UgZm9yIHBvc3NpYmx5IGxvbmcgY2xlYW51cCBjaGFpbnMKCXdpdGggbm8gc3BlY2lmaWMgImZpcnN0IGNsZWFudXAiIHRvIHNlcnZlIGFzIGFuIGFuY2hvci4KCgkqIHhtLXN5c3Y0Lmg6ICBBZGQgZGVmaW5lIG9mIFNWUjRfU0hBUkVEX0xJQlMKCkZyaSBEZWMgMjcgMTA6MTE6MzMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCgoJKiBhcm0tb3Bjb2RlLmgsIG04OGstb3Bjb2RlLmgsIHBuLW9wY29kZS5oLCBucDEtb3Bjb2RlLmgsCglweXItb3Bjb2RlLmgsIHRhaG9lLW9wY29kZSwgdmF4LW9wY29kZS5oOiAgUmVtb3ZlZCAtCgl0aGVzZSBhcmUgYWxsIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB2ZXJzaW9ucwoJaW4gLi4vaW5jbHVkZS9vcGNvZGUuICBUaGUgcmVtYWluaW5nICotb3Bjb2RlLmggaGVyZQoJYXJlIG5vdCBxdWl0ZSBzbyBvYnZpb3VzbHkgdGhlIHNhbWUsIGFuZCBuZWVkIHN0dWR5LgoJKiBhcm0tcGluc24uYywgZ291bGQtcGluc24uYywgbTg4ay1waW5zbi5jLCBweXItcGluc24uYywKCXRhaG9lLXBpbnNuLmMsIHZheC1waW5zbi5jOiAgQ2hhbmdlIHNvIHRoZXNlIGluY2x1ZGUKCW9wY29kZS9GT08uaCAoYWN0dWFsbHkgLi4vaW5jbHVkZS9vcGNvZGUvRk9PLmgpCglpbnN0ZWFkIG9mIHRoZSByZWNlbm50bHkgZGVwYXJ0ZWQgb3Bjb2RlLUZPTy5oIGZpbGVzLgoJKiBzcGFyYy1waW5zbi5jOiAgTm93IHRoYXQgd2UncmUgdXNpbmcgdGhlIG11Y2ggdGlnaHRlcgoJb3Bjb2RlIHRhYmxlIGluIC4uL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmgsIHdlIHNob3VsZG4ndAoJbmVlZCB0byBzb3J0IHRoZSBvcGNvZGVzIGJlZm9yZSBkaXMtYXNzZW1ibHkuCgoJKiBzeW10YWIuaCwgc3ltbWlzYy5jOiAgTWFrZSBjcGx1c19zdHJ1Y3RfZGVmYXVsdCBiZSBjb25zdC4KCSogc3ltdGFiLmgsIGJ1aWxkc3ltLmM6ICBBZGQgYW5kIHVzZSBJTklUX0NQTFVTX1NQRUNJRklDIG1hY3JvLgoJKiBzeW1taXNjLmM6ICBSZW1vdmUgdW51c2VkICduZmllbGRzJyB2YXJpYWJsZS4KCSogYnVpbGRzeW0uaDogIEFkZCBleHRlcm4gZGVjbCBvZiB1bmtub3duX3N5bXR5cGVfY29tcGxhaW50LAoJc2luY2UgaXQgdXNlZCB1c2VkIGJ5IHBhcnRpYWwtc3RhYi5oIChpbmNsdWRlZCB0d28gcGxhY2VzKS4KCSogcGFydGlhbC1zdGFiLmg6ICBSZS1hcnJhbmdlIERCWFJFQURfT05MWSAjaWZkZWZzIHNvIHRoYXQKCXdlIHNob3VsZCBuZXZlciBoaXQgdGhlIGRlZmF1bHQgY2FzZSAodW50aWwgbmV3IHN0YWIgY29kZXMKCWFyZSBhZGRlZCkuICBIZW5jZSwgd2UgY2FuIGxlYXZlIHRoZSBjb21wbGFpbnQgaW4gdGhlCglkZWZhdWx0IGNhc2UgaW4gZXZlbiB3aGVuIERCWFJFQURfT05MWSBpcyBvZmYuCgkqIHBhcnRpYWxfc3RhYi5oOiBSZWNvZ25pemUgYSBwYWlyIG9mIE5fU08gc3RhYnMgKG9uZSBmb3IgdGhlCglkaXJlY3RvcnksIG9uZSBmb3IgdGhlIGZpbGVuYW1lIHByb3Blcikgd2l0aG91dCBwZWVraW5nIGFoZWFkLgoJKiBkYnhyZWFkLmMsIG1pcHNyZWFkLmM6IEJlY2F1c2Ugb2YgcHJldmlvdXMgY2hhbmdlLCBkb24ndCBuZWVkCgl1Z2x5IENIRUNLX1NFQ09ORF9OX1NPIG1hY3JvLgoJKiBidWlsZHN5bS5oLCBkYnhyZWFkLmMsIG1pcHNyZWFkLmM6ICBNYWtlIG5leHRfc3ltYm9sX3RleHQgYQoJbWFjcm8gdGhhdCBpbnZva2VzIGEgZnVuY3Rpb24gcG9pbnRlciBpbiBuZXh0X3N5bWJvbF90ZXh0X2Z1bmMuCgkqIG1pcHNyZWFkLmM6ICBBZGRlZCBjb21tZW50cyB2YXJpb3VzIHBsYWNlcyB0bwoJZXhwbGFpbiB3aGF0IGlzIGdvaW5nIG9uLgoJKiBtaXBzcmVhZC5jIChwYXJzZV9zeW1ib2wpOiAgU3VwcG9ydCB0aGUgbmV3IChTR0ktc3BlY2lmaWM/KQoJc3ltYm9sIHR5cGVzIHN0U3RydWN0LCBzdFVuaW9uLCBhbmQgc3RFbnVtLgoJQWxzbywgc29tZSBmaXhlcyBpbiB0aGUgY29kZSBmb3IgZGVhbGluZyB3aXRoIHRhZ3MuCgkqIG1pcHNyZWFkLmM6ICBDaGFuZ2UgaGFuZGxpbmcgb2Ygc3RhcnR1cF9maWxlX3N0YXJ0IGFuZCBfZW5kCgktIG5vdyBqdXN0IHVzZSB0aGUgdGV4dGxvdyBhbmQgdGV4aGlnaCBvZiBhIHBzeW10YWIKCXRvIGNoZWNrIGlmIHdlJ3ZlIGZvdW5kIHRoZSBzdGFydHVwLWZpbGUuCgkqIG1pcHNyZWFkLmM6ICBSZXBsYWNlIHNfaWR4IGJ5IGdsb2JhbCBjdXJfc2R4IGluIG1hbnkgcGxhY2VzLgoJVGhpcyBpcyBzbyBtaXBzX25leHRfc3ltYm9sX3RleHQgY2FuIGdldCBhdCBpdC4KClRodSBEZWMgMjYgMTk6NTI6MDEgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCgoJKiBkYnhyZWFkLmMsIHN5bW1pc2MuYzogIE1vdmUgYWRkX3BzeW1ib2xfdG9fcGxpc3QoKSBmcm9tCglkYnhyZWFkLmMgdG8gc3ltbWlzYyBhbmQgY2hhbmdlIG5hbWUgdG8gYWRkX3BzeW1ib2xfdG9fbGlzdC4KCURpdHRvIGZvciBhZGRfcHN5bWJvbF9hZGRyX3RvX3BsaXN0KCkuICBBbHNvIGV4cGFuZCB0aGVpcgoJYm9keSB0byBub3QgdXNlIEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QuCgoJKiBkd2FyZnJlYWQuYzogIFJlbW92ZSBhZGRfcHN5bWJvbF90b19saXN0KCkgYW5kIGNvbnZlcnQgdXNhZ2VzCgl0byB0aGUgQUREX1BTWU1CT0xfVE9fTElTVCBtYWNyby4KCgkqIGllZWUtZmxvYXQuYzogIENoYW5nZSAiI2lmZGVmIERFQlVHIiB0byAiI2lmZGVmIElFRUVfREVCVUciCgl0byBhdm9pZCBjb2xsaXNpb24gd2l0aCB0aGUgREVCVUcgZm9yIEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QuCgoJKiBwYXJ0aWFsLXN0YWIuaCwgc3ltZmlsZS5oOiAgTW92ZSBkZWZpbml0aW9ucyBvZiB0aGUgbWFjcm9zCglBRERfUFNZTUJPTF9UT19MSVNUIGFuZCBBRERfUFNZTUJPTF9BRERSX1RPX0xJU1QgZnJvbQoJcGFydGlhbC1zdGFiLmggdG8gc3ltZmlsZS5oLiAgVGhleSBhcmVuJ3Qgc3RhYiBzcGVjaWZpYy4KCUNoYW5nZSBBRERfUFNZTUJPTF9WVF9UT19MSVNUIHRvIHVzZSBtZW1jcHkgcmF0aGVyIHRoYW4gc3RybmNweS4KClR1ZSBEZWMgMjQgMTE6Mzg6MDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBNYWtlZmlsZS5pbjogIFJvbGwgVkVSU0lPTiB0byA0LjMuMi4KCk1vbiBEZWMgMjMgMTM6NTQ6MzUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCgoJKiBtNjhrLW9wY29kZS5oLCBtaXBzLW9wY29kZS5oLCBzcGFyYy1vcGNvZGUuaDogIERlbGV0ZWQuCgkqIG02OGstcGluc24uYywgbWlwcy1waW5zbi5jLCBzcGFyYy1waW5zbi5jOgoJSW5jbHVkZSA8b3Bjb2RlL0ZPTy5oPiBpbnN0ZWFkIG9mIDxGT08tb3Bjb2RlLmg+LgoKCSogc3ltdGFiLmgsIHN5bXRhYi5jLCBjb2ZmcmVhZC5jLCBkd2FyZnJlYWQuYywgc3ltbWlzYy5jLAoJZGJ4cmVhZC5jOiAgVGhlIFRZUEVfQ1BMVVNfU1BFQ0lGSUMgc3RydWN0dXJlIGlzIG5vdyBvbmx5CglhbGxvY2F0ZWQgd2hlbiBpdCBpcyBuZWVkZWQuICBVbnRpbCBpdCBpcyBuZWVkZWQsIGl0IHBvaW50cwoJdG8gYSBzaGFyZWQgc3RhdGljYWxseSBhbGxvY2F0ZWQgc3RydWN0dXJlLgoKCSogYnVpbGRzeW0uaCwgYnVpbGRzeW0uYywgZGJ4cmVhZC5jOiBSZW1vdmUgdGhlIGtsdWRneSBjb2RlCglpbiByZWFkX29maWxlX3N5bXRhYiB0byByZWNvZ25pemUgdHdvIGluaXRpYWwgTl9TTyBzdGFicywKCWFuZCBsZXQgcHJvY2Vzc19vbl9zeW1ib2wgaGFuZGxlIGl0LiAgVGhpcyBpcyBjbGVhbmVyLCBtb3JlCgllZmZpY2llbnQsIGFuZCBsZXRzIG1pcHNyZWFkLmMgc2hhcmUgdGhlIHNhbWUgY29kZS4KCgkqIHN5bWZpbGUuaCwgcGFydGlhbC1zdGFiLmg6ICBNb3ZlIEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QKCWFuZCByZWxhdGVkIG1hY3JvcyB0byBoZXJlIC4uLgoJKiBkYnhyZWFkLmM6IC4uLiBmcm9tIGhlcmUuCgkqIHN5bW1pc2MuYzogIE1vdmUgdGhlICJvdmVyZmxvdyIgaGFuZGxpbmcgZnJvbQoJQUREX1BTWU1CT0xfVlRfVE9fTElTVCBtYWNybyBpbnRvIG5ldyBmdW5jdGlvbiBleHRlbmRfcHN5bWJvbF9saXN0LgoJKiBkd2FyZnJlYWQuYzogIFJlLXdyaXRlIGFkZF9wc3ltYm9sX3RvX2xpc3QgdG8gdXNlCglBRERfUFNZTUJPTF9WVF9UT19MSVNUIG1hY3JvLgoKCSogbWlwc3JlYWQuYzogRXh0ZW5kIG1pcHNyZWFkLmMgdG8gaGFuZGxlIHN0YWJzLXN0eWxlIHN5bWJvbHMKCWVuY2Fwc3VsYXRlZCBpbiBlY29mZiBzeW1ib2xzLiAgVGhpcyBlbmFibGUgZnVsbCBnKysgZGVidWdnaW5nLiAgCgkqIHBhcnRpYWwtc3RhYi5oOiAgTW92ZSB0aGUgY29kZSBmb3IgcHJlLXNjYW5uaW5nIHN5bWJvbHMKCWFuZCBidWlsZGluZyBwc3ltdGFicyB0byBhbiBpbmNsdWRlIGZpbGUsIG91dCBmcm9tIGRieHJlYWQuYy4KCVRoaXMgd2F5LCB0aGUgc2FtZSBjb2RlIGNhbiBhbHNvIGJlIHVzZWQgYnkgbWlwc3JlYWQuYy4KCSogZGJ4cmVhZC5jLCBidWlsZHN5bS5oOiAgVmFyaW91cyBjaGFuZ2VzIHRvIGFsbG93IHNvbWUgZnVuY3Rpb25zCgl0byBiZSB1c2VkIGJ5IG1pcHNyZWFkLmMgKGFsc28gc29tZSBhcmd1YWJsZSBzdHlsaXN0aWMgY2hhbmdlcykuCgoJKiB0bS1taXBzLmg6ICBEZWZpbmUgQkxPQ0tfQUREUkVTU19BQlNPTFVURSwgYXQgbGVhc3QgZm9yIG5vdywKCXNpbmNlIG1pcHMtdGZpbGUgcHV0cyByZWxvY2F0YWJsZSBhZGRyZXNzZXMgaW50byBMQlJBQy9SQlJBQwoJc3RhYnMuCgoJKiBtaXBzcmVhZC5jOiAgUmVwbGFjZSBjb2RlIHRvIGhhbmRsZSBhbWJpZ3VvdXMgdGFnIGJsb2Nrcy4KCUluc3RlYWQgb2YgYWxsb2NhdGluZyBhIFRZUEVfQ09ERV9VTkRFRiwgZ3Vlc3MgKGJ5IGxvb2tpbmcKCWF0IHR5cGVzIGFuZCBvZmZzZXRzKSBpZiBhIHRhZyBpcyBhIHN0cnVjdCwgdW5pb24sIG9yIGVudW0uCglTdGlsbCBwYXRjaCBpdCBsYXRlciBpZiB3ZSBmaW5kIG91dCBmb3Igc3VyZS4KCSogbWlwc3JlYWQuYzogIEluIHZhcmlvdXMgd2F5cywgcmVwbGFjZSBGb3JpbidzCglpZGVvLXN5bmNyYXRpYyBjb2RlIGJ5IGNvZGUgdGhhdCBmaXRzIGJldHRlciB3aXRoIHRoZQoJcmVzdCBvZiBnZGIsIGZvciBib3RoIHN0YWJzLWJhc2VkIGFuZCBlY29mZi1iYXNlZCBzeW10YWJzLgoJRS5nLiAgdXNlIGVuZF9wc3ltdGFiOyBkb24ndCBkbyBleHRyYSBwYXNzZXMgb3ZlciBGRFIgdGFibGUgdG8KCXByZS1wYXJ0aXRpb24gZ2xvYmFsIGRhdGE7IGRvbid0IHVzZSBleHRlcm5hbCBzeW1ib2xzIHRvCgljcmVhdGUgc3RhdGljL2dsb2JhbCBzeW1ib2xzIChqdXN0IHB1dCB0aGVtIGluIHRoZQoJbWlzY192ZWN0b3IpOyB1c2UgQUREX1BTWU1CT0xfVE9fTElTVCBtYWNybzsgZG9uJ3QKCXNvcnQgcHN5bXRhYnMgb3Igc3ltdGFiczsgdXNlIG9ic3RhY2tzIG1vcmUuCgoJKiBzeW10YWIuYywgbWlwc3JlYWQuYywgZGJ4cmVhZC5jLCBidWlsZHN5bS5jOgoJQU5TSWZ5OiBSZXBsYWNlIGJjb3B5IGJ5IG1lbWNweSwgYnplcm8gYnkgbWVtc2V0LgoKU3VuIERlYyAyMiAxOTozMTowNCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKCgkqIHNvbGliLmMgKGxvY2F0ZV9iYXNlKTogIEZpeCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHRoYXQgd2FzIAoJY2F1c2luZyByZXR1cm4gb2YgcmFuZG9tIHZhbHVlIHRvIGNhbGxlZS4KCgkqIGNvbmZpZy9taC1hbWl4LCBjb25maWcvbWgtaTM4NnY0OiAgQ2hhbmdlIHRvIGZpbmQgYWxsb2NhIGJ5Cgljb21waWxpbmcgYW5kIGxpbmtpbmcgYWxsb2NhLmMsIGV2ZW4gd2hlbiBpdCBpcyBub3Qgc3RyaWN0bHkKCXJlcXVpcmVkLiAgQWxzbyBhcnJhbmdlIHRvIGxpbmsgd2l0aCAtbHRlcm1saWIgcmF0aGVyIHRoYW4KCS1sdGVybWNhcC4KCgkqIE1ha2VmaWxlLmluOiAgTW92ZSBURVJNQ0FQIGRlZmluaXRpb24gdG8gcHJpb3IgdG8gaW5jbHVzaW9uCglvZiBob3N0IG1ha2VmaWxlIGZyYWdtZW50cyBzbyBpdCBjYW4gYmUgb3ZlcnJpZGRlbi4KCkZyaSBEZWMgMjAgMTY6MzM6MzkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiB4Y29mZnJlYWQuYyAocmVhZF9zeW1ib2xfbGluZW5vKTogIExvZ2ljIGVycm9yIGluIGluY3JlbWVudGluZwoJc3ltYm9sIHRhYmxlIGVudHJ5IG51bWJlci4gIChGcm9tIE1ldGluIE96aXNpay4pCgpGcmkgRGVjIDIwIDExOjM2OjM4IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogY29uZmlnL21oLWkzODZ2NDogIENoYW5nZSBYTV9DTElCUyB0byAiLWxjIC91c3IvdWNibGliL2xpYnVjYi5hIgoJc28gY29tcGlsZXMgd2l0aCBuYXRpdmUgY29tcGlsZXJzICh3aXRob3V0IGJ1aWx0aW4gYWxsb2NhKSBjYW4KCXBpY2sgdXAgdGhlIHZlcnNpb24gZnJvbSB0aGUgYnNkIGVtdWxhdGlvbiBsaWJyYXJ5LiAgSG93ZXZlciwgd2UKCXNlYXJjaCB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGZpcnN0IHNvIHdlIGRvbid0IHBpY2sgdXAgbG90cyBvZgoJb3RoZXIgYnJva2VuIHN0dWZmIGZyb20gbGlidWNiLmEsIHRoYXQgd2UgKmRvbid0KiB3YW50LgoKCSogY29uZmlndXJlLmluLCB0bS1hbWl4LmgsIHRtLWkzODZ2NC5oLCB4bS1hbWl4LmgsIHhtLWkzODZ2NC5oOgoJQ2hhbmdlIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4KCgkqIHNvdXJjZS5jOiAgTW92ZSBkZWNsYXJhdGlvbiBvZiBleHRlcm5hbCBmdW5jdGlvbiBpbmRleCB0bwoJZnJvbnQgb2YgZmlsZSBzbyBpdCBpcyBpbiBzY29wZSBmb3IgYWxsIHJlZmVyZW5jZXMuCgoJKiB1dGlscy5jIChlcnJvciwgZmF0YWwpOiAgTWFrZSBkZWZpbml0aW9ucyBjb25zaXN0ZW50IHdpdGgKCWRlZnMuaCBkZWNsYXJhdGlvbnMgKGRlY2xhcmVkIGFzICJ2b2xhdGlsZSB2b2lkIikuCgpGcmkgRGVjIDIwIDEwOjU1OjM2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogcnM2ay1vcGNvZGUuaDogIEJ1Z2ZpeCBzZmUgYW5kIHN0YnJ4LiAgQnkgQWwgS29zc293LgoKV2VkIERlYyAxOCAxNzowOTowNiAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQoKCSogY29tbWFuZC5oLCBkZWZzLmgsIGV2YWwuaCwgZXhwcmVzc2lvbi5oLCByZW1vdGUtc2Euc3BhcmMuYywKCXNwYXJjLXRkZXAuYywgc3ltdGFiLmgsIHRhcmdldC5oLCB2YWx1ZS5oLCB2eC1zaGFyZS9wdHJhY2UuaCwKCXZ4LXNoYXJlL3hkcl9wdHJhY2UuaCwgdngtc2hhcmUveGRyX3JkYi5oOiAgQU5TSWZ5IGVudW1zLgoKTW9uIERlYyAxNiAxMjozMTo0NiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKCgkqIGNvbmZpZy9tdC1hbWl4LCBjb25maWcvbXQtaTM4NnY0OiAgQWRkIHNvbGliLm8gdG8gVERFUEZJTEVTCglmb3IgdGhlc2UgU1ZSNCBzeXN0ZW1zLgoKCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9hZGQpOiAgV2hlbiB2ZXJib3NlIGlzIHNldCwgcHJpbnQKCXRoZSBuYW1lcyBvZiBmaWxlcyBmcm9tIHdoaWNoIHN5bWJvbHMgYXJlIGJlaW5nIGxvYWRlZCwgYXMKCXdoZW4gZnJvbV90dHkgaXMgdHJ1ZS4KCgkqIHNvbGliLmM6ICBDb21wbGV0ZWx5IHJlb3JnYW5pemVkIChyZXdyaXR0ZW4pIHRvIHN1cHBvcnQKCVNWUjQgc2hhcmVkIGxpYnJhcmllcyBpbiBhIG1hbm5lciB2ZXJ5IGNsb3NlIHRvIHRoZSBvcmlnaW5hbAoJU3VuT1MgaW1wbGVtZW50YXRpb24uICBUaGlzIHN1cHBvcnQgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIGFuZAoJYmVjb21lIG1vcmUgZ2VuZXJhbCBhdCBzb21lIGZ1dHVyZSB0aW1lLiAgVGhlIFNWUjQgdmVyc2lvbgoJZG9lcyBub3QgeWV0IHdvcmsgZm9yIGF0dGFjaGVkIHByb2Nlc3NlcywgZm9yIGV4YW1wbGUuCgoJKiBkd2FyZnJlYWQuYzogIEFycmFuZ2UgaW4gZHdhcmZfYnVpbGRfcHN5bXRhYnMoKSBmb3IgdGhlIAoJcmVsb2NhdGlvbiBhZGRyZXNzIHRvIGJlIHZhbGlkIHdoZXRoZXIgb3Igbm90IHN5bWJvbHMgYXJlCgliZWluZyByZWFkIGZyb20gYSBzaGFyZWQgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlLiAgVXNlIHRoZQoJcmVsb2NhdGlvbiBhZGRyZXNzIHJlY29yZGVkIGluIHRoZSBwc3ltdGFiIHdoZW4gcmVhZGluZwoJZnVsbCBzeW1ib2wgdGFibGVzIChpbiByZWFkX29maWxlX3N5bXRhYikuICBFbnN1cmUgdGhhdCB0aGUKCXJlbG9jYXRlZCBhZGRyZXNzIHJhbmdlcyBhcmUgcmVjb3JkZWQgaW4gcGFydGlhbCBzeW10YWJzLgoKCSogZWxmcmVhZC5jOiAgQWRkIG5ldyBmdW5jdGlvbiBlbGZfaW50ZXJwcmV0ZXIoKSB0byByZXR1cm4gdGhlCglzdHJpbmcgZnJvbSB0aGUgRUxGICIuaW50ZXJwIiBzZWN0aW9uLiAgVGhpcyBpcyB0aGUgaW50ZXJwcmV0ZXIKCXRoYXQgdGhlIGtlcm5lbCB0cmllcyB0byBydW4gYW5kIGZlZWQgdGhlIGV4ZWN1dGFibGUgdG8uCglFeHBhbmQgYXJndW1lbnRzIHRvIHJlY29yZF9taXNjX2Z1bmN0aW9uIHRvIGluY2x1ZGUgYSB0eXBlIGFyZy4KCU1vZGlmeSBlbGZfc3ltdGFiX3JlYWQoKSB0byBzdXBwbHkgdGhlIHR5cGUgYXJnLCBhbmQgdG8gZG8gc3ltYm9sCglyZWxvY2F0aW9ucyBmb3Igc3ltYm9scyByZWFkIGluIGZyb20gc2hhcmVkIGxpYnJhcmllcy4KCgkqIHByb2Nmcy5jOiAgQWRkIG5ldyBmdW5jdGlvbnMgcHJvY19iYXNlX2FkZHJlc3MoKSBhbmQKCXByb2NfYWRkcmVzc190b19mZCgpLCB1c2VkIGJ5IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCgoJKiB0bS1zdnI0Lmg6ICBBZGQgbWFjcm9zIHRvIHN1cHBvcnQgU1ZSNCBzaGFyZWQgbGlicmFyaWVzLgoJRGVmaW5pdGlvbnMgZm9yIFNPTElCX0FERCwgU09MSUJfQ1JFQVRFX0lORkVSSU9SX0hPT0ssCglDTEVBUl9TT0xJQiwgYW5kIERJU0FCTEVfVU5TRVRUQUJMRV9CUkVBSy4KCkZyaSBEZWMgMTMgMjA6MTE6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBpbmZydW4uYywgcmVtb3RlLWViLmMsIHJlbW90ZS1uaW5keS5jLCByZW1vdGUtdnguYzogIFJlbW92ZQoJdW51c2VkIFNUQVJUX0lORkVSSU9SX0hPT0suCgoJKiByZW1vdGUtZWIuYzogIENoYW5nZSB0aW1lb3V0IHRvIDI0IHNlY29uZHMgKCoxMCBmaXRzIGluIGJ5dGUpCgl0byBhY2NvdW50IGZvciBzbG93IGxvYWRpbmcgZnJvbSBmbG9wcGllcy4KCShlYl9jcmVhdGVfaW5mZXJpb3IpOiAgTmV3IGZuLCBmcm9tIGViX3N0YXJ0IGFuZAoJbmluZHlfY3JlYXRlX2luZmVyaW9yLgoJKGViX2Nsb3NlKTogIE9ubHkgdXNlIGxvZ19maWxlIGlmIG5vbnplcm8uCgkoZWJfeGZlcl9pbmZlcmlvcl9tZW1vcnkpOiAgSWYgbm90IHdyaXRpbmcsIHRoZW4gcmVhZCEKCShlYl9yZWFkX2luZmVyaW9yX21lbW9yeSwgZWJfd3JpdGVfaW5mZXJpb3JfbWVtb3J5KTogIFJldHVybiBsZW5ndGguCgkoZWJfa2lsbCk6ICBBIG5ldyBuby1vcC4KCShlYl9tb3Vybl9pbmZlcmlvcik6ICBSZW1vdmUgYnJlYWtwb2ludHMsIHRoZW4gZ2VuZXJpY2FsbHkgd2VlcC4KCkZyaSBEZWMgMTMgMTY6MDk6MjMgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCgoJKiBicmVha3BvaW50LmMsIGZpbmR2YXIuYywgaW5mcnVuLmMsIHB1dGVudi5jLCBzdGFjay5jOiAgRml4CgltaXNjZWxsYW5lb3VzIGNvbXBhcmlzb25zIG9mIGludGVnZXIgd2l0aCBOVUxMIHRoYXQgZWxpY2l0Cgljb21waWxlciB3YXJuaW5ncyBhYm91dCBjb21wYXJpc29uIG9mIGludGVnZXIgd2l0aCBwb2ludGVyLCB3aGVuCglOVUxMIGlzICgodm9pZCAqKSAwKSByYXRoZXIgdGhhbiBqdXN0IGEgYmFyZSAwLgoKV2VkIERlYyAxMSAxMzowMjo1OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9yZV9zZXRfb25lKTogIERpc2FibGUgZWFjaCBicmVha3BvaW50Cgl3aGlsZSB3ZSByZXNldCBpdCwgaW4gY2FzZSBvZiBwcm9ibGVtcy4gIFByaW50IGJyZWFrcG9pbnQgbnVtYmVyCglpbiBlcnJvciBtZXNzYWdlcy4KCgkqIGJ1aWxkc3ltLmMgKHJlYWRfc3RydWN0X3R5cGUpOiAgQXZvaWQgc3VuMyBjb21waWxlciBidWcgd2l0aAoJZm9vWy0tbl0uCgoJKiBzb3VyY2UuYyAoZmluZF9zb3VyY2VfbGluZXMpOiBJZiBnZXR0aW5nIGZpbGUgbW9kIHRpbWUgZmFpbHMsCglkb24ndCB3YXJuLgoKCSogdGFyZ2V0LmMgKHRhcmdldF94ZmVyX21lbW9yeSk6ICBJZiBlcnJubyBpcyBzZXQsIHJldHVybiBpdCwKCXJhdGhlciB0aGFuIEVJTy4KClR1ZSBEZWMgMTAgMDQ6MDc6MjIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgoKU3VuIERlYyAgOCAyMToxMzozMyAxOTkxICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IHNwaGFnbnVtLmN5Z251cy5jb20pCgoJKiBzeW10YWIuaCAoc3RydWN0IGZuX2ZpZWxkKTogQWRkIG5ldyBmaWVsZHMgYGlzX3ByaXZhdGUnLAoJYGlzX3Byb3RlY3RlZCcsIGBpc19zdHViJywgbWFraW5nIHJvb20gYnkgcmVkdWNpbmcgdGhlIHNpemUgb2YKCWB2b2Zmc2V0Jy4KCShzdHJ1Y3QgZm5fZmllbGRsaXN0KTogRGVsZXRlIHRoZSBmaWVsZHMgYHByaXZhdGVfZm5fZmllbGRfYml0cycKCWFuZCBgcHJvdGVjdGVkX2ZuX2ZpZWxkX2JpdHMnLgoJKFRZUEVfRk5fe1BSSVZBVEUsUFJPVEVDVEVEfV9CSVRTKTogRGVsZXRlZC4KCShTRVRfVFlQRV9GTl97UFJJVkFURSxQUk9URUNURUR9KTogRGVsZXRlZC4KCShUWVBFX0ZOX3tQUklWQVRFLFBST1RFQ1RFRH0pOiBEZWxldGVkLgoJKFRZUEVfRk5fRklFTERfe1NUVUIsUFJJVkFURSxQUk9URUNURUR9KTogTmV3IG1hY3Jvcy4KCSogdmFsb3BzLmMsIHZhbHByaW50LmMsIHN5bXRhYi5jOiBBbGwgY2FsbGVycyB1cGRhdGVkLgoKCSogYnVpbGRzeW0uYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IERlbGV0ZSB0aGUgYHZpc2liaWxpdHknIGZpZWxkCglmcm9tIGBzdHJ1Y3QgbmV4dF9mbmZpZWxkJywgYW5kIHJld29yayBjb2RlIHNvIHRoYXQgdmlzaWJpbGl0eQoJaW5mbyBpcyBzdG9yZWQgaW50byB0aGUgZm5fZmllbGQgZGlyZWN0bHkuICBBbHNvLCBoYWNrZWQgdG8gc2V0CglUWVBFX0ZOX0ZJRUxEX1NUVUIgZm9yIGJvdGggc3RhdGljIGFuZCBub3JtYWwgbWVtYmVyIGZ1bmN0aW9ucy4KClNhdCBEZWMgIDcgMTg6MTM6MTEgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCgoJKiBpMzg2LXRkZXAuYzogIEZpeCBhIHByb2JsZW0gb24gaTM4NiBzeXN0ZW1zIHdoZXJlIGJ1ZmZlcmVkIGNvZGUKCXN0cmVhbSBhY2Nlc3Mgd2FzIGZhaWxpbmcgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG1pbmltdW0gc2l6ZQoJZ3JhbnVsYXJpdHkgb2YgdGhlIGNvZGUgc2VjdGlvbi4gIEZvciBub3csIHRoZSBidWZmZXJpbmcgaXMgc2ltcGx5CglkaXNhYmxlZC4gIFRoZXJlIGlzIGEgc2ltaWxhciBwcm9ibGVtIGluIHRoZSBpMzg2IGRpc2Fzc2VtYmVyIGNvZGUKCXRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBmaXhlZCAoRklYTUUpLgoKCSogZ21hbGxvYy5jOiAgVXNlIG1hY3JvcyB0byBoaWRlIHNvbWUgb2YgdGhlIHVnbHkgY2FzdGluZyByZXF1aXJlZAoJaW4gdGhlIHByZXZpb3VzbHkgYXBwbGllZCBmaXggZm9yIHBvaW50ZXJzIHdpdGggaGlnaCBiaXRzIHNldC4KClNhdCBEZWMgIDcgMTY6NDk6MzUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBNYWtlZmlsZS5pbjogIFJvbGwgVkVSU0lPTiB0byA0LjMuMS4KClNhdCBEZWMgIDcgMDQ6MTI6MzUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJR0RCLTQuMyByZWxlYXNlIQoKCSogTWFrZWZpbGUuaW46ICBSb2xsIFZFUlNJT04gdG8gNC4zCgkqIFJFQURNRSwgVE9ETywgV0hBVFMuTkVXLCBkZXBlbmQ6ICBVcGRhdGUuCgoJKiBpbmZsb3cuYyAodGVybWluYWxfaW5mZXJpb3IpOiAgQXZvaWQgZXJyb3IgbXNnIGlmIGF0dGFjaGVkLgoKCSogZ21hbGxvYy5jOiAgRml4IGJ1ZyB0aGF0IGNhdXNlcyBtYWxsb2MgJiBmcmVlIHRvCglmYWlsIG9uIHN5c3RlbXMgd2hlcmUgcG9pbnRlcnMgaGF2ZSB0aGUgaGlnaCBiaXQgc2V0ICgweDgwMGVmY2YwCglmb3IgZXhhbXBsZSkuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvCglwb2ludGVycyBpcyBhIHNpZ25lZCBpbnRlZ2VyLCBzbyB0aGUgY29tcHV0YXRpb24KCgkgICAgICAgIChjaGFyICopIDB4ODAwZWZjZjAgLSAoY2hhciAqKSAwCgoJeWllbGRzIGEgbmVnYXRpdmUgdmFsdWUuICBUaGUgc2lnbiBvZiB0aGUgcmVzdWx0IG9mIHRoZSBtb2R1bHVzCglvcGVyYXRvciBpcyBtYWNoaW5lIGRlcGVuZGVudCBmb3IgbmVnYXRpdmUgb3BlcmFuZHMsIHRodXMgaXQgaXMKCXBvc3NpYmxlIGZvciBpdCB0byBlbmQgdXAgbmVnYXRpdmUuICBGcm9tIEZyZWQgRmlzaC4KClNhdCBEZWMgIDcgMDA6MDA6MTUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46IGluc3RhbGwgdXNpbmcgSU5TVEFMTF9QUk9HUkFNIGFuZCBJTlNUQUxMX0RBVEEuCgkgIGFkZGVkIGNsZWFuLWluZm8uICBhZGRlZCBzb21lIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQgYW5kIG1hZGUgaXQKCSAgbG9vayBsaWtlIG91ciBvdGhlciBNYWtlZmlsZXMuCgoJKiBjb25maWd1cmUuaW46IG1hcmsgdGhpcyBkaXJlY3RvcnkgdGFyZ2V0IGRlcGVuZGVudC4gIGNvbmZpZ3VyZQoJICBub3cgcnVucyBlbnRpcmVseSBpbiBvYmpkaXIgc28gbWFrZSBleGlzdGVuY2UgdGVzdHMgYW5kCgkgIHJlZmVyZW5jZXMgYWdhaW5zdCAke3NyY2Rpcn0uCgpGcmkgRGVjICA2IDA4OjMwOjM2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSwgc3RydWN0X3R5cGUpOiAgRml4ZXMgZm9yIG9wYXF1ZSBhbmQKCWFub255bW91cyBlbnVtZXJhdGlvbnMsIHN0cnVjdHVyZXMsIGFuZCB1bmlvbnMuICBOb3cgcGFzc2VzIGFsbAoJdGhlIGN1cnJlbnQgZ2RiIHRlc3Qgc3VpdGUgdGVzdHMuCgpUaHUgRGVjICA1IDIyOjQ2OjEzIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKCgkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgoJICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgoKVGh1IERlYyAgNSAyMTo1MzoyMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogIElmIFNLSVBfUFJPTE9HVUUgbGVhdmVzIHVzIGluCgltaWQtbGluZSwgYmUgbW9yZSBjYXJlZnVsIGFib3V0IHBvc3NpYmx5IGFkdmFuY2luZyB0byB0aGUgbmV4dCBsaW5lLgoKVGh1IERlYyAgNSAxODo1OTo1MSAxOTkxICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IGN5Z251cy5jb20pCgoJKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiBDYWxsIGBzdHJpbmdfbmVlZCcgd2hlbgoJbnVsbC10ZXJtaW5hdGluZyBhIHBhcnRpYWxseS1jb21wdXRlZCBzdHJpbmcuCgpUaHUgRGVjICA1IDE4OjE5OjQzIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSk6ICBCdWlsZCBhIGNvcnJlY3QgVFlQRV9OQU1FLCBhZGQgYQoJc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbWVtYmVyIG9mIHRoZSBlbnVtLgoKCSogZHdhcmZyZWFkLmMgKHN0cnVjdF90eXBlKTogIEJ1aWxkIGEgY29ycmVjdCBUWVBFX05BTUUuCgoJKiBkd2FyZnJlYWQuYyAoYWRkX2VudW1fcHN5bWJvbCk6ICBOZXcgZnVuY3Rpb24gdG8gZXh0cmFjdCBlbnVtCgltZW1iZXIgbmFtZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSB3aGlsZQoJYnVpbGRpbmcgcGFydGlhbCBzeW1ib2wgdGFibGVzLgoKVGh1IERlYyAgNSAxNzozMTowNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIHN5bXRhYi5jIChjaGVja19zdHViX21ldGhvZCk6ICBNdXN0IGFsbG9jYXRlIHR3byBleHRyYSBhcmd1bWVudAoJc2xvdHMgKG9uZSBmb3IgYHRoaXMnLCBvbmUgZm9yIGFyZ2xpc3QgdGVybWluYXRvcikuCgpUaHUgRGVjICA1IDEwOjUxOjA1IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogaW5mbG93LmMgKGNoaWxkX3Rlcm1pbmFsX2luZm8pOiBTdXBwbHkgbWlzc2luZyAnIicgY2hhcmFjdGVyLgoKCSogYnVpbGRzeW0uYyAoZGVmaW5lX3N5bWJvbCk6ICBTdXBwbHkgbWlzc2luZyBwYXJlbnRoZXNpcy4KClRodSBEZWMgIDUgMDM6MzQ6MjEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBjb3JlZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIEZlbmNlcG9zdCBlcnJvci4gIEZpeGVkIGJ5CglKYXkgTGVwcmVhdSA8bGVwcmVhdUBjcy51dGFoLmVkdT4uCgoJKiBpbmZsb3cuYzogIFJlbWVtYmVyIHdoZXRoZXIgR0RCIGhhcyBhIHRlcm1pbmFsLiAgQXZvaWQgc3dpdGNoaW5nCgl0ZXJtaW5hbHMgYmFjayBhbmQgZm9ydGggaWYgd2UgZG9uJ3QgaGF2ZSBvbmUuCgoJKiBjLWV4cC55IChwYXJzZV9udW1iZXIpOiAgWmVybyBpcyBub3QgYW4gdW5zaWduZWQgaW50IGNvbnN0YW50IQoJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6ICBFbnVtIHR5cGUgbnVtYmVycyBjYW4gYmUgaW4gKDEsMikgZm9ybS4KCglJbXByb3ZlIHR5cGUgcGFyc2luZy4KCSogYnVpbGRzeW0uYyAoZGVmaW5lX3N5bWJvbCwgcmVhZF9yYW5nZV90eXBlKTogQWRkCglsb25nX2tsdWRnZV9uYW1lIHRoYXQgcGFzc2VzIHRoZSBuYW1lcyBvZiByYW5nZSB0eXBlcyBiZWluZwoJZGVmaW5lZCwgZG93biB0byB3aGVyZSB3ZSBtdXN0IGNob29zZSBiZXR3ZWVuICdpbnQnIGFuZCAnbG9uZycKCXZhcmlhbnRzLiAgVGhpcyBmYWlscyBvbiBTdW4gQyBhbnl3YXkgc2luY2UgdGhlIGNvbXBpbGVyIGl0c2VsZiBpcwoJY29uZnVzZWQgYmV0d2VlbiBpbnQgYW5kIGxvbmcuCgkocmVhZF9hcnJheV90eXBlLCBjbGVhbnVwX3VuZGVmaW5lZF90eXBlcyk6ICBDb3JyZWN0IHRoZSBzaXplIG9mCglhcnJheSB0eXBlIHdob3NlIGVsZW1lbnQtdHlwZSBzaXplIGlzbid0IGltbWVkaWF0ZWx5IGtub3duLgoKCUVhcmx5IHByZXBhcmF0aW9uIHRvIGJsb3cgYXdheSBtYW55IGJ1aWx0aW4gdHlwZXMsIGJ1aWxkaW5nIHRoZW0KCW9uIHRoZSBmbHkgYXMgbmVlZGVkLiAgRG9uJ3QgY29tcGFyZSB0eXBlcyB0byBidWlsdGluIHR5cGVzIHdpdGgKCT09OyBleGFtaW5lIHRoZSByZWxldmFudCBmaWVsZHMgaW5zdGVhZC4KCSogY29mZnJlYWQuYyAocHJvY2Vzc19jb2ZmX3N5bWJvbDogQ19BUkcsIENfUkVHUEFSTSk6ICBBdm9pZCA9PS4KCSogYnVpbGRzeW0uYyAoZGVmaW5lX3N5bWJvbCwgY2FzZSAncCcpOiAgQXZvaWQgPT0uCgkqIHZhbG9wcy5jICh2YWx1ZV9hcmdfY29lcmNlKTogIEF2b2lkID09LiAgRG9uJ3QgYXNzdW1lIGhvc3QgYW5kCgl0YXJnZXQgdHlwZXMgYXJlIHRoZSBzYW1lLgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiAgSSBmaW5hbGx5IHVuZGVyc3RhbmQgYXJyYXlzLCByZW1vdmUgRklYTUUuCgoJKiBzeW1taXNjLmMgKHByaW50cHN5bXNfY29tbWFuZCk6ICBSZWR1Y2UgcmVkdW5kYW5jeSwgYW5kIHB1dCBhbGwKCWFkZHJlc3NlcyBpbiBHREIgaXRzZWxmIGludG8gcGFyZW5zIGZvciBlYXN5IGNsZWFudXAgYW5kIGRpZmZpbmcuCgpXZWQgRGVjICA0IDIxOjA1OjMwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogZHdhcmZyZWFkIChlbnVtX3R5cGUpOiAgQXJyYW5nZSBmb3IgdGhlIG9yZGVyIG9mIGVudW1lcmF0aW9uCgltZW1iZXJzIHRvIG1hdGNoIHRoZSBzb3VyY2UgY29kZSBvcmRlcjsgbm90IHRoZSBvcmRlciBpbiB0aGUKCUR3YXJmIGluZm9ybWF0aW9uLCB3aGljaCBpcyBleHBsaWNpdGx5IHJldmVyc2Ugb3JkZXIuCgpXZWQgRGVjICA0IDE4OjI0OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogbWFpbi5jIChpbnB1dF9mcm9tX3Rlcm1pbmFsX3ApOiAgQ2hlY2sgd2hldGhlciBHREIgaGFzIGEKCXRlcm1pbmFsIGF0IGFsbC4KCShpbml0aWFsaXplX21haW4pOiAgUmV2aXNlIGRvYyBmb3IgYHNldCBlZGl0aW5nJy4KCldlZCBEZWMgIDQgMTU6MzY6MzkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCgoJKiBkd2FyZnJlYWQuYyAoc3RydWN0X3R5cGUpOiAgSGFuZGxlIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyB3aGljaAoJY29udGFpbiBESUUncyBvdGhlciB0aGFuIGp1c3QgbWVtYmVyIGRpZXMuCgpXZWQgRGVjICA0IDAxOjU5OjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogc3ltZmlsZS5jIChyZXJlYWRfc3ltYm9scyk6ICBBdm9pZCBrbHVkZ2luZyBtdGltZV9zZXQsIG5vdyB0aGF0CglCRkQgaXMgZml4ZWQuCgpUdWUgRGVjICAzIDE3OjI0OjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46ICBWRVJTSU9OIDQuMi45Ni4KCgkqIG1haW4uYyAoaW5pdGlhbGl6ZV9tYWluKTogIFJldmlzZSBjb21tYW5kIGRlc2NyaXB0aW9ucy4KCSogY29tbWFuZC5jIChzaG93X3VzZXIpOiAgYGluZm8gdXNlcicgLT4gYHNob3cgdXNlcicuCQoJKiBzeW10YWIuYyAoX2luaXRpYWxpemVfc3ltdGFiKTogIFR5cG8gaW4gYGluZm8gdHlwZXMnIGRlc2MuCgoJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfcmVhZCk6ICBBdm9pZCBzZWxlY3Rfc291cmNlX3N5bXRhYiwKCXNpbmNlIGl0IGlzIG5vdCBuZWVkZWQgYW5kIGNhbiBjYXVzZSBlcnJvcnMgd2hlbiBleGFtaW5pbmcgIi5vInMuCgkocmVhZF9jb2ZmX3N5bXRhYiwgZGVjb2RlX2Jhc2VfdHlwZSk6ICBVc2UgY29tcGxhaW4sIG5vdCBwcmludGYuCglQcmludCBzeW1ib2wgbmFtZSwgbm90IGl0cyBudW1iZXIuCglSZW1vdmUgIiNpZiBkZWZpbmVkKGNsaXBwZXIpICNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIiwgd2hpY2gKCXNvbWVkYXkgc2hvdWxkIGdvIGluIGEgY2xpcHBlciB0YXJnZXQgY29uZmlnIGZpbGUuCgoJKiBzeW1maWxlLmMgKGNvbXBhY3RfbWlzY19mdW5jdGlvbl92ZWN0b3IpOiAgSGFuZGxlIGVtcHR5IHZlY3Rvci4KCShjb21wbGFpbiwgY2xlYXJfY29tcGxhaW50cywgc3ltc19mcm9tX29iamZpbGUpOiAgRml4IGNvbXBsYWludAoJZm9ybWF0dGluZy4KCSogeGNvZmZleGVjLmM6ICBDaGFuZ2Ugc3ltc19mcm9tX29iamZpbGUgY2FsbGVyLgoKCSogc3BhcmMteGRlcC5jOiAgRm9yY2UgdG0tZmlsZSBhcyB0bS1zcGFyYy5oLCB0byBtYWtlIGl0IGNvbXBpbGUKCXdoZW4gY29uZmlndXJlZCBmb3IgY3Jvc3MgZGVidWdnaW5nLiAgRklYTUUsIHRoaXMgbmVlZHMgYSBtb3JlCglnZW5lcmFsIHNvbHV0aW9uLgoKTW9uIERlYyAgMiAxMTowNDowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKCgkqIG1pcHMtdGRlcC5jIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiAgRmxvYXQgcmVnaXN0ZXIKCSdpJyBoYXMgZ2RiLWludGVybmFsIG51bWJlciAnRlAwK2knLCBub3QgJzMyK2knLgoJKiBtaXBzcmVhZC5jIChuZXdfc3ltYm9sKTogIFRyYW5zbGF0ZSBnKysgc3BlY2lhbAoJc3ltYm9sICIkdCIgdG8gInRoaXMiLgoKU2F0IE5vdiAzMCAyMToyOTo1NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQoJQ2hhbmdlcyBkdWUgdG8gaW5jbHVkZSBmaWxlIHJlbmFtaW5nOgoKCSogeGNvZmZyZWFkLmM6CWludGVybmFsY29mZi5oCS0+Y29mZi9pbnRlcm5hbC5jLAoJICAJCWNvZmYtcnM2MDAwLmgJLT5jb2ZmL3JzNjAwMC5oCgkqIG1pcHNyZWFkLmM6CWNvZmYtbWlwcy5oCS0+Y29mZi9taXBzLmgKCSogZWxmcmVhZC5jOiAgICBlbGYtY29tbW9uLmgJLT5lbGYvY29tbW9uLmggCgkJCWVsZi1leHRlcm5hbC5oCS0+ZWxmL2V4dGVybmFsLmgsCgkJCWVsZi1pbnRlcm5hbC5oCS0+ZWxmL2ludGVybmFsLmgKCSogZHdhcmZyZWFkLmMJZHdhcmYuaAkJLT5lbGYvZHdhcmYuaAoJKiBkYnhyZWFkLmM6CWFvdXQ2NC5oCS0+YW91dC9hb3V0NjQuaAoJCQlzdGFiLmdudS5oCS0+YW91dC9zdGFiX2dudS5oCgkJICAgCgkqIGNvZmZyZWFkLmM6ICAgaW50ZXJuYWxjb2ZmLmgJLT5jb2ZmL2ludGVybmFsLmgKCSogYnVpbGRzeW0uYzogICBzdGFiLmdudS5oCS0+YW91dC9zdGFiX2dudS5oCgkqIGRlcGVuZCAgICAgICAgVXBkYXRlZCB0byB0YWtlIHRoZSBhYm92ZSBpbnRvIGFjY291bnQuCgpGcmkgTm92IDI5IDE2OjU5OjI1IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogY29uZmlndXJlLmluOiAgQWRkIFNWUjQgaTM4NiBjb25maWd1cmF0aW9ucy4KCgkqIGNvbmZpZy9taC1pMzg2djQsIGNvbmZpZy9tdC1pMzg2djQsIHRtLWkzODZ2NC5oLCB4bS1pMzg2djQuaDoKCU5ldyBmaWxlcyBmb3IgaTM4Ni9TVlI0LgoKCSogdG0taTM4NnYuaDogIEFsbG93IFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEIGFuZAoJREVDUl9QQ19BRlRFUl9CUkVBSyB0byBiZSBwcmVkZWZpbmVkIGJ5IGZpbGVzIGluY2x1ZGluZyAKCXRtLWkzODZ2LmguCgoJKiBpMzg2LXRkZXAuYzogIEFkZCBzdXBwbHlfZ3JlZ3NldCgpLCBmaWxsX2dyZWdzZXQoKSwKCXN1cHBseV9mcHJlZ3NldCgpLCBhbmQgZmlsbF9mcHJlZ3NldCgpIGZ1bmN0aW9ucywgd2hpY2ggYXJlCgl0YXJnZXQgZGVwZW5kZW50IHN1cHBvcnQgZnVuY3Rpb25zIGZvciB0aGUgU1ZSNCAvcHJvYyByZWdpc3RlcgoJaW50ZXJmYWNlLgoKCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSwgc3RydWN0X3R5cGUpOiAgRXhwYW5kIHJlY29nbml6ZWQKCWNvbXBpbGVyIGdlbmVyYXRlZCB0YWdzIHRvIGluY2x1ZGUgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCAnLicgYXMKCXdlbGwgYXMgJ34nLgoKCSogc3ltdGFiLmMgKHNvdXJjZXNfaW5mbyk6ICBDaGFuZ2Ugc2ltcGxlIHByaW50ZiBvZiBlcnJvciBtZXNzYWdlCgl0byBjYWxsIHRvIGVycm9yKCkuCgpGcmkgTm92IDI5IDE2OjA0OjIxIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCgoJKiBkb2MvZ2RiLnRleGluZm86IHJlbW92ZSBsZWFkaW5nIGNvbW1lbnRzIHRoYXQgc3Vydml2ZWQgTTQgYnV0CiAgICAgICAgZGVzY3JpYmVkIGl0cyByb2xlIGluIHRoZSBkb2M7IGFkZCBvbmUgbW9yZSBmb250IHRvIGNvbG9waG9uOwogICAgICAgIHN0cmVuZ3RoZW4gZGlzY2xhaW1lciBhYm91dCB1bnN1cHBvcnRlZCBjb25maWdzLgoKV2VkIE5vdiAyNyAwMToyMzo0MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCglGaXggYnVncyBpbiBDKysgZGVidWdnaW5nLgoKCSogc3ltdGFiLmg6ICB0YXJnZXRfdHlwZSBpcyBub3QgdXNlZCBpbiByZWNvcmQgdHlwZXMuCglFbGltaW5hdGUgVFlQRV9NQUlOX1ZBUklBTlQgYW5kIFRZUEVfTkVYVF9WQVJJQU5ULiAgRWxpbWluYXRlCglsb29rdXBfbWV0aG9kX3R5cGUuICBBZGQgVFlQRV9UWVBFX1NQRUNJRklDIG1hY3JvLgoKCSogc3ltdGFiLmMgKGxvb2t1cF9tZW1iZXJfdHlwZSk6ICBEb24ndCBjaGFpbiB0aGVtIHVwLCBqdXN0CglhbGxvY2F0ZSBvbmUgaW4gc3ltYm9sX29ic3RhY2sgd2hlbiB3ZSBuZWVkIG9uZS4KCShhbGxvY2F0ZV9zdHViX21ldGhvZCk6ICBCdWlsZCBzdHViIGluIHN5bWJvbF9vYnN0YWNrLgoJKGNoZWNrX3N0dWJfbWV0aG9kKTogIE1vdmUgaGVyZSBmcm9tIHZhbHVlcy5jLiAgRG9uJ3QgZGVhbGxvY2F0ZQoJc3R1Yjsgb3ZlcndyaXRlIGl0LgoJKGxvb2t1cF9tZXRob2RfdHlwZSk6ICBHb25lIG5vdy4KCgkqIGJ1aWxkc3ltLmM6IEhhbmRsZSBnKysgdjEgc3RhYnMgYSBsaXR0bGUgYml0IGJldHRlci4KCUNoYW5nZSBzb21lIEMrKyBwYXJzaW5nIGVycm9yKClzIHRvIGNvbXBsYWluKCl0cy4KCSogYnVpbGRzeW0uYywgZmluZHZhci5jLCBwcmludGNtZC5jLCBzeW10YWIuYzogIE1ha2UgdW5pb25zIGFuZAoJc3RydWN0cyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCB3b3JrIHRoZSBzYW1lIGFzIGZhciBhcwoJQysrIGlzIGNvbmNlcm5lZC4gCgkqIGJ1aWxkc3ltLmMsIHN5bXRhYi5jLCB2YWx1ZXMuYzogUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvCglUWVBFX01BSU5fVkFSSUFOVCBhbmQgVFlQRV9ORVhUX1ZBUklBTlQuCgoJKiB2YWxvcHMuYzogIEltcHJvdmUgY29tbWVudHMgYW5kIGluZGVudGF0aW9uLiAgT25seSBjYWxsCgljaGVja19zdHViX21ldGhvZCB3aGVuIHRoZSBzdHViIGZsYWcgaXMgb24uCgkqIHZhbHByaW50LmM6ICBGaXggb3IgbWFyayBtaW5vciBidWdzIGFuZCB1bnBvcnRhYmlsaXRpZXMuCgkKCSogY29mZnJlYWQuYyAoYW5vbnltb3VzIHVuaW9ucyk6ICBBbGxvY2F0ZSBhIGNwbHVzIHN0cnVjdHVyZS4KCgkqIG1pcHNyZWFkLmM6ICBFbGltaW5hdGUgInRlbXBsYXRlIiB0eXBlcy4gIEJ1aWxkIG5ldywgcmVhbAoJdHlwZXMgd2hlbmV2ZXIgd2UgbmVlZCB0aGVtLiAgQWxsb2NhdGUgY3BsdXMgc3RydWN0dXJlcyBhcyBuZWVkZWQuCglCdWxsZXRwcm9vZiB0aGUgdHlwZSBwYXJzaW5nIGEgYml0IG1vcmUuICBNYXJrIHN0b3JhZ2UgbGVha3MuCgkocGFyc2VfdHlwZSk6ICBDb3B5IFRZUEVfVFlQRV9TUEVDSUZJQyB3aGVuIGNvcHlpbmcgYSByZWFsIHR5cGUKCW9uIHRvcCBvZiBhIHBhcnRpYWwgdHlwZS4KCkZyaSBOb3YgMjIgMTY6Mzk6NTcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBpbmZsb3cuYyAodGVybWluYWxfaW5mZXJpb3IpOiAgQ2hlY2sgdGhlIHJlc3VsdHMgb2YgaW9jdGwncywgYW5kCglwcmludCBhIG1lc3NhZ2UgaWYgYW55IG9mIHRoZW0gZmFpbC4KCSh0ZXJtaW5hbF9vdXJzXzEpOiAgU3RvcmUgcmVzdWx0IG9mIGlvY3RsJ3MgZm9yIGRlYnVnZ2luZywgYnV0Cglkb24ndCBwcmludCAodGhlIHRlcm1pbmFsIGlzbid0IG91cnMuLi4pLgoKCSogdG0tdGFob2UuaCAoRlJBTUVfQVJHU19BRERSRVNTKTogIE5vIG5lZWQgdG8gb2Zmc2V0IGZyb20gZnJhbWUKCXBvaW50ZXIuCgoJKiBtMi1leHAueSAoTUFYLCBNSU4pOiAgUmVuYW1lIHRvIE1BWF9GVU5DLCBNSU5fRlVOQyB0byBhdm9pZAoJY29uZmxpY3RzIHdpdGggc3lzdGVtIGhlYWRlciBmaWxlcy4KCkZyaSBOb3YgMjIgMDg6Mjc6NDAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBSb2xsIFZFUlNJT04gdG8gNC4yLjk1LgoKCSogYnVpbGRzeW0uYywgY29yZWRlcC5jLCBtZW0tYnJlYWsuYywgeGNvZmZyZWFkLmM6ICBQdXQgPHN0ZGlvLmg+CglmaXJzdCwgYmVmb3JlIGRlZnMuaC4KCSogY29uZmlnL21oLWkzODZzY286IE92ZXJyaWRlIGNvbXBpbGVyIHRvIGdjYywgcHJpbnQgd2FybmluZy4KCSogY29uZmlndXJlLmluOiAgSGFuZGxlIGkzODYtbm9uZS1hb3V0IHJhdGhlciB0aGFuIGkzODYtYW91dC1ub25lLgoJKiBpbmZwdHJhY2UuYywgbGFuZ3VhZ2UuaCwgdXRpbHMuYzogIExpbnQuCgkqIG0yLWV4cC55OiAgI3VuZGVmIE1BWCBhbmQgTUlOIGluIGNhc2Ugc3lzdGVtIGluY2x1ZGVzIHNldCB0aGVtLgoJKiB4bS10YWhvZS5oOiAgU2V0IEhPU1RfQllURV9PUkRFUi4gIEluY2x1ZGUgc3lzdGVtIHZlcnNpb25zIG9mCgl7QklHLExJVFRMRX1fRU5ESUFOIGFuZCB0aGUgSU5UX01BWCBmYW1pbHkgZmlyc3QsIHRvIGF2b2lkCglyZWRlZmluaXRpb24gd2FybmluZ3MuCgkqIGRlZnMuaDogIFJlb3JkZXIgdGhpbmdzIHNvIHRoYXQgdGhlIHhtLWZpbGUgZ2V0cyBmaXJzdCBjcmFjawoJYXQgI2RlZmluZSdzLCBmb2xsb3dlZCBieSBkZWZzLmggYW5kIHRoZW4gdGhlIHRtLWZpbGUuCgkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHNwYWNlcyBhZnRlciAnaWdub3JlIGV4aXQgY29kZScgLSBmbGFncy4KCUxhdGUtbW9kZWwgQlNEICdtYWtlJ3MgZG9uJ3QgY29wZSB3aXRoIHRoZW0uCgpUaHUgTm92IDIxIDIzOjQ4OjU2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46ICBSb2xsIG5ldyBmaWxlcyBpbnRvIHZhcmlvdXMgbGlzdHMuCgpUaHUgTm92IDIxIDE4OjI2OjExIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogZHdhcmZyZWFkLmMgKHN0cnVjdF90eXBlKTogIE11c3QgaW5pdGlhbGl6ZSB0aGUgYysrIHNwZWNpZmljCglwb3J0aW9uIG9mIHVuaW9uIHR5cGVzIGFzIHdlbGwgYXMgc3RydWN0IHR5cGVzLCBzaW5jZSBnZGIgYXR0ZW1wdHMKCXRvIHJlZmVyZW5jZSB0aGUgYysrIHNwZWNpZmljIGluZm8gZm9yIGJvdGggdHlwZXMuCgpUaHUgTm92IDIxIDEwOjIzOjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46IFJvbGwgVkVSU0lPTiB0byA0LjIuOTAuCgoJKiBkZWZzLmg6ICBJbmNvcnBvcmF0ZSBwYXJhbS5oIGludG8gZGVmcy5oLiAgQWxsIHVzZXJzIGNoYW5nZWQuCgkqIHBhcmFtLW5vLXRtLmg6ICBDaGFuZ2UgdXNlcnMgdG8gZGVmaW5lIFRNX0ZJTEVfT1ZFUlJJREUgaW5zdGVhZC4KCSogcGFyYW0uaCwgcGFyYW0tbm8tdG0uaDogIFJlbW92ZWQuCgkqIFVwZGF0ZSBjb3B5cmlnaHRzIGluIGFsbCBjaGFuZ2VkIGZpbGVzLgoJKiBkYnhyZWFkLmMsIGR3YXJmcmVhZC5jLCBpbmZsb3cuYywgaW5mcnVuLmMsIG0yLWV4cC55LCBwdXRlbnYuYywKCXNvbGliLmMsIHN5bXRhYi5oLCB0bS11bWF4LmgsIHZhbHByaW50LmM6ICBMaW50LgoJKiB0bS1jb252ZXguaCwgdG0taHAzMDBocHV4LmgsIHRtLW1lcmxpbi5oLCB0bS1zcGFyYy5oLAoJeG0tbWVybGluLmg6ICBBdm9pZCBob3N0IGluY2x1ZGUgZmlsZXMgaW4gdGFyZ2V0IGRlc2NyaXB0aW9ucy4KCSogZ2V0cGFnZXNpemUuaDogIFJlbW92ZWQsIGxpYmliZXJ0eSBjb3BlcyBub3cuCgkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIGdldHBhZ2VzaXplLmgsIHBhcmFtLmgsIHBhcmFtLW5vLXRtLmguCgoJKiBleGVjLmMgKGV4ZWNfZmlsZXNfaW5mbyk6ICBJZiBgdmVyYm9zZScgaXMgc2V0LCBzaG93IGZpbGUgb2Zmc2V0CglhcyB3ZWxsLgoKCSogbWFpbi5jOiAgVXNlIGdldGN3ZCByYXRoZXIgdGhhbiBnZXR3ZC4KCSogc3RhbmRhbG9uZS5jOiAgRmFrZSBnZXRjd2QgcmF0aGVyIHRoYW4gZ2V0d2QuCgkqIHhtLSouaDogIFJlbW92ZSBmYWtlIHZhbHVlcyBvZiBNQVhQQVRITEVOLgoKCSogeGNvZmZleGVjLmM6ICBBZGQgLyogKi8gdG8gI2lmIDAnZCB0aGluZyB0byBoZWxwIEFOU0kuCgpXZWQgTm92IDIwIDE4OjM1OjU2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogUmVtb3ZlIGdkYi9ocC1pbmNsdWRlLiAgU3VwcG9ydCBmb3IgSFAgYS5vdXQgb2RkaXRpZXMgc2hvdWxkIGJlCglpbiBCRkQsIG5vdCBpbiBHREIuICBNb3ZlIGdkYi9ocC1pbmNsdWRlL2Eub3V0LmggdG8gaW5jbHVkZS9hLm91dC5ocC5oLgoKCSogaW5mcHRyYWNlLmMsIHRtLXN1bjM4Ni5oOiAgQ2FzaGllciA8YS5vdXQuZ251Lmg+LCByZW1vdmUgcmVmcy4KCgkqIGNvbmZpZ3VyZS5pbiwgeGNvbmZpZywgdGNvbmZpZywgTWFrZWZpbGUuaW4sIGRvYy9nZGJpbnQudGV4aW5mbzoKCU1ha2VmaWxlIGZyYWdtZW50cyBmb3IgdmFyaW91cyBob3N0cyBhbmQgdGFyZ2V0cyBub3cgY29tZSBmcm9tCglnZGIvY29uZmlnL21oLSogYW5kIGdkYi9jb25maWcvbXQtKi4gIFRoaXMgaXMgZm9yIGNvbnNpc3RlbmN5IHdpdGgKCW90aGVyIGNvbmZpZyBzZXR1cHMuCgoJKiByczYwMDAtcGluc24uYywgcnM2ay1vcGNvZGUuaDogIENsZWFuIHVwLgoJKiByczZrLW9wY29kZS5kZWY6ICBEZWxldGUuCgpXZWQgTm92IDIwIDA1OjA0OjQwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogZHdhcmZyZWFkLmM6ICBSZWNvZ25pemUgb2Jzb2xldGUgZm9ybSBvZiBBVF9lbGVtZW50X2xpc3QKCWF0dHJpYnV0ZSBzdGlsbCB1c2VkIGJ5IGF0IGxlYXN0IG9uZSBBVCZUIGNvbXBpbGVyLCBhbmQgcG9zc2libHkKCW1vcmUuCgpUdWUgTm92IDE5IDA3OjUzOjU1IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSwgc3RydWN0X3R5cGUpOiAgSWdub3JlIG5hbWVzIGludmVudGVkIGJ5CgloZWxwZnVsIGNvbXBpbGVycyBmb3IgYW5vbnltb3VzIHN0cnVjdHMsIHVuaW9ucywgYW5kIGVudW1zLgoKCSogYy1leHAueSwgbTItZXhwLnk6ICBBZGQgZGVmaW5lcyBmb3IgeXltYXhkZXB0aCwgeXlfeXlzLCBhbmQKCXl5X3l5diwgc28gbXVsdGlwbGUgcGFyc2VycyBwcm9kdWNlZCBieSBTVlI0IHZlcnNpb25zIG9mIHlhY2MKCWNhbiBjb2V4aXN0IGluIHRoZSBzYW1lIGV4ZWN1dGFibGUgd2l0aG91dCBjb2xsaXNpb24uCgoJKiBzeW10YWIuaDogIEFkZCBkZWNsYXJhdGlvbiBmb3IgbG9va3VwX3RlbXBsYXRlX3R5cGUoKSB0byBraWxsCgljb21waWxlciB3YXJuaW5ncyBhYm91dCBjb252ZXJzaW9ucyBmcm9tIGludCB0byBwb2ludGVyLgoKTW9uIE5vdiAxOCAxNzo0NToxOCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKCgkqIHByb2Nmcy5jOiAgTW92ZSBpbmNsdXNpb24gb2YgZGVmcy5oIHRvIGJlZm9yZSBwYXJhbS5oLCBhcyBpbgoJYWxsIHRoZSBvdGhlciBzb3VyY2UgZmlsZXMgdGhhdCBpbmNsdWRlIGJvdGguICBUaGlzIGlzIHJlcXVpcmVkCgl0byBzdXBwbHkgc29tZSB0eXBlZGVmcyB0aGF0IGFyZSB1c2VkIGluIGZpbGVzIGluY2x1ZGVkIGJ5IHBhcmFtLmguCgoJKiBtNjhrLXRkZXAuYyAobTY4a19za2lwX3Byb2xvZ3VlKTogIEFkZCBnZW5lcmljIG02OGsgc3VwcG9ydCBmb3IKCXNraXBwaW5nIGZ1bmN0aW9uIHByb2xvZ3VlcywgYWxhIHRoZSBvdGhlciBjcHUgZmFtaWxpZXMgKGkzODYsCgltaXBzLCBtODhrLCBldGMpLiAgQWRkIHRoZSBhYmlsaXR5IHRvIHNraXAgbW92bSBhbmQgZm1vdm0KCWluc3RydWN0aW9ucyBpbiB0aGUgcHJvbG9ndWVzLiAgU3RpbGwgbmVlZHMgc3VwcG9ydCBmb3IgcHJvZmlsZQoJKC1wIGNvbXBpbGVkKSBwcm9sb2d1ZSBzZXF1ZW5jZXMgKEZJWE1FKS4KCgkqIHRtLTY4ay5oOiAgQ2hhbmdlIFNLSVBfUFJPTE9HVUUgbWFjcm8gdG8gdXNlIHRoZSBuZXcgZ2VuZXJpYwoJbTY4ayBwcm9sb2d1ZSBza2lwcGluZyBmdW5jdGlvbiBieSBkZWZhdWx0LgoKCSogdG0tYWx0b3MuaCwgdG0taXNpLmg6ICBDb250aW51ZSB0byB1c2UgdGhlIG9sZCBkZWZpbml0aW9uIG9mCglTS0lQX1BST0xPR1VFLgoKTW9uIE5vdiAxOCAxNToxMjo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHRkZXNjIHN0dWZmLCBhbmQgZXh0cmEgYmxhbmtzIGJlZm9yZSBjb2xvbnMuCgkqIGJsb2NrZnJhbWUuYzogIFJlbW92ZSB0ZGVzYy1yZWxhdGVkIGNvZGUuICBEZWZhdWx0CglGUkFNRV9DSEFJTl9DT01CSU5FLgoJKiBpbmZydW4uYzogIFJlbW92ZSB0ZGVzYy1yZWxhdGVkIGNvZGUuCgkqIG04OGstdGRlcC5jIChmcmFtZV9jaGFpbl9jb21iaW5lLCBpbml0X2ZyYW1lX3BjKTogIFJlbW92ZSBjb3BpZXMKCW9mIGRlZmF1bHRhYmxlIHRoaW5ncy4KCSogdG0tbTg4ay5oOiAgTmV3IGZpbGUsIGNvbW1vbiB0byBhbGwgTW90byA4OGsgdGFyZ2V0IGNvbmZpZ3MuCglEZXJpdmVkIGZyb20gdG0tZGVsdGE4OC5oLgoJKiB0bS1kZWx0YTg4Lmg6ICBVc2UgaXQuCgkqIHhtLW04OGsuaDogIENvbW1vbiBmaWxlIGZvciA4OEsgaG9zdHMuICBSZW1vdmUgb2Jzb2xldGUgc3R1ZmYuCgkqIHhtLWRlbHRhODguaDogIFVzZSBpdC4KCSogdG0tKi5oOiAgUmVtb3ZlIEZSQU1FX0NIQUlOX0NPTUJJTkUgbWFjcm9zLCBzaW5jZSBhbGwgYXJlCglkZWZhdWx0LgoJKiBjb2ZmcmVhZC5jOiAgUmVtb3ZlIHRkZXNjIHN0dWZmLgoJKiB0Y29uZmlnL2RlbHRhODgsIHRjb25maWcvbTg4azogIFJlbW92ZSB0ZGVzYyBzdHVmZi4KCSogeGNvbmZpZy9tODhrOiAgUmVuYW1lIHRtLTg4ay5oIHRvIHRtLW04OGsuaC4KCk1vbiBOb3YgMTggMTM6NTE6MzcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCgoJKiBzb3VyY2UuYyAob3Blbl9zb3VyY2VfZmlsZSk6ICBJZiBvcGVucCBmYWlscywgdHJ5IGFnYWluCgl1c2luZyBqdXN0IHRoZSBiYXNlIChub24tZGlyZWN0b3J5KSBwYXJ0IG9mIHRoZSBmaWxlbmFtZS4KCVRoaXMgc29sdmVzIHZhcmlvdXMgYW5ub3lpbmcgcHJvYmxlbXMsIHN1Y2ggYXMgd2hlbiB0aGUKCXNvdXJjZSB3YXMgY29tcGlsZWQgd2l0aCBhbiBhYnNvbHV0ZSBwYXRobmFtZSAtIGFuZCB0aGUKCXNvdXJjZSBmaWxlcyBoYXZlIG1vdmVkLiAgT3IgaWYgdGhlIHNvdXJjZSB3YXMgY29tcGlsZWQKCXVzaW5nIGEgcmVsYXRpdmUgcGF0aG5hbWUsIGl0IGNhbiBiZSBtb3JlIGNvbnZlbmllbnQKCXRvIGp1c3Qgc3BlY2lmaWMgdGhlIHNvdXJjZSBkaXJlY3RvcnkgdG8gdGhlIGRpciBjb21tYW5kLgoKTW9uIE5vdiAxOCAwMDowNDo0MSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKCgkqIGNwbHVzLWRlbS5jIChtdW5nZV9mdW5jdGlvbl9uYW1lKTogIEFkZCBtaXNzaW5nIHRoaXJkIGFyZyB0bwoJaW5zdGFuY2Ugb2YgY2FsbCB0byBkb190eXBlKCkuCgoJKiBkd2FyZnJlYWQuYzogIENoYW5nZXMgdG8gbWF0Y2ggbmV3IGR3YXJmLmguICBSZW1vdmUgCglBVF9kZXJpdl9saXN0LCBBVF9sb2NsaXN0LCBBVF9pbmNvbXBsZXRlLCBBVF9jb25zdF9kYXRhLAoJYW5kIEFUX2lzX2V4dGVybmFsLgoKU3VuIE5vdiAxNyAxNjoyMDo1MyAxOTkxICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IHJ0bC5jeWdudXMuY29tKQoKCSogc3ltdGFiLmggKHN0cnVjdCB0eXBlKTogTW92ZWQgQysrLXNwZWNpZmljIGZpZWxkcyBpbnRvIG5ldyB0eXBlCglgc3RydWN0IGNwbHVzX3N0cnVjdF90eXBlJy4gIE5vdyB0YWtlcyAxMCUgbGVzcyBtZW1vcnkuICBNYW55CgltYWNyb3MgY2hhbmdlZC4KCSogc3ltdGFiLmMgKGluaXRfdHlwZSk6IERvbid0IHNldCBmaWVsZHMgYmVsb25naW5nIHRvCglUWVBFX0NQTFVTX1NQRUNJRklDIHVubGVzcyBUWVBFIGlzIFRZUEVfQ09ERV9TVFJVQ1QuCgkqIGJ1aWxkc3ltLmMgKHJlYWRfdHlwZSk6IEFsbG9jYXRlIFRZUEVfQ1BMVVNfU1BFQ0lGSUMgZm9yCglUWVBFX0NPREVfU1RSVUNULgoJKHJlYWRfc3RydWN0X3R5cGUpOiBEaXR0by4gIEFsc28sIGFkZCBjb21tZW50cyBhYm91dCBob3cgd2UgY2FuCglkZWR1Y2UgVFlQRV9WUFRSX0ZJRUxETk8gZnJvbSBpbmhlcml0YW5jZSBpbmZvIGFuZCBmaWVsZG5hbWUgaW5mby4KCSogY29mZnJlYWQuYyAoZGVjb2RlX2Jhc2VfdHlwZSk6IEFsbG9jYXRlIFRZUEVfQ1BMVVNfU1BFQ0lGSUMgZm9yCglUWVBFX0NPREVfU1RSVUNULgoJKHJlYWRfc3RydWN0X3R5cGUpOiBEaXR0by4KCSogZHdhcmZyZWFkLmMgKHN0cnVjdF90eXBlKTogRGl0dG8uCgoJKiBzeW10YWIuYyAocmVhZF9yYW5nZV90eXBlKTogRG9uJ3Qgc2V0IFRZUEVfTUFJTl9WQVJJQU5ULgoJKGxvb2t1cF9wb2ludGVyX3R5cGUpOiBEb24ndCB1c2Ugb3Igc2V0IFRZUEVfTUFJTl9WQVJJQU5ULgoJKGxvb2t1cF9yZWZlcmVuY2VfdHlwZSk6IERpdHRvLgoKCSogY3BsdXMtZGVtLmM6IE1hbnkgY2hhbmdlcyBtYWRlIHRvIGhhbmRsZSBkZWNvZGluZyBvZgoJQU5TSS1tYW5nbGVkIG5hbWVzLgoJKiBzeW10YWIuYyAoZ2RiX21hbmdsZV9uYW1lKTogTWFuZ2xlL2RlbWFuZ2xlIEFOU0ktbWFuZ2xlZCBuYW1lcwoJYXMgd2VsbC4KCkZyaSBOb3YgMTUgMTc6NTc6NTkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKCgkqIG1pcHNyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBwYXRjaCB0byBrZWVwIERFQyBDCgljb21waWxlciBmcm9tIG1ha2luZyBnZGIgYm9tYiBvdXQuICBUaGFua3MgdG8gRWQgU2FudGlhZ28hCgpUaHUgTm92IDE0IDE5OjI3OjMwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogc3ltZmlsZS5jOiAgQWRkIGZ1bmN0aW9uIGNvbXBhY3RfbWlzY19mdW5jdGlvbl92ZWN0b3IoKSB0bwoJcmVtb3ZlIGR1cGxpY2F0ZSBtaXNjIGZ1bmN0aW9uIHZlY3RvciBlbnRyaWVzLiAgU2VlIGNvbW1lbnRzCglpbiBzb3VyY2UgZm9yIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS9kZXNpcmFibGUuCgoJKiBkd2FyZnJlYWQuYzogIEFkZCBtaXNjIGZ1bmN0aW9uIHR5cGUgcGFyYW1ldGVyIHRvIGludGVybmFsCglyZWNvcmRfbWlzY19mdW5jdGlvbigpLiAgUmVtb3ZlIGNhbGxzIHRvIGluaXRfbWlzY19idW5jaGVzKCkKCWFuZCBjb25kZW5zZV9taXNjX2J1bmNoZXMoKSwgdGhlc2UgYXJlIG5vdyBkb25lIGluIGVsZnJlYWQuYy4KCgkqIGVsZnJlYWQuYzogIEFkZCBzdXBwb3J0IGZvciByZWFkaW5nIGJmZCBjYW5vbmljYWwgc3ltYm9sIHRhYmxlcwoJYW5kIGdlbmVyYXRpbmcgbWlzYyBmdW5jdGlvbiB2ZWN0b3IgZW50cmllcyBmb3IgZ2xvYmFsIGFuZAoJYWJzb2x1dGUgc3ltYm9scy4gIERvIGNhbGxzIHRvIGluaXRfbWlzY19idW5jaGVzKCkgYW5kCgljb25kZW5zZV9taXNjX2J1bmNoZXMoKSB3aGVyZSB0aGV5IHdpbGwgZW5jbG9zZSBhbGwgY2FsbHMgdG8KCXJlY29yZF9taXNjX2Z1bmN0aW9uKCksIGluY2x1ZGluZyB0aG9zZSBpbiBkd2FyZnJlYWQuYy4KClRodSBOb3YgMTQgMTc6MDI6MTEgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKCgkqIGRvYy9NYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgZ2RiLm1lLCBnZGIubXMsIGdkYi5tbQoJKHJvZmZhYmxlIGRvY3VtZW50YXRpb24pLgoJKiBkb2MvZ2RiLnRleGluZm86IGVtYmVkZGVkIGhpbnRzIChhcyBjb21tZW50cykgZm9yIGJldHRlcgoJdGV4aTJyb2ZmIGNvbnZlcnNpb24uCgpUaHUgTm92IDE0IDEzOjE4OjI1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogbTg4ay10ZGVwLmMgKGV4YW1pbmVfcHJvbG9ndWUpOiAgRGVhbCB3aXRoIE9SIGluc3RydWN0aW9ucwoJdGhhdCBzaHVmZmxlIHBhcmFtZXRlcnMgaW50byBvdGhlciByZWdzLgoJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6ICBGaXggYnVnIGludHJvZHVjZWQgaW4gUGVyJ3MgY2hhbmdlCglvZiBOb3YgMTJ0aC4KCldlZCBOb3YgMTMgMTk6NTE6MTEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKCgkqIE1ha2VmaWxlLmluLCB4Y29uZmlnL2RlbHRhODggbWFkZSBpdCBpbnN0YWxsIGEgc3lzViBtYW51YWwgcGFnZTsKCWdkYi56IGludG8gdGhlIHJpZ2h0IHBsYWNlLgoKV2VkIE5vdiAxMyAxNjo0NToxMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCglNb3Rvcm9sYSA4ODAwMCBwb3J0IHdpdGhvdXQgdGVhcnMsIEkgbWVhbiB3aXRob3V0IHRkZXNjcy4KCgkqIG04OGstdGRlcC5jOiAgQmxvdyBhd2F5IGFsbCB0ZGVzYyBzdHVmZi4KCVByb3ZpZGUgZnVuY3Rpb25zIGZvciBhbGwgdGhlIGZyYW1lLXJlbGF0ZWQgbWFjcm9zIGluCgl0bS1kZWx0YTg4LmguICBBZG9wdCBpOTYwLXN0eWxlIEVYVFJBX0ZSQU1FX0lORk8uCgkoZXhhbWluZV9wcm9sb2d1ZSwgZnJhbWVfZmluZF9zYXZlZF9yZWdzLCBza2lwX3Byb2xvZ3VlKTogIGJvcnJvdwoJZnJvbSBpOTYwLXRkZXAuYyBhbmQgYWRhcHQgdG8gdGhlIGZ1bmN0aW9uIHByb2xvZ3VlcyBvbiB0aGUgODhrLgoJKHJlYWRfbmV4dF9mcmFtZV9yZWcpOiAgQm9ycm93IGZyb20gbWlwcy10ZGVwLmMuCglGSVhNRTogIGZyYW1lX2xvY2Fsc19hZGRyZXNzIHNob3VsZCBnbyBhd2F5LgoKCSogdG0tZGVsdGE4OC5oOiAgRHVtcCBhbGwgdGhlIHRkZXNjIHN0dWZmLgoJTWFjcm9zIGZvciBhbGwgZnJhbWUtcmVsYXRlZCBzdHVmZiBjYWxsIGZucyBvZiBzYW1lIG5hbWUuCglSZW1vdmUgZHVwbGljYXRlZCBkZWZpbml0aW9ucy4gIEZQX1JFR05VTSBiZWNvbWVzIHNhbWUgYXMKCVNQX1JFR05VTS4gIAoKCSogeG0tODhrLmg6ICBFbGltaW5hdGUgbG90cyBvZiBsaWJyYXJ5IGRlcGVuZGVuY2llcywgbm93IGhhbmRsZWQKCWluIGxpYmliZXJ0eS4gIEVsaW1pbmF0ZSBLREIgbm9uc3VwcG9ydC4KCgkqIGRvYy9nZGJpbnQudGV4aW5mbzogIEFkZCBydWRpbWVudHMgb24gZnJhbWVzLiAgRklYTUUsIGFkZCBtb3JlLgoKCgkqIHN0YWNrLmMgKGZyYW1lX2luZm8pOiAgTWFyayBmcmFtZWxlc3MgZnVuY3Rpb25zLgoJUHJpbnQgbG9jYWxzIGFkZHJlc3MgKEZJWE1FLCByZW1vdmUgaWYgc2FtZSkuCgkqIGJsb2NrZnJhbWUuYzogIENvbW1lbnQgY2hhbmdlcywgRklYTUUgYWZ0ZXIuCgkqIGNvZmZyZWFkLmM6ICBFdmVuIHdpdGhvdXQgVERFU0MsIG5lZWQgdG8gemFwICJAIiBzeW1ib2xzLgoJRG9uJ3QgcmVnaXN0ZXIgZm9yIHdpZXJkIGZvcm1hdCBuYW1lczsgY2hhbmdlIHRoZSBuYW1lcyBpbiBCRkQuCgoJKiBhbGxvY2EuYywgbGFuZ3VhZ2UuYywgdGRlc2MuYzogIExpbnQuCgkqIHRkZXNjLmMsIHRkZXNjLWxpYjogRklYTUU6ICByZW1vdmUgdGhlc2UuCgpUdWUgTm92IDEyIDE5OjMwOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46ICBBZGQgdGRlc2MgbGlicmFyeSBzdXBwb3J0LiAgRml4dXBzIHRvIGxpbnQsCgljb3B5aW5nLmMgcnVsZXMuCgpUdWUgTm92IDEyIDEzOjQzOjI2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQoKCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiAgUmVtb3ZlIHNwdXJpb3VzIGNhbGwgdG8gb3BlcmF0b3JfY2hhcnMuCgoJQWxsb3cgc2V0dGluZyBicmVha3BvaW50cyBvbiBDKysgZGVzdHJ1Y3RvcnMuCgkqIHZhbG9wcy5jIChkZXN0cnVjdG9yX25hbWVfcCk6ICBEb24ndCBjaGVjayBUWVBFX0hBU19ERVNUUlVDVE9SLAoJc2luY2UgaXQgbGllcy4gIFJlbHkgb24gY2FsbGVycyB0byBjYXRjaCBtaXNzaW5nIGRlc3RydWN0b3JzLgoJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6ICBGb3IgZXhhbXBsZSAoc2VlIGFib3ZlKSwgaGVyZS4KCSogYnVpbGRzeW0uYywgc3ltdGFiLmg6ICBSZW1vdmUgVFlQRV9GTEFHU19IQVN7Q09OLERFfVNUUlVDVE9SCglmbGFncyBzaW5jZSB0aGV5IGFyZSBubyBsb25nZXIgdXNlZC4KCglGaXhlcyB0byBzdXBwb3J0IEMrKyBtZXRob2RzIHdpdGggZnVuY3Rpb25hbCBwYXJhbWV0ZXJzLgoJKiBjLWV4cC55IChmdW5jX21vZCBydWxlKTogIEFsbG93IChhbmQgaWdub3JlKSBsaXN0IG9mIHBhcmFtZXRlcgoJdHlwZXMgaW4gYSBmdW5jdGlvbiB0eXBlLgoJKiBldmFsLmMgKHBhcnNlX2FuZF9ldmFsX3R5cGUpLCB2YWx1ZS5oOiAgTmV3IGZ1bmN0aW9uLAoJcGFyc2VfYW5kX2V2YWxfdHlwZSwgaXMgYmFzZWQgb24gb2xkIGNvZGUgZnJvbSBjaGVja19zdHViX21ldGhvZC4KCUJ1dCBkb24ndCBhY3R1YWxseSBldmFsdWF0ZSB0aGUgY2FzdCwgc2luY2UgdGhhdCBjYWxscwoJdmFsdWVfY2FzdCgpLCB3aGNpaCBtYXkgZmFpbC4gIEp1c3QgZXh0cmFjdCB0aGUgdHlwZQoJZnJvbSB0aGUgcGFyc2VkIGV4cHJlc3Npb24uCgkqIHZhbHVlcy5jIChjaGVja19zdHViX21ldGhvZCk6ICBXaGlsZSBsb29waW5nIHRocm91Z2ggdGhlCglhcmd1bWVudHMsIGFkanVzdCBkZXB0aCAqYWZ0ZXIqIHBhcmFtZXRlciBoYXMgYmVlbiBoYW5kbGVkLgoJUmVwbGFjZSBjYWxsIGFuZCBzZXR1cCBvZiBwYXJzZV9hbmRfZXZhbCB3aXRoIG5ldyBmdW5jdGlvbgoJcGFyc2VfYW5kX2V2YWxfdHlwZS4KClR1ZSBOb3YgMTIgMDk6NDA6MDcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCgoJKiB1dGlscy5jLCByZW0tbXVsdGkuc2hhcjogIFJlbW92ZSBmaXhlZCBhcmcgY291bnQgdmVyc2lvbiBvZgoJY29uY2F0KCkuCgoJKiBhbHRvcy14ZGVwLmMsIGFybS14ZGVwLmMsIGNvZmZyZWFkLmMsIGNvbW1hbmQuYywgY29udmV4LXhkZXAuYywKCWNvcmUuYywgZHdhcmZyZWFkLmMsIGdvdWxkLXhkZXAuYywgaW5mY21kLmMsIGxhbmd1YWdlLmMsCgltODhrLXhkZXAuYywgbWFpbi5jLCBwcmludGNtZC5jLCBweXIteGRlcC5jLCBzb3VyY2UuYywKCXN1bjM4Ni14ZGVwLmMsIHN5bW0teGRlcC5jLCB1bWF4LXhkZXAuYywgdmFsdWVzLmMsIHhjb2ZmcmVhZC5jOgoJQ2hhbmdlIGFsbCBpbnN0YW5jZXMgb2YgdXNlIG9mIGZpeGVkIGFyZ3MgY29uY2F0KCkgdG8gdmFyaWFibGUKCWFyZ3MgY29uY2F0KCkgbm93IGxvY2F0ZWQgaW4gbGliaWJlcnR5LgoKVHVlIE5vdiAxMiAwNzoyMzo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIE1ha2VmaWxlLmluOiAgQWRkIHhjb2ZmcmVhZC5jLCB4Y29mZmV4ZWMuYy4KCSogeGNvZmZyZWFkLmM6ICBOZXcgZmlsZSBmb3IgaGFuZGxpbmcgQUlYIG1hbmdsZWQtY29mZiBmaWxlcy4KCSogeGNvbmZpZy9yczYwMDAsIHRjb25maWcvcnM2MDAwOiAgTmV3IGZpbGVzLgoJKiBidWlsZHN5bS5jOiAgQWRkIGhvb2tzIGZvciB4Y29mZnJlYWQuYy4KCSogcnM2MDAwLXBpbnNuLmMsIHJzNjAwMC10ZGVwLmMsIHJzNjAwMC14ZGVwLmMsIHRtLXJzNjAwMC5oLAoJeG0tcnM2MDAwLmgsIHJzNmstb3Bjb2RlLmRlZiwgcnM2ay1vcGNvZGUuaDogIE5ldyBmaWxlcy4KCSogeGNvZmZleGVjLmM6ICBOZXcgZmlsZSBmb3IgaGFuZGxpbmcgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCgpNb24gTm92IDExIDE5OjE0OjMxIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQoKCSogY29yZS5jOiAgTWlub3IgcmV3b3JkaW5nIG9mIG1lc3NhZ2UgdG8gdXNlciBjb250YWluaW5nIG5hbWUgb2YKCShhbmQgcG9zc2libHkgYXJndW1lbnRzIHRvKSB0aGUgcHJvZ3JhbSB0aGF0IGdlbmVyYXRlZCBhIGNvcmUKCWZpbGUuCgoJKiBlbGZyZWFkLmM6ICBSZW1vdmUgdGhlIHJlZ2lzdGVyX2FkZHIoKSBzdHViIG5vdyB0aGF0IGl0IGlzIG5vCglsb25nZXIgbmVlZGVkLgoKCSogcHJvY2ZzLmM6ICBNb3ZlIG1pc3BsYWNlZCAjZW5kaWYgZm9yIEFUVEFDSF9ERVRBQ0guICBBZGQgbmV3CglmZXRjaF9jb3JlX3JlZ2lzdGVycygpIGZ1bmN0aW9uIGZvciBjb3JlIGZpbGUgc3VwcG9ydC4KClNhdCBOb3YgIDkgMTM6Mzc6NTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCgoJKiBkd2FyZnJlYWQuYyAoZHdhcmZfcHN5bXRhYl90b19zeW10YWIpOiAgUmVtb3ZlIGxlZnRvdmVyIGNhbGwKCXRvIGRvX2NsZWFudXBzKCkgd2hpY2ggcmVzdWx0ZWQgZnJvbSBhIHByZXZpb3VzIGNoYW5nZS4KCgkqIGVsZnJlYWQuYzogIFJlLWVuYWJsZSBjb21waWxhdGlvbiBvZiByZWdpc3Rlcl9hZGRyKCkgc3R1YgoJd2hlbmV2ZXIgaXQgaXMgbm90IHN1cHBsaWVkIGJ5IGNvcmVkZXAuYwoKU2F0IE5vdiAgOSAwMDo0MDozMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCglBZGQgdHJhY2tpbmcgb2Ygb2JqZWN0IGZpbGVzICh0aGF0IGNvbnRhaW4gc3ltYm9scykgdG8gZ2RiLgoJVGhpcyBpbmNsdWRlcyBhICJzdHJ1Y3Qgb2JqZmlsZSIgdGhhdCBvd25zIHN5bXRhYnMgYW5kIHBzeW10YWJzCgl0aGF0IHdlcmUgcmVhZCBpbiBmcm9tIHRoYXQgYmluYXJ5IGZpbGUuCgoJKiBzeW1maWxlLmg6ICBBZGQgc3RydWN0IG9iamZpbGUuICBBZGQgcG9pbnRlciB0byB0aGUgb2JqZmlsZQoJaW50byB0aGUgc3RydWN0IHN5bV9mbnMuCglSZXBsYWNlIGdsb2JhbCBgc3ltZmlsZScgYW5kIGBzeW1maWxlX210aW1lJyB3aXRoCglgc3ltZmlsZV9vYmpmaWxlJy4gIEFkZCBnbG9iYWwgb2JqZWN0X2ZpbGVzIGNoYWluLgoKCSogc3ltZmlsZS5jOiAgTW92ZSBwYXJhbS5oIGFib3ZlIHN5bXRhYi5oLgoJKHNvcnRfbWlzY19mdW5jdGlvbl92ZWN0b3IpOiAgQWRkLgoJKHN5bXNfZnJvbV9vYmpmaWxlKTogIFdhcyBzeW1zX2Zyb21fYmZkLgoJKHN5bWZpbGVfb3Blbik6ICBOb3cgcmV0dXJucyBvYmpmaWxlLgoJKGFsbG9jYXRlX29iamZpbGUpOiAgTmV3LgoJKGZyZWVfb2JqZmlsZSk6ICBOZXcsIHJlcGxhY2luZyBmcmVlX2FsbF8uKnN5bXRhYnMuCgkoc3ltZmlsZV9pbml0KTogIFRha2VzIG9iamZpbGUgYXJnLCBwdXRzIGl0IGluIHN5bV9mbnMgcmVzdWx0LgoJKHJlcmVhZF9zeW1ib2xzKTogIFNlYXJjaGVzIHdob2xlIGNoYWluIG9mIG9iamZpbGVzLgoJKGFsbG9jYXRlX3N5bXRhYik6ICBUYWtlcyBvYmpmaWxlIGFzIG5ldyBwYXJhbWV0ZXIsIGNoYWlucyB0aGVtLgoJSGFuZGxlIElOSVRfRVhUUkFfU1lNVEFCX0lORk8uCgkoZnJlZV9hbGxfcHN5bXRhYnMsIGZyZWVfYWxsX3N5bXRhYnMpOiAgTW92ZSBoZXJlIGZyb20gc3ltbWlzYy5jLgoKCSogZGJ4cmVhZC5jOiAgTWFrZSBtb3JlIGVycm9ycyBpbnRvIGNvbXBsYWludHMuCgkocHVzaF9zdWJmaWxlLCBwb3Bfc3ViZmlsZSk6ICBNb3ZlIHRvIGJ1aWxkc3ltLmMuCgkoZGJ4X3N5bWZpbGVfcmVhZCwgZGJ4X3N5bWZpbGVfaW5pdCwgZmlsbF9zeW1idWYsIHJlYWRfZGJ4X3N5bXRhYiwKCXN0YXJ0X3BzeW10YWIsIHBzeW10YWJfdG9fc3ltdGFiXzEsIHJlYWRfb2ZpbGVfc3ltdGFiLAoJZGJ4X3BzeW10YWJfdG9fc3ltdGFiLCApOiAgVXNlIGJmZCBvcHMsIGRvbid0IHVzZSBmaWxlIGRlc2NyaXB0b3IuCglQYXNzIG9iamZpbGUuICBDaGFuZ2UgY2FsbGVycy4KCShmaWxsX3N5bWJ1ZiwgU1dBUF9TWU1CT0wpOiAgVGFrZSBiZmQgYXMgYXJnLgoJKHJlYWRfZGJ4X3N5bXRhYik6ICBKdXN0IHdpcGUgb3V0IG5ldyBzeW1ib2xzLCBub3QgYWxsLCBvbiBlcnJvci4KCShlbmRfcHN5bXRhYik6ICBCbG93IGF3YXkgcHN5bXRhYiBpZiBlbXB0eS4KCShwcm9jZXNzX3N5bWJvbF9wYWlyKTogIFN3YWxsb3cgaW50byByZWFkX29maWxlX3N5bXRhYi4KCShwcm9jZXNzX29uZV9zeW1ib2wpOiAgVXNlIHB1c2hfY29udGV4dCBhbmQgcG9wX2NvbnRleHQuCgkodmlydHVhbF9jb250ZXh0KTogIERlbGV0ZSAjaWYgMCdkIG9ic29sZXRlIHN0dWZmLgoKCSogYnVpbGRzeW0uYyAoZW5kX3N5bXRhYik6ICBQYXNzIG9iamZpbGUuCgkoZGJ4X2xvb2t1cF90eXBlKTogIEhhbmRsZSBudWxsIHR5cGV2ZWN0b3IuCgkoZGJ4X2FsbG9jX3R5cGUpOiAgQ2hlY2sgZmlsZSBudW1iZXIsIG5vdCBzeW0gbnVtYmVyLCBmb3IgLTEuCgkoZmluZF9zeW1ib2xfaW5fbGlzdCk6ICBBZGQgZm9yIHhjb2ZmcmVhZC4KCShzdGFydF9zeW10YWIpOiAgRGVmYXVsdCB0eXBldmVjdG9yIGlzIGVtcHR5LiAgS2VlcCByZXVzaW5nIHNhbWUKCWNvbnRleHRfc3RhY2suCgkoZW5kX3N5bXRhYik6ICBUYWtlIG9iamZpbGUgYXJndW1lbnQgYW5kIHBhc3MgaXQgdG8KCWFsbG9jYXRlX3N5bXRhYi4gIERvbid0IG1ha2UgYSBzeW10YWIgaWYgbm8gYmxvY2tzIG9yIHN5bWJvbHMuCglIYW5kbGUgZW1wdHkgdHlwZXZlY3Rvci4KCShwdXNoX2NvbnRleHQpOiAgTmV3IGZ1bmN0aW9uIGZvciBjb250ZXh0IHN0YWNrIG5lc3RpbmcuCgkocmVhZF90eXBlKTogIE1hcmsgRklYTUUgd2hlcmUgd2UgbmVlZCB0byByZWludHJvZHVjZSB0eXBlIHNtYXNoaW5nLgoKCSogYnVpbGRzeW0uaCAocG9wX2NvbnRleHQpOiAgTWFjcm8sIHBhaXJlZCB3aXRoIHB1c2hfY29udGV4dC4KCShzdWJmaWxlX3N0YWNrKTogIE1vdmUgaGVyZSBmcm9tIGRieHJlYWQuYy4KCgkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIsIHJlYWRfY29mZl9zeW10YWIpOiAgVGFrZSBhbmQgdXNlIG9iamZpbGUgYXJnLgoJKHJlYWRfY29mZl9zeW10YWIpOiAgQ2xlYW51cCBieSBmcmVlaW5nIG9iamZpbGUsIG5vdCBhbGwgc3ltdGFicy4KCgkqIG1pcHNyZWFkLmMgKHJlYWRfbWlwc19zeW10YWIsIHBhcnNlX3BhcnRpYWxfc3ltYm9scywgcGFyc2VfZmRyLAoJbmV3X3BzeW10YWIsIG5ld19zeW10YWIpOiAgVGFrZSBhbmQgdXNlIG9iamZpbGUgYXJnLgoKCSogZHdhcmZyZWFkLmMgKHNjYW5fY29tcGlsYXRpb25fdW5pdHMsIHN0YXJ0X3BzeW10YWIsCglwcm9jZXNzX2RpZXMsIGVuZF9zeW10YWIsIGR3YXJmX2J1aWxkX3BzeW10YWJzLAoJcmVhZF9sZXhpY2FsX2Jsb2NrX3Njb3BlLCByZWFkX2Z1bmNfc2NvcGUsIHJlYWRfZmlsZV9zY29wZSk6ICBUYWtlCglhbmQgdXNlIG9iamZpbGUgYXJndW1lbnQuCgkocHN5bXRhYl90b19zeW10YWJfMSwgcmVhZF9vZmlsZV9zeW10YWIpOiAgRG9uJ3QgdGFrZSBvciB1c2UgZmlsZQoJZGVzY3JpcHRvci4gIFVzZSBCRkQgaW50ZXJuYWwgZnVuY3Rpb25zIGluc3RlYWQuCgkoZW5kX3N5bXRhYik6ICBDYWxsIGdsb2JhbCBhbGxvY2F0ZV9zeW10YWIuCgoJKiBlbGZyZWFkLmMsIHRhcmdldC5jOiAgTWlub3IgY2hhbmdlcyB0byBhY2NvbW1vZGF0ZSBvYmpmaWxlcy4KCSogc3ltdGFiLmg6ICBwYXJ0aWFsX3N5bWJvbF90YWJsZSBoYXMgbm8gc3ltZmlsZV9uYW1lIG1lbWJlciBub3cuCgkoZm5fZmllbGRsaXN0cyB2b2Zmc2V0KTogIGF2b2lkIG5vbi1pbnQgYml0ZmllbGQuCgkoc3RydWN0IHN5bXRhYik6ICBBZGQgb2JqZmlsZSAqIGFuZCBvYmpmaWxlX2NoYWluICogb2Ygc3ltdGFicy4KCShzdHJ1Y3QgcGFydGlhbF9zeW10YWIpOiAgQWRkIG9iamZpbGUgKiBhbmQgb2JqZmlsZV9jaGFpbiAqIG9mCglwc3ltdGFicy4gIFJlbW92ZSBzeW1maWxlX25hbWUuCgoJKiBzeW1taXNjLmM6ICBMb3NlIGZyZWVfYWxsX3N5bXRhYnMsIGZyZWVfYWxsX3BzeW10YWJzLgoJKHByaW50c3ltc19jb21tYW5kKTogIFJlbmFtZSBmcm9tIHByaW50X3N5bXRhYnMuICBBZGQgc2VsZWN0aXZlCglsaXN0aW5nIGlmIDJuZCBhcmd1bWVudCBnaXZlbi4gIFByaW50IG9iamZpbGUgaW5mby4KCShwcmludHBzeW1zX2NvbW1hbmQpOiAgUmVuYW1lIGZyb20gcHJpbnRfcGFydGlhbF9zeW10YWJzLiAgRGl0dG8gYWxsLgoJKHByaW50b2JqZmlsZXNfY29tbWFuZCk6ICBOZXc7IHByaW50cyBvYmpmaWxlcyBsaXN0cywgYW5kIGNoZWNrcwoJZm9yIGNvbnNpc3RlbmN5IG9mIHN5bXRhYiwgcHN5bXRhYiwgYW5kIG9iamZpbGUgbGlzdHMuCgoJKiBzeW1maWxlLmgsIHN5bWZpbGUuYywgc3ltdGFiLmg6ICBMaW50CgpGcmkgTm92ICA4IDIzOjM4OjQ4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogY29tbWFuZC5jOiAgSW5jbHVkZSBwYXJhbS5oLgoJKiBkZWZzLmggKHdhcm5pbmdfc2V0dXAsIHdhcm5pbmcpOiAgRGVjbGFyZS4KCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwLCBVTk9QX01FTVZBTCBjYXNlKTogIExpbnQuCgkqIGluZmxvdy5jIChuZXdfdHR5KTogIFVzZSBVU0VfT19OT0NUVFkgI2RlZmluZS4KCSogbGFuZ3VhZ2UuYywgcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCksIHNpZ25hbWUuYywKCXN0YWNrLmM6ICBsaW50LgoKVGh1IE5vdiAgNyAxODoyNjoxNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKCgkqIE1ha2VmaWxlLmluOiBsaW5rIHdpdGggbGliaWJlcnR5IGFmdGVyIGxpYnJlYWRsaW5lLCBzaW5jZQoJcmVhZGxpbmUgbWlnaHQgd2FudCBzb21ldGhpbmcgaW4gbGliaWJlcnR5LgoJKiBtODhrLXhkZXAuYzogRml4ZWQgdGhlIHJlZ2lzdGVyIG9mZnNldHMgaW4gdGhlIHB0cmFjZV91c2VyCglzdHJ1Y3QgZm9yIEJDUyA4OGsgbWFjaGluZXMuCgkqIHhtLW04OGsuaDogZG9uJ3QgZGVmaW5lIFVTSVpFIGlmIGFscmVhZHkgZGVmaW5lZC4KCSogY29uZmlndXJlLmluOiBBZGRlZCBkZWx0YTg4IHRhcmdldC4KClRodSBOb3YgIDcgMDQ6NTE6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBhbTI5ay1waW5zbi5jLCBhbTI5ay1vcGNvZGUuaDogIEZpeCBkZWNvZGluZyBvZiBtdGFjYywgZG1hYywgZm1hYy4KCgkqIHRtLSouaDogIFJlbW92ZSBSRUFEX0RCWF9GT1JNQVQsIENPRkZfRk9STUFULCBhbmQKCVJFQURfTUlQU19GT1JNQVQsIHdoaWNoIGhhdmUgYmVlbiB1bnVzZWQgc2luY2UgQkZELiAgU3RpbGwKCXJlbWFpbmluZyBpcyBDT0ZGX05PX0xPTkdfRklMRV9OQU1FUy4KCSogdG0tc3VuMy5oLCB0bS1hbHRvcy5oOiAgUmVtb3ZlIGRldHJpdHVzIGFjY2lkZW50YWxseSBsZWZ0IGZyb20KCWZ1bmN0aW9uIGNhbGxpbmcgY29kZSBtb3ZlZCB0byBtNjhrLXRkZXAuYy4KCldlZCBOb3YgIDYgMTc6MjE6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBjb2ZmcmVhZC5jOiAgRWxpbWluYXRlIGNfbnN5bXMgaW4gZmF2b3Igb2YgY19uYXV4LgoJQ29tcGxhaW4gaWYgbm8gYXV4ZW50cyBvbiAuYmYgYW5kIC5lZiBGQ04gc3ltYm9scywgYW5kIGFzc3VtZQoJbG90cyBvZiBsaW5lIG51bWJlcnMuCgkoaW5pdF9saW5lbm9zLCBlbnRlcl9saW5lbm9zKTogIFVzZSBhIHNlbnRpbmVsIGF0IHRoZSBlbmQgb2YgdGhlCglyZWFkLWluIGxpbmVub3MsIHRvIG1ha2UgZm9yIGEgZmFzdCwgc2FmZSBsb29wLWVuZCB0ZXN0LgoKV2VkIE5vdiAgNiAwMjo1NDowOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQoKCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6IGNvZmZyZWFkIHVzZWQgdG8gcmVseSBvbiB0aGUKCXhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vIGZpZWxkIGdpdmluZyB0aGUgIyBvZiBsaW5ub3MgaW4gYQoJZnVuY3Rpb24uIFR3byBvZiB0aGUgZm9ybWF0cyBJJ20gdXNpbmcgKDI5ayBhbmQgODhrKSBkb24ndCBzZWVtIHRvCglzZXQgaXQuIFRocyBwYXRjaCB0byBmY25fbGFzdF9saW5lIGFuZCAoZW50ZXJfbGluZW5vcykgaXMgYW4KCWF0dGVtcHQgdG8gdXNlIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgbGlubm8gdGFibGUgaW4gdGhlIGZpbGUgdG8gc2V0Cgl0aGUgbnVtYmVyIG9mIGxpbmVub3MgdG8gcHJvY2Vzcy4KClR1ZSBOb3YgIDUgMjI6NDc6NDYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKCgkqIE1ha2VmaWxlLmluOiBwdXQgYSAtIGluZnJvbnQgb2YgdGhlIG12IHkudGFiLmMgYy1leHAudGFiLmMgYW5kCgltdiB5LnRhYi5jIG0yLWV4cC50YWIuYywgc28gdGhhdCBpZiBiaXNvbiBpcyB1c2VkLCBhbmQgdGhlIGZpbGVzCglhcmUgY3JlYXRlZCBpbiBwbGFjZSwgc28gdGhlIG12IGZhaWxzLCB0aGVuIHRoZSBtYWtlIGNvbnRpbnVlcy4KClR1ZSBOb3YgIDUgMTY6NDc6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCgoJQWRkIEMrKyBhcyBhIHNlcGFyYXRlIGxhbmd1YWdlLgoJKiBkZWZzLmggKGVudW0gbGFuZ3VhZ2UpOiBBZGQgbGFuZ3VhZ2VfY3BsdXMuCgkqIGR3YXJmcmVhZC5jIChlbmRfc3ltdGFiKTogIFN1cHBvcnQgbGFuZ3VhZ2VfY3BsdXMuCgkqIGMtZXhwLnk6ICBBZGQgbmV3IHN0cnVjdCBsYW5ndWFnZV9kZWZuIGNwbHVzX2xhbmd1YWdlX2RlZm4uCglEb24ndCBzZXQgYyB0byBiZSB0aGUgZGVmYXVsdCBsYW5ndWFnZSAoc2VlIG1haW4uYykuCgkqIGMtZXhwLnkgKHl5bGV4KTogIE9ubHkgbG9vayBmb3IgZmllbGQgb2YgdGhpcyBpZgoJbGFuZ3VhZ2UgaXMgQysrLiAgKEZpcnN0IGRpZmZlcmVuY2UgZnJvbSBDISkKCSogbGFuZ3VhZ2UuYzogIEFkZCBjYXNlIGJyYW5jaGVzIGZvciBDKysgKGN1cnJlbnRseSwgYWxsCgl0aGUgc2FtZSBhcyBDKS4gIEFsc28sIGFkZCBjKysgdG8gInVzYWdlIiBub3RlIGZvciAic2V0IGxhbmciLgoJKiB2YWxwcmludC5jICh0eXBlZGVmX3ByaW50KS4gIEFkZCBjYXNlIGJyYW5jaGVzIGZvciBDKysuIAoJKiBtYWluLmMgKG1haW4pOiAgTmV3IHdheSB0byBzZXQgaW5pdGlhbCBsYW5ndWFnZTogIExvb2sgYXQKCWZpbGUgZXh0ZW5zaW9uIG9mIHBzeW10YWIgY29udGFpbmluZyBtYWluKCkuICAoU2FtZSBhcyB3ZQoJZG8gZm9yIHN5bXRhYnMsIGJ1dCBhdm9pZCBsb2FkaW5nIHRoZSBzeW10YWIgeWV0LikKCSogc3ltdGFiLmM6IE5ldyByb3V0aW5lIGZpbmRfbWFpbl9wc3ltdGFiKCksIHVzZWQgYnkgbWFpbigpCgl0byBzZXQgaW5pdGlhbCBsYW5ndWFnZS4KCSogc3ltZmlsZS5jIChhbGxvY2F0ZV9zeW10YWIpOiAgTW92ZSBjb2RlIGZvciBtYXBwaW5nIGZpbGUKCWV4dGVuc2lvbnMtPiBsYW5ndWFnZXMgdG8gbmV3IGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lKCkuCgoJRml4IGEgQysrIHByb2JsZW0gd2hlbiBsb29raW5nIGZvciBtZXRob2RzIGluIHN1cGVyLWNsYXNzZXMuCglUaGVyZSB3YXMgY29uZnVzaW9uIGJldHdlZW4gYmFzZSBhbmQgZGVyaXZlZCB0eXBlcy4KCSogdmFsb3BzLmMgKHZhbHVlX2ZuX2ZpZWxkKTogIENoYW5nZSBmdW5jdGlvbiBpbnRlcmZhY2UuCgkqIHZhbHVlcy5jOiAgVXNlIG5ldyB2YWx1ZV9mbl9maWVsZCBpbnRlcmZhY2UuCgpNb24gTm92ICA0IDEwOjQ5OjMzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQoKCSogaW5mcnVuLmM6ICBGaXhlZCB0eXBvIGluIGNvbW1lbnQuCgkqIHV0aWxzLmM6ICBBbGwgdGhlIHYqZnByaW50ZiBlbXVsYXRpb24gaXMgbm93IGluIGxpYmliZXJ0eSwKCXNvIHdlIGNhbiBnZXQgcmlkIG9mIHNvbWUganVuay4KCSogeG0tc3VuM29zNC5oLCB4bS1zdW40b3M0LmgsIHhjb25maWcvZGVjc3RhdGlvbiwgeGNvbmZpZy9pMzg2c2NvLAoJeGNvbmZpZy9zdW4zb3M0LCB4Y29uZmlnL3N1bjRvczQ6IERvbmB0IG5lZWQgSEFWRV9TVFJTVFIgYW55IG1vcmUuCgkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiAgU3VwcG9ydCBCQi9CVy9CTAoJdHlwZSBvcGVyYW5kcywgYXMgdXNlZCBieSBicmFuY2ggaW5zdHJ1Y3Rpb25zLgoJKiBnbWFsbG9jLmM6IEZpeCBwcm90b3R5cGUgb2YgbWVtY3B5LgoJKiBlbGZyZWFkLmM6IENvbW1lbnQgb3V0IHJlZ2lzdGVyX2FkZHIsIHNpbmNlIGl0IGNvbmZsaWN0cwoJd2l0aCB0aGUgb25lIGluIGNvcmVkZXAuYy4KCSogYnVpbGRzeW0uaDogIFJlbW92ZSBleHRlcm4gZGVjbGFyYXRpb25zIG9mIHR3byBmdW5jdGlvbnMKCXRoYXQgYXJlIHJlYWxseSBzdGF0aWMgaW4gYnVpbGRzeW0uYy4KCSogdG0tbWlwcy5oOiBBZGQgc3ltYm9saWMgbmFtZXMgZm9yIG1vcmUgcmVnaXN0ZXJzLgoJKiBtaXBzLXhkZXAuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogVXNlIG5ldyByZWdpc3RlciBuYW1lcy4KCSogeG0tbWlwcy5oOiBTaW1wbGlmeSBSRUdJU1RFUl9VX0FERFIsIHNpbmNlIGl0IGlzIG5vdwoJb25seSB1c2VkIGZvciBjb3JlIGZpbGVzLCBub3QgcHRyYWNlLiAgVGhlcmVmb3JlLAoJdGhlIEtFUk5FTF9VX0FERFIgaGFjayBpcyBubyBsb25nZXIgbmVlZGVkLgoJVGhlIG1hcHBpbmcgdG8gcHRyYWNlIG51bWJlciBpcyBub3cgaW4gaW4gbWlwcy14ZGVwLmMuCgkqIG1pcHMteGRlcC5jOiAgRGVmaW5lIFJFR0lTVEVSX1BUUkFDRV9BRERSICh1c2luZyB0aGUKCW1hcHBpbmcgZnJvbSB0aGUgb2xkIFJFR0lTVEVSX1VfQUREUiksIGFuZCB1c2UgaXQKCWluIHtmZXRjaCxzdG9yZX1faW5mZXJpb3JfcmVnaXN0ZXJzLgoJKiBtaXBzcmVhZC5jOiBSZW5hbWUgI2luY2x1ZGUgZWNvZmYuaCB0byBuZXcgbmFtZSBjb2ZmLW1pcHMuaC4KCSogbWlwcy10ZGVwLmMgKG1pcHNfcHVzaF9kdW1teV9mcmFtZSwgbWlwc19wb3BfZnJhbWUpOgoJU2F2ZS9yZXN0b3JlIEZQIHJlZ3MgY29ycmVjdGx5ICg/KS4KCSogZGJ4cmVhZC5jOiBSZW1vdmUgZHVwbGljYXRlIGRlZmluZV9zeW1ib2wgYW5kIHR5cGVfc3lub255bV9uYW1lCgkodGhlc2UgaGFkIGJlZW4gcHJldmlvdXNseSBtb3ZlZCB0byBidWlsZHN5bS5jKS4KCUhlbmNlLCBkZWZpbmVfc3ltYm9sIGJlY29tZXMgZXh0ZXJuIGluc3RlYWQgb2Ygc3RhdGljLgoJKiBidWlsZHN5bS5jIChyZWFkX3N0cnVjdF90eXBlKTogIENvbW1lbnQgb3V0IGJvZ3VzIGhhbmRsaW5nCglvZiBDKysgb3BlcmF0b3IgbWV0aG9kcy4gIE1pbm9yIGhhY2tpbmcgb2YgcmVhZGluZyBvZiBjbGFzcwoJY29udGV4dHMuIE1ha2UgZGVmaW5lX3N5bWJvbCBub24tc3RhdGljLCBzbyBkYnhyZWFkLmMgY2FuIGNhbGwgaXQuCgpGcmkgTm92ICAxIDExOjA1OjQ3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogbWlwc3JlYWQuYyAocmVhZF9taXBzX3N5bXRhYiwgcmVhZF90aGVfbWlwc19zeW10YWIpOiAgVXNlIHJlYWwKCWZpbGVuYW1lIHdpdGggZXJyb3IgbWVzc2FnZXMuCgkqIHN0YWNrLmMgKGZyYW1lX3NlbGVjdF9jb21tYW5kKTogIFJlbmFtZSB0byBzZWxlY3RfZnJhbWVfY29tbWFuZAoJdG8gYXZvaWQgImZyIiBhbmQgImZyYSIgaGF2aW5nIG5vbnVuaXF1ZSBjb21wbGV0aW9ucy4KCSogc3ltZmlsZS5jIChzb3J0X3N5bXRhYl9zeW1zKTogIElnbm9yZSBzb3J0IG9mIHplcm8gc3ltdGFiICouCgkoc3ltZmlsZV9pbml0KTogIFByaW50IGZpbGUgZm9ybWF0IG5hbWUgd2hlbiB1bmFibGUgdG8gaGFuZGxlIGl0LgoJKGZyZWVfbmFtZWRfc3ltdGFicyk6ICBVc2UgQkxPQ0tWRUNUT1IgcmF0aGVyIHRoYW4gb2Jzb2xldGUgQkxPQ0tMSVNULgoJKiBzeW1taXNjLmMgKGZyZWVfc3ltdGFiKTogIE9ubHkgZnJlZSBsaW5ldGFibGUgaWYgbm9uemVyby4KCSogc3ltdGFiLmg6ICBSZW1vdmUgb2Jzb2xldGUgQkxPQ0tMSVNUIG1hY3Jvcy4KClRodSBPY3QgMzEgMTg6MTI6NDMgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKCgkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBhbm90aGVyIHN0ZXBpL25leHRpIGZpeC4gIEVuc3VyZQoJdGhhdCBzdG9wX3N0ZXAgaXMgMSBhdCBib3R0b20gb2YgbWFpbiBsb29wLiAgSSBkb24ndCBrbm93IHdoeSB0aGlzCgluZWVkcyB0byBiZSBkb25lLCBidXQgaXQgaGVscHMgbWUgc2xlZXAgYmV0dGVyIGF0IG5pZ2h0LgoKU3VuIE9jdCAyNyAxODoxODozOSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQoKCSogbWFpbi5jIChpbml0aWFsaXplX2hpc3RvcnkpOiAgUmVhZCBoaXN0b3J5IGFmdGVyIHJlYWRpbmcgYWxsCglpbml0IGZpbGVzLgoKU3VuIE9jdCAyNyAxNDowOToyNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIGJ1aWxkc3ltLmM6ICBCcmVhayBvdXQgaW5pdGlhbCBtYWxsb2Mgc2l6ZXMuCgkocmVjb3JkX2xpbmUpOiAgUmVjb3JkIGRpcmVjdGx5IGluIGEgc3ViZmlsZS4gIEFsbG9jIG9uIGRlbWFuZC4KCShjb21wYXJlX2xpbmVfbnVtYmVycyk6ICBBZGQgZnJvbSB4Y29mZnJlYWQuYy4KCShlbmRfc3ltdGFiKTogIE5ldyBwYXJhbXMgc2F5IHdoZXRoZXIgdG8gc29ydCBwZW5kaW5ncyBhbmQKCWxpbmV0YWJsZS4gIFBhdGNoIGJsb2NrIHN0YWJzIGlmIGRlZmluZWQuICBTaHJpbmsgbGluZXRhYmxlIGJlZm9yZQoJYWxsb2NhdGluZyB0aGUgc3ltdGFiLgoJKiBidWlsZHN5bS5oOiAgRGVsZXRlIGxpbmVfdmVjdG9yKiBhbmQgcHJldl9saW5lX251bWJlci4gIEFkZCAKCWdsb2JhbF9zdGFicyBhbmQgZmlsZV9zdGFicyBmb3IgeGNvZmZyZWFkLgoJKiBkYnhyZWFkLmMgKHN0YXJ0X3N1YmZpbGUpOiAgTW92ZSB0byBidWlsZHN5bS4gIENoYW5nZSBhYm92ZSBjYWxscy4KCSogc3ltdGFiLmg6ICBMSU5FVEFCTEUoc3ltdGFiKSBjYW4gbm93IGJlIG51bGwuICBaYXAgTElORUxJU1QuCgkqIHN5bW1pc2MuYywgc3ltdGFiLmM6ICBDb3BlIHdpdGggbnVsbCBMSU5FVEFCTEVzLgoKCSogYmxvY2tmcmFtZS5jOiAgUGFzcyBmcm9tbGVhZiB0byBJTklUX0VYVFJBX0ZSQU1FX0lORk8uCgkqIHRtLTI5ay5oLCB0bS04OGsuaCwgdG0taTk2MC5oLCB0bS1pcml4My5oLCB0bS1taXBzLmgsIHRtLXB5ci5oLAoJdG0tc3BhcmMuaDogIEFjY2VwdCBmcm9tbGVhZiBwYXJhbWV0ZXIuCgkqIGMtZXhwLnkgKHl5ZXJyb3IpOiAgUGFzcyBlcnJvciBtZXNzYWdlIGlmIGdpdmVuLgoJKiBjb25maWd1cmUuaW46ICBBZGQgcnM2MDAwIGhvc3QgYW5kIHRhcmdldC4KCSogaW5mbG93LmMgKG5ld190dHkpOiAgT19OT0NUVFkga2x1ZGdlIGZvciBSUy82MDAwLgoJKiBzeW1maWxlLmggKGVudHJ5X3BvaW50KTogIEFkZC4KClNhdCBPY3QgMjYgMDA6MTY6MzIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z3VzLmNvbSkKCgkqIGJ1aWxkc3ltLmM6ICBOZXcgZmlsZS4gIEJyZWFrcyBvdXQgc3ltYm9sLXRhYmxlLWJ1aWxkaW5nIHJvdXRpbmVzCglmcm9tIGRieHJlYWQuYywgc28gdGhleSBjYW4gYmUgc2hhcmVkIHdpdGggeGNvZmZyZWFkLmMuCgkqIGJ1aWxkc3ltLmg6ICBOZXcgZmlsZS4gIERlY2xhcmF0aW9ucyBmb3IgYnVpbGRzeW0uYyB1c2Vycy4KCSogZGJ4cmVhZC5jOiAgUmVtb3ZlIGxhcmdlIGNodW5rcyBpbnRvIGJ1aWxkc3ltLmMuCgkqIE1ha2VmaWxlLmluOiAgQWRkIGJ1aWxkc3ltLmMgYW5kIGJ1aWxkc3ltLmguCgoJKiBzeW1maWxlLmMgKHN5bXNfZnJvbV9iZmQpOiAgTmV3IHJvdXRpbmUuCgkoYWRkX3N5bWJvbF9maWxlKTogIENhbGwgaXQgdG8gZG8gdGhlIHJlYWwgd29yay4KCShzeW1zX2Zyb21fYmZkKTogIEluaXRpYWxpemUgZW50cnlfcG9pbnQgYmVmb3JlIGNhbGxpbmcgc3ltZmlsZV9pbml0LgoJKiBzeW10YWIuaCwgc3ltZmlsZS5jLCBjb2ZmcmVhZC5jLCBtaXBzcmVhZC5jLCBkd2FyZnJlYWQuYzoKCUF2b2lkIGRlY2xhcmluZyBvciBzZXR0aW5nIGVudHJ5X3BvaW50IChzeW1maWxlLmggJiBzeW1maWxlLmMgY29wZSkuCgpGcmkgT2N0IDI1IDEwOjU4OjE2IDE5OTEgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCgoJKiBjcGx1cy1kZW0uYyAoY3BsdXMtZGVtYW5nbGUpOiBhZGRlZCBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMsIHN0YXRpYwoJZGF0YSwgYW5kIHRoZSBuZXcgKGNvcnJlY3QpIG1hbmdsaW5nIGZvciBkZXN0cnVjdG9ycy4KCgkqIGR3YXJmcmVhZC5jOiAoZHdhcmZ3YXJuKTogY3JlYXRlZCBhIHZhcmFyZ3MgdmVyc2lvbiBvZgoJZHdhcmZ3YXJuLCBmb3Igbm9uIF9fU1REQ19fIGNvbXBpbGVycy4KCgkqIGMtZXhwLnk6ICh5eWxleCk6IGFkZGVkIG1hdGNoIGZvciAidGVtcGxhdGUiIHRva2VuLgoJKHR5cGViYXNlKTogYWRkZWQgVEVNUExBVEUgbmFtZSAnPCcgdHlwZSAnPicgY2xhdXNlLCBmb3IgZXhwbGljaXQKCXNwZWNpZmljYXRpb24gb2YgdGVtcGxhdGUgdHlwZXMuCgoJKiBzeW10YWIuYzogKGxvb2t1cF90ZW1wbGF0ZV90eXBlKTogbmV3IGZ1bmN0aW9uIGZvciBmaW5kaW5nCgl0ZW1wbGF0ZXMgaW4gc3ltYm9sIHRhYmxlLgoJKHR5cGVfbmFtZV9ub190YWcpOiBjaGFuZ2VkIHRvIGV4cGxpY2l0bHkgY2hlY2sgZm9yIHMvdS9lIGF0IHRoZQoJYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2wgLSBpZiBpdCBpcyBhIHRlbXBsYXRlLCBub25lIG9mIHRoZXNlIHdpbGwKCWJlIHRoZXJlIChidXQgdGhlIG5hbWUgd2lsbCBzdGlsbCBjb250YWluIHNwYWNlcy4pCgpGcmkgT2N0IDI1IDE4OjU5OjMyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQoKCVZhcmlvdXMgZml4ZXMgdG8gaW1wcm92ZSBnKysgZGVidWdnaW5nLgoJKiBzeW10YWIuaDogIEFkZCBpc19jb25zdCBhbmQgaXNfdm9sYXRpbGUgZmxhZ3MgZm9yIGVhY2ggbWV0aG9kLgoJVGhlc2UgYXJlIGJpdCBmaWVsZHMgLSB0YWtlIHRoZWlyIHNwYWNlIGZyb20gdm9mZnNldCwKCXdoaWNoIHNocmlua3MgdG8gMzAgYml0cy4gIFNpbmNlIHZvZmZzZXQgaXMgbm93IGEgYml0ZmllbGQsCgltYWtlIGl0IHVuc2lnbmVkIGZvciBwb3J0YWJpbGl0eS4gIFRoaXMgY2hhbmdlcyBpdHMgaW50ZXJwcmV0YXRpb24KCXNsaWdodGx5OiAgU3RhdGljIG1ldGhvZHMgbm93IGhhdmUgdm9mZnNldCAxIGluc3RlYWQgb2YgLTEsCglhbmQgdmlydHVhbCBvZmZzZXRzIHN0YXJ0IGF0IDIsIG5vdCAxLgoJKiBzeW10YWIuYzogIFJlbmFtZWQgZ2RiX21hbmdsZV90eXBlbmFtZSB0byBnZGJfbWFuZ2xlX25hbWUsCglzaW5jZSBpdCBub3cgcmV0dXJucyBhbiBlbnRpcmUgbWFnbGVkIG1ldGhvZCBuYW1lLCBub3QganVzdAoJdGhlIHR5cGUgcGFydC4gIFRoaXMgYXZvaWRzIHNvbWUgZHVwbGljYXRpb24uCglJdCBhbHNvIGFsbG93cyB1cyB0byBjb3JyZWN0bHkgbWFuZ2xlIGNvbnN0IGFuZCB2b2xhdGlsZQoJbWV0aG9kcyAodXNpbmcgdGhlIG5ldyBpc19jb25zdCBhbmQgaXNfdm9sYXRpbGUgYml0IGZpZWxkcwoJbWVudGlvbmVkIGFib3ZlKS4KCSogdmFscHJpbnQuYyAodHlwZV9wcmludF9iYXNlKSwgdmFsdWVzLmMgKGNoZWNrX3N0dWJfbWV0aG9kKToKCVNpbXBsaWZ5IGJ5IHVzaW5nIG5ldyBnZGJfbWFuZ2xlX25hbWUuCgkqIHZhbHVlcy5jICh2YWx1ZV9oZWFkb2YpOiAgRml4IHRvIGNvcnJlY3RseSBoYW5kbGUgc2luZ2xlCglpbmhlcml0YW5jZSAoYWN0dWFsbHkgdHdvIGZpeGVzLCBlaXRoZXIgb2Ygd2hpY2ggc3VmZmljZXMpLgoJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiAgSGFuZGxlIGNvbnN0IGFuZCB2b2xhdGlsZQoJbWV0aG9kIHNwZWNpZmllcnMuCgkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6ICBZZXQgb25lIG1vcmUgcGxhY2Ugd2hlcmUKCXdlIG11c3QgaGFuZGxlICdcXCcgY29udGludWF0aW9ucy4KCSogdmFscHJpbnQuYyAodnRibF9wdHJfbmFtZSk6IEFkZCBmaW5hbCAnXDAnLgoKRnJpIE9jdCAyNSAxNjowNjozOCAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQoKCSogdG0tc3BhcmMuaCwgdG0tNjhrLmggKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogIGZpeCBvdXRwdXQgb2YKCXNob3J0IHJldHVybiB2YWx1ZXMgZm9yIHNwYXJjIGFuZCA2OGsuICBQYXRjaCBmcm9tIFBhdWwgRWdnZXJ0LgoKCSogY29mZnJlYWQuYywgY29yZWRlcC5jLCBpMzg2LXhkZXAuYzogIGluc3RhbGwgcGF0Y2hlcyBmb3IKCVN5c1YvMzg2IDMuMiBmcm9tIE1hdXJvIERlUGFsbWEuCgpGcmkgT2N0IDI1IDAyOjAyOjEzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogY29yZS5jIChjb3JlX2ZpbGVfaW5mbyksIGV4ZWMuYyAoZXhlY19maWxlX2luZm8pOiAgUHJpbnQgZmlsZQoJdHlwZS4gIFVzZSBwcmludGZfZmlsdGVyZWQuCgoJKiB2YWxvcHMuYyAodmFsdWVfZmV0Y2hfbGF6eSk6ICBBdm9pZCAwLWxlbmd0aCBmZXRjaGVzLgoKVGh1IE9jdCAyNCAyMzowNjo0MCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKCgkqIGR3YXJmcmVhZC5jOiAgQWRkIGNhc3RzIHRvIHJlbW92ZSBjb21waWxlciB3YXJuaW5ncy4KCgkqIHRtLTNiMS5oLCB0bS02OGsuaCwgdG0tYWx0b3MuaCwgdG0tYW1peC5oLCB0bS1ocDMwMGJzZC5oLAoJdG0taHAzMDBocHV4LmgsIHRtLWlzaS5oLCB0bS1uZXdzLmgsIHRtLXBuLmgsIHRtLXN1bjIuaCwKCXRtLXN1bjMuaDogIFJlbW92ZSBsb2NhbGx5IGR1cGxpY2F0ZWQgY29kZSBmb3IgY2FsbGluZyBmdW5jdGlvbnMKCWluIHRoZSBpbmZlcmlvci4gIFRoZSBvbmx5IGRpZmZlcmVuY2VzIHdlcmUgaW4gdGhlIHNwZWNpZmljIHRyYXAKCXZlY3RvcnMgdXNlZCBhbmQgd2hldGhlciBvciBub3QgYW4gZnB1IHdhcyBwcmVzZW50LiAgVGhlc2UgYXJlCglub3cgaGFuZGxlZCBieSBhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBvZiBCUFRfVkVDVE9SIGFuZAoJSEFWRV82ODg4MSByZXNwZWN0aXZlbHkuICBPdGhlciBtaW5vciBvYnZpb3VzIGNsZWFudXBzLgoKCSogdmFsb3BzLmM6ICBDb3JyZWN0IGEgbWlub3IgbWlzc3BlbGxpbmcuCgoJKiB1dGlscy5jOiAgUmVtb3ZlIGxvY2FsIEJTRC9VU0cgaGFja3MgdGhhdCBhcmUgbm93IGluIGxpYmliZXJ0eS4KCgkqIGR3YXJmcmVhZC5jOiAgUmVtb3ZlIHByb3RvdHlwZSBmb3IgZHdhcmZ3YXJuLiAgRG9lcyBub3Qgd29yawoJd2l0aCA8dmFyYXJncy5oPi4KClRodSBPY3QgMjQgMDk6MzM6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBzdGFjay5jIChmcmFtZV9jb21tYW5kKTogIEFsd2F5cyBwcmludC4gIFVzZSBuZXcKCWZyYW1lX3NlbGVjdF9jb21tYW5kIHRvIHNlbGVjdCBhIGZyYW1lIHdpdGhvdXQgcHJpbnRpbmcuCQoKCSogZHdhcmZyZWFkLmM6ICBVc2UgPHZhcmFyZ3MuaD4sIHNpbmNlIDxzdGRhcmcuaD4gaXMgbm90IHBvcnRhYmxlLgoKVGh1IE9jdCAyNCAwMTozMjo1MSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKCiAgICAgICAgKiBkd2FyZnJlYWQuYzogTmV3IGZpbGUgZm9yIERXQVJGIGRlYnVnZ2luZyBmb3JtYXQgc3VwcG9ydC4KCgkqIGVsZnJlYWQuYzogTmV3IGZpbGUgZm9yIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQgc3VwcG9ydC4KCgkqIHByb2Nmcy5jOiBOZXcgZmlsZSBmb3IgU1ZSNCAvcHJvYyAocHJvY2VzcyBmaWxlIHN5c3RlbSkgc3VwcG9ydC4KCgkqIHRtLWFtaXguaCwgeG0tYW1peC5oLCB0Y29uZmlnL2FtaXgsIHhjb25maWcvYW1peDogTmV3IGZpbGVzIGZvcgoJQW1pZ2EgVU5JWCBzdXBwb3J0LgoKCSogeG0tc3ZyNC5oLCB0bS1zdnI0Lmg6IE5ldyBmaWxlcyBmb3IgU1ZSNCBzdXBwb3J0LgoKCSogeG0tbTY4ay5oOiBOZXcgZmlsZSBmb3IgaG9zdCBtYWNoaW5lcyB3aXRoIG02OGsgY3B1LgoKCSogTWFrZWZpbGUuaW46IEFkZCBlbGZyZWFkLmMgYW5kIGR3YXJmcmVhZC5jIHRvIFNGSUxFU19NQUlORElSLgoJQWRkIGVsZnJlYWQubyBhbmQgZHdhcmZyZWFkLm8gdG8gT0JTLgoKCSogc3ltZmlsZS5oOiBBZGQgImVsZiIgdG8gbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBpbiBjb21tZW50LgoKCSogYy1leHAueSwgZGVmcy5oLCBzeW10YWIuaCwgdmFscHJpbnQuYzogIEFkZCB0aHJlZSBuZXcgYnVpbHRpbgoJdHlwZXMgdG8gZ2RiLCBidWlsdGluX3R5cGVfbG9uZ19kb3VibGUsIGJ1aWx0aW5fdHlwZV9jb21wbGV4LCBhbmQKCWJ1aWx0aW5fdHlwZV9kb3VibGVfY29tcGxleC4gIEFkZCBhbmQgdXNlIG5ldyBUQVJHRVRfU0hPUlRfQklULAoJVEFSR0VUX0lOVF9CSVQsIFRBUkdFVF9MT05HX0JJVCwgVEFSR0VUX0ZMT0FUX0JJVCwKCVRBUkdFVF9ET1VCTEVfQklULCBUQVJHRVRfTE9OR19ET1VCTEVfQklULCBUQVJHRVRfQ09NUExFWF9CSVQsIGFuZAoJVEFSR0VUX0RPVUJMRV9DT01QTEVYX0JJVCwgYXMgdGhlIHNpemVzIGluIGJpdHMgb2YgdGhlIGluZGljYXRlZAoJdHlwZXMgb24gdGhlIHRhcmdldCBtYWNoaW5lIChhbGEgdGhlIGV4aXN0aW5nIFRBUkdFVF9MT05HX0xPTkdfQklUKS4KCgkqIGluZnJ1bi5jOiAgV2hlbiB1c2luZyBTVlI0IC9wcm9jIGludGVyZmFjZSBpbnN0ZWFkIG9mIHB0cmFjZSgpLAoJY2FsbCBwcm9jX3NldF9leGVjX3RyYXAoKSB0byBzZXR1cCBjaGlsZCB0byBzdG9wIGF0IGZpcnN0IGluc3RydWN0aW9uLgoKCSogaW5mdGFyZy5jOiBXaGVuIHVzaW5nIFNWUjQgL3Byb2MgaW50ZXJmYWNlLCBjYWxsIHByb2Nfd2FpdCgpCglyYXRoZXIgdGhhbiB3YWl0KCkuCgoJKiBtNjhrLXRkZXAuYzogQWRkIG5ldyByb3V0aW5lcyBzdXBwbHlfZ3JlZ3NldCgpLCBmaWxsX2dyZWdzZXQoKSwKCXN1cHBseV9mcHJlZ3NldCgpLCBhbmQgZmlsbF9mcHJlZ3NldCgpLCB3aGljaCBhcmUgbWFjaGluZQoJZGVwZW5kZW50IHN1cHBvcnQgcm91dGluZXMgZm9yIFNWUjQgL3Byb2MgaW50ZXJmYWNlLgoKCSogdXRpbHMuYzogQWRkIHdhcm5pbmdfc2V0dXAoKSBhbmQgd2FybmluZygpLiAgV2FybmluZygpIGJlaGF2ZXMKCXRoZSBzYW1lIGFzIGVycm9yKCkgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBub3JtYWxseSByYXRoZXIgdGhhbgoJanVtcGluZyBiYWNrIHRvIGNvbW1hbmQgbGV2ZWwuICBNb2R1bGVzIHRoYXQgZG9uJ3Qgd2FudCB0byBjYWxsCgl3YXJuaW5nKCkgZm9yIHNvbWUgcmVhc29uLCBidXQgd2FudCB0byBwcm9kdWNlIHRoZWlyIG93biB3YXJuaW5ncywKCWNhbiBjYWxsIHdhcm5pbmdfc2V0dXAoKSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB3YXkKCXdhcm5pbmcoKSBhbmQgZXJyb3IoKSBkZWFsIHdpdGggdGhlIHRlcm1pbmFsLgoKCSogc3ltdGFiLmM6IE1ha2UgaW50ZXJuYWwgZXJyb3JzIHByb2R1Y2UgbW9yZSB1c2VmdWwgbWVzc2FnZXMuCgoJKiB0bS02OGsuaDogTW92ZSBjb2RlIHRoYXQgaXMgZHVwbGljYXRlZCBpbiBhbG1vc3QgZXZlcnkgc2luZ2xlCgltNjhrIGJhc2VkIG1hY2hpbmUncyBjb25maWd1cmF0aW9uIGZpbGVzIHRvIHRoaXMgY29tbW9uIGZpbGUuCglEdXBsaWNhdGlvbnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgc3RpbGwgbmVlZCB0byBiZSByZW1vdmVkCgkoRklYTUUpLgoKCSogaW5mcnVuLmMgKGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6IFN5c3RlbSBWIHZlcnNpb25zIG11c3QgY2FsbAoJc2V0cGdycCgpIHdpdGggbm8gYXJndW1lbnRzLCB0byBjb21wbHkgd2l0aCBwcm90b3R5cGluZyB0eXBpY2FsbHkKCWluIDx1bmlzdGQuaD4uCgoJKiBtdW5jaDogQWRkIHN1cHBvcnQgZm9yIFNWUjQgc3R5bGUgbm0gb3V0cHV0LgoKCSogZGJ4cmVhZC5jLCBtaXBzcmVhZC5jIHN5bW1pc2MuYywgc3ltdGFiLmM6ICBSZW1vdmUgdGhlIG9iamVjdAoJZmlsZSBzcGVjaWZpYyBmaWVsZHMgZnJvbSB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgc3RydWN0dXJlIGFuZAoJcmVwbGFjZSB0aGVtIHdpdGggYSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBmb3IgZWFjaCBkaWZmZXJlbnQKCWZsYXZvciBvZiBvYmplY3QgZmlsZSByZWFkZXIgdG8gaW5pdGlhbGl6ZSBhcHByb3ByaWF0ZWx5LgoKV2VkIE9jdCAyMyAwOTozODoyMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIHhjb25maWcvc3VuWzM0XW9zNDogIEFkZCBub3RlIGFib3V0IHN0cnN0ciBib3RjaCBvbiBzdW5vczQuMC4zYwoJYW5kIHByZXZpb3VzLgoKCSogbWlwc3JlYWQuYyAoZml4dXBfdW5kZWZfdHlwZSk6ICBOZXcgZnVuY3Rpb24uICBJZiBhIHN0cnVjdCAvCgl1bmlvbiAvIGVudW0gaXMgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIGJ1dCBub3doZXJlIGVsc2UgdXNlZCwKCShieSB0eXBlZGVmaW5nLCBwb2ludGVyIHJlZmVyZW5jaW5nIG9yIGRlY2xhcmF0aW9uKSB0aGUgbWlwc3JlYWQgY29kZQoJYnVpbGRzIHRoZSBjb21wbGV0ZSB0cmVlIGZvciB0aGUgc3RydWN0dXJlIGJ1dCBsZWF2ZXMgaXRzIGNvZGUgYXMKCVRZUEVfQ09ERV9VTkRFRiBhcyBpdCBkb2Vzbid0IGtub3cgd2hhdCBraW5kIG9mIGFnZ3JlZ2F0ZSBpdCBpcy4KCUd1ZXNzIGl0cyB0eXBlIGJhc2VkIG9uIHRoZSBkZXRhaWxzIG9mIHRoZSBtZW1iZXJzLgoKVHVlIE9jdCAyMiAxODowNDozMiAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQoKCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIENoZWNrIHJldHVybiB2YWx1ZSBmcm9tCglmaW5kX3BjX2xpbmUuCgpNb24gT2N0IDIxIDE3OjQ3OjAzIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCgoJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgZml4IHN0ZXBpL25leHRpIHRoYXQgd2FzIGJyb2tlbgoJYnkgbXkgbGFzdCBlZGl0IHRvIHRoaXMgcm91dGluZS4KCk1vbiBPY3QgMjEgMTQ6Mjc6NDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiB0bS1zdW4zLmggKEZJWF9DQUxMX0RVTU1ZKTogcHJvYmxlbSB3aXRoIGNyb3NzIGRlYnVnZ2luZy4KCUZJWF9DQUxMX0RVTU1ZIGRvZXMgdW5hbGlnbmVkIGFjY2Vzc2VzIGFuZC9vciBmb3JnZXRzIHRvIGJ5dGUgc3dhcAoJdGhlIHZhbHVlcyBiZWZvcmUgcHV0dGluZyB0aGVtIGludG8gdGhlIGR1bW15IGNvZGUuICAoRnJvbSBQZXRlcgoJU2NoYXVlcikKCk1vbiBPY3QgMjEgMTA6MDQ6MzkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBydGwuY3lnbnVzLmNvbSkKCgkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgZWJtb24gdGFyZ2V0LgoKV2VkIE9jdCAxNiAyMjo0OTo1OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCglHREItNC4yIHJlbGVhc2UhCgoJKiBNYWtlZmlsZS5pbjogIFJvbGwgVkVSU0lPTiB0byA0LjIuCgkqIFJFQURNRSwgVE9ETywgV0hBVFMuTkVXOiAgVXBkYXRlLgoKCSogY29yZS5jIChjb3JlX29wZW4pOiAgSW1wcm92ZSBlcnJvciBtZXNzYWdlIGZvciBiYWQgZmlsZS4KCVBhc3MgLnJlZyB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIHRvIGZldGNoX2NvcmVfcmVnaXN0ZXJzIHRvIGhlbHAKCWl0IGZpbmQgdGhlIHJlZ2lzdGVycyBpbiB0aGUgY29yZS1maWxlIGhlYWRlci4KCSogY29yZWRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBUYWtlIG5ldyBhcmd1bWVudCwgdXNlIGl0LAoJYW5kIHBhc3MgaXQgdG8gcmVnaXN0ZXJfYWRkciB0byBsb2NhdGUgdGhlIGJsb2NrIG9mIHJlZ2lzdGVycy4KCSogeG0tbWlwcy5oOiAgVXBkYXRlIEtFUk5FTF9VX0FERFIgZm9yIG5ldyBzY2hlbWUuICBDbGVhbnVwIGEgYml0LgoKCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIsIHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBIYW5kbGUKCVNlcXVlbnQgTl9GTl9TRVEgbGlrZSBldmVyeWJvZHkgZWxzZSdzIE5fRk4uCgoJKiBtYWluLmM6ICBDaXJjdW12ZW50IFNDTyBjYyBidWcgd2l0aCAjaWYgISFkZWZpbmVkKFVTRykuCgkqIHRtLWkzODZ2Lmg6ICAjZW5kaWYgZ3Vjay4KCSogeGNvbmZpZy9pMzg2KjogIFJlbW92ZSAtRGdldHBhZ2VzaXplKCk9NDA5NiBrbHVkZ2UuCgkqIHhjb25maWcvaTM4NnNjbzogIEFkZCBIQVZFX1NUUlNUUiB0byBhdm9pZCBBTlNJIGJkZWF0aC4KCSogeGNvbmZpZy90YWhvZTogIEFkZCBSRUdFWCwgd2hpY2ggc2VlbXMgdG8gYmUgbWlzc2luZy4KCgkqIGNvcmVkZXAuYzogIEFkZCA8c3lzL3R5cGVzLmg+IGZvciBTQ09uaXguCgkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltbnRhYik6ICBBdm9pZCBjb3JlZHVtcCBvbiBtYWxmb3JtZWQgZmlsZS4KCSogcHJpbnRjbWQuYyAocHJpbnRfZm9ybWF0dGVkKTogIEZsdXNoIG91dHB1dCBiZWZvcmUgZGlzYXNzZW1ibHkuCgpUdWUgT2N0IDE1IDIwOjEyOjMyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGZvd2FudG9uLmN5Z251cy5jb20pCgoJKiBkb2MvcmVmY2FyZC50ZXggKHNlYyAiV29ya2luZyBGaWxlcyIpOiBjb25zaXN0ZW50IG1ldGF2YXJzIGFuZAoJb3RoZXIgaW1wcm92ZW1lbnRzLCBkdWUgdG8gY29tbWVudHMgYnkgRnJhbudvaXMgUGluYXJkCgkocGluYXJkQGlyby51bW9udHJlYWwuY2EpIAoKCSogZG9jL2dkYi50ZXhpbmZvIChhcHBlbmRpeCAiSW5zdGFsbGluZyBHREIiKTogY2hhbmdlcyBpbgoJY29uZmlndXJlLCBhbmQgaW1wcm92ZW5ldHMgcmVsYXRlZCB0byBQaW5hcmQncyByZWZjYXJkIGNvbW1lbnRzCgpUdWUgT2N0IDE1IDA4OjQ1OjEyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCUNoYW5nZXMgZnJvbSBGcmVkIEZpc2g6CgkqIHRtLTY4ay5oIChGUElfUkVHTlVNKTogIEFkZC4KCSogaW5mcnVuLmMgKGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6ICBmbHVzaCBzdGRvdXQgYW5kIHN0ZGVycgoJYmVmb3JlIGZvcmtpbmcuCgkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBhbWlnYWRvcywgYW1peCBob3N0cyBhbmQgdGFyZ2V0cy4KCSogaW5mbG93LmM6ICBIYW5kbGUgVElPQ0dMVENfQlJPS0VOIGZvciBBbWlnYS4KCglGcm9tIEFuZHJlYXMgU2Nod2FiOgoJKiB2YWx1ZXMuYyAoc2hvd19jb252ZW5pZW5jZSk6ICBVc2UgcHJpbnRmX2ZpbHRlcmVkLgoJKiBtYWluLmMgKGRlZmluZV9jb21tYW5kKTogIENoZWNrIHJlc3VsdCBvZiBsb29rdXBfY29tbWFuZCBmb3IKCWV4YWN0IG1hdGNoLgoJKGVjaG9fY29tbWFuZCk6ICBVc2UgcHJpbnRmX2ZpbHRlcmVkLCBhbmQgZm9yY2Ugb3V0cHV0IG91dC4KCgkqIGRieHJlYWQuYyAocmVhZF9lbnVtX3R5cGUpOiAgQXZvaWQgTW9kdWxhLTIga2x1ZGdlIHRoYXQgYnJlYWtzIEMKCXByb2dyYW1zLgoJKiBpMzg3LXRkZXAuYyAoZG91YmxlX3RvX2kzODcpOiAgRml4IHR5cG8gZm9yIGRvdWJsZV90b19pZWVlX2V4dGVuZGVkLgoJKiB1dGlscy5jIChfaW5pdGlhbGl6ZV91dGlscyk6ICBJZiAhSVNBVFRZLCBkb24ndCBwYWdpbmF0ZS4KCSogY29uZmlndXJlLmluLCB0Y29uZmlnL2RlY3N0YXRpb24sIHhjb25maWcvZGVjc3RhdGlvbjogIFJlbmFtZQoJZGVjMzEwMCB0byBkZWNzdGF0aW9uLgoKTW9uIE9jdCAxNCAxMzozNzo1MCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQoKCSogZG9jL2dkYi50ZXhpbmZvOiBDYXRjaCB1cCB0byBjaGFuZ2VzIHJlY29yZGVkIGhlcmUgaW4gQ2hhbmdlTG9nCgkobm9kZXMgQ29udGludWluZyBhbmQgU3RlcHBpbmc7IE1lbW9yeTsgVGFyZ2V0cykgY2xhcmlmaWNhdGlvbnMKCWR1ZSB0byBMYXJyeSBCcmVlZAoKRnJpIE9jdCAxMSAyMzoyNzowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIHRtLXtpcml4MyxtaXBzLG5pbmR5OTYwLHBuLHN5bW1ldHJ5LHZ4OTYwfS5oOiAgTW92ZQoJUkVHSVNURVJfVV9BRERSIHRvIGNvcnJlc3BvbmRpbmcgeG0tIGZpbGUuICBTdWdnLiBieSBQZXRlciBTY2hhdWVyLgoKCSogc3ltbWlzYy5jIChwcmludF9wYXJ0aWFsX3N5bXRhYnMpOiAgQWRkIHByaW50cHN5bXMgZGVidWcgY21kLgoKCSogbTY4ay10ZGVwLmMgKG02OGtfcHVzaF9kdW1teV9mcmFtZSwgbTY4a19wb3BfZnJhbWUpOiAgQWRkCglnZW5lcmljIHJvdXRpbmVzIGZvciBjYWxsaW5nIGluZmVyaW9yIGZ1bmN0aW9ucy4KCgkqIGJsb2NrZnJhbWUuYyAoaW5zaWRlX21haW5fc2NvcGUsIGluc2lkZV9lbnRyeV9zY29wZSk6ICBOZXcuCgoJKiBjb3B5aW5nLmF3azogIEZpbHRlciBmb3JtZmVlZHMgb3V0IG9mIGNvcHlpbmcgJiB3YXJyYW50ZWUuCglNYWtlIHRoZW0gYXZhaWxhYmxlIGFzIGBzaG93IGNvcHlpbmcnIGFuZCBgc2hvdyB3YXJyYW50ZWUnIGFsc28uCgkqIG1haW4uYyAocHJpbnRfZ251X2FkdmVydGlzZW1lbnQpOiAgQWR2dCBgc2hvdycgY29tbWFuZHMuCgpUaHUgT2N0IDEwIDE3OjI1OjQ3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogbWFjaDM4Ni14ZGVwLmM6ICBFdmVuIHdoZW4gY3Jvc3MtY29tcGlsaW5nLCBsZWF2ZSBpbiB0aGUKCWNvcmUtZmlsZSByZWFkaW5nIGNvZGUuCgkqIGNvcmUuYyAoZ2V0X2NvcmVfcmVnaXN0ZXJzKTogIEF2b2lkIGNvcmVkdW1wIGlmIG5vIC5yZWcgc2VjdGlvbi4KCldlZCBPY3QgIDkgMTc6MDM6MzQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBtaXBzcmVhZC5jLCBjb2ZmcmVhZC5jOiAgaW5pdGlhbGlzZSBUWVBFX1ZQVFJfRklFTEROTyB0byAtMS4KCVRoaXMgYXZvaWRzIGNvcmVkdW1wcyB1bmRlciBgc2V0IHByaW50IG9iamVjdCBvbicgaW4gdmFsdWVfaGVhZG9mCgkoY2FsbGVkIGVycm9uZW91c2x5IGJ5IHZhbHVlX2Zyb21fdnRhYmxlX2luZm8pIGZvciBgcCAmc3RydWN0JwoJb3IgYHAgKnN0cnVjdCcuICBGcm9tIFBldGVyIFNjaGF1ZXIuCgpNb24gT2N0ICA3IDAwOjA2OjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46ICBSb2xsIHZlcnNpb24gdG8gNC4xLjIuCgkqIGRieHJlYWQuYzogIFVzZSBhb3V0NjQuaCwgbm90IGEub3V0LmdudS5oLiAgR2V0IGV4dGVybmFsIHN5bWJvbCBlbnRyeQoJc2l6ZSBmcm9tIEJGRCAoYnV0LCBGSVhNRSwgd2UgZG9uJ3QgeWV0IHJlYWQgZXh0ZXJuYWwgbmxpc3RzJ3MgYW5kCgljb252ZXJ0IHRoZW0gdG8gaW50ZXJuYWwgbmxpc3RzJ3MgYmVmb3JlIGhhbmRsaW5nIHRoZW0gLS0gd2Ugc3RpbGwKCWFzc3VtZSB0aGV5IGhhdmUgdGhlIHNhbWUgc2l6ZSBhbmQgYWxpZ25tZW50LikgIFVzZSBTRVRfTkFNRVNUUklORwoJZXZlcnl3aGVyZSB1c2VmdWwuCgkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiAgTW92ZSBkZWFkIGNvZmYtZW5jYXBzdWxhdGlvbiBjb2RlCgl0byBCRkQuCgkqIG04OGstdGRlcC5jLCBtODhrLXhkZXAuYzogIFJlbW92ZSBlbmNhcCB0ZXN0IGFuZCAjaW5jIDxhLm91dC5oPi4KCkZyaSBPY3QgIDQgMjI6MzA6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBjb25maWd1cmUuaW4sIHRtLWkzODZ2LmgsIHhtLWkzODZ2Lmg6IEludGVsIDM4NiBNYWNoIGhvc3QgcG9ydC4KCSogeG0taTM4Nm1hY2guaCwgbWFjaDM4Ni14ZGVwLmMsIHhjb25maWcvaTM4Nm1hY2g6ICBOZXcgZmlsZXMuCgpGcmkgT2N0ICA0IDE3OjA0OjMxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQoKCU1vcmUgcGF0Y2hlcyBmcm9tIFBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPjoKCSogbWlwcy14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBEb24ndCB0cnkgdG8KCXdyaXRlIHRoZSAocHNldWRvKSBGUC4KCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIEltcHJvdmVkIGFsZ29yaXRobSBmb3IKCXNldHRpbmcgcHN0LT50ZXh0aGlnaC4KCkZyaSBPY3QgIDQgMTY6NDc6MzIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKCgkqIGRvYy9NYWtlZmlsZTogbWFrZSBURVhJTlBVVFMgaW5jbHVkZSAuIGV2ZXJ5d2hlcmUKCkZyaSBPY3QgIDQgMDA6MzU6NTYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBjb2ZmcmVhZC5jLCBkYnhyZWFkLmMsIHN5bWZpbGUuYywgc3ltbWlzYy5jLCBzeW10YWIuaDogIFJlbW92ZQoJdmVzdGlnZXMgb2YgdHlwZXZlY3RvcnMsIHdoaWNoIHdlcmUgZm9yIHN5bXNlZ3MgYW5kIGFyZSBubyBsb25nZXIKCXVzZWQuICAoRnJvbSBhIHF1ZXN0aW9uIGJ5IEVsaW90IERyZXNzZWxoYXVzCgk8ZHJlc3NlbGhAUkZUMzAubmFzLm5hc2EuZ292PikuCgpUaHUgT2N0ICAzIDA5OjMzOjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKICAgIAkqIGRieHJlYWQuYywgY29mZnJlYWQuYzogIHN0YXRpYy1pemUgZnVuY3Rpb25zIHRoYXQgd2VyZQoJZ3JhdHVpdGlvdXNseSBleHRlcm5hbC4gIChGcm9tIEZyZWQgRmlzaC4pCgoJKiBjLWV4cC55OiAgc3ltLT5jbGFzcyB0byBTWU1CT0xfQ0xBU1MgKHN5bSkuCgoJKiBkYnhyZWFkLmMgKGRieF9sb29rdXBfdHlwZSk6ICBLZWVwIGRvdWJsaW5nIHNpemUgb2YgdHlwZXZlY3RvcgoJdW50aWwgaXQgaXMgbGFyZ2UgZW5vdWdoLiAgICAKCgkqIGRieHJlYWQuYyAocmVhZF90eXBlKTogIEhhbmRsZSBlcnJvciBjYXNlIHNsaWdodGx5IGJldHRlci4KCU1ha2UgY29tcGxhaW50IG1lc3NhZ2Ugbm90IEMrKy1zcGVjaWZpYy4KCldlZCBPY3QgIDIgMTc6MjE6MDcgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKCgkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBGaXggc3RlcC9uZXh0IHNvIHRoYXQgeW91IG9ubHkKCXN0b3AgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBsaW5lLiAgVGhpcyBmaXhlcyB2YXJpb3VzIHByb2JsZW1zCgl3aXRoIGZvciBsb29wcywgbmVzdGVkIGlmLWVsc2UncyBhbmQgc3dpdGNoIHN0YXRlbWVudHMuCgpUdWUgT2N0ICAxIDA2OjMzOjU1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogc3ltdGFiLmMgKGxvb2t1cF9zeW10YWJfMSwgbG9va3VwX3N5bWJvbCk6ICAiZmF0YWwiIGVycm9ycwoJYmV0d2VlbiBzeW10YWJzIGFuZCBwc3ltdGFicyBiZWNvbWUgb3JkaW5hcnkgZXJyb3IoKXMuCgoJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6ICBSZWxvY2F0ZSBlbmRfb2ZfdGV4dF9hZGRyCglwcm9wZXJseSwgbWFraW5nICJlbmQgcGMiIGNvcnJlY3QgaW4gc2hhcmVkIGxpYiBwc3ltdGFicy4KCShGcm9tIEd1eSBIYXJyaXMgPGd1eUBhdXNwZXguY29tPi4pCgpNb24gU2VwIDMwIDEzOjE1OjMxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogZGJ4cmVhZC5jOiAgRW5hYmxlLCBidXQgc29mdGVuLCBjb25zdF92b2xfY29tcGxhaW50LgoJKHJlYWRfZGJ4X3N5bXRhYik6ICBOX1NUU1lNIGFuZCBOX0xDU1lNIGRlZmluZSBzdGF0aWMgdmFycy4KCURpdHRvIEdvdWxkIE5fTkJTVFMgYW5kIE5fTkJMQ1MuICBBbHNvLCBhbGwgdHlwZXMgaW4gdGhlIHBzeW10YWIKCXNob3VsZCBiZSBmaWxlLXNjb3BlLCBub3QgZ2xvYmFsLgoJKHJlYWRfc3RydWN0X3R5cGUpOiAgUmVtb3ZlIGFuY2llbnQgbXVsdGlwbGUtaW5oZXJpdGFuY2Ugd2FybmluZy4KCShyZWFkX3JhbmdlX3R5cGUpOiAgQ2hlY2sgYmFzZSB0eXBlLCBjb21wbGFpbiAmIHBhdGNoIGlmIHVuZGVmaW5lZC4KCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6ICBEZW1hbmdsZSB0aGUgZnVuY3Rpb24gbmFtZSBpbiBgaW5mbyBzdGFjaycuCgkoRnJvbSBQZXRlciBTY2hhdWVyKQoKU2F0IFNlcCAyOCAxMDowMjozMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX2Zvcl9hZGRyZXNzKTogIERvbid0IHVzZQoJVFlQRV9QT0lOVEVSX1RZUEUgZGlyZWN0bHkgKGl0IG1pZ2h0IGJlIHplcm8gaWYgdGhpcyB0eXBlIGhhcwoJbmV2ZXIgaGFkIGEgcG9pbnRlciBjcmVhdGVkIGJlZm9yZSk7IHVzZSBsb29rdXBfcG9pbnRlcl90eXBlLgoJKiBzeW10YWIuYyAobG9va3VwX21ldGhvZF90eXBlKTogIEFyZ3VtZW50cyB3ZXJlIHN3YXBwZWQgaW4gYWxsCgljYWxsZXJzLCBzbyBmaXggaXQgaGVyZS4gIEknbSBhbWF6ZWQgdGhpcyB3b3JrZWQgYXQgYWxsIQoKRnJpIFNlcCAyNyAxODowOTozMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIGMtZXhwLnksIG0yLWV4cC55OiAgRGVmaW5lIG1vcmUgeXlzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlCgkiYnNzIiByYXRoZXIgdGhhbiAiZGF0YSIgc3ltYm9scywgYnV0IHdoaWNoIHN0aWxsIGNvbmZsaWN0LgoJKiBtMi1leHAueTogIExpbnQuCgoJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfcmVhZCk6ICBVc2UgeG1hbGxvYywgbm90IG1hbGxvYy4KCSogY29yZS5jIChjb3JlX2ZpbGVzX2luZm8pOiAgU2hvcnRlbiBvdXRwdXQuCgkqIGV4ZWMuYyAoZXhlY19maWxlc19pbmZvKTogIERpdHRvLgoJKGJ1aWxkX3NlY3Rpb25fdGFibGUpOiAgSWdub3JlIHplcm8tbGVuZ3RoIHNlY3Rpb25zLgoJKiBsYW5ndWFnZS5jLCBwcmludGNtZC5jOiAgTGludC4KCSogbGFuZ3VhZ2UuaCAoZ2V0X2ZyYW1lX2xhbmd1YWdlKTogIERlY2xhcmUuCgkqIHNhYmVyLnN1cHByZXNzOiAgdXBkYXRlLgoJKiBzdGFjay5jIChmaW5kX3JlbGF0aXZlX2ZyYW1lKTogIFJlbW92ZSBjb21wbGV4IGNvZGUgdGhhdCB3YXMKCSNpZiAwJ2QsIHN0aWNrIHdpdGggc2ltcGxlIGNvZGUuICBMaW50LgogICAgICAgICogc2FiZXIuc3VwcHJlc3M6ICBVcGRhdGUgYSBiaXQuCgkqIHN5bWZpbGUuYyAoYWRkX3N5bWJvbF9maWxlX2NvbW1hbmQpOiAgQWRkICI/IiB0byBxdWVzdGlvbi4KCSogdXRpbHMuYyAocGFyc2VfZXNjYXBlKTogIEF2b2lkIFxhIGR1ZSB0byBiZGVhZCBjb21waWxlcnMuCgkqIHZhbHVlLmg6ICBEZWNsYXJlIHR5cGVkZWZfcHJpbnQuCgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQsIHR5cGVfcHJpbnRfYmFzZSk6ICBUWVBFX0NPREVfUkFOR0UgbGVzcwoJa2x1ZGdleS4KCgkqIG5pbmR5LXRkZXAuYyAobmluZHlfZnJhbWVfY2hhaW5fdmFsaWQpOiAgVXNlIGxvb2t1cF9taXNjX2Z1bmMuCgkoUmVwb3J0ZWQgYnkgTWFyayBQZWVrIDxtYXJrQGltYWdlbi5jb20+LikKCgkqIHNvbGliLmMgKHNvbGliX21hcF9zZWN0aW9ucyk6ICBSZWxvY2F0ZSBhbGwgc2VjdGlvbnMsIGV2ZW4KCXRob3VnaCBvbmx5IHRoZSB0ZXh0IHNlY3Rpb24ncyBzaXplIGlzIHRyYWNrZWQuICBNYXJrIGxkX3RleHQKCWZvciBldmVudHVhbCBlbGltaW5hdGlvbiBhcyB3ZSBnZW5lcmFsaXplIHRvIE4gc2VjdGlvbnMuCgoJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgRG9uJ3QgY2hlY2sgaWYgdGhlIFBDIGlzIGluIGEKCWNhbGxfZHVtbXkgaWYgd2Ugd2VyZSBzdG9wcGVkIGJ5IGEgcmFuZG9tIHNpZ25hbCB0aGF0IGlzIGJlaW5nCglwYXNzZWQgdG8gdGhlIHByb2dyYW0uICBUaGlzIHByb2R1Y2VkIHdpZXJkIHJlc3VsdHMgd2hlbiBjYWxsaW5nCglmdW5jdGlvbnMgaW4gdGhlIGluZmVyaW9yIGFuZCBzaWduYWxzIChlLmcuIFNJR0FMUk0pIHdlcmUgaW4gdXNlLgoKVHVlIFNlcCAyNCAxODowNTozMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIGluZnJ1bi5jIChJTl9TSUdUUkFNUCk6ICBOb3QgcGFyZW50aGVzaXplZCBwcm9wZXJseS4KCUJ1Z2ZpeCBmcm9tIFBhdWwgRWdnZXJ0IDxlZ2dlcnRAdHdpbnN1bi5jb20+LgoJKiB0bS11bHRyYTMuaCAoSU5fU0lHVFJBTVApOiAgRGl0dG8uCgkqIHZhbHByaW50LmMgKHByaW50X2Zsb2F0aW5nKTogIFByaW50IDkgZGlnaXRzIGZvciBJRUVFIGZsb2F0cy4KCUZyb20gUGF1bCBFZ2dlcnQuCgpNb24gU2VwIDIzIDE1OjUwOjA3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46ICBSb2xsIFZFUlNJT04gdG8gNC4xLjEuCgkqIHNvdXJjZS5jIChsaW5lX2luZm8pOiAgUGV0ZXIgU2NoYXVlciBmaXhlcyBhIGJ1ZyBJIGludHJvZHVjZWQgaW4KCWhleCBjb252ZXJzaW9uLgoKRnJpIFNlcCAyMCAxNjoxMDo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCglHREItNC4xIHJlbGVhc2UhCgoJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBTZXQgdG8gNC4xLgkKCSogbGFuZ3VhZ2UuYyAoc2V0X2xhbmd1YWdlX2NvbW1hbmQpOiAgUHJpbnQgdXNlZnVsIGhlbHAgbWVzc2FnZSwKCWFuZCByZXN0b3JlIHRoZSBsYW5ndWFnZSBzdHJpbmcgYWZ0ZXIgZ2l2aW5nIGhlbHAuCgkqIHZhbHByaW50LmMgKHR5cGVkZWZfcHJpbnQpOiAgUHJpbnQgdHlwZWRlZiBpbiBDIG9yIE0yLgoJKiBzeW10YWIuYyAobGlzdF9zeW1ib2xzKTogIFVzZSBpdC4KCSogbWFpbi5jIChtYWluKTogIEF2b2lkIGFueSBvdXRwdXQgYmVmb3JlIChnZGIpIHByb21wdCB3aGVuIC1xLgoJKiBsYW5ndWFnZS5jIChzZXRfbGFuZ3VhZ2VfY29tbWFuZCk6ICBIYW5kbGUgZXJyb3JzIGJ5IHJlc3RvcmluZwoJdGhlIGxhbmd1YWdlIHN0cmluZyB0byBpdHMgY3VycmVudCBzdGF0ZSAoZml4IGZyb20gQS4gQmVlcnMpLgoJKiBkb2MvZ2RiaW50LnRleGluZm86ICBSb2xsIGluIGluZm9ybWF0aW9uIGZyb20gUkVBRE1FLiAgUmVhcnJhbmdlCgkiaG93IHRvIGluc3RhbGwiIGFuZCAiaG93IHRvIHByaW50IHRoZSBkb2MiIHN0dWZmIHNvIGl0IGRyb3BzCgllYXNpZXIgaW50byBSRUFETUUuCgkqIGNvbmZpZ3VyZS5pbjogIFJlbmFtZSBydHBjIENQVSB0byByb21wIHRvIG1hdGNoIGNvbmZpZy5zdWIuCgkqIFJFQURNRSwgV0hBVFMuTkVXLCBUT0RPOiAgVXBkYXRlIGZvciBnZGItNC4xLgoKRnJpIFNlcCAyMCAxNzozOToxNCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQoKCSogZG9jL2dkYi50ZXhpbmZvOiBVcGRhdGVzIGZyb20gQ2hhbmdlTG9nLiAgc2V0L3Nob3cgd3JpdGUsIAoJYXV0b2xvYWRpbmcgc2hhcmVkIGxpYnMsIGNvcHlyaWdodCBldGMgb24gR0RCIHN0YXJ0dXAsIGNsZWFuIHVwICRfCglhbmQgJF9fIGluZGV4IHJlZnMsIHNldC9zaG93IGxpc3RzaXplIGFuZCByZWxhdGVkIHVwZGF0ZXMgdG8gbGlzdAoJY21kLiAgTmV3IGhvc3QvdGFyZ2V0IGNvbmZpZ3MuCgpGcmkgU2VwIDIwIDE1OjQ2OjAwIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCgoJKiBkb2MvTWFrZWZpbGU6IGdlbmVyYXRlIGF1eCB2ZXJzaW9uLW5vIGZpbGUgZG9jL2dkYlZOLm00Cglmcm9tIG1haW4gTWFrZWZpbGUuaW4gdmVyc2lvbiBkZWZpbml0aW9uCglkb2MvZ2RiLnRleGluZm86IHVzZSB2ZXJzaW9uIHJlY29yZGVkIGluIGRvYy9nZGJWTi5tNCBmb3IgY3VycmVudAoJR0RCIHZlcnNpb24gbm8gcmVmcyAKCU1ha2VmaWxlLmluIChzZXR1cC10by1kaXN0KTogZ2VuZXJhdGUgZG9jL2dkYlZOLm00IAoKCSogZG9jL2dkYi50ZXhpbmZvOiBtZXJnZSBuZXcgbGFuZ3VhZ2Utc3dpdGNoaW5nIGFuZCBsYW5nLXNwZWNpZmljCglkb2MgYnkgQW5kcmV3IEJlZXJzCgpGcmkgU2VwIDIwIDE1OjAwOjU3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQoKCSogbWNoZWNrLmM6IEFkZCBfX09ORUZJTEUga2x1ZGdlIHRvIGFsbG93IGNvbXBpbGF0aW9uIGJ5IG5vbi1BTlNJCgljb21waWxlcnMgKHdoaWNoIG1heSBsYWNrIHN0ZGRlZi5oKS4KCkZyaSBTZXAgMjAgMTM6Mjk6NDIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYiwgcHJvY2Vzc19vbmVfc3ltYm9sKTogIE5fRk4gYW5kCglOX1dBUk5JTkcgYXJlIHRoZSBzYW1lIGV4Y2VwdCBmb3IgdGhlIE5fRVhUIGJpdCwgc28ganVzdCB1c2UgdGhlaXIKCXZhbHVlcyBhbG9uZSwgcmF0aGVyIHRoYW4gT1ItaW5nIHRoZW0gd2l0aCBOX0VYVC4KCkZyaSBTZXAgMjAgMTI6Mjc6NTUgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKCgkqIG1pcHNyZWFkLmMgKHBhcnNlX2xpbmVzKTogIERlYWwgd2l0aCBuZWdhdGl2ZSBleHRlbmRlZCBsaW5lCglvZmZzZXRzIGNvcnJlY3RseS4KCgkqIGMtZXhwLnksIG0yLWV4cC55OiAgI2RlZmluZSB5eWVycmZsYWcgYW5kIHl5bmVycnMgdG8gYXZvaWQKCWdsb2JhbCBzeW1ib2wgY29uZmxpY3RzLgoKRnJpIFNlcCAyMCAwMjoyODoxNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCgkqIC5nZGJpbml0OiAgTW92ZSAnc2V0IGNvbXBsYWludHMnIHRvIHRvcCwgc28gaXQgcnVucyBldmVuIGluCgljYXNlIHdlIGFyZW4ndCBkZWJ1Z2dpbmcgR0RCLgoJKiBsYW5ndWFnZS5jIChfaW5pdGlhbGl6ZV9sYW5ndWFnZSk6ICBGaXggdHlwZSBjaGVjayBhbmQgcmFuZ2UKCWNoZWNrIGRvY3VtZW50YXRpb24gc3RyaW5ncy4KCSogdXRpbHMuYyAoIUhBVkVfVlBSSU5URik6ICBEZWZpbmUgdmZwcmludGYgYXMgYSBmdW5jdGlvbiwgc28KCWxhbmd1YWdlLmMgY2FuIHVzZSBpdC4gIChUaG91Z2ggbGFuZ3VhZ2UuYyBzaG91bGQgcmVhbGx5IG5vdCBiZQoJaGFuZGxpbmcgd2FybmluZ3MvZXJyb3JzIHRoZSB3YXkgaXQgZG9lcywgRklYTUUuKQoJKiBzeW10YWIuYyAobG9va3VwX3ByaW1pdGl2ZV90eXBlKTogIGNvbnN0IGxpbnQuCgoJQnVnZml4IGZyb20gUGV0ZXIgU2NoYXVlcjoKCSogc291cmNlLmMgKGxpbmVzX3RvX2xpc3QpOiAgTWFrZSBzaWduZWQsIHRvIGF2b2lkIGNvbXBhcmlzb24KCWdvaW5nIHVuc2lnbmVkIGFuZCBjb21wbGFpbmluZyB0aGF0IC0zIGlzIHRvbyBoaWdoIGZvciAyMSBsaW5lcy4KCSogc3RhY2suYyAobGluZXNfdG9fbGlzdCk6ICBEaXR0by4KClRodSBTZXAgMTkgMjM6MzM6NDEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCBtaW5pbW9uLmguCgkoVkVSU0lPTik6ICBSb2xsIHZlcnNpb24gbnVtYmVyIHRvIDQuMC45NS4KCShnZGIudGFyLlosIG1ha2UtcHJvdG8tZ2RiLmRpciwgc2V0dXAtdG8tZGlzdCwgZ2RiLVhYWC50YXIuWik6CglOZXcgcnVsZXMgZm9yIGJ1aWxkaW5nIGRpc3RyaWJ1dGlvbnMuICBOb3JtYWwgZGlzdHJpYnV0aW9uCglpcyBidWlsdCBieSBkb2luZyBgbWFrZSAtZiBNYWtlZmlsZS5pbiBnZGIudGFyLlonIGluIHRoZSBkaXJlY3RvcnkKCW9uZSBsZXZlbCB1cCBmcm9tIGhlcmU7IGl0IGNhbGxzIG1ha2UtcHJvdG8tZ2RiLmRpciB0byBidWlsZCBhCglkaXJlY3RvcnkgYHByb3RvLWdkYicgd2hpY2ggaXMgYW4gaW1hZ2Ugb2YgdGhlIHJlbGVhc2UuICBUaGUgb2xkCglgZ2RiLnRhci5aJyBydWxlIHN0aWxsIHdvcmtzIHRvby4KCSogY29uZmlnLnN1YiwgY29uZmlndXJlOiAgUm9sbCBpbiBsYXRlc3QgZnJvbSAuLgoKVGh1IFNlcCAxOSAxNzo0MToyNCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQoKCSogZG9jL2dkYmludC50ZXhpbmZvOiBSZW9yZGVyIGNvbnRlbnRzOyByZW9yZ2FuaXplIG5ldy1ob3N0LAoJbmV3LXRhcmdldCwgYW5kIG5ldy1jb25maWcgY2hhcHRlcnM7IGZpeCBtaW5vciB0eXBvczsgY29tZSBjbG9zZXIKCXRvIHVzdWFsIEdOVSBtYXJrdXAgY29udmVudGlvbnMgZm9yIEBmaWxlIEBzYW1wIEBjb2RlIEB2YXIuCgpUaHUgU2VwIDE5IDE3OjA0OjEyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQoKCVBhdGNoZXMgZnJvbSBQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT46CgkqIG1pcHNyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6IEVudGVyIHRoZSBuYW1lIG9mIGFsbAoJc3RydWN0cy91bmlvbnMuLi4gaW50byB0aGUgcHN5bXRhYiBzbyB3ZSBjYW4gYWNjZXNzIHRoZW0gaWYgdGhlCglzeW10YWIgaXMgbm90IHJlYWQgaW4uCgkqIG1pcHMtdGRlcC5jOiAgUmVtb3ZlIHNvbWUgdW5uZWVkZWQgI2luY2x1ZGVzLgoJKiB4Y29uZmlnL2RlYzMxMDA6IEFkZCBIQVZFX1NUUlNUUi4KClRodSBTZXAgMTkgMTU6MTQ6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBNYWtlZmlsZS5pbjogIENpcmN1bXZlbnQgU3VuIE1ha2UgYnVnIG9uICotZXhwLnRhYi5vLgoJKiBjLWV4cC55LCBtMi1leHAueTogIExpbnQuCgkqIG0yLWV4cC55OiAgQXZvaWQgdXNpbmcgeXl0bmFtZVtdIHdoaWNoIGlzIGEgQmlzb24taXNtLgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfZmllbGRzKTogIENoZWNrIGZvciBzdHViIHR5cGUuCgkqIG1pcHNyZWFkLmMgKF9pbml0aWFsaXplX21pcHNyZWFkKTogIEF2b2lkIHVzaW5nCglidWlsdGluX3R5cGVfdm9pZCBhdCBpbml0aWFsaXplIHRpbWUuCgkobWlwc2NvZmZfc3ltZmlsZV9yZWFkKTogIHVzZSBpdCBub3cuCQoKV2VkIFNlcCAxOCAxNTo1NTo1MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCglNZXJnZSBtdWx0aXBsZS1sYW5ndWFnZSBzdXBwb3J0LCBhbmQgcGFydGlhbCBNb2R1bGEtMiBzdXBwb3J0LAoJZnJvbSBBbmRyZXcgQmVlcnMgPGJlZXJzQGNzLmJ1ZmZhbG8uZWR1Pi4KCgkqIGkzODctdGRlcC5jOiAgTmV3IGZpbGUsIGNvbnNvbGlkYXRlcyBtb3N0IDgwMzg3IHN1cHBvcnQsCglhbmQgZWxpbWluYXRlcyBob3N0IGRlcGVuZGVuY3kgb24gZG91YmxlPC0+ZXh0ZW5kZWQgY29udmVyc2lvbnMuCgkqIGkzODYteGRlcC5jLCBzeW1tLXhkZXAuYzogIFJlbW92ZSBtb3N0IDM4NyBzdXBwb3J0LgoJKiB4Y29uZmlnL2kzODZ7c2NvLHYsdi1nLHYzMix2MzItZ306ICBOb3cgbmVlZCBpMzg3LXRkZXAuby4KCgkqIHN5bWZpbGUuYyAoYWxsb2NhdGVfc3ltdGFiKTogIE5ldyBmbiwgY29uc29saWRhdGVzIHRoZSB3b3JrCglvZiBhbGxvY2F0aW5nIGFuZCBpbml0aWFsaXppbmcgYSBuZXcgc3RydWN0IHN5bXRhYi4gIFNldCB0aGUKCWxhbmd1YWdlIG9mIHRoZSBzeW10YWIgYmFzZWQgb24gaXRzIGZpbGVuYW1lIGV4dGVuc2lvbi4KCSogc3ltZmlsZS5oOiAgRGVjbGFyZSBpdC4KCSogbWlwc3JlYWQuYyAobmV3X3N5bXRhYik6ICBVc2UgaXQuICBNaW5vciBmb3JtYXR0aW5nIGNoYW5nZXMuCgkqIGRieHJlYWQuYyAoZW5kX3N5bXRhYik6ICBVc2UgaXQuCgoJKiBtaXBzcmVhZC5jIChwYXJzZV9zeW1ib2wsIGNhc2Ugc3RQYXJhbSBhbmQgc3RQcm9jKTogIEFkZCAjaWYgMCdkCgljb2RlIGZvciBzYXZpbmcgdHlwZXMgb2YgcGFyYW1ldGVycyB3aXRoIGVhY2ggZnVuY3Rpb24gZGVmaW5pdGlvbi4KCSogZGJ4cmVhZC5jIChkZWZpbmVfc3ltYm9sLCBmdW5jdGlvbiBhbmQgcGFyYW1ldGVyIGNhc2VzKTogIERpdHRvLgoJKHJlYWRfZGJ4X3N5bXRhYiwgY2FzZSBOX0RFRkQpOiAgSWdub3JlLgoJKHJlYWRfZW51bV90eXBlKTogIFJlY29nbml6ZSBGQUxTRS9UUlVFIGVudW0gYXMgTW9kdWxhLTIgQk9PTEVBTi4KCShyZWFkX3JhbmdlX3R5cGUpOiAgUmVuYW1lIE1BWF9PRl9UWVBFIHRvIE1BWF9PRl9DX1RZUEUsIGV0Yy4KCSNpZiAwIG91dCBpdHMgdXNlcywgdGhvdWdoLCBzaW5jZSB0aGV5IHNldCBhIGRlYWQgdmFsdWUuCgkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIpOiAgVXNlIGFsbG9jYXRlX3N5bXRhYi4KCShwcm9jZXNzX2NvZmZfc3ltYm9sKTogICNpZiAwJ2QgZm9yIGZ1bmN0aW9ucyBhbmQgcGFyYW1zIGFzIGFib3ZlLgoJKHJlYWRfZW51bV90eXBlKTogIFJlY29nbml6ZSBNb2R1bGEtMiBCT09MRUFOLgoJKiBzeW10YWIuYyAoYWRkX3BhcmFtX3RvX3R5cGUpOiAgI2lmIDAnZCBmdW5jdGlvbiB0byBhZGQgYQoJcGFyYW1ldGVyIHR5cGUgdG8gYSBmdW5jdGlvbiB0eXBlJ3MgZmllbGQgbGlzdC4KCgkqIGRlZnMuaCAobG9jYWxfaGV4X2Zvcm1hdCwgbG9jYWxfaGV4X3N0cmluZywgKl9jdXN0b20pOiAgQWRkLgoJKiBpMzg2LXhkZXAuYywgcHlyLXRkZXAuYywgcHlyLXhkZXAuYywgcmVtb3RlLXZ4LmMsIHNvbGliLmMsCglzb3VyY2UuYywgc3ltZmlsZS5jLCBkYnhyZWFkLmMsIGJyZWFrcG9pbnQuYywgY29yZS5jLCBleGVjLmMsCglpMzg3LXRkZXAuYywgaW5mY21kLmMsIG1pcHMtdGRlcC5jLCBzdGFjay5jLCBwcmludGNtZC5jOiAgT3V0cHV0CgloZXggd2l0aCBsb2NhbF9oZXhfc3RyaW5nIGZvciBNb2R1bGEtMiBzdXBwb3J0LgoKCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X2NvbmRfZXZhbCk6ICBVc2UgbmV3IHZhbHVlX3RydWUgdG8gdGVzdAoJYnJlYWtwb2ludCBjb25kaXRpb24gbGFuZ3VhZ2UtaW5kZXBlbmRlbnRseS4KCgkqIHBhcnNlLmM6ICBOZXcgZmlsZSB3aXRoIHRoZSBjb21tb24gY29kZSByZW1haW5zIG9mIGV4cHJlYWQueS4KCSogcGFyc2VyLWRlZnMuaDogIE5ldyBmaWxlIHdpdGggY29tbW9uIGRlY2xhcmF0aW9ucyBmcm9tIGV4cHJlYWQueS4KCSogYy1leHAueTogIE5ldyBmaWxlIHdpdGggdGhlIEMgcGFyc2VyIGZyb20gZXhwcmVhZC55LCBhbmQgb3RoZXIKCWxhbmd1YWdlLXNwZWNpZmljIGluZm9ybWF0aW9uLgoJKiBtMi1leHAueTogIE5ldyBmaWxlIHdpdGggdGhlIE1vZHVsYS0yIHBhcnNlciBhbmQgZXRjLgoJKiBleHByZWFkLnksIGV4cHJlYWQudGFiLmM6ICBSZW1vdmUuCgkqIGJyZWFrcG9pbnQuYywgZXZhbC5jLCBwcmludGNtZC5jLCBleHByZXNzaW9uLmg6ICBVc2UKCXBhcnNlX2V4cHJlc3Npb24gYW5kIHBhcnNlX2V4cF8xIHJhdGhlciB0aGFuIHBhcnNlX2NfZXhwcmVzc2lvbgoJYW5kIHBhcnNlX2NfMS4KCgkqIHN5bXRhYi5oIChlbnVtIGxhbmd1YWdlcyk6ICBNb3ZlIHRvIGRlZnMuaC4KCShlbnVtIHR5cGVfY29kZSk6ICBBZGQgVFlQRV9DT0RFX0NIQVIgYW5kIFRZUEVfQ09ERV9CT09MLgoJRGVjbGFyZSBNb2R1bGEtMiBidWlsdGluIHR5cGVzLgoJQWRkIE1BWF9PRl9UWVBFIGFuZCBNSU5fT0ZfVFlQRSBtYWNyb3MuCgoJKiBzeW10YWIuYyAoX2luaXRpYWxpemVfc3ltdGFiKTogIFJlbW92ZSBidWlsdGluIHR5cGUKCWRlZmluaXRpb24gYW5kIGluaXRpYWxpemF0aW9uIHRvICotZXhwLnkuICAKCShsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lKTogIFVzZSBsYW5ndWFnZS1kZXBlbmRlbnQgdmVjdG9yLgoJKGxvb2t1cF90eXBlbmFtZSk6ICBGaXggYnVnLCBtYWtlIGl0IHdvcmsgaWYgcHJpbWl0aXZlIHR5cGVuYW1lLgoJKGxvb2t1cF91bnNpZ25lZF90eXBlbmFtZSk6ICBDYWxsIGFib3ZlLgoJKGNyZWF0ZV9hcnJheV90eXBlKTogIFNldCB1cCByYW5nZSB0eXBlIGZvciBhcnJheSBpbmRleC4KCShsaXN0X3N5bWJvbHMpOiAgQ2FsbCB0eXBlZGVmX3ByaW50IHRvIHByaW50IHR5cGVkZWZzLgoKCSogdmFsdWVzLmMgKHVucGFja19sb25nLCB2YWx1ZV9mcm9tX2xvbmdlc3QpOiAgSGFuZGxlCglUWVBFX0NPREVfQk9PTCBhbmQgVFlQRV9DT0RFX0NIQVIuCgoJKiBleHByZXNzaW9uLmggKGVudW0gZXhwX29wY29kZSk6ICBBZGQgTW9kdWxhLTIgc3BlY2lmaWMgb3Bjb2Rlcy4KCSogZXhwcHJpbnQuYzogIExvb2sgdXAgZXhwcmVzc2lvbiBvcGNvZGVzIGluIGxhbmd1YWdlLXNwZWNpZmljCgl0YWJsZSwgYmFzZWQgb24gZXhwcmVzc2lvbidzIGxhbmd1YWdlLiAgSGFuZGxlIHNvbWUgTW9kdWxhLTIKCXNwZWNpZmljIG9wY29kZXMuCgoJKiBzdGFjay5jIChmcmFtZV9pbmZvKTogIFByaW50IGxhbmd1YWdlIG9mIHN0YWNrIGZyYW1lLgoJKHNlbGVjdF9mcmFtZSk6ICBBbHNvIHNlbGVjdCBsYW5ndWFnZSwgaWYgaW4gYXV0by1tb2RlLgoJKGdldF9mcmFtZV9sYW5ndWFnZSk6ICBOZXcgc3Vicm91dGluZS4KCSogbWFpbi5jIChleGVjdXRlX2NvbW1hbmQpOiAgV2FybiBhcyBsYW5ndWFnZSBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkuCgoJKiBwcmludGNtZC5jIChwdHlwZV9jb21tYW5kKTogIFBhcnNlIHR5cGVzIHVzaW5nIHRoZSBsYW5ndWFnZQoJcGFyc2VyLCBib3RoIGZvciBsYW5ndWFnZS1pbmRlcGVuZGVuY2UsIGFuZCBzbyB0aGF0IHNjb3BlcyBjYW4KCWJlIHNwZWNpZmllZC4KCgkqIGxhbmd1YWdlLmgsIGxhbmd1YWdlLmM6ICBOZXcgZmlsZXMgZm9yIGxhbmd1YWdlLXNwZWNpZmljIG1hY3JvcywKCWRlY2xhcmF0aW9ucywgYW5kIGRlZmluaXRpb25zLgoKCU1pc2MgZml4ZXM6CgoJKiBtYWluLmMgKG1haW4pOiAgSWYgZXJyb3IoKSBpcyBjYWxsZWQgZHVyaW5nIGVhcmx5Cglpbml0aWFsaXphdGlvbiwgcHJpbnQgaXRzIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdCgxKSBmcm9tIEdEQi4KCgkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSk6ICBBdm9pZCBwcmludGluZyBnYXJiYWdlIGZvciBpbnRzCglvZiB1bnVzdWFsIHNpemVzLgoJKF9pbml0aWFsaXplX3ZhbHByaW50KTogIFdhcm4gYWJvdXQgaG9zdC90YXJnZXQgc2l6ZSBhc3N1bXB0aW9uOwoJaW1wcm92ZSBsb25nIGxvbmcgc3VwcG9ydCBzbGlnaHRseS4JCgkKCSogY29udmV4LXRkZXAuYyAoY29tbV9yZWdpc3RlcnNfaW5mbyk6ICBBdm9pZCBwYXJzaW5nIGRlY2ltYWwgYW5kCgloZXggLS0gbGV0IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgZG8gaXQuCgoJKiBkb2MvZ2RiaW50LnRleGluZm8gKExhbmd1YWdlcyk6ICBEb2MgaG93IHRvIGFkZCBhIGxhbmd1YWdlLgoKCSogTWFrZWZpbGUuaW46ICBDb3BlIHdpdGggbmV3IGZpbGVzIGFuZCByZW1vdmVkIGZpbGVzLgoKVHVlIFNlcCAxNyAwODozNzo0MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJQWRkIEFuZHJldyBCZWVycycgY2hhbmdlcyBmb3IgTW9kdWxhLTIgc3VwcG9ydC4gIEhpcyBDaGFuZ2VMb2cKCWVudHJpZXMgYXJlIGVuY2xvc2VkIGhlcmVpbi4gIE5vdCBhbGwgb2YgdGhlc2UgY2hhbmdlcwoJaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIHRoZSBtYXN0ZXIgR0RCIHNvdXJjZXMgLS0gY2hlY2sgdGhlCglDaGFuZ2VMb2cgYWJvdmUgaGVyZSBmb3IgdGhlIG1lcmdlIGxvZy4KCk1vbiBKdW4gIDMgMTc6MDU6NDUgRURUIDE5OTEKCiAgICAgbTItZXhwLnkgICAgICAgQ3JlYXRlZC4gIFRlc3RlZCBvdXRzaWRlIG9mIEdEQiBmb3IgYSBmZXcgZGF5cy4gIFByb3BlcgogICAgICAgICAgICAgICAgICAgIG9wZXJhdG9ycyB3ZXJlIGFkZGVkLCBDIHNwZWNpZmljIG9wZXJhdG9ycyBhbmQgdG9rZW5zCiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC4gIHl5bGV4KCkgcmV2YW1wZWQgdG8gc29tZSBleHRlbnQuICBTdGlsbCB0aGluZ3MKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nIGZyb20gdGhlIGdyYW1tYXIsIHN1Y2ggYXMgc2V0cy4KICAgICAgICAgICAgICAgICAgICBUZXN0ZWQgZm9yIHR3byB3ZWVrcyBpbiBHREIgdjMuNS4KClR1ZSBKdW4gMTEgMTc6MjM6NDggRURUIDE5OTEKCiAgICAgbTItZXhwLnkgICAgICAgQWRkZWQgYm9vbGVhbiBjb25zdGFudHMgVFJVRSBhbmQgRkFMU0UgdG8gdGhlIGdyYW1tYXIKICAgICAgICAgICAgICAgICAgICBzbyB0aGV5IGFyZSBidWlsdC1pbi4gIFNvcnQgb2YgYSBoYWNrLgoKRnJpIEp1biAxNCAxMjo1Mzo1MSBFRFQgMTk5MQoKICAgICBtMi1leHAueSAgICAgICBBZGRlZCByYW5nZSBjaGVja2luZyBmb3IgbnVtZXJpYyBjb25zdGFudHMuICBBbnkgbnVtZXJpYwogICAgICAgICAgICAgICAgICAgIGNvbnN0YW50IGlzIGFzc3VtZWQgdG8gYmUgb2YgYnVpbHRpbiB0eXBlIElOVEVHRVIgdW5sZXNzOgogICAgICAgICAgICAgICAgICAgICgxKSBpdCBpcyBvY3RhbCBvciBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhCiAgICAgICAgICAgICAgICAgICAgQ0FSRElOQUw7ICgyKSBpdCBpcyB0b28gYmlnIHRvIGZpdCBpbnRvIGFuIElOVEVHRVIsIGluCiAgICAgICAgICAgICAgICAgICAgd2hpY2ggY2FzZSBpdCBpcyBhIENBUkRJTkFMLgogICAgIGV2YWwuYyAgICAgICAgIEFkZGVkIHNpbXBsZSByYW5nZSBjaGVja2luZyBmb3IgKywgLSwgYW5kICogb24gaW50ZWdlcnMuCiAgICAgICAgICAgICAgICAgICAgRG9lc24ndCB3b3JrIHZlcnkgd2VsbCBmb3IgKiwgc2luY2UgNiAqIDEsMDAwLDAwMCwwMDAgPQogICAgICAgICAgICAgICAgICAgIDEsNzA1LDAzMiw3MDQsIHdoaWNoIGZhaWxzIHRoZSBzaW1wbGUgdGVzdCBvZiByZXN1bHQgPj0KICAgICAgICAgICAgICAgICAgICBmaXJzdF9vcGVyYW5kLCBubyBtYXR0ZXIgaW4gd2hhdCBvcmRlciB0aGUgb3BlcmFuZHMgYXJlLgoKVHVlIEp1biAxOCAxNDoxMTozMCBFRFQgMTk5MQoKICAgICBCcm9rZSB0aGUgcGFyc2VyIGludG8gcGFydHMsIG9uZSBjb250YWluaW5nIHRoZSBDIGdyYW1tYXIgYW5kIHRoZSBvdGhlcgogICAgIGNvbnRhaW5pbmcgY29kZSB0byBiZSBzaGFyZWQgYnkgYWxsIG9mIHRoZSBncmFtbWFycy4KCiAgICAgVGhlIGZvbGxvd2luZyBmaWxlcyBubyBsb25nZXIgZXhpc3Q6CgogICAgICAgICAgZXhwcmVhZC55CiAgICAgICAgICBleHByZWFkLnRhYi5jCgogICAgIFRoZSBmb2xsb3dpbmcgZmlsZXMgd2VyZSBhZGRlZDoKCiAgICAgICAgICBjLWV4cC55ICAgICAgICAoVGhlIEMgZ3JhbW1hcikKICAgICAgICAgIG0yLWV4cC55ICAgICAgIChUaGUgTW9kdWxhLTIgZ3JhbW1hcikKICAgICAgICAgIHBhcnNlci1jb2RlLmMgIChDb2RlIHRoYXQgaXMgc2hhcmVkIGJ5IHRoZSBhYm92ZSBncmFtbWFyKQogICAgICAgICAgcGFyc2VyLWNvZGUuaAogICAgICAgICAgcGFyc2VyLWRlZnMuaAoKICAgICBNYWtlZmlsZS5kaXN0ICBDaGFuZ2VkIHRvIHJlZmxlY3QgdGhlIGFib3ZlIGRlcGVuZGVuY2llcy4gIE5PVEU6ICBJdCBpcwogICAgICAgICAgICAgICAgICAgIG5vdyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBCaXNvbiBjb21waWxlciBjb21waWxlciwgc2luY2UgaXQKICAgICAgICAgICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGZ1bmN0aW9uL3ZhcmlhYmxlIHByZWZpeGVzIG90aGVyIHRoYW4geXkuCgpUdWUgSnVuIDE4IDE2OjQ3OjQ5IEVEVCAxOTkxCgogICAgIHN5bXRhYi5bY2hdICAgIEFkZGVkIHRoZSBleHRlcm5hbCB2YXJpYWJsZSB3b3JraW5nX2xhbmcsIHRoYW4gaG9sZHMgdGhlCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgdGhlIGN1cnJlbnQgd29ya2luZyBsYW5ndWFnZS4KICAgICAgICAgICAgICAgICAgICBBZGRlZCB0aGUgZW5udW1lcmF0ZWQgdHlwZSBsYW5ndWFnZV9tb2RlLCB3aXRoIHRoZSB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZV9hdXRvIGFuZCBsYW5ndWFnZV9tYW51YWwsIHRoZSBmb3JtZXIgbWVhbmluZyB0aGF0CiAgICAgICAgICAgICAgICAgICAgR0RCIHNldHMgd29ya2luZ19sYW5nIGFzIG5lZWRlZCwgYW5kIHRoZSBsYXR0ZXIgbWVhbmluZwogICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIHZhbHVlIG9mIHdvcmtpbmdfbGFuZyBpcyB0b3RhbGx5IHVuZGVyIHVzZXIKICAgICAgICAgICAgICAgICAgICBjb250cm9sLgogICAgIHN5bXRhYi5bY2hdICAgIEFkZGVkIHRoZSBNb2R1bGEtMiBwZXJ2YXNpdmUgdHlwZXMgSU5URUdFUiwgQ0FSRElOQUwsCiAgICAgICAgICAgICAgICAgICAgUkVBTCwgQk9PTEVBTiBhbmQgQ0hBUi4gIEFsc28gYWRkZWQgdGhlIHR5cGUgY29kZXMKICAgICAgICAgICAgICAgICAgICBUWVBFX0NPREVfQk9PTCBhbmQgVFlQRV9DT0RFX0NIQVIuCiAgICAgdXRpbHMuYyAgICAgICAgQWRkZWQgc2V0X2xhbmd1YWdlX2NvbW1hbmQgYW5kIHNob3dfbGFuZ3VhZ2VfY29tbWFuZCB0bwogICAgICAgICAgICAgICAgICAgIGltcGxlbWVudCB0aGUgR0RCIHN1cHBvcnQgY29tbWFuZHMgInNldCBsYW5ndWFnZSIgYW5kCiAgICAgICAgICAgICAgICAgICAgInNob3cgbGFuZ3VhZ2UiLgogICAgIGV4cHJlc3Npb24uaCAgIEEgbnVtYmVyIG9mIGlkZW50aWZpZXJzIHdlcmUgYWRkZWQgdG8gdGhlIHR5cGUgZXhwX29wY29kZQogICAgICAgICAgICAgICAgICAgIHRvIGZhY2lsaXRhdGUgTW9kdWxhLTIgYnVpbHRpbiBmdW5jdGlvbnMsIGludGVnZXIKICAgICAgICAgICAgICAgICAgICBkaXZpc2lvbiwgYW5kIGFycmF5IGluZGV4aW5nLgoKV2VkIEp1biAxOSAxMzoyNTo1OCBFRFQgMTk5MQoKICAgICBsYW5ndWFnZS5oICAgICBBZGRlZCB0aGUgbWFjcm8gU1RSSUNUX1RZUEUsIHdoaWNoIGV2YWx1YXRlcyB0byBub24temVybwogICAgICAgICAgICAgICAgICAgIGlmIHRoZSBsYW5ndWFnZSBzcGVjaWZpZWQgYnkgd29ya2luZ19sYW5nIHJlcXVpcmVzIHRoZSB1c2UKICAgICAgICAgICAgICAgICAgICBvZiBzdHJpY3QgdHlwaW5nIG9mIGV4cHJlc3Npb25zLiAgRXZlbnR1YWxseSwgZXZlbiB0aGlzCiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhYmxlIHRvIGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIuCiAgICAgICAgICAgICAgICAgICAgQWRkZWQgdGhlIG1hY3JvIFJBTkdFX0NIRUNLLCB3aGljaCBldmFsdWF0ZXMgdG8gbm9uLXplcm8KICAgICAgICAgICAgICAgICAgICBpZiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWVkIGJ5IHdvcmtpbmdfbGFuZyByZXF1aXJlcyB0aGUKICAgICAgICAgICAgICAgICAgICBjaGVja2luZyBvZiBhIHZhbHVlIGFnYWluc3QgdGhlIGRvbWFpbiBvZiBpdHMgdHlwZS4KICAgICAgICAgICAgICAgICAgICBFdmVudHVhbGx5LCBldmVuIHRoaXMgd2lsbCBiZSBhYmxlIHRvIGJlIGNoYW5nZWQgYnkgdGhlCiAgICAgICAgICAgICAgICAgICAgdXNlci4KICAgICBsYW5ndWFnZS5bY2hdICBQcmVkaWNhdGVzIGludm9sdmluZyB0eXBlcyAoc2ltcGxlX3R5cGUsIG9yZGVyZWRfdHlwZSwKICAgICAgICAgICAgICAgICAgICBzYW1lX3R5cGUsIGludGVncmFsX3R5cGUsIG51bWVyaWNfdHlwZSwgY2hhcmFjdGVyX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl90eXBlLCBmbG9hdF90eXBlKSBhcmUgYWRkZWQuICBUaGVzZSBwcmVkaWNhdGVzIGFyZQogICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHdvcmtpbmdfbGFuZywgYW5kIGFyZSBoYW5keQogICAgICAgICAgICAgICAgICAgIGluIHR5cGUtY2hlY2tpbmcuCgpXZWQgSnVuIDE5IDE1OjM5OjM0IEVEVCAxOTkxCgogICAgIGV2YWwuYyAgICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiB0eXBlX2FycmF5X3Jhbmsgd2hpY2ggY29tcHV0ZXMgdGhlIHJhbmsKICAgICAgICAgICAgICAgICAgICBvZiBhbiBhcnJheSB0eXBlLgogICAgIHZhbGFyaXRoLmMgICAgIEFkZGVkIHRoZSBmdW50aW9uIHZhbHVlX2Jvb2wsIHdoaWNoIHdoZW4gZ2l2ZW4gYSBpbnRlZ2VyCiAgICAgdmFsdWUuaCAgICAgICAgdmFsdWUgKGllLiBzdHJ1Y3QgdmFsdWUgKikgYXMgYW4gYXJndW1lbnQsIGl0IHJldHVybnMgYQogICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUgKGllLiAgc3RydWN0IHZhbHVlICopIHRydWUgaWYgdGhhdCBpbnRlZ2VyCiAgICAgICAgICAgICAgICAgICAgaXMgbm9uLXplcm8sIGFuZCBhIGJvb2xlYW4gdmFsdWUgZmFsc2Ugb3RoZXJ3aXNlLgogICAgIHZhbHByaW50LmMgICAgIEFkZGVkIGNhc2VzIGZvciBUWVBFX0NPREVfQk9PTCwgc28gTW9kdWxhLTIgQk9PTEVBTiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB3aWxsIHByaW50IG91dCBwcm9wZXJseS4KCldlZCBKdW4gMTkgMTY6MzY6MzQgRURUIDE5OTEKCiAgICAgdmFsb3BzLmMgICAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIHZhbHVlX2NhcGl0YWxpemUsIHdoaWNoIHJldHVybnMgaXQKICAgICB2YWx1ZS5oICAgICAgICBhcmd1bWVudCBjYXBpdGFsaXplZCBpZiBpdHMgYXJndW1lbnQgaXMgYSBsb3dlcmNhc2UKICAgICAgICAgICAgICAgICAgICBsZXR0ZXIsIG9yIHRoZSBhcmd1bWVudCB1bmNoYW5nZWQgaWYgaXRzIGFyZ3VtZW50IGlzIG5vdCBhCiAgICAgICAgICAgICAgICAgICAgbGV0dGVyLgogICAgIHZhbGFyaXRoLmMgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiByYW5nZV9jaGVja19wLCB3aGljaCByZXR1cm5zIG5vbi16ZXJvCiAgICAgdmFsdWUuaCAgICAgICAgaWYgaXRzIHZhbHVlIGFyZ3VtZW50IGlzIGJldHdlZW4gdGhlIGludGVncmFsIGJvdW5kcyB1cHBlcgogICAgICAgICAgICAgICAgICAgIGFuZCBsb3dlci4KICAgICAgICAgICAgICAgICAgICBBZGRlZCB0aGUgZnVuY3Rpb24gcmFuZ2VfY2hlY2tfZW51bV9wLCB3aGljaCBtYWtlcyBzdXJlCiAgICAgICAgICAgICAgICAgICAgdGhhdCBpdHMgdmFsdWUgYXJndW1lbnQgaXMgYSB2YWxpZCBtZW1iZXIgb2YgdGhlIGRvbWFpbiBvZgogICAgICAgICAgICAgICAgICAgIGl0cyB0eXBlIGFyZ3VtZW50LgogICAgICAgICAgICAgICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiByYW5nZV9jaGVja19yYW5nZV9wLCB3aGljaCBtYWtlcyBzdXJlCiAgICAgICAgICAgICAgICAgICAgaXRzIHZhbHVlIGFyZ3VtZW50IGxpZXMgYmV0d2VlbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcwogICAgICAgICAgICAgICAgICAgIG9mIGl0cyB0eXBlIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgcmFuZ2VkIHR5cGUuCiAgICAgICAgICAgICAgICAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIGNoZWNrX2FycmF5X2luZGV4LCB3aGljaCByYW5nZSBhbmQgdHlwZQogICAgICAgICAgICAgICAgICAgIGNoZWNrcyBhbiBpbmRleCBvZiBhbiBhcnJheS4KICAgICAgICAgICAgICAgICAgICBBZGRlZCB0aGUgZnVuY3Rpb24gdmFsdWVfbXVsdGlfc3Vic2NyaXB0LCB3aGljaCBjb21wdXRlcwogICAgICAgICAgICAgICAgICAgIGFycmF5W2lkeDEsaWR4Mi4uLmlkeE5dLCBnaXZlbiBhIHZhbHVlIGFycmF5IGFuZCBhbiBhcnJheQogICAgICAgICAgICAgICAgICAgIG9mIHZhbHVlcyByZXByZXNlbnRpbmcgaW5kaWNpZXMuCiAgICAgdmFsdWVzLmMgICAgICAgQ2hhbmdlZCB2YWx1ZV9mcm9tX2xvbmcgdG8gd29yayB3aXRoIFRZUEVfQ09ERV9DSEFSIGFuZAogICAgICAgICAgICAgICAgICAgIHVucGFja19sb25nIHRvIHdvcmsgd2l0aCBUWVBFX0NPREVfQk9PTCBhbmQKICAgICAgICAgICAgICAgICAgICBUWVBFX0NPREVfQ0hBUi4KCldlZCBKdW4gMTkgMTg6MDQ6MDggRURUIDE5OTEKCiAgICAgc3ltdGFiLmMgICAgICAgU3RvcmVkIHBlcnZhc2l2ZSB0eXBlcyBpbiBhIHN0cnVjdHVyZSBhbmQgbWFrZQogICAgICAgICAgICAgICAgICAgIGxvb2t1cF9wZXJ2YXNpdmVfdHlwZSgpIGEgbG9va3VwIGZ1bmN0aW9uIHRoYXQgd2FzIGJhc2VkCiAgICAgICAgICAgICAgICAgICAgb24gd29ya2luZ19sYW5nLiAgSWYgbG9va3VwX3BlcnZhc2l2ZV90eXBlKCkgcmV0dXJuZWQKICAgICAgICAgICAgICAgICAgICBub24temVybywgdGhlbiB0aGF0IHZhbHVlIHdhcyByZXR1cm5lZCAoYSBmaXgsIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGl0IHNpbXBseSB3b3VsZG4ndCByZXR1cm4gdGhlIHBlcnZhc2l2ZSB0eXBlLikKICAgICBsYW5ndWFnZS5oICAgICBBZGRlZCB0aGUgbWFjcm8gQ0FTVF9JU19DT05WRVJTSU9OLCB3aGljaCBldmFsdWF0ZXMgdG8KICAgICAgICAgICAgICAgICAgICBub24temVybyBpZiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWVkIGJ5IHdvcmtpbmdfbGFuZyBtZWFucwogICAgICAgICAgICAgICAgICAgICJjb252ZXJzaW9uIiB3aGVuIGl0IHNheXMgImNhc3QiLgogICAgIHZhbG9wcy5jICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiB2YWx1ZV9yZWFsX2Nhc3QoKSwgd2hpY2ggcGVyZm9ybXMgYQogICAgIHZhbHVlLmggICAgICAgICpjYXN0Kiwgbm90IGEgKmNvbnZlcnNpb24qLCB3aGljaCBpcyB3aGF0IHZhbHVlX2Nhc3QoKQogICAgICAgICAgICAgICAgICAgIGRvZXMgd2hlbiBpdCBjYW4uICBJbiBwYXJ0aWN1bGFyLAogICAgICAgICAgICAgICAgICAgIHZhbHVlX2Nhc3QoPGZsb2F0X3R5cGU+LDQpID0gNC4wLCB3aGlsZQogICAgICAgICAgICAgICAgICAgIHZhbHVlX3JlYWxfY2FzdCg8ZmxvYXRfdHlwZT4sNCkgPSBzb21lIG1lc3MuCiAgICAgZXZhbC5jICAgICAgICAgTW9kdWxhLTIgYnVpbHRpbiBmdW5jdGlvbnMgaW1wbGVtZW50ZWQ6ICBBQlMsIENBUCwgQ0hSLAogICAgIHBhcnNlci1jb2RlLmMgIEZMT0FULCBISUdILCBNQVgsIE1JTiwgT0RELCBPUkQsIFRSVU5DLCBhbmQgVkFMLiAgCiAgICAgZXhwcmVzc2lvbi5oICAgQWRkZWQgbWFjcm9zIE1BWF9PRl9UWVBFIGFuZCBNSU5fT0ZfVFlQRSB0byB3b3JrIHdpdGggTUFYCiAgICAgICAgICAgICAgICAgICAgYW5kIE1JTiBvbiBpbnRlZ3JhbCB0eXBlcy4gICpOT1RFKjogVGhlc2UgYXJlIGN1cnJlbnRseQogICAgICAgICAgICAgICAgICAgIGhhcmRjb2RlZCB0byB3b3JrIG9ubHkgaWYgdGhlcmUgYXJlIDggYml0cyBwZXIgc3RvcmFnZQogICAgICAgICAgICAgICAgICAgIHVuaXQuICBGSVhNRS4KICAgICBldmFsLmMgICAgICAgICBNYWRlIGxvZ2ljYWwgZnVuY3Rpb25zIGNhbGwgdmFsdWVfYm9vbCB0byByZXR1cm4gYQogICAgICAgICAgICAgICAgICAgIHByb3Blcmx5IHR5cGVkIGJvb2xlYW4gdmFsdWUsIGJhc2VkIG9uIHdvcmtpbmdfbGFuZy4KClRodSBKdW4gMjAgMTE6NTU6MjcgRURUIDE5OTEKCiAgICAgdmFscHJpbnQuYyAgICAgVHlwZXMgbm93IHByaW50IG91dCBpbiBhIE1vZHVsYS0yIGZhc2hpb24uICBUaGlzIHdvcmtzIGZvcgogICAgICAgICAgICAgICAgICAgIHRoZSBjYXNlcyB3aGVuIHRoZSB0eXBlIGlzIHByaW50ZWQgb3V0IHN0ZXAtYnktc3RlcCwgdGhhdAogICAgICAgICAgICAgICAgICAgIGlzLCBpdCBkb2Vzbid0IHdvcmsgd2hlbiB0aGUgbmFtZSBvZiBhIHN0cnVjdHVyZWQgdHlwZQogICAgICAgICAgICAgICAgICAgICh3aGljaCBpbmNsdWRlcyB0aGUga2V5d29yZCAic3RydWN0IiwgZXRjLikgIGlzIHNpbXBseQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZC4KICAgICAgICAgICAgICAgICAgICBGSVhNRTogIFBlcmhhcHMgdGhpcyBpcyBiYWQuICBQYXJ0cyBvZiBpdCBzZWVtIHRvIGtsdWRnZXksCiAgICAgICAgICAgICAgICAgICAgc2luY2UgdHlwZSBzcGVjaWZpY2F0aW9ucyBpbiBDIGFuZCBNb2R1bGEtMiBhcmUgdmVyeQogICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudC4gIFRoZSBDIHByaW50aW5nIG9mIGEgdHlwZSBpcyB2ZXJ5IHJlY3Vyc2l2ZSwKICAgICAgICAgICAgICAgICAgICB3aGVyZWFzIGluIE1vZHVsYS0yIGl0IGlzIGdlbmVyYWxseSB2ZXJ5IHNpbXBsZS4gIEMgaGFzCiAgICAgICAgICAgICAgICAgICAgdHlwZSBwcmVmaXhlcyBhbmQgc3VmZml4ZXMsIHdoaWNoIGhhdmUgbm8gcmVhbCBhbmFsb2d1ZSBpbgogICAgICAgICAgICAgICAgICAgIE1vZHVsYS0yLiAgTWF5YmUgdHlwZV9wcmludCgpIHNob3VsZCBjYWxsIGEgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyB0eXBlIHByaW50ZXIuICBUaGlzIGlzIGFsc28gYWR2YW50YWdlb3VzIGlmIHdlCiAgICAgICAgICAgICAgICAgICAgY29tcGlsZSBHREIgdG8gZXhjbHVkZSBzb21lIG9mIHRoZSBsYW5ndWFnZXMuICBXZSdsbCBqdXN0CiAgICAgICAgICAgICAgICAgICAgbGVhdmUgdGhvc2UgZnVuY3Rpb25zIG91dC4KClRodSBKdW4gMjAgMTY6NTc6MTAgRURUIDE5OTEKCiAgICAgZGJ4cmVhZC5jICAgICAgV2hlbiByZWFkaW5nIHRoZSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgaW4gKHZpYQogICAgICAgICAgICAgICAgICAgIHBzeW10YWJfdG9fc3ltdGFiKCkpLCB0aGUgbnVtYmVyIGFuZCB0eXBlcyBvZiBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgYWRkZWQgdG8gYSBmdW5jdGlvbiB0eXBlLiAgZGVmaW5lX3N5bWJvbCgpCiAgICAgICAgICAgICAgICAgICAgY2FsbHMgYWRkX3BhcmFtX3RvX3R5cGUoKSB0byBhY2NvbXBsaXNoIHRoaXMuCiAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbjogIHdoZW4gd2UgY29tZSBhY3Jvc3MgYSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgICAgICAgICAgICAgICAgICAgKE5fRlVOIHN5bWJvbCB3aXRoIGFuICdmJyBvciAnRicgaW4gdGhlIG5hbWUpLCBpdHMKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgd2lsbCBhcHBlYXIgYmVmb3JlIGFub3RoZXIgZnVuY3Rpb24gZGVmaW5pdGlvbi4KICAgICAgICAgICAgICAgICAgICBXaGVuIGEgZnVuY3Rpb24gaXMgZm91bmQsIGEgcG9pbnRlciB0byBpdHMgdHlwZSBpcyBwbGFjZWQKICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZ2xvYmFsIGluX2Z1bmN0aW9uX3R5cGUuICBDaGFuZ2VzIHRoYXQKICAgICAgICAgICAgICAgICAgICBhZGRfcGFyYW1fdG9fdHlwZSgpIG1ha2VzIGFyZSB0byB0aGlzIGdsb2JhbC4KICAgICB2YWxwcmludC5jICAgICBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIG5vdyBpbmNsdWRlcyAoZm9yIE1vZHVsYS0yKSB0aGUKICAgICAgICAgICAgICAgICAgICB0eXBlcyBvZiBpdHMgcGFyYW1ldGVycy4KICAgICBldmFsLmMgICAgICAgICBUeXBlIGNoZWNraW5nIGFuZCBhIGNoZWNrIGZvciB0aGUgcHJvcGVyIG51bWJlciBvZgogICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBpcyBub3cgZG9uZSBmb3IgZnVuY3Rpb24gY2FsbHMuICBOb3Qgc3VyZSBvZiB0aGUKICAgICAgICAgICAgICAgICAgICBpbXBhY3QgdGhpcyBoYXMgb24gQysrIG1lbWJlciBmdW5jdGlvbiB5ZXQuCgpUaHUgSnVuIDIwIDE5OjU4OjQ4IEVEVCAxOTkxCgogICAgIHZhbHByaW50LmMgICAgIFJld3JvdGUgdGhlIHR5cGUgcHJpbnRlci4gIEJyb2tlIGl0IGludG8gdHdvIGxhbmd1YWdlCiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgcGFydHMsIGFkZGluZyB0aGUgZnVuY3Rpb25zIHR5cGVfcHJpbnRfbTIoKSBhbmQKICAgICAgICAgICAgICAgICAgICB0eXBlX3ByaW50X20yXzEoKS4KICAgICAgICAgICAgICAgICAgICBBbiB1bmZvcnR1bmF0ZSBjb25zZXF1ZW5jZSBpcyB0aGlzOiAgaWYgeW91IGRlYnVnZ2luZyBhIEMKICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGluIE1vZHVsYS0yIG1vZGUgKHdoeT8pLCBpbmZvIHR5cGVzIGRvZXMgbm90IHdvcmsKICAgICAgICAgICAgICAgICAgICB3ZWxsIHdpdGggcmVndWxhciBleHByZXNzaW9ucywgc2luY2UgdGhlIHR5cGVzIGFyZSBwcmludGVkCiAgICAgICAgICAgICAgICAgICAgb3V0IGluIE1vZHVsYS0yIHRlcm1pbm9sb2d5LCBidXQgc3RvcmVkIGluIEMgdGVybWlub2xvZ3kuCiAgICAgbGFuZ3VhZ2UuW2NoXSAgQWRkZWQgdGhlIGZ1bmN0aW9ucyBuZXdfdHlwZV9sYXN0KCksIHR5cGVfa2V5d29yZCgpLCBhbmQKICAgICAgICAgICAgICAgICAgICB0eXBlX3NlcCgpIHRvIGFpZCBpbiB0aGUgcHJpbnRpbmcgb2YgdHlwZWRlZnMuCiAgICAgc3ltdGFiLmMgICAgICAgTWFkZSB0aGUgcHJpbnRpbmcgb2YgdHlwZWRlZnMgYXMgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgYXMKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSB0aHJvdWdoIGNhbGxzIHRvIG5ld190eXBlX2xhc3QoKSwgdHlwZV9rZXl3b3JkKCksCiAgICAgICAgICAgICAgICAgICAgYW5kIHR5cGVfc2VwKCkuCgpGcmkgSnVuIDIxIDExOjUwOjI2IEVEVCAxOTkxCgogICAgIGRieHJlYWQuYyAgICAgIENoZWNrIGFsbCBpbmNvbWluZyBlbm51bWVyYXRlZCB0eXBlcy4gIElmIGl0IGxvb2tzIGxpa2UKICAgICAgICAgICAgICAgICAgICBNb2R1bGEtMidzIEJPT0xFQU4gdHlwZSwgdGhlbiBjaGFuZ2UgdGhlIHR5cGVfY29kZSBvZiB0aGUKICAgICAgICAgICAgICAgICAgICB0eXBlIHRvIFRZUEVfQ09ERV9CT09MIHNvIHdlIGNhbiBwcm9jZXNzIGl0IGFzIGEgYm9vbGVhbgogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgogICAgIHZhbHByaW50LmMgICAgIFJlcGxhY2VkIHNvbWUgb2YgdGhlIDB4JXggd2l0aCBjYWxscyB0byBzcHJpbnRmIGFuZAogICAgICAgICAgICAgICAgICAgIGhleGZvcm1hdCgpIGluIHZhbF9wcmludCgpLgogICAgIGxhbmd1YWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbiBoZXhfdG9fc3RyaW5nKCksIHdoaWNoIGNvbnZlcnRzIGl0cwogICAgICAgICAgICAgICAgICAgIGludGVncmFsIGFyZ3VtZW50IHRvIGEgaGV4YWRlY2ltYWwgbnVtYmVyIChmb3JtYXQgaXMKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSBiYXNlZCkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhIHN0cmluZy4KCk1vbiBKdW4gMjQgMTI6MjU6MDcgRURUIDE5OTEKCiAgICAgdmFscHJpbnQuYyAgICAgU29tZSBmdW5jdGlvbnMgY2FsbCB0eXBlX3ByaW50XzEoKSBkaXJlY3RseSwgaW5zdGVhZCBvZgogICAgIHZhbHVlLmggICAgICAgIHVzaW5nIHR5cGVfcHJpbnQoKSwgc28gdGhleSBjYW4gc3BlY2lmeSB3aGVyZSAoY29sdW1uKSB0bwogICAgICAgICAgICAgICAgICAgIHByaW50IHRoaW5ncy4gIFNpbmNlIHR5cGVfcHJpbnQoKSB0YWtlcyBjYXJlIG9mIGxhbmd1YWdlCiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jZSwgdGhhdCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QuICBBZGRlZCBhCiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGRlcHRoIHRvIHR5cGVfcHJpbnQoKSAoc28gaXQgaXMgbm93IGxpa2UKICAgICAgICAgICAgICAgICAgICB0eXBlX3ByaW50XzEpLiAgQ2hhbmdlZCB0eXBlX3ByaW50IHRvIHR5cGVfcHJpbnRfYXQsIGFuZAogICAgICAgICAgICAgICAgICAgIG1hZGUgdHlwZV9wcmludCBhIG1hY3JvIHRoYXQgcGFzc2VzIGEgZGVwdGggYXJndW1lbnQgb2YKICAgICAgICAgICAgICAgICAgICB6ZXJvLgogICAgIHN5bW1pc2MuYyAgICAgIENoYW5nZWQgYWxsIGNhbGxzIHRvIHR5cGVfcHJpbnRfMSB0byBjYWxscyB0bwogICAgICAgICAgICAgICAgICAgIHR5cGVfcHJpbnRfYXQuCiAgICAgTWFrZWZpbGUuZGlzdCAgTWFkZSBpdCBwb3NzaWJsZSB0byBidWlsZCBHREIgZm9yIGEgc3BlY2lmaWMgc2V0IG9mCiAgICAgZGVwZW5kICAgICAgICAgbGFuZ3VhZ2VzLiAgRG8gdGhpcyBieSBwYXNzaW5nIGEgZGVmaW5pdGlvbiBmb3IgdGhlIG1hY3JvCiAgICAgICAgICAgICAgICAgICAgTEFOR1MgdG8gbWFrZS4gIExBTkdTIHNob3VsZCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEKICAgICAgICAgICAgICAgICAgICBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsYW5ndWFnZSBuYW1lcyAoaWUuIExBTkdTPSJjIG0yIikuCiAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gYnVpbGQgYWxsIGxhbmd1YWdlcy4gIE5vdGUgdGhhdCBncmFtbWFyCiAgICAgICAgICAgICAgICAgICAgZmlsZXMgbXVzdCBmb2xsb3cgdGhlIG5hbWluZyBjb252ZW50aW9uIG9mIDxsYW5nPi1leHAueS4KICAgICBnZGIubGFuZyAgICAgICBUaGlzIGhvbGRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBMQU5HUyBtYWNyby4gIEl0IGlzCiAgICAgICAgICAgICAgICAgICAgZXhhbWluZWQgZXZlcnkgdGltZSBtYWtlIGlzIGNhbGxlZCwgYW5kIGlzIHVwZGF0ZWQgaWYKICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkuCiAgICAgZXZhbC5jICAgICAgICAgQWRkZWQgI2lmZGVmIF9MQU5HXzxsYW5nPiB0byB0aGVzZSBmaWxlcy4KICAgICBleHByZWFkLmMgICAgICBTdGlsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIGRieHJlYWQuYyBhbmQgY29mZnJlYWQuYy4KICAgICBtYWluLmMKICAgICBzb3VyY2UuYwogICAgIHN5bXRhYi5jCiAgICAgdXRpbHMuYwogICAgIHZhbGFyaXRoLmMKICAgICB2YWxwcmludC5jCgpNb24gSnVuIDI0IDE2OjMzOjExIEVEVCAxOTkxCgogICAgIGxhbmd1YWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbnMgaGV4Zm9ybWF0X3ByZSgpIGFuZAogICAgICAgICAgICAgICAgICAgIGhleF90b19zdHJpbmdfcHJlKCksIHdoaWNoIHRha2UgYSBwcmVmaXggYXJndW1lbnQgdG8KICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgVGh1cywgaGV4Zm9ybWF0X3ByZSgiMDgiKSB3aWxsCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIweDA4eCIgKGlmIHRoZSB3b3JraW5nIGxhbmd1YWdlIGlzIGxhbmd1YWdlX2MpLiAKICAgICAgICAgICAgICAgICAgICBNYWRlIGhleGZvcm1hdCgpIGFuZCBoZXhfdG9fc3RyaW5nKCkgY2FsbHMgdG8gdGhlIGFib3ZlCiAgICAgICAgICAgICAgICAgICAgd2l0aCAiIiBhcyB0aGUgcHJlZml4IGFyZ3VtZW50LgoKICAgICBhbTI5ay1waW5zbi5jLCBhcm0tcGluc24uYywgYnJlYWtwb2ludC5jLCBjb252ZXgtdGRlcC5jLCBleGVjLmMsIGNvcmUuYywKICAgICBkYnhyZWFkLmMsIGkzODYtcGluc24uYywgaTM4Ni1zdHViLmMsIGkzODYteGRlcC5jLCBpOTYwLXBpbnNuLmMsCiAgICAgaW5mY21kLmMsIGluZmxvdy5jLCBtNjhrLXBpbnNuLmMsIG02OGstc3R1Yi5jLCBtODhrLXBpbnNuLmMsCiAgICAgbWlwcy1waW5zbi5jLCBtaXBzLXRkZXAuYywgbnMzMmstcGluc24uYywgcHJpbnRjbWQuYywgcHlyLXBpbnNuLmMsCiAgICAgcHlyLXRkZXAuYywgcHlyLXhkZXAuYywgcmVtb3RlLXZ4LmMsIHJlbW90ZS5jLCBzb2xpYi5jLCBzb3VyY2UuYywKICAgICBzdGFjay5jLCBzdW4zODYteGRlcC5jLCBzeW1maWxlLmMsIHN5bW0teGRlcC5jLCBzeW1taXNjLmMsIHRhaG9lLXBpbnNuLmMsCiAgICAgdmFscHJpbnQuYywgdmF4LXBpbnNuLmMKCiAgICAgICAgICBDaGFuZ2VkIGFsbCBvY2N1cmVuY2VzIG9mIDB4JVswLTldKmwqeCBpbiBwcmludGYgZm9ybWF0IHN0cmluZ3MgdG8KICAgICAgICAgIGNhbGxzIHRvIGhleGZvcm1hdCgpIGFuZCBoZXhfdG9fc3RyaW5nKCkuICBGb3JtYXQgc3RyaW5ncyB3aXRob3V0CiAgICAgICAgICB0aGUgbGVhZGluZyAiMHgiIHdlcmUgaWdub3JlZC4KCiAgICAgZGVwZW5kICAgICAgICAgVXBkYXRlZCB0byB0YWtlIHRoZSBhYm92ZSBpbnRvIGFjY291bnQuCgoKVHVlIEp1biAyNSAxNToyNzoxOCBFRFQgMTk5MQoKICAgICBzeW10YWIuaCAgICAgICBBZGRlZCB0aGUgdHlwZXMgcmFuZ2VfbW9kZV90LCByYW5nZV9jaGVja190LCB0eXBlX21vZGVfdCwKICAgICAgICAgICAgICAgICAgICBhbmQgdHlwZV9jaGVja190IHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YKICAgICAgICAgICAgICAgICAgICByYW5nZSBhbmQgdHlwZSBjaGVja2luZy4KICAgICBtYWluLmMgICAgICAgICBBZGRlZCB0aGUgdmFyaWFibGVzIHJhbmdlX21vZGUsIHJhbmdlX2NoZWNrLCB0eXBlX21vZGUsCiAgICAgICAgICAgICAgICAgICAgYW5kIHR5cGVfY2hlY2sgdG8gcmVjb3JkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHJhbmdlIGFuZAogICAgICAgICAgICAgICAgICAgIHR5cGUgY2hlY2tpbmcuICBBZGRlZCBpbml0aWFsaXphdGlvbiBjb2RlIHRvIG1haW4oKS4KICAgICBsYW5ndWFnZS5oICAgICBDaGFuZ2VkIHRoZSBtYWNyb3MgU1RSSUNUX1RZUEUgYW5kIFJBTkdFX0NIRUNLIHRvIGV4YW1pbmUKICAgICAgICAgICAgICAgICAgICB0aGUgYWJvdmUgdmFyaWFibGVzLgoKClR1ZSBKdW4gMjUgMTc6NTc6MDggRURUIDE5OTEKCiAgICAgZGJ4cmVhZC5jICAgICAgcHJvY2Vzc19vbmVfc3ltYm9sKCkgdXBkYXRlcyB0aGUgdmFyaWFibGUgKGVudW0gbGFuZ3VhZ2UpCiAgICAgICAgICAgICAgICAgICAgc291cmNlX2xhbmcgYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICBjb250YWluZWQgaW4gdGhlIE5fU08gc3libW9sIHRoYXQgc3RhcnRlZCB0aGlzIHN5bXRhYi4KICAgICAgICAgICAgICAgICAgICBXaGVuIGVuZF9zeW10YWIoKSBpcyBjYWxsZWQsIHRoZSB2YWx1ZSBvZiBzb3VyY2VfbGFuZyBpcwogICAgICAgICAgICAgICAgICAgIHB1dCBpbnRvIHRoZSBsYW5ndWFnZSBmaWVsZC4KICAgICBzdGFjay5jICAgICAgICBzZWxlY3RfZnJhbWUoKSBzZXRzIHdvcmtpbmdfbGFuZyAoYW5kIHBvc3NpYmx5IHR5cGVfY2hlY2sKICAgICAgICAgICAgICAgICAgICBhbmQgcmFuZ2VfY2hlY2spIHRvIHRoZSBsYW5ndWFnZSBmaWVsZCBvZiB0aGUgc3ltdGFiCiAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBmcmFtZSB0aGF0IGlzIHNlbGVjdGVkIGlmIHdvcmtpbmdfbW9kZQogICAgICAgICAgICAgICAgICAgIGlzIGxhbmd1YWdlX2F1dG8uICBJZiB3b3JraW5nX21vZGUgaXMgbGFuZ3VhZ2VfbWFudWFsLCBhCiAgICAgICAgICAgICAgICAgICAgd2FybmluZyBpcyBwcmludGVkIGFuZCB3b3JraW5nX2xhbmcgaXMgbm90IHNldC4KICAgICBsYW5ndWFnZS5jICAgICBBZGRlZCB0aGUgZnVuY3Rpb24gc2V0X3R5cGVfcmFuZ2UoKSwgd2hpY2ggc2V0cyB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrIGFuZCByYW5nZV9jaGVjayAoaWYgdGhlaXIgbW9kZXMgY2FsbCBmb3IKICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgc2V0dGluZykgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YKICAgICAgICAgICAgICAgICAgICB3b3JraW5nX2xhbmcuICBBIG5vbi16ZXJvIGFyZ3VtZW50IHdpbGwgY2F1c2UgdGhlIGN1cnJlbnQKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyB0byBiZSBvdXRwdXQuCgoKV2VkIEp1biAyNiAxNDo1MTo0MCBFRFQgMTk5MQoKICAgICBldmFsLmMgICAgICAgICBBZGRlZCByYW5nZSBjaGVja3Mgb24gYXNzaWdubWVudC4KICAgICBtMi1leHAueSAgICAgICBBZGRlZCB0aGUgZ3JhbW1hciBmb3Igc2V0cyB0byB0aGUgbGFuZ3VhZ2UuICBDdXJyZW50bHksCiAgICAgICAgICAgICAgICAgICAgdGhlc2UgZG8gbm90IGRvIGFueXRoaW5nIGV4Y2VwdCBwcmludCBhbiBlcnJvciBtZXNzYWdlLgoKV2VkIEp1biAyNiAxNzowMTowNCBFRFQgMTk5MQoKICAgICBtMi1leHAueSAgICAgICBBZGRlZCB0aGUgYWJpbGl0eSBmb3IgcGFyc2VfbnVtYmVyKCkgdG8gcGFyc2UgbmVnYXRpdmUKICAgICAgICAgICAgICAgICAgICBudW1iZXJzLiAgQSBnbG9iYWwgZmxhZyBpcyBzZXQgdXBvbiBlbmNvdW50ZXJpbmcgYSB1bmFyeQogICAgICAgICAgICAgICAgICAgIG1pbnVzLiAgVGhpcyB3YXMgZG9uZSB0byBtYWtlLCBmb3IgZXhhbXBsZSwgMSBwYXJzZSBhcyBhCiAgICAgICAgICAgICAgICAgICAgQ0FSRElOQUwsIGFuZCBub3QgYXMgYW4gaW50ZWdlciwgcGVyIFdpcnRoJ3MgZXhhbXBsZXMgaW4KICAgICAgICAgICAgICAgICAgICBQcm9ncmFtbWluZyBpbiBNb2R1bGEtMiBlZC40LgogICAgIHZhbHByaW50LmMgICAgIEFkZGVkIHN1cHBvcnQgZm9yICJzZXQgcmFkaXggMiIgYnkgdGhlbiBzZXR0aW5nCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdCB0byAndCcuCiAgICAgZXZhbC5jICAgICAgICAgSW1wbGVtZW50ZWQgcmFuZ2UgY2hlY2tpbmcgb24gc3VicmFuZ2UgdHlwZXMuICBBZGRlZCBjYWxscwogICAgICAgICAgICAgICAgICAgIHRvIHJhbmdlX2NoZWNrX3JhbmdlX3AgZm9yIEJJTk9QX0FTU0lHTiBhbmQgQklOT1BfVkFMLgogICAgICAgICAgICAgICAgICAgIEltcGxlbWVudGVkIE1JTiBhbmQgTUFYIGZvciBlbm51bWVyYXRlZCB0eXBlcy4gIFRoZQogICAgICAgICAgICAgICAgICAgIG1pbmltdW0gdmFsdWUgb2YgYW4gZW5udW1lcmF0ZWQgdHlwZSBpcyBkZWZpbmVkIGJ5IFdpcnRoCiAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZpcnN0IGlkZW50aWZpZXIsIGFuZCB0aGUgbWF4aW11bSBhcyB0aGUgbGFzdC4KICAgICBtMi1leHAueSAgICAgICBNYWRlIG9jdGFsIG51bWJlcnMgZW5kaW5nIHdpdGggIkIiIGJlIGNoYXJhY3RlcnMgYW5kIHRob3NlCiAgICAgICAgICAgICAgICAgICAgZW5kaW5nIHdpdGggIkMiIGJlIG51bWJlcnMsIHBlciBXaXJ0aCdzIGJvb2suIChwLiAzNCkKICAgICAgICAgIApUaHUgSnVuIDI3IDE0OjExOjUyIEVEVCAxOTkxCgogICAgIHN0YWNrLmMgICAgICAgIHNlbGVjdF9mcmFtZSgpIG5vdyBvbmx5IHNldHMgd29ya2luZ19sYW5nLCBpdCBkb2VzIG5vdAogICAgICAgICAgICAgICAgICAgIG5vdGlmeSB0aGUgdXNlci4gIElmIHdvcmtpbmdfbW9kZSBpcyBsYW5ndWFnZV9tYW51YWwsIHRoZW4KICAgICAgICAgICAgICAgICAgICBhIHdhcm5pbmcgaXMgaXNzdWVkIG9uY2UuCiAgICAgbWFpbi5jICAgICAgICAgQXQgdGhlIGVuZCBvZiBlYWNoIGNhbGwgdG8gZXhlY3V0ZV9jb21tYW5kKCksIHdvcmtpbmdfbGFuZwogICAgICAgICAgICAgICAgICAgIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgbG9jYWwgc3RhdGljIChlbnVtIGxhbmd1YWdlKQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuICBJZiB0aGV5IGRpZmZlciBhbmQgd29ya2luZ19tb2RlIGlzCiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VfYXV0bywgdGhlIG5ldyBzZXR0aW5ncyBvZiBsYW5ndWFnZSwgdHlwZSBhbmQKICAgICAgICAgICAgICAgICAgICByYW5nZSBjaGVja2luZyBhcmUgcHJpbnRlZCBvdXQuCiAgICAgc3RhY2suYyAgICAgICAgTW9kaWZpZWQgZnJhbWVfaW5mbygpIHRvIGluY2x1ZGUgdGhlIGxhbmd1YWdlIG9mIHRoZQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZnJhbWUgaW4gdGhlIG91dHB1dCBvZiAiaW5mbyBmcmFtZSIuCiAgICAgbGFuZ3VhZ2UuW2NoXSAgQWRkZWQgdGhlIGZ1bmN0aW9uIGxhbmd1YWdlX3N0cigpIHdoaWNoIHJldHVybnMgdGhlIG5hbWUKICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBsYW5ndWFnZS4KCkZyaSBKdW4gMjggMTU6MzM6MTQgRURUIDE5OTEKCiAgICAgbTItZXhwLnkgICAgICAgQWRkZWQgdGhlIGJ1aWx0LWluIHByb2NlZHVyZXMgSU5DLCBJTkNMLCBERUMsIGFuZCBERUNMIHRvCiAgICAgICAgICAgICAgICAgICAgdGhlIGxhbmd1YWdlLiAgSU5DTCBhbmQgREVDTCBjdXJyZW50bHkgY2F1c2UgYW4gZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgc2luY2Ugc2V0cyBhcmUgbm90IGltcGxlbWVudGVkIHlldC4gIElOQyBhbmQgREVDIGFyZQogICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGFzIFBSRUlOQ1JFTUVOVC9QUkVERUNSRU1FTlQgd2l0aCBvbmUKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCwgYW5kIGFzIEFTU0lHTl9NT0RJRlkgd2l0aCB0d28gYXJndW1lbnRzLgogICAgIGV2YWwuYyAgICAgICAgIEFkZGVkIHR5cGUgY2hlY2tpbmcgdG8gdGhlIGFib3ZlIGNhc2VzLgogICAgIHZhbHVlLmggICAgICAgIEFkZGVkIG5vdF9sdmFsX2NvbnN0YW50IHRvIHRoZSBsdmFsX3R5cGUgZW5udW1lcmF0ZWQgdHlwZS4KICAgICAgICAgICAgICAgICAgICBub3RfbHZhbF9jb25zdGFudCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcyBhIGNvbnN0YW50CiAgICAgICAgICAgICAgICAgICAgdmFsdWU7IHRoYXQgaXMgMyBvciAnYScgb3IgVFJVRSwgbm90IGFzIGluIGEgY29uc3RhbnQKICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLiAgVGhpcyBpcyB1c2VkIHRvIGhlbHAgY29lcmNlIG51bWJlcnMgc3VjaCBhcyAzCiAgICAgICAgICAgICAgICAgICAgdG8gZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZCBudW1iZXJzLgogICAgIHZhbG9wcy5jICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiB2YWx1ZV9jb2VyY2VfY29uc3RhbnRzKCkgd2hpY2ggY29lcmNlcwogICAgICAgICAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzIGFzIGZvbGxvd2luZzogIGlmIG9uZSBpcyBhIGNvbnN0YW50IGFuZAogICAgICAgICAgICAgICAgICAgIHRoZSBvdGhlciBpcyBub3QsIHRoZSBjb25zdGFudCdzIHR5cGUgaXMgc2V0IHRvIHRoZSB0eXBlCiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG90aGVyIGFyZ3VtZW50LiAgSWYgYm90aCBhcmUgY29uc3RhbnRzIGFuZCBvbmUgaXMKICAgICAgICAgICAgICAgICAgICBzaWduZWQsIHRoZSBvdGhlciBpcyBjb252ZXJ0ZWQgdG8gYSBzaWduZWQgY29uc3RhbnQuCgpTYXQgSnVuIDI5IDE3OjI2OjI5IEVEVCAxOTkxCgogICAgIHZhbGFyaXRoLmMgICAgIEFkZGVkIGEgYmV0dGVyIHJhbmdlIGNoZWNrZXIuICBJdCBub3cgY2hlY2tzIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgKHN1Y2Nlc3NmdWxseSkgb24gaW50ZWdyYWwgb3BlcmF0aW9ucyBbKy1dIChzaWduZWQgYW5kCiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQpIGZvciBhbnkgQyBzaXplZCB0eXBlLiAgU3RpbGwgZG9lcyBub3Qgd29yayB3ZWxsCiAgICAgICAgICAgICAgICAgICAgZm9yIG11bHRpcGxpY2F0aW9uLikKICAgICAgICAgICAgICAgICAgICBpbnRfaW5fc2l6ZSgpIHJldHVybnMgYW4gaW50ZWdlciB0aGF0IGlzIGNvZXJjZWQgdG8gZml0IGludG8KICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLgoKTW9uIEp1bCAgMSAxMzowNDoxNCBFRFQgMTk5MQoKICAgICBsYW5ndWFnZS5bY2hdICBBZGRlZCB0aGUgZnVuY3Rpb24gYmlub3BfcmVzdWx0X3R5cGUoKSwgd2hpY2ggcmV0dXJucyB0aGUKICAgICAgICAgICAgICAgICAgICBidWlsdGluIChzdHJ1Y3QgdHlwZSAqKSB0eXBlIHRoYXQgd291bGQgYmUgdGhlIHJlc3VsdCBvZiBhCiAgICAgICAgICAgICAgICAgICAgYmlub3Agb24gdGhlIHR3byB2YWx1ZXMgVjEgYW5kIFYyLgoKV2VkIEp1bCAgMyAxOToyMjo1MyBFRFQgMTk5MQoKICAgICBzb3VyY2UuYyAgICAgICBFeHRlbmRlZCBzb3VyY2VfaW5mbygpIHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBsYW5ndWFnZSBpbgogICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgZnJvbSAiaW5mbyBzb3VyY2UiLgogICAgIApGcmkgSnVsICA1IDEzOjQ4OjUyIEVEVCAxOTkxCgogICAgIHV0aWxzLmMgICAgICAgIE1vdmVkIHRoZSBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlIEdEQiBzZXQvc2hvdyBjb21tYW5kcwogICAgICAgICAgICAgICAgICAgIGRlYWxpbmcgd2l0aCBsYW5ndWFnZSBpbnRvIGxhbmd1YWdlLmMuCiAgICAgbGFuZ3VhZ2UuYyAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIGxhbmd1YWdlX2luZm8oKSwgd2hpY2ggZGlzcGxheXMgaW5mbwogICAgICAgICAgICAgICAgICAgIGFib3V0IHRoZSBjdXJyZW50IHdvcmtpbmcgbGFuZ3VhZ2UsIHR5cGUgYW5kIHJhbmdlIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuICBDYWxsZWQgdmlhIHRoZSBHREIgY29tbWFuZCAiaW5mbyBsYW5ndWFnZSIuCiAgICAgICAgICAgICAgICAgICAgQWRkZWQgYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSBfaW5pdGlhbGl6ZV9sYW5ndWFnZSgpLAogICAgICAgICAgICAgICAgICAgIHRoYXQgc2V0cyBkZWZhdWx0cyBmb3IgdGhlIGxhbmd1YWdlLCB0eXBlIGFuZCByYW5nZQogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyBhbmQgc2V0cyB1cCB0aGUgbmV3IEdEQiBjb21tYW5kcy4KICAgICBtYWluLmMgICAgICAgICBMYW5ndWFnZSBzZXR1cCBtb3ZlZCB0byBsYW5ndWFnZS5jLgogICAgIGRlcGVuZCAgICAgICAgIFJlYnVpbHQuCgpNb24gSnVsICA4IDEwOjEwOjIyIEVEVCAxOTkxCgogICAgIHZhbGFyaXRoLmMgICAgIERlYnVnZ2VkIHRoZSByYW5nZSBjaGVja2VyIGZvciBhcml0aG1ldGljLiAgU3RpbGwgZG9lcyBub3QKICAgICAgICAgICAgICAgICAgICB3b3JrIGZvciBtdWx0aXBsaWNhdGlvbiB2ZXJ5IHdlbGwuCgpNb24gSnVsICA4IDEyOjQwOjM3IEVEVCAxOTkxCgogICAgIGxhbmd1YWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbiB2YWx1ZV90cnVlKCkgd2hpY2ggcmV0dXJucyBub24temVybyBpZgogICAgICAgICAgICAgICAgICAgIGl0cyBhcmd1bWVudCByZXByZXNlbnRzIGEgYm9vbGVhbiB0cnVlIHZhbHVlLgogICAgIGJyZWFrcG9pbnQuYyAgIENoYW5nZWQgYnJlYWtwb2ludF9jb25kX2V2YWwoKSB0byBjYWxsIHZhbHVlX3RydWUoKSB0bwogICAgICAgICAgICAgICAgICAgIGNoZWNrIHRoZSB0cnV0aCBvZiBhbiBleHByZXNzaW9uLgoKVGh1IEp1bCAxMSAxMjo1MTozNCBFRFQgMTk5MQoKICAgICBsYW5ndWFnZS5bY2hdICBBZGRlZCB0aGUgcHJlZGljYXRlIHN0cnVjdHVyZWRfdHlwZSgpLCB3aGljaCByZXR1cm5zCiAgICAgICAgICAgICAgICAgICAgbm9uLXplcm8gaWYgdGhlIGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlZCB0eXBlLgogICAgICAgICAgICAgICAgICAgIEFkZGVkIHRoZSBwcmVkaWNhdGUgcG9pbnRlcl90eXBlKCksIHdoaWNoIHJldHVybnMgbm9uLXplcm8KICAgICAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHR5cGUuCiAgICAgZXZhbC5jICAgICAgICAgQWRkZWQgdGhlIGFiaWxpdHkgdG8gZG8gYWRkaXRpb24gYW5kIHN1YnN0cmFjdGlvbiBvbgogICAgICAgICAgICAgICAgICAgIHBvaW50ZXJzIGFuZCBpbnRlZ2Vycy4gICBUaGlzIGNhc2Ugc2ltcGx5IGJ5cGFzc2VzIHRoZQogICAgICAgICAgICAgICAgICAgIHR5cGUgY2hlY2tlci4KClRodSBKdWwgMTEgMTQ6NDE6NDIgRURUIDE5OTEKCiAgICAgaW5jbHVkZS9zdGFiLmRlZgogICAgICAgICAgICAgICAgICAgIEFkZGVkIHRoZSBzeW1ib2wgTl9ERUZEICgweDRhKSB3aGljaCBpcyBhIGRlZmluaXRpb24KICAgICAgICAgICAgICAgICAgICBtb2R1bGUgZGVwZW5kZW5jeSB0aGF0IGlzIHVzZWQgYnkgdGhlIEdOVSBNb2R1bGEtMgogICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGFuZCB0aGUgbGlua2VyLiAgSXQgaXMgbm90IGltcG9ydGFudCB0byBHREIsCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHRoYXQgW2RieHxjb2ZmfG1pcHNdcmVhZC5jIHNob3VsZCBpZ25vcmUgdGhlc2UKICAgICAgICAgICAgICAgICAgICBzeW1ib2xzLgoKRnJpIEp1bCAxMiAxNjowNzowMCBFRFQgMTk5MQoKICAgICB2YWxwcmludC5jICAgICBDaGFuZ2VkIHRoZSBUWVBFX0xFTkdUSCh0eXBlKSA+PSAwIHRvIFRZUEVfTEVOR1RIKHR5cGUpID4KICAgICAgICAgICAgICAgICAgICAwIGluIHZhbF9wcmludCgpLiAgQWxzbyBhZGRlZCBzdGF0ZW1lbnRzIHRvIHRoZSBlbHNlIHBhcnQKICAgICAgICAgICAgICAgICAgICB0byBjb2VyY2UgdHlwZSAoYXJndW1lbnQgdG8gdmFsX3ByaW50KSB0byBhIHBvaW50ZXIgdHlwZQogICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFuICJhcnJheSBvZiB1bnNwZWNpZmllZCBsZW5ndGgiLgogICAgIHZhbG9wcy5jICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiB2YWx1ZV9tMl9zdHJpbmcoKSwgd2hpY2ggcmV0dXJucyBhCiAgICAgICAgICAgICAgICAgICAgKHZhbHVlKSB2YWx1ZSB3aGljaCBpcyBhIGNvbnN0YW50IHN0cmluZywgd2hvc2UgdHlwZSBpcwogICAgICAgICAgICAgICAgICAgIChBUlJBWSBbMC4ubl0gT0YgQ0hBUikuICBUaGUgbGVuZ3RoIGZpZWxkIG9mIHRoZSB0eXBlCiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGlzIHNldCB0byB6ZXJvLCBzbyBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuCiAgICAgICAgICAgICAgICAgICAgImFycmF5IG9mIHVuc3BlY2lmaWVkIGxlbmd0aCIuCiAgICAgc3RhY2suYyAgICAgICAgTW92ZWQgdGhlIGxhbmd1YWdlL2ZyYW1lIG1pc21hdGNoIGNoZWNrIHRvCiAgICAgICAgICAgICAgICAgICAgbWFpbi5jOmV4ZWN1dGVfY29tbWFuZCgpLgogICAgIG1haW4uYyAgICAgICAgIFRoZSB3b3JraW5nIGxhbmd1YWdlIGlzIHJlY29yZGVkIGVhY2ggdGltZQogICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVfY29tbWFuZCgpIGlzIGV4ZWN1dGVkLiAgSWYgd29ya2luZyBsYW5nIGhhcwogICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgZHVyaW5nIGl0cyBleGVjdXRpb24sIHRoZW4gdGhlIG5ldwogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlL3R5cGUvcmFuZ2UgaW5mbyBpcyBwcmludGVkIG91dCBmb3IgdGhlIHVzZXIuICBJZgogICAgICAgICAgICAgICAgICAgIHRoZSB3b3JraW5nIGxhbmd1YWdlIGRvZXMgbm90IG1hdGNoIHRoZSBsYW5ndWFnZSBvZiB0aGUKICAgICAgICAgICAgICAgICAgICBmcmFtZSwgYSB3YXJuaW5nIGlzIGlzc3VlZC4KClNhdCBKdWwgMTMgMTY6MTY6MzkgRURUIDE5OTEKCiAgICAgZXZhbC5jICAgICAgICAgTW92ZWQgYWxsIHRoZSB0eXBlLWNoZWNraW5nIHN0dWZmIGZvciBvcGVyYXRvcnMgdG8KICAgICBsYW5ndWFnZS5bY2hdICBsYW5ndWFnZS5jLiAgVGhpcyBpcyBzbyB3ZSBjYW4ga2VlcCBsYW5ndWFnZS1zcGVjaWZpYwogICAgICAgICAgICAgICAgICAgIHN0dWZmIChsaWtlIGZvciB3aGF0IHR5cGUgb3BlcmF0b3JzIGFyZSBkZWZpbmVkKSBpbgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlLmMuCiAgICAgbGFuZ3VhZ2UuW2NoXSAgQWRkZWQgdGhlIGZ1bmN0aW9uIGJpbm9wX3R5cGVfY2hlY2soKSwgd2hpY2ggY2hlY2tzIHRvIHNlZQogICAgICAgICAgICAgICAgICAgIGlmIGl0cyB0d28gKHZhbHVlKSBhcmd1bWVudHMgYXJlIHR5cGUtY29tcGF0aWJsZSB3aXRoIGl0cwogICAgICAgICAgICAgICAgICAgIG9wY29kZSBhcmd1bWVudC4gIFRoZSBvcGNvZGUgc2hvdWxkIHJlcHJlc2VudCBhbiBvcGVyYXRpb24KICAgICAgICAgICAgICAgICAgICBpbnZvbHZpbmcgYW4gb3BlcmF0b3IuICBBbHNvIGFkZGVkIHRoZSBtYWNybyBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgIHVub3BfdHlwZV9jaGVjaywgd2hpY2ggY2FsbHMgYmlub3BfdHlwZV9jaGVjayB3aXRoIGEKICAgICAgICAgICAgICAgICAgICBOVUxMIHNlY29uZCBhcmd1bWVudC4KICAgICBleHBwcmludC5jICAgICBBZGRlZCBNb2R1bGEtMiBvcGVyYXRvcnMgdG8gdGhlIG9wX3ByaW50X3RhYiwgc28gaW5mbwogICAgIGV4cHJlc3Npb24uaCAgIGJyZWFrIHdvcmtzIGNvcnJlY3RseS4gIEFsc28gYWRkZWQgIm9wX3N0cmluZyIsIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgcmV0dXJucyB0aGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIChlbnVtIGV4cF9vcGNvZGUpCiAgICAgICAgICAgICAgICAgICAgb3Bjb2RlIHRoYXQgaXMgaXRzIGFyZ3VtZW50LgoKClNhdCBKdWwgMTMgMTg6MjY6MTggRURUIDE5OTEKCiAgICAgY29mZnJlYWQuYyAgICAgQWRkZWQgY29kZSB0byByZWNvcmQgdGhlIHR5cGUgb2YgZnVuY3Rpb24gYXJndW1lbnRzIHdpdGgKICAgICAgICAgICAgICAgICAgICBlYWNoIHBhcmljdWxhciBmdW5jdGlvbi4gIENvZGUgaXMgdmVyeSBzaW1pbGFyIHRvIHRoYXQKICAgICAgICAgICAgICAgICAgICBhZGRlZCB0byBkYnhyZWFkLmMuICAKICAgICBkYnhyZWFkLmMgICAgICBNb3ZlZCBhZGRfcGFyYW1fdG9fdHlwZSgpIHRvIHN5bXRhYi5jCiAgICAgc3ltdGFiLltjaF0gICAgQWRkZWQgZnVuY3Rpb24gYWRkX3BhcmFtX3RvX3R5cGUoKSBmcm9tIGRieHJlYWQuYwoKICAgICAqKiogTk9URTogIFRoZSBhYm92ZSBhZGRpdGlvbnMgaGF2ZSBub3QgYmVlbiB0ZXN0ZWQuCgpNb24gSnVsIDE1IDEyOjUwOjQ3IEVEVCAxOTkxCgogICAgIGxhbmdhdWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbnMgdHlwZV9lcnJvciBhbmQgcmFuZ2VfZXJyb3IsIHdoaWNoIHdvcmsKICAgICAgICAgICAgICAgICAgICBsaWtlIGVycm9yKCkgZXhjZXB0IGlmIHRoZSB0eXBlL3JhbmdlIG1vZGUgaXMgc2V0IHRvCiAgICAgICAgICAgICAgICAgICAgKl9tb2RlX3dhcm4sIHRoZW4gdGhleSBkbyBub3QgZG8gYSByZXR1cm5fdG9fdG9wX2xldmVsKCksCiAgICAgICAgICAgICAgICAgICAgYnV0IG1lcmVseSBwcmludCBhIHdhcm5pbmcuCiAgICAgICAgICAgICAgICAgICAgQWxzbyBjaGFuZ2VkIFtzZXR8c2hvd11fW3R5cGV8cmFuZ2VdX2NvbW1hbmQoKSB0byBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgdGhlIG5ldyAid2FybiIgZmVhdHVyZS4KClRodSBKdWwgMTggMTc6NTA6NTQgRURUIDE5OTEKCiAgICAgbWlwc3JlYWQuYyAgICAgQWRkZWQgY29kZSB0byByZWNvcmQgdGhlIHR5cGUgb2YgZnVuY3Rpb24gYXJndW1lbnRzIHdpdGgKICAgICAgICAgICAgICAgICAgICBlYWNoIHBhcnRpY3VsYXIgZnVuY3Rpb24uICBDb2RlIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0CiAgICAgICAgICAgICAgICAgICAgYWRkZWQgdG8gZGJ4cmVhZC5jLiAgCgogICAgICoqKiBOT1RFOiAgVGhlIGFib3ZlIGFkZGl0aW9ucyBoYXZlIG5vdCBiZWVuIHRlc3RlZC4KCkZyaSBKdWwgMTkgMTE6MTk6MTAgRURUIDE5OTEKCiAgICAgZGVmcy5oICAgICAgICAgQWRkZWQgbWFjcm9zIE1BWF9PRl9TSVpFLCBNSU5fT0ZfU0laRSwgVU1BWF9PRl9TSVpFLCBhbmQKICAgICAgICAgICAgICAgICAgICBVTUlOX09GX1NJWkUsIHdoaWNoIHdoZW4gZ2l2ZW4gYSBzaXplIG9mIGEgbnVtZXJpYyB0eXBlLAogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZSBpdCBjYW4gaG9sZC4gIFVNQVguLi4KICAgICAgICAgICAgICAgICAgICBhbmQgVU1JTi4uLiByZXR1cm4gdGhlIHJlc3VsdCBmb3IgdW5zaWduZWQgdHlwZXMuCiAgICAgc3ltdGFiLmggICAgICAgQWRkZWQgdGhlIG1hY3JvcyBNQVhfT0ZfVFlQRSBhbmQgTUlOX09GX1RZUEUgdG8gb3BlcmF0ZSBvbgogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0eXBlcy4gIFRoZXkgY2FsbCBhYm92ZSBtYWNyb3MuCiAgICAgZGJ4cmVhZC5jICAgICAgUmVuYW1lZCB0aGUgTUFYIGFuZCBNSU5fT0ZfVFlQRSBtYWNyb3MgdG8gLi4uX09GX0NUWVBFIHRvCiAgICAgICAgICAgICAgICAgICAgYXZvaWQgYSBuYW1lIGNvbmxpY3Qgd2l0aCB0aGUgYWJvdmUuCiAgICAgYy1leHAueSAgICAgICAgQWRkZWQgcmFuZ2UgY2hlY2tpbmcgb24gbnVtZXJpYyBjb25zdGFudHMgaW4KICAgICAgICAgICAgICAgICAgICBwYXJzZV9udW1iZXIoKSBmb3IgY29tcGxldGVuZXNzLgogICAgIHZhbGFyaXRoLmMgICAgIE1hZGUgYmlub3BfdXNlcl9kZWZpbmVkX3AoKSBhbmQgdW5vcF91c2VyX2RlZmluZWRfcCgpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgaWYgd29ya2luZ19sYW5nIGlzIG5vdCBsYW5ndWFnZV9jLgoKVGh1IEF1ZyAgOCAxNDoxNzoyMiBFRFQgMTk5MQoKCW1haW4uYwoJcHJpbnRjbWQuYwoJYnJlYWtwb2ludC5jCURvY3VtZW50YXRpb24gc3RyaW5ncyBvZiBzb21lIGNvbW1hbmRzIGNoYW5nZWQgdG8KCQkJCWVsaW1pbmF0ZSB0aGUgcmVmZXJlbmNlcyB0byB0aGUgQyBsYW5ndWFnZSB3aGVyZQoJCQkJYXBwcm9wcmlhdGUuCgpUdWUgQXVnIDEzIDE1OjQ4OjAzIEVEVCAxOTkxCgoJbTItZXhwLnkJCUFkZGVkIHF1YWxpZmllZCBpZGVudGlmaWVycyB0byB0aGUgZ3JhbW1hci4gIFRoZSBzZW1hbnRpY3MKCQkJCWFyZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aG9zZSBvZiB0aGUgR0RCIG9wZXJhdG9yIDo6CgljLWV4cC55CgltMi1leHAueQkJQWRkZWQgYSBydWxlIHRvIGVhY2ggZ3JhbW1hciBvZiB0aGUgZm9ybTogIHN0YXJ0IDo6PSBleHAgfAoJCQkJdHlwZV9leHAsIHdoZXJlIHR5cGVfZXhwIGlzIGFueSB2YWxpZCB0eXBlIGV4cHJlc3Npb24uCglleHByZXNzaW9uLmgJCglldmFsLmMJCUFkZGVkIHRoZSBvcGNvZGUgT1BfVFlQRSwgYW5kIGFuIGVycm9yIGNhc2UgaW4gZXZhbC5jLgoJcHJpbnRjbWQuYwlNb2RpZmllZCBwdHlwZV9jb21tYW5kKCkgc28gaXQgYWN0dWFsbHkgcGFyc2VzIHRoZSBpbnB1dAoJCQkJKG5lY2Vzc2FyeSBmb3IgdHlwZSBleHByZXNzaW9ucyB3aXRoIHNjb3BlIHF1YWxpZmllcnMpLgoJCQkJQWRkZWQgdGhlIGZ1bmN0aW9uIHB0eXBlX2V2YWwoKSB3aGljaCBleHBlY3RzIGFuCgkJCQlleHByZXNzaW9uIGNvbXBvc2VkIG9mIG9uZSBPUF9UWVBFIGVsZW1lbnQuCgkqLltjaF0JCVJlcGxhY2VkIGFsbCBvY2N1cmVuY2VzIG9mIHBhcnNlX2NfZXhwcmVzc2lvbiB3aXRoCgkJCQlwYXJzZV9leHByZXNzaW9uCgkqLltjaF0JCVJlcGxhY2VkIGFsbCBvY2N1cmVuY2VzIG9mIHBhcnNlX2NfMSB3aXRoIHBhcnNlX2V4cF8xCgpbRW5kIG9mIENoYW5nZUxvZyBlbnRyaWVzIGZyb20gQW5kcmV3IEJlZXJzIGZvciBNb2R1bGEtMiBzdXBwb3J0Ll0KCk1vbiBTZXAgMTYgMTc6MTk6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJU21hbGwgZml4ZXMgZnJvbSBQZXRlciBTY2hhdWVyOgoKCSogaW5mcnVuLmMgKGNoaWxkX2F0dGFjaCk6ICBMaW50LgoJKiBzb2xpYi5jIChmaW5kX3NvbGliKTogIEhhbmRsZSBzaGFyZWQgbGlicyB2ZXJzaW9uIDIuCgoJU21hbGwgZml4ZXMgZnJvbSBEYXZpZCBXb29kOgoKCSogeG0tdWx0cmEzLmggKFNZU19TSUdMSVNUX01JU1NJTkcpOiAgVHlwby4KCglTbWFsbCBmaXhlczoKCgkqIHJlbW90ZS12eC5jOiAgTW92ZSA8c3RkaW8uaD4gdG8gdG9wLCBmb3IgRklMRS4gIEZpeCBmcm9tCglKb2huIFMgPGJhc3JhaSVrYW5nYS5kbmV0QGMzcG8uc20tYWxjLmFmLm1pbD4uCgoJKiB1dGlscy5jICh3cmFwX2hlcmUpOiAgQXZvaWQgd3JhcCBhY3Rpb24gb2YgZnB1dHNfZmlsdGVyZWQgaWYKCWNoYXJzX3Blcl9saW5lIGlzIGF0IG1heGltdW0gKHVzZXIgdHlwZWQgYHNldCB3aWR0aCAwJykuICBGaXgKCWZyb20gQW5kcmVhcyBTY2h3YWIgPHNjaHdhYkBsczUuaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+LgoKVHVlIFNlcCAxNyAxNzozMTowNCAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQoKCSogY29yZWRlcC5jOiAgaW5jbHVkZSBwdHJhY2UuaCB3aGVyZSBuZWNlc3NhcnkuCgkqIG1pcHNyZWFkLmMocGFyc2VfbGluZXMpOiAgZml4IHVuc2lnbmVkIGNoYXIgcHJvYmxlbSB0aGF0IHdhcwoJbWVzc2luZyB1cCBsaW5lIG51bWJlcnMgb24gU0dJJ3MgYW5kIHBvc3NpYmx5IG90aGVyIE1JUFMgYmFzZWQKCXBsYXRmb3Jtcy4KCSogaW5mcnVuLmMgKGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6ICB1c2UgYmV0dGVyIHRlc3QgdG8gY2hlY2sKCXJldHVybiB2YWwgZnJvbSBzZXRwZ3JwKCkuCgkqIHRtLWlyaXgzLmgsIHhtLWlyaXgzLmgsIHRjb25maWcvaXJpeDMsIHhjb25maWcvaXJpeDM6ICBhZGQgdGhlc2UKCWZvciBzZ2kvaXJpeCBzdXBwb3J0LgoKV2VkIFNlcCAxOCAwNDozMzozMSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKCgkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6ICBQdXQgbm9uLXN0YXRpYyBwcm9jZWR1cmVzCglpbiB0aGUgZ2xvYmFsIGJsb2NrLgoKRnJpIFNlcCAxMyAwMDoxNDo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKCglQYXRjaCB0b2dldGhlciBgdGV4dF9zdGFydCcgYW5kIGB0ZXh0X2VuZCcgZm9yIDI5SyBwb3J0LgoKCSogZXhlYy5jIChleGVjX2NvbW1hbmQpOiAgSWYgTkVFRF9URVhUX1NUQVJUX0VORCwgZGVmaW5lIHRoZQoJdmFyaWFibGVzIGFuZCBzZXQgdGhlbSBiYXNlZCBvbiB0aGUgZXhlYyBmaWxlLgoJKiBhbTI5ay10ZGVwLmM6ICBkZWNsYXJlIHRleHRfc3RhcnQuCgkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgZGVjbGFyZSB0ZXh0X2VuZC4KCgkqIGluZmVyaW9yLmg6ICBFbGltaW5hdGUgQ0FOTk9UX0VYRUNVVEVfU1RBQ0sgaW4gZmF2b3Igb2YKCWRlZmluaW5nIENBTExfRFVNTVlfTE9DQVRJT04gYXMgQkVGT1JFX1RFWFRfRU5ELiAgVGhpcyBpcwoJYmVjYXVzZSBtYWNoaW5lcyB0aGF0IGRvIHRoaXMgd2lsbCBhbHNvIGhhdmUgdG8ga25vdyB0bwoJc2V0IE5FRURfVEVYVF9TVEFSVF9FTkQuICBCZXNpZGVzLCBpdCB3YXMgYSByZWR1bmRhbnQgd2F5IHRvCglzYXkgdGhlIHNhbWUgdGhpbmcuCgkqIHRtLTI5ay5oLCB0bS1jb252ZXguaCwgdG0tbnAxLmg6ICBFbGltaW5hdGUKCUNBTk5PVF9FWEVDVVRFX1NUQUNLLCBkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiBhbmQKCU5FRURfVEVYVF9TVEFSVF9FTkQuCgpUaHUgU2VwIDEyIDAwOjIyOjI0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCglBTUQgMjkwMDAgY2hhbmdlcyBmcm9tIERhdmlkIFdvb2QgPHdvb2RAZGF2aWQudWx0cmEubnl1LmVkdT46CgoJKiBNYWtlZmlsZS5pbiAoQ0xJQlMpOiAgUHV0IFhNX0NMSUJTIGFuZCBUTV9DTElCUyBhdCBlbmQuCglQYXNzIE1VTkNIX0RFRklORSB0byBtdW5jaCB3aGVuZXZlciB3ZSBydW4gaXQuCgkqIGFtMjlrLXBpbnNuLmMgKHByaW50X2luc24pOiAgSGFuZGxlIE5PUCBzcGVjaWFsbHkuICBBdm9pZCAlI3gKCWZvcm1hdCBzdHJpbmc7IHVzZSAweCV4IGluc3RlYWQuCgkqIGFtMjlrLXRkZXAuYzogIFVzZSBEVU1NWV9TQVZFX0dSRUdTIGFuZCBSRVRVUk5fUkVHTlVNLgoJKiB1bHRyYS14ZGVwLmMsIHhtLXVsdHJhLmg6ICBOZXcgZmlsZXMgZm9yIFVsdHJhY29tcHV0ZXIgaG9zdCBzeXN0ZW0uCgkqIHhtLXJ0YnNkLmg6ICBOZXcgaG9zdCBzdXBwb3J0IGZvciBSVC9QQyBydW5uaW5nIEJTRCBVbml4LgoJKiBpbmZsb3cuYzogIEhhbmRsZSBgc2hvcnQnIHByb2Nlc3MgZ3JvdXAgSURzLgoJKiBpbmZwdHJhY2UuYyAoZmV0Y2hfcmVnaXN0ZXIpOiAgU3VwcG9ydCBDQU5OT1RfRkVUQ0hfUkVHSVNURVIsCglhbmQgY2hlY2sgZm9yIHB0cmFjZSBlcnJvcnMuCgkqIGNvZmZyZWFkLmMgKFNEQl9SRUdfVE9fUkVHTlVNKTogIERlZmluZSBpZiBub3QgYWxyZWFkeS4KCShjb2ZmX3N5bWZpbGVfaW5pdCk6ICBJbml0aWFsaXplIHRleHRfYmZkX3NjbnVtLgoJKHJlYWRfY29mZl9zeW10YWIpOiAgVXNlIGl0IHRvIGZpbmQgdGhlIHRleHQgW2FuZCBhYnNvbHV0ZT9dIHNlY3Rpb25zLgoJKiAuLi9jb25maWcuc3ViOiAgQWRkIHZlbmRvciBueXUgYW5kIG9zICJzeW1bMS05XSoiLgoJKiBjb25maWd1cmUuaW46IEFkZCBob3N0cyBydHBjLSotKiBhbmQgYTI5ay0qLSouCglNZXJnZSB0YXJnZXQgYXJtIGNhc2Ugd2l0aCBvdGhlciAiZWFzeSIgY2FzZXMuICBBZGQgdGFyZ2V0CgljYXNlcyBhMjlrLSotbm9uZSAocmVoYWNrIG9mIGFtMjlrKSwgYTI5ay0qLWtlcm4gKHJlbW90ZSB0bwoJVWx0cmFjb21wdXRlciBrZXJuZWwpLCBhbmQgYTI5ay0qLXN5bTEgKHVsdHJhY29tcHV0ZXIgT1MncyB1c2VyCglwcm9jZXNzKS4KCSogbWluaW1vbi5oLCByZW1vdGUtYWRhcHQuYywgcmVtb3RlLW1tLmM6ICBBZGQuCgkqIG11bmNoOiAgQ29wZSB3aXRoIFJUL1BDIHB1dHRpbmcgZm5zIGluIGRhdGEgc2VnbWVudC4KCVJlc3RvcmUgYWJpbGl0eSB0byBvdmVycmlkZSBgbm0nIGJ5IHNwZWNpZnlpbmcgTVVOQ0hfTk0uCgkqIHhjb25maWcvcnRic2QsIHhjb25maWcvdWx0cmEzOiAgTmV3IGhvc3Qgc3lzdGVtcy4KCSogdGNvbmZpZy9hMjlrOiAgUmVuYW1lIGZyb20gdGNvbmZpZy9hbTI5ay4gIEFkZCByZW1vdGUtbW0KCWFuZCByZW1vdGUtYWRhcHQuICBSZW1vdmUgZW5jYXBzdWxhdGVkIGNvZmYgI2RlZmluZSdzICh0aGUKCXN1cHBvcnQgc2hvdWxkIGdvIGluIEJGRCwgYW5kIGdkYiBzaG91bGRuJ3Qga25vdyBvciBjYXJlKS4KCSogdGNvbmZpZy9hMjlrLWtlcm46ICBTYW1lLCBidXQgZm9yIHJlbW90ZSBrZXJuZWwgZGVidWdnaW5nLgoJKiB0Y29uZmlnL3VsdHJhMzogIEZvciBkZWJ1Z2dpbmcgdXNlciBwcm9jZXNzZXMgb24gVWx0cmEzL1N5bTEuCgkqIHRtLTI5ay5oOiAgVXBkYXRlIEJBRE1BRyAodGhvdWdoIGl0IHNob3VsZCBnbyBhd2F5KS4KCUFsbG93IHRoZSByZWdpc3RlciBkZWZpbml0aW9ucyB0byBiZSBvdmVycmlkZGVuIGluIGFub3RoZXIKCXRtLWZpbGUuICBGaXggU1JfUkVHTlVNLiAgQWRkIGEgbWVzcyBvZiBfUkVHTlVNJ3MuICBTZXBhcmF0ZQoJUkVUVVJOX1JFR05VTSBmcm9tIEdSOTZfUkVHTlVNIGFuZCBEVU1NWV9TQVZFX0dSRUdTIGZyb20KCURVTU1ZX1NBVkVfR1I5NiwgZm9yIGhhbmRsaW5nIGtlcm5lbCBjYWxsaW5nIGNvbnZlbnRpb25zCgl0aGF0IHVzZSBHUjY0KyByYXRoZXIgdGhhbiBHUjk2Ky4KCSogdG0tdWx0cmEzLmg6ICBOZXcgZmlsZSwgZm9yIHVzZSBvbiBVbHRyYTMgVW5peCBhcyB3ZWxsIGFzIGZvcgoJcmVtb3RlIGRlYnVnZ2luZyBvZiBVbHRyYTMga2VybmVsLiAgSW5jbHVkZXMgdG0tMjlrLmggYW5kCglvdmVycmlkZXMgdmFyaW91cyB0aGluZ3MuCgoJKiByZW1vdGUtbW0uYyAobW1fYXR0YWNoLCBtbV93YWl0KTogIEhhbmRsZSBhdHRhY2ggbGlrZQoJY2hpbGRfYXR0YWNoIGRvZXMsIG1ha2luZyBhIGNsZWFuIHN0b3AgaW4gdGhlIG5ld2x5IGF0dGFjaGVkCglwcm9ncmFtLgoJKiByZW1vdGUtZWIuYzogIExpbnQuCgoJKiBjb2ZmcmVhZC5jOiAgTWFrZSBjb2ZmcmVhZCBpbmRlcGVuZGVudCBvZiBhbnkgcGFydGljdWxhcgoJdmFyaWFudCBvZiBDT0ZGLiAgQXZvaWQgI2luY2x1ZGUtaW5nIGFueSBwYXJ0aWN1bGFyIG9uZSBleGNlcHQKCWludGVybmFsY29mZi5oLiAgQkZEIG5vdyBwYXNzZXMga2V5IHZhbHVlcyBmb3Igc3ltYm9sIHJlYWRpbmcKCWFzIHBhcnQgb2YgaXRzIGNvZmZfZGF0YSBzdHJ1Y3R1cmUgKExJTkVTWiwgU1lNRVNaLCBBVVhFU1osCglhbmQgdGhlIHN5bWJvbCBtYXNrcyBhbmQgc2hpZnRzKTsgdXNlIHRoZW0uCglSZW1vdmUgb2Jzb2xldGUgZW5kX29mX3RleHRfYWRkci4KCgkqIGV4ZWMuYzogIFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBmaWxlcy4KCldlZCBTZXAgMTEgMTk6Mzg6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW4gKGRvY3VtZW50YXRpb24gdGFyZ2V0cyk6ICBQYXNzICQoTTQpLgoJQnVnZml4IGZyb20gZWdnZXJ0QHR3aW5zdW4uY29tIChQYXVsIEVnZ2VydCkuCgoJKiBzdGFjay5jIChkb3duX3NpbGVudGx5X2NvbW1hbmQpOiAgQ2hlY2sgZm9yIHN0YWNrIGV4aXN0ZW5jZS4KClR1ZSBTZXAgMTAgMjM6MDg6MjkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgVXBkYXRlIHRvIDQuMC4zLgoKVHVlIFNlcCAxMCAwOToxOToyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBjb3JlLmMgKGNvcmVfZmlsZV9jb21tYW5kKTogIFByaW50IGZyYW1lIGF0IGNvcmVkdW1wIHdpdGgKCWl0cyBsZXZlbCBudW1iZXIsIGJ5IGNhbGxpbmcgcHJpbnRfc3RhY2tfZnJhbWUuCgkqIGZyYW1lLmg6ICBBZGQgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwsIHByaW50X3N0YWNrX2ZyYW1lLgoJKiBmcmFtZS5oLCBzdGFjay5jOiAgUmVtb3ZlIHByaW50X3NlbF9mcmFtZSwgcHJpbnRfc2VsZWN0ZWRfZnJhbWUuCgkqIGNvbnZleC10ZGVwLmMsIGNvbnZleC14ZGVwLmMsIGluZmNtZC5jLCBpbmZsb3cuYywgaW5mcnVuLmM6CglDaGFuZ2UgcHJpbnRfc2VsX2ZyYW1lIGFuZCBwcmludF9zZWxlY3RlZF9mcmFtZSBjYWxsZXJzIHRvCglwcmludF9zdGFja19mcmFtZS4KCgkqIGRieHJlYWQuYyAocmVhZF9vZmlsZV9zeW10YWIpOiAgQXZvaWQgZW1wdHkgZWxzZSBjbGF1c2UuCgkqIHN5bWZpbGUuYyAoZnJlZV9uYW1lZF9zeW10YWJzKTogIERpdHRvLgoJKiBtYWluLmMgKG1haW4pOiAgd3JhcF9oZXJlIG5lZWRzIGFuIGFyZy4KCSogc29saWIuYyAoZmluZF9zb2xpYik6ICBBdm9pZCBtZW1vcnkgYWNjZXNzIGlmIF9EWU5BTUlDIGlzIHplcm8uCgkoc29saWJfYWRkKTogIEF2b2lkIG5vaXNlLiAgCgkoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgTGludC4KCShzaGFyZWRsaWJyYXJ5X2NvbW1hbmQpOiAgTW92ZSBkb250X3JlcGVhdCB0byBoZXJlLgoJKiB1dGlscy5jIChlcnJvcik6ICBDYWxsIHdyYXBfaGVyZSB0byBmb3JjZSBidWZmZXJlZCBvdXRwdXQuCgoJU21hbGwgcGF0Y2hlcyBmcm9tIFBldGVyIFNjaGF1ZXI6CgoJKiBjb2ZmcmVhZC5jIChzdGFydF9zeW10YWIpOiAgRnJlZSBhbnkgZXhpc3RpbmcgbGluZV92ZWN0b3IgYmVmb3JlCgltYWxsb2MtaW5nIG5ldyBvbmUuCgkocmVhZF9jb2ZmX3N5bXRhYik6ICBEaXR0byBmb3IgdHlwZV92ZWN0b3IuCgoJKiBzb3VyY2UuYyAobGluZXNfdG9fbGlzdCk6ICBOZXcgdmFyaWFibGUsIHJlcGxhY2luZyBmdW5jdGlvbi4KCShhbGwgdXNlcyk6ICBVc2UgYXMgdmFyaWFibGUuCgkoX2luaXRpYWxpemVfc291cmNlKTogIEFkZCAnc2V0IGxpc3RzaXplJyBhbmQgJ3Nob3cgbGlzdHNpemUnLgoJKiB1dGlscy5jIChsaW5lc190b19saXN0KTogIFJlbW92ZSBmdW5jdGlvbi4KCSogc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mbyk6ICBVc2UgYXMgdmFyaWFibGUuCgkqIGRlZnMuaCAobGluZXNfdG9fbGlzdCk6ICBSZW1vdmUgZGVjbGFyYXRpb24uCgpNb24gU2VwICA5IDEzOjQ1OjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGJyZWFrcG9pbnQuYyAoaW5zZXJ0X2JyZWFrcG9pbnRzKTogIFJlc3RvcmUgd2FybmluZyBhYm91dAoJdGhlIHByb2dyYW0gbWlnaHQgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MsIGJ1dCBvbmx5IGZvcgoJc3lzdGVtcyB3aXRoIHRoaXMgYnJhaW4gZGVhdGggKCNpZmRlZiBPTkVfUFJPQ0VTU19XUklURVRFWFQpLgoJKiB4bS1ocDMwMGJzZC5oLCB4bS1taXBzLmgsIHhtLXZheC5oOiAgRGVmaW5lIGl0LgoKCSogdXRpbHMuYyAoZXJyb3IpOiAgaWYgZXJyb3JfcHJlX3ByaW50IGlzIHNldCwgcHJpbnQgdGhlIHN0cmluZwoJZmlyc3QuCgkqIG1haW4uYyAobWFpbiwgcHJpbnRfZ251X2FkdmVydGlzZW1lbnQsIHByaW50X2dkYl92ZXJzaW9uKToKCVJlZm9ybWF0IGxlZ2FsZXNlIHNvIGl0IGFsd2F5cyBwcmludHMsIGJ1dCBhY3RzIGFzIGFuICJJJ20gaGVyZSIKCW1lc3NhZ2Ugd2hpbGUgc3ltYm9scyBhcmUgYmVpbmcgcmVhZC4gIElmIGFueSBlcnJvcnMgb2NjdXIsCglwcmludCBhIGZldyBuZXdsaW5lcyB0byBzZXQgb2ZmIHRoZSBtZXNzYWdlIGFuZCBzdGFydCBpdCBhdCB0aGUKCWxlZnQgbWFyZ2luLiAgUmVtb3ZlIG1lbnRpb24gb2YgImhlbHAiIGNvbW1hbmQsIGFuZCBkb24ndCB5YWsKCWFib3V0IHN5bWJvbCByZWFkaW5nLgoJKGNhdGNoX2Vycm9ycyk6ICBFcnJvciBzdHJpbmcgaXMgbm93IHByaW50ZWQgZmlyc3QgaW4gY2FzZSBvZgoJZXJyb3IsIG5vdCBsYXN0LgoJKiBjb21tYW5kLmMgKHVuZGVmX2NtZF9lcnJvciwgbG9va3VwX2NtZCk6ICBPbiB1bmRlZmluZWQgY29tbWFuZCwKCXN1Z2dlc3QgdGhlICJoZWxwIiBjb21tYW5kLgoKCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgU2V0IHRvIDQuMC4yLgoKVGh1IFNlcCAgNSAyMzo0OTo0OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiAuZ2RiaW5pdDogIFJlbW92ZSB1c2VsZXNzICJyciIgY29tbWFuZC4gIFNldCBjb21wbGFpbnRzCgl0byAxIGZvciBwZW9wbGUgZGVidWdnaW5nIGdkYi4KCgkqIGJyZWFrcG9pbnQuYywgcmVtb3RlLXZ4LmM6ICBSZXdvcmQgc3RyaW5ncyBwcmludGVkIGJ5CgljYXRjaF9lcnJvcnMgY2FsbGVycy4KCldlZCBTZXAgIDQgMTE6MDc6NTAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogV0hBVFMuTkVXOiAgImhpc3Rvcnkgd3JpdGUgLT4gaGlzdG9yeSBzYXZlIi4gIERvYyAid3JpdGUgb24vb2ZmIi4KCShGaXggZnJvbSBrZW5jQHZpZXdsb2dpYy5jb20uKQoKCUZpeCBzb21lIGluZnJhc3RydWN0dXJlIHRvIGJlIGFibGUgdG8gY29wZSB3aXRoIGhvc3QgYW5kIHRhcmdldAoJbWFjaGluZXMgd2l0aCBkaWZmZXJlbnQgc2l6ZWQgYmFzaWMgdHlwZXMgKGludHMsIHB0cnMsIGV0YykuCgkoSWRlYSBmcm9tIHBpZXJyZUBsYS50Y2UuY29tIChQaWVycmUgV2lsbGFyZCkuKQoKCSogdmFsdWVzLmMgKHZhbHVlX2Zyb21fbG9uZ2VzdCk6ICBSZW5hbWUgZnJvbSB2YWx1ZV9mcm9tX2xvbmcuCglIYW5kbGUgcG9pbnRlciB0eXBlcyBhcyB3ZWxsIGFzIGludGVnZXJzLCBzbyB0aGF0IHRhcmdldHMgd2l0aAoJZGlmZmVyZW50IHBvaW50ZXIgc2l6ZXMgZnJvbSB0aGUgaG9zdCBjYW4gYmUgYWNjb21vZGF0ZWQuCgkqIGJyZWFrcG9pbnQuYywgY29udmV4LXRkZXAuYywgZXZhbC5jLCBleHBwcmludC5jLCBwcmludGNtZC5jLAoJdmFsYXJpdGguYywgdmFsb3BzLmMsIHZhbHByaW50LmMsIHZhbHVlLmgsIHZhbHVlcy5jOiAgUmVuYW1lCgl1c2VzIG9mIHZhbHVlX2Zyb21fbG9uZyB0byB2YWx1ZV9mcm9tX2xvbmdlc3QuCgkqIGV2YWwuYywgZmluZHZhci5jLCBwcmludGNtZC5jLCB2YWxhcml0aC5jLCB2YWxvcHMuYzogIFBhc3MKCXRoZSBjb3JyZWN0IHBvaW50ZXIgdHlwZSB0byB2YWx1ZV9mcm9tX2xvbmd7ZXN0fS4KCgkqIGRvYy9nZGIudGV4aW5mbyAoJF8sICRfXyk6ICBEZXNjcmliZSB0eXBlcyBvZiB0aGVzZSB2YXJpYWJsZXMuCgoJKiByZW1vdGUtdnguYzogIFJlbW92ZSBvYnNvbGV0ZSBjb2RlIGZvciBjYWxsaW5nIGZ1bmN0aW9ucyB2aWEKCXZ4d29ya3Mga2x1ZGdlIGludGVyZmFjZSAoaXQgcmVmZXJlbmNlZCB2YWx1ZV9mcm9tX2xvbmcpLgoKCSogdmFsb3BzLmMgKHZhbHVlX3N0cmluZyk6ICBGaW5kIG1hbGxvYyB3aXRoIGxvb2t1cF9taXNjX2Z1bmMsIG5vdAoJcmF3IHNlYXJjaC4KClR1ZSBTZXAgIDMgMTg6Mzc6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCU1ha2Ugd3JpdGluZyB0byBmaWxlcyB3b3JrIHByb3Blcmx5LiAgKEZpeGVzIHRvIEJGRCBhcmUgYWxzbyBuZWVkZWQuKQoKCSogY29yZS5jIChjb3JlX29wZW4pOiAgT3BlbiBmaWxlIG91cnNlbHZlcywgcmVhZCBvciByL3csIGRlcGVuZGluZyBvbgoJd3JpdGVfZmlsZXMuICBVc2UgYmZkX2Zkb3BlbnIuICAKCSogZ2RiY29yZS5oICh3cml0ZV9maWxlcyk6ICBOZXcgdmFyaWFibGUuCgkqIGV4ZWMuYyAod3JpdGVfZmlsZXMpOiAgRGVmaW5lIHZhcmlhYmxlLCBhZGQgc2V0JnNob3cgZm9yIGl0LgoJKGV4ZWNfZmlsZV9jb21tYW5kKTogIFVzZSB3cml0ZV9maWxlcyB0byBvcGVuIGZvciByZWFkIG9yIHIvd3JpdGUuCgoJTWFrZSBzaGFyZWQgbGlicmFyeSByZWFkaW5nIGhhcHBlbiBhdXRvbWF0aWNhbGx5LiAgVGhlc2UgY2hhbmdlcwoJYXJlIG1vc3RseSBmcm9tIFBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4KCgkqIGluZmVyaW9yLmggKHN0b3Bfc29vbl9xdWlldGx5KTogIEFkZCB0byBleHBvcnRlZCB2YXJpYWJsZXMuCgkqIGluZnJ1bi5jIChjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiAgY2FsbCBzb2xpYiBob29rLCBpZiBkZWZpbmVkLgoJKGNoaWxkX2F0dGFjaCk6ICBjYWxsIHNvbGliIGhvb2ssIGlmIGRlZmluZWQuCgkqIHNvbGliLmM6ICBJbmNsdWRlIGluZmVyaW9yLmguICBBZGQgZnJvbV90dHkgdG8gc29fbGlzdCBhcyBrbHVkZ2UuCgkoZmluZF9zb2xpYik6ICBVc2UgbG9va3VwX21pc2NfZnVuYyByYXRoZXIgdGhhbiBoYW5kLXJvbGxlZC4KCShzeW1ib2xfYWRkX3N0dWIpOiAgTmV3IHN0dWIgZm9yIGNhdGNoX2Vycm9ycy4KCShzb2xpYl9hZGQpOiAgQXZvaWQgb3V0cHV0IGlmICFmcm9tX3R0eS4gIENhdGNoIGVycm9ycyByYXRoZXIKCXRoYW4ganVzdCBjYWxsaW5nIHN5bWJvbF9maWxlX2FkZCBhbmQgYm9tYmluZy4KCShzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayk6ICBJbnRlcmZhY2Ugd2l0aCB0aGUgdGFyZ2V0IHByb2Nlc3MKCXRvIGxldCBpdCByZWFkIGFuZCBhbGxvYyBzaGFyZWQgbGlicywgdGhlbiBmaWd1cmUgb3V0IHdoYXQgaXQgZGlkLgoKCSogY29yZS5jICh2YWxpZGF0ZV9maWxlcyk6ICBGaXggdHlwbywgc29mdGVuIHdhcm5pbmcuICAKCShGaXggZnJvbSBIaXJvdG8gS2Fnb3RhbmkgPGthZ290YW5pQGNzLnRpdGVjaC5hYy5qcD4uKQoKCSogdXRpbHMuYyAoZnB1dHNfZGVtYW5nbGVkKTogIEF2b2lkIGR1cGxpY2F0ZSBwcmludGluZyBpZgoJZGVtYW5nbGluZyBpcyBvZmYuICAoRml4IGZyb20gSi5ULiBDb25rbGluIDxqdGNAY2F5ZW5uZS5jb20+LikKCgkqIGluZnJ1bi5jIChwcm9jZWVkKTogIENhc3QgLTEgdG8gKENPUkVfQUREUikgYmVmb3JlIGNvbXBhcmluZy4KCShGaXggZnJvbSBwaWVycmVAbGEudGNlLmNvbSAoUGllcnJlIFdpbGxhcmQpLikKCgkqIG1haW4uYyAoY2F0Y2hfZXJyb3JzKTogIENoYW5nZSBhcmd1bWVudCB0byBhIGNoYXIgKiBmcm9tIGFuIGludCwKCXNpbmNlIGEgY2hhciAqIGNhbiBwb2ludCB0byBhIHN0cnVjdCBmdWxsIG9mIGdsb3AsIGJ1dCBhbiBpbnQKCWlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGFibGUgdG8gaG9sZCBhIHBvaW50ZXIuCgkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9jb25kX2V2YWwsIGJwc3RhdF9zdG9wX3N0YXR1cywKCWJyZWFrcG9pbnRfcmVfc2V0X29uZSwgYnJlYWtwb2ludF9yZV9zZXQpOiAgQWRhcHQuCgkqIGNvcmUuYyAoY29yZV9vcGVuLCBzb2xpYl9hZGRfc3R1Yik6ICBBZGFwdC4KCSogcmVtb3RlLXZ4LmMgKHN5bWJvbF9zdHViLCBhZGRfc3ltYm9sX3N0dWIsIGNhbGxlcnMpOiAgQWRhcHQuCgpXZWQgQXVnIDI4IDE4OjE4OjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIFZFUlNJT04gdG8gNC4wLjEuICBFdmFkZSBHTlUgTWFrZSBidWcKCWJ5IGFkZGluZyAuTk9FWFBPUlQgdGFyZ2V0LgoKRnJpIEF1ZyAyMyAxNzoxNDoyNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBHREItNC4wIHJlbGVhc2UhCgkqIFVwZGF0ZSBSRUFETUUuCgkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFJvbGwgdG8gNC4wLgoJKGdkYi50YXIuWik6ICBNYWtlIHJlZmNhcmQucHMgYXMgd2VsbCwgZm9yIHNoaXBtZW50LgoKRnJpIEF1ZyAyMyAxNDowNzowOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGRvYy9nZGIudGV4aW5mbzogbWlub3IgcmV3b3JkaW5ncywgY3Jvc3NyZWYgdG8gcHR5cGUgZnJvbSBwcmludCwKCW1vcmUgb24gcHJpbnRzeW1zLiAKCgkqIGRvYy9NYWtlZmlsZSwgTWFrZWZpbGUuaW46IGdlbmVyYXRlICJnZGItYWxsLnRleGkiIHJhdGhlciB0aGFuCgkiZ2RiLWFsbC50ZXhpbmZvIiAKCgkqIGRvYy9yZGwtYXBwcy50ZXhpOiByZW5hbWVkIGZyb20gcmRsLWFwcHMudGV4aW5mbwoKCSogTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZSwgZG9jL2dkYi50ZXhpbmZvOgoJcmVmbGVjdCBhYm92ZSBuYW1lIGNoYW5nZQoKCSogV0hBVFMuTkVXOiBjb3JyZWN0IHBvaW50ZXIgdG8gcmVmY2FyZC4KCgkqIGRvYy9nZGIudGV4aW5mbzogdXBkYXRlIE5ldyBGZWF0dXJlcywgSW5zdGFsbGluZwoKCSogZG9jL2dkYmludC50ZXhpbmZvOiBhZGQgc2hvcnQgZGVzY3JpcHRpb24gb2YgY29uZmlndXJlICt0ZW1wbGF0ZQoKRnJpIEF1ZyAyMyAxMTo0NjowOCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGRvYy9nZGIudGV4aW5mbzogdXBkYXRlLCBmaXggYnVncyBpbiAiSW5zdGFsbGluZyIgYXBwZW5kaXgKCkZyaSBBdWcgMjMgMDE6MDI6MDAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogTWFrZWZpbGUuaW46ICBBZGQgY29uZmlnLnN1YiwgbWFrZSBkb2MvcmRsLWFwcHMudGV4aW5mbyBmb3IKCXRhciBmaWxlLCBhZGQgZGVwZW5kZW5jaWVzIGZvciByZWZlcmVuY2VkIGRvYyBmaWxlcy4KClRodSBBdWcgMjIgMjI6MTc6MDYgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBjb2ZmcmVhZC5jLCBzeW1maWxlLmMsIHN0YWNrLmM6ICBzYWJlcml6ZWQuCgpUaHUgQXVnIDIyIDE2OjIwOjI3IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogZG9jL3JlZmNhcmQudGV4OiBwZXJtdXRlZCBFc3NlbnRpYWwgQ29tbWFuZHMgc2VjCgoJKiBkb2MvZ2RiLnRleGluZm86IG5ldyBDKysgY2hhcHRlcjsgcmV2aXNlZCBpbnN0YWxsYXRpb24gYXBwZW5kaXg7CgluZXcgZG9jIGZvcgoJCXNldC9zaG93IHN5bWJvbC1yZWxvYWRpbmcKCQlkZWZhdWx0IHNldCBjb21wbGFpbnRzIDAKCQlpbmZvIGFsbC1yZWdpc3RlcnMKCQlSRVQtcmVwZWF0IGRpc2FibGVkIGFmdGVyIHByb21wdGVkIGxvbmcgZGlzcGxheXMKCQlwcm9jZXNzSUQgKGF0dGFjaCkgaW50ZXJwcmV0YXRpb24gb2YgMm5kIEdEQiBjbWRsaW5lIGFyZwoKVGh1IEF1ZyAyMiAxNDowNTo0NyAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGV4cHJlYWQueSwgY29mZnJlYWQuYywgZGJ4cmVhZC5jLCB0YXJnZXQuYywgbWVtLWJyZWFrLmMsCgkgIGNwbHVzLWRlbS5jLCB2YWx1ZXMuYywgdmFscHJpbnQuYywgc3ltZmlsZS5jLCByZW1vdGUuYywKCSAgYnJlYWtwb2ludC5jLCBtYWluLmM6ICBsaW50LgoKVGh1IEF1ZyAyMiAwMjowMjoyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJSW5zdGFsbCBuZXcgY29uZmlndXJhdGlvbiBzY2hlbWUgZm9yIEdEQiBhbmQgZnJpZW5kcy4KCgkqIGNvbmZpZy5zdWI6ICBUcmFuc2xhdGUgb3JkaW5hcnkgbmFtZXMgdG8gdGhyZWUtcGFydCBuYW1lcy4KCSogY29uZmlndXJlOiAgVXNlIHRocmVlLXBhcnQgbmFtZXMgaW50ZXJuYWxseS4KCSogY29uZmlndXJlLmluOiAgVHJhbnNsYXRlIHRocmVlLXBhcnQgbmFtZXMgdG8gZmlsZW5hbWVzLgoKCSogUkVBRE1FLCBXSEFUUy5ORVc6ICBVcGRhdGUgZm9yIGdkYi00LjAuCgkqIE1ha2VmaWxlLmluOiAgUm9sbCBWRVJTSU9OIHRvIDMuOTkuCgpXZWQgQXVnIDIxIDE4OjIxOjA5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGluZnB0cmFjZS5jIChLRVJORUxfVV9BRERSX0JTRCk6ICBJbmNsdWRlIGEub3V0LmdudS5oLgoJKiBpOTYwLXRkZXAuYywgbTY4ay10ZGVwLmMsIHNwYXJjLXRkZXAuYywgdG0taTk2MC5oLAoJdG0tbTY4ay5oLCByZW1vdGUtbmluZHkuYzogIENoYW5nZSBleHRfZm9ybWF0X1hYWCBzdHJ1Y3RzCgl0byBzaW5nbGUgc3RydWN0dXJlcyByYXRoZXIgdGhhbiBhcnJheXM7IHdoZW4gcGFzc2luZwoJdGhlaXIgYWRkcmVzcywgdXNlICYuICBUaGlzIGF2b2lkcyB0cm91YmxlIHdpdGggYmRlYWQgY29tcGlsZXJzLgoJKiBtY2hlY2suYzogRG9uJ3QgaW5jbHVkZSA8c3RkbGliLmg+OyBqdXN0IGRlY2xhcmUgInZvaWQgYWJvcnQoKTsiCglpbnN0ZWFkLiAgVGhpcyBhdm9pZHMgcG9ydGFiaWxpdHkgaGVhZGFjaGVzLgoJKiBtaXBzLXRkZXAuYyAobWlwc19kb19yZWdpc3RlcnNfaW5mbyk6ICBPbmx5IHByaW50IEZQIHJlZ3MgaWYKCWFza2VkIHRvLgoJKiBzb3VyY2UuYyAob3Blbl9zb3VyY2VfZmlsZSk6ICBBdm9pZCBBTlNJIGNvbnN0IGJkZWF0aCBieSAKCXNraXBwaW5nIGRlY2xhcmF0aW9uIGFuZCB0aGVuIGNhc3RpbmcgcmVzdWx0IHZhbHVlLgoJKiB0bS1ocDMwMGJzZC5oOiAgQ2xhcmlmeSBjb21tZW50LgoJKiB1dGlscy5jIChzdHJzdHIpOiAgUmVzdWx0IGlzIGNvbnN0IGNoYXIgKjsgQU5TSSBiZGVhdGguCgkqIHhtLWhwMzAwYnNkLmg6ICBEZWZpbmUgSE9TVF9CWVRFX09SREVSLiAgUmVkZWZpbmUgSU5UX01JTiwKCXNpbmNlIHN5c3RlbSBpbmNsdWRlIGZpbGUgZGVmaW5lcyBpdCBkaWZmZXJlbnRseSBmcm9tICJkZWZzLmgiLAoJdGhvdWdoIHRoZSB0d28gYXJlIGVxdWl2YWxlbnQgZm9yIG91ciBwdXJwb3Nlcy4KCSogdGNvbmZpZy9ocDMwMGJzZDogIEFkZCBtNjhrLXRkZXAuby4KClR1ZSBBdWcgMjAgMTY6MDE6MTEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogdGNvbmZpZy9zdW4qNDogIFJlbW92ZSB3YXJuaW5ncyBhYm91dCBzeXN0ZW0gYXNzZW1ibGVyLgoKTW9uIEF1ZyAxOSAxMzo0NDo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBtY2hlY2suYzogIEF2b2lkIHdhcm5pbmcgYWJvdXQgdW5kZWNsYXJlZCBhYm9ydCBmbi4KCSogdG0tc3BhcmMuaCAoUENfQURKVVNUKTogIEF2b2lkIGNhbGxpbmcgZXJyb3IoKSBmcm9tIHRoaXM7CglpdCBjYXVzZXMgcmVjdXJzaXZlIGNhbGxzIHRvIGVycm9yKCkgd2hlbiB1c2VkIGluIGNsZWFudXBzLgoJVG8gZG8gc28gcmVxdWlyZXMgdGhhdCB3ZSBtYWtlIGl0IGEgZnVuY3Rpb24sIHNvIHdlIGRvLgoJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX3BjX2FkanVzdCk6ICBOZXcgaW1wbGVtIG9mIFBDX0FESlVTVC4KCSogdXRpbHMuYyAoZG9fY2xlYW51cHMpOiAgUmVtb3ZlIHRoZSBjdXJyZW50IGNsZWFudXAgZnJvbSB0aGUKCWNoYWluICpiZWZvcmUqIGNhbGxpbmcgaXQsIGluIGNhc2UgZXJyb3IoKSBpcyBjYWxsZWQgZnJvbSBpdC4KCVRoZSByZXN1bHQgd29uJ3QgYmUgcHJldHR5LCBidXQgd29uJ3QgYmUgYW4gaW5maW5pdGUgbG9vcCBlaXRoZXIuCgpNb24gQXVnIDE5IDAwOjQxOjA0IDE5OTEgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBHcm9rIGFub24gc3RydWN0cyBmb3IgQysrLgoJKHZiX25hbWUsIHZwdHJfbmFtZSk6IE51bGwgdGVybWluYXRlIHRoZXNlIHN0cmluZ3MuCgpGcmkgQXVnIDE2IDA4OjMxOjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCglNaW5vciBidWcgZml4ZXMgZnJvbSBCU0QgTmV0MiBnZGI6CgoJKiBibG9ja2ZyYW1lLmMgKGdldF9wcmV2X2ZyYW1lX2luZm8pOiAgSWYgRlJBTUVfQ0hBSU5fQ09NQklORQoJcmV0dXJucyAwLCB0aGVyZSBpcyBubyBwcmV2aW91cyBmcmFtZS4KCSogYnJlYWtwb2ludC5jIChjb21tYW5kc19jb21tYW5kKTogIElmICFmcm9tX3R0eSwgZG9uJ3QgY2FsbAoJaW5wdXRfZnJvbV90ZXJtaW5hbF9wKCkuCgkqIGRieHJlYWQuYyAocmVjb3JkX21pc2NfZnVuY3Rpb24pOiAgU3BlZWQgdXAgc2xpZ2h0bHkuCgkoY29tcGFyZV9wc3ltYm9scyk6ICBEaXR0by4KCSogaW5mY21kLmMgKGRvX3JlZ2lzdGVyc19pbmZvKTogIFRha2UgYSBzZWNvbmQgYXJndW1lbnQgdG8KCWRldGVybWluZSB3aGV0aGVyIHRvIHByaW50IGZsb2F0IHJlZ2lzdGVycy4gICJpbmZvIHJlZ2lzdGVycyIKCWRvZXMgbm90IGRvIHNvIGFueW1vcmUuICAiaW5mbyBhbGwtcmVnaXN0ZXJzIiBkb2VzLCBub3cuCgkqIG1pcHMtdGRlcC5jLCBweXItdGRlcC5jICh4eHhfZG9fcmVnaXN0ZXJzX2luZm8pOiAgVGFrZSBzZWNvbmQKCWFyZyBhbmQgaWdub3JlIGl0LgoJKiB0bS1taXBzLmgsIHRtLXB5ci5oIChET19SRUdJU1RFUlNfSU5GTyk6ICBQYXNzIHNlY29uZCBhcmcuCgkqIGluZmxvdy5jIChpbml0aWFsaXplX2luZmxvdyk6ICBTZXQgdGZsYWdzX291cnMgY29ycmVjdGx5LgoJCglPdGhlciBmaXhlczoKCgkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X2RvX2FjdGlvbnMpOiAgVXNlIGEgY2xlYW51cCB0byByZXN0b3JlCglleGVjdXRpbmdfYnJlYWtwb2ludF9jb21tYW5kcyBpZiB3ZSBhcmUgaW50ZXJydXB0ZWQgYnkgZXJyb3IuCgkqIGNvZmZyZWFkLmMgKGluaXRfbGluZW5vKTogIEF2b2lkIHByb2JsZW0gd2l0aCB6ZXJvLXNpemVkIGxpbmV0YWIKCXZlcnN1cyBtYWxsb2MvZnJlZS4gIEZyb206IGpvaG5AbGFidGFtLmxhYnRhbS5vei5hdSAoSm9obiBDYXJleSkuCgkqIGNvcmUuYyAoc29saWJfYWRkX3N0dWIsIGNvcmVfb3Blbik6ICBDYWxsIFNPTElCX0FERCBpbnNpZGUgYQoJY2F0Y2hfZXJyb3JzKCkgc28gd2UgY2FuIHNldHVwIHRoZSBmcmFtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKCXRoZSBzaGFyZWQgbGlicyB3b3JrLgoJKiBpZWVlLWZsb2F0LmMgKGRvdWJsZV90b19pZWVlX2V4dGVuZGVkKTogIEdldCBleHBvbmVudCBmcm9tCglyaWdodCBwbGFjZSBpbiBsaXR0bGUtZW5kaWFuIHN5c3RlbXMuICBGcm9tIEpvaG4gQ2FyZXkuCgpUaHUgQXVnIDE1IDE4OjQzOjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIG1haW4uYzogUmVtb3ZlIHVudXNlZCB0ZXJtaW5hdGluZ19zaWduYWxzIGFuZCBjYXRjaF90ZXJtaW5hdGlvbigpLgoJKGxvbmdfb3B0aW9ucyk6ICBUZXJtaW5hdGUgd2l0aCBhIHplcm8gZWxlbWVudC4KCVtCdWdmaXggZnJvbSBBdHN1byBLYXdhZ3VjaGkgPGF0c3VvQGhhcms4Ni5oYXJsLmhpdGFjaGkuY28uanA+Ll0KCShnZGJfcmVhZGxpbmUpOiAgTWFrZSBjYWxsLWNvbXBhdGlibGUgd2l0aCByZWFkbGluZS4KCShpbml0X3NpZ25hbHMpOiAgSW1wcm92ZSBjb21tZW50cyByZSB2Zm9yayB2cy4gc2lnbmFsLgoKCSogdXRpbHMuYyAocHJvbXB0X2Zvcl9jb250aW51ZSk6ICBVc2UgbmV3IGdkYl9yZWFkbGluZSgpLgoJSWYgd2UgcHJvbXB0IGZvciBjb250aW51YXRpb24sIHdlIGRvbid0IGxldCBDUiByZXBlYXQgdGhlIHByZXZpb3VzCgljb21tYW5kLCBvbmNlIHdlIGdldCBiYWNrIHRvIGEgcHJvbXB0LiAgSXQncyB0b28gZWFzeSB0byBrZWVwCgloaXR0aW5nIENSLCBleHBlY3RpbmcgIi0tbW9yZS0tIiBwcm9tcHRzLCBhbmQgaGF2ZSBzb21lIGxvbmcKCWNvbW1hbmQgc3RhcnQgcmVwZWF0aW5nIG9uIHlvdS4KClR1ZSBBdWcgMTMgMTY6MTc6NTYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogYmxvY2tmcmFtZS5jIChmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUpOiAgU3BlZWQgdXAgYnkKCWNhbGxpbmcgU0tJUF9QUk9MT0dVRV9GUkFNRUxFU1NfUCBpZiBpdCdzIGRlZmluZWQuCgkqIHRtLXNwYXJjLmggKFNLSVBfUFJPTE9HVUUsIFNLSVBfUFJPTE9HVUVfRlJBTUVMRVNTX1ApOgoJRGVmaW5lIHR3byB2YXJpYW50cywgb25lIGZhc3Rlci4KCSogc3BhcmMtdGRlcC5jIChzcGFyY19mcmFtZV9jaGFpbik6ICBVc2UgdGFyZ2V0X3JlYWRfbWVtb3J5CglhbmQgcmV0dXJuIHplcm8sIHJhdGhlciB0aGFuIGdpdmluZyBhbiBlcnJvci4KCShzZXR1cF9hcmJpdHJhcnlfZnJhbWUpOiAgSW5pdGlhbGl6ZSB0aGUgUEMgaW4gdGhlIG5ldyBmcmFtZS4KCShza2lwX3Byb2xvZ3VlKTogIEFkZCBhIHNlY29uZCBhcmcgc2F5aW5nIHdoZXRoZXIgd2UncmUganVzdAoJY2hlY2tpbmcgZm9yIGEgZnJhbWVsZXNzIGZ1bmN0aW9uIG9yIG5vdC4KCgkqIGNvcmUuYyAoY29yZV9vcGVuLCBjb3JlX2Nsb3NlLCBjb3JlX3hmZXJfbWVtb3J5KTogIE1vdmUKCXNlY3Rpb24gdGFibGUgcG9pbnRlcnMgYW5kIGJmZCogaW50byB0aGUgdGFyZ2V0X29wcy4KCShjb3JlX29wZW4pOiAgQWxsb3cgZXJyb3JzIGluIHNoYXJlZCBsaWIgcmVhZGluZywgZXRjLgoJKGNvcmVfZmlsZXNfaW5mbyk6ICBEZXNjcmliZSBzaGFyZWQgbGlicmFyeSBzZWN0aW9ucy4KCgkqIGV4ZWMuYyAoZXhlY19vcGVuLCBleGVjX2Nsb3NlLCBleGVjX3hmZXJfbWVtb3J5LCB4ZmVyX21lbW9yeSwKCWV4ZWNfZmlsZXNfaW5mbywgc2V0X3NlY3Rpb25fY29tbWFuZCk6ICBNb3ZlIHNlY3Rpb24gdGFibGUKCXBvaW50ZXJzIGFuZCBiZmQqIGludG8gdGhlIHRhcmdldF9vcHMuCgkoYWRkX3RvX3NlY3Rpb25fdGFibGUpOiAgQWRkIEJGRCB0byBzZWN0aW9uIHRhYmxlLgoKCSogdGFyZ2V0LmMgKHRhcmdldF94ZmVyX21lbW9yeSwgdGFyZ2V0X2luZm8pOiAgUGFzcyB0YXJnZXQgdG8KCXhmZXJfbWVtb3J5IGFuZCB0YXJnZXRfaW5mbyBmdW5jdGlvbnMuCgkqIHRhcmdldC5oOiAgICcnCgoJKiBnZGJjb3JlLmg6ICBNb3ZlIHN0cnVjdCBzZWN0aW9uX3RhYmxlLgoJKiB0YXJnZXQuaDogIE5ldyBob21lIG9mIHN0cnVjdCBzZWN0aW9uX3RhYmxlLgoKCSogc29saWIuYyAoc29saWJfYWRkKTogIE5ldyBhcmd1bWVudCBpcyB0aGUgdGFyZ2V0X29wcyB3aG9zZQoJc2VjdGlvbiBsaXN0IGlzIHRvIGJlIGFkZGVkIHRvLCBpZiBhbnkuICBSZWFsbG9jYXRlIHRoZQoJc2VjdGlvbnMgaW4gdGhhdCB0YXJnZXQgdG8gYWRkIGFueSB0aGF0IGNvbWUgZnJvbSBzaGFyZWQgbGlicy4KCSh0aHJvdWdob3V0KSBzb19zZWN0aW9ucyByZW5hbWVkIHRvIHNlY3Rpb25zLgoJKHNvbGliX3hmZXJfbWVtb3J5KTogIERlbGV0ZWQuCgkqIHRtLXN1bm9zLmggKFNPTElCX0FERCk6ICBBZGQgdGFyZ2V0IGFyZ3VtZW50LgoJKFNPTElCX1hGRVJfTUVNT1JZKTogIERlbGV0ZS4KCgkqIGNvcmUuYywgZXhlYy5jLCBpbmZ0YXJnLmMsIHJlbW90ZS1lYi5jLCByZW1vdGUtbmluZHkuYywKCXJlbW90ZS12eC5jLCByZW1vdGUuYywgdGFyZ2V0LmMsIHRhcmdldC5oOiAgUmVtb3ZlIGFkZF9zeW1zIHZlY3RvcgoJZnJvbSB0YXJnZXRfb3BzLiAgSXQncyB0aGUgc2FtZSBvbiBhbGwgdGFyZ2V0cy4gIEFkZCB0d28gc2VjdGlvbgoJcG9pbnRlcnMgdG8gdGFyZ2V0X29wcy4KCgkqIHN0YWNrLmMgKGZpbmRfcmVsYXRpdmVfZnJhbWUpOiAgRHVtcCBhbmNpZW50IGFsZ29yaXRobSBmb3IKCSJkb3duIiwganVzdCB1c2UgaGFuZHkgIm5leHQiIHBvaW50ZXJzLgoJKGZyYW1lX2NvbW1hbmQpOiAgRG9uJ3QgZXJyb3IgaWYgdGhlcmUgaXMgbm8gc3RhY2s7IGxldCB1c2VyCglzZXQgb25lLgoKCSogaW5mbG93LmMgKG5ld190dHlfcHJlZm9yaywgbmV3X3R0eSk6ICBOZXcgcHJlZm9yayByb3V0aW5lCgltb2RpZmllcyBzdGF0aWMgc3RhdGUgaW4gdGhlIHBhcmVudCBwcm9jZXNzOyBuZXdfdHR5IGl0c2VsZgoJcnVucyBpbiB0aGUgY2hpbGQgYW5kIG1vZGlmaWVzIHRoZSBjaGlsZCdzIGZpbGUgZGVzY3JpcHRvcnMKCXRvIG1hdGNoIHRoZSBzYXZlZCBzdGF0aWMgc3RhdGUuCgkqIGluZnJ1bi5jIChjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiAgQ2FsbCBuZXdfdHR5X3ByZWZvcmssCglmb3JrLCB0aGVuIG5ld190dHkuCgoJKiBpbmZwdHJhY2UuYyAoY2hpbGRfeGZlcl9tZW1vcnkpOiAgQWRkIGlnbm9yZWQgdGFyZ2V0IGFyZy4KCSogcmVtb3RlLWViLmMgKGViX3hmZXJfaW5mZXJpb3JfbWVtb3J5KTogICcnCgkqIHJlbW90ZS1uaW5keS5jIChuaW5keV94ZmVyX2luZmVyaW9yX21lbW9yeSk6ICAnJwoJKiByZW1vdGUtdnguYyAodnhfeGZlcl9tZW1vcnkpOiAgICAnJwoJKiByZW1vdGUuYyAocmVtb3RlX3hmZXJfbWVtb3J5KTogICAnJy4gIFJlbmFtZSBmcm9tCglyZW1vdGVfeGZlcl9pbmZlcmlvcl9tZW1vcnkuCgoJKiBtYWluLmMgKG1haW4pOiAgT25seSB0cnkgdG8gYXR0YWNoICJjb3JlZmlsZSIgYXJndW1lbnQgaWYKCWl0IHN0YXJ0cyB3aXRoIGEgZGlnaXQuCgoJKiBzeW1maWxlLmMgKHN5bWJvbF9yZWxvYWRpbmcpOiAgTmV3ICJzZXQvc2hvdyIgdmFyaWFibGUuCgkoc3ltYm9sX2ZpbGVfYWRkKTogIFNob3J0ZW4gbWVzc2FnZSBhYm91dCBzeW1ib2wgcmVhZGluZy4KCShhZGRfc3ltYm9sX2ZpbGVfY29tbWFuZCk6ICBNZXJnZSB3aXRoIGFkZF9zeW1zX2FkZHJfY29tbWFuZCwKCXNpbmNlIHRoaXMgc2hvdWxkIHdvcmsgb24gYWxsIHRhcmdldHMgbm93LgoJKHN0b3Bfd2hpbmluZyk6ICBEZWZhdWx0IHRvIHplcm8sIHRvIHNodXQgdXAgY29tcGxhaW50cwoJYWJvdXQgYmFkIHN5bWJvbCB0YWJsZXMgb24gbWFueSBzeXN0ZW1zLgoJKGZyZWVfbmFtZWRfc3ltdGFicyk6ICBKdXN0IGV4aXQgdW5sZXNzIHN5bWJvbF9yZWxvYWRpbmcuCgoJKiB4bS1zdW4zb3M0LmgsIHhtLXN1bjRvczQuaDogIERlZmluZSBCUk9LRU5fTEFSR0VfQUxMT0NBLAoJYW5kIGFkZCBjb21tZW50IGV4cGxhaW5pbmcgc2hhcmVkIGxpYnJhcnkgc2NyZXcuCgoJKiBzb3VyY2UuYzogICNpZiBkZWZpbmVkID0+ICNpZmRlZi4KClRodSBBdWcgIDggMTI6MjM6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogZG9jL2dkYmludC50ZXhpbmZvOiAgSW1wcm92ZSBkb2Mgb24gcG9ydGluZyB0byBuZXcgT1Mncy4KClR1ZSBBdWcgIDYgMTc6MTY6MTUgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBkb2MvcmRsLWFwcHMudGV4aW5mbzogcHJvdmlkZSBkZWZhdWx0IHJlYWRsaW5lLWFwcGVuZGl4IGZpbmRlcgoJKGRvYy9NYWtlZmlsZSBrbm93cyBob3cgdG8gbWFrZSBvbmUgZm9yIGxvY2FsIGNvbmZpZykKCgkqIE1ha2VmaWxlLmluOiB1c2UgZG9jL01ha2VmaWxlIGZvciBkb2MgdGFyZ2V0cwoKCSogZG9jL01ha2VmaWxlOiBHREIgZG9jdW1lbnRhdGlvbiBub3cgaGFzIGl0cyBvd24gTWFrZWZpbGUKCSAgZG9jL3JlZmNhcmQudGV4OiByZW5hbWVkIGZyb20gImdkYnJjLnRleCIKCSAgZG9jL2dkYmludC50ZXhpbmZvOiBhZGQgbWFya3VwIGluICJDbGVhbnVwcyIgY2hhcHRlcgoKCkZyaSBBdWcgIDIgMDA6MTM6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogdmFsdWVzLmMgKGJhc2VjbGFzc19hZGRyKTogIFdoZW4gcmVhZGluZyB0YXJnZXQgbWVtb3J5LCB1c2UgdGhlCglsZW5ndGggb2YgdGhlIGJhc2V0eXBlLCBub3QgdGhlIHVwcGVyIHR5cGUuICBXZSd2ZSBvbmx5IG1hbGxvYydkCgllbm91Z2ggc3BhY2UgZm9yIHRoZSBiYXNldHlwZSwgbGVhZGluZyB0byBlcnJvcnMgaW4gZnJlZSgpLgoKCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIFByaW50IFVOT1BfTUVNVkFMIG9mIGFuIE9QX0xPTkcgdGhhdAoJZW5kcyB1cCBhcyBhIGZ1bmN0aW9uIHNwZWNpYWxseSwgc2luY2Ugd2Uga25vdyB0aGUgYWN0dWFsIHR5cGUgb2YKCXRoZSBwb2ludGVkLXRvIGFkZHJlc3MuICBUaGlzIChzb21ld2hhdCkgZml4ZXMgZGlzcGxheSBvZgoJZXhwcmVzc2lvbnMgdGhhdCBpbmNsdWRlIG1pc2NfZnVuY3Rpb25fdmVjdG9yIG5hbWVzLiAgVHJ5IGBjb25kIDEKCSFzdHJjbXAoImEiLCJiIiknIHRoZW4gYGkgYicuCgoJKiBpbmZydW4uYzogIE1vdmUgRE9fREVGRVJSRURfU1RPUkVTIGZyb20gcHJvY2VlZCgpIHRvIHJlc3VtZSgpLgoJVGhlIGNoaWxkIGNhbiBiZSBwcm9jZWVkZWQgZnJvbSBpbnNpZGUgd2FpdF9mb3JfaW5mZXJpb3IgaW4KCWV2YWx1YXRpbmcgYnJlYWtwb2ludCBjb25kaXRpb25zLCBhbmQgRE9fREVGRVJSRURfU1RPUkVTIHdhcwoJZ2V0dGluZyBza2lwcGVkIGluIHRoYXQgY2FzZS4KCgkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBVc2UgZmlsdGVyZWQgb3V0cHV0LCBzaW5jZSB0aGUKCXN1YnJvdXRpbmVzIHdlIGNhbGwgdXNlIGl0LCBvdGhlcndpc2UgdGhlIG91dHB1dCBpcyBob3JyaWJseQoJbWFuZ2xlZCwgc2luY2Ugb3V0cHV0IG9mIHdyYXBwYWJsZSBzdHVmZiBjb21lcyBvdXQgbGF0ZS4KCgkqIE1ha2VmaWxlLmluOiAgQnVtcCBWRVJTSU9OIHRvIDMuOTguMQoKCSogaW5mcnVuLmMgKGNoaWxkX2NyZWF0ZV9wcm9jZXNzKTogIFVzZSBleGVjbHAgdG8gZmluZCB0aGUKCXNoZWxsIHRvIGV4ZWMgb3VyIHRhcmdldCBwcm9ncmFtLiAgVGhpcyByZXF1aXJlcyBzb21lIGZpZGRsaW5nCgl3aXRoIGBlbnZpcm9uJyBzaW5jZSB0aGVyZSBpcyBubyBleGVjbHBlKCkuCgpUaHUgQXVnICAxIDE1OjM1OjE3IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGZvd2FudG9uLmN5Z251cy5jb20pCgoJKiBNYWtlZmlsZS5pbiwgZG9jL2dkYnJjLnRleCwgZG9jL3JjLSogKG5ldyBmaWxlcyk6CglNaW5vciByZWFycmFuZ2VtZW50IG9mIHJlZmNhcmQgcGVybWl0cyB0d28gbmV3IG1ha2UgdGFyZ2V0cy0tCglnZGJyYy5kdmkJICAgIERWSSBvdXRwdXQgZm9yIHJlZmNhcmQsIHVzaW5nIENNIGZvbnRzCglnZGJyYy5wcwkgICAgUG9zdFNjcmlwdCByZWZjYXJkLCB1c2luZyBQUyBmb250cwoKV2VkIEp1bCAzMSAxNjo0NjoyMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBHREItMy45OCByZWxlYXNlLgoKCSogVE9ETywgUHJvamVjdHMsIFdIQVRTLk5FVywgUkVBRE1FOiAgVXBkYXRlIGZvciBnZGItMy45OC4KCSogTWFrZWZpbGUuaW4gKGdkYi1hbGwudGV4aW5mbyk6ICBBdm9pZCB0b3VjaGluZyBmaWxlIGlmIE00IGRpZXMuCgpXZWQgSnVsIDMxIDE2OjM1OjU4IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogZG9jL2dkYi50ZXhpbmZvOiBsYXN0IGNoYW5nZXMgZm9yIHJlbGVhc2UuCglNaW5vciB0eXBvIGFuZCBmb3JtYXR0aW5nIGZpeGVzOyBpbmNvcnBvcmF0ZWQgbW9zdCBmaXhlcyByZW1haW5pbmcgZnJvbQoJZmlsZWQgbWFpbCBjb21tZW50aW5nIG9uIGVhcmxpZXIgZHJhZnRzLgoKCUFkZGVkIHdhcm5pbmdzOiBwaXBlcyBkb24ndCB3b3JrIGluIHJ1biBjb21tYW5kOwoJICAgICAgICBjb25kaXRpb25zIGFyZSBjb252ZXJzZSBvZiBhc3NlcnRpb25zOwoJICAgICAgCXN0ZXAgb3ZlciBmbiB3aXRob3V0IGRlYnVnIGluZm8gZ29lcyB0byBuZXh0IGZuOwoJCXZhcnMgbWF5IGhhdmUgIndyb25nIiB2YWx1ZXMgbmVhciBmbiBlbnRyYW5jZSwgZXhpdAoKCUFkZGVkIGV4YW1wbGUgZnJvbSBLaW5nc3RvbiBvbiBwcmludGluZyByZXBlYXRlZCBub25hZGphY2VudCB2YWx1ZXMKCglBZGRlZCBleHBsaWNpdCBtZW50aW9uIHRoYXQgaW4gRW1hY3MgZ2RiIG1vZGUgQy1jIGFuZCBDLXogYXJlIGxpa2UKCXNoZWxsIG1vZGUgZm9yIHNpZ25hbHMKCglSZW5hbWVkICJTdGVwcGluZyBhbmQgQ29udGludWluZyIgdG8gIkNvbnRpbnVpbmcgYW5kIFN0ZXBwaW5nIiBzbyBpdAoJZG9lc24ndCBzb3VuZCBzbyBtdWNoIGxpa2UgaXRzIHBhcmVudCAiU3RvcHBpbmcgYW5kIENvbnRpbnVpbmciOyBhbHNvCgltb3ZlZCBlbnRyaWVzIG9uIGNvbnRpbnVlIHRvIHRvcCBvZiBzZWN0aW9uLCBzbyB0aGV5IGRvbid0IGdldCBsb3N0LgoKCUltcHJvdmVkIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGFwcGVuZGl4LCBhZGRlZCBtYW51YWwgZm9ybWF0dGluZwoJaW5zdHJ1Y3Rpb25zIAoKVHVlIEp1bCAzMCAxNzoyNjozOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBjb25maWd1cmUuaW46ICBSZW1vdmUgeG0uaCBhbmQgdG0uaCBldmVuIGlmIHdlIGFyZW4ndCBsaW5raW5nCgluZXcgb25lcywgc28gIi4vY29uZmlndXJlIHN1bjQ7IC4vY29uZmlndXJlIG5vbmUiIGRvZXMgdGhlIHJpZ2h0Cgl0aGluZy4gIEFzc3VtZSB0aGF0IGFsbGRlcHMubWFrIGFuZCBkZXBlbmQgYXJlIGFscmVhZHkgYnVpbHQgaW4KCXNyY2RpciwgYW5kIGF2b2lkIHJ1bm5pbmcgIm1ha2UiIChwYXJ0aWN1bGFybHkgIm1ha2UgZGVwZW5kIiwKCXdoaWNoIGludm9sdmVzICJnY2MiKSBmcm9tIGluc2lkZSBjb25maWd1cmUuICBCdWlsZCBNYWtlZmlsZQoJZGlyZWN0bHkgcmF0aGVyIHRoYW4gYnVpbGRpbmcgTWFrZWZpbGUuY29uZiBmaXJzdC4KCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB3aXRoIGFib3ZlIGNoYW5nZXMuCgkqIE1ha2VmaWxlLmluOiAgVXNlICQoQklTT04pIHRvIGZpbmQgYmlzb24uICBSb2xsIFZFUlNJT04KCXRvIDMuOTguICBSZXZpc2UgZ2RiLnRhci5aIHByb2NlZHVyZSB0byBwcm9kdWNlIGEgZmlsZQoJY2FsbGVkIGdkYi0kKFZFUlNJT04pLnRhci5aIGJ1dCB3aGljaCB1bnBhY2tzIGludG8gYQoJZGlyZWN0b3J5IGNhbGxlZCAiZ2RiIi4gIE1vdmUgbm9uLXNvdXJjZSBmaWxlcyBvdXQgb2YKCSQoU0ZJTEVTX1NVQkRJUikuICBQcmV0dHkgdXAgYWxsZGVwcy5tYWsgd2l0aCBjb21tZW50cy4KCShkZXBlbmQpOiAgRG9uJ3QgdHJ5IHRvIGRvICJnY2MgZXhwcmVhZC55Ii4KCShleHByZWFkLm8pOiAgVXBkYXRlIGRlcGVuZGVuY2llcyBieSBoYW5kLgoKTW9uIEp1bCAyOSAxNToyMTowOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGRvYy9nZGIudGV4aW5mbzoKCUZpeGVkIGEgdmFyaWV0eSBvZiBzbWFsbCB0eXBvcyB0aGF0IHByZXZlbnRlZCBpbmZvIGZyb20gZm9ybWF0dGluZwoJY2xlYW5seTsgYWx0ZXJlZCB0b28tbG9uZyBoZWFkaW5nIGZvciBHUEwgQXBwZW5kaXgsIGFzIGRpc2N1c3NlZAoJdy9STVM7IENoYW5nZWQgZGF0ZSBvbiBjb3ZlciB0byBKdWx5IDkxLgoKRnJpIEp1bCAyNiAxMzoyMDowMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGRvYy9nZGIudGV4aW5mbzoKCSgxKSBBcHBsaWVkIHNvbWUgZml4ZXMgZHVlIHRvIGNvbW1lbnRzIGZyb20gTGFycnkgQnJlZWQgKGVhc2llciBvbmVzCgl0aHJvdWdoIGNoYXBzZWMgNS4yKQoJKDIpIEVsaW1pbmF0ZWQgdXNlIG9mIEBmb290bm90ZS0tLWhhZCBteSBkb3VidHMgYWJvdXQgaXQgYW55d2F5cywgYW5kCglpdCdzIGJyb2tlbiBpbiBsYXRlc3QgdGV4aW5mbwoJKDMpIEludHJvZHVjZWQgKnNvbWUqIHVzZSBvZiBbXSBmb3Igb3B0aW9uYWwgYXJndW1lbnRzLCB3aGVyZQoJZXhwbGFuYXRpb24gaXMgbm90IHNpbXBsZXIgYnkgbGlzdGluZyBjbWQgdyBhcmcgYW5kIGNtZCB3L291dCBhcmcKCXNlcGFyYXRlbHkuICBTdGlsbCBub3QgdXNpbmcgQGRlZmZuLgoJKDQpIERyb3BwZWQgaW4gR1BMLTIuICBOT1RFOiBvbmUgb2YgR1BMLTIgb3IgdGV4aW5mbyBpcyBicm9rZW47IGEKCWNvdXBsZSBvZiBoZWFkaW5ncyBhcmUgdG9vIGxvbmcuICBOZWVkIHBhdGNoZXMgdG8gdGV4aW5mbyBvciByZXZpc2lvbgoJdG8gR1BMLTIuCgoJKiBQYXJ0aWFsIHVwZGF0ZSB0byBSRUFETUUgKHdoaWNoIHN0aWxsIG5lZWRzIHdvcmsgZm9yIHRoaXMKCXJlbGVhc2UhKTogKDEpIHVzZSBvZiBjb25maWd1cmUgY29ycmVjdGVkIGZvciBuZXcgc2NyaXB0LCAKICAgICAgICAgICAgICAgICAgICgyKSAibWFrZSBnZGIuZHZpIiBhbmQgIm1ha2UgZ2RiLmluZm8iIG1lbnRpb25lZC4KCldlZCBKdWwgMjQgMDY6NDQ6MDIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wpOiAgRG9uJ3QgY29tcGxhaW4gcmlnaHQgb2ZmIGFib3V0CglubyBkZWJ1ZyBzeW1ib2xzOyB1c2UgdGhlIG1pc2MgZnVuY3Rpb24gdmVjdG9yIGZpcnN0LgoJKGxpc3Rfc3ltYm9scyk6ICBVc2UgbWlzYyBmdW5jdGlvbiB2ZWN0b3IgdG8gZmluZCBzeW1ib2xzCgl0aGF0IGRvbid0IGhhdmUgZGVidWcgaW5mbywgYW5kIHByaW50IHRoZW0uCgkoZmluZF9wY19zeW10YWIpOiAgVGVtcG9yYXJpbHkgYXZvaWQgZmF0YWwoKSB3aGVuIHBzeW10YWIKCVBDIHJhbmdlIGRvZXNuJ3QgbWF0Y2ggc3ltdGFiIFBDIHJhbmdlLCBhcyBpdCBkb2VzIG9uIHRoZSAKCU1JUFMgYmVjYXVzZSBvdXIgc3ltdGFiIHJlYWRpbmcgaXNuJ3QgcGVyZmVjdC4KCgkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfcmVhZCk6ICBNYWtlIHdhcm5pbmcgYWJvdXQKCSJubyBkZWJ1ZyBzeW1ib2xzIiBzbGlnaHRseSBuaWNlci4KCgkqIHNvdXJjZS5jIChzZWxlY3Rfc291cmNlX3N5bXRhYik6ICBJZiAibWFpbiIgc3ltYm9sIGV4aXN0cywKCWJ1dCBkZWNvZGVfbGluZV9zcGVjIGNhbid0IGZpbmQgbGluZSBpbmZvLCBkb24ndCBqdXN0IHJldHVybgoJYSB6ZXJvOyB0cnkgb3RoZXIgc291cmNlIHN5bXRhYnMgb3IgZ2l2ZSBhbiBlcnJvci4KCgkqIG1pcHNyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBTb3J0IHRoZSBwc3ltdGFicyBieQoJdGhlaXIgbG93IGFkZHJlc3NlcyBmaXJzdCwgdGhlbiByaXAgdGhyb3VnaCBmaXhpbmcgaGlnaCBhZGRycy4KCgkqIG5zMzJrLW9wY29kZS5oIChzZnNyKTogIEJ1Z2ZpeCBmcm9tIFJ1bmUgTmVyZ31yZCwKCTxydW5lbmVAaWZpLnVpby5ubz4uCgkoTlMzMktfU1ZDX0lNTUVEX09QRVJBTkRTKTogIFJldmVyc2UgdGhlICNpZm5kZWYuCgpUdWUgSnVsIDIzIDE4OjUyOjQzIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogTWlub3IsIG1vc3RseSBtZWNoYW5pY2FsLCBjbGVhbnVwIG9mIGRvYyBzdWJkaXIgZm9yIGNsZWFuIAoJbWFrZWluZm8naW5nIGFuZCBUZVhpbmc7IGFsc28gZW5zdXJlZCBnZGItYWxsLnRleGluZm8gKHBvc3QtbTQpIAoJYW5kIGdkYi5pbmZvIChwb3N0LSB0ZXhpbmZvMiBtYWtlaW5mbykgZ2VuZXJhdGVkIGZvciBkaXN0cmlidXRpb24uCgpTdW4gSnVsIDIxIDAzOjU0OjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCglNb3N0bHkgTUlQUyBhbmQgZ2VuZXJhbCBzeW1ib2wtcmVhZGluZyBmaXh1cHMuCgoJKiBkb2MvZ2RiaW50LnRleGluZm86ICBBZGQgZG9jdW1lbnRhdGlvbiBvbiBzeW1ib2wtcmVhZGluZwoJaW50ZXJmYWNlLgoKCSogbWlwc3JlYWQuYzogIFJlbW92ZSBrbHVkZ2VzIGFyb3VuZCAjaW5jbHVkZSAiZWNvZmYuaCIuCglSZW1vdmUgcmVkZWZpbml0aW9ucyBvZiBhX21hZ2ljLCBldGMsIG5vIGxvbmdlciB1c2VkLgoJKHBhcnNlX3N5bWJvbCwgKTogIENvbnZlcnQgIkludGVybmFsOiIgcHJpbnRmcyB0byBjb21wbGFpbigpdHMuCglGaXggZ2xvYmFsIG92ZXJ2aWV3IGNvbW1lbnRzIHRvIG1hdGNoIHN5bWZpbGUuYyBwcm90b2NvbC4KCShtaXBzY29mZl9uZXdfaW5pdCk6ICBFbGltaW5hdGUgY3VyX2hkciBpZiB3ZSBoYXZlIG9uZS4KCShtaXBzY29mZl9zeW1maWxlX3JlYWQpOiAgRWxpbWluYXRlIHVudXNlZCBjb2RlLiAgQXZvaWQKCXNvcnRpbmcgYWxsIHRoZSBzeW10YWJzLCB3aGVuIGFsbCB3ZSBoYXZlIHJlYWQgaGVyZSBpcyBwc3ltdGFicy4KCVRoZSBzeW10YWJzIGFyZSBzb3J0ZWQgYXMgdGhleSBhcmUgY3JlYXRlZCBhbnl3YXkuICBUZWxsCgljb25kZW5zZV9taXNjX2J1bmNoZXMgd2hldGhlciB3ZSdyZSBtYWlubGluZS4KCShwc3ltdGFiX3RvX3N5bXRhYl8xKTogIFBhc3MgZmlsZW5hbWUgd2hlbiByZWN1cnNpbmcsIHRvIG1ha2UKCXN0YWNrIHRyYWNlIG1vcmUgaW5mb3JtYXRpdmUuCgkocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIEFzc3VtZSBjdXJfaGRyIGFzIGFyZ3VtZW50LgoJKHJlYWRfbWlwc19zeW10YWIpOiAgRG9uJ3QgY2xvYmJlciBjdXJfaGRyLCBzbyBpdCBjYW4gYmUgZnJlZWQuCglQYXNzIGN1cl9oZHIgaW1wbGljaXRseSB0byBwYXJzZV9wYXJ0aWFsX3N5bWJvbHMuICBBdm9pZCBjaGVja2luZwoJdGhlIFRZUEVfTkFNRSBvZiBjaGFyICosIHNpbmNlIHRoYXQncyBkb25lIGluIHN5bWZpbGUuYy4KCShmcmVlX251bWFyZ3MsIHBhcnNlX3N5bWJvbCwgYWRkX3N5bWJvbCwgYWRkX2Jsb2NrLAoJc2hyaW5rX2xpbmV0YWJsZSk6ICBEZWNsYXJlIHRoZXNlIGZucyB2b2lkLiAKCSh1cGdyYWRlX3R5cGUpOiAgQ29udmVydCB0cmVlIG9mIGlmJ3MgdG8gc3dpdGNoLiAgQ2xlYW4gdXAKCWJvZ3VzICJvZmYgPT0gMCIgaGFuZGxpbmcgd2l0aCBhIGNvbXBsYWludC4gIEF2b2lkIHNldHRpbmcKCWZpZWxkIGJpdHBvcyBhbmQgYml0c2l6ZSBvZiBhcnJheSB3aXRoIGxvd2VyIGFuZCB1cHBlciBib3VuZHMuCglDaGVjayBzcGVjaWZpZWQgYml0c2l6ZSBvZiBlbGVtZW50cyBhZ2FpbnN0IHRoZWlyIGFjdHVhbCB0eXBlJ3MKCWJpdHNpemUsIGFuZCBjb21wbGFpbiBpZiBkaWZmZXJlbnQuICBDb21wbGFpbiBhYm91dCB1bmtub3duIAoJdHlwZSBxdWFsaWZpZXJzLgoJKHBhcnNlX2Zkcik6ICBEb24ndCBhc3N1bWUgc2l6ZW9mKGNoYXIgKikgPT0gc2l6ZW9mIChzdHJ1Y3QgKikuCgkocHN5bXRhYl90b19zeW10YWJfMSk6ICBQcmludCBuYW1lcyBvZiBzdWJzaWRpYXJ5IGZpbGVzIHRoYXQKCWFyZSBiZWluZyByZWFkIGluLiAgRklYTUUsIHdlIHJlYWQgZmFyIHRvbyBtYW55IGZpbGVzLiAgVGhpcyBjb2RlCglpcyBub3QgdGhlIHByb2JsZW0sIHRoZSBwcm9ibGVtIGlzIGluIHBhcnNlX2ZkciB3aGVyZSB0aGUgcHN5bXRhYnMKCWFyZSBzZXQgdXAuCgkoY3Jvc3NfcmVmKTogIFJlc3VsdCBzaG91bGQgaW5kaWNhdGUgdGhhdCB3ZSB1c2VkIG9uZSBhdXggZW50cnkKCW5vcm1hbGx5LCBvciB0d28gaWYgd2UgZW5jb3VudGVyZWQgYSAibmV4dCIgZW50cnkuICBUaGlzIHVzZWQKCXRvIGxlYXZlIHRoZSBjYWxsZXIgcG9pbnRpbmcgYXQgdGhlIHdyb25nIGF1eCBlbnRyeS4KCShhZGRfc3ltYm9sKTogIElmIG92ZXJmbG93ZWQgY3VyX2Jsb2NrLCByZWFsbG9jYXRlIGl0IGxhcmdlciwKCWNoYXNlIGFsbCBwb2ludGVycyB0byBpdCwgYW5kIGNvbXBsYWluKCksIHJhdGhlciB0aGFuIGNsb2JiZXIgbWVtb3J5LgoJKHNocmlua19ibG9jayk6ICBVc2UgeHJlYWxsb2MgcmF0aGVyIHRoYW4geG1hbGxvYy1hbmQtY29weS4KCShuZXdfZmllbGQpOiAgT25seSBhbGxvY2F0ZSBvbmUgZmllbGQgaW5pdGlhbGx5LCBub3QgdHdvLgoJUHVsbCArKyBvdXQgb2YgbWFjcm8gYXJndW1lbnQuICBTaW1wbGlmeS4KCShfaW5pdGlhbGl6ZV9taXBzcmVhZCk6ICBBdm9pZCBpbml0aWFsaXphdGlvbiBvZiBpbXBvcnRkCglnbG9iYWxfcHN5bWJvbHMgYW5kIHN0YXRpY19wc3ltYm9scy4gCgoJKiBzeW1maWxlLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogIERlcGVuZCBvbiBYWFhfcHN5bXRhYl90b19zeW10YWIKCXRvIHByb3Blcmx5IHNldCBwc3QtPnN5bXRhYjsgYXZvaWQgc2VhcmNoaW5nIGZvciBpdC4KCShzeW1maWxlX2Zucyk6ICBJbXByb3ZlIGNvbW1lbnRzLCBhZGQgYSBGSVhNRS4KCSogZGJ4cmVhZC5jOiAgVXBkYXRlIGNvbW1lbnRzIHRvIHJlZmxlY3Qgc3ltZmlsZSBwcm90b2NvbC4KCShyZWFkX29maWxlX3N5bXRhYiwgZW5kX3N5bXRhYik6ICBSZXR1cm4gdGhlIHN5bXRhYi4KCShwc3ltdGFiX3RvX3N5bXRhYl8xKTogIFNldCBwc3QtPnN5bXRhYi4KCgkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltZmlsZV9yZWFkKTogIHRlbGwgY29uZGVuc2VfbWlzY19idW5jaGVzCgl3aGV0aGVyIHdlJ3JlIG1haW5saW5lLgoKCSogc3ltZmlsZS5oIChzeW1fZm5zKTogIFJlbW92ZSB1bnVzZWQgc3ltX2Rpc2NhcmQgbWVtYmVyLgoJKiBjb2ZmcmVhZC5jLCBtaXBzcmVhZC5jLCBkYnhyZWFkLmM6ICBSZW1vdmUgWFhYX3N5bWZpbGVfZGlzY2FyZC4KCgkqIG10cmFjZS5jIChtdHJhY2UpOiAgVGFrZSBlZmZlY3QgaWYgbWFsbHdhdGNoIGlzIHNldCwgZXZlbiBpZgoJdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdC4KCSogaW5mY21kLmMgKGZpbmlzaF9jb21tYW5kKTogIFVzZSBmaWx0ZXJlZCBwcmludGZzLgoJKiBjcGx1cy1kZW0uYzogIEFkZCBzdHJ1Y3QgdGFncyB0byBhIGZldyB1bm5hbWVkIHN0cnVjdHMuCgkqIHZhbG9wcy5jICh2YWx1ZV9jb2VyY2VfYXJyYXkpOiAgSW1wcm92ZSBjb21tZW50cy4KCSogdmFscHJpbnQuYyAodHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCk6ICBQcmludCBhcnJheSBzaXplIG9ubHkKCWlmIGdyZWF0ZXIgdGhhbiB6ZXJvLgoJKiBtODhrLXRkZXAuYzogIFNoaWZ0IHNvbWUgbGluZXMgbGVmdCBieSBvbmUgc3BhY2UsIHRoYXQgaGFkCglhcHBhcmVudGx5IGJlZW4gdHJhc2hlZCBhdCBzb21lIHBvaW50LgoJKiBUT0RPOiAgTW9yZSB0aGluZ3MgdG8gZG8sIGEgZmV3IGdvdCBkb25lLgoKVGh1IEp1bCAxOCAyMjo0NjowNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBzeW10YWIuaCAoTE9DX0VYVEVSTkFMKTogIEVsaW1pbmF0ZSBpbiBmYXZvciBvZiBMT0NfU1RBVElDLgoJKGxkc3ltb2ZmLCBsZHN5bWxlbiwgZ2xvYmFsc19vZmZzZXQsIHN0YXRpY3Nfb2Zmc2V0KTogSW1wcm92ZQoJY29tbWVudHMuCgkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogIExPQ19FWFRFUk5BTCAtPiBMT0NfU1RBVElDLgoJKiBleHByZWFkLnksIGZpbmR2YXIuYywgc3ltbWlzYy5jOiAgRGl0dG8uCgkqIHByaW50Y21kLmMgKGFkZHJlc3NfaW5mbyk6ICBVcGRhdGUgcHJpbnRlZCBmb3JtcyBvZiBMT0NfCglzeW1ib2xzLiAgRWxpbSBMT0NfRVhURVJOQUwuICAKCShwcmludF9mcmFtZV9hcmdzKTogIEtlZXAgdHJhY2sgb2YgcGFyYW0gc3RhY2sgb2Zmc2V0cyBiZWZvcmUKCXJlLWxvb2tpbmcgdXAgdG8gZmluZCB0aGUgbG9jYWwgcmVnaXN0ZXIgcGFyYW0gaXMga2VwdCBpbi4KCgkqIG1pcHNyZWFkLmM6ICBVc2UgPHN5bWNvbnN0Lmg+IGFuZCA8c3ltLmg+IHJhdGhlciB0aGFuIDxzeW1zLmg+LgoJRnVydGhlciBpbnRlZ3JhdGlvbiBvZiBtaXBzcmVhZCBpbnRvIGdkYi4gIEVsaW1pbmF0ZSB1bnVzZWQKCXJvdXRpbmVzLCBkdXBsaWNhdGUgZGVjbGFyYXRpb25zLiAgSGFuZGxlIHN0YXRpYyBzeW1ib2xzIGluIAoJcHN5bXRhYnMgYXMgd2VsbCBhcyBleHRlcm5hbCBzeW1ib2xzLiAgV2hlbiByZWFkaW5nIHN5bXRhYnMsCglpbnNlcnQgc3ltYm9scyBpbnRvIHRoZSBjb3JyZWN0IGJsb2NrIChnbG9iYWwsIHN0YXRpYywgb3IgYSBsb2NhbAoJYmxvY2spLgoJKHJlYWRfbWlwc19zeW10YWIsIHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBEb24ndCBwYXNzIHVzZWxlc3MKCSJpbmNyZW1lbnRhbCIgYXJnLgoJKG1pcHNjb2ZmX3N5bWZpbGVfcmVhZCk6ICBEb24ndCBjYWxsIHNlbGVjdF9zb3VyY2Vfc3ltdGFiLgoJKHBhcnNlX3N5bWJvbCk6ICBVc2UgU1lNQk9MX1ZBTFVFX0FERFJFU1Mgd2hlcmUgYXBwcm9wcmlhdGUsCglyYXRoZXIgdGhhbiBTWU1CT0xfVkFMVUUuCgkocGFyc2VfZXh0ZXJuYWwpOiAgQ29tbWVudCBjbG9iYmVyaW5nIG9mIHRvcF9zdGFjay4KCShwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgVXBkYXRlIGNvbW1lbnRzLiAgQWxsb2NhdGUgYW5kIHBhcnNlCglzdGF0aWMgc3ltYm9scyBhcyB3ZWxsIGFzIGV4dGVybmFsIHN5bWJvbHMuICBGSVhNRSwgZW51bSB2YWx1ZXMKCWFyZSBub3QgaGFuZGxlZCBpbiB0aGlzIHBhc3MsIGJ1dCBzaG91bGQgYmUuICBJbmxpbmUgbmV3X3BzeW1ib2wuCglVc2UgU1lNQk9MX1ZBTFVFX0FERFJFU1MuCgkocHN5bXRhYl90b19zeW10YWJfMSk6ICBSZWFkIHN5bWJvbHMgaW50byBnbG9iYWwgc3RhdGljIGJsb2NrCglieSBkZWZhdWx0ICh1bnRpbCBlbnRlciBzb21lIGZ1bmN0aW9uJ3MgbG9jYWwgYmxvY2sgY29udGV4dCkuCgkoc29ydF9ibG9ja3MpOiAgQ2xlYW4gdXAgU1RBVElDX0JMT0NLIGFzIHdlbGwgYXMgR0xPQkFMX0JMT0NLLgoJKGRlc3Ryb3lfYWxsX3N5bXRhYnMsIG5ld19wc3ltYm9sKTogIEVsaW1pbmF0ZSwgdW51c2VkLgoKCSogc291cmNlLmMgKHNlbGVjdF9zb3VyY2Vfc3ltdGFiKTogIFNlbGVjdCBhIHNvdXJjZSBzeW10YWIKCWZyb20gZWl0aGVyIHRoZSBzeW10YWJzIG9yLCBmYWlsaW5nIHRoYXQsIHRoZSBwc3ltdGFicy4KCShsaXN0X2NvbW1hbmQpOiAgVXBkYXRlIGVycm9yIG1lc3NhZ2UuCgkoZm9yd2FyZF9zZWFyY2hfY29tbWFuZCwgcmV2ZXJzZV9zZWFyY2hfY29tbWFuZCk6ICBVc2UgZ2V0Yywgbm90CglmZ2V0YywgZm9yIHNwZWVkLiAgRklYTUUsIGFkZCBjb21tZW50IGFib3V0IGJ1ZmZlcnMgdGhhdCBkaWUgaWYKCW92ZXJydW4gYnkgbG9uZyBsaW5lLgoKCSogdmFsdWVzLmMgKHVucGFja19maWVsZF9hc19sb25nLCBtb2RpZnlfZmllbGQpOiAgQXZvaWQgc2hpZnRpbmcKCWJ5IGFuIGVudGlyZSB3b3JkLCB3aGljaCBpcyBub3QgcG9ydGFibGUsIGlmIHdlIGhhdmUgYSAzMi1iaXQKCWZpZWxkLiAgKENvZGUgaW4gZGJ4cmVhZC5jIGFscmVhZHkgdHVybnMgc3VjaCBiaXRmaWVsZHMsIGlmCglhbGlnbmVkLCBpbnRvIG9yZGluYXJ5IGludHMsIGJ1dCBmaXhpbmcgdGhpcyB3aWxsIGhlbHAgZm9yIG90aGVyCglzeW1ib2wgZm9ybWF0cyBhbmQgZm9yIGZ1dHVyZSBjaGFuZ2VzLikKCSogY29yZS5jIChjb3JlX29wZW4pOiAgSGFuZGxlIEFOU0kgY29uc3QgYnJhaW4gZGVhdGguCgkqIHV0aWxzLmMgKHZwcmludGYpOiAgRml4IHZhcmFyZ3MgdHlwby4KClN1biBKdWwgMTQgMDA6NDI6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogZmluZHZhci5jIChmaW5kX3Zhcl92YWx1ZSk6ICBIYW5kbGUgJmZ1bmN0aW9uIGJldHRlci4KCSogVE9ETzogIERvY3VtZW50IHdvcmsgbmVlZGVkIG9uICZmbiBhbmQgJmFycmF5LgoJKiBwcmludGNtZC5jIChwcmludF9hZGRyZXNzX3N5bWJvbGljKTogIE5ldyBhcmcgaXMgdGhlIHByZWZpeAoJdG8gcHJpbnQgaWYgYSBuYW1lIGlzIHByaW50ZWQuCgkocHJpbnRfYWRkcmVzc19kZW1hbmdsZSk6ICBIb25vciAic2V0IHByaW50IGFkZHJlc3MiIG5vdy4KCVVzZSBuZXcgYXJnIGFib3ZlIHRvIGltcHJvdmUgc3BhY2luZyBvZiBvdXRwdXQuCgkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6ICBXaGVuIHByaW50aW5nIGZ1bmN0aW9uIHBvaW50ZXJzLAoJcHJpbnQgc3ltYm9saWMgZm9ybSB0b28uCgkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF8xKTogIFVzZSBuZXcgcHJpbnRfYWRkcmVzc19zeW1ib2xpYy4KCk1vbiBKdWwgIDggMTk6MDI6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogY29yZS5jIChtZW1vcnlfZXJyb3IpOiAgUmV3b3JkIGVycm9yIG1zZyB0byBtaXNsZWFkIGxlc3MuCgoJKiBtaXBzLXBpbnNuLmMgKHByaW50X2luc25fYXJnICdkJyk6ICBQcmludCAkIHdpdGggcmVnIG5hbWUuCgoJKiBtaXBzcmVhZC5jIChyZWFkX21pcHNfc3ltdGFiLCByZWFkX3RoZV9taXBzX3N5bXRhYiwKCXBhcnNlX3BhcnRpYWxfc3ltYm9scyk6IFVzZSBuZXdlciBCRkQgaW50ZXJuYWxzIChleHRlcm5hbF9maWxlaGRyCglhbmQgZXh0ZXJuYWxfYW91dGhkciksIGJ5dGUtc3dhcCB0aGUgZmllbGRzIHRoYXQgd2UgY2FyZSBhYm91dAoJYmVmb3JlIHVzaW5nIHRoZW0sIGFuZCBtYWtlIHRoZSBmaWxlIGhlYWRlciBkYXRhIGxvY2FsIHRvCglyZWFkX3RoZV9taXBzX3N5bXRhYiByYXRoZXIgdGhhbiBnbG9iYWwuCgpTYXQgSnVsICA2IDAxOjM0OjE1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIG5zMzJrLW9wY29kZS5oIChtb3ZtdywgbW92bWQpOiAgRml4IG9wY29kZXMuICBCdWcgZml4Cglmcm9tIFJ1bmUgTmVyZ31yZCA8cnVuZW5lQGlmaS51aW8ubm8+IG9uIDUgSnVsIDE5OTEuCgoJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6ICBGbHVzaCBzdGRvdXQgYW5kIHN0ZGVycgoJYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gcmVhZGxpbmUuICBUaGlzIHJlcG9ydGVkbHkgZml4ZXMgYSBidWcKCXRoYXQgY29tZXMgdXAgaW4gU3lzIFYgcnVubmluZyBlbWFjcy1nZGIgYW5kL29yIHh4Z2RiLAoJd2hlbiBzdGRpbi9vdXQgYXJlIHBpcGVzIG9yIHNvY2tldHMuCgpUaHUgSnVsICA0IDE0OjQ3OjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46ICBBdm9pZCByZWJ1aWxkaW5nICJkZXBlbmQiIGFzIG11Y2guCglBdm9pZCBkZWNsYXJpbmcgTWFrZWZpbGUgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIEdOVSBNYWtlIHN0dXBpZGx5Cgl0cmllcyB0byB1cGRhdGUgaXQgaWYgd2UgZG8uCgoJKiBjb2ZmcmVhZC5jOiAgUmV2aXNlIGZvciBtaW5vciBjaGFuZ2VzIHRvIGJmZCBpbnRlcm5hbCBjb2ZmCglpbmRleGVzLgoKCSogY29uZmlndXJlOiAgSWYgLXRlbXBsYXRlPSBpcyBnaXZlbiBhIHJlbGF0aXZlIHBhdGgsIG1ha2UgaXQgCglhYnNvbHV0ZSBiZWZvcmUgcmVjdXJyaW5nIGluIHN1YmRpcmVjdG9yaWVzLgoKCSogY29uZmlndXJlLCBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiAgSW5zdGFsbCAiY29uZmlndXJlIiBzY3JpcHQKCWFzIHJlcGxhY2VtZW50IGZvciBjb25maWcuZ2RiLgoJKiBjb25maWcuZ2RiLCBNYWtlZmlsZS5kaXN0LCBNYWtlZmlsZS5zZGlyOiAgUmVtb3ZlCgkqIFJFQURNRTogIFVwZGF0ZSBmb3IgY29uZmlndXJlLCBtb3N0bHkuICBGSVhNRS4KCgkqIEFkZCBkZWMzMTAwIGFzIGVxdWl2YWxlbnQgdG8gbGl0dGxlbWlwcy4gIEluZGljYXRlIGluIGFsbCBob3N0ICYKCXRhcmdldCBjb25maWcgZmlsZXMgdGhhdCB0aGV5IGFyZSBmb3IgdGhlIGhvc3QuICBXaGVuIHRoZSBsaW5lcwoJZ2V0IGNvcGllZCBpbnRvIHRoZSBNYWtlZmlsZSwgdGhpcyBtYWtlcyBpdCBtb3JlIG9idmlvdXMgd2hhdCdzCgl1cC4KCk1vbiBKdW4gMjQgMjM6NDk6MDcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogc3BhcmMtb3Bjb2RlLmggKHRyYXAgb3Bjb2Rlcyk6ICBBdm9pZCBsZWFkaW5nIHNwYWNlcyBvcgoJdGFicywgd2hpY2ggZW5kIHVwIGluIHRoZSBkaXNhc3NlbWJsZXIgb3V0cHV0IGluYWR2ZXJ0ZW50bHkuCgpXZWQgTWF5IDI5IDIzOjAxOjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCglNYWtlIGl0IGNvbXBpbGUgY2xlYW5seSBpbiBhbiBBTlNJIEdDQzIgZW52aXJvbm1lbnQuCgoJKiBibG9ja2ZyYW1lLmM6ICA8c3RkaW8uaD4KCSogY3BsdXMtZGVtLmM6ICBmcmVlIHRha2VzIGEgdm9pZCAqLCBpZmRlZiBfX1NURENfXwoJKiBkYnhyZWFkLmMgKHJlYWRfaHVnZV9udW1iZXIpOiAgYXZvaWQgZ2NjMiBidWcgaG9pc3RpbmcgY2FsYyBvZgoJTE9OR19NQVgvcmFkaXguCgkqIGRlZnMuaCAoYWxsb2NhKTogIEF2b2lkIGRvaW5nIGFueXRoaW5nIGlmIGFsbG9jYSBhbHJlYWR5IGRlZidkLgoJKiBzdGRkZWYuaCwgc3RkbGliLmg6ICBSZW1vdmUgdGhlc2UgZmlsZXMuCgkqIHN5bXRhYi5jOiAgQXZvaWQgZGVjbGFyaW5nIHFzb3J0LCBjbG9zZS4KCSogc3ltZmlsZS5jOiAgQXZvaWQgZGVjbGFyaW5nIGNsb3NlLgoJKiB1dGlscy5jICh2cHJpbnRmKTogIERlY2xhcmUgImFwIiBhcmcgYXMgcHJvcGVyIHZhX2FsaXN0LgkKCSogc3BhcmMtdGRlcC5jOiAgQXZvaWQgaW5jbHVkaW5nIGxvdHMgb2YgU3VuLWhvc3Qtc3BlY2lmaWMgZmlsZXMuCgoJQXNzb3J0ZWQgb3RoZXIgY2hhbmdlcy4KCSogZGJ4cmVhZC5jOiAgaW5jbHVkZSAibGliYW91dC5oIiwgbm90ICJsaWJhLm91dC5oIi4KCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6ICBTZXQgcmVjdXJzZSBwcm9wZXJseSBmb3IKCWluZGVudGF0aW9uIG9mIHN0cnVjdCBhbmQgYXJyYXkgcGFyYW1ldGVycy4KCSogdmFsb3BzLmMgKHZhbHVlX2Nhc3QpOiAgQWxsb3cgY2FzdCB0byB2b2lkLgoJKiBpbmZydW4uYyAocmVzdW1lKTogIElmIE5PX1NJTkdMRV9TVEVQLCBjYWxsIG1hY2hpbmUgZGVwZW5kZW50CglzaW5nbGVfc3RlcCgpIGluIGEgdGFyZ2V0LWluZGVwZW5kZW50IGZhc2hpb24uCgkqIHNwYXJjLXRkZXAuYyAoc2luZ2xlX3N0ZXApOiAgRG9uJ3QgY2FsbCBwdHJhY2Ugb3Vyc2VsdmVzLCBqdXN0CglzZXQgdXAgdG8gYmUgcmVhZHkgdG8gY29udGludWUuICBUaGlzIG1ha2VzIHVzIHRhcmdldCBpbmRlcGVuZGVudC4KCSogaW5mcHRyYWNlLmMgKGNoaWxkX3Jlc3VtZSk6ICBSZW1vdmUgY2FsbCB0byBzaW5nbGVfc3RlcDsgbm93CgljYW4gc2luZ2xlIHN0ZXAgYSBTUEFSQyB0YXJnZXQgb2YgYW55IGtpbmQuCgpXZWQgTWF5IDIyIDE4OjE4OjI0IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGZvd2FudG9uLmN5Z251cy5jb20pCgoJKiBNYWtlZmlsZS5kaXN0LCBkb2MvZ2RiLnRleGluZm8sIGRvYy8qLW00LnRleGluZm86IHNwbGl0IHVwIEdEQgoJZG9jbiBpbnRvIHNlcGFyYXRlIHNlY3Rpb25zLS0tYmFzaWNhbGx5IGNoYXB0ZXJzLCBwbHVzIHR3byBsb29zZQoJcGllY2VzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZ28gaW4gZGlmZmVyZW50IHBsYWNlcy4gIFRoaXMKCWFsbG93cyBHTlUgbTQgdG8gcHJlcHJvY2VzcyB0aGUgbWFudWFsIHdpdGhvdXQgY29yZWR1bXBpbmcuCgoJKiBNYWtlZmlsZS5kaXN0OiB0ZWxsIFRlWCB3aGVyZSB0byBmaW5kIHRleGluZm8uCgpNb24gTWF5IDIwIDEyOjE1OjA0IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGZvd2FudG9uLmN5Z251cy5jb20pCgoJKiBNYWtlZmlsZS5kaXN0LCBkb2MvZ2RiLnRleGluZm86IHJlc3BlY3RpdmVseSBjcmVhdGUsIGFuZCB1c2UsCgl0aGUgbmV3IHRhcmdldCAicmRsLWFwcHMudGV4aW5mbyIgd2hpY2ggY2FwdHVyZXMgdGhlIE1ha2VmaWxlCgl2YXJpYWJsZSB0aGF0IHJlY29yZHMgd2hlcmUgdG8gZmluZCB0aGUgUmVhZGxpbmUgbGlicmFyaWVzLgoKU3VuIE1heSAxOSAwNTozNjo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiB0YWhvZS1waW5zbi5jOiAgI2luY2x1ZGUgInRhaG9lLW9wY29kZS5oIiwgbm90ICJvcGNvZGUuaCIuCgkqIHRtLXRhaG9lLmggKEZJWF9DQUxMX0RVTU1ZKTogIElnbm9yZSBtb3JlIHBhcmFtZXRlcnMuCgkqIGRlZnMuaCAoY29uc3QsIHZvbGF0aWxlKTogIE9ubHkgZGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCgkqIE1ha2VmaWxlLmRpc3QgKGdkYi50YXIuWik6ICBDcmVhdGUgZG9jIHN1YmRpciB3L291dCBDVlMvUkNTIGNydWQuCgoJKiBSRUFETUU6ICBVcGRhdGUgZm9yIHJlbGVhc2UgMy45NS4KCSogY29uZmlnLmdkYjogIERvbid0IGNyZWF0ZSByZWFkbGluZSBkaXIgaW4gc3ViZGlyIGJ1aWxkcy4KCSogbWFpbi5jOiAgSW5jbHVkZSB3aXRoICIuLi4iIGZvcm0gZm9yIG5vbi1zeXN0ZW0gaW5jbHVkZSBmaWxlcywKCXNvICJnY2MgLU1NIiBmb3IgIm1ha2UgZGVwZW5kIiB3b3Jrcy4KCUluY2x1ZGUgcmVhZGxpbmUgZmlsZXMgd2l0aCAiLi4uaCIgcmF0aGVyIHRoYW4gPHJlYWRsaW5lLy4uLmg+LgoJKiBtaXBzcmVhZC5jOiAgSW5jbHVkZSAiZWNvZmYuaCIgcmF0aGVyIHRoYW4gImludGVsLWNvZmYuaCIuCgoJKiBjb2ZmcmVhZC5jOiAgVW5kbyBtaW5vciBkYW1hZ2UgZG9uZSBieSBSaWNoIFBpeGxleS4gIFVzZQoJZGlmZmVyZW50IGludGVybmFsIGFuZCBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMgb2YgQ09GRgoJZGF0YSBzdHJ1Y3R1cmVzLiAgVXNlIG5ldyBCRkQgcm91dGluZXMgZm9yIHN3YXBwaW5nIHRoZW0gaW4gYW5kCglvdXQuCgkqIHN5bWZpbGUuYyAoZnJlZV9uYW1lZF9zeW10YWJzKTogIEF2b2lkIGZyZWVpbmcgZmlsZSBuYW1lcyB0aGF0CglhcmUgbnVsbCBvciBlbXB0eS4gIE9sZCBpOTYwIHRvb2xzIHNlZW0gdG8gcHJvZHVjZSBmaWxlcyB0aGF0CgljbGFpbSB0byBoYXZlIGVtcHR5IG5hbWVzLCBjYXVzaW5nIGVhY2ggc3VjY2Vzc2l2ZSBmaWxlIHJlYWQKCXRvIGJsb3cgYXdheSB0aGUgcHJldmlvdXMgb25lLgoJKiBzcGFyYy14ZGVwLmMgKGRlZmVycmVkX3N0b3Jlcyk6ICBSZXBhaXIgbWlub3IgZGFtYWdlIGJ5IFJpY2guCglNb3ZlIGRlZmVycmVkX3N0b3JlcyB0byB0b3Agb2YgZmlsZSwgYnV0IGRvbid0IHNlcGFyYXRlIGl0cwoJI2RlZmluZSdzIGZyb20gaXRzIHZhcmlhYmxlLiAgQWRkIGNvbW1lbnRhcnkuCgkqIE1ha2VmaWxlLmRpc3Q6ICBGaXggUmljaCBkYW1hZ2U7IHVuZG8gImNvbmZpZ3VyZSIgY2hhbmdlcyBpbgoJZmF2b3Igb2Yga2VlcGluZyB0aGUgKHdvcmtpbmcpIGNvbmZpZy5nZGIuICBNb3ZlIHJlYWRsaW5lCglsaWJyYXJ5IHVwIGEgbm90Y2guCgpGcmkgTWF5IDE3IDEyOjQ5OjU2IDE5OTEgIFBlciBCb3RobmVyICAodmlhIGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6ICBUcnkgdG8gaGFuZGxlIGcrKyB2ZXJzaW9uIDEgTUkKCWRlYnVnIGluZm8uCgkqIGluZnB0cmFjZS5jIChmZXRjaF9yZWdpc3RlcnMpOiAgbm8gcmVzdWx0LCBzaW5jZSBub3cgdm9pZC4KCSogdGNvbmZpZy9uZXdzOiAgdGFyZ2V0IGRlcGVuZHMgb24gbTY4ay10ZGVwIHRvby4KCkZyaSBNYXkgMTcgMTQ6NDA6MTQgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgZm93YW50b24uY3lnbnVzLmNvbSkKCgkqIE1ha2VmaWxlLmRpc3Q6IGFkZGVkIHJlYWRsaW5lL2luYy0qLnRleGluZm8gdG8gZGVwZW5kZW5jaWVzIGZvcgoJZ2RiLmR2aSB0YXJnZXQKCgkqIHJlYWRsaW5lL2luYy1oaXN0b3J5LnRleGluZm8sIHJlYWRsaW5lL2luYy1yZWFkbGluZS50ZXhpbmZvOgoJYXBwbGllZCB2YXJpb3VzIHNtYWxsIGZpeGVzIGR1ZSB0byBvciBpbnNwaXJlZCBieSBSTVMgY29tbWVudHMKCgkqIGRvYy9nZGIudGV4aW5mbzogZmluaXNoZWQgdXNpbmcgYWxsIFJNUyBjb21tZW50cywgc2F2ZSB0aG9zZSBmb3IKCWFwcGVuZGljZXMgb24gcmVhZGxpbmUgYW5kIGNtZCBoaXN0b3J5ICh3aGljaCBhcmUgaW4gb3RoZXIgc291cmNlCglmaWxlcykgCgpUaHUgTWF5IDE2IDE4OjA2OjA1IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGZvd2FudG9uLmN5Z251cy5jb20pCgoJKiBkb2MvZ2RiLnRleGluZm86ICgxKSBVcGRhdGVkIHcvcmVmIHRvIFJNUyBjb21tZW50cyB0aHJvdWdoCgljaGFwdGVyIDk7ICgyKSBkb2N1bWVudGVkICdicmVhaycgY29tbWFuZCdzIG1lbnUgbW9kZSBmb3IKCW92ZXJsb2FkZWQgbmFtZXMsIGluIHJlc3BvbnNlIHRvIGhncyBwcm9ibGVtIHJlcG9ydCBDKysgcC0zMQoKV2VkIE1heSAxNSAxMTowMjo0OCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBmb3dhbnRvbi5jeWdudXMuY29tKQoKCSogZG9jL2dkYi50ZXhpbmZvOiAoMSkgYmV0dGVyIGludHJvZHVjdG9yeSBleGFtcGxlOyAoMikgbW9yZQoJY29uc2lzdGVudCB1c2Ugb2YgQGNvZGUsIEBzYW1wLCBAZmlsZSwgQGtiZCB0aHJvdWdob3V0OyBzbWFsbAoJY2xlYW51cHMgdG8gZmlyc3QgdGhyZWUgbm9kZXM7ICgzKSBuZXcgIkNvbnRyaWJ1dG9ycyIgbm9kZTsKCSg0KSBBcHBlbmRpeCwgUmVuYW1lZCBDb21tYW5kczsgKDUpIGRpdmVydCBzcGVjaWFsaXplZCBzdGFydHVwCglpbnN0cnVjdGlvbnMgdG8gIlRhcmdldHMiIGNoYXB0ZXIgZm9yIGdlbmVyaWMgbWFudWFscywgd2hpbGUKCWxlYXZpbmcgdGhlbSB1cCBmcm9udCBmb3IgbWFudWFscyBzcGVjaWZpYyB0byBzcGVjaWFsaXplZAoJZW52aXJvbm1lbnRzOyAoNikgYXBwbHkgZml4ZXMgZnJvbSBSTVMgY29tbWVudHMgdGhyb3VnaCBjaGFwdGVyIDQuCgoJKiBwcmV0ZXgubTQ6IG1vZGlmeSBleHBsYW5hdG9yeSB0ZXh0IHNsaWdodGx5IChhbmQgcmVkZWZpbmUKCSJyZWdleHAiKSB0byBrZWVwIEdOVSBtNCBmcm9tIGNvbXBsYWluaW5nLiAgKEl0IHN0aWxsIGNyYXNoZXMKCWxhdGVyLCBidXQgb25lIHN0ZXAgYXQgYSB0aW1lLi4uKQoKV2VkIE1heSAxNSAxMDozMjoxMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiByZWFkbGluZS9yZWFkbGluZS5jICh1cGRhdGVfbGluZSk6ICBBdm9pZCBkZXJlZmVyZW5jaW5nIGEgcG9pbnRlcgoJYmVmb3JlIGNvbXBhcmluZyBpdCB0byBpdHMgYm91bmRzLiAgU2FiZXIgY2F1Z2h0IHRoaXMuCgkoaW5pdF90ZXJtaW5hbF9pbyk6ICBEb24ndCBzZXQgQkMgZnJvbSB0aGUgInBjPSIgdGVybWNhcCB2YXJpYWJsZSwKCWFuZCBvbmx5IHNldCBQQyBpZiB0Z2V0c3RyIHJldHVybmVkIG5vbi1udWxsLiAgU2FiZXIgY2F1Z2h0IHRoaXMuCgpUdWUgTWF5IDE0IDE2OjI5OjUzIFBEVCAxOTkxICBSb2xhbmQgUGVzY2ggKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogTWFrZWZpbGUuZGlzdDogcHV0IGdkYi5kdmkgc3R1ZmYgKHVwZGF0ZWQgdG8gdXNlIE00IHByZXByb2Nlc3NvcgoJc3R1ZmYgZm9yIGNvbmZpZyBtYW51YWwpIGhlcmUgd2hlcmUgaXQgY291bnRzOyB1cGRhdGVkCgl0byB1c2UgbmV3IHN1YmRpciBzdHJ1Y3R1cmUgKGdkYi9kb2MvKS4KCgkqIE1ha2VmaWxlOiBnZW5lcmF0ZWQgZnJvbSBhYm92ZSB2aWEgCgkJICAgIGNvbmZpZy5nZGIgbm9uZSAKCWJlZm9yZSBjaGVja2luCgoJKiBnZGJpbnQudGV4aW5mbzogYWRkZWQgaW5zdHJ1Y3Rpb25zIG9uIGdlbmVyYXRpbmcgZ2RiLmluZm8qIGZpbGVzCglsb2NhbGx5IGZvciByZWxlYXNlLiAgVGhlc2UgYXJlIG9yZGluYXJ5IGluZm8KCWZpbGVzLCBmb3JtYXR0ZWQgZnJvbSBnZGIudGV4aW5mbyAodmlhIGdkYi1hbGwudGV4aW5mbywgc2VlCglNYWtlZmlsZSktLS1idXQgZHVlIHRvIHVzZSBvZiB0ZXhpbmZvIDIsIGNhbid0IGNvdW50IG9uIG1ha2VpbmZvCgl0byBnZW5lcmF0ZSB0aGVzZSwgc28gd2UgZGlzdHJpYnV0ZSB0aGVtIGFscmVhZHkgZm9ybWF0dGVkLgoKCSogZ2RiLnRleGluZm86IGluY2x1ZGVkIGZ1bGwgSW5mbyBub2RlIGFuZCBtZW51IGNydWQgKGFzIGdlbmVyYXRlZAoJYnkgQy11IE0teCB0ZXhpbmZvLW1hc3Rlci1tZW51IHVzaW5nIHRoZSB0ZXhpbmZvLTIgZWxpc3AgY29kZSkuCgoJKiBNYWtlZmlsZTogdXBkYXRlZCAiZ2RiLmR2aSIgdGFyZ2V0IHRvIHVzZSBNNCBwcmVwcm9jZXNzb3I7CglwdXQgaW4gY29tbWVudHMtZm9yLWZ1dHVyZSBnZGIuaW5mbyB0YXJnZXQgKG9uZSBkYXkgbWFrZWluZm8gd2lsbAoJd29yayBhZ2FpbikuCgpUdWUgTWF5IDE0IDEzOjUxOjM2IFBEVCAxOTkxICBSb2xhbmQgUGVzY2ggKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogZ2RiLnRleGluZm86IFVwZGF0ZWQgdG8gaW5jbHVkZSBuZXcgb3Igb2xkIHVuZG9jdW1lbnRlZAoJY29tbWFuZHMsIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgKHBlcmhhcHMgc29tZSBvdGhlcnMgSSBmb3Jnb3QgdG8KCXJlY29yZCk6IGluZm8gZiwgaW5mbyBmbG9hdCwgaW5mbyBwYXRoLCBpbmZvIHByb2dyYW0sIGluZm8gcywgaW5mbwoJc2V0LCBpbmZvIHNvdXJjZSwgaW5mbyB0ZXJtaW5hbCwgaW5mbyB0eXBlcywgaW5mbyB1c2VyLCBzZXQvc2hvdwoJcHJpbnQgb2JqZWN0LiAgCglBbHNvIGNvdmVyZWQgYWxsIHJlY2VudCBHREIgY29tbWFuZCByZW5hbWVzIGZvciB2NC4KCk1vbiBNYXkgMTMgMTQ6NTc6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogbWlwc3JlYWQuYzogIFJhdGhlciB0aGFuIGtlZXBpbmcgY291bnQgb2YgaG93IG1hbnkgc3ltdGFicwoJYW5kIHBzeW10YWJzIHdlIGhhdmUsIGZvciBzb3J0aW5nIHB1cnBvc2VzLCBjb3VudCB0aGVtIHdoZW4KCXdlIG5lZWQgdG8gc29ydC4gIFRoaXMgZml4ZXMgYnVnIGluIHJlcmVhZGluZyBvZiBzeW1ib2wgdGFibGVzLgoKRnJpIE1heSAxMCAxNTo0MzozMyBQRFQgMTk5MSAgUm9sYW5kIFBlc2NoIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGluZmNtZC5jOiByZW5hbWVkICJpbmZvIHBhdGgiIHRvICJzaG93IHBhdGhzIgogICAgICAgICogZ2RicmMudGV4OiBkb2N1bWVudGVkIGFib3ZlLgoKV2VkIE1heSAgOCAwNDo1MToxMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiByZW1vdGUuYzogIEZpeCBjb21tZW50cy4KCSogdXRpbHMuYyAoZXJyb3IpOiAgRm9yY2Ugb3V0IGFueSBwZW5kaW5nIHdyYXAgb3V0cHV0LgoKU2F0IE1heSAgNCAxMToxMTowNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBNYWtlZmlsZS5kaXN0OiAgUm9sbCBWRVJTSU9OIHRvIDMuOTUuCglGaXggdXAgInNhYmVyX2dkYiIgdG8gd29yayBhZ2Fpbi4KCSogc2FiZXIuc3VwcHJlc3M6ICBVcGRhdGUuCgoJKiBjb2ZmcmVhZC5jLCBleGVjLmMsIGluZnB0cmFjZS5jLCBpbmZ0YXJnLmMsIHJlbW90ZS5jLCBzb2xpYi5jLAoJc3ltdGFiLmgsIHRhcmdldC5jLCB0YXJnZXQuaDogIExpbnQuCgkqIGNvcmUuYzogIHNldHVwIGFuZCBzZWxlY3QgZnJhbWUgYWZ0ZXIgcmVhZGluZyBzaGFyZWQgbGlicywKCWVsc2UgcmVhZGluZyBzaGFyZWQgbGlicyB3aWxsIGNsb2JiZXIgdGhlbS4gIExpbnQuCgkqIHV0aWxzLmMgKGVycm9yKTogIEZvcmNlIG91dCBhbnkgYnVmZmVyZWQgd3JhcCB0ZXh0LgoKRnJpIE1heSAgMyAyMjowMTo1NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiByZW1vdGUuYzogIFJlbW92ZSBkZWNscyBvZiBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQKCWFuZCBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQsIG5vIGxvbmdlciB1c2VkLiAgKFN1Z2dlc3Rpb24gb2YKCUphbiBOb3JkZW4pLgoKCSogTWFrZWZpbGUuZGlzdDogIHVzZSAke3N1YmRpcn0gaW4gcGF0aHMgb2YgQkZEIGFuZCBMSUJJQkVSVFksCgl0byBtYWtlIGl0IGVhc2llciB0byBpbnRlcmZhY2UgdG8gImNvbmZpZ3VyZSInZCBsaWJyYXJpZXMuCgpGcmkgTWF5ICAzIDEzOjEwOjAxIFBEVCAxOTkxICBSb2xhbmQgUGVzY2ggKHBlc2NoIGF0IGZvd2FudG9uLmN5Z251cy5jb20pCgogICAgICAgICogdmFscHJpbnQuYzogIGludHJvZHVjZSAic2V0IHAiLCAic2V0IHByIiwgInNob3cgcCIgYW5kICJzaG93IHByIiBhcwoJYWxpYXNlcyBmb3Igc2V0L3Nob3cgcHJpbnQuCgpUaHUgTWF5ICAyIDExOjIyOjAyIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltX2ZucykgW1RERVNDXTogTWFrZSB0aGUgdHlwZSBiZSBtODhrYmNzLgoKCSogbTg4ay10ZGVwLmMgKElFRUVfaXNOQU4pOiBOZXcgZnVuY3Rpb24uCgoJKiBpbmZydW4uYywgbTg4ay10ZGVwLmMsIG04OGsteGRlcC5jOiBDaGFuZ2UKCWluaXRpYWxpemVfe3RkZXNjLGRjb250ZXh0fSB0byBpbml0X3t0ZGVzYyxkY29udGV4dH0uCgoJKiBpbmZydW4uYyBbVERFU0NdOiBBZGQgYSBidW5jaCBvZiBjcnVkLgoKCSogeG0tODhrLmggW19fR05VQ19fXTogRG9uJ3QgZGVmaW5lIG1lbXNldC4KCgkqIG04OGsteGRlcC5jOiAjaWYgMCBvdXQgcHVzaF9icmVha3BvaW50LgoKCSogdG0tODhrLmg6IERlZmluZSBHRVRfU0FWRURfUkVHSVNURVIuCgoJKiB0bS04OGsuaDogRGVmaW5lIERHVVguCgoJKiBtODhrLW9wY29kZS5oIChVRVhULCBTRVhULCBNQUtFKTogUHV0IHBhcmVudGhlc2VzIGFyb3VuZCBhcmd1bWVudHMuCgoJKiBtODhrLXBpbnNuLmMgKHNwcmludF9hZGRyZXNzKTogRGVjbGFyZSBhdCB0b3Agb2YgZmlsZS4KCgkqIG04OGsteGRlcC5jOiAjaWYgMCBvdXQgY29yZV9maWxlX2NvbW1hbmQuCgoJKiB2YWx1ZXMuYyAoe3VucGFja18sdmFsdWVfYXNffXBvaW50ZXIpOiBKdXN0IGNhbGwKCXt1bnBhY2tfLHZhbHVlX2FzX31sb25nIChmb3Igbm93IGFueXdheSkuCgoJKiBtODhrLXRkZXAuYyAoZ2V0X3NhdmVkX3JlZ2lzdGVyKTogTWFrZSBnZXRfcmVnIGEgZGNfd29yZF90ICgqKSgpLgoJKHBzcl9yZWdpc3Rlcik6IENoYW5nZSByZXR1cm4gdHlwZSB0byBkY193b3JkX3QuCgoJKiBtODhrLXRkZXAuYyAodGRlc2NfcmVhZF9mdW5jdGlvbik6IENvbW1lbnQgb3V0IGNhbGwgdG8gcHRyYWNlLgoKCSogbTg4ay10ZGVwLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6IEFkZCBsdmFscCBwYXJhbWV0ZXIuCgoJKiBnZGJjb3JlLmggKHdyaXRlX21lbW9yeSk6IERvbid0IHByb3RvdHlwZSBpdC4KCgkqIHRtLTg4ay5oLCBtODhrLXRkZXAuYzogTWFrZSBzdGFja19lcnJvciwgc3RhY2tfam1wIGdsb2JhbC4KCW04OGsteGRlcC5jOiBEb24ndCBtZW50aW9uIHN0YWNrX2Vycm9yLgoKCSoge3gsdH1jb25maWcvbTg4ayAoe1gsVH1ERVBGSUxFUyk6IEFkZCBtaXNzaW5nIGZpbGVzLgoKCSogbXRyYWNlLmM6IERvbid0IHR5cGVkZWYgdGhpbmdzIGxpa2Ugc2l6ZV90LCBqdXN0ICNkZWZpbmUgdGhlbS4KCgkqIGNvZmZyZWFkLmMgW1RERVNDXTogI2lmIDAgb3V0IHJlZmVyZW5jZXMgdG8gY29mZnN5bi4KCgkqIHN5bXRhYi5oIChzdHJ1Y3Qgc3ltdGFiKTogSW5jbHVkZSBFWFRSQV9TWU1UQUJfSU5GTy4KCXRtLTg4ay5oOiBEZWZpbmUgRVhUUkFfU1lNVEFCX0lORk8uCgoJKiBjb2ZmcmVhZC5jIFtUREVTQ106IEluY2x1ZGUgInRkZXNjLmgiIGFuZCBtYWtlIHRkZXNjX2hhbmRsZQoJZGNfZGNvbnRleHRfdCBub3QgaW50LgoKCSogY29mZnJlYWQuYyBbVERFU0NdOiBVc2Ugc3lzdGVtIGluY2x1ZGUgZmlsZXMgbm90IDxpbnRlbC1jb2ZmLmg+LgoKCSogY29mZnJlYWQuYyBbVERFU0NdOiBNb3ZlIHNldHRpbmcgb2YgZGVidWdfaW5mbyBmcm9tCgljb2ZmX3N5bWZpbGVfcmVhZCB0byBmaW5kX2xpbmVub3MgYW5kIG1ha2UgaXQgd29yayB3aXRoIEJGRC4KCgkqIGNwbHVzLWRlbS5jIFtfX1NURENfX106IE1ha2UgeHttLHJlfWFsbG9jIHJldHVybiB2b2lkKi4KCgkqIHNpZ25hbWUuYzogQ2FzdCBjb25zdCBjaGFyKiB0byBjaGFyKiB3aGVuIGFzc2lnbmluZyB0byBzeXNfc2lnbGlzdC4KCgkqIHV0aWxzLmMgKHN0cnNhdmUpOiBNYWtlIGFyZyBjb25zdCBjaGFyKiBub3QgY2hhciouCgoJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpIFtTSElGVF9JTlNOX1JFR1NdOiBVc2UKCWJwc3RhdF9leHBsYWluc19zaWduYWwgKHN0b3BfYnBzdGF0KSBub3Qgc3RvcF9icmVha3BvaW50LgoKCSogdG0tODhrLmggKFNUQVJUX0lORkVSSU9SX0hPT0spOiBNYWtlIHRkZXNjX2hhbmRsZSBhIGRjX2hhbmRsZV90LgoKCSogdG0tODhrLmggKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogVXNlIGNoYXIgKiBub3Qgdm9pZCAqLgoKCSogZmluZHZhci5jIChyZWFkX3Zhcl92YWx1ZSwgY2FzZSBMT0NfQ09OU1RfQllURVMpOiBQdXQgdGhlIGFkZHJlc3MKCWluIGEgY2hhciAqLCBub3QgYSBDT1JFX0FERFIuICBVc2UgU1lNQk9MX1ZBTFVFX0JZVEVTLgoKCSogdG0tODhrLmggKElOSVRfRVhUUkFfRlJBTUVfSU5GTyk6IFVzZSBmY2kgbm90IHByZXYgKGZjaSBpcwoJcHJldiBleGNlcHQgZnJvbSBjcmVhdGVfbmV3X2ZyYW1lKS4gIE1ha2UgbmV4dF9mcmFtZSBhCglsb2NhbCB2YXJpYWJsZS4KCURlY2xhcmUgZ2V0X3ByZXZfY29udGV4dC4KCXt4LHR9bS04OGsuaDogRW5jbG9zZSBVU0cgYW5kIEJDUyBkZWZpbmVzIGluICNpZiAhZGVmaW5lZC4KCW04OGste29wY29kZS5oLHBpbnNuLmMseGRlcC5jLHRkZXAuY306IE5ldyBmaWxlcyAoc2FtZSBjb250ZW50cyBhcwoJYmVmb3JlOyB0aGV5IGhhZCBqdXN0IGJlZW4gbGVmdCBvdXQgb2YgdGhlIGRpc3RyaWJ1dGlvbiBmb3IgYSBsb25nCgl0aW1lKS4KClRodSBNYXkgIDIgMTc6NTM6NTYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCU1pcHMgYnJpbmd1cCBhbmQgZ2VuZXJhbCBjbGVhbnVwCgoJKiBjcGx1cy1kZW0uYzogIE1vdmUgQ1BMVVNfTUFSS0VSIGRlZmluZSB0byBhZnRlciBkZWZzLmguCgkqIGluZnB0cmFjZS5jIChQVF9XUklURV9ELCBQVF9SRUFEX0QpOiAgVXNlIGNvcnJlY3QgdmFsdWVzLgoJKFRoaXMgc3RpbGwgZG9lc24ndCBzZWVtIHRvIG1ha2UgTUlQUyBia3B0cyB3b3JrLikKCSogbWlwc3JlYWQuYzogIFJlbW92ZSBkdXAgIlJlYWRpbmcgc3ltYm9sIGRhdGEuLi4iIG1zZy4KCShzeW1ib2xfZmlsZV9jb21tYW5kLCBhZGRfZmlsZV9jb21tYW5kKTogIFJlbW92ZSwgb2Jzb2wuCgkqIHByaW50Y21kLmMgKHB0eXBlX2NvbW1hbmQpOiAgU2F5ICJhbiBlbnVtIiByYXRoZXIgdGhhbiAiYSBlbnVtIi4KCVdyYXAgb3V0cHV0IGFwcHJvcHJpYXRlbHkuCgkqIHN0YWNrLmMgKGxvY2Fsc19pbmZvLCBjYXRjaF9pbmZvLCBhcmdzX2luZm8pOiAgQ2hlY2sKCXNlbGVjdGVkX2ZyYW1lIHJhdGhlciB0aGFuIHRhcmdldF9oYXNfc3RhY2sgb3IgY29yZWR1bXBpbmcuCgkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXgpOiAgV3JhcCAicHR5cGUiIG91dHB1dCBvZgoJZW51bXMgYXBwcm9wcmlhdGVseS4KCldlZCBNYXkgIDEgMTQ6MTA6MjIgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogc2lnbmFtZS5jOiBJbmNsdWRlIGRlZnMuaCBhbmQgcGFyYW0uaC4KCgkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGRlZnMuaCBhbmQgcGFyYW0uaC4KCU1ha2VmaWxlLmRpc3Q6IERvbid0IGhhY2sgaW4gdGhlICJwYXJhbS5oIi4KCXBhcmFtLmg6IERvbid0IGluY2x1ZGUgZGVmcy5oLgoKCSogZXhwcmVhZC55OiBVc2UgYSB1bmlvbiB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCB0eXBlX3N0YWNrCgljYW4gaGF2ZSBib3RoIGludHMgYW5kIGVudW0gdHlwZV9waWVjZXMgaW4gaXQuCgkoe3B1c2gscG9wfV90eXBlX2ludCk6IE5ldyBmdW5jdGlvbnMuCgpUdWUgQXByIDMwIDEzOjE4OjU4IDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGNwbHVzLWRlbS5jIChjcGx1c19tYW5nbGVfb3BuYW1lKTogRG9uJ3QgY2FsbCBlcnJvci4KCXZhbHVlcy5jIChjaGVja19zdHViX21ldGhvZCk6IENhbGwgZXJyb3IgaWYgTlVMTCByZXR1cm4gZnJvbQoJY3BsdXNfbWFuZ2xlX29wbmFtZS4KCgkqIGJsb2NrZnJhbWUuYywgYnJlYWtwb2ludC5jLCBjb3JlLmMsIGNvbW1hbmQuYywgZmluZHZhci5jLAoJZXZhbC5jLCBleHBwcmludC5jLCBpbmZjbWQuYywgaW5mcnVuLmMsIG1haW4uYywgcHJpbnRjbWQuYywKCXJlbW90ZS5jLCBzb3VyY2UuYywgc3RhY2suYywgZGJ4cmVhZC5jLCBjb2ZmcmVhZC5jLCBzeW1maWxlLmgsCglzeW1maWxlLmMsIHV0aWxzLmMsIHZhbGFyaXRoLmMsIHZhbHVlcy5jLCB2YWxvcHMuYywgdG0tNjhrLmgsCgl0YXJnZXQuYywgaW5mdGFyZy5jLCBpZWVlLWZsb2F0LmMsIGVudmlyb24uYywgZGVmcy5oLAoJY29tbWFuZC5oLCBpbmZlcmlvci5oLCBnZGJjb3JlLmgsIHN5bXRhYi5oLCBleHByZXNzaW9uLmgsCglzeW10YWIuYywgY3BsdXMtZGVtLmMsIHZhbHVlLmgsIGV4cHJlYWQueSwgdmFscHJpbnQuYywKCWNvcHlpbmcuYXdrLCBzb2xpYi5jLCBpbmZsb3cuYywgc3ltbWlzYy5jCgk6IExpbnQuICBVc2UgcmVhZF9tZW1vcnkgbm90IHJlYWRfbWVtb3J5X2ludGVnZXIgb24gQ09SRV9BRERSJ3MuCglVc2Uge3ZhbHVlX2FzLHVucGFja31fcG9pbnRlciAoYWRkZWQgdG8gdmFsdWVzLmMpCglub3Qge3ZhbHVlX2FzLHVucGFja31fbG9uZyBvbiBDT1JFX0FERFIncy4KCVVzZSBsb25nZXN0X3RvX2ludCAoYWRkZWQgdG8gZGVmcy5oKSBpbnN0ZWFkIG9mIGNhc3QgdG8gaW50LgoJUmVtb3ZlIGZyb21fdHR5IGFyZyB0byBtb2RfcGF0aC4KCVB1dCBzeW1maWxlX2JmZCBpbiB7Y29mZixkYnh9cmVhZC5jIG5vdCBzeW1maWxlLmguCglVc2UgT1BfTlVMTCBpbnN0ZWFkIG9mIDAgd2hlcmUgZHVtbXkgZW51bSBleHBfb3Bjb2RlIG5lZWRlZC4KCgkqIHRtLXNwYXJjLmg6IFJlbW92ZSBHRVRfUldJTkRPV19SRUcuCgkoRlJBTUVfQ0hBSU4pOiBDYWxsIHNwYXJjX2ZyYW1lX2NoYWluLgoJc3BhcmMtdGRlcC5jIChzcGFyY19mcmFtZV9jaGFpbik6IE5ldyBmdW5jdGlvbi4KCXRtLXNwYXJjLmggKEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MpOiBjYWxsCglzcGFyY19leHRyYWN0X3N0cnVjdF92YWx1ZV9hZGRyZXNzIChhZGRlZCB0byBzcGFyYy10ZGVwLmMpLgoKCSogeG0tc3VuMzg2Lmg6IERvbid0IGRlZmluZSBTRVRfU1RBQ0tfTElNSVRfSFVHRS4KClR1ZSBBcHIgMzAgMTM6MTM6MzMgMTk5MSAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSk6IElmIHRoZSB0eXBlIGJlaW5nIHByaW50ZWQgaXMgYQoJc3RydWN0IGNvbnRhaW5pbmcgdW5kZWZpbmVkIHR5cGVzLCBwcmludCAiPHVuZGVmaW5lIHR5cGU+IgoJYXMgdGhlIHR5cGUgaW5zdGVhZCBvZiBjcmFzaGluZy4KCSogdmFsdWVzLmMgKHZhbHVlX2hlYWRvZik6IEdldCB0aGUgdnRhYmxlIHBvaW50ZXIgdGFraW5nCglUWVBFX1ZQVFJfQkFTRVRZUEUgaW50byBhY2NvdW50LgoJKiBzeW10YWIuYywgc3ltdGFiLmgsIGRieHJlYWQuYzogRml4IHZhcmlvdXMgd2hpdGVzcGFjZSBzcGxvdGNoZXMuCgpNb24gQXByIDI5IDEzOjIyOjUxIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIE1vdmUgQlJPS0VOX0xBUkdFX0FMTE9DQSBmcm9tIHRtLXN1bjM4Ni5oIHRvIHhtLXN1bjM4Ni5oLgoKCSogc3VuMzg2LXhkZXAuYyBbIUdEQl9UQVJHRVRfSVNfU1VOMzg2XTogSnVzdCBwcm92aWRlIGVtcHR5CglmdW5jdGlvbnMgd2hpY2ggZG9uJ3QgZG8gYW55dGhpbmcuCgl0bS1zdW4zODYuaDogRGVmaW5lIEdEQl9UQVJHRVRfSVNfU1VOMzg2LgoKCSogTWFrZWZpbGUuZGlzdDogQWRkIGNvbW1lbnQgYWJvdXQgdG0tc3VuM29zNC5oOiB0bS1zdW4zLmgsIGV0Yy4KCgkqIHN1bjMteGRlcC5jLCB0bS1zdW4zLmgsIHRtLTY4ay5oOiBDaGFuZ2UgVEFSR0VUX1NVTjMgdG8KCUdEQl9UQVJHRVRfSVNfU1VOMy4KCgkqIGluZnJ1bi5jOiBEb24ndCBpbmNsdWRlIHN5cy91c2VyLmggYW5kIGZyaWVuZHMgKHdyb25nIGZvcgoJY3Jvc3MtZGVidWdnaW5nIGFuZCBub3QgbmVjZXNzYXJ5IGFueW1vcmUgKHNlZSBJTl9TSUdUUkFNUCBpbgoJeG0tdmF4LmgpKS4KCVtTRVRfU1RBQ0tfTElNSVRfSFVHRV06IEluY2x1ZGUgPHN5cy97cmVzb3VyY2UsdGltZX0uaD4uCgl4bS10YWhvZS5oOiBEb24ndCBkZWZpbmUgX0RJUkVOVF8uCgoJKiB4bS10YWhvZS5oOiBSZW1vdmUgVVNFX09MRF9UVFkgKG5vdCBuZWVkZWQgbm93IHRoYXQgdGVybWluYWwuaAoJaW5jbHVkZXMgc2d0dHkuaCBiZWZvcmUgc3lzL2lvY3RsLmgpLgoKU3VuIEFwciAyOCAyMjowNDo0NyAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBwYXJhbS1uby10bS5oOiBNYWtlIEJJVFNfQklHX0VORElBTiBkZWZpbmVkIHRvIDAvMSwgbm90IGRlZmluZWQKCW9yIG5vdCBkZWZpbmVkLiAgRG9uJ3QgZGVmaW5lIGl0IGJhc2VkIG9uIFRBUkdFVF9CWVRFX09SREVSIGlmCglpdCdzIGFscmVhZHkgZGVmaW5lZCAoaW4gdGhlIHRtLmggZmlsZSkuCgltaXBzLW9wY29kZS5oIChCSVRfRklFTERTXyopLAoJdmFsdWVzLmMgKG1vZGlmeV9maWVsZCwgdW5wYWNrX2ZpZWxkX2FzX2xvbmcpOgoJVXNlICNpZiBCSVRTX0JJR19FTkRJQU4gbm90ICNpZmRlZiBCSVRTX0JJR19FTkRJQU4uCgl7eCx0fW0tdGFob2UuaCwgdGFob2UtcGluc24uYywgdGFob2Utb3Bjb2RlLmg6IE5ldyBmaWxlcy4KCkZyaSBBcHIgMjYgMTI6MDI6MDYgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogdG0tc3BhcmMuaDogQWRkIGNvbW1lbnRzIGFib3V0IGdjYyB2ZXJzaW9uIDIgYW5kIHN0cnVjdHVyZSBwYXNzaW5nLgoKCSogeGNvbmZpZy9pMzg2dnssMzJ9eywtZ306IEFkZCBYTV9DRkxBR1M9LURnZXRwYWdlc2l6ZSgpPTQwOTYuCglnbWFsbG9jLmM6ICNpZiAwIG91dCAhSEFWRV9HRVRQQUdFU0laRSBjb2RlLgoKCSogZXhwcmVhZC55IChhYnNfZGVjbCk6IEFjY2VwdCAnJicgYW5kICcmJyBhYnNfZGVjbC4KCgkqIHN5bXRhYi5jLCBzeW10YWIuaDogSGF2ZSBhIGJ1aWx0aW5fdHlwZV97LHVuc2lnbmVkX31sb25nX2xvbmcKCXJlZ2FyZGxlc3Mgb2YgTE9OR19MT05HLgoJZGVmcy5oIChUQVJHRVRfTE9OR19MT05HX0JJVCk6IE5ldyBtYWNyby4KCWV4cHJlYWQueSAodHlwZWJhc2UpOiBBZGQge3Vuc2lnbmVkLH0gbG9uZyBsb25nIHssaW50fS4KClRodSBBcHIgMjUgMTI6MzE6MjIgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogdmFsb3BzLmMgKHR5cGVjbXApOiBJZiB0MiA9PSAwLCByZXR1cm4gMS4KCldlZCBBcHIgMjQgMDk6NDU6MTcgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoJQ2hhbmdlcyBmcm9tIFRpZW1hbm46CgkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogQWRkICJudyIsICJkbCIsICJjb21wb3VuZCIuCgkoY3BsdXNfbWFuZ2xlX29wbmFtZSk6IE5ldyBmdW5jdGlvbi4KCShkb190eXBlKTogQWRkIGNhc2UgJ1EnLgoJKiB2YWx1ZXMuYyAoY2hlY2tfc3R1Yl9tZXRob2QpOiBEbyBsb29rdXBfbWV0aG9kX3R5cGUgYW5kIHN0dWZmCglyYXRoZXIgdGhhbiBzbWFzaF90b19tZXRob2RfdHlwZS4KCXN5bXRhYi5jLCBzeW10YWIuaCAoYWxsb2NhdGVfc3R1Yl9tZXRob2QpOiBOZXcgZnVuY3Rpb24uCglkYnhyZWFkLmMgKHJlYWRfdHlwZSk6IElmIHdlIGdldCAiIyMiLCBkb24ndCBsb29rdXBfZnVuY3Rpb25fdHlwZQoJYW5kIHN0YXJ0IGNsb2JiZXJpbmcgaXQ7IGFsbG9jYXRlX3N0dWJfbWV0aG9kIGluc3RlYWQuCgkqIHByaW50Y21kLmMgKHhfY29tbWFuZCk6IERlcmVmZXJlbmNlIHJlZmVyZW5jZXMuCgkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfdmFyc3BlY19wcmVmaXgsIGNhc2UgVFlQRV9DT0RFX01FVEhPRCk6CglEb24ndCBwcmludCAiICIgdHlwZV9wcmludF9iYXNlICguLi4pICI6OiIgaWYgIXBhc3NlZF9hX3B0ci4KCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogUHV0ICJvcCQiIGluc3RlYWQgb2YgIm9wZXJhdG9yIgoJaW4gdGhlIHN5bWJvbCB0YWJsZS4KCSogdmFsdWVzLmMgKGNoZWNrX3N0dWJfbWV0aG9kKTogRGVhbCB3aXRoIG9wZXJhdG9yIG5hbWVzLgoJKiB2YWxwcmludC5jIChjcGx1c192YWxfcHJpbnQpOiBDaGVjayBmb3IgZXJyb3IgaW4gYmFzZWNsYXNzX2FkZHIuCgkqIHZhbHVlcy5jOiBNb3ZlIGRlY2xhcmF0aW9uIG9mIGNwbHVzX2RlbWFuZ2xlIHRvIHRvcCBvZiBmaWxlLgoJKiB2YWx1ZXMuYyAoYmFzZWNsYXNzX2FkZHIpOiBJZiBjYW4ndCByZWFkIG1lbW9yeSwgc2V0ICpFUlJQCglyYXRoZXIgdGhhbiBjYWxsaW5nIGVycm9yKCkuCgkqIHZhbHVlLmg6IFJlbW92ZSByZWR1bmRhbnQgZGVjbGFyYXRpb24gb2YgdmFsdWVfc3RhdGljX2ZpZWxkLgoJKiB2YWx1ZXMuYyAodmFsdWVfc3RhdGljX2ZpZWxkKTogUmVjdXJzaXZlbHkgY2hlY2sgYWxsIGJhc2VjbGFzc2VzLgoJUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgoJKiB2YWx1ZXMuYywgdmFsdWUuaDogTmV3IGZ1bmN0aW9ucyB2YWx1ZV97aGVhZG9mLGZyb21fdnRhYmxlX2luZm99LgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiBQcmludCBvdXQgZmlyc3QgZWxlbWVudCBvZiB2dGJsCglzcGVjaWFsbHkuCgkqIHZhbHByaW50LmM6IE1vdmUgcHJpbnQgY29udHJvbHMgdG8gdG9wIGFuZCBhZGQgb2JqZWN0cHJpbnQuCglBZGQgY29tbWFuZCAic2V0IHByaW50IG9iamVjdCBvbi9vZmYiLgoJKiB2YWxwcmludC5jICh2YWx1ZV9wcmludCwgaXNfdnRibF9tZW1iZXIpOiBQdXQgdGhpbmdzIGluIGxvY2FsCgl2YXJpYWJsZXMgcmF0aGVyIHRoYW4gY29udGludWFsbHkgZG9pbmcgVkFMVUVfVFlQRSAodmFsKSwgZXRjLgoJKiB2YWxvcHMuYyAodmFsdWVfc3RydWN0X2VsdF9mb3JfYWRkcmVzcyk6IENhbGwgY2hlY2tfc3R1Yl9tZXRob2QuCgkqIHZhbG9wcy5jICh2YWx1ZV9zdHJ1Y3RfZWx0KTogUmVtb3ZlIGZvdW5kLCBhcmcxX2FzX3B0ci4KCSogdmFsb3BzLmMgKHNlYXJjaF9zdHJ1Y3RfbWV0aG9kKTogR2l2ZSBlcnJvciBpZiBqID4gMCAmJiBhcmdzID09IDAuCgkqIHZhbG9wcy5jIChzZWFyY2hfc3RydWN0X2ZpZWxkKTogTmV3IGFyZ3VtZW50IGxvb2tpbmdfZm9yX2Jhc2VjbGFzcy4KCUdpdmUgZXJyb3IgaWYgdmFsdWVfc3RhdGljX2ZpZWxkIG9yIHZhbHVlX3ByaW1pdGl2ZV9maWVsZAoJcmV0dXJuIE5VTEwuCgl2YWxvcHMuYyAodmFyaW91cyk6IENhbGwgc2VhcmNoX3N0cnVjdF9maWVsZCB3aXRoIGV4dHJhIHBhcmFtZXRlci4KCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBEZWFsIHdpdGggb3BlcmF0b3JzIHNwZWNpZmllZCBhcwoJIm9wZXJhdG9yIiA8b3B0aW9uYWwgd2hpdGVzcGFjZT4gPHN5bWJvbHMgZm9yIG9wZXJhdG9yPi4KCShvcGVyYXRvcl9jaGFycyk6IEhlbHAgZG8gaXQuCgkqIHN5bXRhYi5jIChsb29rdXBfc3RydWN0X2VsdF90eXBlKTogQ2FsbCBjaGVja19zdHViX3R5cGUuCglUYWtlIGFkZGl0aW9uYWwgYXJndW1lbnQgbm9lcnIuCglEb24ndCBkdW1wIGNvcmUgaWYgVFlQRV9GSUVMRF9OQU1FIGlzIE5VTEwuCglDaGVjayB0aGUgYmFzZWNsYXNzZXMgcmVjdXJzaXZlbHkuCgkqIHN5bWZpbGUuYyAoZmlsbF9pbl92cHRyX2ZpZWxkbm8pOiBEb24ndCBjYWxsIGNoZWNrX3N0dWJfdHlwZS4KCVJldHVybiB2b2lkIG5vdCBpbnQuIChhbHNvIGRlY2xhcmF0aW9ucyBpbiBzeW1maWxlLmggYW5kIHZhbHVlLmgpLgoJRGVhbCB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlLgoJKiBwcmludGNtZC5jIChwcmludF9jb21tYW5kXzEpOiBBZGQgaWYgKG9iamVjdHByaW50KSBjb2RlLgoJKiBleHByZWFkLnkgKHZhcmlhYmxlKTogQWxsb3cgZm9yIGRlc3RydWN0b3Igd2l0aCBmb286On5uYW1lLgoJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCwgY2FzZSBVTk9QX0xPR05PVCk6IElmIGZvbGxvd2luZyBvcGNvZGUKCWlzIE9QX1NDT1BFLCBnaXZlIGFuIGVycm9yLgoJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6IFBhc3MgdGhpcmQgYXJnIHRvIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUuCgkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKSwgdmFsdWVzLmMgKHZhbHVlX3ZpcnR1YWxfZm5fZmllbGQpOgoJRG9uJ3QgYm90aGVyIHRvIGRvIGFueXRoaW5nIHdpdGgKCXJldHVybiB2YWx1ZSBmcm9tIGZpbGxfaW5fdnB0cl9maWVsZG5vLgoJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6IElmIHZhbHVlX3N0YXRpY19maWVsZCByZXR1cm5zIE5VTEwsCglnaXZlIGFuIGVycm9yLgoJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBTZXQgZmNvbnRleHQgdG8gMCBmb3Igbm9ybWFsIG1lbWJlcgoJZnVuY3Rpb24uCgkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IEluaXRpYWxpemUgbmFtZSB0byAwLgoJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiLCBOX0NBVENIKTogQWRkIG9mZnNldCB0byBidWZwLT5uX3ZhbHVlLgoJKiBkYnhyZWFkLmMgKGRieF9jcmVhdGVfdHlwZSk6IFplcm8gVFlQRV9WUFRSX0JBU0VUWVBFLgoJKHJlYWRfc3RydWN0X3R5cGUpOiBEb24ndCBib3RoZXIgdG8gc2V0IFRZUEVfVlRQUl97QkFTRVRZUEUsRklFTEROT30KCWlmIGl0J3MganVzdCBnb2luZyB0byBiZSB7MCwxfS4KCgkqIGRieHJlYWQuYyAodmlydHVhbF9jb250ZXh0KTogVXNlIFRZUEVfQkFTRUNMQVNTIHN0YXJ0aW5nIGF0IDAKCSh5ZXMsIGl0J3MgI2lmIDAsIGJ1dCBqdXN0IGluIGNhc2UuLi4pLgoKCSogdmF4LW9wY29kZS5oLCBleHByZWFkLnksIGV4cHByaW50LmMsIGNwbHVzLWRlbS5jOiBEZWNsYXJlIHNvbWUKCXRoaW5ncyAiY29uc3QiLgoKCSogaTM4Ni1zdHViLmM6IE5ldyBmaWxlLgoKCSogV0hBVFMuTkVXOiBSZW1vdmUgbWVudGlvbiBvZiByZWFkbGluZSBhbmQgbW9yZSBwYWdpbmcgKGluIDMuNSkuCglUcnkgdG8ga2VlcCBjb21tYW5kIG5hbWVzIHVwIHRvIGRhdGUgd2l0aCByZW5hbWluZy4KCgkqIGdtYWxsb2MuYyBbIUhBVkVfR0VUUEFHRVNJWkVdOiBUcnkgdG8gZmlndXJlIG91dCB0aGUgcGFnZXNpemUuCgoJKiBpbmZ1bi5jIChyZXN1bWUsIHJlc3VtZV9jbGVhbnVwcyk6IE5ldyBmdW5jdGlvbnMuCgkod2FpdF9mb3JfaW5mZXJpb3IsIHByb2NlZWQsIGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6IFVzZSByZXN1bWUKCW5vdCB0YXJnZXRfcmVzdW1lLgoKCSogcmVtb3RlLmMgKGdldHBrdCk6IERvbid0IHNldCBpbW1lZGlhdGVfcXVpdC4KCgkqIGJsb2NrZnJhbWUuYywgZnJhbWUuaCAocmVpbml0X2ZyYW1lX2NhY2hlKTogTmV3IGZ1bmN0aW9uLgoJc29saWIuYyAoc29saWJfYWRkKSwgc3ltZmlsZS5jICh7LGFkZF99c3ltYm9sX2ZpbGVfY29tbWFuZCk6CglVc2UgaXQuCgpUdWUgQXByIDIzIDEwOjM4OjQxIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogQWRkIDMgbW9yZSBvZiB0aG9zZSBsb29wcyB0aHJvdWdoCgl0aGUgc3ltdGFicyB3aGljaCB3ZSBhbGwga25vdyBhbmQgbG92ZTogKDEpIExvb2sgaW4gdGhlCglTVEFUSUNfQkxPQ0sgZm9yIG1hbmdsZWQgc3ltYm9scyByaWdodCBhZnRlciB3ZSBjaGVjayB0aGUgYmxvY2tzLAoJKDIsIDMpIExvb2sgaW4gdGhlIFNUQVRJQ19CTE9DSyBmb3IgYWxsIHRoZSBzeW10YWJzIGFuZCBwc3ltdGFicwoJYXQgdGhlIGVuZC4KCgkqIG1haW4uYyAoY2RfY29tbWFuZCk6IENhbGwgZG9udF9yZXBlYXQuCgoJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBJZiBjb25zdC92b2xhdGlsZSBjaGFyYWN0ZXIgaXMKCW1pc3NpbmcsIGRvbid0IGNvbXBsYWluLCBqdXN0IGNvbnRpbnVlLgoKCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogT25seSB0cnkgdG8gcmVhZCB0aGUgZmNvbnRleHQgaWYKCWl0IGlzIHRoZXJlLiAgQWxzbyBjaGFuZ2UgImVycm9yX3R5cGUgIiB0byAicmV0dXJuIGVycm9yX3R5cGUgIi4KCXZhbHVlcy5jICh2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkKTogSWYgdGhlcmUgaXMgbm8gZmNvbnRleHQsCgl0aGVuIGRvIHRoaW5ncyB0aGUgd2F5IEdEQiAzLnggZGlkLgoJdmFsb3BzLmMgKHNlYXJjaF9zdHJ1Y3RfbWV0aG9kKTogQWRkIHR5cGUgdG8gdmFsdWVfdmlydHVhbF9mbl9maWVsZAoJYXJndW1lbnRzLgoKCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogRml4IHR5cG86ICpwcCAhPSAnXDAnIC0+ICoqcHAgIT0gJ1wwJy4KCk1vbiBBcHIgMjIgMDA6MDI6NDMgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6IEFkZCAndCcgZm9yIGJpbmFyeS4KCgkqIGRieHJlYWQuYyAoZW5kX3BzeW10YWIpOiBJbml0aWFsaXplIHBzdC0+c3ltdGFiLgoKCSogY29yZS5jIChjb3JlX29wZW4pOiBDYWxsIEFERF9TT0xJQi4KCgkqIHRtLXNwYXJjLmg6IEluY2x1ZGUgPHN1bjQvcmVnLmg+IG5vdCA8bWFjaGluZS9yZWcuaD4uCglzcGFyYy10ZGVwLmM6IERvbid0IGluY2x1ZGUgPG1hY2hpbmUvcmVnLmg+LgoKCSogc3VuMy14ZGVwLmMgWyFUQVJHRVRfU1VOM106IEp1c3QgcHJvdmlkZSBlbXB0eSBmdW5jdGlvbnMgd2hpY2gKCWRvbid0IGRvIGFueXRoaW5nLgoKCSogY29yZS5jIChjb3JlX29wZW4pOiBBZGQgbWFrZV9jbGVhbnVwICh1bnB1c2hfdGFyZ2V0LCAmY29yZV9vcHMpLgoKCSogU2hhcmVkIGxpYnJhcnkvY29yZWZpbGUgY2hhbmdlcyBmcm9tIFBldGVyIFNjaGF1ZXI6Cgljb3JlLmMgKGNvcmVfY2xvc2UpOiBDYWxsIENMRUFSX1NPTElCLgoJKGNvcmVfb3Blbik6IFJlbW92ZSBjb21tZW50IGFib3V0ICJzaG91bGQgZGVhbCB3aXRoIHNoYXJlZCBsaWIiLgoJKGNvcmVfeGZlcl9tZW1vcnkpOiBJZiB3ZSBjYW4ndCB4ZmVyIHRoZSB1c3VhbCB3YXksIHRyeSB0aGUKCXNoYXJlZCBsaWJyYXJpZXMuCglzb2xpYi5jIChzb19saXN0KTogTmV3IGZpZWxkcyBzb19iZmQgYW5kIHNvX3NlY3Rpb25zeyxfZW5kfS4KCShmaW5kX3NvbGliKTogVXNlIHNvbGliX21hcF9zZWN0aW9ucyB0byBnZXQgbGRfdGV4dC4KCShzb2xpYl9tYXBfc2VjdGlvbnMsIHNvbGliX3hmZXJfbWVtb3J5KTogTmV3IGZ1bmN0aW9ucy4KCShjbGVhcl9zb2xpYik6IEZyZWUgc29fc2VjdGlvbnMgYW5kIGNsb3NlIHNvX2JmZC4KCXRtLXN1bm9zLmg6IEFkZCBzb2xpYl94ZmVyX21lbW9yeSwgc29saWJfYWRkLgoKCSogc3BhcmMtdGRlcC5jIChza2lwX3Byb2xvZ3VlKTogRG9uJ3Qgc2tpcCBhbnl0aGluZyB1bmxlc3MgdGhlcmUKCWlzIGEgInNhdmUiIGluc3RydWN0aW9uIGluIHRoZXJlIHNvbWV3aGVyZS4KCgkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogQWRkIGNvbW1lbnQuCglzb2xpYi5jIChzb2xpYl9hZGQpOiBEb24ndCBtYWxsb2MgbmFtZSBwYXNzZWQgdG8gc3ltYm9sX2ZpbGVfYWRkLgoKCSogZXhlYy5jIChidWlsZF9zZWN0aW9uX3RhYmxlKTogSWYgKnN0YXJ0IGlzbid0IE5VTEwsIGZyZWUgaXQuCgkKCSogc3RhY2suYyAocGFyc2VfZnJhbWVfc3BlY2lmaWNhdGlvbik6IEVycm9yIGlmIE5VTEwgc2VsZWN0ZWRfZnJhbWUuCglpbmZjbWQuYyAoZmluaXNoX2NvbW1hbmQpOiBFcnJvciBpZiBOVUxMIHNlbGVjdGVkX2ZyYW1lLgoJaW5mbG93LmMgKGtpbGxfY29tbWFuZCk6IERlYWwgd2l0aCBOVUxMIHNlbGVjdGVkX2ZyYW1lLgoJc3RhY2suYyAocmVjb3JkX3NlbGVjdGVkX2ZyYW1lKTogU2V0ICpGUkFNRVAgdG8gTlVMTCBpZiB0aGVyZQoJaXMgbm8gc2VsZWN0ZWQgZnJhbWUuCglpbmZydW4uYyAocmVzdG9yZV9pbmZlcmlvcl9zdGF0dXMpOiBBZGQgY29tbWVudC4KCWZpbmR2YXIuYyAocmVhZF92YXJfdmFsdWUpOiBDaGVjayBmb3IgTlVMTCBmcmFtZSB3aGVyZSB3ZSBuZWVkCglhIGZyYW1lLgoJYnJlYWtwb2ludC5jIChnZXRfY2F0Y2hfc2Fscyk6IENoZWNrIGZvciBOVUxMIHNlbGVjdGVkX2ZyYW1lLgoKCSogYnJlYWtwb2ludC5jIChicHN0YXRfcHJpbnQpOiBUcnkgYWxsIGVsZW1lbnRzIG9uIHRoZSBicHN0YXQKCWNoYWluIGJlZm9yZSBnaXZpbmcgdXAgd2l0aCBhbiBpbnRlcm5hbCBlcnJvci4KClN1biBBcHIgMjEgMjE6NDM6MTAgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogdmFsdWUuaCwgdmFsdWVzLmMgKHZhbHVlX3ssZnJlZV90b199bWFyayk6IE5ldyBmdW5jdGlvbnMuCglicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6IFVzZSB0aGVtLgoKCSogdG0taTM4NnZ7LC1nfS5oOiBSZW1vdmUgTl9TRVRfTUFHSUMgZGVmaW5lLgoKU2F0IEFwciAyMCAyMTo0Mjo0NyAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBpMzg2LXRkZXAuYzogUmVtb3ZlIHVubmVjZXNzYXJ5ICNpbmNsdWRlcy4KCgkqIHN5bXRhYi5jICh2YXJpb3VzKTogQ2hhbmdlIGVycm9yIHJldHVybiBvZiBmaW5kX2xpbmVfY29tbW9uIHRvIC0xLgoKCSogY29mZnJlYWQuYyAoZmluZF9saW5lbm9zKTogVXNlIExJTkVTWiBub3Qgc2l6ZW9mIChzdHJ1Y3QgbGluZW5vKS4KCgkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIpOiBJbml0aWFsaXplIGxhbmd1YWdlLCBkaXJuYW1lLCBhbmQKCWZ1bGxuYW1lIGZpZWxkcy4KCkZyaSBBcHIgMTkgMTg6MTg6MzEgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogbWlwcy10ZGVwLmMgKG1pcHNfZnJhbWVfY2hhaW4pOiBEb24ndCBjaGFpbiBpZiBzYXZlZF9wYyA9PSAwLgoKCSogc3RkZGVmLmggKHNpemVfdCk6IExldCBlaXRoZXIgX1NJWkVfVCBvciBfU0laRV9UXyBndWFyZCBpdC4KCgkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IFNldCBzdGFydHVwX2ZpbGVfe3N0YXJ0LGVuZH0gaWYKCWVudHJ5X3BvaW50IGlzIGluIGN1cnJlbnQgZmlsZS4KCgkqIGZpbmR2YXIuYyAocmVhZF9yZWdpc3Rlcl9nZW4pOiBBZGQgInRhcmdldCBieXRlLW9yZGVyIiBjb21tZW50LgoKV2VkIEFwciAxNyAxNzowOTo0OCAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBpMzg2LXRkZXAuYyAoaTM4Nl9nZXRfZnJhbWVfc2V0dXApOiBVc2UgU1dBUF9UQVJHRVRfQU5EX0hPU1QKCWJlZm9yZSByZXR1cm5pbmcgbG9jYWxzIG9yIHNsb2NhbHMuCgoJKiBpMzg2LXRkZXAuYyAoaTM4Nl9mb2xsb3dfanVtcCk6IERvIG5vdCBhZGQgZGF0YTE2IHRvIHBvcyBpbgoJY2FsbCB0byBjb2Rlc3RyZWFtX3NlZWs7IGFkZCBvbmUgdG8gcG9zIGlmIChhbmQgb25seSBpZikKCXdlIGFyZSBkZWFsaW5nIHdpdGggYSBqdW1wIHdpdGggZGF0YTE2ID09IDEgKGkuZS4gMHg2NiwgMHhlOSkuCgpNb24gQXByIDE1IDEyOjA0OjMyIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiBQdXQgZHVtbXkxIGluIHRhcmdldCBvcmRlcgoJYmVmb3JlIEZJWF9DQUxMX0RVTU1ZLgoKCSogdG0taTM4NnYuaCAoRklYX0NBTExfRFVNTVkpOiBEb24ndCBkZXBlbmQgb24gaG9zdCBieXRlIG9yZGVyLgoKU3VuIEFwciAxNCAxMTo1NToxOSAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiB2YWxvcHMuYyAocHVzaF93b3JkKTogQWRkIFNXQVBfVEFSR0VUX0FORF9IT1NULgoKCSogcmVtb3RlLmMgKHJlbW90ZV9vcGVuKTogU2VuZCAnKycgYmVmb3JlIGNhbGxpbmcgcHV0cGt0KCkuCgoJKiB0bS1pMzg2di5oIChSRUdJU1RFUl9WSVJUVUFMX1RZUEUpOiBSZXR1cm4gcG9pbnRlciB0byB2b2lkLAoJbm90IGludCwgZm9yIHBjLCBmcCwgYW5kIHNwLgoKCSogcmVtb3RlLmMgKHJlbW90ZV9vcGVuKTogQ2FsbCBzdGFydF9yZW1vdGUgYWZ0ZXIgcHV0cGt0KCI/Iik7CglpbmZydW4uYyAoc3RhcnRfcmVtb3RlKTogQWxzbyBjYWxsIHdhaXRfZm9yX2luZmVyaW9yICYgbm9ybWFsX3N0b3AuCgpTYXQgQXByIDEzIDIyOjExOjQyIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBzcGlmZi5jeWdudXMuY29tKQoKCSogZXhlYy5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KCgkqIHN1bjMteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IEFkZCAjaWZkZWYgRlAwX1JFR05VTS4KCkZyaSBBcHIgMTkgMDk6MzY6NTAgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogdG0tNjhrLmggKE5VTV9SRUdTKTogQ29uZGl0aW9uYWxpemUgb24gVEFSR0VUX1NVTjMgbm90IHN1bi4KCXRtLXN1bjMuaDogRGVmaW5lIFRBUkdFVF9TVU4zLgoKCSogdXRpbHMuYzogVXNlIENQTFVTX01BUktFUiBub3QgJyQnLgoKCSogY3BsdXMtZGVtLmM6IFVzZSBDUExVU19NQVJLRVIgbm90ICckJy4gIElmIENQTFVTX01BUktFUiBpc24ndAoJZGVmaW5lZCwgZGVmaW5lIGl0IHRvICckJy4KCgkqIGFybS1vcGNvZGUuaDogTmV3IGZpbGUgKHNhbWUgY29udGVudHMgYXMgYmVmb3JlOyBpdCBoYWQKCWp1c3QgYmVlbiBsZWZ0IG91dCBvZiB0aGUgZGlzdHJpYnV0aW9uIGZvciBhIGxvbmcgdGltZSkuCgoJKiB0bS02OGsuaDogUHV0IGRlY2xhcmF0aW9uIG9mIGV4dF9mb3JtYXRfNjg4ODEgb3V0c2lkZSB0aGUgbWFjcm9zLgoKCSogbWFpbi5jOiBOZXcgSEFWRV9TSUdTRVRNQVNLICNpZmRlZnMuCgoJKiBjb2ZmcmVhZC5jIChyZWFkX2NvZmZfc3ltdGFiKTogQ2hlY2sgZm9yICJMRiUiIHdpdGggYWxsIHRoZQoJb3RoZXIgTColIHRoaW5ncy4KCgkqIGNvZmZyZWFkLmMgKFNEQl9UWVBFKTogTmV3IG1hY3JvLgoJdmFyaW91czogVXNlIGl0IGluc3RlYWQgb2YgY2hlY2tpbmcgYWdhaW5zdCBUX05VTEwuCgoJKiBNYWtlZmlsZS5kaXN0IChjcGx1cy1kZW0ubyk6IEhhY2sgaW4gYW4gI2luY2x1ZGUgInBhcmFtLmgiCgliZWZvcmUgd2UgY29tcGlsZSBpdC4KCWRlZnMuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4KCXBhcmFtLmg6IEluY2x1ZGUgZGVmcy5oLgoJc2lnbmFtZS5jOiBDaGFuZ2UgI2lmZGVmIFNZU19TSUdMSVNUX01JU1NJTkcgdG8gI2lmLgoJcGFyYW0tbm8tdG0uaDogRGVmaW5lIFNZU19TSUdMSVNUX01JU1NJTkcgZnJvbSBVU0cuCgpUaHUgQXByIDE4IDE5OjQ5OjEwIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGkzODYtcGluc24uYyAoT1BfRSk6IENoYW5nZSAlZCB0byAweCV4IGZvciBjb25zaXN0ZW5jeS4KCgkqIHB1dGVudi5jOiBOZXcgZmlsZQoJTWFrZWZpbGUuZGlzdDogQWRkIGl0IHRvICQoT0JTKS4KCgkqIG1pcHNyZWFkLmMgWyFDTVVDU106ICNpbmNsdWRlIDxzeW1zLmg+LgoKCSogbWlwcy14ZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogI2lmIDAgb3V0IHRoZSB3aG9sZSBmdW5jdGlvbi4KCgkqIE1vdmUgcmVhZF9tZW1vcnlfbm9icHQgZnJvbSBtZW0tYnJlYWsuYyB0byBicmVha3BvaW50LmMuCgpNb24gQXByIDE1IDIxOjQ1OjM1IDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIHV0aWxzLmMgKF9pbml0aWFsaXplX3V0aWxzKTogUmVuYW1lICJzZXQgZGVtYW5nbGUiIHRvCgkic2V0IHByaW50IGRlbWFuZ2xlIiwgInNldCBhc20tZGVtYW5nbGUiIHRvICJzZXQgcHJpbnQKCWFzbS1kZW1hbmdsZSIgYW5kICJzZXQgc2V2ZW5iaXQtc3RyaW5ncyIgdG8gInNldCBwcmludAoJc2V2ZW5iaXQtc3RyaW5ncyIuCgoJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6IFJlbmFtZSAic2V0IGhpc3Rvcnkgd3JpdGUiIHRvCgkic2V0IGhpc3Rvcnkgc2F2ZSIuCgoJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6IFJlbmFtZSAic2V0IGNhdXRpb24iIHRvCgkic2V0IGNvbmZpcm0iLgoKCSogdmFsdWVzLmMgKF9pbml0aWFsaXplX3ZhbHVlcyk6IFJlbW92ZSAiaW5mbyBoaXN0b3J5IiBhbGlhcwoJZm9yICh3aGF0IGlzIG5vdykgInNob3cgdmFsdWVzIi4KCgkqIGluZmNtZC5jLCBnZGJjbWQuaDogQWRkIHVuc2V0bGlzdC4KCWluZmNtZC5jOiBBZGQgdW5zZXRfY29tbWFuZC4KCShfaW5pdGlhbGl6ZV9pbmZjbWQpOiBBZGQgInVuc2V0IiBhbmQgdXNlIGl0IGZvciAidW5zZXQgZW52Ii4KCgkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IFJlbW92ZSAidW5zZXQiLgoKCSogdmFscHJpbnQuYzogQWRkICJzZXQvc2hvdyBwcmludCIsIHtzZXQsc2hvd31fcHJpbnQuCglSZW5hbWUgInNldCBhZGRyZXNzcHJpbnQiIHRvICJzZXQgcHJpbnQgYWRkcmVzcyIuCglSZW5hbWUgInNldCBhcnJheXByaW50IiB0byAic2V0IHByaW50IGFycmF5Ii4KCVJlbmFtZSAic2V0IGFycmF5LW1heCIgdG8gInNldCBwcmludCBlbGVtZW50cyIuCglSZW5hbWUgInNldCBwcmV0dHlwcmludCIgdG8gInNldCBwcmludCBwcmV0dHkiLgoJUmVuYW1lICJzZXQgdW5pb25wcmludCIgdG8gInNldCBwcmludCB1bmlvbiIuCglSZW5hbWUgInNldCB2dGJscHJpbnQiIHRvICJzZXQgcHJpbnQgdnRibCIuCgoJKiBtYWluLmM6IFJlbmFtZSB2ZXJzaW9uX2luZm8gdG8gc2hvd192ZXJzaW9uLgoJKF9pbml0aWFsaXplX21haW4pOiBSZW5hbWUgImluZm8gdmVyc2lvbiIgdG8gInNob3cgdmVyc2lvbiIuCgoJKiB2YWx1ZXMuYzogUmVuYW1lIHZhbHVlX2hpc3RvcnlfaW5mbyB0byBzaG93X3ZhbHVlcy4KCShfaW5pdGlhbGl6ZV92YWx1ZXMpOiBSZW5hbWUgImluZm8gdmFsdWVzIiB0byAic2hvdyB2YWx1ZXMiLgoKU3VuIEFwciAxNCAyMzowODozNCAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBpbmZ0YXJnLmMgKGNoaWxkX29wZW4pLCByZW1vdGUtdnh7LC42OH0uYyAodnhfcHJvY19vcGVuKToKCU5ldyBmdW5jdGlvbiB0byBnaXZlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZS4KClRodSBBcHIgMTEgMTc6MTk6NDEgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogdGFyZ2V0Lmg6IEFkZCB0b19kb2MgYW5kIHRhcmdldF9wcmVvcGVuLgoJdGFyZ2V0LmM6IEFkZCB0YXJnZXRfcHJlb3BlbiBhbmQgdGFyZ2V0X2NvbW1hbmQuCglSZW1vdmUgdGFyZ2V0X2luZm8uCgkoYWRkX3RhcmdldCk6IENhbGwgYWRkX2NtZCBhbmQgbWVzcyB3aXRoIHRhcmdldGxpc3QtPmRvYy4KCWNvcmUuYywgZXhlYy5jLCByZW1vdGUtZWIuYywgcmVtb3RlLW5pbmR5LmMsIHJlbW90ZS12eC5jLAoJcmVtb3RlLXZ4LjY4LmMsIGluZnRhcmcuYywgcmVtb3RlLmM6IEFkZCBkb2MgZmllbGQgdG8gdGFyZ2V0IHN0cnVjdC4KCUNhbGwgdGFyZ2V0X3ByZW9wZW4gZnJvbSBvcGVuIHJvdXRpbmUuCgoJKiBtYWluLmM6IFJlbmFtZSBlZGl0aW5nX2luZm8gdG8gc2hvd19jb21tYW5kcy4KCShfaW5pdGlhbGl6ZV9tYWluKTogUmVuYW1lICJpbmZvIGVkaXRpbmciIHRvICJzaG93IGNvbW1hbmRzIi4KCgkqIHNvdXJjZS5jOiBSZW5hbWUgZGlyZWN0b3JpZXNfaW5mbyB0byBzaG93X2RpcmVjdG9yaWVzLgoJKF9pbml0aWFsaXplX3ZhbHVlcyk6IFJlbmFtZSAiaW5mbyBkaXJlY3RvcmllcyIgdG8gInNob3cgZGlyZWN0b3JpZXMiLgoKCSogdmFsdWVzLmM6IFJlbmFtZSBjb252ZW5pZW5jZV9pbmZvIHRvIHNob3dfY29udmVuaWVuY2UuCgkoX2luaXRpYWxpemVfdmFsdWVzKTogUmVuYW1lICJpbmZvIGNvbnZlbmllbmNlIiB0byAic2hvdyBjb252ZW5pZW5jZSIuCgoJKiBjb3B5aW5nLmF3ayAoX2luaXRpYWxpemVfY29weWluZyk6IFJlbmFtZSAiaW5mbyBjb3B5aW5nIiB0bwoJInNob3cgY29weWluZyIgYW5kICJpbmZvIHdhcnJhbnR5IiB0byAic2hvdyB3YXJyYW50eSIuCglSZW5hbWUge2NvcHlpbmcsd2FycmFudHl9X2luZm8gdG8gc2hvd197Y29weWluZyx3YXJyYW50eX0uCgoJKiBzeW1maWxlLmM6IFJlbmFtZSBhZGRfc3ltc19jb21tYW5kIHRvIGFkZF9zeW1ib2xfZmlsZV9jb21tYW5kLgoJKF9pbml0aWFsaXplX3N5bWZpbGUsIGFkZF9zeW1zX2FkZHJfY29tbWFuZCk6CglSZW5hbWUgYWRkLXN5bXMgdG8gYWRkLXN5bWJvbC1maWxlLgoKVGh1IEFwciAxOCAxODowODozMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBzeW1maWxlLmggKGZyZWVfbmFtZWRfc3ltdGFicyk6ICBSZW5hbWUgZnJvbSBmcmVlX25hbWVkX3N5bXRhYi4KCSogc3ltZmlsZS5jIChjbGVhcl9zeW10YWJfdXNlcnNfb25jZSwgY2FzaGllcl9wc3ltdGFiLAoJZnJlZV9uYW1lZF9zeW10YWJzKTogIE1vdmUgdGhlc2Ugcm91dGluZXMgZnJvbSBzeW1taXNjLmMuCgkqIHN5bW1pc2MuYyAoc2FtZSk6ICBzYW1lLgoJKGZyZWVfc3ltdGFiKTogIE1ha2Ugbm9uLXN0YXRpYy4KCSogc3ltdGFiLmggKGZyZWVfc3ltdGFiKTogIERlY2xhcmUgYXMgZXhwb3J0ZWQgdm9pZCBmbiBub3cuCgkqIGRieHJlYWQuYyAoZW5kX3N5bXRhYiwgZW5kX3BzeW10YWIpOiAgQ2hhbmdlIGNvbW1lbnRzLgoJKGluaXRpYWxpemVfZGJ4cmVhZCk6ICBDYWxsIGRieF9uZXdfaW5pdCgpIGluIGNhc2UgdGhlIGZpcnN0Cgljb21tYW5kIGlzIGFkZC1zeW1ib2xzLgoJKiB0YXJnZXQuYyAoZHVtbXlfdGFyZ2V0KTogIFBlcm1pdCBhZGRfc3ltc19hZGRyX2NvbW1hbmQuCgpTYXQgQXByIDEzIDE0OjQ2OjA3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCglQZXJtaXQgc3ltYm9scyB0byBiZSBzdXBlcnNlZGVkIHdoZW4gbmV3IHN5bWJvbCBmaWxlcyBoYXZlCgliZWVuIHJlYWQgaW4sIHBhcnRpY3VsYXJseSBmb3IgVnhXb3Jrcy4KCgkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogQWxsb3cgTl9TT0wgdG8gY2xlYW5seSB0YWtlIHVzIGJhY2sKCXRvIHRoZSBtYWluIGZpbGUsIGFzIHdlbGwgYXMgdG8gaW5jbHVkZSBmaWxlcy4gIEFsc28sIHB1dCBnbG9iYWwKCWZ1bmN0aW9ucyBpbnRvIHRoZSBnbG9iYWwgcHN5bXRhYiwgdG8gbWFrZSAiaSBmdW4iIHdvcmsuCgkoZW5kX3BzeW10YWIpOiAgRnJlZSBuYW1lZCBzeW10YWJzIGFuZCBwc3ltdGFicyBmb3IgYSBmaWxlLCBvbmNlIGEKCW5ldyBwc3ltdGFiIGZvciBpdCBoYXMgYmVlbiByZWFkLgoJKiBjb2ZmcmVhZC5jIChlbmRfcHN5bXRhYik6ICBGcmVlIG5hbWVkIHN5bXRhYnMgYW5kIHBzeW10YWJzIGZvcgoJYSBmaWxlLCBvbmNlIGEgbmV3IHN5bXRhYiBoYXMgYmVlbiByZWFkIGZvciBpdC4KCSogbWlwc3JlYWQuYzogIEZJWE1FLiAgV2UgbmVlZCB0byBkbyB0aGUgc2FtZSBmb3IgTUlQUywgYnV0IGl0Cglsb29rcyBoYXJkZXIgdG8gZGV0ZXJtaW5lIHRoZSB0b3AtbGV2ZWwgYmxvY2sgYmVmb3JlIGl0J3MgYmVlbgoJcXVldWVkIHRvIHRoZSBwc3ltdGFiIGxpc3QuCQoKCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9hZGQpOiAgVXNlIGZpbHRlcmVkIHByaW50aW5nIGFuZCB3cmFwIGl0LgoJSWYgd2UgaGF2ZSB3aXBlZCBvdXQgYW55IG9sZCBzeW1ib2wgdGFibGVzLCBjbGVhbiB1cCBhdCBlbmQgb2YKCXN5bWJvbCByZWFkaW5nLgoJKHN5bWJvbF9maWxlX2NvbW1hbmQpOiAgRG9uJ3QgcmVmZXJlbmNlIHN5bWZpbGVfZm5zIGlmIGl0J3MgemVyby4KCgkqIHN5bXRhYi5oIChHTE9CQUxfQkxPQ0ssIFNUQVRJQ19CTE9DSywgRklSU1RfTE9DQUxfQkxPQ0spOiAgTmV3CglkZWZpbmVzIGZvciB0aGUgYmxvY2tzIG9mIGEgYmxvY2t2ZWN0b3IgdGhhdCBjb250YWluIGdsb2JhbCBhbmQKCWZpbGUtc3RhdGljIHN5bWJvbHMgYW5kIHRoZSBmaXJzdCBvZiB0aGUgc21hbGxlciBzY29wZSBjb250b3Vycy4gCgkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sLCBmaW5kX3BjX3N5bXRhYiwgZmluZF9wY19saW5lLAoJZGVjb2RlX2xpbmVfMSwgbWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0KTogIFVzZSB0aGUgYWJvdmUuCgkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIsIHBhdGNoX29wYXF1ZV90eXBlcyk6ICBEaXR0by4KCSogZGJ4cmVhZC5jIChlbmRfc3ltdGFiKTogIERpdHRvLgoJKiBleHByZWFkLnkgKGJsb2NrKTogIERpdHRvLgoJKiBtaXBzcmVhZC5jICh0aHJvdWdob3V0KTogIERpdHRvLgoJKiBzeW1taXNjLmMgKGZyZWVfbmFtZWRfc3ltdGFicyk6ICBEaXR0by4KCgkqIHN5bXRhYi5jIChsaXN0X3N5bWJvbHMpOiAgUHJvY2VzcyB0aGUgZmlyc3Qgc3ltYm9sIG9mIHRoZQoJc3RhdGljIHBzeW1ib2xzIGxpc3QuCgkodHlwZXNfaW5mbyk6ICBSZXN0b3JlIHRoaXMgZnVuY3Rpb24gZnJvbSBpdHMgdW50aW1lbHkgI2lmIDAuCglJdCdzIG5vdCBwZXJmZWN0LCBidXQgaXQgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4KCShfaW5pdGlhbGl6ZV9zeW10YWIpOiAgUmVzdG9yZSAiaW5mbyB0eXBlcyIuCgpUaHUgQXByIDExIDA1OjIzOjE5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIG02OGstc3R1Yi5jOiAgUmVtb3RlIHN0dWIgZm9yIDY4MHgwJ3MsIGNyZWF0ZWQgZnJvbQoJcmVtLW02OGsuc2hhciAod2hpY2ggaXMgcmVtb3ZlZCkuCgkqIG5pbmR5LXNoYXJlL3tNYWtlZmlsZSxPbmluZHkuYyxibG91dC5oLGVudi5oLG5pbmR5LmMsdHR5Zmx1c2guY306CglSZW1vdmUgUkNTIGxvZyBzdHVmZiBub3cgdGhhdCB3ZSB1c2UgQ1ZTIGFuZCBpdCBibG93cyBvdXIgZGlmZnMuCgpXZWQgQXByIDEwIDE0OjE4OjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIHN5bW1pc2MuYyAoZnJlZV9uYW1lZF9zeW10YWIpOiAgTWFrZSBpdCB3b3JrLCBpbiBpdHMgY3VycmVudAoJa2x1ZGd5IGZhc2hpb24uICBDaGFuZ2UgcmVzdWx0IHRvIGluZGljYXRlIGlmIHdlIGJsZXcgYXdheSBia3B0cy4KCSogZGJ4cmVhZC5jIChlbmRfc3ltdGFiKTogIEFjY3VtdWxhdGUgcmVzdWx0IGZyb20KCWZyZWVfbmFtZWRfc3ltdGFiIGFuZCBwcmludCB3YXJuaW5nIGlmIHdlIGJsZXcgdXNlcidzIHN0YXRlLgoJKiBzeW1maWxlLmg6ICBmcmVlX25hbWVkX3N5bXRhYiBub3cgcmV0dXJucyBhbiBpbnQuCgpNb24gQXByICA4IDIzOjU3OjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfcmVhZCk6ICBJbml0aWFsaXplIHBzeW1ib2wgbGlzdCBpZiB0aGlzCglpcyB0aGUgZmlyc3Qgc3ltYm9sIHJlYWQsIGV2ZW4gaWYgbm90IG1haW5saW5lLgoJKGRieF9wc3ltdGFiX3RvX3N5bXRhYik6ICBzeW1maWxlIG1pZ2h0IGJlIHplcm8sIGNvcGUuCgkqIGV4ZWMuYyAoZXhlY19vcHMpOiAgQWRkX3N5bXNfYWRkciBpcyB2YWxpZCBpbiBvdXIgdHZlYy4KCShzZXRfc2VjdGlvbl9jb21tYW5kKTogIE5ldyBjb21tYW5kICgic2VjdGlvbiB4eHggeXl5IiAtLSBzaG91bGQKCWJlIHJlbmFtZWQgdG8gInNldCBzZWN0aW9uIHh4eCB5eXkiIEZJWE1FKSB3aGljaCBzZXRzIHRoZQoJYmFzZSBhZGRyZXNzIG9mIGEgc2VjdGlvbiBvZiB0aGUgZXhlYyBmaWxlLCBvdmVycmlkaW5nIHRoZQoJdmlydHVhbCBhZGRyZXNzIHRoYXQgQkZEIHJlcG9ydHMuCgpGcmkgQXByICA1IDE3OjE0OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGV4ZWMuYzogIEFkZCBhZGRfc3ltc19hZGRyX2NvbW1hbmQgdG8gZXhlY19vcHMsIHNvIHlvdSBjYW4KCWxvYWQgc3ltYm9scyBhdCBhbnkgYWRkcmVzcyB3aGlsZSBleGFtaW5pbmcgYW4gZXhlYyBmaWxlLgoKVGh1IEFwciAgNCAxMDowOTozNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiB0bS1pMzg2di5oIChGTE9BVF9JTkZPKTogIERvbid0IGRlZmluZSBpdCwgc2luY2UgdGhlIGNvZGUKCWZvciBwcmludGluZyB0aGUgZmxvYXQgaW5mbyBpcyBob3N0LWRlcGVuZGVudCwgbm90Cgl0YXJnZXQtZGVwZW5kZW50LiAgRklYTUUuCgkqIGkzODYtcGluc24uYzogIE1vdmUgI2luY2x1ZGVzIHRvIHRvcCwgcmVtb3ZlIHVzZWxlc3Mgb25lcy4KCSogaTM4Ni10ZGVwLmM6ICBEb24ndCBib3RoZXIgaW5jbHVkaW5nIDwuLi4vcmVnLmg+IHNpbmNlIHdlCglkb24ndCB1c2UgaXQgKGFuZCBpdCBkb2Vzbid0IGV4aXN0IG9uIGhvc3Qgc3lzdGVtcykuCgoJKiBpZWVlLWZsb2F0LmMgKGllZWVfZXh0ZW5kZWRfdG9fZG91YmxlKTogIENvbnZlcnQgTmFOIHRvIEluZi4KCUNvbnZlcnQgbmVnYXRpdmUgbnVtYmVycyBwcm9wZXJseS4KCShpZWVlX3Rlc3QpOiAgTWFrZSBudW1iZXJzIHJlYWxseSByYW5kb207IGZpeCBmb3JtYXQgYXJnLgoKCSogaW5mY21kLmMgKGF0dGFjaF9jb21tYW5kLCBkZXRhY2hfY29tbWFuZCk6ICBEb24ndCByZXBlYXQgb24gQ1IuCgkqIGNvcmUuYyAoY29yZV9kZXRhY2gpOiAgVW5wdXNoIGNvcmVfb3BzLCB3aGljaCBtaWdodCBub3QgYmUgb24KCXRvcC4gIFdlIHVzZWQgdG8ganVzdCBwb3AgdGhlIHRvcCwgd2hpY2ggYnJva2UgdGhpbmdzLiAgRG9uJ3QKCW5lZWQgZG9udF9yZXBlYXQoKSBhbnkgbW9yZS4KCShjb3JlX2ZpbGVfY29tbWFuZCk6ICBQc3N0ISAgRG9uJ3QgcmVwZWF0IGl0LgoJKiByZW1vdGUtbmluZHkuYyAobmluZHlfZGV0YWNoKTogIERvbid0IG5lZWQgZG9udF9yZXBlYXQoKSBub3cuCgkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBBdm9pZCBzd2l0Y2ggZmFsbHRocnUgb24KCUJJTk9QX0FTU0lHTl9NT0RJRlksIHNvIHdlIGNhbiBwcmludCArPSBhbmQgc3VjaC4KCSogZnJhbWUuaDogIEZpeCB0eXBvLgoJKiBpbmZsb3cuYyAoa2lsbF9jb21tYW5kKTogIEFmdGVyIGtpbGxpbmcgaW5mZXJpb3IsIHByaW50IG91cgoJY3VycmVudCBmcmFtZSBpbiB0aGUgY29yZSBmaWxlLCBpZiB3ZSBoYXZlIG9uZS4KCShnZW5lcmljX21vdXJuX2luZmVyaW9yKTogIFdoZW4gaW5mZXJpb3IgZGllcywgZWl0aGVyIHNlbGVjdAoJdGhlIGN1cnJlbnQgZnJhbWUgKGluIHRoZSBuZXcgdGFyZ2V0LCBlLmcuIGNvcmUgZmlsZSksIG9yIAoJc2V0IGJvdGggdGhlIGN1cnJlbnQgYW5kIHNlbGVjdGVkIGZyYW1lcyB0byBOVUxMLgoKCUNoYW5nZXMgZnJvbSBQZXRlciBTY2hhdWVyLgoKCSogaW5mcHRyYWNlLmM6ICBBdm9pZCA8c3lzL3B0cmFjZS5oPiBvbiBVU0cuCgoJKiBNYWtlIGFsbCBmaWxlIG5hbWVzIGZpdCBpbiAxNCBjaGFyYWN0ZXJzIChzaWdoIGFuZCBkYW1uISk6CgltdiBocDMwMGhwdXgteGRlcC5jIGhwMzAwdXgteGRlcC5jCgltdiBzeW1tZXRyeS14ZGVwLmMgc3ltbS14ZGVwLmMKCW12IHN5bW1ldHJ5LXRkZXAuYyBzeW1tLXRkZXAuYwoJbXYgY29udmV4LW9wY29kZS5oIGNvbnZ4LW9wY29kZS5oCgltdiB0bS12eHdvcmtzOTYwLmggdG0tdng5NjAuaAoJbXYgdG0tdnh3b3JrczY4LmggdG0tdng2OC5oCgltdiBNYWtlZmlsZS5zcmNkaXIgTWFrZWZpbGUuc2RpcgoJbXYgZ2RiLWludC50ZXhpbmZvIGdkYmludC50ZXhpbmZvCgltdiByZW1vdGUtc2EubTY4ay5zaGFyIHJlbS1tNjhrLnNoYXIKCW12IHJlbW90ZS1tdWx0aS5zaGFyIHJlbS1tdWx0aS5zaGFyCgkqIE1ha2VmaWxlLmRpc3QsIFJFQURNRSwgY29uZmlnLmdkYiwgY29udmV4LXBpbnNuLmMsCgl0Y29uZmlnL3N5bW1ldHJ5LCB0Y29uZmlnL3Z4d29ya3M5NjAsIHRjb25maWcvdnh3b3JrczY4LAoJeGNvbmZpZy9ocDMwMGhwdXgsIHhjb25maWcvc3ltbWV0cnk6ICBDaGFuZ2UgbmFtZXMgdG8gc2hvcnRlcgoJbmFtZXMuCgoJKiBjb21tYW5kLmMgKHVzZXJfaW5mb18xLCB1c2VyX2luZm8pOiAgTmV3IGNvbW1hbmQgZm9yIGxpc3RpbmcKCXRoZSB1c2VyLWRlZmluZWQgY29tbWFuZHMuCgpXZWQgQXByICAzIDE1OjAwOjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGRieHJlYWQuYyAocmVhbGx5X2ZyZWVfcGVuZGluZ3MpOiAgQ2xlYXIgZmlsZV9zeW1ib2xzCglhbmQgZ2xvYmFsX3N5bWJvbHMgYWZ0ZXIgZnJlZWluZyB0aGVtOyBvdGhlcndpc2UsIHJ1bm5pbmcKCXRoaXMgZnVuY3Rpb24gdHdpY2UgKGlmIGl0IGFwcGVhcnMgdHdpY2Ugb24gdGhlIGNsZWFudXAKCWNoYWluKSwgd2UgdHJ5IHRvIGZyZWUgdGhpbmdzIHR3aWNlLgoKCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiAgQ2FsY3VsYXRlIGVuZF9vZl90ZXh0X2FkZHIKCWJhc2VkIG9uIHRleHRfYWRkciAodGhlIGFkZHJlc3Mgb2YgdGV4dCBpbiBjb3JlKSwgbm90IG9uIGFkZHIgKHRoZQoJb2Zmc2V0IGJldHdlZW4gdGV4dCBpbiB0aGUgLm8gZmlsZSBhbmQgaW4gY29yZSkuICBUaGlzIGNoYW5nZQoJaXMgZnJvbSBQZXRlciBTY2hhdWVyLgoKCSogbWFpbi5jOiAgRGVmaW5lIEFMTF9DTEVBTlVQUyBhcyBhIGNhc3Qgb2YgemVyby4KCShyZXR1cm5fdG9fdG9wX2xldmVsKTogIFVzZSBpdC4KCShtYWluKTogIERvIGFsbCBjbGVhbnVwcyBhZnRlciBlYWNoIGNvbW1hbmQgcnVuIGFzIHBhcnQKCW9mIHRoZSBnZGIgc3RhcnR1cCBzZXF1ZW5jZS4gIEFsc28gZG8gYWxsIGNsZWFudXBzIGJlZm9yZQoJZW50ZXJpbmcgdGhlIGNvbW1hbmQgbG9vcCwgYW5kIGV2ZXJ5IHRpbWUgd2UgZXhpdCB0aGUgY29tbWFuZAoJbG9vcCBhbmQgcmVlbnRlci4gIEJlZm9yZSwgdGhlIGNsZWFudXBzIGZyb20gdGhlIHN0YXJ0dXAgc2VxdWVuY2UKCXdlcmUgYmVpbmcgbGVmdCB1bmRvbmUgdW50aWwgdGhlIGZpcnN0IGVycm9yIQoJKGNvbW1hbmRfbG9vcCk6ICBSZW5hbWUgZG9fbm90aGluZyBjbGVhbnVwIHRvIGNvbW1hbmRfbG9vcF9tYXJrZXIKCXNvIHdlIGNhbiBzZWUgaXQgZWFzaWx5IHdoZW4gZXhhbWluaW5nIHRoZSBjbGVhbnVwIGNoYWluLgoJKGluaXRfc2lnbmFscyk6ICBBZGQgYW5vdGhlciBkb19ub3RoaW5nIGZvciBzaWduYWwgaGFuZGxpbmcuCgkocXVpdF9jb21tYW5kKTogIE9ubHkgdHJ5IHRvIGtpbGwgdGFyZ2V0IGlmIGl0IGhhcyBleGVjdXRpb24uCglQcm9ibGVtcyBpbiB0aGUgdGFyZ2V0IHN0YWNrIGdvdCB1cyBpbnRvIGEgc3RhdGUgd2hlcmUKCWluZmVyaW9yX3BpZCB3YXMgbm9uemVybyBidXQgbm9uZSBvZiB0aGUgdGFyZ2V0cyBoYWQgZXhlY3V0aW9uLgoJSW4gdGhpcyBzdGF0ZSB5b3UgY291bGRuJ3QgZXhpdCBnZGIuCgoJKiBkYnhyZWFkLmM6ICBUd28gY2hhbmdlcyBmcm9tIFBldGVyIFNjaGF1ZXIuCgkoZWNob19jb21tYW5kKTogIEZmbHVzaCBvdXRwdXQgYWZ0ZXIgYW4gZWNobyBjb21tYW5kLgoJKHNob3dfaGlzdG9yeSk6ICBQYXNzIGFsbCBhcmdzIHRvIGNtZF9zaG93X2xpc3QuCgoJKiB1dGlscy5jIChpbml0X21hbGxvYyk6ICBDYWxsIG10cmFjZSB0byB0dXJuIG9uIHRyYWNpbmcKCWlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBNQUxMT0NfVFJBQ0UgaXMgc2V0IHRvIGEgZmlsZSBuYW1lLgoJKiBtdHJhY2UuYzogIEFkZCBzb3VyY2UgZmlsZSB3aGljaCBwcm92aWRlcyBhIGxvZyBvZiBldmVyeSBtYWxsb2MsCglmcmVlLCBhbmQgcmVhbGxvYyB0byBhIHRyYWNlIGZpbGUuCgkqIG10cmFjZS5hd2s6ICBBZGQgc291cmNlIGZpbGUgd2hpY2ggYW5hbHl6ZXMgdGhlIHRyYWNlIGZpbGUuCgkqIE1ha2VmaWxlLmRpc3QgKEdOVV9NQUxMT0MsIE1BTExPQ1NSQyk6ICBBZGQgbXRyYWNlLntjLG8sYXdrfS4KCShWRVJTSU9OKTogIFJvbGwgdG8gMy45NC4zLgoKCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50XzEpOiAgQWRkIGEgc3BhY2UgdG8gImkgd2F0Y2giIG91dHB1dC4KCShjaGVja19kdXBsaWNhdGVzKTogIERvbid0IGJvdGhlciB3aXRoIHdhdGNocG9pbnRzLgoJKHNldF9yYXdfYnJlYWtwb2ludCk6ICBDb21tZW50IGFib3V0IGRhbmdlciBvZiB0aGlzIHJvdXRpbmUuCgkod2F0Y2hfY29tbWFuZCk6ICBQYXJzZSBhbmQgZXZhbCBhbGwgYXJncyBiZWZvcmUgY2FsbGluZwoJc2V0X3Jhd19icmVha3BvaW50LgoKCSogc29saWIuYyAoZmluZF9zb2xpYik6ICBBdm9pZCBlcnJvciBpbiByZWZlcmVuY2luZyBtZW1vcnkgdG8KCXNlZSBpZiBhbnkgbW9yZSBzaGFyZWQgbGlicmFyaWVzIGhhdmUgYmVlbiBhZGRlZC4gIFRoaXMgaXMKCXBhcnRpY3VsYXJseSB1c2VmdWwgaWYgdGhlIHRhcmdldCBoYXMgdGVybWluYXRlZC4gIEJ1ZyByZXBvcnRlZAoJYnkgUGV0ZXIgU2NoYXVlci4KCglDaGFuZ2VzIGZyb20gUGV0ZXIgU2NoYXVlciA8cGVzcmVtQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CglpbiBicmluZ2luZyB1cCAzLjk0LjIgb24gdGhlIFN1bi0zLgoKICAgICAgICAqIE1ha2VmaWxlLmRpc3Q6ICBJbmNsdWRlIENGTEFHUyBpbiBydWxlIGZvciBjcGx1cy1kZW0uby4KICAgICAgICAqIGJyZWFrcG9pbnQuYyAoZW5hYmxlX2JyZWFrcG9pbnQpOiAgQ2hlY2sgZm9yIHZhbGlkIHdhdGNocG9pbnQKICAgICAgICBleHByZXNzaW9uIChpbiBzY29wZSkgYmVmb3JlIHJlZW5hYmxpbmcgd2F0Y2hwb2ludC4KCSogc2lnbmFtZS5jIChpbml0X3NpZ3MpOiAgQWRkIG1pc3NpbmcgZGVjbGFyYXRpb24gb2YgaSwgZml4CglzeXNfc2lnbGlzdCBkZWNsYXJhdGlvbi4KCSogc291cmNlLmMgKGxpc3RfY29tbWFuZCk6ICBGaXhlZCByYW5nZSBjb21wdXRhdGlvbiB0byB1c2UKCWxpbmVzX3RvX2xpc3QgKCkuCgkqIHN0YWNrLmMgKGJhY2t0cmFjZV9jb21tYW5kKTogIERvIG5vdCBhbGxvdyBjb21tYW5kIGlmIHRhcmdldCBoYXMKCW5vIHN0YWNrLCBwcmludCBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlLgoJKiB0YXJnZXQuYyAodGFyZ2V0X2NvbW1hbmQpOiAgRG8gbm90IHdyaXRlIGludG8gY29tbWFuZCBsaW5lCgliZWNhdXNlIHRoaXMgZmFpbHMgaWYgdGhlIHRhcmdldCBjb21tYW5kIGlzIHVzZWQgaW4gYSB1c2VyIGRlZmluZWQKCWNvbW1hbmQuICBbVGhpcyBjaGFuZ2Ugd2FzIGVuaGFuY2VkIGJ5IGdudSB0byBzdXBwb3J0IGFueS0KCXVuaXF1ZS1wcmVmaXggbWF0Y2hpbmcgb24gdGFyZ2V0IG5hbWVzLl0KCSogdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHQpOiAgQXZvaWQgaW5maW5pdGUgbG9vcCBvbiBhbgoJZXJyb25lb3VzIGF0dGVtcHQgdG8gcHJpbnQgdGhlIG1lbWJlciBvZiBmdW5jdGlvbiAodHJ5IHAgbWFpbi5wKS4KCk1vbiBBcHIgIDEgMTc6MDU6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogZXhwcmVhZC55IChuYW1lX25vX3R5cGVuYW1lKTogIEF2b2lkIHJlZHVjZS9yZWR1Y2UgZXJyb3JzCgljYXVzZWQgYnkgYW1iaWd1aXR5IGluIGhhbmRsaW5nIE5BTUVfT1JfSU5UIGFuZCBOQU1FX09SX1VJTlQuCglTaW5jZSB0aGUgR0RCIHBhcnNlciByZWFsbHkgZG9lc24ndCB1c2UgbmFtZV9ub190eXBlbmFtZSBpbiBhCgluYW1lLW9ubHkgY29udGV4dCwgdGhlIHBhcnNlciBjYW4ndCB0ZWxsIHRoZSBkaWZmIGJldHdlZW4KCW5hbWVzIGFuZCBudW1iZXJzIGhlcmUuICBBdm9pZCBhbGxvd2luZyBhIG5hbWVfbm9fdHlwZW5hbWUKCXRvIGJlIGEgTkFNRV9PUl8qSU5UIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LgoKU3VuIE1hciAzMSAyMDoxMjowNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJQnVnZml4ZXMgZnJvbSBNYXJrIEZveCAobWFya2ZAd3JzLmNvbSkgKHRlc3Q9dGVzdEZpZWxkLmMpOgoKCSogdmFscHJpbnQuYyAodmFsX3ByaW50X2ZpZWxkcyk6ICBiaXRmaWVsZCBwcmludGluZyBkaWRuJ3QgaGFuZGxlCglieXRlIG9yZGVyLiAgSW5kaXJlY3QgdGhyb3VnaCBhIGZldyBtb3JlIGZucyB0byBjb3BlLgoKCSogdmFsdWVzLmMgKG1vZGlmeV9maWVsZCk6ICBhbHNvIGNvcGUgd2l0aCBieXRlIG9yZGVyLgoKU2F0IE1hciAyMyAxMDowMjoyMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJQ2xlYW51cCBmb3IgcmVsZWFzZSAzLjk0LjI6CgoJKiBNYWtlZmlsZS5kaXN0OiBQdWxsIFJFTU9URV9PQlMuICBGaXggc2FiZXIgaW5jbHVkZXMgZm9yIEJGRAoJaW5jbHVkZSBmaWxlcy4gIFJvbGwgdmVyc2lvbiB0byAzLjk0LjIuCgkKCSogY29mZnJlYWQuYyAoaW5pdF9zdHJpbmd0YWIpOiAgUmVhZCBsZW5ndGggaW50byB1bnNpZ25lZCBjaGFyCglhcnJheSBiZWZvcmUgc3dhcHBpbmc7IGRvbid0IGFzc3VtZSAzMi1iaXQgbG9uZ3MuCgoJKiB0YXJnZXQuYyAodGFyZ2V0X2luZm8pOiBEb24ndCBib3RoZXIgd2l0aCBnZXRfc3ltX2ZpbGUsIGp1c3QgdXNlCgl0aGUgc3ltZmlsZSBnbG9iYWwgdmFyaWFibGUuCgkqIHN5bXRhYi5oLCBzeW1maWxlLmMgKGdldF9zeW1fZmlsZSk6ICBEZWxldGUgaXQuCgoJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX2luaXQpOiAgRG9uJ3QgZGVwZW5kIG9uIGxvbmcgPT0gNCBieXRlcy4KCShkZWZpbmVfc3ltYm9sKTogIFNldCBzeW1ib2wgbGluZSBudW1iZXIgdG8gMCBpZiBub3QgZ2NjLWNvbXBpbGVkLgoJKHJlYWRfdHlwZSk6ICBSZXBsYWNlIG9uZSBtb3JlIGVycm9yKCkgd2l0aCBjb21wbGFpbigpLgoKCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIFJlcGxhY2UgcHJpbnRmIHdpdGggY29tcGxhaW4uCgoJKiBpOTYwLXRkZXAuYzogIEZpeCBjb3B5cmlnaHQgYXR0cmlidXRpb24uCgoJKiBjb25maWcuZ2RiOiAgUXVvdGUgYWxsIGJhY2txdW90ZXMgaW4gZG91YmxlcXVvdGVzLiAgWW91IGNhbgoJcXVvdGUgbWUgb24gdGhhdC4gIEJTRCA0LjQgc2hlbGwgZm91bmQgdGhpcyBvbmUuCgoJKiBpbmZwdHJhY2UuYyAodGhyb3VnaG91dCk6ICBUaGUgdGhpcmQgYXJndW1lbnQgdG8gcHRyYWNlIGlzIGFuCglpbnQgKiwgbm90IGFuIGludC4KCgkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBXaGVuIHByb2dyYW0gaGFzIHRlcm1pbmF0ZWQsIHdlCgloYXZlIHRvIGNhbGwgdGFyZ2V0X3Rlcm1pbmFsX291cnMgYmVmb3JlIHdlIHBvcCB0aGF0IHRhcmdldCBvZmYKCXRoZSBzdGFjayAoZS5nLiBiZWZvcmUgYSBjYWxsIHRvIHRhcmdldF9raWxsIG9yCgl0YXJnZXRfbW91cm5faW5mZXJpb3IpLiAgVGhpcyBmaXhlcyBwcm9ibGVtIHdoZXJlIGEgcHJvZ3JhbQoJdGVybWluYXRlcywgdGhlbiBHREIgc3RvcHMgZm9yICh0dHkgb3V0cHV0KSBhbmQgeW91IGhhdmUgdG8gdHlwZQoJImZnIiB0byB0aGUgc2hlbGwgdG8gcmVzdW1lIGl0LiAgRklYTUU6ICBUaGlzIGNvZGUgZm9yIHdoYXQgdG8KCWRvIGFmdGVyIHRlcm1pbmF0aW9uIHJlYWxseSBzaG91bGQgYmUgaW4gbm9ybWFsX3N0b3AgaW5zdGVhZC4KCgkqIGdkYmNvcmUuaCAocmVhZF9tZW1vcnlfY2hlY2spOiAgQ2hhbmdlIGRlY2xhcmF0aW9uOyBpdCBjaGFuZ2VkCgluYW1lcyBtb250aHMgYWdvLgoKCSogdGVybWluYWwuaDogIEluY2x1ZGUgPHNndHR5Lmg+IGJlZm9yZSA8c3lzL2lvY3RsLmg+LCBzaW5jZSBpbiBCU0QKCTQuNCBwcmVyZWxlYXNlcywgdGhpcyBhdm9pZHMgYSBidWcgaW4gdGhlaXIgc2d0dHkgY29tcGF0YWJpbGl0eQoJc3VwcG9ydC4KCSogcmVtb3RlLmM6ICBVc2UgdGVybWluYWwuaCByYXRoZXIgdGhhbiBoYW5kLXJvbGxpbmcgdGhlIHNhbWUuCgoJKiBzaWduYW1lLmMsIHNpZ25hbWUuaCAocHNpZ25hbCk6ICBBcmcgaXMgdW5zaWduZWQsIG5vdCBpbnQuCgkqIHV0aWxzLmMgKHN0cnNhdmUsIHN0cnN0cik6ICBGaXggYXJnIHR5cGVzLgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiAgbGludAoKCU1JUFMgc3ltYm9sIHRhYmxlIHN1cHBvcnQgZnJvbSBQZXIgQm90aG5lcjoKCgkqIHN5bWZpbGUuYyAoc3ltdGFiX2Zucyk6ICBSZW1vdmUgaW5pdGlhbGl6ZXIgdGFibGUgdGhhdCBuZWVkcyB0bwoJYmUgaGFja2VkIGZvciBlYWNoIG5ldyBzeW1ib2wgZmlsZSBmb3JtYXQgc3VwcG9ydGVkLgoJKGFkZF9zeW10YWJfZm5zKTogIE5ldyBmdW5jdGlvbiwgY2hhaW5zIHN5bWJvbCB0YWJsZQoJaGFuZGxlcnMgaW50byB0aGUgZ2xvYmFsIGxpc3QuCgkoc3ltZmlsZV9pbml0KTogIFNlYXJjaCB0aGlzIGxpc3QuCgkqIHN5bWZpbGUuaDogIEFkZCBuZXh0IHBvaW50ZXIsIGRlY2xhcmUgYWRkX3N5bXRhYl9mbnMuCgkqIGNvZmZyZWFkLmMgKF9pbml0aWFsaXplX2NvZmZyZWFkKTogQ2FsbCBhZGRfc3ltdGFiX2Zucy4KCSogZGJ4cmVhZC5jIChfaW5pdGlhbGl6ZV9kYnhyZWFkKTogIENhbGwgYWRkX3N5bXRhYl9mbnMuCgoJKiBtaXBzcmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYl8xKTogcmV0dXJuIHZvaWQgaW5zdGVhZCBvZiAoc3RydWN0CglzeW1ib2wgKikuICBUaHVzLCB3ZSBubyBsb25nZXIgbmVlZCB0aGUgaGFjayB0byB0cmFzaAoJcHN0LT5maWxlbmFtZS4gIEdvb2QsIHNpbmNlIHRoYXQgaGFjayBjb25mdXNlZCBjb2RlIGluIHN5bWZpbGUuYyEKCgkocmVvcmRlcl9zeW10YWJzLCBkZXN0cm95X2FsbF9zeW10YWJzKTogIFJlbW92ZWQgc3RhdGljCglhbGxfc3ltdGFicywgd2hpY2ggd2FzIHVzZWQgdG8gcXNvcnQgc3ltdGFicyBpbiByZW9yZGVyX3N5bXRhYnMuCglJbnN0ZWFkLCB0aGUgbGF0dGVyIG5vdyB1c2VzIGEgdGVtcG9yYXJ5IGFycmF5IChzdGFjay1hbGxvY2F0ZWQKCWZyb20gYW4gb2JzdGFjaywgYW5kIHRoZW4gZnJlZWQpLgoKCShwYXJzZV9zeW1ib2wpOiAgQWRkZWQgYSBoYWNrIHRvIGZpeCB1cCBCTE9DS197U1RBUlQsRU5EfSBpZiB0aGV5CgloYXZlbid0IGJlZW4gc2V0IGluIHRoZSBvdXRlcm1vc3Qgc3RCbG9jayBvZiBhIHByb2NlZHVyZS4gVGhpcyB3YXMKCWEgcHJvYmxlbSB3aXRoIGY3NyBiaW5hcmllcyBvbiBVbHRyaXggNC4/LgoKCShuZXdfc3ltdGFiLCBuZXdfc3ltYm9sLCBuZXdfdHlwZSk6ICBDb250aW51ZSBjaGFuZ2luZyBjb2RlIHRvIHVzZQoJb2JzdGFja3MgbW9yZSBhbmQgb3RoZXJ3aXNlIGNvbmZvcm0gdG8gZGJ4cmVhZCBpbnRlcm5hbCBzdHlsZS4KCU1hZGUgdGhlIGZyZWVfY29kZSBvZiBzeW10YWJzIGJlIGZyZWVfbGluZXRhYmxlIChhcyBpbiBkYnhyZWFkKQoJaW5zdGVhZCBvZiBmcmVlX2NvbnRlbnRzLiAgVGhpcyBpbXBsaWVzIG1lbW9yeSBsZWFrcyB3aGVuIHJlYWRpbmcKCWEgbmV3IHN5bWJvbCB0YWJsZSwgdW50aWwgdGhlIGNvbnZlcnNpb24gaXMgZmluaXNoZWQuIERpZCBjaGFuZ2UKCShzdHJ1Y3Qgc3ltYm9sKSBhbmQgKHN0cnVjdCB0eXBlKSB0byBiZSBhbGxvY2F0ZWQgb24gdGhlCglzeW1ib2xfb2JzdGFjay4gIEJsb2NrcyBhbmQgYmxvY2t2ZWN0b3JzIGFyZSBhbW9uZyB0aGUgdGhpbmdzCglzdGlsbCAibGVha2luZy4iCgoJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMsIHBhcnNlX2Zkcik6ICBJdCBoYXNuJ3QgYmVlbgoJdGVzdGVkIG11Y2gsIGJ1dCBpdCBzb2x2ZWQgb25lIHByb2JsZW0gKHJlcG9ydGVkIGJ5IE1laXNzbmVyKSwgYW5kCgljbGVhbnMgdXAgc29tZSBvdGhlciB0aGluZ3MuICBUaGUgcHJvYmxlbSBoYXBwZW5lZCB3aGVuIGFuCglpbmNsdWRlZCBmaWxlIGNvbnRhaW5zIGFjdHVhbCBjb2RlIChmdW5jdGlvbnMpIGFuZCBub3QganVzdAoJZGVmaW5pdGlvbnMuIFRoZSBtaXBzIGNvZmYgaXMgYSBsaXR0bGUgaW5jb252ZW5pZW50IHRoZXJlLCBzaW5jZQoJaXQgbWF5IGNhdXNlIGEgcHJvY2VkdXJlIHRvIGJlIG1hcHBlZCB0byB0aGUgd3JvbmcgcHN5bXRhYi4KCgkqIG1pcHMtdGRlcC5jIChoZXVyaXN0aWNfcHJvY19kZXNjKTogIE1pbm9yIGNsZWFudXAuCgkqIG1pcHMteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBNaW5vciBjbGVhbnVwLiAgRklYTUUsCgl0aGlzIHdpbGwgbmVlZCB3b3JrIGZvciB0aGUgbmV3IGNvcmUgcGFyYWRpZ20uCgoJT3Bjb2RlIHBhdGNoZXMgZnJvbSB0aGUgbmV0OgoKCSogbWlwcy1vcGNvZGUuaDogZml4IGluY29ycmVjdCBkaXNhc3NlbWJseSBvZiB0aGUgbWZjMSwgY2ZjMSwgYW5kCgljdGMxIGluc3RydWN0aW9ucy4gQWxzbywgdGhlIGN2dC5kLncgYW5kIGN2dC5zLncgaW5zdHJ1Y3Rpb25zIHdlcmUKCW1pc3NpbmcgYWx0b2dldGhlciAtIHRoZXkgYXJlIGFkZGVkIGhlcmUuICBGcm9tIEJydWNlIEJhdW1hbi4KCSogbWlwcy1vcGNvZGUuaDogIFRoZSBsb3cgbWFzayBmb3IgQzAgaW5zdHJ1Y3Rpb25zIHdhcyB0b28gc21hbGwuCglGcm9tIEdhcnJldHQgTGF1LiAgSSBtb2RpZmllZCB0aGUgZml4IHRvIGNoZWNrIHRoZSBlbnRpcmUgMzItYml0CglvcGNvZGUuCgoJKiBuczMyay1vcGNvZGUuaDogIEZpeCBvcGNvZGVzIGZvciBkZWl3IGFuZCBkZWlkLiAgRnJvbSBCcnVjZQoJQmF1bWFuLgoKVGh1IE1hciAyMSAxMjo1Njo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJUm9sbCBpbiBjaGFuZ2VzIGZyb20gUGVyIEJvdGhuZXIgKFR1ZSwgMjUgU2VwIDkwIDExOjExOjA0KToKCgkqIGRieHJlYWQuYyAocmVhZF90eXBlKTogUG9pbnRlciBzdWJ0cmFjdGlvbiAodmFsdWVfc3ViIGluCgl2YWxhcml0aC5jKSBzb21ldGltZXMgZmFpbGVkIGJlY2F1c2UgdGhlIHR5cGVzIG9mIHRoZQoJIHBvaW50ZXJzIGJlaW5nIHN1YnRyYWN0ZWQgd2VyZSBub3QgaWRlbnRpY2FsLgoJVGhlc2UgZGlmZmVyZWQgYmVjYXVzZSBkYnhyZWFkLmMgd2FzIGFsbG9jYXRpbmcgcG9pbnRlciB0eXBlcwoJdXNpbmcgZGJ4X2FsbG9jX3R5cGUrc21hc2hfdG9fcG9pbnRlcl90eXBlIGluc3RlYWQgb2YKCWxvb2t1cF9wb2ludGVyX3R5cGUuIEkgZmFpbGVkIHRvIGZpbmQgYSBqdXN0aWZpY2F0aW9uIGZvciB0aGUKCWZvcm1lciwgc28gSSBjaGFuZ2VkIGl0IHRvIHVzZSB0aGUgbGF0dGVyLiBTaW1pbGFybHksIEkKCXJlcGxhY2VkIHNtYXNoX3RvX2Z1bmN0aW9uX3R5cGUgYnkgbG9va3VwX2Z1bmN0aW9uX3R5cGUsCglhbmQgc21hc2hfdG9fcmVmZXJlbmNlX3R5cGUgYnkgbG9va3VwX3JlZmVyZW5jZV90eXBlLgoKCSogbWlwc3JlYWQuYyAocGFyc2Vfc3ltYm9sLCB1cGdyYWRlX3R5cGUsIHBhcnNlX3Byb2NlZHVyZSwgCglfaW5pdGlhbGl6ZV9taXBzcmVhZCk6ICBjb3JyZXNwb25kaW5nIGNoYW5nZXMuCgoJKiBzeW10YWIuYyAoc21hc2hfdG9fe3BvaW50ZXIscmVmZXJlbmNlLGZ1bmN0aW9ufV90eXBlKTogZWxpbWluYXRlLgoKCSogc291cmNlLmMgKG1vZF9wYXRoKTogRG8gdGlsZGVfZXhwYW5kIG9uIGVhY2ggY29tcG9uZW50IG9mIHRoZSBwYXRoLAoJcmF0aGVyIHRoYW4gb24gdGhlIChsaXN0IG9mKSBwYXRocyBhcyBhIHdob2xlLgoJKHByaW50X3NvdXJjZV9saW5lcyk6ICBTZXQgZmlyc3RfbGluZV9saXN0ZWQgaW4gYWRkaXRpb24gdG8KCWN1cnJlbnRfc291cmNlX3N5bXRhYiBhbmQgY3VycmVudF9zb3VyY2VfbGluZS4gIElmIHRoZSBzb3VyY2Ugd2FzCglub3QgZmluZGFibGUsIGFmdGVyIGEgImRpciIgY29tbWFuZCB0byBmaXggdGhlIHByb2JsZW0sCglhICJsaXN0IiB3b3VsZCBnZXQgdGhlIHdyb25nIGxpbmVzLgoKCVdoaWxlIEkgd2FzIHRoZXJlLi4uIChnbnUpOgoKCSogZGJ4cmVhZC5jIChyZWFkX3R5cGUpOiAgQ2hhbmdlIGVycm9yIHRvIGNvbXBsYWludC4KClRodSBNYXIgMjEgMTI6NTY6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCUZpcnN0IGF0dGVtcHQgYXQgZGV0YWlsZWQgdW5kZXJzdGFuZGluZyBvZiBzeW1ib2wgdGFibGUgbWVtb3J5IGFsbG9jLgoKCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9yZWFkKTogIEZyZWUgb3VyIHN0cmluZyB0YWJsZSBpZiB3ZQoJYXJlbid0IHRoZSBtYWlubGluZS4gIEZyZWUgdGhlICJpbmZvIiBzdHJ1Y3Qgc2luY2Ugd2UncmUgZG9uZSB3aXRoCglpdC4gCgkoaW5pdF9wc3ltYm9sX2xpc3QpOiAgRnJlZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgcHN5bWJvbCBsaXN0cy4KCSgpOiBGSVhNRTogU2hvdWxkIHJlYWxsb2MtZG93biB0aGUgcHN5bWJvbCBsaXN0cyB3aGVuIGRvbmUgcmVhZGluZwoJdGhlIG1haW4gc3ltYm9sIGZpbGU/CgoJKiBzeW1taXNjLmMgKGZyZWVfc3ltdGFiKTogIEZyZWUgZnVsbG5hbWUgZmllbGQgdG9vLgoKCSogeG0taHAzMDBocHV4LmggKFVTRyk6ICAjdW5kZWYgdGhlbiAjZGVmaW5lIHNvIE1ha2VmaWxlIGNhbiAtRC4KCShSRUdJU1RFUl9BRERSKTogIE1ha2UgcmVzdWx0IHR5cGUgdW5zaWduZWQgaW50LgoKCSogeGNvbmZpZy97aTM4NiosaHAzMDBocHV4LGFsdG9zZ2FzLGFsdG9zfTogIEFsbCBjb25maWcgZmlsZXMgdGhhdAoJZGVmaW5lIFJFR0VYIG11c3QgYWxzbyBkZWZpbmUgUkVHRVgxIChpdHMgZGVwZW5kZW5jeSkuCgpUdWUgTWFyIDE5IDIxOjI4OjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIHRjb25maWcvaTk2MDogIE5vIGxvbmdlciB3b3JrcywgcG9pbnRzIHlvdSBhdCB2eHdvcmtzOTYwIG9yCgluaW5keTk2MC4KCgkqIHhnZGIuYywgWEdEQi1SRUFETUU6ICBSZW1vdmUgZmlsZS4gIFVzZXJzIGNhbiBnZXQgdGhlIG11Y2gKCWJldHRlciB4eGdkYi4KCSogTWFrZWZpbGUuZGlzdDogIFJlbW92ZSBhbGwgdHJhY2Ugb2YgeGdkYi4KCgkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF8xKTogIFBhc3MgZGVtYW5nbGUgYXJnIHRvCglwcmludF9hZGRyZXNzX3N5bWJvbGljLgoJKGNsZWFyX2JyZWFrcG9pbnRzKTogIFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCgkoYnJlYWtwb2ludF9yZV9zZXRfb25lKTogIEd1dHMgb2YgYnJlYWtwb2ludF9yZV9zZXQuCgkoYnJlYWtwb2ludF9yZV9zZXQpOiAgVXNlIGNhdGNoX2Vycm9ycyB0byBkbyB0aGVtIGFsbCBhbnl3YXkuCgoJKiBnZGItaW50LnRleGluZm8gKEhvc3QgdmVyc3VzIFRhcmdldCk6ICBBZGQgc2VjdGlvbiBvbiB3aGF0IGlzCglhICJob3N0IiBmZWF0dXJlIHZlcnN1cyB3aGF0IGlzIGEgInRhcmdldCIgZmVhdHVyZS4KCgkqIGluZmNtZC5jIChwYXRoX2NvbW1hbmQsIHBhdGhfaW5mbyk6ICBIYW5kbGUgdGhlIFBBVEggdmFyaWFibGUKCShvYmplY3Qgc2VhcmNoIHBhdGgpIGFzIGNvbnZlbmllbnRseSBhcyB0aGUgc291cmNlIHNlYXJjaCBwYXRoLgoJKiBlbnZpcm9uLmMgKHNldF9pbl9lbnZpcm9uKTogIFNldCBzb21lIHZhcnMgaW4gR0RCJ3MgZW52aXJvbm1lbnQsCglpbiBhZGRpdGlvbiB0byB0aGUgY2hpbGQncy4gIFBBVEgsIEc5NjBCQVNFLCBHOTYwQklOIGZvciBzdGFydGVycy4KCSogc291cmNlLmMgKG1vZF9wYXRoKTogIE5ldyBmdW5jdGlvbiwgZnJvbSBndXRzIG9mCglkaXJlY3RvcnlfY29tbWFuZCwgbW9kaWZpZXMgYSBwYXRoLiAgVXNlZCBieSBwYXRoX2NvbW1hbmQuCgkoZGlyZWN0b3J5X2NvbW1hbmQpOiAgQ2FsbCBpdC4KCSogZGVmcy5oIChzdHJzYXZlKTogIERlY2xhcmUuCgoJKiB1dGlscy5jIChzZXZlbmJpdF9zdHJpbmdzKTogIEFkZCBuZXcgcHJpbnRpbmcgb3B0aW9uLgoJKHByaW50Y2hhcik6ICBVc2UgaXQuCgkoc3Ryc2F2ZSk6ICBQcm92aWRlIHRoaXMgaGFuZHkgaGVscGVyIHJvdXRpbmUuCgkoc2V0X3dpZHRoX2NvbW1hbmQpOiAgUmVuYW1lIHNldF9zY3JlZW5fd2lkdGhfY29tbWFuZC4KCShfaW5pdGlhbGl6ZV91dGlscyk6ICAic2V0IHNjcmVlbi13aWR0aCIgPT4gInNldCB3aWR0aCI7Cgkic2V0IHNjcmVlbi1oZWlnaHQiID0+ICJzZXQgaGVpZ2h0IjsgYWRkIHNldmVuYml0LXN0cmluZ3MuCgoJKiBpbmZjbWQuYyAoZG9fcmVnaXN0ZXJzX2luZm8pOiAgUHJpbnQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzCglpbiByYXcgaGV4IGFzIHdlbGwgYXMgZmxvYXQgZm9ybWF0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMKCWEgInZpcnR1YWwiIGNvbnZlcnRpYmxlIHJlZ2lzdGVyLgoJKiB0bS1zcGFyYy5oIChQUklOVF9SRUdJU1RFUl9IT09LKTogIFByaW50IGV2ZXJ5IHBhaXIgb2YgZmxvYXQKCXJlZ3MgYXMgYSBkb3VibGUsIGp1c3QgaW4gY2FzZSBpdCdzIGJlaW5nIHVzZWQgdGhhdCB3YXkuCQoJKiB2YWx1ZXMuYyAodW5wYWNrX2xvbmcpOiAgQ29tbWVudCBvbiBhcnJheS9mdW5jdGlvbiBjb2VyY2lvbi4KCSh1bnBhY2tfZG91YmxlKTogIEFyZ3VtZW50IGlzIGluIHRhcmdldCBieXRlIG9yZGVyIG5vdy4gIEZvcgoJaW50ZWdlciBhcmd1bWVudHMsIGp1c3QgY2FsbCB1bnBhY2tfbG9uZyBhbmQgZmxvYXQgdGhlIHJlc3VsdC4KCSogbTY4ay10ZGVwLmM6IGluY2x1ZGUgZGVmcy5oIGZvciAiY29uc3QiIGhhbmRsaW5nLgoJKiByZW1vdGUtbmluZHkuYzogIFVzZSBpZWVlLWZsb2F0IHN0dWZmLgoJKG5pbmR5X2ZldGNoX3JlZ2lzdGVycyk6ICBVbnBhY2sgZG91YmxlIHJlZ3MgdG8gaG9zdCBkb3VibGUsIHRoZW4KCXRvIGV4dGVuZGVkLgoJKG5pbmR5X3N0b3JlX3JlZ2lzdGVycyk6ICBQYWNrIGV4dGVuZGVkcyB0byBob3N0IGRvdWJsZSwgZmxpcAoJYXJvdW5kIGJ5IG1pc3VzaW5nIHVucGFja19kb3VibGUsIHNlbmQgYXMgdGFyZ2V0IGRvdWJsZS4KCgkqIHRtLXZ4d29ya3M2OC5oIChGUkFNRV9DSEFJTik6ICBIYW5kbGUgY3VycmVudCBmcmFtZSBwb2ludGVyIG9mCgl6ZXJvLCBhcyB3aGVuIHN0b3BwZWQgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uIG9mIGEgcHJvY2Vzcy4KCgkqIGJsb2NrZnJhbWUuYzogIEZpeCBmaWxlbmFtZSBpbiBjb21tZW50IChwYXJhbS5oID0+IHRtLmgpLgoJKiBzcGFyYy10ZGVwLmMgKHNraXBfcHJvbG9ndWUpOiAgTW9yZSBleHBsaWNpdCBudWRnaW5nIGNvbW1lbnRzLgoJKiB0bS02OGsuaDogIEZpeCB0eXBvcy4KCkZyaSBNYXIgMTUgMDE6MDk6MzQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCUNoYW5nZXMgZnJvbSBhIGJyaW5ndXAgb24gdGhlIERFQyBWYXggdW5kZXIgVWx0cml4IDQuMC4KCgkqIGNvcmVkZXAuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiAgUGFzcyBlbmQtYWRkcmVzcyBvZiByZWdpc3RlcgoJc2VjdGlvbiB0byByZWdpc3Rlcl9hZGRyIGFzIGV4cGVjdGVkLiAgRG9uJ3QgY2FsbCBzdXBwbHlfcmVnaXN0ZXIKCWlmIHdlJ2QganVzdCBwYXNzIGl0IGdhcmJhZ2UuCgoJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6ICBTa2lwIE5fTlNZTVMgb24gVWx0cml4LgoKCSogZXhlYy5jICh4ZmVyX21lbW9yeSk6ICBVc2UgYm9vbGVhbiB4ZmVyX2ZuIHJlc3VsdCwgbm90IGludC4KCgkqIHRhcmdldC5jIChwdXNoX3RhcmdldCwgdGFyZ2V0X2luZm8pOiAgQ2FzdCBlbnVtcyB0byBpbnQgZm9yIDwgb3IKCT4gY29tcGFyaXNvbi4KCgkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiAgSWRlbnRpZnkgc291cmNlIGZpbGUgJiBsaW5lCglldmVuIGlmIHdlIGNhbid0IHByaW50IGl0LgoKCSogeG0tdmF4LmggKE1JU1NJTkdfVlBSSU5URik6ICBObyBsb25nZXIgbWlzc2luZyBpbiBVbHRyaXggVjQuMC4KClNhdCBNYXIgIDkgMTA6MDg6MjAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCUNsZWFuIHVwIElFRUUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydC4KCgkqIGllZWUtZmxvYXQuaDogIE5ldyBmaWxlLgoJKiBpZWVlLWZsb2F0LmM6ICBXcml0ZSByZWFsIHJvdXRpbmVzIHRvIGNvbnZlcnQgYmV0d2VlbiBob3N0Cglkb3VibGVzIGFuZCB2YXJpb3VzIHRhcmdldCBJRUVFIGV4dGVuZGVkcy4KCSogbTY4ay14ZGVwLmM6ICBFbGltaW5hdGUgYXNzZW1ibGVyIGNvZGUgZm9yIGV4dGVuZGVkIGZsb2F0cy4KCSogeGNvbmZpZy97M2IxLGFsdG9zLGFsdG9zZ2FzLGhwMzAwYnNkLGlzaSxuZXdzLG5ld3MxMDAwLHN1bjJvczMsCglzdW4yb3M0LHN1bjMsc3VuM29zMyxzdW4zb3M0fTogIEVsaW1pbmF0ZSB1c2Ugb2YgbTY4ay14ZGVwLm8uCgkqIHRtLWk5NjAuaCwgdG0tNjhrLmggKFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTCwKCVJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKTogIFVzZSBpZWVlX2V4dGVuZGVkX3RvX2RvdWJsZSBhbmQKCWRvdWJsZV90b19pZWVlX2V4dGVuZGVkLgoJKiBpOTYwLXRkZXAuYzogIERlZmluZSBleHRfZm9ybWF0X2k5NjAuCgkqIG02OGstdGRlcC5jOiAgRGVmaW5lIGV4dF9mb3JtYXRfNjg4ODEuCgkqIHNwYXJjLXRkZXAuYzogIERlZmluZSBleHRfZm9ybWF0X3NwYXJjLCB0aG91Z2ggdW51c2VkLgoJKiBNYWtlZmlsZS5kaXN0IChIRklMRVMpOiAgQWRkIGllZWUtZmxvYXQuaC4KCSogaW5mdGFyZy5jOiAjaW5jbHVkZSAiaWVlZS1mbG9hdC5oIiBmb3IgdGhlIFJFR0lTVEVSX0NPTlZFUlQKCW1hY3Jvcy4KCglPYnNvbGV0ZSB0aGUgImNvZmZzdHJpcCIgcHJvZ3JhbSBpbiBmYXZvciBvZiB1c2luZyBCRkQncyBzdHJpcC4KCgkqIG5pbmR5LXNoYXJlL2NvZmZzdHJpcC5jOiAgUmVtb3ZlIGZpbGUuCgkqIG5pbmR5LXNoYXJlL25pbmR5LmMgKGNvZmZzdHJpcCk6ICBSb3V0aW5lIHRvIHJ1biBiZmRfc3RyaXAuCgkqIE1ha2VmaWxlLmRpc3Q6ICBSZW1vdmUgcmVmZXJlbmNlcyB0byBuaW5keS1zaGFyZS9jb2Zmc3RyaXAuYy4KCSogdGNvbmZpZy9uaW5keTk2MDogIFJlbW92ZSByZWZlcmVuY2UgdG8gY29mZnN0cmlwLm8uCgoJKiBNYWtlZmlsZS5kaXN0OiAgUm9sbCB2ZXJzaW9uIG51bWJlciB0byAzLjk0LjEgKG5vdCB5ZXQgZmluYWwpLgoKV2VkIE1hciAgNiAwOTo1Njo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBzeW1maWxlLmg6ICBBZGQgc3ltZmlsZV9iZmQsIGNvbW1vbiBiZXR3ZWVuIGRieHJlYWQgYW5kIGNvZmZyZWFkLgoJKiBkYnhyZWFkLmM6ICBSZW1vdmUgc3RhdGljIHN5bWZpbGVfYmZkLgoJKiBpbmZjbWQuYyAoZG9fcmVnaXN0ZXJzX2luZm8pOiAgQWRkIFBSSU5UX1JFR0lTVEVSX0hPT0ssIHRob3VnaAoJaXQgaXMgbm90IHVzZWQgeWV0LgoJKiBpbmZ0YXJnLmMgKGNoaWxkX2RldGFjaCk6ICBQb3AgdGhlIGNoaWxkX29wcyB2ZWN0b3IgaWYgdGhlCglkZXRhY2ggaXMgc3VjY2Vzc2Z1bC4KCSogcmVtb3RlLW5pbmR5LmMgKG5pbmR5X2NyZWF0ZV9pbmZlcmlvcik6ICBEb24ndCBwdXNoIGEgbmV3CgluaW5keV9vcHMgc2luY2UgbmluZHkgdXNlcyB0aGUgc2FtZSBvbmUgZm9yIGV4ZWN1dGlvbiBhbmQgbWVtb3J5CglleGFtaW5hdGlvbiBhbnl3YXkuCgkqIGNvcmUuYyAoY29yZV9vcHMpOiAgVXNlIGNoaWxkX2F0dGFjaCBhbmQgY2hpbGRfY3JlYXRlX2luZmVyaW9yCglyYXRoZXIgdGhhbiBkZWZhdWx0IGF0dGFjaCBhbmQgY3JlYXRlX2luZmVyaW9yIGZ1bmN0aW9ucy4KCglIYW5kbGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGluIGNvcmUgZmlsZXMuCgoJKiBzcGFyYy14ZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIFJld3JpdGUgZm9yIGZsb2F0IHN1cHBvcnQuCgkqIHN1bjMteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBSZXdyaXRlIGZvciBmbG9hdCBzdXBwb3J0LgoJVGhpcyB2ZXJzaW9uIHVudGVzdGVkIHNpbmNlIEJGRCBkb2Vzbid0IHlldCBzdXBwb3J0IHN1bjMgY29yZQoJZmlsZXMuCgkqIGhwMzAwaHB1eC14ZGVwLmM6ICBSZXdyaXRlIGZldGNoX2NvcmVfcmVnaXN0ZXJzIHRvIG5ldyBjYWxsaW5nCgljb252ZW50aW9ucy4gIEZpeCBjb21tZW50cyBhbmQgc3R5bGUuICBUaGlzIHZlcnNpb24gaGFzIG5vdAoJYmVlbiBjb21waWxlZCB5ZXQsIHNpbmNlIHdlIGhhdmUgbm8gSFAgaW5ob3VzZS4KCSogY29yZS5jIChnZXRfY29yZV9yZWdpc3RlcnMpOiAgTG9vayBmb3IgdHdvIHNlY3Rpb25zLCAiLnJlZyIKCWFuZCAiLnJlZzIiLCBhbmQgcGFzcyBib3RoIHRvIGZldGNoX2NvcmVfcmVnaXN0ZXJzIHNlcXVlbnRpYWxseS4KCglSZXZpc2UgZGlyZWN0b3J5IHBhdGggeWV0IGFnYWluLgoKCSogc291cmNlLmMgKGZvcmdldF9jYWNoZWRfc291cmNlX2luZm8pOiAgTm90IHN0YXRpYyBhbnkgbW9yZS4KCShpbml0X3NvdXJjZV9wYXRoKTogIE5ldyBkZWZhdWx0IHNvdXJjZSBwYXRoIGlzICIkY2RpcjokY3dkIi4KCShkaXJfY29tbWFuZCk6ICBIYW5kbGUgdmFyaWFibGUgYXJndW1lbnRzICgkY2RpciwgJGN3ZCkuCgkoc291cmNlX2luZm8pOiAgUHJpbnQgIkNvbXBpbGF0aW9uIGRpcmVjdG9yeSIgcmF0aGVyIHRoYW4KCSJPcmlnaW5hbGx5IGNvbXBpbGVkIGluIiB0byByZW1pbmQgcGVvcGxlIG9mICRjZGlyLgoJKG9wZW5wKTogIElmIHRoZSBwYXRoIGNvbnRhaW5zICRjd2QsIHVzZSBjdXJyZW50IGRpcmVjdG9yeS4KCShvcGVuX3NvdXJjZV9maWxlKTogIElmIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBpcyBrbm93biwgcmVwbGFjZQoJZmlyc3QgJGNkaXIgaW4gcGF0aCB3aXRoIHRoZSBjb21waWxhdGlvbiBkaXJlY3RvcnkuCgkocHJpbnRfc291cmNlX2xpbmVzKTogIEV2ZW4gaWYgd2UgY2FuJ3QgcHJpbnQgdGhlIGxpbmVzLCBzZXQgdGhlCgljdXJyZW50IHN5bXRhYiBhbmQgbGluZSBmb3IgZnV0dXJlIGNvbW1hbmRzIGxpa2UgImluZm8gc291cmNlIiBvcgoJImJyZWFrcG9pbnQiLiAgQWxzbywgZXJyb3IgbWVzc2FnZSBub3cgY29udGFpbnMgdGhlIGZpbGUgbmFtZSwKCWxpbmUgbnVtYmVyLCBhbmQgZmlsZSBhY2Nlc3MgZXJyb3IgbWVzc2FnZS4KCShfaW5pdGlhbGl6ZV9zb3VyY2UpOiAgRml4IGhlbHAgdGV4dCB0byBkZXNjcmliZSBjaGFuZ2VzLgoJKiBtYWluLmMgKGNkX2NvbW1hbmQpOiAgRm9yZ2V0IGNhY2hlZCBzb3VyY2UgaW5mbyB3aGVuIHdlIGNoZGlyLgoJKiB1dGlscy5jIChzdHJzdHIpOiAgQWRkIHNpbXBsZSBpbXBsZW1lbnRhdGlvbi4KClR1ZSBNYXIgIDUgMDE6NDE6NDAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGZvd2FudG9uLmN5Z251cy5jb20pCgoJKiBjb2ZmcmVhZC5jIChyZWFkX29uZV9zeW0sIGluaXRfbGluZXRhYmxlLCBpbml0X3N0cmluZ3RhYik6CglCeXRlLXN3YXAgQ09GRiBzeW1ib2wgdGFibGVzIGlmIG5lY2Vzc2FyeSB3aGVuIHJlYWRpbmcgdGhlbSBpbi4KCVVzZSBjb21wbGFpbigpIHRvIHJlcGxhY2UgZXJyb3IgbWVzc2FnZSBpbiBvbmUgc3BvdC4gIE5lZWRzCgljb3JyZXNwb25kaW5nIGNoYW5nZSBpbiBiZmQvY29mZi1jb2RlLmggdG8gbWFrZSBzb21lIHN5bWJvbAoJc3dhcHBpbmcgcm91dGluZXMgbm9uLXN0YXRpYy4KCk1vbiBNYXIgIDQgMDA6NTM6NDAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCU1lcmdlIGNoYW5nZXMgZnJvbSBFaXJpayBGdWxsZXIsIGZvciBVVGVrLgoKCSogZGVmcy5oIChlcnJubyk6ICBBZGQgZGVjbGFyYXRpb24uCgkqIGFsdG9zLXhkZXAuYywgYXJtLXhkZXAuYywgY29udmV4LXhkZXAuYywgZ291bGQteGRlcC5jLAoJaHAzMDBocHV4LXhkZXAuYywgaW5mcnVuLmMsIGluZmxvdy5jLCBpbmZwdHJhY2UuYywgaTM4Ni10ZGVwLmMsCglpMzg2LXhkZXAuYywgcHlyLXhkZXAuYywgbWlwcy14ZGVwLmMsIHJlbW90ZS1lYi5jLCByZW1vdGUtbmluZHkuYywKCXJlbW90ZS12eC5jLCBzb3VyY2UuYywgc3RhbmRhbG9uZS5jLCBzdHVmZi5jLCBzdW4zODYteGRlcC5jLAoJc3ltbWV0cnktdGRlcC5jLCBzeW1tZXRyeS14ZGVwLmMsIHVtYXgteGRlcC5jLCB1dGlscy5jOiAgRWxpbWluYXRlCglkZWNsYXJhdGlvbnMgb2YgZXJybm8uCgoJKiByZW1vdGUtZWIuYzogIERlZmluZSBCMTkyMDAgYW5kIEIzODQwMCBhcyBFWFRBIGFuZCBFWFRCLgoKCSogcmVtb3RlLXZ4LmM6ICBJbmNsdWRlIDxzeXMvdGltZS5oPiBmb3IgVVRlazsgU3VuIGdldHMgaXQgdmlhCgk8cnBjL3JwYy5oPiBhbmQgPHJwYy90eXBlcy5oPi4KClNhdCBNYXIgIDIgMTU6NDc6NTUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogaTk2MC10ZGVwLmMgKGV4YW1pbmVfcHJvbG9ndWUpOiAgQWRkIG5ldyBhcmd1bWVudCBsaW1pdCwKCXdoaWNoIHN0b3BzIHRoZSBzY2FuIGF0IHRoZSBlbmQgb2YgdGhlIHByb2xvZ3VlLCBvciBhdCB0aGUgUEMuCglUaGlzIGZpeGVzIGEgcHJvYmxlbSB3aGVyZSBpdCB3YWxrcyBkb3duIGludG8gdGhlIGNvZGUgZm9yIHRoZQoJdXNlcidzIHN0YXRlbWVudHMgaWYgdGhhdCBjb2RlIGxvb2tzIGxpa2UgZnVuY3Rpb24gcHJvbG9ndWVzLgoJTWFyayBGb3ggYW5kIEkgaGF2ZSBiZWVuIGJvdW5jaW5nIHRoaXMgY29kZSBiYWNrIGFuZCBmb3J0aCwgbWFraW5nCglzbWFsbCBjaGFuZ2VzIHRvIGl0LiAgQ2FsbGVycyBjaGFuZ2VkIHRvIG1hdGNoLgoKVHVlIEZlYiAyNiAwMTo0NzowNyAxOTkxICBDeWdudXMgSm9obiBHaWxtb3JlICAoY3lnbnVzIGF0IHl1YmEpCgoJQ2xlYW51cCBmb3IgZ2RiLTMuOTQgcmVsZWFzZSBmaW5hbDoKCgkqIE1ha2VmaWxlLmRpc3Q6ICBSZW1vdmUgcmVtb3RlLXZ4LmMsIHJlbW90ZS1uaW5keS5jLCBhbmQgYWxsCgl0aGUgLmMgZmlsZXMgZnJvbSB2eC1zaGFyZSBhbmQgbmluZHktc2hhcmUsIGZyb20gdGhlIHZhcmlvdXMgCgltYWNyb3MsIHNpbmNlIHRoZXkgYXJlIG5vdCBmb3VuZCB2aWEgQUxMREVQRklMRVMuCgkoU0ZJTEVTKTogIEFkZCB0bS1pOTYwLmguCgkoYWxsZGVwcy5tYWsgcnVsZSk6ICBCcmVhayBvdXQgQUxMREVQRklMRVNfTUFJTkRJUiBhbmQKCUFMTERFUEZJTEVTX1NVQkRJUi4gIExpc3QgYWxsIHRoZSBuaW5keSBhbmQgdnh3b3JrcyBzdWJkaXIgZmlsZXMKCWluIHRoZSBTVUJESVIgbGlzdC4KCShUQUdGSUxFU19NQUlORElSKTogIENoYW5nZSBBTExERVBGSUxFUyB0byBBTExERVBGSUxFU19NQUlORElSLgoJKGdkYi50YXIuWik6ICBVc2UgQUxMREVQRklMRVNfU1VCRElSIGFzIHdlbGwgYXMgU0ZJTEVTX1NVQkRJUi4KCk1vbiBGZWIgMjUgMTY6MDI6MzUgMTk5MSAgQ3lnbnVzIEpvaG4gR2lsbW9yZSAgKGN5Z251cyBhdCBvbGRtYW4pCgoJKiBhbTI5ay10ZGVwLmM6ICBBZGQgY29udHJpYnV0aW9uIGxpbmUuCgkoZXhhbWluZV9wcm9sb2d1ZSk6ICBDYWNoZSBpbmZvcm1hdGlvbiBhYm91dCBmdW5jdGlvbiBwcm9sb2d1ZXMgaW4KCXRoZSBtaXNjLWZ1bmN0aW9uLXZlY3RvciB0byBhdm9pZCBsb3RzIG9mIHJlZmVyZW5jZXMgb3ZlciB0aGUKCXNlcmlhbCBsaW5lIHdoaWxlIGV4YW1pbmluZyBpbnN0cnVjdGlvbnMuCgoJKiBjb3JlLmMgKGNvcmVfY2xvc2UpOiAgTmV3IGZ1bmN0aW9uIG1hZGUgZnJvbSBjbGVhbnVwX2NvcmUuCgoJKiBjb3JlLmMsIGV4ZWMuYywgaW5mdGFyZy5jLCByZW1vdGUtZWIuYywgcmVtb3RlLW5pbmR5LmMsCglyZW1vdGUtdnguYywgcmVtb3RlLmMsIHRhcmdldC5jLCB0YXJnZXQuaCwgCglVcGRhdGUgdGFyZ2V0X29wcyB2ZWN0b3IgdG8gYWRkIGF0dGFjaCwgY2xvc2UsIGFuZCBsb2FkIGVudHJpZXMuCglVc2UgYWRkX3N5bXNfYWRkcl9jb21tYW5kLCBub3QgYWRkX2ZpbGVfYWRkcl9jb21tYW5kLCBmb3IKCWFkZF9maWxlLiAgQnJlYWsgb3V0IGNsb3NlIHJvdXRpbmUgZnJvbSBleGlzdGluZyBjb2RlLgoKCSogZGJ4cmVhZC5jIChyZWFsbHlfZnJlZV9wZW5kaW5ncyk6ICBEb24ndCBmcmVlIHBlbmRpbmdfYmxvY2tzOwoJdGhleSBhcmUgaW4gYW4gb2JzdGFjay4KCShyZWFkX2RieF9zeW10YWIpOiAgUmVsb2NhdGUgZW5kX29mX3RleHRfYWRkciBpbiB0aGUgcHN5bXRhYi4KCUxpbnQuCgkoZGVmaW5lX3N5bWJvbCk6ICBBZGQgc3ltYm9sIHR5cGUgcGFyYW1ldGVyOyBjaGFuZ2UgY2FsbGVyczsKCXBhc3MgdHlwZSBwYXJhbWV0ZXIgdG8gREJYX1BBUk1fU1lNQk9MX0NMQVNTIG1hY3JvIHRvIGFsbG93CglpdCB0byBpbmZsdWVuY2UgdGhlIHN5bWJvbCBjbGFzcyBvbiB0aGUgaTk2MC4KCShkZWZpbmVfc3ltYm9sKTogIFN3YXAgTE9DX0NPTlNUJ3MgaW50byB0YXJnZXQgYnl0ZSBvcmRlci4KCgkqIGV4ZWMuYyAoZXhlY19jbG9zZSk6ICBOZXcgZnVuY3Rpb24uCgkoZXhlY19maWxlX2NvbW1hbmQpOiAgQ2FsbCBpdC4KCgkqIGZpbmR2YXIuYyAocmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMpOiAgRG9jIGJ5dGUgb3JkZXIsCglGaXggYnl0ZSBvcmRlciBvZiBmcmFtZSBwb2ludGVyLgoJKHJlYWRfdmFyX3ZhbHVlKTogIFJlc3VsdCBvZiAwIGlmIHZhcidzIHZhbHVlIGNhbid0IGJlIGZvdW5kLAoJZS5nLiBtaXNzaW5nIEZSQU1FX0FSR1NfQUREUkVTUy4gIEJ5dGUtc3dhcCBMT0NfQ09OU1QgYW5kCglMT0NfTEFCRUwgdmFsdWVzIHRvIHRhcmdldCBvcmRlci4gIEFkZCBMT0NfTE9DQUxfQVJHLgoJKGxvY2F0ZV92YXJfdmFsdWUpOiAgVXNlIHJlYWRfdmFyX3ZhbHVlIGFuZCB1c2UgaXRzIGxhenkgYWRkcmVzcwoJYXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB2YXIncyB2YWx1ZS4gIExpbnQuCgoJKiBpOTYwLXBpbnNuLmMgKG5leHRfaW5zbik6ICBBZGQgcm91dGluZSBmcm9tIHZ4Z2RiIGZvciBzY2FubmluZwoJaW5zdHJ1Y3Rpb25zLiAgICAgICAKCgkqIGk5NjAtdGRlcC5jIChhcmdfYWRkcmVzcywgaTk2MF9mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiAgUmVtb3ZlCglvYnNvbGV0ZSBJbnRlbCB2ZXJzaW9ucyBpbiBmYXZvciBvZiB2eGdkYiB2ZXJzaW9ucy4KCShjaGVja19ob3N0LCBieXRlc3dhcCwgYnl0ZXN3YXBfdmFsLCByZW9yZGVyX3ZhbCk6ICBFbGltaW5hdGUKCWNvZGUgZGVhbGluZyB3aXRoIGJ5dGUgb3JkZXIgb2YgdmFsdWVzLCB3aGljaCBJbnRlbCBkaWQgaW4gaG9zdCBieXRlCglvcmRlciByYXRoZXIgdGhhbiBnZGItNCdzIHRhcmdldCBieXRlIG9yZGVyLgoJKGk5NjBfZnJhbWVfY2hhaW5fdmFsaWQpOiAgTW92ZSB0byBuaW5keS10ZGVwLmMuCgkoZXhhbWluZV9wcm9sb2d1ZSwgc2tpcF9wcm9sb2d1ZSwgZnJhbWVfZmluZF9zYXZlZF9yZWdzLAoJZnJhbWVfYXJnc19hZGRyZXNzLCBsZWFmcHJvY19yZXR1cm4sIHNhdmVkX3BjX2FmdGVyX2NhbGwsCglwb3BfZnJhbWUpOiAgQWRkIHZ4Z2RiIHZlcnNpb25zIGZyb20gTWFyayBGb3guCgkoZXhhbWluZV9wcm9sb2d1ZSwgZnJhbWVfc3RydWN0X3Jlc3VsdF9hZGRyZXNzKTogIEFkZCBjb2RlCgl0byBkZWFsIHdpdGggdGhlIHNhdmVkIHZhbHVlIG9mIEcxMyAoc3RydWN0IHJldHVybiBhZGRyZXNzCglwb2ludGVyKS4KCShmcmFtZV9hcmdzX2FkZHJlc3MpOiAgTW9kaWZ5IE1hcmsncyB2ZXJzaW9uIHRvIHByZWZlciB0aGUKCXNhdmVkIHZhbHVlIG92ZXIgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRvcG1vc3QgZnJhbWUuCglDYWNoZSByZXN1bHQgaW4gdGhlIGZyYW1lIGluZm8gdG8gYXZvaWQgcGVyZm9ybWFuY2UgaGFpciBpbgoJY2FsbGVycy4KCShwcmludF9mYXVsdCk6ICBBZGQgZ2RiOTYwIGNvZGUgZm9yIHByaW50aW5nIGZhdWx0cy4KCShfaW5pdGlhbGl6ZV9pOTYwKTogIEFjdHVhbGx5IGNhbGwgY2hlY2tfaG9zdC4KCgkqIGllZWUtZmxvYXQuYyAoaWVlZV9leHRlbmRlZF90b19kb3VibGUsIGllZWVfZG91YmxlX3RvX2V4dGVuZGVkKToKCWFkZCBzdHViIHJvdXRpbmVzLiAgRklYTUUsIHRoZXNlIGN1cnJlbnRseSBqdXN0IHJldHVybiB6ZXJvIQoKCSogaW5mY21kLmMgKHByb2dyYW1faW5mbyk6ICBVc2UgUFJJTlRfUkFORE9NX1NJR05BTC4KCShhdHRhY2hfY29tbWFuZCk6ICBDYWxsIHRhcmdldF9hdHRhY2gsIG5vdCB0YXJnZXRfb3Blbiwgbm93LgoKCSogaW5mcnVuLmMgKG5vcm1hbF9zdG9wKTogIE1ha2UgZ2xvYmFsLCBub3Qgc3RhdGljLCBmb3IgdnhfYXR0YWNoLgoJKGNoaWxkX2F0dGFjaCk6ICBSZW5hbWUgZnJvbSBjaGlsZF9vcGVuLgoJKHdhaXRfZm9yX2luZmVyaW9yKTogVXNlIFBSSU5UX1JBTkRPTV9TSUdOQUwuICBJZiBzdG9wX3BjIGlzIHplcm8sCglkb24ndCBjb25mdXNlIGl0IHdpdGggYSB6ZXJvIHN0ZXBfcmVzdW1lX2JyZWFrX2FkZHJlc3MuIAoKCSogaW5mdGFyZy5jIChjaGlsZF9kZXRhY2gpOiAgRWxpbWluYXRlIGluZmVyaW9yX3BpZCB0ZXN0LgoJKGNoaWxkX2ZpbGVzX2luZm8pOiAgQ2xlYW4gdXAgbWVzc2FnZSBhIGJpdC4KCShjaGlsZF9vcHMpOiAgVXNlIGNoaWxkX2F0dGFjaCwgbm90IGNoaWxkX29wZW4sIHRvIGF0dGFjaC4KCgkqIG1lbS1icmVhay5jOiAgI2lmZGVmIG91dCB0aGUgd2hvbGUgZmlsZSBpZiBCUkVBS1BPSU5UIGlzIG5vdAoJc2V0IChlLmcuIG9uIFZ4V29ya3Mgb3IgTklORFkpLiAgTW92ZSByZWFkX21lbW9yeV9ub2JwdCBmcm9tCglmaW5kdmFyLmMgdG8gaGVyZSwgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgY29udGVudHMgb2YgdGhlCglzaGFkb3dfY29udGVudHMgb2YgYnJlYWtwb2ludHMsIGJ1dCBrZWVwIGlmICNpZiAwIHNpbmNlIGl0IGlzCgluZXZlciBjYWxsZWQuCgoJKiBuaW5keS10ZGVwLmM6ICBOZXcgZmlsZSwgY29udGFpbnMgbmluZHlfZnJhbWVfY2hhaW5fdmFsaWQsIG1vdmVkCglmcm9tIGk5NjAtdGRlcC5jLgoKCSogcHJpbnRjbWQuYyAoYWRkcmVzc19pbmZvKTogIEhhbmRsZSBMT0NfTE9DQUxfQVJHLiAgTGludC4KCShwdHlwZV9jb21tYW5kLCBkaXNwbGF5X2NvbW1hbmQpOiAgRWxpbWluYXRlIGhhdmVfaW5mZXJpb3JfcCBhbmQKCWhhdmVfY29yZV9maWxlX3AgaW4gZmF2b3Igb2YgdGFyZ2V0X2hhc19zdGFjayBvcgoJdGFyZ2V0X2hhc19leGVjdXRpb24uCgkocHJpbnRfZnJhbWVfYXJncyk6ICBIYW5kbGUgTE9DX0xPQ0FMX0FSRy4gIEVsaW1pbmF0ZSBkdXBsaWNhdGUKCWNvZGUgZm9yIGFjdHVhbGx5IGZpbmRpbmcgdGhlIHZhbHVlcyBvZiBhcmd1bWVudHMsIHRob3VnaCB3ZSBzdGlsbAoJa2VlcCB0cmFjayBvZiB0aGUgbWF4aW11bSBzdGFjayBvZmZzZXQgZm9yIHVzZSBpbiBwcmludGluZyB1bm5hbWVkCglhcmd1bWVudHMuICBIYW5kbGUgbWlzc2luZyBGUkFNRV9BUkdTX0FERFJFU1MuCgoJKiByZW1vdGUtbmluZHkuYyAoaTk2MF9wcmludF9mYXVsdCk6ICBNb3ZlIHRvIGk5NjAtdGRlcC5jLgoJKHN0cnVjdCBuaW5keV9yZWdzKTogIERlZmluZSByZWdpc3RlcnMgcGFzc2VkIHRvL2Zyb20gbmluZHkuCgkobmluZHlfZmV0Y2hfcmVnaXN0ZXJzLCBuaW5keV9zdG9yZS1yZWdpc3RlcnMpOiAgVHJhbnNsYXRlIGJldHdlZW4KCW5pbmR5IGFuZCBHREIgZm9ybWF0cyBmb3IgdGhlIHJlZ2lzdGVycy4KCShkY2FjaGVfaW5pdCk6ICBTdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBjYWNoZSwgc2luY2UgaXQgd2FzIGJlaW5nCglhbGxvY2F0ZWQgYnkgYSBtYWxsb2MgdGhhdCB3YXMgbmV2ZXIgZnJlZWQgYW55d2F5LgoJKG5pbmR5X2NyZWF0ZV9pbmZlcmlvcik6ICBFcnJvciwgbm90IGNvcmUgZHVtcCwgaWYgbm8gZXhlYyBmaWxlLgoJKG5pbmR5X2JlZm9yZV9tYWluX2xvb3ApOiAgVXNlIHRhcmdldF9sb2FkLCBub3QgdGFyZ2V0X2FkZF9maWxlLgoKCSogcmVtb3RlLXZ4LmMgKG5ldF9sb2FkKTogIFNwZWNpZnkgbGFyZ2UgdGltZW91dCBmb3IgbG9hZAoJcmVxdWVzdHMuICBBbGxvdyB1c2VyIHRvIGJyZWFrIG91dCB3aXRoIElOVEVSUlVQVC4KCShuZXRfYnJlYWspOiAgUmVtb3ZlIHVzZWxlc3MgY29kZSwgY2xlYW4gdXAuICBDaGFuZ2UgY2FsbGVycy4KCShwYXJzZS1hcmdzLCBza2lwX3doaXRlX3NwYWNlLCBmaW5kX3doaXRlX3NwYWNlKTogIENsZWFuIHVwIGFyZwoJcGFyc2luZyB0byBjb3BlIHdpdGggcXVvdGVkIHN0cmluZ3MuCgkobmV0X3dhaXQsIG5ldF9xdWl0KTogIE5ldmVyIGNhbGwgZXJyb3IsIGp1c3QgcmV0dXJuIHN0YXR1cy4KCSh2eF9yZWFkX3JlZ2lzdGVyLCB2eF93cml0ZV9yZWdpc3Rlcik6ICBDbGVhbnVwIHN0YXR1cyBjaGVja2luZy4KCSNpZmRlZiB0aGUgY29kZSBiYXNlZCBvbiB3aGljaCBDUFUgd2UgYXJlIHVzaW5nICg5NjAgb3IgNjhrKSwKCUZJWE1FLCB0aGlzIHNob3VsZCBiZSBjb21wbGV0ZWx5IGdlbmVyYWwgYnV0IGl0IGlzbid0IHlldC4KCSh2eF94ZmVyX21lbW9yeSwgdnhfcmVzdW1lKTogIENsZWFudXAgc3RhdHVzIGNoZWNraW5nLgoJKHZ4X3J1bl9maWxlc19pbmZvKTogIEltcHJvdmUgbWVzc2FnZS4KCSh2eF9sb2FkX2NvbW1hbmQpOiAgUmVuYW1lZCBmcm9tIHZ4X2FkZF9maWxlX2NvbW1hbmQuICBBbGxvdyBsb2FkCgl0byBiZSBpbnRlcnJ1cHRlZC4KCShuZXRfcHRyYWNlKTogIFJlbW92ZSB1bnVzZWQgcm91dGluZS4KCSh2eF93YWl0KTogIEFkb3B0IGNvZGUgZnJvbSB2eGdkYjk2MCB0byBjb3BlIHdpdGggYnJva2VuCgljb25uZWN0aW9ucyB0byB0YXJnZXQgbWFjaGluZSBhbmQgcHJvbXB0IHRvIGRpc2Nvbm5lY3QuICBSZW1vdmUKCWRlYnVnIHByaW50b3V0cy4gIE1hcCBzb21lIEVWRU5UXydzIHRvIFNJR25hbHMuCgkoYWRkX3N5bWJvbF9zdHViLCB2eF9vcGVuKTogIFByaW50IG5hbWVzIG9mIG9iamVjdCBmaWxlcyB3ZSBmb3VuZCwKCWFuZCAib2siIGlmIHdlIHJlYWQgdGhlaXIgc3ltYm9scyBPSy4gIENsYXJpZnkgb3V0cHV0IGluIGdlbmVyYWwuCgkodnhfYXR0YWNoLCB2eF9kZXRhY2gsIHZ4X2tpbGwpOiAgQWRkIHRoZXNlIGNvbW1hbmRzLgoJKHZ4X2NvbnZlcnRfZnJvbV92aXJ0dWFsLCB2eF9jb252ZXJ0X3RvX3ZpcnR1YWwpOiAgU2ltcGxpZnkuCgkodnhfcnVuX29wcyk6ICBUdXJuIG9mZiBhbGxfbWVtLCB0byBhdm9pZCBzcHVyaW91cyBtc2cgaW4gdGhlCgkiaW5mbyBmaWxlcyIgb3V0cHV0LCBhbmQgY3JlYXRlX2luZmVyaW9yLCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUKCWFuIGluZmVyaW9yLgoKCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6ICBSZXBsYWNlIEZyYW1lX3Vua25vd24gd2l0aCAwLgoJKHByaW50X2ZyYW1lX2FyZ192YXJzKTogIEhhbmRsZSBMT0NfTE9DQUxfQVJHLgoJKHJldHVybl9jb21tYW5kKTogIFBvcCB1bnRpbCB0aGUgUEMgbWF0Y2hlcyBhcyB3ZWxsIGFzIHRoZSBGUCwKCXNvIGl0IHdvcmtzIGV2ZW4gaWYgdGhlIEZQIGlzIHNoYXJlZCB3aXRoIGFub3RoZXIgZnVuY3Rpb24sCglhcyBpbiAiZnJhbWVsZXNzIiBvciAibGVhZiIgcHJvY2VkdXJlcy4KCgkqIHN5bWZpbGUuYyAobG9hZF9jb21tYW5kKTogIHJlbmFtZWQgZnJvbSBhZGRfZmlsZV90YXJnZXRfY29tbWFuZC4KCShhZGRfc3ltc19hZGRyX2NvbW1hbmQpOiAgcmVuYW1lZCBmcm9tIGFkZF9maWxlX2FkZHJfY29tbWFuZC4KCShhZGRfc3ltc19jb21tYW5kKTogIFN0dWIgdG8gY2FsbCB0YXJnZXRfYWRkX3N5bXMuCgkoX2luaXRpYWxpemVfc3ltZmlsZSk6ICBDaGFuZ2UgY29tbWFuZCBuYW1lcyBhbmQgZGVzY3JpcHRpb25zLAoJYWRkLWZpbGUgPT4gYWRkLXN5bXMsIGFuZCBsb2FkIGZyb20gYWxpYXMgdG8gaXRzIG93biBjb21tYW5kLgoKCSogdGFyZ2V0LmMgKGtpbGxfb3JfYmVfa2lsbGVkLCBtYXliZV9raWxsX3RoZW5fYXR0YWNoLAoJbWF5YmVfa2lsbF90aGVuX2NyZWF0ZV9pbmZlcmlvcik6ICBEZWZhdWx0IGZvciBhdHRlbXB0cyB0byBzdGFydAoJYSBwcm9jZXNzLCBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nLCBpcyB0byBhc2sgYWJvdXQga2lsbGluZwoJaXQgYW5kIHJldHJ5IGlmIHllcy4KCSh1cHN0YWNrX2NyZWF0ZV9pbmZlcmlvcik6ICAjaWYtMCBpdCwgc3RyYXRhIG9ic29sZXRlIGl0LgoJKHB1c2hfdGFyZ2V0LCB1bnB1c2hfdGFyZ2V0LCBwb3BfdGFyZ2V0KTogIHRvX2Nsb3NlKCkgYSB0YXJnZXQKCWJlZm9yZSB1bnN0YWNraW5nIGl0LiAKCSh0YXJnZXRfaW5mbyk6ICBSZW5hbWVkIGZyb20gdGFyZ2V0X2ZpbGVzX2luZm8uCgkoX2luaXRpYWxpemVfdGFyZ2V0cyk6ICBSZW5hbWUgImkgZmlsZXMiIGFzICJpIHRhcmdldCIsIGFjY2Vzc2libGUKCXVuZGVyIGJvdGggbmFtZXMuCgoJKiB0YXJnZXQuaDogIEltcHJvdmUgY29tbWVudHMgYWJvdXQgdGhlIHRhcmdldF8gdmVjdG9yZWQgcm91dGluZXMuCgoJKiB0bS1pOTYwLmg6ICBSZW1vdmUgTklORFktc3BlY2lmaWMgc3R1ZmYgdG8gdG0tbmluZHk5NjAuaC4KCUNvbnZlcnQgY29tbWVudGluZyBzdHlsZSB0byBzdGFuZGFyZCBHTlUgc3R5bGUuCgkoREJYX1BBUk1fU1lNQk9MX0NMQVNTKTogYWxsb3cgTE9DX0xPQ0FMX0FSRydzIHRvIGJlIHJlY29nbml6ZWQuCgkoU0tJUF9QUk9MT0dVRSk6ICBObyBsb25nZXIgYSBuby1vcC4KCShTQVZFRF9QQ19BRlRFUl9DQUxMKTogIE5vdyBoYW5kbGVzIGxlYWYgcHJvY2VkdXJlcy4KCSgqX1JFR05VTSk6ICBTb3J0IHJlZ2lzdGVyIG51bWJlcnMuCgkoUkVHSVNURVJfQllURVMsIFJFR0lTVEVSX0JZVEUsIFJFR0lTVEVSX1JBV19TSVpFLAoJTUFYX1JFR0lTVEVSX1JBV19TSVpFLCBSRUdJU1RFUl9DT05WRVJUSUJMRSwKCVJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTCwgUkVHSVNURVJfQ09OVkVSVF9UT19SQVcpOiAgRmxvYXQgcmVncwoJYXJlIG5vdyAxMCBieXRlIGV4dGVuZGVkcywgbm90IDggYnl0ZSBkb3VibGVzLgoJKEZSQU1FX0NIQUlOX1ZBTElEKTogIE1ha2UgdGhpcyBjb25maWctZGVwZW5kZW50LCBzaW5jZSBpdCBkaWZmZXJzCglmb3IgbmluZHkgdmVyc3VzIHZ4d29ya3MgdGFyZ2V0cy4gIEZJWE1FLCB0aGlzIHNob3VsZCBwb3NzaWJseSBnbwoJaW4gdGhlIHRhcmdldCB2ZWN0b3IuCgkoRVhUUkFfRlJBTUVfSU5GTywgSU5JVF9FWFRSQV9GUkFNRV9JTkZPKTogIENhY2hlIGJvdGgKCWZyYW1lX3NhdmVkX3JlZ3MgYW5kIGFyZyBwb2ludGVyIHdpdGggZWFjaCBmcmFtZS4KCShGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTik6ICBOZXcgbGVhZnByb2Mgc3VwcG9ydC4KCShGUkFNRV9BUkdTX0FERFJFU1MpOiAgVXNlIGNhY2hlZCByZXN1bHQuCgkoRlJBTUVfQVJHU19BRERSRVNTX0NPUlJFQ1QpOiAgTmV3LCBhdm9pZHMgZzE0IGd1ZXNzaW5nLgoJKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6ICBDaGFuZ2UgYXJnIHRvIHN1YnNpZGlhcnkgZm4uCgkoUFJJTlRfUkFNRE9OX1NJR05BTCk6ICBDYWxsIHByaW50X2ZhdWx0LgoJKFBPUF9GUkFNRSk6ICBOb3cgd29ya3MuCgoJKiB0bS1uaW5keTk2MC5oOiAgQnJlYWsgdGhpcyBvZmYgdG0taTk2MC5oLiAgTklORFktc3BlY2lmaWMKCW9wdGlvbiBwYXJzaW5nIGFuZCBzdGFydHVwOyBTVEFDS19FTkRfQUREUiwgRlJBTUVfQ0hBSU5fVkFMSUQsCglCUkVBS1BPSU5ULCBhbmQgREVDUl9QQ19BRlRFUl9CUkVBSyBhcmUgaGVyZS4KCShBRERJVElPTkFMX09QVElPTl9IQU5ETEVSKTogIHVzZSB0YXJnZXRfbG9hZCwgbm90Cgl0YXJnZXRfYWRkX2ZpbGUuCgkKCSogdG0tdnh3b3Jrczk2MC5oOiAgQnJlYWsgdGhpcyBvZmYgdG0taTk2MC5oLiAgVnhHREIgc3BlY2lmaWMKCXN0YXJ0dXA7IERFQ1JfUENfQUZURVJfQlJFQUssIGFuZCBGUkFNRV9DSEFJTl9WQUxJRCBhcmUgaGVyZS4KCgkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1YnNjcmlwdGVkX3J2YWx1ZSk6ICBBdm9pZCBoYW5kbGluZwoJZmxvYXRzIGFuZCBkb3VibGVzIHNwZWNpYWxseTsgaXQgZ2F2ZSBhbGlnbm1lbnQgZXJyb3JzLiAgTGludC4KCgkqIHZhbG9wcy5jICh2YWx1ZV9vZl92YXJpYWJsZSwgdmFsdWVfb2ZfdGhpcyk6ICBFcnJvciBpZiB1bmtub3duCgl2YWx1ZS4KCgkqIHZhbHByaW50LmMgKHByaW50X2Zsb2F0aW5nKTogIEJjb3B5IHJhdGhlciB0aGFuIHBvaW50ZXItZGVyZWYsCgl0byBhdm9pZCBhbGlnbm1lbnQgcHJvYmxlbXMuCgkodmFsdWVfcHJpbnQpOiAgSGFuZGxlIHVua25vd24gdmFsdWUgYWRkcmVzcy4KCShjcGx1c192YWxfcHJpbnQpOiAgVHdvIGFyZ3MgYXJlIGlnbm9yZWQ7IHJlbW92ZSB0aGVtLiAgQ2hhbmdlIGNhbGxlci4KCSh2YWxfcHJpbnQpOiAgVXNlIHVucGFja19sb25nIHJhdGhlciB0aGFuIHBvaW50ZXItZGVyZWYuCgoJKiB2YWx1ZXMuYzogIExpbnQuCgkodW5wYWNrX2xvbmcsIHVucGFja19kb3VibGUpOiAgVXNlIGJjb3B5IHJhdGhlciB0aGFuIHBvaW50ZXItZGVyZWYKCXRvIGF2b2lkIGFsaWdubWVudCBwcm9ibGVtcy4KCSh2YWx1ZV9iZWluZ19yZXR1cm5lZCk6ICBFcnJvciBpZiByZXR1cm4gdmFsdWUgdW5rbm93bi4KCShzZXRfcmV0dXJuX3ZhbHVlKTogIEFkZCBib2dvc2l0eSB3YXJuaW5nLCBGSVhNRS4gICAgICAgICoKCgkqIFRPRE86ICBBIHdvbWFuJ3Mgd29yayBpcyBuZXZlciBkb25lLgoKCSogTWFrZWZpbGUuZGlzdDogIERpc3RyaWJ1dGUgUkVNT1RFX09CUyBpbnRvIHRjb25maWcgZmlsZXMuCglTZXBhcmF0ZSBJTkNMVURFX0NGTEFHUyBmb3IgdXNlIHdpdGggbGludC4gIEFkZCBMSU5URklMRVMuCglBZGQgaWVlZS1mbG9hdC5vIHRvIE9CUy4KCSogdGNvbmZpZy97bmluZHk5NjAsdnh3b3JrczY4LHZ4d29ya3M5NjB9OiAgSW5jbHVkZSB0aGUgZGVzaXJlZAoJUkVNT1RFX09CUyByZW1vdGUtaW50ZXJmYWNlIGZpbGVzIGluIHRoZSBUREVQRklMRVMgYW5kIFRNX0ZJTEUuCgkqIHRjb25maWcvaTk2MDogIEZJWE1FLiAgSGFsZi1tZXJnZSwgcHJvZHVjZSB3YXJuaW5nIGlmIGNvbmZpZydkLgoKCUNoYW5nZXMgdG8gZ2VuZXJhbGl6ZSB0aGUgVnhXb3JrcyBSUEMgcHJvdG9jb2wgc2xpZ2h0bHksIHRvIGhhbmRsZQoJaTk2MCBhcyB3ZWxsIGFzIDY4MDAwLgoKCSogdngtc2hhcmUvZGJnUnBjTGliLmggKFZYX1NPVVJDRV9TVEVQKTogIEFkZC4KCSogdngtc2hhcmUvcmVnLmg6ICBQcm9kdWNlIGk5NjAgcmVncyAjaWZkZWYgSTgwOTYwCgkqIHZ4LXNoYXJlL3hkcl9wdHJhY2UuYzogIFNraXAgRlBBIHJlZ2lzdGVycyBpZiA5NjAuCgkqIHZ4LXNoYXJlL3hkcl9yZGIuaDogIEFkZCBTT1VSQ0VfU1RFUCBzdHJ1Y3QgYW5kIHhkciBkZWNsLgoJKiB2eC1zaGFyZS94ZHJfcmRiLmM6ICBBZGQgeGRyX1NPVVJDRV9TVEVQIHJvdXRpbmUuCgkqIHZ4LXNoYXJlL3hkcl9yZWdzLmM6ICBBZGQgeGRyX3JlZ3MsIHhkcl9mcF9zdGF0dXMsIHhkcl9leHRfZnAKCWZvciBpOTYwLiAgQ2hhbmdlIHhkcl92ZWN0b3JzIHRvIHhkcl9vcGFxdWVzIGZvciA2OGsgcmVnaXN0ZXJzLAoJc28gdGhleSB3aWxsIG1vdmUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgcmF0aGVyIHRoYW4gbmV0d29yawoJYnl0ZSBvcmRlciAoaGFwcGVucyB0byBiZSB0aGUgc2FtZSkuCQoKTW9uIEZlYiAyNSAwMzo0MTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiB0bS1jb252ZXguaCAoRU5EX09GX1RFWFRfREVGQVVMVCk6ICBSZW1vdmUgI2lmIDAnZCBibG9jay4KClN1biBGZWIgMjQgMDA6NTU6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogYW0yOWstcGluc24uYywgCglBZGQgY29udHJpYnV0aW9uIGxpbmVzIHRvIHZhcmlvdXMgZmlsZXMsIHNob3dpbmcgd2hlcmUgdGhleQoJY2FtZSBmcm9tLgoKCSogYnJlYWtwb2ludC5jIChicmVha19pbnNuLCBjaGVja19icmVha19pbnNuX3NpemUsCglyZWFkX21lbW9yeV9ub2JwdCk6ICBSZW1vdmUgdG8gbWVtLWJyZWFrLmMuCgoJKiB4bS0qLmgsIHBhcmFtLW5vLXRtLmgsIHRtLTI5ay5oLCB2YWxwcmludC5jOiAgQ2hhbmdlIEJZVEVfT1JERVIgdG8KCUhPU1RfQllURV9PUkRFUi4KCgkqIHRtLTI5ay5oIChTVEFCX1JFR19UT19SRUdOVU0pOiAgV2FybiB1c2VyIGlmIHN5bWJvbCB0YWJsZQoJZW50cnkgaGFzIGJhZCByZWdpc3RlciBudW1iZXIuICBUaGlzIGNoYW5nZSBpcyBub3QKCXRlc3RlZCBpbiB0aGlzIHJlbGVhc2UsIEZJWE1FLgoKCSogZnJhbWUuaDogIEVsaW1pbmF0ZSBGcmFtZV91bmtub3duIGluIGZhdm9yIG9mIGEgc2ltcGxlIHplcm8uCgl0bS12YXguaDogIERpdHRvLgoKCSogdmFsdWUuaDogIEZvcmNlIHZhbHVlJ3MgY29udGVudHMgZmllbGQgdG8gYmUgYWxpZ25lZCB0byBob2xkCglhdCBsZWFzdCBhIGRvdWJsZSBvciBhIGxvbmcgbG9uZyAoaWYgc3VwcG9ydGVkKS4gIFRoaXMgYXZvaWRzCglkb2luZyBiY29weSdzIGluIGFuZCBvdXQgb2YgdGhlIGNvbnRlbnRzIGZpZWxkLgoKCShzdGVwXzEpOiAgQXZvaWQgY29yZWR1bXAgdW5kZXIgb2JzY3VyZSBjaXJjdW1zdGFuY2VzIHdoZW4gd2UKCWhhdmUgbm8gZnJhbWUuCgoJKiBzeW10YWIuaCAobWlzY19pbmZvKTogIEFkZCBmaWVsZCB0byBtaXNjIGZ1bmN0aW9uIHZlY3RvciBmb3IKCWFueSBraW5kIG9mIGNhY2hlZCBpbmZvcm1hdGlvbiB0aGUgdGFyZ2V0IGNvZGUgZGVzaXJlcy4gIEFNRAoJMjkwMDAgdXNlcyB0aGlzIHRvIGF2b2lkIHJlcGVhdGluZyBleGFtaW5lX2Z1bmN0aW9uX3Byb2xvZ3VlJ3MuCgoJKiBjb2ZmcmVhZC5jOiAgTGludC4gIFJlbW92ZSBzdGF0aWMgc3ltZmlsZSwgcmVhZF9zZWN0aW9uX2hlYWRlci4KCWNvcmUuYyAoaGF2ZV9jb3JlX2ZpbGVfcCk6ICBMaW50OiByZW1vdmUuCglleHBwcmludC5jIChwcmludF9zdWJleHApOiAgTGludC4KCWluZnB0cmFjZS5jLCB2YWxvcHMuYywgdmFscHJpbnQuYzogIGxpbnQuCgoJUm9sbCBpbiBjaGFuZ2VzIGZyb20gdnhnZGItNS4wLjE6CgoJKiBzeW10YWIuaDogIENvbW1lbnQgYnl0ZSBvcmRlciBvZiBlYWNoIGFkZHJlc3MgY2xhc3MuICBBZGQKCUxPQ19MT0NBTF9BUkcgZm9yIGZyYW1lLXJlbGF0aXZlIGFyZ3MgKDk2MCkuCglleHByZWFkLnk6ICBVc2UgTE9DX0xPQ0FMX0FSRyB3aGVyZSBMT0NfQVJHIGlzIHVzZWQuCglzeW10YWIuYywgc3ltbWlzYy5jOiAgZGl0dG8uCgkKCSogaW5mcnVuLmMgKGluaXRfd2FpdF9mb3JfaW5mZXJpb3IpOiAgQ2xlYXIgc3RvcF9zaWduYWwuCgoJKiByZW1vdGUuYyAocmVtb3RlX3Jlc3VtZSk6ICBFcnJvciBpZiByZXN1bWUgd2l0aCBhIHNpZ25hbC4KCgkqIHN5bWZpbGUuYyAocHJpbV9yZWNvcmRfbWlzY19mdW5jdGlvbik6ICBDbGVhciBtaXNjX2luZm8uCgkoZmlsbF9pbl92cHRyX2ZpZWxkbm8pOiAgQ2hlY2sgc3R1YiB0eXBlIG9mIGFyZy4KCgkqIHZhbG9wcy5jICh2YWx1ZV9jYXN0KTogIEF2b2lkIGxvb2tpbmcgdXAgbmFtZXMgb2YgdHlwZXMgd2hvc2UKCW5hbWUgd2UgZG9uJ3Qga25vdywgdG8gcHJldmVudCBjb3JlZHVtcC4gIFN1biBDQyBwcm9kdWNlcyB0eXBlZGVmCglydHggYW5kIHRoZSBuYW1lIG9mICpydHggaXMgemVyby4uLgoKTW9uIEZlYiAxOCAyMToxNjoyNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJUm9sbCBpbiBjaGFuZ2VzIGZyb20gZmluYWwgQU1EIDI5MDAwIHBvcnQgKFRpZW1hbm4pLgoKCXRjb25maWcvYW0yOWs6ICBBZGQgQ09GRl9FTkNBUFNVTEFURSBhbmQgVEFSR0VUPVRBUkdFVF9BTTI5SwoJZm9yIC4uL2luY2x1ZGUvYS5vdXQuZW5jYXAuaC4gIFRoaXMgbWlnaHQgbm90IHdvcmsgbm93IHRoYXQgQkZECglpcyBzZXBhcmF0ZWx5IGNvbXBpbGVkLiAgSW5zdGVhZCwgQkZEIHN1cHBvcnQgZm9yIGVuY2FwIHdpbGwgaGF2ZQoJdG8gdHJhbnNsYXRlIG1hY2hpbmUgdHlwZSAyOWsgaW50byB0aGUgcmlnaHQgQ09GRl9NQUdJQy4KCQoJKiBpbmZjbWQuYzogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gaW5mZXJpb3JfcGlkIHRoYXQgYXJlbid0IHVzZWQKCWluIGFjdHVhbCBwdHJhY2UgY2FsbHM7IHVzZSB0YXJnZXRfaGFzX2V4ZWN1dGlvbiwgZXRjLgoJKGhhdmVfaW5mZXJpb3JfcCk6ICBSZW1vdmUgZnVuY3Rpb24uCgkocHJvZ3JhbV9pbmZvKTogIFByaW50IHRhcmdldCBpbmZvIHJhdGhlciB0aGFuICJwcm9jZXNzIG51bWJlciI7Cglhdm9pZCBncmF0dWl0b3VzIG1lc3NhZ2VzIHVubGVzcyBmcm9tX3R0eS4KCShydW5fc3RhY2tfZHVtbXksIGZpbmlzaF9jb21tYW5kKTogIFNldCBwcm9jZWVkX3RvX2ZpbmlzaC4KCWluZnJ1bi5jOiBSZW1vdmUgaW5mZXJpb3JfcGlkIHJlZnMuICBEZWNsICYgaW5pdCBwcm9jZWVkX3RvX2ZpbmlzaC4KCW1haW4uYzogIExpbnQuICBMb3NlIGhhdmVfaW5mZXJpb3JfcCgpLgoJaW5mZXJpb3IuaCAoaGF2ZV9pbmZlcmlvcl9wKTogIFJlbW92ZSwgbGludC4KCShwcm9jZWVkX3RvX2ZpbmlzaCk6ICBBZGQgZmxhZyB0byBhc2sgdGhhdCBhbGwgcmVncyBiZSBzYXZlZAoJYnkgbm9ybWFsX3N0b3AsIGZvciB0aGUgZmV3IGNvbW1hbmRzIHRoYXQgbmVlZCBpdCwgc3BlZWRpbmcgdXAKCXNlcmlhbCBJL08uICBBZGQgY29tbWVudHMgdG8gc3RvcF9yZWdpc3RlcnMuCgoJKiByZW1vdGUtZWIuYzogIFJlbW92ZSBuZXdsaW5lIGZyb20gYnJlYWtwb2ludCBtZXNzYWdlIHdlIGdyZXAKCWZvci4gIE5ldmVyIHRpbWUgb3V0IHdoZW4gcnVubmluZyB0aGUgdXNlciBwcm9ncmFtLgoJCgoKV2VkIEZlYiAxMyAxNTozNDo0MCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJUm9sbCBpbiBjaGFuZ2VzIGZyb20gdnhnZGItNS4wLjE6CgoJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IElmIHdlIGVuY291bnRlciBhICJGT1JUUkFOIENPTU1PTiIKCXN5bWJvbCBpbiBpdHMgcmF3IGZvcm0sIHdlIGFyZSBwcm9jZXNzaW5nIGFuIHVubGlua2VkICIubyIgZmlsZS4KCVNlZSBpZiB0aGUgdGFyZ2V0IGVudmlyb25tZW50IGhhcyBhc3NpZ25lZCBpdCBhbiBhZGRyZXNzLCB1c2luZwoJdGFyZ2V0X2xvb2t1cF9zeW1ib2wgKFZ4V29ya3MgZG9lcyksIGFuZCBlbnRlciBpdCBpbnRvIHRoZSBzeW10YWIKCXRoYXQgd2F5LgoKCSogdG0tdnh3b3Jrcy5oIChGUkFNRV9DSEFJTiwgRlJBTUVfQ0hBSU5fVkFMSUQpOiAgT3ZlcnJpZGUgdXN1YWwKCTY4ayB2ZXJzaW9ucyBmb3IgYSBzaW1wbGVyIHZlcnNpb24gdGhhdCBhc3N1bWVzIHplcm8gRlAgYXQgYm90dG9tLgoJRml4ZXMgYnVnIG9mIHRydW5jYXRlZCBzdGFjayByZXBvcnRzLgoKCSogdGFyZ2V0LmggKHRhcmdldF9sb29rdXBfc3ltYm9sKTogIERlZmluZSB0aGlzIHJvdXRpbmUncyBhcmdzCglhbmQgcmVzdWx0LCBmaW5hbGx5LgoKCSogdGFyZ2V0LmMgKG5vc3ltYm9sKTogIERlZmF1bHQgcm91dGluZSBmb3IgdGFyZ2V0X2xvb2t1cF9zeW1ib2wuCgkodGFyZ2V0X2RlZmF1bHQpOiAgRGVmYXVsdCBsb29rdXBfc3ltYm9sIGFuZCBjYWxsX2Z1bmN0aW9uIHRvby4KCShmaWxlc19pbmZvKTogIE9ubHkgcHJpbnQgaGFzX2FsbF9tZW1vcnkgd2FybmluZyBpZiBhIG5vbi1kdW1teQoJdGFyZ2V0IGZvbGxvd3MuCgoJKiByZW1vdGUtdnguYyAodnhfcmVhZF9yZWdpc3RlciwgdnhfY29udmVydF90b192aXJ0dWFsLAoJdnhfY29udmVydF9mcm9tX3ZpcnR1YWwpOiBJZiB0YXJnZXQgZG9lcyBub3QgaGF2ZSBmbG9hdGluZyBwb2ludCwKCXplcm8gcmVnaXN0ZXIgInZhbHVlcyIsIGFuZCBhdm9pZCBkb2luZyBjcm9zcy1uZXQgY29udmVyc2lvbnMuCgkodnhfbG9va3VwX3N5bWJvbCk6ICBSZW5hbWUgbmV0X2xvb2t1cF9zeW1ib2wsIGFkZCB0byB2ZWN0b3JzLgoJKHZ4X29wZW4pOiAgUmVhcnJhbmdlIGNvZGUgdGhhdCBhdHRhY2hlcyB0byB0YXJnZXQgYW5kIHJlYWRzCglzeW1ib2xzIGZvciBhbGwgbG9hZGVkIG1vZHVsZXMsIHRvIHdvcmsgaWYgc29tZSBvZiB0aGUgbW9kdWxlcwoJYXJlIG5vdCBhY2Nlc3NpYmxlLiAgQWRkIHN5bWJvbF9zdHViKCkgYW5kIGFkZF9zeW1ib2xfc3R1YigpCglhcyBjYWxsYmFja3MgZnJvbSBjYXRjaF9lcnJvcnMoKS4gIEFsbG93IGNvbm5lY3QgYXR0ZW1wdCB0byBiZQoJaW50ZXJydXB0ZWQgcGFpbmxlc3NseSB3aXRoIF5DIChGSVhNRSwgdGhlcmUgYXJlIHN0aWxsIHNvbWUgYnVncwoJaWYgdGhlIGludGVycnVwdCBoYXBwZW5zIGR1cmluZyBzeW1ib2wgcmVhZGluZy4pLiAgUHJpbnQKCWZpbmFsIG1lc3NhZ2Ugd2l0aCBwdXRzX2ZpbHRlcmVkLCBzaW5jZSBzeW1ib2wgbWVzc2FnZXMgYXJlCglub3cgZmlsdGVyZWQgdG9vLgoKCU1pc2MgY2xlYW51cDoKCgkqIG1haW4uYyAoY2F0Y2hfZXJyb3JzKTogIE9ubHkgcHJpbnQgZXJyc3RyaW5nIGlmIG5vbi1udWxsLgoJKGNvbW1hbmRfbG9vcCk6ICBBdm9pZCBhbiBpb2N0bCBwZXIgY29tbWFuZCB0byB0ZXN0IElTQVRUWS4KCgkqIHJlbW90ZS12eC5jIChuZXRfbG9hZCk6ICBtYWtlIHN0YXRpYzsgYXZvaWQgc29waG9tb3JpYyBtc2cuCgkodnhfeGZlcl9tZW1vcnkpOiAgUmV0dXJuIGNvcnJlY3QgcmVzdWx0IQoJKHZ4X2ZpbGVzX2luZm8pOiAgSW5kaWNhdGUgd2hldGhlciB0YXJnZXQgaGFzIGZsb2F0IG9yIG5vdC4KCSh2eF9sb29rdXBfc3ltYm9sKTogIENvbXBsYWluLCBub3QgZXJyb3IsIGlmIHRhcmdldCBnb25lLgoJKHZ4X29wZW4pOiAgUHJpbnQgIkNvbm5lY3RlZCIgbXNnIGJlZm9yZSBkaXNhYmxpbmcgaW1tZWRpYXRlLXF1aXQuCglbRklYTUU6ICBsb29rdXBfc3ltYm9sIGFuZCB2eF9vcGVuIGNoYW5nZXMgbmVlZCB0ZXN0aW5nLl0KCgl0YXJnZXQuYywgcmVtb3RlLWViLmMsIGluZnRhcmcuYywgYW0yOWstb3Bjb2RlLmgsIHRhcmdldC5oLAoJdG0tMjlrLmgsIHRtbS12eHdvcmtzNjguaCwgc3ltZmlsZS5jLCBnZGItaW50LnRleGluZm86IEFkZAoJY29udHJpYnV0b3IgbGluZXMgYW5kIHVwZGF0ZSBjb3B5cmlnaHRzIHRvIDE5OTEuCgoJQ2hhbmdlcyBmcm9tIGFuIGF0dGVtcHRlZCBILVBVWCBob3N0IHBvcnQ6CgoJKiBpbmZwdHJhY2UuYyAoUFRfQVRUQUNILCBQVF9ERVRBQ0gpOiAgSGFuZGxlIEhQL1VYLCB3aGljaCAKCWRlZmluZXMgUFRfQVRUQUNIIGFuZCBQVF9ERVRBQ0ggYnV0IG5vdCBQVF9LSUxMLgoJKiByZW1vdGUtZWIuYyAoZWJfb3Blbik6ICBNaXNwbGFjZWQgZW5kaWYga2lsbHMgc3lzdiBIL1BVWC4KCSogcmVtb3RlLXZ4LmM6IGluY2x1ZGUgPHN5cy90aW1lLmg+IGZvciBIUFVYLgoJKiBocDMwMGhwdXgteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBSZXdyaXRlIG9sZAoJImNvcmVfZmlsZV9jb21tYW5kIiByb3V0aW5lIHRvIEJGRCByZWdpbWUuICBNYXkgbm90IHdvcmsgeWV0LgoKCUF0dGVtcHRlZCBwb3J0IG9mICJnZGItMy40IFZhbiBKYWNvYnNvbiB4Z2RiIiB0byBtb2Rlcm4gZ2RiLgoKCSogeGdkYi5jOiBSZXBsYWNlIFgxMCB2ZXJzaW9uIHdpdGggc29tZSBWSiB2ZXJzaW9uLgoJKEZJWE1FOiAgSXRzIGNvcHlyaWdodCBhc3NpZ25tZW50IGlzIG5vdCBvbiByZWNvcmQuKQoJKiB4Z2RiLmM6ICBVcGRhdGUgaW5jbHVkZSBmaWxlcyB0byBYMTFSNCAoWGF3IGNydWQpLgoJKHhnZGJfZGlzcGxheV9zb3VyY2UsIGNyZWF0ZV90ZXh0X3dpZGdldCk6IGZpeCBjYWxsIHRvCglnZXRfZmlsZW5hbWVfYW5kX2NoYXJwb3MuICBSZXdhY2sgc291cmNlIHdpbmRvdyBzdHVmZiBmb3IgWDExUjQKCShnbGVhbmVkIGZyb20gaW5jbHVkZSBmaWxlcywgYW5kICJubSdzIiBvZiBiaW5hcnkgbGlicmFyaWVzLCBzaW5jZQoJSSBoYWQgbm8gZG9jIGF2YWlsYWJsZSkuCgkoYXBwZW5kX3NlbGVjdGlvbiwgYXBwZW5kX3NlbGVjdGlvbl93b3JkKTogRGlzYWJsZSB3aXRoIEZJWE1FCglzaW5jZSBSNCBjaGFuZ2VkIGludGVyZmFjZSBoZXJlLgoJKGNyZWF0ZV9idXR0b25zKTogIEFkZCBiYWNrIHRoZSBvbGQgc2V0IG9mIGJ1dHRvbnMuCgkoeGdkYl9jcmVhdGVfd2luZG93KTogIEZpeCBjYWxsIHRvIFh0SW5pdGlhbGl6ZSAoJmFyZ2Mgbm90IGFyZ2MpLgoKCSogTWFrZWZpbGUuZGlzdCAoeGdkYiwgeGdkYi1pbml0LmMpOiAgVXBkYXRlIGZvciBYMTFSNCBvbiBTdW5zLgoJUm9sbCBWRVJTSU9OIHRvIDMuOTQgKG5vdCB5ZXQgZmluYWwgdGhvdWdoKS4KClNhdCBGZWIgIDkgMDk6NDY6MjUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCSogb2JzdGFjay5oIChvYnN0YWNrX3B0cl9ncm93LCBvYnN0YWNrX3B0cl9ncm93X2Zhc3QsCglvYnN0YWNrX2ludF9ncm93LCBvYnN0YWNrX2ludF9ncm93X2Zhc3QpOiAgRWxpbWluYXRlCgljYXN0IG9uIGxlZnQgb2YgYXNzaWdubWVudCwgd2hpY2ggZ2l2ZXMgTUlQUyBjYyBmaXRzIGFuZCBpcwoJbm90IFN0YW5kYXJkIEMuCgoJKiBzcGFyYy1waW5zbi5jIChwcmludF9pbnNuKTogRWxpbWluYXRlICdzZXQnIHRlc3QsIHN1YnN1bWVkIGJ5CglGX0FMSUFTLiAgVXNlIHByaW50Ziwgbm90IGZwcmludGYsIHdoZW4gbm90IHBhc3NpbmcgYSBmaWxlCglwb2ludGVyLi4uCgkoY29tcGFyZV9vcGNvZGVzKTogQ2hlY2sgdGhhdCBpZGVudGljYWwgaW5zdHJ1Y3Rpb25zIGhhdmUKCWlkZW50aWNhbCBvcGNvZGVzLCBjb21wbGFpbiBvdGhlcndpc2UuCgoJKiBzcGFyYy1vcGNvZGUuaCAoc3QgJWZzcik6ICBGaXggb3Bjb2RlICJsb3NlIiBtYXNrLiAgVGhpcwoJd2FzIHJlcG9ydGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgoJKHVuaW1wKTogT25seSBtYXRjaCBpZiBleGFjdGx5IHplcm8gaW5zdHJ1Y3Rpb24uICAoUm9sYW5kKQoJKGJyYW5jaGVzIGFuZCB0cmFwcyk6ICBHZW5lcmF0ZSBhbGwgdmFyaWF0aW9ucyBvZiB0aGVzZQoJaW5zdHJ1Y3Rpb25zIHdpdGggbWFjcm9zLCBiYXNlZCBvbiBhIHNpbmdsZSBjYWxsIHRoYXQgZGVmaW5lcwoJZWFjaCBjb25kaXRpb24gbmFtZSBhbmQgaXRzIGJpbmFyeSByZXByZXNlbnRhdGlvbi4KCShzZXQpOiAgVHVybiBvbiBhbGlhcyBiaXQsIHRvIGF2b2lkIHRlc3QgaW4gc3BhcmMtcGluc24uYy4KCgkqIHZhbHByaW50LmMgKHZhbF9wcmludF9maWVsZHMpOiAgVGFrZSwgYW5kIHVzZSwgZm9ybWF0IHBhcmFtZXRlci4KCVRoaXMgbWVhbnMgdGhhdCAicC94IHN0cnVjdCIgYWdhaW4gcHJpbnRzIHRoZSBlbGVtZW50cyBpbiB0aGUKCWRlc2lyZWQgZm9ybWF0LiAgQ2hhbmdlZCBjYWxsZXJzLgoKCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6ICBVc2UgZmlsdGVyZWQgb3V0cHV0LCBhbmQgaW5kaWNhdGUgd3JhcAoJcG9pbnRzLiAgUmVtb3ZlIGtsdWRneSBmb3JtYXR0aW5nIGRlc2lnbmVkIHRvIGF2b2lkIGxpbmUgd3JhcC4KCgkqIHV0aWxzLmMgKHdyYXBfaGVyZSk6ICBJZiB0aGUgbGluZSBpcyBhbHJlYWR5IGZ1bGwgKGJlY2F1c2UKCXdlIGhhZCBwcmludGVkIGEgbG9uZyBpbmRlbnQgb3IgbG9uZyB3cmFwcGVkIHN0cmluZyksIGRvIGFuCglpbW1lZGlhdGUgbmV3bGluZS1hbmQtaW5kZW50LgoKCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyk6IEJ1Z2ZpeCBmcm9tCgludG10diF0aG9tcHNvbkBhbWVzLmFyYy5uYXNhLmdvdiAoTWlrZSBUaG9tcHNvbik6ICdia3B0ICMwJwoJaW5zdHJ1Y3Rpb24gaXMgaW5jb3JyZWN0bHkgZGlzYXNzZW1ibGVkIGFzIGJrcHQgIzguCgoJKiBkYnhyZWFkLmMgKGVuZF9wc3ltdGFiKTogQnVnZml4IGZyb20gUGV0ZXIgU2NoYXVlcgoJPHBlc3JlbUByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPjogSWYgeW91IHdhbnQgdG8gc2V0IGEKCWJyZWFrcG9pbnQgaW4gYSAqLnkgZmlsZSBnZGIgd2lsbCBzYXkgUmVhZGluZyBpbiBzeW1ib2xzIGZvciAqLnkuLi4KCWFuZCB0aGVuIHdpbGwgZHVtcCBjb3JlIChzb21ldGltZXMpLiBJIHRyYWNlZCBpdCBiYWNrIHRvIGFuCgl1bmluaXRpYWxpemVkIHN5bWZpbGVfbmFtZSBpbiBwc3ltdGFiX3RvX3N5bXRhYi4KCShjb25zdF92b2xfY29tcGxhaW50KTogIEFkZCBxdW90ZXMgdG8gbWVzc2FnZS4KCShkZWZpbmVfc3ltYm9sKTogIE9ubHkgYmVsaWV2ZSBsaW5lIG51bWJlciBpZiBnY2NfY29tcGlsZWQuCglBdm9pZCBhbGxvY2F0aW5nIHN5bWJvbCBpZiB3ZSB3aWxsIG5vdCByZXR1cm4gaXQuCgoJQWRkIHRhcmdldCBzdHJhdGEgc3VwcG9ydCBzbyB0aGF0IG5ld2x5IGVzdGFibGlzaGVkIHRhcmdldHMgZ28KCWludG8gdGhlaXIgcmlnaHQgcGxhY2UgaW4gdGhlIHRhcmdldCBzdGFjayAoZS5nLiBhIG5ldyBleGVjIGZpbGUKCWRvZXNuJ3Qgd2lwZSBvdXQgdGhlIGFiaWxpdHkgdG8gYWNjZXNzIHRoZSBydW5uaW5nIHByb2Nlc3MpLgoKCSogdGFyZ2V0LmgsIGNvcmUuYywgZXhlYy5jLCBpbmZ0YXJnLmMsIHJlbW90ZS1lYi5jLAoJcmVtb3RlLW5pbmR5LmMsIHJlbW90ZS12eC5jLCByZW1vdGUuYywgdGFyZ2V0LmM6ICBBZGQgdG9fc3RyYXR1bQoJYW5kIGluaXRpYWxpemUgaXQgcHJvcGVybHkgaW4gYWxsIHRoZSB0YXJnZXRzLgoKCSogdGFyZ2V0Lmg6ICBEb2N1bWVudCBzdHJhdGEuICBDaGFuZ2UgcmV0dXJuIHR5cGUgb2YgcHVzaF90YXJnZXQuCgoJKiB0YXJnZXQuYyAobm9tZW1vcnkpOiAgbmV3IGZ1bmN0aW9uIGZvciBkdW1teSBtZW1vcnkgYWNjZXNzLgoJKHRjb21wbGFpbik6ICBSZW5hbWUgY29tcGxhaW4sIG5vdyBhbHNvIHVzZWQgaW4gc3ltZmlsZS5jLgoJKHB1c2hfdGFyZ2V0KTogIFB1c2ggdGFyZ2V0cyB3aXRoaW4gc3RyYXRhLiAgTmV3IHJldHVybiB2YWx1ZSBzaG93cwoJd2hldGhlciBuZXcgdGFyZ2V0IGlzIG9uIHRvcCBvZiBzdGFjayBvciBub3QuICBBbHdheXMga2VlcCBkdW1teQoJdGFyZ2V0IG9uIHN0YWNrLgoJKHRhcmdldF9maWxlc19pbmZvKTogIElnbm9yZSBkdW1teSB0YXJnZXQuCgoJKiBjb3JlLmMgKGNvcmVfb3Blbik6ICBXYXJuIHVzZXIsIGFuZCBza2lwIGFjY2Vzc2luZyBmaWxlLCBpZiB0aGUKCWNvcmUgdGFyZ2V0IGlzIG5vdCB0aGUgdG9wbW9zdCB0YXJnZXQgaW4gdGhlIHN0YWNrLgoJKiByZW1vdGUtbmluZHkuYyAobmluZHlfY3JlYXRlX2luZmVyaW9yKTogIEF2b2lkIHVucHVzaF90YXJnZXQsIG5vdwoJYWxyZWFkeSBoYW5kbGVkLgoKCSogcmVtb3RlLXZ4LmM6ICBSZW1vdmUgdnhfcHJlcGFyZV90b19zdG9yZSBmcm9tIHZ4d29ya3MgbWVtb3J5Cgl0YXJnZXRfb3BzLCBpdCBkb2Vzbid0IGJlbG9uZyB0aGVyZSBzaW5jZSB3ZSBoYXZlIG5vIHJlZ3MgdGhlcmUuCglDaGFuZ2UgbmFtZSBvZiB0YXJnZXQgZnJvbSBtYWNoaW5lID0+IG1lbW9yeSB0byBjbGFyaWZ5LgoKVGh1IEZlYiAgNyAxNjozMjowOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgc3BpZmYuY3lnbnVzLmNvbSkKCgkqIEZyZWV6ZSB2ZXJzaW9uIDMuOTMgZm9yIHJlbGVhc2UuCgoJKiBNYWtlZmlsZS5kaXN0OiAgSGFuZGxlIHZ4LXNoYXJlIGFuZCBuaW5keS1zaGFyZSBzdWJkaXJzCglwcm9wZXJseSB3aGVuIGJ1aWxkaW5nIGdkYi50YXIuWi4KCgkqIHN5bXRhYi5jOiAgbGludDsgYWRkIG5vX3N5bXRhYl9tc2cgdG8gY29uc29saWRhdGUgdGhlIG1lc3NhZ2VzCglwcmludGVkIGluIHZhcmlvdXMgcGxhY2VzLCBzbyBJIGNvdWxkIGNoYW5nZSBqdXN0IG9uZSBjb3B5LgoKCSogZGJ4cmVhZC5jLCBjb2ZmcmVhZC5jOiAgQ2hhbmdlIHJlZmVyZW5jZXMgdG8gYmZkLT5pb3N0cmVhbQoJdG8gY2FzdCB0byBGSUxFICosIG5vdyB0aGF0IEJGRCBhdm9pZHMgbmVlZGluZyB0eXBlcyBkZWZpbmVkCglpbiBvdGhlciBoZWFkZXIgZmlsZXMuCgpUdWUgRmViICA1IDIxOjM5OjM1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGNvbW1hbmQuYywgZGJ4cmVhZC5jLCBleHBwcmludC5jLCBpbmZjbWQuYywgaW5mcHRyYWNlLmMsCglpbmZydW4uYywgcHJpbnRjbWQuYywgcmVtb3RlLW5pbmR5LmMsIHNvdXJjZS5jLCBzcGFyYy10ZGVwLmMsCglzcGFyYy14ZGVwLmMsIHN5bWZpbGUuaCwgc3ltbWlzYy5jLCB1dGlscy5jLCB2YWxwcmludC5jOiBMaW50CgkoYWN0dWFsbHkgZ2NjIC1XYWxsKS4KCgkqIGRieHJlYWQuYzogIFJlbW92ZSBmaXJzdF9nbG9iYWxfc3ltLCBsYXN0X2dsb2JhbF9zeW0sIHNpbmNlCgl0aGV5IGFyZSBuZXZlciByZWZlcmVuY2VkLgoKCSogZGVmcy5oIChiYXVkX3JhdGUpOiAgRGVjbGFyZS4KCW1haW4uYzogRGVmaW5lIGl0LCBhbmQgYWRkIHRoZSAtYiBvcHRpb24gdG8gc2V0IGl0LgoKCSogZ2RiLWludC50ZXhpbmZvOiAgQWRkIHRleHQgb24gaG93IHRvIGRlZmluZSBhIG5ldyBob3N0IG9yIHRhcmdldAoJYXJjaGl0ZWN0dXJlLCBwcm9tcHRlZCBieSBQZXIgQm90aG5lcidzIHF1ZXN0aW9ucyBhYm91dCBNSVBTCglzdXBwb3J0LgoKCSogZ2RiLnRleGluZm86ICBEb2N1bWVudCAiY29tcGxhaW50cyIuICBDaGFuZ2UgZG9jIG9mIC1xIHNpbmNlCglnZGIgbm8gbG9uZ2VyIHByaW50cyB0aGUgY29weXJpZ2h0IGFuZCBibHVyYiBpZiB5b3Ugc3BlY2lmeSBhIGZpbGUKCW5hbWUgdG8gYmUgZGVidWdnZWQgKGp1c3QgbGlrZSBFbWFjcykuICBBZGQgZG9jIGZvciBOaW5keS1zcGVjaWZpYwoJY29tbWFuZCBsaW5lIGZsYWdzIGZvciBzcGVjaWZ5aW5nIHRhcmdldCBzZXJpYWwgcG9ydCBhbmQgc3VjaC4KCVVwZGF0ZSBjb3B5cmlnaHQgdG8gMTk5MS4KCgkqIGdkYmNvcmUuaDogIFJlbW92ZSBhIGxhcmdlIG1hc3Mgb2Ygbm93LXVzZWxlc3MgY3J1ZCwgc2luY2UgQkZECgloYXMgdGFrZW4gb3ZlciBmb3IgdXMgdGhlIGpvYiBvZiByaXBwaW5nIHVwIGV4ZWN1dGFibGUgZmlsZXMuICBUaGUKCWNydWQgY2F1c2VkIFBlciBCb3RobmVyJ3MgcG9ydCB0byBub3QgY29tcGlsZS4KCgkqIGluZnJ1bi5jIChub3JtYWxfc3RvcCk6ICBBdm9pZCBwcmludGluZyAiUHJvZ3JhbSBleGl0ZWQKCW5vcm1hbGx5IiBpZiB3ZSBhcmUgaW4gYmF0Y2ggbW9kZS4gIFRoaXMgYWxsb3dzIGEgR0RCIHdoaWNoCglleGVjdXRlcyBhIHByb2dyYW0gb24gYSB0YXJnZXQgc3lzdGVtLCB0byBiZWhhdmUgbGlrZSBhIFVuaXgKCWNvbW1hbmQgKGlucHV0IGZyb20gc3RkaW4sIG91dHB1dCB0byBzdGRvdXQsIG5vIGV4dHJhbmVvdXMKCW91dHB1dCkuCgoJKiBtYWluLmMgKG1haW4pOiAgQWxsb3cgYWRkaXRpb25hbCBtYWNoaW5lLWRlcGVuZGVudCBjb21tYW5kIGxpbmUKCW9wdGlvbnMgdG8gYmUgc3BlY2lmaWVkIHdpdGggdGhlIEFERElUSU9OQUxfT1BUSU9OUywKCUFERElUSU9OQUxfT1BUSU9OX0NBU0VTLCBBRERJVElPTkFMX09QVElPTl9IRUxQLCBhbmQKCUFERElUSU9OQUxfT1BUSU9OX0hBTkRMRVIgbWFjcm9zLiAgQWxzbyBhbGxvdyBtYWNoaW5lLWRlcGVuZGVudAoJcHJvY2Vzc2luZyB0byBvY2N1ciBqdXN0IGJlZm9yZSB0aGUgbWFpbiBsb29wIHdpdGgKCUJFRk9SRV9NQUlOX0xPT1BfSE9PSy4gIAoJKG1haW4pOiAgSWYgYSAiY29yZSBmaWxlIiBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIGFuZCBpdCBpcyBub3QgYQoJY29yZSBmaWxlLCB0cnkgaXQgYXMgYSBwcm9jZXNzIElEIHRvIGF0dGFjaC4gIAoJKHN5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogIEF0dGVtcHQgdG8gY29wZSB3aXRoIAoJInNob3cgc2NyZWVuLSIgVEFCLCBub3QgdmVyeSBzdWNjZXNzZnVsbHkuICBUaGlzIG5lZWRzIG1vcmUgd29yaywKCUZJWE1FLgoJKGJhdGNoX2ZpbGUpOiAgTmV3IGZ1bmN0aW9uLCByZXR1cm5zIHdoZXRoZXIgd2UgYXJlIHJlYWRpbmcKCWNvbW1hbmRzIGZyb20gYW4gaW50ZXJhY3RpdmUgdHR5IG9uIHN0ZGluLCBvciBmcm9tIHNvbWV3aGVyZSBlbHNlLgoJQ2FsbGVkIGJ5IG5vcm1hbF9zdG9wIHNpbmNlIGl0IGRvZXNuJ3QgZ2V0IGZyb21fdHR5IHBhc3NlZCBkb3duCgl0byBpdCBsaWtlIG1hbnkgY29tbWFuZHMgZG8uCgoJKiByZW1vdGUtbmluZHkuYzogIEhhbmRsZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgbmluZHkKCWNvbm5lY3Rpb24uCgkobmluZHlfYmVmb3JlX21haW5fbG9vcCk6ICBQcm9tcHQgdXNlciBmb3IgdHR5IG5hbWUgaWYgdGhleQoJZG9uJ3Qgc3BlY2lmeSBpdCBiZWZvcmUgZ2V0dGluZyB0byB0aGUgaW50ZXJhY3RpdmUgY29tbWFuZCBsb29wLgoKCSogdG0taTk2MC5jOiAgQWRkIEFERElUSU9OQUxfT1BUSU9OUywgZXRjLCB0byBoYW5kbGUgLU8sIC1icmssCglhbmQgLXIgY29tbWFuZCBsaW5lIG9wdGlvbnMuICBBbHNvIGFkZCBob29rIGJlZm9yZSBtYWluIGxvb3AKCXRvIG1ha2UgaXQgZWFzeSB0byBzcGVjaWZ5IGEgdHR5LgoKCSogVE9ETzogIE1vcmUgdGhpbmdzIHRvIGRvLCBvbmUgZG9uZS4KCk1vbiBGZWIgIDQgMjM6NTc6MzkgMTk5MSAgSm9obiBHaWxtb3JlIGFuZCBNaWtlIFRpZW1hbm4gIChhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGRieHJlYWQuYzogIE1ha2UgY29tcGxhaW50KCkgY2FsbHMgcGFzcyBwb2ludGVyLCBub3Qgc3RydWN0LgoJQWRkIGNvbXBsYWludHMgYWJvdXQgYmFkbHkgZm9ybWF0dGVkIEMrKyB0eXBlIGluZm9ybWF0aW9uCgkoY29uc3Qvdm9sYXRpbGUgaW5kaWNhdG9yLCBhbmQgcGFyc2UgZXJyb3JzIHJlc3VsdGluZyBpbgoJZXJyb3JfdHlwZSkuICBGaXggQysrIHZpcnR1YWwgbWVtYmVyIGZuIGNvbW1lbnQuCgkocmVhZF9zdHJ1Y3RfdHlwZSk6ICBBdm9pZCBidW1waW5nIHBvaW50ZXIgaWYgd2UgZ290IGEgcGFyc2UKCWVycm9yOyB0aGlzIHByZXZlbnRzIG91ciB3YWxraW5nIGJleW9uZCB0aGUgZW5kIG9mIGEgc3RyaW5nLgoJVGVybWluYXRlIGxvb3Agb24gbnVsbCBjaGFyIGFzIHdlbGwgYXMgc2VtaWNvbG9uLgoJKHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBGaXggdGhlIExCUkFDIGZpeCBzbyB0aGF0IGl0IHVzZXMgdGhlCglsYXN0IHByZXZpb3VzIFNMSU5FLCBGVU4sIG9yIFNPIHJlY29yZCdzIFBDIGFkZHJlc3MuICBDKysgZGVidWcKCXN5bWJvbHMgZGlkIG5vdCBoYXZlIFNMSU5FIHJlY29yZHMgaW4gYSB1c2VmdWwgb3JkZXIgY29tcGFyZWQKCXRvIHRoZSBMQlJBQyByZWNvcmRzLgoJKGRlZmluZV9zeW1ib2wpOiAgSGFuZGxlICJjYXRjaCIgcmVjb3Jkcy4KCgkqIHN5bXRhYi5jIChjaGVja19zdHViX3R5cGUpOiAgQWRkZWQgbmV3IGNvbXBsYWluCglgc3R1Yl9ub25hbWVfY29tcGxhaW4nIGFuZCBhZGRlZCBhIGNvbnNpc3RlbmN5IGNoZWNrIHRvCglrZWVwIHRoZSBkZWJ1Z2dlciBmcm9tIGNyYXNoaW5nIHdoZW4gZmluaXNoaW5nIGZyb20gYW4KCWV4Y2VwdGlvbiBmcmFtZS4gIEEgcmVhbCBmaXggd2lsbCBiZSBuZWVkZWQgbGF0ZXIuCgpTYXQgRmViICAyIDEwOjQzOjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGluZmNtZC5jIChhdHRhY2hfY29tbWFuZCk6ICBNYWtlIGdsb2JhbC4KCgkqIE1ha2VmaWxlLmRpc3QgKFJFTU9URV9PQlMpOiAgTWFrZSB0aGVzZSBjb21waWxlIGJ5IGRlZmF1bHQsCglidXQgbWFrZSB0aGVtIGVhc3kgdG8gY29tbWVudCBvdXQuICBQZXJoYXBzIGxhdGVyIHRoZXkgc2hvdWxkCgliZSBlbmFibGVkIGJ5IHdoYXQgQ1BVIHlvdSBjb25maWd1cmUgZm9yPyAgRklYTUUuCgkoVkVSU0lPTik6ICBSb2xsIHRvIDMuOTMuCgkocGluc24ubyk6ICBSZW1vdmUgcnVsZSBmb3Igb2Jzb2xldGUgZmlsZS4KCShkYnhyZWFkLm8sY29mZnJlYWQubyxtaXBzcmVhZC5vKTogIFVzZSAke3NyY2Rpcn0gZXhwbGljaXRseS4KCglSdW4gZG93biBhIHByb2JsZW0gdGhhdCBtYW5pZmVzdGVkIGJ5IHByaW50aW5nIHRoZSB3cm9uZyBmdW5jdGlvbgoJbmFtZSBpbiBzdGFjayB0cmFjZXMgb2YgcmVhZF9vZmlsZV9zeW10YWIuICBUdXJuZWQgb3V0IHRoYXQgdGhlIAoJcHJvYmxlbSB3YXMgdGhlIFN1bk9TIDQuMS4xIChhbmQgcHJldmlvdXMpIEMgY29tcGlsZXIgb3V0cHV0cwoJdGhlIExCUkFDIHN5bWJvbCB3aXRoIGFuIGFkZHJlc3MgaW4gdGhlICpkYXRhKiBzZWdtZW50LCB3aGljaAoJYmxldyBvdXIgYmluYXJ5IHNlYXJjaCB0aHJvdWdoIHRoZSBibG9ja3MuCgoJKiBkYnhyZWFkLmM6IFVzZSB0aGUgY29tcGxhaW4oKSBmYWNpbGl0eSBjb25zaXN0ZW50bHkgdG8gYml0Y2gKCWFib3V0IHByb2JsZW1zIGluIHRoZSBzeW1ib2wgZmlsZSB3ZSBhcmUgcmVhZGluZy4KCShmaW5pc2hfYmxvY2spOiAgQWRkIGNvZGUgdG8gY2hlY2sgdGhlIG5lc3Rpbmcgb2YgdGhlIGJsb2NrczsKCWNvbXBsYWluIGFuZCBQcm9jcnVzdCB0aGVtIHRvIGZpdCBpZiB3cm9uZy4KCShtYWtlX2Jsb2NrdmVjdG9yKTogIENoZWNrIHRoZSBvcmRlciBvZiB0aGUgYmxvY2tzLCBjb21wbGFpbiAKCVtidXQgZG9uJ3QgY29wZV0gaWYgd3JvbmcuCgkocHJvY2Vzc19vbmVfc3ltYm9sKTogIGlmbmRlZiBTVU5fRklYRURfTEJSQUNfQlVHLCBjaGVjayBMQlJBQwoJc3ltYm9scyB0byBiZSBzdXJlIHRoZWlyIFBDIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGFzdCBTTElORQoJKGxpbmUgbnVtYmVyKSBzeW1ib2wgd2UndmUgc2VlbiwgY29tcGxhaW5pbmcgYW5kIGFkb3B0aW5nIHRoZQoJU0xJTkUgUEMgdmFsdWUgaWYgd3JvbmcuCgoJKiBzeW1maWxlLmggKHN0cnVjdCBjb21wbGFpbnQsIGNvbXBsYWludF9yb290LCBjb21wbGFpbiwgCgljbGVhcl9jb21wbGFpbnRzKTogIEFkZC4KCSogc3ltZmlsZS5jIChjb21wbGFpbiwgY29tcGxhaW50X3Jvb3QsIGNsZWFyX2NvbXBsYWludHMpOiAgQWRkCglmYWNpbGl0eSB0byBkZWFsIHdpdGggbm9uLWZhdGFsIGNvbXBsYWludHMgYW5kIHRvIHJlZ3VsYXJpemUgdGhlaXIKCXN1cHByZXNzaW9uLgoJKHN5bWJvbF9maWxlX2FkZCk6ICBDbGVhciBjb21wbGFpbnQgY291bnRlcnMgdG8gYWxsb3cgbmV3IGNvbXBsYWludHMuCgkoaW5pdGlhbGl6ZV9zeW1maWxlKTogIEFkZCAnc2V0IGNvbXBsYWludHMnIGFuZCAnc2hvdyBjb21wbGFpbnRzJy4KCgkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfcmVhZCk6ICBSZW1lbWJlciB0aGUgYWRkcmVzcyBhbmQgc2l6ZQoJb2YgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhlIG1haW4gc3ltYm9sIGZpbGUsIHNvIHdlIHdvbid0IHJlYWQgaXQKCW1vcmUgdGhhbiBvbmNlLgoJKGRieF9wc3ltdGFiX3RvX3N5bXRhYik6ICBGaXggdGhlIGNoZWNrIGZvciBtYWluIHN5bWJvbCBmaWxlLAoJdG8gYXZvaWQgcmVhZGluZyB0aGUgc3RyaW5nIHRhYmxlIHlldCBhZ2Fpbi4gIExpbnQuCgkodGhyb3VnaG91dCk6ICBJbXByb3ZlIGZpbHRlcmVkIG91dHB1dCwgaW5jbHVkaW5nIHdvcmQgd3JhcC4KCShyZWFkX3JhbmdlX3R5cGUpOiAgSW1wcm92ZSBCb3RobmVyJ3MgZml4IHRvIGhhbmRsZSBvdGhlciB0eXBlcyB0b28uCgoJKiB1dGlscy5jOiAgSW1wcm92ZSBsaW5lIHdyYXAgaW1wbGVtZW50YXRpb24uICBIYW5kbGUgdW5saW1pdGVkCgl3aWR0aCBieSBtYWtpbmcgY2hhcnNfcGVyX2xpbmUgdW5zaWduZWQuCgkocHV0c19maWx0ZXJlZCk6ICBOZXcsIGVhc3ksIGZ1bmN0aW9uLgkKCgkqIGRlZnMuaCAocHV0c19maWx0ZXJlZCk6ICBhZGQuCgoJKiBtaXBzcmVhZC5jIChjb21wYXJlX3N5bWJvbHMsIHNvcnRfc3ltdGFiKTogIFJlbW92ZSB0aGVzZSBmbnMsCgljYWxsIHRoZSBpZGVudGljYWwgc29ydF9zeW10YWJfc3ltcygpIGluIHN5bWZpbGUuYyBpbnN0ZWFkLgoKCSogZXhwcmVhZC55OiAgU3VnZ2VzdCB0aGUgYGZpbGUnIGNvbW1hbmQgcmF0aGVyIHRoYW4gYHN5bWJvbC1maWxlJy4KCgkqIGNvbW1hbmQuaCAoZW51bSB2YXJfdHlwZXMpOiAgQWRkIHppbnRlZ2VyIGZvciBzZXJvYWJsZQoJdW5zaWduZWQgaW50ZWdlci4KCSogY29tbWFuZC5jIChkb19zZXRzaG93X2NvbW1hbmQpOiAgSGFuZGxlIHZhcl96aW50ZWdlci4gIFJlc3RydWN0dXJlCgluZXN0ZWQgaWYncyBpbnRvIGEgc3dpdGNoLgoKCSogYnJlYWtwb2ludC5jIChicHN0YXRfcHJpbnQpOiBJZiBicHN0YXQgInByaW50IiBmbGFnIGlzIG5vdCBzZXQsCgl3ZSBkaWQgbm90IHN0b3AgYmVjYXVzZSBvZiBhIGJyZWFrcG9pbnQgKGl0IG11c3QgaGF2ZSBiZWVuIGZvcgoJc29tZSBvdGhlciByZWFzb24sIGxpa2UgYSAic3RlcGkiKSwgc28gZG9uJ3QgcHJpbnQgYW55dGhpbmcuCgoJKiBzeW10YWIuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+IGFsbCB0aGUgdGltZS4gIE5vdyB0aGF0IEJGRAoJZG9lc24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4sIG9sZCBTdW5PUydzIHJlcXVpcmUgaXQgZm9yCgk8c3lzL3N0YXQuaD4uCgpTYXQgRmViICAyIDEwOjM5OjE1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lckBjcy53aXNjLmVkdSkKCglBIHRlc3QgcG9ydCBvZiBnZGItMy45Mi42IHRvIHRoZSBTb255IE5FV1MuCgoJKiBNYWtlZmlsZS5kaXN0CglEb24ndCBub3JtYWxseSBsaW5rIGluIHJlbW90ZS0gb3Igdnggc3R1ZmYuCglTb21lIG9mIGl0IGRvZXNuJ3QgY29tcGlsZSwgYW5kIGl0IHdhc3RlcyBzcGFjZSBmb3IgOTklCW9mIHRoZSB1c2Vycy4KCVJlbW92ZSByZWZlcmVuY2UgdG8gbm8tbG9uZ2VyLXVzZWQgSEFWRV9WUFJJTlRGLgoJRml4ZWQgQkZEX0RFUCB0eXBvIHRvIEJGRF9ESVIuCgkqIGRieHJlYWQuYwoJRml4IGNhc3QgaW4gYXJnIHRvIGJmZF9oX2dldGxvbmcuCglNYWtlIGNoYXIgKnByZWZpeCBiZSBjb25zdC4KCUZpeCBob3cgY2VydGFpbiByYW5nZSB0eXBlcyBhcmUgbWFwcGVkIGludG8gYnVpbHRpbiB1bnNpZ25lZCBpbnQgdHlwZXMuCgkqIGluZnJ1bi5jCglSZW1vdmUgMiAjaW5jbHVkZXMuIFRoZXkgY2F1c2UgZXJyb3JzIChvbiBTb255LCBhdCBsZWFzdCksCglhbmQgYXJlbid0IG5lZWRlZCAodGhleSB3ZXJuJ3QgaW4gZWFybGllciB2ZXJzaW9ucykuCgkqIHByaW50Y21kLmMKCXByaW50X2FkZHJlc3Nfc3ltYm9saWMgc2hvdWxkIG5ldmVyIGRlbWFuZ2xlIGxhYmVscwoJKHNpbmNlIGl0IHByaW50cyAqYXNzZW1ibGVyLWxldmVsKiBsYWJlbHMpLgoKCSAgICAgICBbVGhpcyB3YXMgc3VwZXJzZWRlZCBieSB0aGUgY2hhbmdlIHRvIHByaW50Y21kIGJlbG93Ll0KCgkqIHV0aWxzLmMKCUFkZCBzb21lICJ2b2xhdGlsZSIgcmV0dXJuIHR5cGVzIHRvIGF2b2lkIHdhcm5pbmdzLgoJSWYgTUlTU0lOR19WUFJJTlRGIGFkZCB2cHJpbnRmIGZ1bmN0aW9uIGFuZCBub3QganVzdCBtYWNybwoJKHNpbmNlIHZwcmludGYgaXMgdXNlZCBpbiBwcmludGNtZC5jKS4KCSogdmFscHJpbnQuYwoJVW5sZXNzIF9fR05VQ19fLCB1c2Ugb2JzdGFja19ncm93IGluc3RlYWQgb2Ygb2JzdGFja19wdHJfZ3Jvdy4KCShUaGUgbGF0dGVyIGlzbid0IGdyb2trZWQgYnkgc29tZSBQQ0MtYmFzZWQgY29tcGlsZXJzLikKCgkgICAgIFtUaGlzIGNoYW5nZSBpcyBpbiBhYmV5YW5jZSwgd2UgcHJlZmVyIHRvIGZpeCBvYnN0YWNrX3B0cl9ncm93Ll0KCglNYWtlIGNodW5rIHNpemUgb2YgZG9udF9wcmludF9vYnN0YWNrIDMyKjQgaW5zdGVhZCBvZiBkZWZhdWx0IDQwOTYuCgkqIG5pbmR5LXNoYXJlL2NvZmZzdHJpcC5jCglBZGRlZCBzb21lIGZvcndhcmQgZGVjbGFyYXRpb25zIChvdGhlcndpc2UsIGdjYyBjb21wbGFpbnMKCWFib3V0IGltcGxpY2l0IGV4dGVybiByZWRlZmluZWQgYXMgc3RhdGljKS4KClN1biBKYW4gMjAgMDI6Mzg6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQoKCUNoYW5nZXMgaW5zcGlyZWQgYnkgUGVyIEJvdGhuZXI6CgkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3Nfc3ltYm9saWMpOiAgVGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcgoJc3BlY2lmeWluZyB3aGV0aGVyIHRvIGRlbWFuZ2xlLgoJKHByaW50X2FkZHJlc3MpOiAgUGFzcyBpbiBhc21fZGVtYW5nbGUgdG8gY29udHJvbCBkZW1hbmdsaW5nLgoJKHByaW50X2FkZHJlc3NfZGVtYW5nbGUpOiAgTmV3IGZuLCB0YWtlcyBleHBsaWNpdCBhcmcgdG8gY29udHJvbAoJZGVtYW5nbGluZy4KCSogdXRpbHMuYzogIEFkZCBuZXcgdmFycyBkZW1hbmdsZSBhbmQgYXNtX2RlbWFuZ2xlLCBhbmQgbGV0IHRoZW0KCWJlIHNldCBhbmQgc2hvd24uCgkoZnB1dHNfZGVtYW5nbGVkKTogIElmICFkZW1hbmdsZSwganVzdCBwcmludCB0aGUgYXJndW1lbnQuCgkoZnByaW50X3N5bWJvbCk6ICBJZiAhZGVtYW5nbGUsIGp1c3QgcHJpbnQgcmF3IHN5bWJvbC4KCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogIENhbGwgcHJpbnRfYWRkcmVzc19kZW1hbmdsZSByYXRoZXIgdGhhbgoJcHJpbnRfYWRkcmVzcywgdG8gY2F1c2UgZGVtYW5nbGluZyB0byBkZXBlbmQgb24gdGhlIGdsb2JhbAoJcmF0aGVyIHRoYW4gYXNzZW1ibGVyLWxldmVsIGRlbWFuZ2xpbmcgc2V0dGluZy4KCSogV0hBVFMuTkVXLCBnZGIudGV4aW5mbzogIERvY3VtZW50LgoKCSogbWFpbi5jIChzaG93X2NvbW1hbmQpOiAgU2hvdyBhbGwgc2V0dGluZ3MgaWYgbm8gYXJnLgoJKGluaXRpYWxpemVfbWFpbik6ICBNYWtlICJpbmZvIHNldCIgdGhlIHNhbWUgYXMgbmFrZWQgInNob3ciLgoJKiBjb21tYW5kLmMgKGNtZF9zaG93X2xpc3QpOiAgSGFuZGxlIHByZWZpeCBjb21tYW5kcyBpbiB0aGUKCWxpc3QsIGFuZCBwcmludCB0aGUgbmFtZSBvZiB0aGUgc2V0dGluZyBhcyB3ZWxsIGFzIGl0cyBFbmdsaXNoCglkZXNjcmlwdGlvbiBhbmQgdmFsdWUuCgoJQWxsb3cgZ2RiIGZ1bmN0aW9ucyB0byBzcGVjaWZ5IHdoZXJlIGEgbGluZSBzaG91bGQgd3JhcCBpZiBpdAoJZXhjZWVkcyB0aGUgc2l6ZSBvZiBhIHRlcm1pbmFsIGxpbmUuICBVc2UgaXQgdG8gbWFrZSB0aGUgb3V0cHV0CglwcmV0dGllci4KCSogdXRpbHMuYyAoc2V0X3NjcmVlbl93aWR0aF9jb21tYW5kKTogIE5ldyBmbiwgbWFsbG9jcyBhIGJ1ZmZlcgoJb2YgdGhlIHJpZ2h0IHNpemUgd2hlbiBzY3JlZW4gd2lkdGggY2hhbmdlcy4KCShzZXRfc2NyZWVuc2l6ZV9jb21tYW5kLCBzY3JlZW5zaXplX2luZm8pOiAgUmVtb3ZlICNpZiAwJ2QgZm5zLgoJKHdyYXBfaGVyZSk6ICBOZXcgZm4sIGluZGljYXRlcyBhIHBvaW50IGluIHRoZSBvdXRwdXQgd2hlcmUgd2UKCXNob3VsZCB3cmFwIHRoZSBsaW5lIHJhdGhlciB0aGFuIGp1c3QgbGV0dGluZyBpdCBvdmVyZmxvdyBhdCBhCglyYW5kb20gcGxhY2UuCgkoZnB1dHNfZmlsdGVyZWQpOiAgSW1wbGVtZW50IHdyYXBwaW5nLgoJKG5fc3BhY2VzKTogIE5ldyBmbiwgcmV0dXJucyBhIHBvaW50ZXIgdG8gTiBzcGFjZXMuCgkocHJpbnRfc3BhY2VzX2ZpbHRlcmVkKTogIFVzZSBuX3NwYWNlcy4KCSogZGVmcy5oIChuX3NwYWNlcyk6ICBEZWNsYXJlLgoJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKTogIFdyYXAgd2l0aCA0LXNwYWNlIGluZGVudCBhZnRlcgoJZm4gbmFtZSBhbmQgYmVmb3JlIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlci4KCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6ICBXcmFwIHdpdGggNC1zcGFjZSBpbmRlbnQKCWJlZm9yZSBlYWNoIGFyZ3VtZW50IG5hbWUgaXMgcHJpbnRlZC4KCSogdmFscHJpbnQuYyAodmFsdWVfcHJpbnQpOiAgV3JhcCB3aXRoIG5vIGluZGVudGF0aW9uIGJlZm9yZQoJZWFjaCByZXBldGl0aW9uLgoJKHZhbF9wcmludF9maWVsZHMpOiAgV3JhcCB3aXRoIGluZGVudGF0aW9uIHJlbGF0aXZlIHRvIG5lc3RpbmcKCWxldmVsIGJlZm9yZSBlYWNoIGZpZWxkIG5hbWUuCgkodmFsX3ByaW50KTogIFdyYXAgd2l0aCBuZXN0aW5nIGluZGVudGF0aW9uIGJlZm9yZSBhcnJheSBlbGVtZW50cy4KCSogY29tbWFuZC5jIChkb19zZXRzaG93X2NvbW1hbmQpOiAgQXZvaWQgZXh0cmEgbmV3bGluZXMsCgl3cmFwIHdpdGggNC1zcGFjZSBpbmRlbnQgYXJvdW5kIHZhbHVlcyBwcmludGVkLCBlbmQgd2l0aCBwZXJpb2QuCgkqIFdIQVRTLk5FVywgZ2RiLnRleGluZm8sIGdkYi1pbnQudGV4aW5mbzogIERvY3VtZW50LgoKCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50XzEpOiAgSW1wbGVtZW50IGFkZHJlc3NwcmludCBmb3IKCSJpbmZvIGJyZWFrcG9pbnRzIiBkaXNwbGF5LiAgQ2hhbmdlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKCWZvcm1hdCB0byAiIGF0IGZpbGU6bm5uIiByYXRoZXIgdGhhbiAiIChmaWxlIGxpbmUgbm5uKSIuCgkqIGdkYi50ZXhpbmZvOiAgRG9jdW1lbnQuCgoKRnJpIEphbiAxOCAwNzoyMToyNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCgoJRnJvemVuIGZvciBnZGItMy45Mi42IHJlbGVhc2UuCgoJUkVBRE1FLCBXSEFUUy5ORVc6ICBVcGRhdGUgZm9yIDMuOTIuNiByZWxlYXNlLgoKCXRjb25maWcve2FsdG9zLCBpMzg2diwgaTM4NnYzMiwgbTg4aywgdW1heH06ICBFbGltaW5hdGUKCWNvZmZyZWFkLm8gZnJvbSBjb25maWdzIHNpbmNlIGl0IGlzIG5vdyBidWlsdCBieSBkZWZhdWx0LgoJdGNvbmZpZy97M2IxLCBhbHRvc2dhcywgYXJtLCBjb252ZXgsIGhwMzAwYnNkLCBocDMwMGhwdXgsCglpMzg2di1nLCBpMzg2djMyLWcsIGlzaSwgbWVybGluLCBuZXdzLCBuZXdzMTAwMCwgbnAxLCBwbiwKCXB5cmFtaWQsIHN5bW1ldHJ5LCB2YXgsIHZ4d29ya3M2OH06ICBFbGltaW5hdGUgZGJ4cmVhZC5vCglmcm9tIGNvbmZpZ3Mgc2luY2UgaXQgaXMgbm93IGJ1aWx0IGJ5IGRlZmF1bHQuCgoJTWFrZWZpbGUuZGlzdDogVXBkYXRlIGZvciByZWxlYXNlIDMuOTIuNi4gIEhhbmRsZSBmaWxlcyB0aGF0CgloYXZlIGJlZW4gbW92ZWQgdG8gLi4vaW5jbHVkZSwgLi4vZ2V0b3B0LCBvciAuLi9iZmQuICBBZGQKCXNhYmVyLnN1cHByZXNzIGFuZCB0ZXN0cyBkaXJlY3RvcnkuICBBZGQgY29uZmlnLnN0YXR1cyB0bwoJdGhlIHJlbGVhc2UgKGl0IHdpbGwgc2F5ICJub25lIikuCgoJY29yZWRlcC5jOiAgTWlub3IgZm9ybWF0dGluZyBmaXhlcy4KCglUaGVzZSBjaGFuZ2VzIHdlcmUgbWFkZSBpbiBlYXJseSBEZWNlbWJlciBidXQgb25seSBjaGVja2VkIGluIG5vdzoKCSogbmluZHktc2hhcmUvT25pbmR5LmMsIG5pbmR5LXNoYXJlL2NvZmZzdHJpcC5jLAoJbmluZHktc2hhcmUvbmluZHkuYzogIGxpbnQKCSogbmluZHktc2hhcmUvbmluZHkuYyAobmluU3RvcFdoeSk6ICBEb24ndCBieXRlc3dhcCB0aGUgCglyZWdpc3RlciB2YWx1ZXMgY29taW5nIGJhY2sgZnJvbSB0aGUgdGFyZ2V0OyB3ZSBzdG9yZSB2YWx1ZXMKCWluIHRhcmdldCBieXRlIG9yZGVyIGV2ZXJ5d2hlcmUuCgpXZWQgSmFuIDE2IDE5OjAxOjM3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGFtMjlrLW9wY29kZS5oLCBhbTI5ay1waW5zbi5jOiAgQWRkIDI5MDUwIG9wY29kZXMuCgoJKiB2YWxwcmludC5jIChjcGx1c192YWxfcHJpbnQsIHZhbF9wcmludF9maWVsZHMpOiAgTmV3IGZ1bmN0aW9ucywKCXdoaWNoIHByaW50IEMrKyBvYmplY3RzLiAgVGhleSBjb25zcGlyZSB0byBhdm9pZCBwcmludGluZyBhCgl2aXJ0dWFsIGJhc2UgY2xhc3MgbW9yZSB0aGFuIG9uY2UsIGZvbGxvd2luZyBhbGwgdGhlIHR3aXN0cyBhbmQKCXR1cm5zIG9mIEMrKyB2aXJ0dWFsIGJhc2UgcnVsZXMuCgkodmFsX3ByaW50KTogIENhbGwgdGhlIGFib3ZlIHJhdGhlciB0aGFuIGRvIGl0IGJ5IGhhbmQuCgoJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2FkZCk6ICBPbmx5IHJlc2V0IHN5bWZpbGVfbXRpbWUgZm9yIG1haW4KCXN5bWJvbCBmaWxlLCBub3QgZm9yIGFkZGVkIGZpbGVzIGxpa2Ugc2hhcmVkIGxpYnMuICBUaGlzIHJlYWxseQoJbmVlZHMgdG8gYmUgZ2VuZXJhbGl6ZWQgdG8gYSB0aW1lc3RhbXAgcGVyIGZpbGUuCgoJKiBjb3JlLmMgKGNsZWFudXBfY29yZSk6ICBBdm9pZCBjb3JlZHVtcCBpZiBubyBjb3JlIGZpbGUuCgkKCSogY29uZmlnLmdkYjogIEFjY2VwdCAtaG9zdCBvciAtdGFyZ2V0IGluIHBsYWNlIG9mICtob3N0IG9yCgkrdGFyZ2V0LgoKCSogY29mZnJlYWQuYyAoZmluZF9saW5lbm9zKTogIEF2b2lkIGRlc3VwcG9ydGVkIEJGRCBpbnRlcmZhY2UKCXRvIGxpbmUgbnVtYmVycy4gIFdlIHN0aWxsIHJlYWQgdGhlbSBtYW51YWxseSByYXRoZXIgdGhhbiB1c2luZwoJQkZEJ3MgImdlbmVyaWMiIGZlYXR1cmVzLgoKCSogZ2RicmMudGV4LCB0aHJlZWNvbC50ZXg6ICBBZGQgR0RCIHJlZmVyZW5jZSBjYXJkIGFuZCBpdHMKCWZvcm1hdHRpbmcgY29kZS4KCU1ha2VmaWxlLmRpc3Q6ICBBZGQgcmVmY2FyZCB0byBPVEhFUlMgbGlzdCBmb3IgY3JlYXRpbmcgdGFyIGZpbGVzLgoKCSogTWFrZWZpbGUuZGlzdDogIEVsaW1pbmF0ZSB1c2Ugb2YgJDwgaW4gZXhwbGljaXQgdGFyZ2V0cy4KCgkqIHJlYWRsaW5lL01ha2VmaWxlOiAgVXNlICQ8IHJhdGhlciB0aGFuICQqLmMsIHdoaWNoIGRvZXMgbm90CglpbmNsdWRlIHRoZSBWUEFUSCBpbiBHTlUgTWFrZS4KCgkqIHRjb25maWcvaTk2MC1ib3V0LCB0Y29uZmlnL2k5NjAtY29mZjogIFRoZXNlIGFyZSBpZGVudGljYWwKCWNvcGllcyBvZiB0Y29uZmlnL2k5NjAsIGFkZGVkIGZvciBnbG9iYWwgY29uZmlndXJhdGlvbgoJY29tcGF0YWJpbGl0eS4gIEFsbCBpOTYwIHZlcnNpb25zIGNhbiByZWFkIGJvdGggY29mZiBhbmQgYi5vdXQuCgoJKiB0bS04OGsuaDogIEZpeCBtdWx0aWxpbmUgbWFjcm8gdGhhdCBsYWNrZWQgXCdzLiAgUmVtb3ZlCglDT0ZGX0ZPUk1BVCBhbmQgQ09GRl9DSEVDS19YX1pFUk9FUyBzaW5jZSB0aGVzZSBhcmUgbm93IGhhbmRsZWQKCWF1dG9tYXRpY2FseS4KCgkqIFRPRE86ICBUaGluayBvZiBtb3JlIHRoaW5ncyB0byBkby4KCldlZCBKYW4gIDIgMTk6MDk6MjkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IHNwaWZmLmN5Z251cy5jb20pCgoJdGNvbmZpZy97YW0yOWssaTk2MCxzdW4yKixzdW4zKixzdW40Kn06ICBFbGltaW5hdGUgY29uZmlnCglvZiBzZGIgdmVyc3VzIGRieCBkZWJ1ZyBzeW1ib2xzLiAgQWRkIGtsdWRnZSBmb3IgNjg4ODEgODAtYml0IHRvCgk2NC1iaXQgZmxvYXQgY29udmVyc2lvbi4KCgl0Y29uZmlnL3N1bjQsIHRjb25maWcvc3VuMywgeGNvbmZpZy9zdW40LCB4Y29uZmlnL3N1bjM6ICBNYWtlCgllcXVpdmFsZW50IHRvIHN1bj9vczQgc28gZ2xvYmFsIGNvbmZpZyB3b3Jrcy4KCldlZCBKYW4gIDIgMTg6MjA6NTEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IHNwaWZmLmN5Z251cy5jb20pCgoJRml4IGZyb20gRWJlcmhhcmQgTWF0dGVzIDxtYXR0ZXNAYXp1LmluZm9ybWF0aWsudW5pLXN0dXR0Z2FydC5kZT4KCQoJKiBtYWluLmM6ICBPbmx5IGRlY2xhcmUgbGluZXNpemUgb25jZTsgZGVjbGFyZSBwYWdlc2l6ZSBub3QgYXQKCWFsbCwgc2luY2UgaXQgaXMgbmV2ZXIgdXNlZC4KCShtYWluKTogIENsZWFyIG5ld2x5IGFsbG9jYXRlZCBsaW5lIGJlZm9yZSBpdCBpcyB1c2VkLgoKRnJpIERlYyAyOCAwMDoxMzo0MiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCUZ1cnRoZXIgc3RhYmlsaXphdGlvbiBmb3IgdGhlIEludGVsIDk2MC4KCgkqIE1ha2VmaWxlLmRpc3Q6IFBhcmFtZXRlcml6ZSB0aGUgbG9jYXRpb24gb2YgdGhlICJpbmNsdWRlIgoJYW5kICJiZmQiIGRpcmVjdG9yaWVzLCBhcyB3ZWxsIGFzICJnZXRvcHQiLiAgQWRkIHN5bWZpbGUuYy4KCUxpbmsgaW4gYm90aCBkYnhyZWFkIGFuZCBjb2ZmcmVhZC4gIEZpeCB1cCAibWFrZSBkZXBlbmQiIHRvCglyZXdhY2sgdGhlIGxvY2F0aW9ucyBvZiBpbmNsdWRlLCBiZmQsIGFuZCBnZXRvcHQgaW4gaXRzIG91dHB1dC4KCgkqIFJFQURNRTogIERvY3VtZW50IG1vdmluZyBpbmNsdWRlIGZpbGVzLCBpbXByb3ZlIHNvbWUgb2YKCXRoZSBvdGhlciBkb2MuCgoJKiBjb2ZmcmVhZC5jOiAgTW92ZSBjb21tb24gY29kZSBvdXQgdG8gc3ltZmlsZS5jLiAgQ2hhbmdlCglzeW1ib2xfZmlsZV9jb21tYW5kIHN0eWxlIGludGVyZmFjZSB0byB1c2UgbmV3ICpfc3ltZmlsZV9pbml0CglhbmQgKl9zeW1maWxlX3JlYWQgaW50ZXJmYWNlIHVuZGVyIEJGRC4gIFVzZSBCRkQgaW50ZXJuYWwKCWluZm8gdG8gbG9jYXRlIGxpbmUgdGFibGUsIHN5bWJvbHMsIGV0Yy4KCgkqIGNvcmUuYyAoY29yZV9mZXRjaF9yZWdpc3RlcnMpOiAgUmVuYW1lIHRvIGdldF9jb3JlX3JlZ2lzdGVycwoJdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggZmV0Y2hfY29yZV9yZWdpc3RlcnMuCgkocmVnaXN0ZXJfYWRkcik6ICBNb3ZlIHRvIGNvcmVkZXAuYywgd2hpY2ggaXMgYWxyZWFkeSBtYWNoaW5lCglkZXBlbmRlbnQuICBUaGlzIGxlYXZlcyBjb3JlLmMgcHJldHR5IGNsZWFuIG9mIGRlcGVuZGVuY2llcy4KCgkqIGNvcmVkZXAuYyAocmVnaXN0ZXJfYWRkcik6ICBBY2NlcHQgdGhpcyByb3V0aW5lIGZyb20gY29yZS5jLgoKCSogZGJ4cmVhZC5jOiBNb3ZlIGNvbW1vbiBjb2RlICh3aXRoIGNvZmZyZWFkLmMsIGV0YykgaW50byBuZXcKCXN5bWZpbGUuYy4gIEVhY2ggcHN5bXRhYiBub3cgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZQoJZm9ybWF0LWRlcGVuZGVudCBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byByZWFkIGl0IGluLiAgTWFrZQoJc29tZSB0aGluZ3Mgc3RhdGljLiAgCgkoZGJ4X3BzeW10YWJfdG9fc3ltdGFiKTogUmVuYW1lZCBmcm9tIHBzeW10YWJfdG9fc3ltdGFiXzIuCgkocHJvY2Vzc19vbmVfc3ltYm9sKTogQWRkIGNvZGUgdG8gY29tcGxhaW4gYWJvdXQgYSAiY29tcGlsZXIgYnVnCgl3ZSBtdXp6bGUgaGVyZSIsIGlmIHdlIGFjdHVhbGx5IHNlZSBpdC4KCgkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIEluc2VydCBtaXNzaW5nICJicmVhayIgc3RhdGVtZW50cwoJaW4gY29kZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIHZhcmlhYmxlIGlzIGFuIGx2YWx1ZSBpbgoJbWVtb3J5LCByZWdpc3Rlciwgb3Igd2hhdGV2ZXIuCUkgZGV0ZWN0ZWQgdGhpcyB2aWEgYSBjb21waWxlcgoJYnVnIGluIHdoaWNoIGl0ICphbG1vc3QqIG1hc2hlZCBvdXQgdGhlIHdob2xlIHN3aXRjaCBzdGF0ZW1lbnQuCgoJKiBnZGItaW50LnRleGluZm86ICBBZGQgbWlub3Igc2VjdGlvbnMgb24gY29uZmlndXJpbmcgZ2RiIGZvcgoJcmVsZWFzZSwgYW5kIGFib3V0IHRoZSBSRUFETUUgZmlsZS4KCgkqIGluZmNtZC5jIChyZWdpc3RlcnNfaW5mbyk6ICBGaXggZm9ybWF0dGluZyBzb21ld2hhdC4gIFN0aWxsCglub3QgYXMgcHJldHR5IGFzIGJlZm9yZSwgYnV0IGl0IGhhbmRsZXMgYnl0ZSBzd2FwcGluZy4KCgkqIHJlbW90ZS1uaW5keS5jOiBJZiBkYXRhIGNhY2hlIHJvdXRpbmVzIGFyZSBpbnRlcnJ1cHRlZCB3aGlsZQoJd2FpdGluZyBmb3IgdGhlIHJlbW90ZSBlbmQsIGJlIHN1cmUgdGhhdCBhbnkgdW5pbml0aWFsaXplZCBjYWNoZQoJYmxvY2tzIGFyZSBvbiB0aGUgZnJlZSBsaXN0LCBub3Qgb24gdGhlIHZhbGlkIGxpc3QhCgoJKiBzeW1maWxlLmg6IEZsZXNoIG91dCB0aGlzIGhlYWRlciBmaWxlIHdpdGggYWxsIHRoZSB2YXJpb3VzCglyb3V0aW5lcyBhbmQgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuIG1lcmdlZCBpbiBmcm9tIGRieHJlYWQuYwoJY29mZnJlYWQuYywgYW5kIHN5bXRhYi5jIHRvIHN5bWZpbGUuYy4KCgkqIHN5bWZpbGUuYzogTmV3IGZpbGUsIGNvbnRhaW5pbmcgY29kZSBjb21tb24gdG8gZGJ4cmVhZC5jLAoJY29mZnJlYWQuYywgYW5kIHNvbWUgY29kZSBmcm9tIHN5bXRhYi5jLiAgQWxsIGdlbmVyaWMgY29kZSBmb3IKCXJlYWRpbmcgc3ltYm9sIGZpbGVzIHNob3VsZCBiZSBpbiBoZXJlIG5vdy4KCSh1bnJlY29yZF9taXNjX2Z1bmN0aW9uKTogIFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCgoJKiBzeW10YWIuaDogIFJlbW92ZSBmaWxlLXJlYWRpbmcgdGhpbmdzIHRvIHN5bWZpbGUuaC4KCgkqIHN5bXRhYi5jOiAgUmVtb3ZlIGZpbGUtcmVhZGluZyB0aGluZ3MgdG8gc3ltZmlsZS5jLgoKCSogdG0taTk2MC5oOiAgRml4IEZSQU1FX0NIQUlOIHR5cGVzOyBkZWZpbmUgUFJJTlRfUkFORE9NX1NJR05BTAoJdG8gZGVjb2RlIGk5NjAgZmF1bHQgdHlwZXMuCgoJKiB0YXJnZXQuaCwgcmVtb3RlLmMsIHJlbW90ZS1lYi5jLCByZW1vdGUtdnguYywgcmVtb3RlLW5pbmR5LmMsCgl0YXJnZXQuYzogQ2hhbmdlIHR5cGUgb2YgdGhlICJyZXN1bWUiIGZ1bmN0aW9uIGZyb20gaW50IHRvIHZvaWQsCglzaW5jZSBpdHMgcmVzdWx0IHdhcyBuZXZlciB1c2VkLgoKU2F0IERlYyAyMiAwMjo1MTo0MCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogbWFpbi5jOiAgUmVwbGFjZSAic3R1cGlkIiB3aXRoICJjYXV0aW9uIjsgeW91IG5vdyAic2V0IGNhdXRpb24KCW9uIG9yIG9mZiIuCgoJKiBwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogIEZpeCB0eXBvIGluICdnJyBmb3JtYXQKCgkqIGluZmNtZC5jIChkb19yZWdpc3RlcnNfaW5mbyk6ICBDYWxsIHZhbF9wcmludCB0byBkZWFsIHdpdGggdGhlCglieXRlIG9yZGVyIG9mIHRoZSByZWdpc3RlcnMgYmVpbmcgcHJpbnRlZC4gIEZJWE1FLCB0aGlzIG1ha2VzCgl0aGUgZm9ybWF0dGluZyBvZiB0aGUgb3V0cHV0IHVnbGllci4KCgkqIGluZmNtZC5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBJZiBQUklOVF9SQU5ET01fU0lHTkFMIGlzCglkZWZpbmVkLCBjYWxsIGl0IGZvciBzaWduYWxzIHRoZSBkZWJ1Z2dlciBkb2Vzbid0IGl0c2VsZiB1c2UuCglUaGUgaTk2MCB1c2VzIHRoaXMgZm9yIG1vcmUgZGV0YWlsZWQgZmF1bHQgaW5mb3JtYXRpb24uCgoJKiByZW1vdGUuYyAocmVtb3RlX29wZW4pOiAgSWYgYXJnIGlzIG51bGwsIHByaW50IGhlbHAgcmF0aGVyIHRoYW4KCWR1bXBpbmcgY29yZS4KCgkqIHNwYXJjLXhkZXAuYyAocmVnaXN0ZXJfdmFsaWQpOiAgQXZvaWQgZGVjbGFyaW5nIHNpemUsIHNpbmNlCgl2YXJpb3VzIG1vZHVsZXMgd2lsbCB0aGluayBvZiB2YXJpb3VzIHNpemVzIGRlcGVuZGluZyBvbiB0aGUKCWFyY2hpdGVjdHVyZSBvZiB0aGVpciB0bS1maWxlLiAgRklYTUUsIHdlIG5lZWQgcHJvdGVjdGlvbiBhZ2FpbnN0CglhY3R1YWxseSBlbnRlcmluZyBvbmUgb2YgdGhvc2UgbW9kdWxlcywgd2hpY2ggd291bGQgY2xvYmJlcgoJc3RvcmFnZSBpZiBub3QgZm9yIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGNvbXBpbGVkIGludG8gZ2RiLgoKCSogc3RhY2suYyAodXBfY29tbWFuZCwgZG93bl9jb21tYW5kKTogIEFsd2F5cyBwcmludCB0aGUgZnJhbWUKCXlvdSBhcnJpdmUgYXQuCgkodXBfc2lsZW50bHlfY29tbWFuZCwgZG93bl9zaWxlbnRseV9jb21tYW5kKTogIE5ldyBjb21tYW5kcwoJZm9yIHVzZSBpbiBzY3JpcHRzLgoKCSogaTk2MC1waW5zbi5jIChyZWcpLCBpOTYwLXRkZXAuYzogIExpbnQuCgoJKiBpOTYwLXRkZXAuYyAoaTk2MF9mcmFtZV9jaGFpbl92YWxpZCk6IExvb2t1cF9zeW1ib2wgbm93IHRha2VzCgltb3JlIHBhcmFtZXRlcnMgdGhhbiBpdCB1c2VkIHRvLgoKCSogZmluZHZhci5jIChyZWdpc3RlcnMpOiAgSW5jcmVhc2Ugc2xvcCB0byAyNTYgYnl0ZXMsIHdoaWNoIHNob3VsZAoJcHJvdGVjdCB1cyBhZ2FpbnN0IGV2ZW4gbW9zdCBSSVNDIG1hY2hpbmVzIHdpdGggbGFyZ2UgcmVnaXN0ZXIKCXNldHMuCgkobG9jYXRlX3Zhcl92YWx1ZSk6ICBNb3ZlIGRlY2xhcmF0aW9uIGluc2lkZSByZWxhdGVkIGlmZGVmLgoKCSogcmVtb3RlLW5pbmR5LmMgKCk6ICBVc2UgVElPQ1NFVE4gcmF0aGVyIHRoYW4gVElPQ1NFVFAKCXRocm91Z2hvdXQsIHRvIGF2b2lkIHRocm93aW5nIGF3YXkgYnVmZmVyZWQgaW5wdXQgZnJvbSB0aGUgYm9hcmQuCgkobmluZHlfd2FpdCk6ICBTdXBwbHlfcmVnaXN0ZXIgdGFrZXMgYWRkcl9vZl92YWx1ZSwgbm90IHZhbHVlLgoJKGk5NjBfcHJpbnRfZmF1bHQpOiAgUmVuYW1lZCBmcm9tIGk4MDk2MF9mYXVsdC4KCShuaW5keV9mZXRjaF9yZWdpc3RlcnMpOiAgQXZvaWQgaGF2ZV9yZWdzIHN0dWZmLCBqdXN0IGdldCB0aGVtLgoJKG5pbmR5X3N0b3JlX3JlZ2lzdGVycyk6ICBBdm9pZCByZWdzX2NoYW5nZWQgc3R1ZmYsIGp1c3Qgc3R1ZmYKCXRoZW0uCgkobmluZHlfY3JlYXRlX2luZmVyaW9yKTogIERvbid0IGJvdGhlciB0byB3cml0ZSBQQ19SRUdOVU0gc2luY2UKCXdlIGNhbiBzZXQgdGhlIFBDIGluIHRoZSBjYWxsIHRvIHByb2NlZWQoKS4gIFVucHVzaCBuaW5keV9vcHMKCWJlZm9yZSBwdXNoaW5nIGl0IG9uIHRvcCwgdG8gYXZvaWQgbWVzc2FnZSB0byB1c2VyLiAgRWxpbWluYXRlCgljb21tZW50YXJ5IGZyb20gVW5peCBtYWNoaW5lcyB0aGF0IGp1c3QgbWlzbGVhZHMgaGVyZS4KCShyZXNldF9jb21tYW5kKTogIEZpeCBlcnJvciBtZXNzYWdlIHRvIHN1Z2dlc3QgdGFyZ2V0IGNvbW1hbmQuCgkKV2VkIERlYyAxOSAxMTowMzo1NiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCVJlbGVhc2UgMy45Mi41IGFzIGZyb3plbi4KCglTdGFiaWxpemUgdGhlIG1lcmdlZCByZWxlYXNlLi4ud2l0aCBoZWxwIGZyb20gbGludCwgU2FiZXIgQywKCWdjYyAtVywgZXRjLgoKCUV2ZXJ5d2hlcmU6ICBBZGQgaW5jbHVkZSBmaWxlcyBuZWVkZWQgdG8gZGVjbGFyZSByZXR1cm4gdHlwZXMKCW9mIGZ1bmN0aW9ucyBjYWxsZWQuCgoJKiBnZGIudGV4aW5mbzogIFJvbGFuZCBQZXNjaCBpcyBkb2N1bWVudGluZyBnZGIsIGdsb3J5IGJlIQoKCSogYnJlYWtwb2ludC5oOiAgQWRkIHVuZGVjbGFyZWQgYnJlYWtwb2ludCBmdW5jdGlvbnMsIGFuZCBzb21lCglmdW5jdGlvbnMgZm9yIGRpc3BsYXkgaGFuZGxpbmcgc2luY2UgSSBjb3VsZG4ndCB0aGluayBvZiBhIGJldHRlcgoJLmggdG8gcHV0IHRoZW0gaW4uCgoJKiBicmVha3BvaW50LmMgKGluc2VydF9icmVha3BvaW50cyk6ICBNYWtlIGNvZGUgZm9yIGRpc2FibGluZwoJc2hhcmVkIGxpYnJhcnkgYmtwdHMgbW9yZSBsaWtlbHkgdG8gd29yay4gIEl0J3MgdXNlZCB3aGVuIHdlCglyZXJ1biBhIHByb2dyYW0gYW5kIHN0b3AgYmVmb3JlIHRoZSBzaGFyZWQgbGlicmFyeSBoYXMgYmVlbgoJbWFwcGVkIGluLgoJKGJyZWFrcG9pbnRfY29uZF9ldmFsLCBicHN0YXRfc3RvcF9zdGF0dXMpOiAgUGFzcyBhcmcgYXMgaW50LAoJY2FzdCBmcm9tIHBvaW50ZXIsIHNvIGl0IHNxdWVlemVzIHRocm91Z2ggY2F0Y2hfZXJyb3JzLgoJKGJwc3RhdF9zdG9wX3N0YXR1cyk6ICBGaXggbG9naWMgYnJva2VuIHNvbWUgdGltZSBhZ28uICBXZSBub3cKCWFsd2F5cyBjcmVhdGUgYSBicHN0YXQgaWYgdGhlIHN0b3AgYWRkcmVzcyBtYXRjaGVzIGEgYnJlYWtwb2ludCwKCWV2ZW4gaWYgd2UgZG9uJ3Qgc3RvcCB0aGVyZSAtLSBqdXN0IGxpa2UgdGhlIG9sZCBjb2RlIHVzZWQgdG8gZG8KCWJlZm9yZSBJIGdvdCBteSBmaW5nZXJzIGludG8gaXQgKHNpZ2gpLgoJKGJyZWFrcG9pbnRfMSk6ICBQcmludCAiaWdub3JlIGNvdW50IiBhZnRlciAic3RvcCBvbmx5IGlmIgoJY29uZGl0aW9uLCBzaW5jZSB0aGF0J3MgaG93IGl0IGFjdHVhbGx5IHdvcmtzLgoJKG1lbnRpb24pOiAgSGFuZGxlIHdhdGNocG9pbnRzIGFzIHdlbGwgYXMgYnJlYWtwb2ludHMuCgkod2F0Y2hfY29tbWFuZCk6ICB1c2Ugc2V0X3Jhd19icmVha3BvaW50IGFuZCBtZW50aW9uIHRvIGRvIG1vc3QgCglvZiB0aGUgd29yayAoYW5kIGluaXRpYWxpemUgYWxsIHRoZSBmaWVsZHMhKS4gIE9ubHkgcGFzcyBvbmUKCWFyZyB0byBwYXJzZV9jX2V4cHJlc3Npb24sIHNpbmNlIHRoYXQncyBhbGwgaXQgdGFrZXMuCgoJKiBjb21tYW5kLmMgKG5vdF9qdXN0X2hlbHBfY2xhc3NfY29tbWFuZCk6ICBSZW5hbWUgYXJnIHRvIGFyZ3MKCXNpbmNlIHdlIGlnbm9yZSAidW51c2VkIGFyZ3VtZW50IiB3YXJuaW5ncyBvbiB2YXJzIG5hbWVkICJhcmdzIi4KCWluZmxvdy5jIChjaGlsZF90ZXJtaW5hbF9pbmZvKTogIGRpdHRvLgoJaW5mcHRyYWNlLmMgKGtpbGxfaW5mZXJpb3IpOiAgZGl0dG8KCW1haW4uYyAoY2F0Y2hfZXJyb3JzLCB2ZXJzaW9uX2luZm8sIHF1aXRfY29tbWFuZCwgcHdkX2NvbW1hbmQsCglzb3VyY2VfY29tbWFuZCwgZHVtcF9tZV9jb21tYW5kLCBlZGl0aW5nX2luZm8sCglzZXRfaGlzdG9yeV9zaXplX2NvbW1hbmQsIHNldF9oaXN0b3J5LCBzaG93X2hpc3RvcnksCglzZXRfdmVyYm9zZSk6IGRpdHRvCglzdGFjay5jIChsb2NhbHNfaW5mbyk6ICBkaXR0bwoJdGFyZ2V0LmMgKHRhcmdldF9maWxlc19pbmZvKTogIGRpdHRvCgl2YWxwcmludC5jIChzZXRfaW5wdXRfcmFkaXgsIHNldF9vdXRwdXRfcmFkaXgpOiAgZGl0dG8KCgkqIGNvcmUuYzogIFJlbW92ZSBvbGQgdmFyaWFibGVzIGZvciBoYW5kbGluZyBjb3JlIGFuZCBleGVjIGZpbGUKCXNlY3Rpb25zIChkYXRhX3N0YXJ0LCBkYXRhX2VuZCwgc3RhY2tfc3RhcnQsIHN0YWNrX2VuZCwKCXJlZ19zdGFja19zdGFydCwgcmVnX3N0YWNrX2VuZCwgcmVnX3N0YWNrX29mZnNldCwgdGV4dF9zdGFydCwKCXRleHRfZW5kLCBleGVjX2RhdGFfc3RhcnQsIGV4ZWNfZGF0YV9lbmQsIHRleHRfb2Zmc2V0LAoJZXhlY19kYXRhX29mZnNldCwgZGF0YV9vZmZzZXQsIHN0YWNrX29mZnNldCkuICBUaGV5J3JlCglzdXBlcnNlZGVkIHRoZSBtb3JlIGdlbmVyYWwgYnVpbGRfc2VjdGlvbl90YWJsZSBhbmQKCXhmZXJfbWVtb3J5LgoJKGdldF9leGVjX2ZpbGUpOiAgTWVudGlvbiB0aGUgYGZpbGUnIGNvbW1hbmQuCgkocmVhZF9tZW1vcnlfY2hlY2spOiAgUmVuYW1lIHRvIG1lbW9yeV9lcnJvciwgYW5kIG9ubHkgY2FsbCBpdAoJaW4gdGhlIGNhc2Ugb2YgYW4gYWN0dWFsIGVycm9yLgoJKHJlYWRfbWVtb3J5LCB3cml0ZV9tZW1vcnkpOiAgY2FsbCBtZW1vcnlfZXJyb3IuCgkoY29yZV9mZXRjaF9yZWdpc3RlcnMpOiAgUmVnaXN0ZXIgc2VjdGlvbiBuYW1lIGlzICIucmVnIi4KCgljb3JlZGVwLmM6ICBSZW1vdmUgYSBidW5jaCBvZiBjcnVkIG5vdyB0aGF0IGFsbCB0aGlzIGZpbGUgZG9lcwoJaXMgcHVsbCB0aGUgcmVnaXN0ZXJzIG91dCBvZiBhIGNvcmUgZmlsZS4KCShmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBSZXdyaXRlIHRvIGFjdHVhbGx5IHdvcmssIEkgaG9wZS4KCglkYnhyZWFkLmM6ICBVc2UgYS5vdXQuZ251LmgsIG5vdCBzeXN0ZW0gYS5vdXQsIG5vdy4KCVJlcGxhY2UgaW5kZXgoKSB3aXRoIHN0cmNocigpLiAgUmVtb3ZlIGFsbCB0aGUgcHJlLUJGRCBtYWNybwoJZGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgc3ltYm9sIGZpbGUuCgkoc3RydWN0IGRieF9zeW1maWxlX2luZm8pOiAgRW5jYXBzdWxhdGUgdGhlIGluZm9ybWF0aW9uIHRoYXQKCWRieF9zeW1maWxlX2luaXQgbmVlZHMgdG8gcGFzcyB0byBkYnhfc3ltZmlsZV9yZWFkIGluIHRoaXMKCXN0cnVjdC4KCgkoZGJ4X25ld19pbml0LCBkYnhfc3ltZmlsZV9pbml0LCBkYnhfc3ltZmlsZV9yZWFkLAoJZGJ4X3N5bWZpbGVfZGlzY2FyZCk6IFJlYXJyYW5nZSBzeW1ib2wgZmlsZSByZWFkaW5nIHRvIGRpdmlkZQoJdGhlIGZvcm1hdC1zcGVjaWZpYyBwYXJ0IGZyb20gdGhlIGZvcm1hdC1pbmRlcGVuZGVudCBwYXJ0LAoJbGVhdmluZyB0aGUgZm9ybWF0LWluZGVwZW5kZW50IHBhcnQgc3VjaCBhcyBmaWxlIG5hbWUgZXhwYW5zaW9uCglhbmQgb3BlbmluZyBpbiBzeW10YWIuYy4gIFRoaXMgcmVwbGFjZXMKCXBhcnRpYWxfc3ltYm9sX2ZpbGVfb3BlbiBhbmQgcGFydGlhbF9zeW1ib2xfZmlsZV9yZWFkLgoJU3ltYm9sX2ZpbGVfcmVhZCwgYWRkX2ZpbGUsIGFkZF9maWxlX3RhcmdldF9jb21tYW5kLAoJYWRkX2ZpbGVfYWRkcl9jb21tYW5kIG1vdmUgdG8gc3ltdGFiLmMuICBQYXNzIGFuIGV4cGxpY2l0CgkibWFpbmxpbmUiIGZsYWcgZm9yIHdoZW4gcmVhZGluZyB0aGUgbWFpbiBzeW1ib2wgdGFibGUsIHJhdGhlcgoJdGhhbiByZWx5aW5nIG9uIHRoZSBvZmZzZXQgYWRkcmVzcyB0byBiZSB6ZXJvIG9yIG5vbnplcm8uCgoJKGRieF9zeW1maWxlX3JlYWQpOiBEb24ndCBhbGxvdyB2b2lkIConcyB0byBiZSBwcmludGVkIGFzCgl0eXBlZGVmcy4KCShTV0FQX1NZTUJPTCk6ICBVc2UgYmZkIHJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB0aGUgc3ltYm9scy4KCShBRERfUFNZTUJPTF9UT19MSVNUKTogIE1ha2UgdGhlICJmdW5jdGlvbiBjYWxsIHJhdGhlciB0aGFuCgltYWNybyIgZGVidWcgdmVyc2lvbiByZWFsbHkgd29yay4KCShyZWFkX2RieF9zeW10YWIpOiAgUmVtb3ZlIHVucmVmJ2QgcGFyYW1ldGVyIGluY2xpbmsuCglBdm9pZCBzd2FwcGluZyBOX1NMSU5FIHN5bWJvbHMsIGZvciBzcGVlZC4KCU1lcmdlIE5fVEVYVCFOX0VYVCBjYXNlIHdpdGggdGhlIG90aGVyIGV4dGVybmFsIHN5bWJvbAoJZGVmaW5pdGlvbnMnIGNhc2UuIEFkZCBjb21tZW50cy4KCShzdGFydF9wc3ltdGFiKTogIEFsbG9jYXRlIHRoZSBzeW1maWxlIG5hbWUgaW4gdGhlIHBzeW10YWIgb24KCXRoZSBwc3ltYm9sX29ic3RhY2ssIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWxsZXIncyBzdG9yYWdlLgoJKGVuZF9wc3ltdGFiKTogT25seSBhbGxvY2F0ZSBhIGRlcGVuZGVuY2llcyBsaXN0IGlmIHRoZXJlIGFyZQoJbW9yZSB0aGFuIHplcm8uCgkocHN5bXRhYl90b19zeW10YWJfMik6ICBVc2UgQkZEIHdoZW4gcmVvcGVuaW5nIGZpbGUgdG8gcmVhZAoJaXRzIHN5bWJvbHMgZm9yIHJlYWwuCgkocmVhZF9zdHJ1Y3RfdHlwZSk6ICBBZGQgRklYTUUgY29tbWVudHMgd2hlcmUgaXQgbmVlZHMgd29yawoJZm9yIEMrKyBib2dvc2l0eS4KCShyZWFkX2h1Z2VfbnVtYmVyKTogIEFkZCBGSVhNRSBhYm91dCBvdmVyZmxvd3MuCgkocmVhZF9yYW5nZV90eXBlKTogIEFkZCBGSVhNRSBhYm91dCBjb21wYXJpbmcgYSBsb25nIHRvIDE8PDMyLgoKCSogY29mZnJlYWQuYzogIE1pbm9yIGNoYW5nZXMgdG8gbW92ZSB0aGluZ3MgY2xvc2VyIHRvIHRoZSBuZXcKCXJlZ2ltZSB3aXRoIHN5bXRhYi5jIGFuZCBkYnhyZWFkLmMgICBNYWpvciB3b3JrIGlzIHN0aWxsIG5lZWRlZAoJaGVyZS4KCgkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiAgUmVtb3ZlIG9sZCB2YXJpYWJsZXMgKHNlZSBjb3JlLmMKCWFib3ZlKS4KCSh4ZmVyX21lbW9yeSk6IElmIG1lbW9yeSB0cmFuc2ZlciBpcyByaWdodCBhdCB0aGUgZW5kIG9mIGEKCXNlY3Rpb24sIGRvbid0IGxvc2UuCgoJKiBmaW5kdmFyLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6ICBJZiB2YWx1ZSBpcyBpbiBhIHJlYWwKCXJlZ2lzdGVyLCBMVkFMIGlzIGx2YWxfcmVnaXN0ZXIsIG5vdCBsdmFsX21lbW9yeS4KCglmcmFtZS5oOiAgRGVjbGFyZSBwcmludF9zZWxfZnJhbWUgYW5kIHJlY29yZF9zZWxlY3RlZF9mcmFtZS4KCglnZGItaW50LnRleGluZm86ICBOZXcgZmlsZSwgZm9yIEdEQiBpbnRlcm5hbHMgZG9jdW1lbnRhdGlvbi4KCVZlcnkgc2ltcGxlLCB1bmZvcm1hdHRlZCBkb2Mgb2YgY2xlYW51cHMgaXMgdGhlcmUgZm9yIG5vdy4KCglnZGJjb3JlLmg6ICBSZW1vdmUgb2Jzb2xldGUgdmFyaWFibGVzIHRoYXQgZGVzY3JpYmVkIGEub3V0CglzZWN0aW9uIGFkZHJlc3NlcyBhbmQgb2Zmc2V0cy4gIChTZWUgY29yZS5jIGFib3ZlLikKCURlY2xhcmUgZmV0Y2hfY29yZV9yZWdpc3RlcnMgYW5kIHJlZ2lzdGVyc19mZXRjaGVkLgoKCWdldG9wdC5jOiAgRGVjbGFyZSBjaGFyICphbGxvY2EoKTsgZXZlbiBvbiBTUEFSQy4KCglpbmZjbWQuYyAocnVuX2NvbW1hbmQpOiAgQ2FsbCB0YXJnZXRfa2lsbCByYXRoZXIgdGhhbgoJa2lsbF9pbmZlcmlvci4gCgkoc3RlcF9jb21tYW5kLCBuZXh0X2NvbW1hbmQsIHN0ZXBpX2NvbW1hbmQsIG5leHRpX2NvbW1hbmQpOgoJRGVjbGFyZSBmcm9tX3R0eSBwYXJhbWV0ZXIgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIGl0LgoJKHJ1bl9zdGFja19kdW1teSk6ICBhcmd1bWVudCBCVUZGRVIgaXMgYSBjaGFyIGFycmF5LCBub3QKCWEgcG9pbnRlciB0byBSRUdJU1RFUl9UWVBFLgoJKGZpbmlzaF9jb21tYW5kKTogIHVzaW5nX3N0cnVjdF9yZXR1cm4gbmVlZGVkIGEgdmFsdWUgKiwgCglub3QgYSBzdHJ1Y3Qgc3ltYm9sICouCgoJKiBpbmZwdHJhY2UuYyAoY2hpbGRfeGZlcl9tZW1vcnkpOiAgVG8gYXZvaWQgZGVwZW5kZW5jeSBvbgoJd2hlcmUgc2VjdGlvbnMgYXJlIGluIG1lbW9yeSwgdHJ5IFBUX1dSSVRFX0QgYW5kIGlmIHRoYXQgZmFpbHMsCgl0cnkgUFRfV1JJVEVfSS4gIE1vc3QgVW5peGVzIGRvbid0IGNhcmUgd2hpY2ggeW91IHVzZS4KCgkqIGluZnJ1bi5jIChzdGVwX3Jlc3VtZV9icmVha19zaGFkb3cpOiAgQ2hhbmdlIHRvIGFycmF5IHRvCgltYXRjaCBvdGhlciBicmVha3BvaW50IHNoYWRvdyBzdG9yYWdlLgoJKGNsZWFyX3Byb2NlZWRfc3RhdHVzKTogIFBhc3MgYWRkcmVzcyBvZiBicHN0YXQgdG8KCWJwc3RhdF9jbGVhciwgbm90IHRoZSBicHN0YXQgaXRzZWxmLgoJKGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6ICBGSVhNRSBjb21tZW50IGFib3V0IGlmIHRoZSBjaGlsZAoJZXhpdHMuCgkoc3RhcnRfaW5mZXJpb3IpOiAgUmVtb3ZlIG9sZCBmdW5jdGlvbi4KCShjaGlsZF9vcGVuKTogIFVzZSB0YXJnZXRfa2lsbCByYXRoZXIgdGhhbiBraWxsX2luZmVyaW9yLgoJKHdhaXRfZm9yX2luZmVyaW9yKTogIERpdHRvLgoJKGluc2VydF9zdGVwX2JyZWFrcG9pbnQsIHJlbW90ZV9zdGVwX2JyZWFrcG9pbnQpOiAgVXNlCgluZXcgc3RlcF9yZXN1bWVfYnJlYWtfc2hhZG93LgoKCSogaW5mdGFyZy5jIChjaGlsZF93YWl0KTogIElmIGFsbCBjaGlsZCBwcm9jZXNzZXMgZGllLAoJcHJldGVuZCB0aGF0IHRoZSBvbmUgYmVpbmcgd2FpdGVkIGZvciBleGl0ZWQgd2l0aCBzaWduYWwgNDIuCgoJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6ICBXaGVuIHNjYW5uaW5nIGZvciBjb21tZW50cywKCWRvbid0IGNvcmVkdW1wIG9uIHVuY2xvc2VkIHF1b3Rlcy4KCShxdWl0X2NvbW1hbmQpOiAgVXNlIHRhcmdldF9raWxsIHJ0aGVyIHRoYW4ga2lsbF9pbmZlcmlvci4KCShfaW5pdGlhbGl6ZV9tYWluKTogIFJlbmFtZSBjbGFzc191c2VyIGZyb20gInVzZXIiIHRvCgkidXNlci1kZWZpbmVkIi4KCgkqIHByaW50Y21kLmMgKHByaW50X2NvbW1hbmRfMSk6ICBJbml0aWFsaXplICJmbXQiIGlmIG5vIGZvcm1hdAoJaXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgoJKHByaW50X2ZyYW1lX2FyZ3MpOiAgT25seSBhZGQgdG8gYXJnc19wcmludGVkIGlmIHdlIGFyZQoJYWN0dWFsbHkgZmV0Y2hpbmcgYXJncyBmcm9tIHRoZSBzdGFjayAoYXZvaWRpbmcgdW5kZWZpbmVkCglhcmdfc2l6ZSkuCgkoX2luaXRpYWxpemVfcHJpbnRjbWQpOiAgUmVtb3ZlIGJvZ3VzIFx7IGZyb20gc3RyaW5nLgoKCSogcmVtb3RlLWViLmMgKGViX29wZW4pOiAgQXZvaWQgY29yZWR1bXAgb24gbm8gYXJndW1lbnQuCgoJKiByZW1vdGUtbmluZHkuYzogIEJyaW5nIG91dCBvZiBJbnRlbCBlbnZpcm9ubWVudCBpbnRvIG5ldwoJdGFyZ2V0IGVudmlyb25tZW50LiAgUmVtb3ZlIGFsbCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBvbgoJSTgwOTYwLiAgTWFzc2l2ZSBoYWNraW5nIHRocm91Z2hvdXQuCgkobmluZHlfeGZlcl9pbmZlcmlvcl9tZW1vcnkpOiAgTmV3IHJvdXRpbmUgc3RvbGVuIGZyb20KCWluZnB0cmFjZS5jLgoJKG5pbmR5X2NyZWF0ZV9pbmZlcmlvcik6ICBOZXcgcm91dGluZSBwaWVjZWQgdG9nZXRoZXIsIHByb2JhYmx5Cglub3QgcXVpdGUgd29ya2luZyB5ZXQuCgkobmluZHlfb3BzKTogIE5ldyB0YXJnZXRfb3BzIHN0cnVjdCBmb3IgbmluZHkuCgoJKiByZW1vdGUtdnguYzoJVXNlIHdyaXRlX21lbW9yeSByYXRoZXIgdGhhbiB0YXJnZXRfd3JpdGVfbWVtb3J5Cgl0byBnZXQgZXJyb3IgY2hlY2tpbmcuCgkodnhfYWRkX2ZpbGVfY29tbWFuZCwgdnhfb3Blbik6IFVzZSBzeW1ib2xfZmlsZV9hZGQgcmF0aGVyIHRoYW4KCWFkZF9maWxlLgoJKHZ4X2NyZWF0ZV9pbmZlcmlvcik6ICBVc2UgdGFyZ2V0X3Rlcm1pbmFsX291cnMuLi4KCgkqIHNpZ25hbWUuYyAoX2luaXRpYWxpemVfc2lnbmFtZSk6ICBBbHdheXMgaW5pdGlhbGl6ZSwgc2luY2UKCXdlIG5lZWQgdGhlIHRhYmxlIGZvciB0aGluZ3Mgb3RoZXIgdGhhbiBwc2lnbmFsLgoJCgkqIHNvbGliLmMgKHNvbGliX2FkZCk6ICBVc2Ugc3ltYm9sX2ZpbGVfYWRkLCBub3QgYWRkX2ZpbGUuCgkoc29saWJfYWRkcmVzcyk6ICBSZXR1cm4gYm9vbGVhbiByZXN1bHQgcmF0aGVyIHRoYW4gc3RydWN0Cglwb2ludGVyIHdoaWNoIG5vYm9keSBlbHNlIGtub3dzIHRoZSB0eXBlIG9mLgoKCSogc3BhcmMtdGRlcC5jLCB2YWxvcHMuYzogIFVzZSB3cml0ZV9tZW1vcnkgcmF0aGVyIHRoYW4KCXRhcmdldF93cml0ZV9tZW1vcnksIHRvIGdldCBlcnJvciBjaGVja2luZy4KCgkqIHN0YWNrLmMgKGxvY2Fsc19pbmZvLCBjYXRjaF9pbmZvLCBhcmdzX2luZm8sCglnZXRfc2VsZWN0ZWRfYmxvY2ssIGZyYW1lX2NvbW1hbmQsIHVwX2NvbW1hbmQpOiBVc2UKCXRhcmdldF9oYXNfc3RhY2ssIHJhdGhlciB0aGFuIGhhdmVfaW5mZXJpb3JfcCBvcgoJaGF2ZV9jb3JlX2ZpbGVfcC4KCgkqIHN1bjMteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBSZXdyaXRlIGZvciBuZXcgQkZEIHJlZ2ltZS4KCgkqIHN5bWZpbGUuaDogIE5ldyBmaWxlLCBkZWZpbmluZyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlCglnZW5lcmljIGFuZCBvYmplY3QtZmlsZS1zcGVjaWZpYyBzeW1ib2wgcmVhZGluZyBjb2RlLgoKCSogc3ltdGFiLmM6ICBNb3ZlIGdlbmVyaWMgc3ltYm9sLXJlYWRpbmcgaW50ZXJmYWNlIHRvIHN5bXRhYi5jLAoJZnJvbSBkYnhyZWFkLmMsIGNvZmZyZWFkLmMsIG1pcHNyZWFkLmMsIGV0Yy4gIEFkZCBzeW10YWJfZm5zCgl0YWJsZSB0byBtYXAgQkZEIHRhcmdldHMgdG8gc3ltYm9sLXJlYWRpbmcgbW9kdWxlcyBpbiBHREIuCglDaGFuZ2UgaW5kZXggdG8gc3RyY2hyLgoJKGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUpOiAgVXNlIGVycm9yKCkgcmF0aGVyIHRoYW4gaGFuZC1tYWRlCglzaW11bGF0aW9ucyB0aGVyZW9mLgoJKGxvb2t1cF9wYXJ0aWFsX3N5bWJvbCk6ICBTcGVlZHVwIHNsaWdodGx5IHdoZW4gbGVuZ3RoID09IDAuCgkoc3ltYm9sX2ZpbGVfYWRkKTogIE5ldyBmdW5jdGlvbi4KCShzeW1ib2xfZmlsZV9jb21tYW5kKTogIENhbGwgaXQuCgkoc3ltZmlsZV9vcGVuLCBzeW1maWxlX2luaXQpOiAgTmV3IGZ1bmN0aW9uLgoJKGFkZF9maWxlX3RhcmdldF9jb21tYW5kLCBhZGRfZmlsZV9hZGRyX2NvbW1hbmQpOiBtb3ZlZCBmcm9tCglkYnhyZWFkLmMuCgoJKiB0YXJnZXQuYyAodGFyZ2V0X2NvbW1hbmQpOiAgdXNlIHRhcmdldF9raWxsLgoKCSogdGFyZ2V0LmggKHRhcmdldF9maWxlc19pbmZvKTogIERvbid0IGRlY2xhcmUsIG5ldmVyIGNhbGxlZAoJZnJvbSBvdXRzaWRlLgoKCSogdG0tc3VuMi5oLCB0bS1zdW4zLmggKFNUQUNLX0VORF9BRERSKTogVXNlIHN5c3RlbSBpbmNsdWRlCglmaWxlcyB0byBkZXRlcm1pbmUgc3RhY2sgZW5kIGFkZHJlc3MuCgoJKiB2YWxhcml0aC5jICh2YWx1ZV94X2Jpbm9wLCB2YWx1ZV94X3Vub3ApOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZQoJdG8gYmUgbW9yZSB1c2VmdWwuICBQYXNzIHByb3BlciBhcmd1bWVudCB0byB2YWx1ZV9zdHJ1Y3RfZWx0LgoKCSogdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6ICBGSVhNRSBjb21tZW50IHRoYXQgbG9uZyBsb25nIAoJYml0ZmllbGRzIHdpbGwgYnJlYWsgaGVyZS4KCgkqIE1ha2VmaWxlLmRpc3Q6ICBBZGQgc3ltZmlsZS5oLCByZW1vdGUtbmluZHkuYywgcmVtb3RlLWViLmMuCglVcGRhdGUgYG1ha2Ugc2FiZXJfZ2RiJyB0byB3b3JrIGJldHRlci4KCgkqIFRPRE86ICBBIHdvbWFuJ3Mgd29yayBpcyBuZXZlciBkb25lLgoKCSogY3BsdXMtZGVtLmMsIGVudmlyb24uYywgaW5mZXJpb3IuaCwgaW5mcnVuLmMsIGluZnRhcmcuYywKCW1haW4uYywgb2JzdGFjay5jLCBwcmludGNtZC5jLCByZW1vdGUtZWIuYywgcmVtb3RlLW5pbmR5LmMsCglyZW1vdGUtdnguYywgcmVtb3RlLmMsIHNvbGliLmMsIHNvdXJjZS5jLCBzcGFyYy1waW5zbi5jLAoJc3BhcmMtdGRlcC5jLCBzcGFyYy14ZGVwLmMsIHN5bW1pc2MuYywgc3ltdGFiLmMsIHN5bXRhYi5oCgl0YXJnZXQuYywgdGVybWluYWwuaCwgdG0tc3BhcmMuaCwgdG0tc3Vub3MuaCwgdXRpbHMuYywKCXZhbG9wcy5jLCB2YWxwcmludC5jLCBleGVjLmM6ICBMaW50LgoKCldlZCBEZWMgMTIgMjM6NDQ6MTUgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJQ29udGludWluZyBJbnRlbCA5NjAgcG9ydCBtZXJnZSBvZiBHREIuCgoJKiBNYWtlZmlsZS5kaXN0OiAgTWVyZ2UgaTk2MCAibmluZHktc2hhcmUiIGZpbGVzLiAgUmVuYW1lCgltYWxsb2MuaCB0byBnbWFsbG9jLmggdG8gYXZvaWQgbmFtZSBjb25mbGljdHMgaW4gL3Vzci9pbmNsdWRlLgoJRG9uJ3Qgc2hpcCBnZGIuZHZpIGluIHRhciBmaWxlLiAgTGluayBnZGIgd2l0aCBpbml0Lm8sIG5vdCBpbml0LmMuCglXYWNrIG92ZXIgIm1ha2UgZGVwZW5kIiBzbyBpdCBoYW5kbGVzIGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzCgl2eC1zaGFyZSwgbmluZHktc2hhcmUsIGJmZCwgYW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCgkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyk6ICBSZW1vdmUgZmF0YWwgZXJyb3IKCWlmIHN0YWNrIG5vdCBkZWZpbmVkLgoKCSogY29yZS5jIChjb3JlX29wZW4sIGNvcmVfZGV0YWNoKTogIE5ldyBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKCXRoZSBvbGQgImNvcmUtZmlsZSIgY29tbWFuZCBhcyAidGFyZ2V0IGNvcmUiIGFuZCAiZGV0YWNoIiBpbnN0ZWFkLgoJKGNvcmVfZmlsZV9jb21tYW5kKTogIENhbGwgdGhlbS4KCShjb3JlX3hmZXJfbWVtb3J5KTogIFVzZSBjb21tb24gcm91dGluZSB4ZmVyX21lbW9yeS4KCgkqIGRieHJlYWQuYzogIEluY2x1ZGUgYS5vdXQuZ251LmgsIG5vdCBzeXN0ZW0gYS5vdXQuaC4KCWRieHJlYWQgbm93IHVzZXMgYmZkIGZvciBldmVyeXRoaW5nIGJ1dCBzeW1ib2wgcmVhZGluZyBpdHNlbGYuCglCRkQgaW50ZXJuYWxzIGFyZSB1c2VkIHRvIGRyYWcgb3V0IHRoZSByZWxldmFudCBmaWxlIG9mZnNldHMuCgkocGFydGlhbF9zeW1ib2xfZmlsZV9vcGVuKTogIENoYW5nZSBhcmdzIGFsbCBhcm91bmQgZm9yIEJGRC4KCgkqIHN5bXRhYi5jOiBSZW5hbWUgInZhbHVlIiB0byAidmFsIiBldmVyeXdoZXJlLCBzbyB3ZSBjYW4KCSNpbmNsdWRlICJ2YWx1ZS5oIi4KCShzeW1ib2xfZmlsZV9jb21tYW5kKTogIE5ldyBjb21tYW5kLCBtb3ZlZCBmcm9tIGRieHJlYWQuYwoJYW5kIGNvZmZyZWFkLmMuICBJdCB1c2VzIEJGRCB0byByZWFkIHRoZSBmaWxlLCB0aGVuIHZlY3RvcnMKCWJhc2VkIG9uIGl0cyB0eXBlLCB0byBkYnggb3IgY29mZiBzeW1ib2wgcmVhZGVycy4KCSogc3ltdGFiLmg6ICBFeHRlcm4gYSBmZXcgdmFycyBmb3Igc3ltYm9sX2ZpbGVfY29tbWFuZC4KCgkqIHRhcmdldC5oOiAgQnJlYWtwb2ludCB0YWtlcyBhIGNoYXIgKiBzYXZlIGFyZWEsIG5vdCBhIGNoYXIgKiouCgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiAgV2hlbiB1bnBhY2tpbmcgYml0ZmllbGRzLCBvZmZzZXQKCXRoZSBhZGRyZXNzIGluIGdkYiBvZiB0aGUgdmFsdWUsIGlmIGl0IGlzIGRlY2xhcmVkIHdpdGggYSBzaG9ydGVyCgl0eXBlLiAgUmVtb3ZlIHRoZSBsYXN0ICJydW50aW1lIGtsdWRnZSB0ZXN0IiBvZiBob3N0IGJ5dGUgb3JkZXIuCgoJKiB1dGlscy5jOiAgUmVtb3ZlIG9sZCBteV9iZmRfcmVhZCByb3V0aW5lLgoKCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6ICBVc2UgdGFyZ2V0X2hhc19zdGFjay4gIFByaW50IHByb2dyYW0gY291bnRlcgoJcmVnaXN0ZXIncyBhY3R1YWwgbmFtZSByYXRoZXIgdGhhbiAicGMiLCBzaW5jZSBpdCdzIGNhbGxlZCB0aGUKCSJpcCIgKGluc3RydWN0aW9uIHBvaW50ZXIpIG9uIHRoZSBpOTYwIChzaWdoKS4KCgkqIHRhcmdldC5jICh0YXJnZXRfY29tbWFuZCk6ICBBZGQgY29tbWFuZCBmb3Igc2VsZWN0aW5nIGEgdGFyZ2V0Cgl0eXBlIGFuZCBjYWxsaW5nIGl0cyBvcGVuIHJvdXRpbmUuICBUaGlzIGlzIHVzZWQgZm9yIGluaXRpYXRpbmcKCWNvbW11bmljYXRpb24gd2l0aCBhIHBhcnRpY3VsYXIgdGFyZ2V0LCBpbiBhIGdlbmVyaWMgd2F5LgoKCSogdG0taTk2MC5oOiAgVXBkYXRlIGZvciBtb2Rlcm4gZ2RiLiAgUmVtb3ZlIHNlbWljb2xvbnMgZnJvbQoJdmFyaW91cyBtYWNyb3MuICBIYW5kbGUgcmVhZGluZyBzdHJ1Y3QgcmV0dXJuIGNvbnZlbnRpb24sIGFuZAoJZXJyb3Itb3V0IGF0dGVtcHRzIHRvIHJldHVybiBzdHJ1Y3RzIHdpdGggdGhlICJyZXR1cm4iIGNvbW1hbmQuCglCZSBzdXJlIGdkYiBkb2Vzbid0IHRoaW5rIHdlIGtub3cgaG93IHRvIGNhbGwgZnVuY3Rpb25zIGluIHRoZQoJaW5mZXJpb3IuCgoJKiBpOTYwLXRkZXAuYzogIFJlbmFtZSBGUkFNRV9DSEFJTl9WQUxJRCBhbmQgRlJBTUVfRklORF9TQVZFRF9SRUdTCgl0byBpOTYwX3h4eCBpbiBsb3dlciBjYXNlLgoJKGFyZ19hZGRyZXNzKTogIENpcmN1bXZlbnQgZXJyb3JzIGR1ZSB0byBMT0NfQVJHX0JMT0NLCglub3QgYmVpbmcgZGVmaW5lZCB5ZXQuCgoJKiByZW1vdGUuYyAocmVtb3RlX29wZW4pOiAgQ2FsbCBzdGFydF9yZW1vdGUgdG8gaW5pdGlhbGl6ZSAKCXdhaXRfZm9yX2luZmVyaW9yIGR1cmluZyBvcGVuLgoJKHJlbW90ZV94ZmVyX2luZmVyaW9yX21lbW9yeSk6ICBSZXR1cm4gbGVuZ3RoIHdyaXR0ZW4gcmF0aGVyCgl0aGFuIGVycm5vIHZhbHVlLgoKCSogcmVtb3RlLXZ4LmMgKHRhcmdldF9jb21tYW5kIC0+IHZ4X29wZW4pOiAgVXNlIG5ldyBnZW5lcmljCgl0YXJnZXQgY29tbWFuZC4KCSogcmVtb3RlLWViLmMsIGluZnRhcmcuYywgZXhlYy5jOiBkaXR0by4KCgkqIGluZnJ1bi5jOiAgRml4IGNvbW1lbnRzLgoJKGF0dGFjaF9wcm9ncmFtIC0+IGNoaWxkX29wZW4pOiAgVXNlIG5ldyBnZW5lcmljIHRhcmdldCBjb21tYW5kLgoJKHdhaXRfZm9yX2luZmVyaW9yKTogIENsZWFyIHNhdmVkIHJlZ2lzdGVyIHZhbHVlcyBiZWZvcmUgdGFyZ2V0X3dhaXQsCglzbyB0YXJnZXRfd2FpdCBjYW4gc2V0IHNvbWUgb2YgdGhlbSBpZiBjb252ZW5pZW50LgoKCSogaW5mcHRyYWNlLmMgKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycywgc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKToKCVJldHVybiBzdWNjZXNzIGluZGljYXRvciwgbm90IHZvaWQuCgkoY2hpbGRfeGZlcl9tZW1vcnkpOiAgQXZvaWQgZmV0Y2hpbmcgaW5pdGlhbCB3b3JkIGlmIHdlJ2xsCglvdmVyd3JpdGUgaXQgYW55d2F5LgoKCSogaW5mY21kLmMgKGF0dGFjaF9jb21tYW5kKTogIFVzZSBuZXcgZ2VuZXJpYyB0YXJnZXQgb3BlbiByb3V0aW5lLgoJKF9pbml0aWFsaXplX2luZmNtZCk6ICBVcGRhdGUgZG9jIG9uIGF0dGFjaCBhbmQgZGV0YWNoIGNvbW1hbmRzLgoJKGRvX3JlZ2lzdGVyc19pbmZvKTogIE1lcmdlIGluIGEgYnl0ZS1vcmRlciBwcm9ibGVtIGFzIGEgRklYTUUKCWNvbW1lbnQuCgoJKiBmaW5kdmFyLmMgKGZpbmRfc2F2ZWRfcmVnaXN0ZXIpOiAgQXZvaWQgcHJvYmxlbSBpbiBjdXJyZW50IGZyYW1lLgoJKHJlYWRfcmVsYXRpdmVfcmVnaXN0ZXIpOiAgRGl0dG8uCgkod3JpdGVfcmVnaXN0ZXIpOiAgQ29udmVydCBieXRlIG9yZGVyIG9uIHRoZSB3YXkgb3V0LgoKCSogZXhlYy5jIChmaWxlX2NvbW1hbmQpOiAgQWRkLgoJKGFkZF90b19zZWN0aW9uX3RhYmxlLCBleGVjX2NvbW1hbmQpOiAgVXNlIG5ldyBiZmRfbWFwX292ZXJfc2VjdGlvbnMuCgkoeGZlcl9tZW1vcnkpOiAgQ29tbW9uIGZ1bmN0aW9uIGJldHdlZW4gY29yZV94ZmVyX21lbW9yeSBhbmQKCWV4ZWNfeGZlcl9tZW1vcnkuCgkoZXhlY194ZmVyX21lbW9yeSk6ICBVc2UgaXQuCgoJKiBwbi1vcGNvZGUuaDogIERvY3VtZW50IHRoYXQgYSAiUE4iIGlzIGEgR291bGQgUG93ZXJOb2RlLgoKCSogYnJlYWtwb2ludC5jLCBicmVha3BvaW50LmgsIHN5bXRhYi5oLCB2YWx1ZS5oLCBmcmFtZS5oLCB1dGlscy5jLAoJdmFsb3BzLmMsIHN0YWNrLmMsIHRhcmdldC5jLCBzcGFyYy14ZGVwLmMsIHNvdXJjZS5jLCBwcmludGNtZC5jLAoJaW5mY21kLmMsIGk5NjAtcGluc24uYywgZXZhbC5jLCBkZWZzLmg6ICBsaW50IGFuZCBnY2MgLVdhbGwuCgpTdW4gRGVjICAyIDE2OjQ1OjA2IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCU1lcmdlIEludGVsIDk2MCBwb3J0IG9mIGdkYiwgY29udGludWluZy4uLgoKCSogZGJ4cmVhZC5jIChwYXJ0aWFsX3N5bWJvbF9maWxlX29wZW4sIHBhcnRpYWxfc3ltYm9sX2ZpbGVfcmVhZCwKCXN5bWJvbF9maWxlX2NvbW1hbmQpOiAgUGFzcyBmcm9tX3R0eSBhcmcgdG8gaHVzaCAnZW0gdXAuCgoJKiBjb2ZmcmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogIEF2b2lkIG91dHB1dCBpZiBmcm9tX3R0eSAhPSAxLgoJQWRkIG1hZ2ljIG51bWJlcnMgZm9yIDk2MCBDT0ZGIGZvcm1hdC4KCkZyaSBOb3YgMzAgMDk6MTg6MjAgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJTWVyZ2UgSW50ZWwgOTYwIHBvcnQgb2YgZ2RiLCBmcm9tIEludGVsICIxLjIiIHJlbGVhc2UuCgoJQ0hBTkdFX0xPRyBlbnRyaWVzIGZyb20gdGhlaXIgcG9ydCwgd2hpY2ggd2FzIGJhc2VkIG9uCglnZGIrLTIuOC4wOgoKICAgIFRodSBTZXAgIDYgMTE6MDI6MjIgUERUIDE5OTAKCVJlbW92ZSB0ZW1wIGZpbGUgaWYgZG93bmxvYWQgaXMgaW50ZXJydXB0ZWQuCgogICAgV2VkIEF1ZyAgMSAwOTowODozMyBQRFQgMTk5MAoJTm93IHVzZXMgYmluYXJ5IHByb3RvY29sIHRvIHRhbGsgdG8gTklORFkuCglPbGQgaGV4IHByb3RvY29sIChOSU5EWSAyLjEzIGFuZCBvbGRlcikgc3VwcG9ydGVkIHdpdGggLU8gc3dpdGNoLgoJVGltZXMgb3V0IGFmdGVyIDUgc2Vjb25kcyB3aGVuIHRyeWluZyB0byB0YWxrIHRvIE5JTkRZLgoKICAgIFR1ZSBNYXkgMjkgMTI6NTQ6NDkgUERUIDE5OTAKCUFkZGVkIHZhcmlhYmxlIGJhdWQgcmF0ZSAoLWIgc3dpdGNoKS4KCVNvdXJjZSBjb2RlIHJlb3JnYW5pemF0aW9uLgoKICAgIFRodSBBcHIgMjYgMTE6MDk6NTUgUERUIDE5OTAKCU1vcmUgY2xlYW51cCBvZiBiYXRjaCBtb2RlOyAgc3BlY2lmaWNhbGx5LCBleGVjdXRlICItcyIsICItZSIsIGFuZAoJIi1zZSIgc3dpdGNoZXMgYXMgc29vbiBhcyB0aGV5IGFyZSBlbmNvdW50ZXJlZCBvbiB0aGUgaW52b2NhdGlvbiBsaW5lLgoKICAgIEZyaSBBcHIgMjAgMTM6NDc6MTUgUERUIDE5OTAKCUFkZCAtYnJrIHN3aXRjaC4KCiAgICBUaHUgQXByIDE5IDA5OjU0OjI4IFBEVCAxOTkwCglBZGQgJ3Jlc2V0JyBjb21tYW5kLgoKICAgIFdlZCBBcHIgMTggMDk6NDg6MDcgUERUIDE5OTAKCUFmdGVyIG9wZW5pbmcgcmVtb3RlIHR0eSwgd2FpdCBmb3IgMSBzZWNvbmQgdG8gZ28gYnkgd2l0aG91dCBpbnB1dAoJZnJvbSBpdCBiZWZvcmUgdHJ5aW5nIHRvIHRhbGsgdG8gTklORFkgKGZpeGVzIHByb2JsZW1zIHdpdGggdGhlCglIZXVyaWtvbiBISzgwL1Y5NjBFKS4KCiAgICBNb24gQXByICA0IDE2OjMzOjA1IFBEVCAxOTkwCglTb21lIG91dHB1dCB3YXMgbm90IGJlaW5nIHN1cHByZXNzZWQgaW4gJ2JhdGNoJyBtb2RlLgoKICAgIFRodSBNYXIgMjIgMTU6MzE6MTEgUFNUIDE5OTAKCUFzayB1c2VyIGlmIG9sZCBzeW1ib2wgdGFibGUgc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBuZXcgZmlsZSBpcwoJZG93bmxvYWRlZC4KCglBbGxvdyB1c2VyIHRvIHJ1biBhIHByb2dyYW0gZG93bmxvYWRlZCBiZWZvcmUgZ2RiOTYwIHdhcyBicm91Z2h0IHVwLgoKCUNvcnJlY3QgImV4ZWMtZmlsZSIgaGVscCBtZXNzYWdlIGZvciBpODA5NjAgY29udGV4dC4KCglDb3JyZWN0IGJ1ZyBpbiBjYWxjdWxhdGluZyB1c2VyIHNwYWNlIGFkZHJlc3M6ICBjb3VsZCBvY2Nhc2lvbmFsbHkKCWNvcnJ1cHQgdXNlciBwcm9ncmFtLgoKCU1ha2Ugc3VyZSB0byB6ZXJvIGxvdy1vcmRlciBiaXRzIGluIHJpcCdzIGJlY2F1c2Ugb2YgYnVnIGluIDk2MENBCglBLXN0ZXAgcGFydDogIGNvdWxkIGNhdXNlIG9wZXJhdGlvbiBmYXVsdHMgd2hlbiAibmV4dCJpbmcgYWNyb3NzCglhIGZ1bmN0aW9uIGNhbGwuCgoJQ29ycmVjdCBidWcgdGhhdCBtYWRlIGl0IGltcG9zc2libGUgdG8gZ2V0IHNvdXJjZSBsaW5lIG51bWJlcnMgZm9yCgljb2RlIGxvYWRlZCBhdCBhZGRyZXNzZXMgaGlnaGVyIHRoYW4gMHg3ZmZmZmZmZi4KCiAgICBXZWQgSmFuIDEwIDEyOjQzOjIyIFBTVCAxOTkwCglPcGVuIHJlbW90ZSB0dHkgZm9yIGV4Y2x1c2l2ZSB1c2UuCgogICAgRnJpIEphbiAgNSAxMjoxNDo0MiBQU1QgMTk5MAoJQ29ycmVjdCBkaXNhc3NlbWJseSAoQ0EgbWFudWFsIHdhcyByaWdodCBhZnRlciBhbGwpOgoJb3Bjb2RlIGZvciBzeXNjdGwgaXMgMHg2NTkKCiAgICBNb24gT2N0IDIzIDEyOjAzOjA0IFBEVCAxOTg5CglVc2UgRzk2MEJBU0UgYW5kIEc5NjBCSU4gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGZpbmQgJ3N4JyB1dGlsaXR5LgoKICAgIE1vbiBPY3QgMTYgMTQ6MTU6MDkgUERUIDE5ODkKCSJzZnIwIi0ic2ZyMzEiIHNob3VsZCBoYXZlIGJlZW4gbmFtZWQgInNmMCItInNmMzEiCgogICAgTW9uIE9jdCAgMiAxNTo1NjozMSBQRFQgMTk4OQoKCUFkZGVkIDk2MENBIGRpc2Fzc2VtYmx5IHN1cHBvcnQuCgoJVG8gc2ltcGxpZnkgbWFpbnRlbmFuY2U6CgkJLSBlbGltaW5hdGVkIHVzZSBvZiBzeW1ibGljIGxpbmtzIG9uIHBpbnNuLmM6IHVzZSBpOTYwLXBpbnNuLmMKCQkJZGlyZWN0bHkgaW5zdGVhZC4KCQktIGVsaW1pbmF0ZWQgb3Bjb2RlLmg6IGluY29ycG9yYXRlcyB0YWJsZXMgaW50byBpOTYwLXBpbnNuLmMKCQktIG1vdmVkIDk2MC1zcGVjaWZpYyByb3V0aW5lcyBmcm9tIGk5NjAtcGluc24uYyB0byBpOTYwLW1kLmMKCQktIG1hZGUgZGlzYXNzZW1ibHkgaW50ZXJmYWNlIGlkZW50aWNhbCB0byB0aGF0IGluIGdkbXA5NjAuCgoKCldlZCBOb3YgMjggMjE6MzI6NDggMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKCgkqIHRhcmdldC5oOiBBbGxvdyB0YXJnZXRzIHRvIHN0YWNrLiAgQWRkIHRhcmdldF9oYXNfbWVtb3J5LAoJX3JlZ2lzdGVycywgZXRjLiAgUmVzdHJ1Y3R1cmUgbWVtb3J5IGFjY2VzcyBhbmQgImluZm8gZmlsZXMiCgl0byB3YWxrIHRoZSB0YXJnZXQgc3RhY2suCgkqIGV4ZWMuYywgY29yZS5jLCBpbmZ0YXJnLmMsIHJlbW90ZS5jLCByZW1vdGUtdnguYywgcmVtb3RlLWViLmMsCgl0YXJnZXQuYzogIENoYW5nZSB0YWJsZXMgdG8gbWF0Y2ggdGFyZ2V0LmguCgkqIGluZmxvdy5jIChjaGlsZF9tb3Vybl9pbmZlcmlvcik6ICBwb3AgY2hpbGRfb3BzLgoJKGdlbmVyaWNfbW91cm5faW5mZXJpb3IpOiAgVXNlIG5ldyBoYXNfc3RhY2sgZmxhZy4KCSogaW5mcHRyYWNlLmMgKGNoaWxkX3hmZXJfbWVtb3J5KTogTmV3IG1lbW9yeSByZWdpbWUuCgkqIGluZnRhcmcuYyAoY2hpbGRfZmlsZXNfaW5mbyk6IE5ldyAiaW5mbyBmaWxlcyIgcmVnaW1lLgoJKiByZW1vdGUtZWIuYzogTmV3IG1lbW9yeSByZWdpbWUsIG5ldyBpbmZvIGZpbGVzLgoJKiByZW1vdGUtdnguYzogTmV3IG1lbW9yeSByZWdpbWUsIG5ldyBpbmZvIGZpbGVzLiAgTm93IHVzZQoJc2VwYXJhdGUgdGFyZ2V0cyBmb3IgVnhXb3JrcyBhdHRhY2htZW50IHRvIG1hY2hpbmUsIGFuZCAKCWFjdHVhbGx5IHJ1bm5pbmcgYSBwcm9jZXNzIHVuZGVyIFZ4V29ya3MsIHNpbmNlIG9uZSBoYXMKCXN0YWNrICYgZXhlY3V0aW9uICYgcmVncyBhbmQgdGhlIG90aGVyIGRvZXNuJ3QuCgkqIHJlbW90ZS5jOiBOZXcgbWVtb3J5IHJlZ2ltZSwgbmV3IGluZm8gZmlsZXMuCgkqIHNwYXJjLXhkZXAuYyAoZmV0Y2hfY29yZS1yZWdpc3RlcnMpOiAgTmV3IG1lbW9yeSByZWdpbWUuCgkqIHRhcmdldC5jOiAgTmV3IHJvdXRpbmVzIGFuZCBzdXBwb3J0IGZvciBzdGFja2VkIHRhcmdldHMsCgluZXcgbWVtb3J5IHJlZ2ltZSwgbmV3IGluZm8gZmlsZXMgcmVnaW1lLgoJCgoJR2VuZXJhbGl6ZSBzZWN0aW9uIGhhbmRsaW5nIGZvciBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHNlY3Rpb25zLAoJaW5jbHVkaW5nIHVzZSBvZiB0aGUgbmV3IEJGRCAoYmluYXJ5IGZpbGUpIGxpYnJhcnkuCgkqIGdkYmNvcmUuaDogQWRkIHN0cnVjdCBzZWN0aW9uX3RhYmxlLgoJKiBleGVjLmMgKGJ1aWxkX3NlY3Rpb25fdGFibGUpOiAgSXRlcmF0ZSBhbGwgc2VjdGlvbnMgYW5kCglyZWNvcmQgd2hhdCBnZGIgbmVlZHMgdG8ga25vdyBhYm91dCB0aGVtLgoJKGV4ZWNfY29tbWFuZCk6ICBVc2UgaXQuCgkoZXhlY194ZmVyX21lbW9yeSk6ICBVc2UgdGhlIHRhYmxlLgoJKGV4ZWNfZmlsZXNfaW5mbyk6ICBQcmludCB0aGUgdGFibGUuCgkqIGNvcmUuYyAoY29yZV9maWxlX2NvbW1hbmQsIGNvcmVfeGZlcl9tZW1vcnksIGNvcmVfZmlsZXNfaW5mbyk6CglMaWtld2lzZS4JCgkqIHNvdXJjZS5jIChmaW5kX3NvdXJjZV9saW5lcyk6ICBVc2UgYmZkX2dldF9tdGltZS4KCSogZGJ4cmVhZC5jOiAgUXVpY2sgY2hhbmdlcyB0byBtYWtlIGl0IGNvbXBpbGUgd2l0aCBuZXcgQkZELgoJKiB1dGlscy5jIChlcnJvcik6ICBBdm9pZCB1c2luZyBiZmRfZXJyb3IgaW4gZ2VuZXJpYyByb3V0aW5lcy4KCQoJKiBjb3JlLmMgKGNvcmVfZmV0Y2hfcmVnaXN0ZXJzKTogIEdldCBmcm9tIHRoZSAiLnJlZ3MiIHNlY3Rpb24gb2YKCXRoZSBCRkQgY29yZSBmaWxlLgoJKiBzcGFyYy14ZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIFVzZSB0aGUgLnJlZ3MgaW5mby4KCgkqIGluZmVyaW9yLmggKGF0dGFjaF9mbGFnKTogIEV4cG9ydC4KCSogaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogIHVzZSBuZXcgdGFyZ2V0X2NyZWF0ZV9pbmZlcmlvci4KCSogaW5mcnVuLmMgKGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6ICBEb24ndCByZXR1cm4gcmVzdWx0LgoJKiBNYWtlZmlsZS5kaXN0IChWRVJTSU9OKTogIDMuOTEuNC4KCkZyaSBOb3YgMjMgMjg6MTU6MzggMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKCgkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X251bSk6ICBIYW5kbGUgYnJlYWtwb2ludHMgd2hpY2ggaGF2ZQoJc2luY2UgYmVlbiBkZWxldGVkLCBzdWNoIGFzIHRlbXBvcmFyeSBicmVha3BvaW50cy4KCWluZmNtZC5jIChwcm9ncmFtX2luZm8pOiAgZGl0dG8uCgoJKiBjb3JlLmMgKGNvcmVfZmlsZV9jb21tYW5kKTogIERpc3BsYXkgdGhlIGZyYW1lIHdoZXJlIHRoZSBjb3JlCglkdW1wIG9jY3VycmVkLgoKCSogbWFpbi5jOiAgbGludC4KCgkqIHJlbW90ZS12eC5jICh0YXJnZXRfY29tbWFuZCk6ICBNZXJnZSBpbiB0YXJnZXQgY29tbWFuZCBmcm9tCgl0YXJnLXZ4LmMuICBBIGZldyBvdGhlciBjbGVhbnVwcy4KCgkqIFRPRE8sIFByb2plY3RzOiAgTG90cyBtb3JlIHN0dWZmIHRvIGRvLi4uCgpGcmkgTm92IDIzIDE4OjE1OjM4IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJTWFzc2l2ZSBjaGFuZ2VzIHRvIHdhbGwgb2ZmIHRoZSByZW1vdGUtZGVidWdnaW5nIGludGVyZmFjZQoJYmVoaW5kIGEgZnVuY3Rpb24gdmVjdG9yLiAgVGhlIHBvcnQgdG8gaGFuZGxlIFZ4V29ya3MgdGFyZ2V0cwoJaXMgYWxzbyBwYXJ0IG9mIHRoaXMuCgoJQWxsIGZpbGVzOiAgUmVwbGFjZSByZWZlcmVuY2VzIHRvIHJlbmFtZWQgZnVuY3Rpb25zLAoJcmVtb3ZlIHJlZmVyZW5jZXMgdG8gcmVtb3RlX2RlYnVnZ2luZywgcmVtb3ZlIHJlZmVyZW5jZXMgdG8KCWhhdmVfaW5jbHVkZV9maWxlLCBoYXZlX2NvcmVfZmlsZSBpbiBmYXZvciBvZiB0YXJnZXRfaGFzX3N0YWNrLAoJdGFyZ2V0X2hhc19tZW1vcnksIGV0Yy4KCgkqIE1vZHVsYXJpemUgdGhlIGJyZWFrcG9pbnQgaW50ZXJmYWNlLgoJYnJlYWtwb2ludC5oIChCUkVBS1BPSU5UX01BWCk6ICBOZXcgZGVmaW5lIHNldHMgbWF4IGxlbmd0aCBvZgoJYSBicmVha3BvaW50IGluc3RydWN0aW9uLgoJYnJlYWtwb2ludC5jOiBzdHJ1Y3QgYnJlYWtwb2ludCdzIHNoYWRvd19jb250ZW50cyBub3cgc2l6ZWQgYXMKCUJSRUFLUE9JTlRfTUFYLgoJKGluc2VydF9icmVha3BvaW50cyk6ICBWZWN0b3IgdG8gdGFyZ2V0IHRvIGluc3RhbGwgYnJlYWtwb2ludHMuCgkocmVtb3ZlX2JyZWFrcG9pbnRzKTogIFZlY3RvciB0byB0YXJnZXQgaGVyZSB0b28uCglSZW1vdmUgUkVNT1RFX1NBX1NQQVJDIGtsdWRnZXMgYW5kIG90aGVyIHJlbW90ZV9kZWJ1Z2dpbmcuCglzcGFyYy10ZGVwLmMgKHNpbmdsZV9zdGVwKTogIFVzZSBuZXcgYnJlYWtwb2ludCBpbnRlcmZhY2UgZm9yCgl0aGUgc2luZ2xlLXN0ZXAgYnJlYWtwb2ludHMuCgltZW0tYnJlYWsuYyAobWVtb3J5X2luc2VydF9icmVha3BvaW50LCBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQpOgoJTmV3IGZpbGUsIGNvbnRhaW5zIHJvdXRpbmVzIHRvIGluc2VydCBhbmQgcmVtb3ZlIGJyZWFrcG9pbnRzIGJ5CglyZWFkaW5nIG91dCB0aGUgb2xkIGNvbnRlbnRzIGFuZCBsYXRlciByZXBsYWNpbmcgdGhlbS4gIFRoaXMgaXMKCWhvdyBwdHJhY2UgYnJlYWtwb2ludHMgd29yaywgYW5kIG1hbnkgcmVtb3RlIHN5c3RlbXMgYXMgd2VsbC4KCgkqIHRtLXZ4d29ya3M2OC5oOiAgTmV3IGNvbmZpZyBmaWxlLCBvdmVycmlkZXMgYSBmZXcgdGhpbmdzIGZvcgoJV2luZCBSaXZlcidzIHByZWZlcmVuY2VzLgoKCSogdGFyZ2V0Lmg6ICBOZXcgZmlsZSwgZm9yIHRyYW5zZmVyIHZlY3RvciB1c2VkIHRvIHRhbGsgdG8gdGhlCglpbmZlcmlvciAoY2hpbGQsIGF0dGFjaGVkLCBjb3JlLCBleGVjLCByZW1vdGUsIGV0YykuICBBbGwgYWNjZXNzZXMKCXRvIHRoZSB0aGluZyBiZWluZyBkZWJ1Z2dlZCBzaG91bGQgY29tZSB0aHJvdWdoIHRoZXNlIHZlY3RvcnMuCgl0YXJnZXQuYzogIE5ldyBmaWxlLCByb3V0aW5lcyB0byBoYW5kbGUgdHJhbnNmZXIgdmVjdG9yLgoJKHZhcmlvdXMgZmlsZXMpOiAgQWRkIHRyYW5zZmVyIHZlY3RvcnMgWFhYX29wcyBmb3IgdGhlIHZhcmlvdXMKCXRhcmdldHMgYW5kIHBzZXVkby10YXJnZXRzIChjb3JlIGZpbGVzLCBldGMpIHdlIHN1cHBvcnQuCgoJKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6ICBGdXJ0aGVyIGV4cGxvcmF0aW9ucyBvZgoJd2F0Y2hwb2ludHMgYW5kIHdoeSB0aGluZ3MgZG9uJ3Qgd29yayBhbGwgdGhlIHRpbWUuCgkoYnBzdGF0X2FsbG9jKTogIE5ldyBmbiB0byBhbGxvY2F0ZSBhIGJwc3RhdCBhbmQgY2hhaW4gaXQuCgoJKiBjb25maWcuZ2RiOiAgT25seSBhZGQgInNvdXJjZSAke3NyY2Rpcn0vLmdkYmluaXQiIHRvCgl0aGUgbG9jYWwgZ2RiaW5pdCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBpdC4KCgkqIGNvcmUuYyAoY29yZV9vcHMpOiAgYWRkIGFuZCBpbnN0YWxsLgoJQWxsb3cgY29yZSBkZWJ1Z2dpbmcgd2l0aG91dCBleGVjIGZpbGUuCgoJKiBkYnhyZWFkLmMgKGZyZWVfYW5kX2luaXRfaGVhZGVyX2ZpbGVzKTogIE1lcmdlIHR3byBmbnMuCgkoZW5kX3N5bXRhYik6ICBGcmVlIG5hbWVkIHN5bWJvbCB0YWJsZSB3aGVuIGEgbmV3IHZlcnNpb24gY29tZXMgaW4uCgkocmVhZF9kYnhfc3ltdGFiKTogIFJlbG9jYXRlIGFsbCBraW5kcyBvZiBzeW1ib2xzIHdpdGggYmFzZQoJYWRkcmVzcy4gIEZpcnN0IHN0ZXAgdG93YXJkIGhhbmRsaW5nIGRpZmZlcmVudCB0ZXh0LCBkYXRhLCBic3MKCXJlbG9jLgoJKGFkZF9maWxlX2FkZHJfY29tbWFuZCk6ICBSZW5hbWVkIGFkZF9maWxlX2NvbW1hbmQuCgkoYWRkX2ZpbGVfY29tbWFuZCk6ICBWZWN0b3IgdG8gcmVtb3RlIGhhbmRsZXIuCglBZGQgImxvYWQiIGFzIGFuIGFsaWFzIGZvciAiYWRkLWZpbGUiIGNvbW1hbmQuCgoJKiBkZWZzLmg6ICBBbGxvdyAidm9sYXRpbGUiIHRvIGJlIHVzZWQgaW4gbm9uLUFOU0k7IHVzZSBpdCBmb3IKCW5vbi1yZXR1cm5pbmcgZnVuY3Rpb25zLgoKCSogZXhlYy5jOiAgQWRkIGV4ZWNfb3BzLCBhbmQgcHVzaCBpdCBhcyBhIHRhcmdldCB3aGVuIGFuIGV4ZWMKCWZpbGUgaXMgc3BlY2lmaWVkLgoKCSogaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogIFBhc3MgZXhlY3V0YWJsZSBmaWxlIG5hbWUgYW5kIGFyZyBsaXN0CglzZXBhcmF0ZWx5IHdoZW4gc3RhcnRpbmcgYW4gaW5mZXJpb3IuICBQZXJtaXQgInJ1biIgd2hlbiBubyBleGVjCglmaWxlIGlzIHNwZWNpZmllZCwgZm9yIFZ4V29ya3MuCgkoZGV0YWNoX2NvbW1hbmQpOiAgTW92ZSB0byBjaGlsZF9kZXRhY2ggaW4gaW5mdGFyZy5jLgoKCSogaW5mdGFyZy5jOiAgTmV3IGZpbGUuICBVbml4LWNoaWxkLXNwZWNpZmljIHJvdXRpbmVzLCBhbmQgdGhlCgljaGlsZF9vcHMgc3RydWN0dXJlLgoKCSogaW5mZXJpb3IuaCAocmVnaXN0ZXJzKTogIEV4cG9ydCAicmVnaXN0ZXJzIiBhcyB0aGUgd2F5IGZvcgoJdGFyZ2V0IGRlcGVuZGVudCByZWdpc3RlciBoYW5kbGVycyB0byBmaW5kIGdkYidzIGxvY2FsIGNvcHkgb2YKCXRoZSByZWdpc3RlcnMuICBSZW5hbWUgInN0b3BfYWZ0ZXJfYXR0YWNoIiB0byAic3RvcF9zb29uX3F1aWV0bHkiCglzaW5jZSBpdCBpcyBub3cgdXNlZCBieSBwbGFjZXMgdGhhdCB3YW50IHdhaXRfZm9yX2luZmVyaW9yIHRvCgloYW5kbGUgdGhlIGdydW5nZSBidXQgd2FudCB0byBzZWUgZXZlcnkgdHJhcCBmcm9tIHRoZSBpbmZlcmlvci4KCgkqIGluZmxvdy5jIChjcmVhdGVfaW5mZXJpb3IpOiAgUHVsbCBvdXQsIGFuZCBtZXJnZSBpbnRvIGluZnJ1bi5jLgoJRWxpbWluYXRlIHJlbW90ZV9kZWJ1Z2dpbmcgaG9va3MgaW4gdGVybWluYWwgaGFuZGxpbmcuCgoJKiBpbmZydW4uYzogIFJlcGxhY2Ugc3RhcnRfaW5mZXJpb3Igd2l0aCBjaGlsZF9jcmVhdGVfaW5mZXJpb3IuCglNb3ZlIGFsbCB0aGUgaGFpciBvZiBVbml4IHNoZWxscyBhbmQgcHRyYWNlIGlkaW9zeW5jcmFjaWVzIGludG8KCWNoaWxkX2NyZWF0ZV9pbmZlcmlvciwgc28gcmVtb3RlIGhhbmRsZXJzIGRvbid0IGhhdmUgdG8gZGVhbC4KCVJlbW92ZSBydW5uaW5nX2luX3NoZWxsLiAgUmVuYW1lIHN0b3BfYWZ0ZXJfYXR0YWNoIHRvCglzdG9wX3Nvb25fcXVpZXRseSwgYW5kIHVzZSBpdCBpbiBhIGZldyBvdGhlciBwbGFjZXMgd2hlcmUgd2Ugd2FudAoJdG8ganVzdCBjYWxsIHdhaXRfZm9yX2luZmVyaW9yIGFuZCBnZXQgY29udHJvbCBiYWNrIG9uIHRoZSBmaXJzdAoJdHJhcC4gIHRyYXBfZXhwZWN0ZWQgbm93IG5ldmVyIHRha2VzIGEgdmFsdWUgPiAxLgoJKGluaXRfd2FpdF9mb3JfaW5mZXJpb3IpOiAgSW5pdGlhbGl6ZSBzdGF0aWMgdmFycyB3aGVuIGEgbmV3Cglwcm9jZXNzIGlzIGNyZWF0ZWQuCgoJbWFpbi5jIChnZGJpbml0KTogIEFkZCBuZXcgaG9vayBmb3IgLmdkYmluaXQgZmlsZSBuYW1lLCBsZXQKCWl0IGJlIG92ZXJyaWRkZW4gYnkgY29uZmlnIGZpbGVzIGFzIEdEQklOSVRfRklMRU5BTUUuCgkoREVGQVVMVF9QUk9NUFQpOiAgQWRkIG5ldyBob29rIGZvciBvdmVycmlkaW5nIChnZGIpIHByb21wdC4KCUJvdGggb2YgdGhlc2UgYXJlIHVzZWQgZm9yIFZ4V29ya3MgZ2RiLgoKCW1jaGVjay5jOiAgcmVuYW1lIGluY2x1ZGUgZmlsZSAiZ21hbGxvYy5jIiB0byBhdm9pZCBwcm9ibGVtcwoJd2l0aCBzeXN0ZW0gaW5jbHVkZSBmaWxlICJtYWxsb2MuYyIuCgoJcGFyYW0tbm8tdG0uaDogIE5ldyBpbmNsdWRlIGZpbGUsIHNhbWUgYXMgcGFyYW0uaCBidXQgZG9lcyBub3QKCWluY2x1ZGUgdGhlIGRlZmF1bHQgInRtLmgiIGZpbGUuICBUaGlzIGlzIHVzZWQgaW4gZmlsZXMgd2hlcmUKCXRoZSB0YXJnZXQgaXMga25vd24sIGUuZy4gcmVtb3RlLWViLmMgb3Igc3BhcmMteGRlcC5jLgoKCXBhcmFtLmg6ICBOb3cganVzdCBhIHNoZWxsIHRoYXQgaW5jbHVkZXMgdG0uaCBhbmQgcGFyYW0tbm8tdG0uaC4KCglyZW1vdGUtdnguYzogIE5ldyBmaWxlLCBWeFdvcmtzIHJlbW90ZSBkZWJ1Z2dpbmcgc3VwcG9ydC4gIFVzZXMKCVJQQyByb3V0aW5lcyB0aGF0IGFyZSBzaGFyZWQgd2l0aCB0aGUgdGFyZ2V0IHN5c3RlbSwgaW4gZGlyZWN0b3J5Cgkke3NyY2Rpcn0vdngtc2hhcmUuCgoJcmVtb3RlLmM6ICBWZWN0b3JpemUgcmVtb3RlIGludGVyZmFjZS4KCglzb3VyY2UuYzogIEdsb2JhbGl6ZSBzb3VyY2VfcGF0aCwgYW5kIG1ha2UgYW4gYWxpYXMgImwiIGZvciAibGlzdCIKCXNpbmNlIHdlIG5vdyBoYXZlIHRoZSAibG9hZCIgY29tbWFuZC4KCglzcGFyYy14ZGVwLmM6ICBVc2UgbmV3IHBhcmFtLW5vLXRtLmguCgoJc3ltbWlzYy5jIChmcmVlX25hbWVkX3N5bXRhYik6ICBBZGQgbmV3IGZ1bmN0aW9uIGZyb20gV2luZCBSaXZlci4KCUhvd2V2ZXIsIGlmZGVmIGl0IG91dCBmb3Igbm93IHdoaWxlIHdlIHRoaW5rIGFib3V0IHdoYXQgaXQgc2hvdWxkCglyZWFsbHkgYmUgZG9pbmcuCgoJdG0tc3VuMy5oLCB4bS1zcGFyYy5oLCB4bS1zdW4zLmgsIHhtLXN5bW1ldHJ5Lmg6IE1vdmUKCVBSRVBBUkVfVE9fU1RPUkUgdG8KCXRoZSB4bS0gZmlsZSwgYW5kIGNoYW5nZSBpdHMgbmFtZSB0byBDSElMRF9QUkVQQVJFX1RPX1NUT1JFLCBzaW5jZQoJbm9uLVVuaXgtY2hpbGRyZW4gaGFuZGxlIHRoaXMgd2l0aCB0aGVpciBvd24gY29kZSBpbiB0aGUgdGFyZ2V0Cgl0cmFuc2ZlciB2ZWN0b3IuCgoJTWFrZWZpbGUuZGlzdDogIFJvbGwgdmVyc2lvbiB0byAzLjkyLjMuICBBZGQgdngtc2hhcmUgc3R1ZmYgdG8KCXNvdXJjZSBhbmQgdGFyZ2V0IGxpc3RzLiAgQWRkIHZ4LXNoYXJlIHRvIGRlZmF1bHQgbGlzdCBvZiBpbmNsdWRlCglkaXJlY3Rvcmllcy4gIEFkZCBuZXcgZmlsZXMgdG8gc3JjIGFuZCB0YXJnZXQgbGlzdHM6IG1lbS1icmVhaywKCXRhcmdldCwgaW5mdGFyZywgcmVtb3RlLWViLCByZW1vdGUtdngsIHRhcmctdnguICBCZSBzdXJlIHRoZQoJJHtzcmNkaXJ9IHZlcnNpb25zIG9mIG11bmNoIGFuZCBjcmVhdGV0YWdzIGFyZSB1c2VkLgoKCSogdmFsb3BzLmMgKGZpbmRfZnVuY3Rpb25fYWRkcik6ICBTcGxpdCBvdXQgb2YgY2FsbF9mdW5jdGlvbi4KCShjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgUmVuYW1lIGNhbGxfZnVuY3Rpb247IHRoaXMgZnVuY3Rpb24gCgljYWxscyBmdW5jdGlvbnMgaW4gdGhlIHRhcmdldCBieSBsYWJvcmlvdXNseSBwYXRjaGluZyB0aGUgdGFyZ2V0Cgl3b3JkLWJ5LXdvcmQgd2l0aCB0aGUgcmlnaHQgc3RhY2ssIGFyZ3MsIHJlZ3MsIGV0Yy4KCgpNb24gTm92ICA1IDE3OjI5OjEwIDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJSGFuZGxlIEFNRCAyOTAwMCBhIGJpdCBiZXR0ZXIuCgoJKiByZW1vdGUtZWIuYyAocmVhZGNoYXIpOiAgTWFzayByZWNlaXZlZCBjaGFyIGxvZyB0byBtYWtlIGl0IHJlYWRhYmxlLgoJKHJlbW90ZV9zdGFydCk6ICBQYXNzIGFyZ3VtZW50cyBkb3duIHRvIGV4ZWN1dGluZyBwcm9ncmFtLgoJTWFrZSBzdGFydGFkZHIgdW5zaWduZWQuCglpbmZydW4uYyAoc3RhcnRfaW5mZXJpb3IpOiAgQWNjZXB0IGFyZ3MsIHBhc3MgdGhlbSB0bwoJcmVtb3RlX3N0YXJ0LgoJaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogIFBhc3MgYXJncyBkb3duIHRvIHN0YXJ0X2luZmVyaW9yLgoKCSogdGNvbmZpZy9hbTI5ay1hb3V0LCB0Y29uZmlnL2FtMjlrLWNvZmY6ICBOZXcgZmlsZXMgc3BlY2lmeWluZwoJdGhlIHRhcmdldCBvYmplY3QgZmlsZSBmb3JtYXQuCgl0bS0yOWsuaDogIFBheSBoZWVkIHRvIENPRkZfRU5DQVBTVUxBVEUuCgoJKiBhbTI5ay1waW5zbi5jIChwcmludF9pbnNuKTogIFByaW50IDB4IG9uIGhleCBudW1iZXJzIGluIGRpc2Fzc2VtYmx5LgoJYW0yOWstdGRlcC5jIChleGFtaW5lX3Byb2xvZ3VlKTogIEJldHRlciBjaGVja2luZyBvZiBmdW5jdGlvbiBwcmVmaXhlcy4KClN1biBPY3QgIDcgMTg6MjA6NDUgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKCgkqIE1ha2VmaWxlLmRpc3QgKFZFUlNJT04pOiAgUm9sbCB2ZXJzaW9uIHRvIDMuOTEuOSBhbmQgZnJlZXplLgoJKiBUT0RPOiAgV2UgZGlkIGEgZmV3IHRoaW5ncywgd2UgaGF2ZSBtb3JlIHRvIGRvIHRob3VnaC4KCgkqIHhtLXNwYXJjLmggKENMRUFSX0RFRkVSUkVEX1NUT1JFUyk6ICBEZWZpbmUuCgkqIGluZmxvdy5jIChpbmZlcmlvcl9kaWVkKTogIENsZWFyIGRlZmVycmVkIHN0b3Jlcy4KCQoJKiBEZWJ1ZyBwcm9ibGVtcyB3aXRoIGR1bW15IGZyYW1lcyBhbmQgY2FsbHMgdG8gdGhlIGluZmVyaW9yLgoJKiB0bS1zcGFyYy5oIChQVVNIX0RVTU1ZX0ZSQU1FLCBQT1BfRlJBTUUpOiAgTW92ZSB0byBzcGFyYy10ZGVwLmMuCgkqIHNwYXJjLXRkZXAuYyAoZG9fcmVzdG9yZV9pbnNuKTogIFNpbXBsaWZ5LgoJKHNwYXJjX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6ICBTaW1wbGlmeSBhbmQgZml4IHdoYXQgd2UgZmluZC4KCShzcGFyY19wdXNoX2R1bW15X2ZyYW1lKTogIFNpbXBsaWZ5IGFuZCBmaXggd2hhdCB3ZSBwdXNoLgoJKHNwYXJjX3BvcF9mcmFtZSk6ICBTbGlnaHRseSBtb3JlIGhhaXIgaGVyZSwgZGVjaWRpbmcgd2hldGhlcgoJd2UgYXJlIHJlc3RvcmluZyBhIHNhdmVkIFBDIG9yIHJldHVybmluZyB0byBhIHJldHVybiBhZGRyZXNzIGluICVpNy4KCSogc3BhcmMteGRlcC5jIChyZWFkX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBEZWJ1ZyBpZiB2YWxpZCByZWcgaXMgcmVhZC4KCgkqIHV0aWxzLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogIFJldHVybiB0eXBlIGRlcGVuZHMgb24gX19TVERDX18uCgkqIHN5bXRhYi5oICh4bWFsbG9jKTogZGl0dG8sIGZvciBvYnN0YWNrX2NodW5rX2FsbG9jLgoJKiBvYnN0YWNrLmggKGNodW5rZnVuKTogZGl0dG8uCgkqIGRlZnMuaCAoeG1hbGxvYywgeHJlYWxsb2MpOiBkaXR0bwoKCSogdXRpbHMuYyAocXVpdCk6ICBHcmFiIHRoZSB0ZXJtaW5hbCBmcm9tIHRoZSBjaGlsZCBpZiBuZWNlc3NhcnkuIAoKCSogaW5mbG93LmMgKHRlcm1fc3RhdHVzX2NvbW1hbmQpOiBSZW5hbWUgdG8gdGVybV9pbmZvLCBjaGFuZ2UKCXRvICJpbmZvIHRlcm1pbmFsIi4KCgkqIHNwYXJjLXBpbnNuLmMgKHByaW50X2luc24pOiAgRGlzYXNzZW1ibHkgcHJlZmVycyByZWFsIGluc3RydWN0aW9ucy4KCShpc19kZWxheWVkX2JyYW5jaCk6ICBTcGVlZCB1cC4KCSogc3BhcmMtb3Bjb2RlLmg6IEFkZCBBTElBUyBiaXQgdG8gYWxpYXNlcy4gIEZpeCB1cCBvcGNvZGUgdGFibGVzLgoJU3RpbGwgbWlzc2luZyBzb21lIGZsb2F0IG9wcywgYW5kIG5lZWRzIHRlc3RpbmcuCgoJKiBTdXBwb3J0IGZvciBpbnB1dCBhbmQgb3V0cHV0IHJhZGl4ZXMgb3RoZXIgdGhhbiBiYXNlIDEwCgkqIGRlZnMuaCAoaW5wdXRfcmFkaXgsIG91dHB1dF9yYWRpeCk6ICBEZWNsYXJlLgoJKiBleHByZWFkLnkgKHl5cGFyc2UsIHBhcnNlX251bWJlcik6ICBIYW5kbGUgY2hhbmdlcyBvZiBpbnB1dAoJcmFkaXgsIGFuZCBhbWJpZ3VvdXMgbmFtZXMtb3ItbnVtYmVycyBpbiByYWRpeGVzID4xMC4KCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6ICBQcmludCBmb3JtYXR0ZWQgaGV4CgludW1iZXJzIGluIHZhcnlpbmcgY29sdW1uIHdpZHRocy4KCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogIFVzZSBvdXRwdXRfZm9ybWF0IHRvIHByaW50IHNjYWxhciBpbnRzLgoJKHNldF9pbnB1dF9yYWRpeCwgc2V0X291dHB1dF9yYWRpeCwgc2V0X3JhZGl4KTogIENyZWF0ZS4KCShzZXRfb3V0cHV0X3JhZGl4KTogIFNldCBvdXRwdXRfZm9ybWF0IGZyb20gb3V0cHV0X3JhZGl4LgoJKF9pbml0aWFsaXplX3ZhbHByaW50KTogIGFkZCBgc2V0IHJhZGl4JyBidXQgbGVhdmUgdGhlIG90aGVycyBvZmYuCgkKCSogbWFpbi5jIChleGVjdXRlX2NvbW1hbmQpOiBMZXQgc3R1cGlkIHF1ZXN0aW9ucyBiZSB0dXJuZWQgb2ZmLgoJKF9pbml0aWFsaXplX21haW4pOiBIYW5kbGUgInNldCBzdHVwaWRpdHkiLCBldGMuCgoJKiBtYWluLmMsIGluZmxvdy5jLCBpbmZlcmlvci5oLCBmcmFtZS5oLCBjb21tYW5kLmMsIGRlZnMuaCwgCglzcGFyYy1waW5zbi5jLCBzcGFyYy14ZGVwLmMsIHZhbHVlLmgsIHZhbG9wcy5jLCB2YWx1ZXMuYzogIExpbnQuCgpUdWUgT2N0ICAyIDExOjIwOjAyIDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJKiBUT0RPLCBNYWtlZmlsZS5kaXN0LCBDaGFuZ2VMb2c6ICBGcmVlemUgZm9yIDMuOTEuOCByZWxlYXNlLgoJYmZkIHN0dWZmIGlzIHN0aWxsIHNjcmV3ZWQgdXAsIGJ1dCB3aXRoIHNvbWUgbWFudWFsIHdvcmssIGl0Cgljb21waWxlcy4KCgkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X2RvX2FjdGlvbnMpOiAgU3RhcnQgb3ZlciBpZiBhIGNvbW1hbmQKCXByb2NlZWRzIHRoZSBpbmZlcmlvciwgc2luY2UgdGhlIGluZmVyaW9yIHdpbGwgaGF2ZSBzdG9wcGVkIGFuZAoJd2lsbCBuZWVkIHRvIGhhdmUgaXRzIG5ldyBzdG9wLWFjdGlvbnMgdGFrZW4gY2FyZSBvZi4KCgkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6ICBFeHByZXNzaW9uIGdpdmVzIFN1bjMgNC4wLjMKCWNvbXBpbGVyIGZpdHMsIHNpbXBsaWZ5IGl0LgoKCSogZ2RiLnRleGluZm8gKGRpcmVjdG9yeSBjb21tYW5kKTogRG9jIG5ldyBkaXIgY29tbWFuZC4KCXNvdXJjZS5jIChkaXJlY3RvcnlfY29tbWFuZCk6ICAiZGlyIiBub3cgcHV0cyB0aGluZ3Mgb24gdGhlIGZyb250CglvZiB0aGUgcGF0aCwgbW92ZXMgZHVwcyB1cCBmcm9udCwgYW5kIGhhbmRsZXMgbXVsdGlwbGUgbmFtZXMKCW9uIHRoZSBjb21tYW5kIGxpbmUsIGluc2VydGluZyBlYWNoIG9uZSBpbiBvcmRlci4gIEl0IGFsc28KCWJsb3dzIGF3YXkgY2FjaGVkIGxpbmUgYW5kIGZ1bGxfZmlsZW5hbWUgaW5mby4KCgkqIHN0YWNrLmMgKGJhY2t0cmFjZV9jb21tYW5kKTogIFNraXAgIm1vcmUgc3RhY2sgZnJhbWVzIGZvbGxvdyIKCXVubGVzcyBpbnRlcmFjdGl2ZS4KCgkqIENoYW5nZSAjaWZuZGVmIEhBVkVfVlBSSU5URiB0byAjZGVmaW5lIE1JU1NJTkdfVlBSSU5URiBpbgoJeG0tY29udmV4LmgsIHhtLWhwMzAwYnNkLmgsIHhtLWlzaS5oLCB4bS1tZXJsaW4uaCwgeG0tbmV3cy5oLCAKCXhtLW5wMS5oLCB4bS1wbi5oLCB4bS1weXIuaCwgeG0tc3ltbWV0cnkuaCwgeG0tdW1heC5oLCB4bS12YXguaC4KCVRoZSBvbmx5IG9kZCBvbmUgd2FzIEdvdWxkIE5QMSwgd2hpY2ggaGFkIGRlZmluZWQgdnByaW50ZiB0bwoJInByaW50ZiIhISEKCgkqIE1lcmdlIFRlZCBHb2xkc3RlaW4gPHRlZGdARW5nLnN1bi5jb20+J3MgY2hhbmdlcyBmb3IgZXBvY2guCglwcmludGNtZC5jIChwcmludF9jb21tYW5kXzEpOiBQYXNzICdpbnNwZWN0JyBmbGFnIGRvd24gYXMgYSBnbG9iYWwKCXZhcmlhYmxlLCBpbnNwZWN0X2l0LgoJdmFscHJpbnQuYyAocHJpbnRfc3RyaW5nLCB2YWxfcHJpbnQpOiBVc2UgdGhlIGdsb2JhbCBpbnNwZWN0X2l0Cgl0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIHByaW50IGluIEVwb2NoIHN0eWxlIG9yIG5vcm1hbCBzdHlsZS4JCgpNb24gT2N0ICAxIDIzOjU1OjI2IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJKiBwcmludGNtZC5jIChjYWxsX2NvbW1hbmQpOiAgYWRkIGFuIGFsaWFzIGZvciB0aGUgInByaW50IiBjb21tYW5kCgl3aGljaCBydW5zIGV4cHJlc3Npb25zIGFuZCBkb2Vzbid0IHByaW50IHRoZSByZXN1bHQgaWYgdm9pZC4KCShwcmludF9jb21tYW5kXzEpOiBpbXBsZW1lbnQgaXQuCgoJKiBjb21tYW5kLmM6IFJlbW92ZSAjaWYgMCdkIGNvZGUuICBJbml0aWFsaXplIGFsbCB0aGUgZmllbGRzCglpbiBhZGRfY21kICgpLiAgUmVuYW1lIGRvX25vdGhpbmdfY29tbWFuZCB0bwoJbm90X2p1c3RfaGVscF9jbGFzc19jb21tYW5kLCBhbmQgbWFrZSBpdCBleHRlcm5hbGx5IHZpc2libGUuCgljb21tYW5kLmg6IGFkZCB1c2VyX2NvbW1hbmRzIHRvIHN0cnVjdC4KCSogbWFpbi5jIChkZWZpbmVfY29tbWFuZCk6ICBEb24ndCBvdmVybG9hZCBjLT5mdW5jdGlvbiB3aXRoIGEgY2hhcgoJc3RyaW5nIGFzIHdlbGwgYXMgYSBmdW5jdGlvbiBwb2ludGVyLgoKCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgUmVpbnN0YWxsIHRpZW1hbm4gY2hhbmdlcyB0bwoJY2FsbGluZyBjb252ZW50aW9uIG9mIHZhbHVlX3N0cnVjdF9lbHQgKCkgdGhhdCBnb3QgZHJvcHBlZCBpbgoJbWVyZ2UuCgoJKiB0bS1zcGFyYy5oIChGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiAgbW92ZSB0byBzcGFyYy14ZGVwLmMuCglzcGFyYy10ZGVwLmMgKHNwYXJjX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6ICBkaXR0by4KCgkqIHRtLXNwYXJjLmggKFBPUF9GUkFNRSk6IHJlcGxhY2Ugc29tZSBjb25zdGFudHMgd2l0aCBkZWZpbmVzLgoKCSogc3BhcmMteGRlcC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgZGVmZXIgc3RvcmVzIHRvIHJlZ3MKCXVudGlsIGEgZ29vZCB0aW1lIChlLmcuIHdoZW4gd2UgYXJlIGFib3V0IHRvIHJ1biB0aGUgY2hpbGQpLAoJc2F2aW5nIHB0cmFjZSBjYWxscy4KICAgIAkqIGluZnJ1bi5jIChwcm9jZWVkKTogIGhhbmRsZSBET19ERUZFUlJFRF9TVE9SRVMuCgkqIHRtLXNwYXJjLmg6IGRlZmluZSBET19ERUZFUlJFRF9TVE9SRVMuCgoJKiBzcGFyYy14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IHdoZW4gc3RvcmluZyBmbG9hdAoJcmVnaXN0ZXJzLCBkb24ndCBzdG9yZSBzdGFjayByZWdzIHRvby4gIFdoZW4gc3RvcmluZyB0aGUgU1AsCglob3dldmVyLCBETyBzdG9yZSB0aGUgc3RhY2sgcmVncyB0b28uICBUaGlzIGZpeGVzIGEgYnVnIGluIHdoaWNoCgl0aGUgZHVtbXkgZnJhbWUgaXMgbm90IHJlY29nbml6ZWQgd2hlbiBhIGNhbGxfZnVuY3Rpb24gZmluaXNoZXMsCgliZWNhdXNlIGl0cyBmcmFtZSBwb2ludGVyIChpbiB0aGUgc3RhY2sgcmVncykgd2FzIG5ldmVyCglpbml0aWFsaXplZC4KCShyZWFkX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBNYXJrIFdJTSBhbmQgVEJSIGFuZCBGUFMgYW5kIENQUyB2YWxpZAoJZXZlbiB0aG91Z2ggd2UgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGVtIGZyb20gYW4gaW5mZXJpb3IuCgl2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbik6ICBDb21tZW50IGFib3V0IHN0b3JpbmcgU1AuCgoJKiBpbmZydW4uYyAoc2F2ZV9pbmZlcmlvcl9zdGF0dXMpOiBTYXZlIGF3YXkgdGhlIG9yaWdpbmFsIGJwc3RhdAoJY2hhaW4gc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyLiAgSW5zdGFsbCB0aGUgY29waWVkIHZlcnNpb24gZm9yCgl1c2UgYnkgd2hvZXZlciBzYXZlZCB0aGUgc3RhdHVzLiAgSXQgd2lsbCBiZSBibG93IGF3YXkgYnkKCXJlc3RvcmVfaW5mZXJpb3Jfc3RhdHVzLCBhbmQgdGhlIG9yaWdpbmFsIGNoYWluIHJlc3RvcmVkLiAgVGhpcyBpcwoJaW1wb3J0YW50IGZvciBwZW9wbGUgd2hvIGhhdmUgcG9pbnRlcnMgaW50byB0aGUgb3JpZ2luYWwuCgoJKiBicmVha3BvaW50LmMsIGNvbW1hbmQuaCwgY29weWluZy5hd2ssIGRieHJlYWQuYywgZGVmcy5oLAoJZmluZHZhci5jLCBmcmFtZS5oLCBvYnN0YWNrLmgsIG9ic3RhY2suYywgaW5mbG93LmMsIHZhbHVlLmgsCgltYWluLmMsIHByaW50Y21kLmMsIHNwYXJjLXRkZXAuYywgc3ltdGFiLmMsIHZhbHByaW50LmM6IGxpbnQKCgpGcmkgU2VwIDI4IDIwOjMyOjQ2IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQoKCSogTWFrZWZpbGUuZGlzdDogUm9sbCB2ZXJzaW9uIHRvIDMuOTEuOC4gIEFkZCBiZmQuaCBhbmQgYmZkY29uZmlnLmgKCXRlbXBvcmFyaWx5IHRvIHRoZSBtYWtlZmlsZS4gIEFkZCBhbTI5ay1vcGNvZGUuaCBhbmQgV0hBVFMuTkVXLgoJQWRkIHN0dWZmLmMgYW5kIGtkYi1zdGFydC5jIHRvIHRoZSBPVEhFUlMgbGlzdCBmb3IgdGFyIGZpbGVzLgoKRnJpIFNlcCAyOCAxOToxMjoxMiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogTWVyZ2UgTWlrZSBUaWVtYW5uJ3MgbXVsdGlwbGUgaW5oZXJpdGFuY2UgY2hhbmdlcyBmcm9tIFN1bi4KCVN0b3JlIHRoZSBiYXNlY2xhc3NlcyBpbiBhIHR5cGUgc3RydWN0IHN0YXJ0aW5nIGZyb20gYXJyYXkgZWxlbWVudAoJMCByYXRoZXIgdGhhbiBmcm9tIHRoZSB1bnVzdWFsIGFycmF5IGVsZW1lbnQgMS4KCglkYnhyZWFkLmM6IHRoZSBhYm92ZS4KCSh2aXJ0dWFsX2NvbnRleHQpOiBBZGQKCVJlYWQgbmV3IGRlYnVnIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKCWEgdmlydHVhbCBmdW5jdGlvbiBpcyBmcm9tLCBhbmQgc3RvcmUgaXQgaW4gZm5fZmllbGQuZmNvbnRleHQuCgkKCXN5bXRhYi5oOiBBZGQgZmNvbnRleHR0LiAgRml4IGJhc2VjbGFzcyBpbmRpY2VzLiAgVHlwbyBpbgoJVFlQRV9GTl9GSUVMRF9TVEFUSUNfUC4KCglzeW10YWIuYzogdGhlIGFib3ZlLgoJdmFsb3BzLmM6IHRoZSBhYm92ZS4gIEhhbmRsZSBwb2ludGVyIGNhc3RzIG9mIG9iamVjdCAqJ3MuCgkoc2VhcmNoX3N0cnVjdF9tZXRob2QpOiBBZGQuCgkodmFsdWVfc3RydWN0X2VsdCk6IEZpcnN0IGFyZyBpcyBub3cgYSBwb2ludGVyIHRvIGEgdmFsdWUsIGFuZCBpcwoJbW9kaWZpZWQgb24gcmV0dXJuLgoKCXZhbHByaW50LmM6IHRoZSBhYm92ZS4KCXZhbHVlcy5jICh2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkKTogQWRkIHR5cGUgYXJnLiAgSGFuZGxlCglvZmZzZXR0aW5nIHRvIHRoZSBwcm9wZXIgb2JqZWN0IHdoZW4gY2FsbGluZyB2aXJ0dWFsIGZucy4KCVRoZSBhYm92ZS4KCShiYXNlY2xhc3NfYWRkcik6IEFkZCB2YWx1ZXAgYXJnLgoKCSogUkVBRE1FOiAgRG9jdW1lbnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgQkZEIGNvbmZpZyAobWlzc2luZykuCgkqIFRPRE8sIENoYW5nZUxvZywgTWFrZWZpbGUuZGlzdDogUm9sbCB2ZXJzaW9uLgoJKiBXSEFUUy5ORVc6IEFkZCBzdW1tYXJ5IG9mIGNoYW5nZXMgc2luY2UgMy41LgoKVGh1IFNlcCAyNyAxNjoyMzoxMiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogQ2xlYXIgYml0IHZlY3RvcnMgd2hlbmV2ZXIKCXdlIGFsbG9jYXRlIG9uZS4KCXN5bXRhYi5jIChCX0NMUkFMTCk6IGRlZmluZS4KCgkqIHRtLXNwYXJjLmggKFNUT1JFX1JFVFVSTl9WQUxVRSk6IEF2b2lkIGNsb2JiZXJpbmcgdHlwZXMgYnkKCXVzaW5nID09IHJhdGhlciB0aGFuID0uICBIdWguLi4gIFRoaXMgZml4ZXMgdGhlIGRyZWFkZWQgcHJvYmxlbQoJd2hlcmVpbiBidWlsdGluX3R5cGVfaW50IGJlY29tZXMgVFlQRV9DT0RFX0ZMVC4KCgkqIGNvcmUuYyAoaW5mb19maWxlcyk6IFNob3cgdGhlIGluZmVyaW9yIHBpZC4KCgkqIGNvbmZpZy5nZGI6IEF2b2lkIHB1dHRpbmcgImRpciIgY29tbWFuZCBpbnRvIC5nZGJpbml0LiAgR0RCCglhbHJlYWR5IGtub3dzIGhvdyB0byBsb29rIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgoKCSogUmVtb3ZlIHBzeW10YWIgaGFpciBmcm9tIG1hbnkgcGxhY2VzLiAgUmVtb3ZlIGR1cGxpY2F0ZWQgY29kZQoJZm9yIHNlYXJjaGluZyBzeW1ib2wgdGFibGVzLiAgSGlkZSBwc3ltdGFicyBmcm9tIG1vc3QgcGxhY2VzLgoJTWFrZSBpdCBmYXN0IHRvIGdldCBmcm9tIGEgcHN5bXRhYiB0byBpdHMgc3ltdGFiLgoKCWJsb2NrZnJhbWUuYyAoYmxvY2t2ZWN0b3JfZm9yX3BjKTogUmVtb3ZlIHBzeW10YWIgaGFpci4KCWNvZmZyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogUmVuYW1lIHRvIHBzeW10YWJfdG9fc3ltdGFiMi4KCW1pcHNyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogUmVuYW1lIHRvIHBzeW10YWJfdG9fc3ltdGFiMi4KCWRieHJlYWQuYzogZXhwb3J0IHBzeW10YWJfdG9fc3ltdGFiLCBtYWtlIGl0IHdvcmsgaWYgY2FsbGVkIE4gdGltZXMuCgkocHN5bXRhYl90b19zeW10YWIpOiBSZW5hbWUgdG8gcHN5bXRhYl90b19zeW10YWIyLiAgSW5pdGlhbGl6ZQoJbmV3IHN5bXRhYiBjb21wbGV0ZWx5LiAgTmV3IHBzeW10YWJzIGdldCBzeW10YWIgcG9pbnRlcgoJaW5pdGlhbGl6ZWQgdG8gemVyby4gIFJlbW92ZSBNSSB3YXJuaW5nIHByaW50Zi4gIAoJc3ltdGFiLmg6IENvbW1lbnRzLiAgQWRkIHBzeW10YWIgdG8gc3ltdGFiIHBvaW50ZXIuCgkoUFNZTVRBQl9UT19TWU1UQUIpOiBOZXcgbWFjcm8uCglzeW10YWIuYzogdXNlIFBTWU1UQUJfVE9fU1lNVEFCLiAgQWRkIHBzeW10YWJfdG9fc3ltdGFiIGFuZCBleHBvcnQgaXQuCglzb3VyY2UuYzogdXNlIFBTWU1UQUJfVE9fU1lNVEFCLiAgUmVtb3ZlIHN5bXRhYiB2ZXJzaW9uIGFuZAoJY29tcGlsYXRpb24gZmllbGRzLgoJc3RhY2suYyAoYmFja3RyYWNlX2NvbW1hbmQpOiBBdm9pZCBwcmUtcGFzcyB0byByZWFkIHN5bWJvbHMsIGlmCgl2ZXJib3NlIGlzIG5vdCBzZXQuCgkocHJpbnRfZnJhbWVfaW5mbyk6IEF2b2lkIHNwZWNpYWwtY2FzaW5nIHN5bWJvbHMgdGhhdCBoYXZlIG5vdCB5ZXQKCWJlZW4gcmVhZCBpbi4KCgkqIHNvdXJjZS5jIChvcGVuX3NvdXJjZV9maWxlKTogUXVpY2sgcGF0aCBpZiB3ZSBoYXZlIGFscmVhZHkKCWxvY2F0ZWQgdGhlIHNvdXJjZSBmaWxlIGJ5IGl0cyBmdWxsIG5hbWUuCgoJKiBzeW10YWIuYyAobG9va3VwX3N5bWJvbCk6IFVzZSBmaW5kX3BjX3N5bXRhYiByYXRoZXIgdGhhbgoJZmluZF9wY19wc3ltdGFiLiAgV2hlbiBhIG5hbWUgaXMgZm91bmQgaW4gdGhlIG1pc2MgZnVuY3Rpb24KCXZlY3Rvciwgc2VhcmNoIHRoZSBzeW1ib2wgdGFibGUgZm9yIGl0cyBtYW5nbGVkIG5hbWUsIG5vdCB0aGUKCW5hbWUgdGhhdCB0aGUgdXNlciB0eXBlZC4KCgkqIGJmZC5oOiBGaXggbWlzc2luZyBjb21tZW50IHRlcm1pbmF0b3JzLCBtYWtlICNlbmRpZnMgbWF0Y2guCgoJKiB2YWxhcml0aC5jICh2YWx1ZV9sZXNzKTogSGFuZGxlIHVuc2lnbmVkIGludCBjb21wYXJpc29ucy4KCUFkZCBGSVhNRSBhYm91dCBwb2ludGVyIGNvbXBhcmVzLCB3aGljaCBhc3N1bWUgaG9zdCBhbmQgdGFyZ2V0Cglwb2ludGVycyBhcmUgdGhlIHNhbWUuCgoJKiBjb21tYW5kLmMgKGRvX25vdGhpbmdfY29tbWFuZCk6IGxpbnQKCWRieHJlYWQuYzogbGludC4gIFJlbW92ZSBzb3J0X3N5bXMuICBEb2N1bWVudCBDKysgdmlzaWJpbGl0eSBpbmZvLAoJZml4IGNvbW1lbnRzIG9uIGRlYnVnIHN5bWJvbCBmb3JtYXQgZm9yIHZpc2liaWxpdHkuICBBY3R1YWxseSBzZXQKCXZpc2liaWxpdHkgb2Ygc3ltYm9scy4KCW1haW4uYyAoZWNob19jb21tYW5kKTogbGludDsgdXNlIDxyZWFkbGluZS9oaXN0b3J5Lmg+LgoJdG0tc3BhcmMuaCAoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogbGludAoJb2JzdGFjay5oIChfb2JzdGFja19ibGFuayk6IFJlYXJyYW5nZSBwb2ludGVyIG1hdGggdG8gYXZvaWQKCXBvaW50aW5nIHBhc3QgZW5kIG9mIGFsbG9jYXRlZCBtZW1vcnk7IHNhYmVyIGNvbXBsYWlucy4KCW9ic3RhY2suaDogRGVjbGFyZSB0aGUgZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgd2UgdXNlLgoJdmFsYXJpdGguaDogdXNlIDxzdHJpbmcuaD4KCXNvbGliLmMgKHNvbGliX2FkZCk6IGxpbnQuCgpGcmkgU2VwIDIxIDE3OjA1OjE5IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6ICBEZWZhdWx0IGluZm9fdmVyYm9zZSB0byBvZmYsIG5vdyB0aGF0CglzeW1ib2wgcmVhZGluZyBpcyBmYXN0LgoJKHF1aXRfY29tbWFuZCk6ICBBdm9pZCBjbG9iYmVyaW5nIGV4ZWNfYmZkIHdoaWxlIHF1aXR0aW5nLgoKCSogSW5pdGlhbCBCRkQgKGJpbmFyeSBmaWxlIGRpZGRsaW5nIGxpYnJhcnkpIG1lcmdlcjoKCWNvZmZyZWFkLmM6IENoYW5nZSBBT1VUSERSIHRvIHN0cnVjdCBleGVfaGRyLgoJZGJ4cmVhZC5jOiBkaXR0by4KCWNvcmUuYzogaW5pdGlhbGl6ZSBpbml0aWFsaXplZCBkYXRhIGF0IGNvbXBpbGUgdGltZS4KCShjb3JlX2ZpbGVfY29tbWFuZCk6ICBNb3ZlIGZyb20gY29yZWRlcC5jLCBjb252ZXJ0IHRvIGJmZC4KCSh4ZmVyX2NvcmVfZmlsZSk6IENvbnZlcnQgdG8gYmZkLgoJZXhlYy5jIChleGVjX2ZpbGVfY29tbWFuZCk6IHVzZSBiZmQgcm91dGluZXMuCglnZGJjb3JlLmg6IEJGRC4KCW1pcHMtdGRlcC5jOiBSZW1vdmUgZXhlY19maWxlX2NvbW1hbmQgYW5kIGZyaWVuZHMuCglzb3VyY2UuYzogYmZkLgoJCgkqIGNvcmVkZXAuYzogKGZldGNoX2NvcmVfcmVnaXN0ZXJzKSBDb252ZXJ0IGNvcmVfZmlsZV9jb21tYW5kIHRvCglmZXRjaF9jb3JlX3JlZ2lzdGVycy4KCW1pcHMteGRlcC5jLCBzcGFyYy14ZGVwLmMsIHN1bjMteGRlcC5jOiBkaXR0by4KCQoJKiB1dGlscy5jOiAoZXJyb3IpOiBCb2d1cyBjcmFwLCBGSVhNRSwgdG8gcHJpbnQgYmZkIGVycm9ycy4KCShteV9iZmRfcmVhZCk6IE1vcmUgYm9nb3NpdHksIHdoaWNoIEkgZG9uJ3QgdGhpbmsgd2UgY2FsbC4KCShwcm9ncmFtX25hbWUpOiBSZW1vdmUgdGhpcyBhdHJvY2l0eSBhc2FwIQoKV2VkIFNlcCAxOSAxMzozNjo0MSAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogRnJvbSBQZXIgQm90aG5lcjoKCXZhbHVlcy5jOiBhbGxvY2F0ZV9yZXBlYXRfdmFsdWUgd2FzIG5vdCBjbGVhcmluZyB0aGUKCW9wdGltaXplZF9vdXQgZmllbGQuCgkodmFsdWVfc3RhdGljX2ZpZWxkKTogbWlub3Igc3R5bGlzdGljIGZpeCAod3JvbmcgbWFjcm8gd2FzIHVzZWQpLgoJdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHRfZm9yX2FkZHJlc3MpOiBkaWRuJ3Qgd29yayBmb3IgQysrCglzdGF0aWMgZmllbGRzLgoKCSogc2lnbmFtZS5jIChfaW5pdGlhbGl6ZV9zaWduYW1lKTogIEluaXRpYWxpemUgc2lnbmFsIG5hbWVzIG9uY2UuCgoJKiBicmVha3BvaW50LmgsIGNvbW1hbmQuYywgY29weWluZy5hd2ssIGRlZnMuaCwgZW52aXJvbi5jLAoJZXhlYy5jLCBmcmFtZS5oLCBpbmZjbWQuYywgaW5mZXJpb3IuaCwgbWFpbi5jLCBtdW5jaCwgc3VuMy14ZGVwLmMsCglzeW10YWIuaCwgdG0tMjlrLmgsIHZhbHByaW50LmMsIHZhbHVlLmgsIHZhbHVlcy5jOiAgTGludC4KCgkqIHJlbW90ZS1lYi5jOiAgU3VwcG9ydCB1c2VyLXNldHRhYmxlIGJhdWQgcmF0ZXMgb24gdGhlIHNlcmlhbCBwb3J0LgoKCSogdG0tc3VuMy5oIChQUkVQQVJFX1RPX1NUT1JFKTogZml4IHR5cG8uCgpGcmkgU2VwIDE0IDEzOjI4OjI5IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJKiB0Y29uZmlnL3N1bjNvczQ6IFJlbW92ZSB3YXJuaW5nIGFib3V0IG5hdGl2ZSBhc3NlbWJsZXIsCglzaW5jZSBpdCBhbHNvIG9jY3VycyBpbiB0aGUgeGNvbmZpZyBmaWxlLgoKCSogZmluZHZhci5jIChyZWdpc3RlcnMpOiBBbGxvY2F0ZSBzb21lIHNsb3AgYWZ0ZXIgYHJlZ2lzdGVycycKCXRvIHByZXZlbnQgc3RyYXkgYWNjZXNzZXMgZnJvbSB0cmFzaGluZyB0aGUgbmV4dCB2YXJpYWJsZS4KCgkqIHRtLTY4ay5oIChSRUdJU1RFUl9CWVRFUyk6ICBBbGxvY2F0ZSB0aGUgcmlnaHQgbnVtYmVyIG9mIGJ5dGVzCglvbiB0aGUgc3VuLTMsIGJ5IGNoYW5naW5nIHRoZSAjaWZkZWYgZnJvbSBgc3VuMycgKHdoaWNoIGlzIG5vdAoJZGVmaW5lZCBieSBjYykgdG8gYHN1bicuICBTeW1wdG9tIHdhcyB0cmFzaGVkIGJ1aWx0aW5fdHlwZV9YWFgKCXZhcnMsIHdoaWNoIGhhcHBlbmVkIHRvIGZvbGxvdyBgcmVnaXN0ZXJzJyBpbiB0aGUgZXhlY3V0YWJsZS4KCgkqIHJlYWRsaW5lL2hpc3RvcnkuYyAoaGlzdG9yeV9zZWFyY2gpOiBIZWVkIGdjYy0yJ3MgYWR2aWNlCglhbmQgcGFyZW50aGVzaXplICYmIGluc2lkZSB8fCkuCgoJKiBhbTI5ay1vcGNvZGUuaCwgYW0yOWstcGluc24uYywgYW0yOWstdGRlcC5jLCByZW1vdGUtZWIuYywKCXRtLTI5ay5jOiAgSW5zZXJ0IEZTRiBjb3B5cmlnaHQgaGVhZGVycy4KCgkqIHJlbW90ZS1lYi5jOiAgQmV0dGVyIGNvbW1lbnRzLgoKCSogTWFrZWZpbGUuZGlzdDogIFVwZGF0ZSB0byAzLjkxLjYuCgkqIFRPRE86IG5vdGUgUFJFUEFSRV9UT19TVE9SRSBwcm9ibGVtLgoKVGh1IFNlcCAxMyAwOTo1MjozMyAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50KQoKCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6IE9ubHkgdXNlIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyBpZiBkZWZpbmVkLgoKCSogcmVtb3RlLmM6ICBXcmFwIHRoZSB3aG9sZSBmaWxlIGluICNpZiAhZGVmaW5lZCAoU1BFQ0lBTF9SRU1PVEUpLgoKCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yLCBhdCBlbmQpOiBEb24ndCBzZXQgdXAKCXByZXZfKiBpZiB0aGUgaW5mZXJpb3Igbm8gbG9uZ2VyIGV4aXN0cy4KCgkqIGluZmVyaW9yLmggKENBTExfRFVNTVlfTE9DQVRJT04pOiBOZXcgbWFjcm8sIHRvIHJlcGxhY2UKCUNBTk5PVF9FWEVDVVRFX1NUQUNLLgoJdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pOiBVc2UgaXQuCgoJKiB0bS1jb252ZXguaDogQWRkIENBTExfRFVNTVlfTEVOR1RIIGZvciB1c2UgYnkgUENfSU5fQ0FMTF9EVU1NWS4KCgkqIGluZmVyaW9yLmggKFBDX0lOX0NBTExfRFVNTVkpOiBOZXcgbWFjcm8uCglpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IsIDIgcGxhY2VzKTogVXNlIGl0LgoKCSogdmFsdWVzLmMgKHZhbHVlX2JlaW5nX3JldHVybmVkKTogT25seSB1c2UKCUVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MgaWYgZGVmaW5lZC4KCgkqIE1vdmUgUFJFUEFSRV9UT19TVE9SRSBmcm9tIHhtLXN1bjMuaCB0byB0bS1zdW4zLmggdG8gZG8gdGhlCglyaWdodCB0aGluZyBmb3IgcmVtb3RlLWViLmMuICAKCgkqIHN1bjMteGRlcC5jOiAgUmVtb3ZlIGV4dHJhbmVvdXMgY2FsbCB0byByZW1vdGVfc3RvcmVfcmVnaXN0ZXJzLgoJKiBzdW4zODYteGRlcC5jLCBocDMwMGhwdXgteGRlcC5jLCBzcGFyYy14ZGVwLmM6ICBEaXR0by4KCgkqIGJsb2NrZnJhbWUuYzogIFB1dCBnZXRfZnJhbWVfc2F2ZWRfcmVncyBpbnNpZGUgI2lmICFkZWZpbmVkCgkoRlJBTUVfRklORF9TQVZFRF9SRUdTKS4KCgkqIGZpbmR2YXIuYyAoe2ZldGNoLHN0b3JlfV9yZWdpc3RlcnMpOiBDaGVjayBmb3IKCVJFTU9URV97RkVUQ0hfU1RPUkV9X1JFR0lTVEVSIG1hY3JvLgoKCSogZmluZHZhci5jIChnZXRfc2F2ZWRfcmVnaXN0ZXIpOiBBZGQgYXJndW1lbnQgbHZhbCBhbmQKCWNoYW5nZSBtZWFuaW5nIG9mIGFyZ3VtZW50IGFkZHIuCglmaW5kdmFyLmM6ICBDaGFuZ2UgY2FsbHMgdG8gZ2V0X3NhdmVkX3JlZ2lzdGVyIHRvIHJlZmxlY3QKCW5ldyBjYWxsaW5nIGNvbnZlbnRpb24uCgl2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogVXNlIGdldF9zYXZlZF9yZWdpc3RlciBpbnN0ZWFkIG9mCglmaW5kX3NhdmVkX3JlZ2lzdGVyLgoKU3VuIFNlcCAgMiAxMjo0MDoyMCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCgoJKiBjb2ZmcmVhZC5jIChyZWFkX29uZV9zeW0pOiBNYWtlIHRlbXBfYXV4IGFuIEFVWEVOVCwgbm90CglhbiAodW5pbml0aWFsaXplZCkgcG9pbnRlciB0byBvbmUuICBVc2UgIiYiIHdoZW4gcGFzc2luZyBpdAoJdG8gZnJlYWQuCgpGcmkgQXVnIDMxIDIyOjU3OjU0IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKCgkqIGNvZmZyZWFkLmMgKGdldGZpbGVuYW1lKTogVXNlIERHVVggeF9vZmZzZXQgYW5kIHhfbmFtZSBpZgoJZGVmaW5lZC4KCgkqIGNvZmZyZWFkLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBQdXQgc2VtaWNvbG9uIGFmdGVyCgkiaW50IGZyb21fdHR5Ii4KCVB1dCBzYWZlX3RvX2luaXRfdGRlc2NfY29udGV4dCBpbiAjaWYgZGVmaW5lZCAoVERFU0MpLgoJUHV0ICNpZmRlZiBUREVTQ3MgaW4gMXN0IGNvbHVtbiBmb3Igbm9uLUFOU0kgY3BwJ3MuCgljb2ZmcmVhZC5jOiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4uCgkocmVhZF9jb2ZmX3N5bXRhYik6IFR5cG86IGluX3NvdXJjZV9maWxlcyAtPiBpbl9zb3VyY2VfZmlsZS4KCUFkZCBtaXNzaW5nICcpJyBpbiBjaGVjayBmb3IgImxjJSIgYW5kIGZyaWVuZHMuICBSZW1vdmUKCWV4dHJhbmVvdXMgJ30nLgoJRGVjbGFyZSByZWFkX29uZV9zeW0oKSBhdCB0b3Agb2YgZmlsZS4KCShyZWFkX2ZpbGVfaGRyKTogUHV0IGluIGV4dHJhICNpZmRlZnMgc28gTUM2OE1BR0lDIGFuZAoJTUM2OFdSTUFHSUMgY2FuIGhhdmUgdGhlIHNhbWUgdmFsdWUgd2l0aG91dCBjYXVzaW5nIGEgZHVwbGljYXRlCgljYXNlLgoKVGh1IFNlcCAxMyAxNTo1NTozNiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogQWxsb3cgYSBNYWtlZmlsZSB0byBiZSBidWlsdCB3aXRob3V0IGJ1aWxkaW5nIHRoZQoJdG0gYW5kIHhtIGZpbGUgbGlua3MgdGhhdCBzY3JldyB1cCBidWlsZHMgaW4gc3ViZGlyZWN0b3JpZXMuCglUaGlzIGlzIGRvbmUgd2l0aCBgY29uZmlnLmdkYiBub25lJywgdGhlbiB5b3UgY2FuIGRvIHRoaW5ncwoJbGlrZSBgbWFrZSBnZGIudGFyLlonLgoJKiB0Y29uZmlnL25vbmU6IENvbmZpZyBmaWxlIGZvciBubyB0YXJnZXQgc3lzdGVtCgkqIHhjb25maWcvbm9uZTogQ29uZmlnIGZpbGUgZm9yIG5vIGhvc3Qgc3lzdGVtCgkqIGNvbmZpZy5nZGI6IElmIG5vIFRNIG9yIFhNIGZpbGVzIGFyZSBjYWxsZWQgb3V0IGJ5IHRoZQoJaG9zdCBvciB0YXJnZXQgZmlsZSwgZG9uJ3QgbWFrZSBsaW5rcyBmb3IgdGhlbS4KCgkqIGNwbHVzLWRlbS5jOiBBZGQgZG9jdW1lbnRhdGlvbi4KCgkqIGRieHJlYWQuYyAocmVhZF9vZmlsZV9zeW10YWIpOiBUdXJuIGEgZmF0YWwgZXJyb3IgaW50byBhCglzaW1wbGUgZXJyb3IsIHNvIHRoZSB1c2VyJ3MgZ2RiIGRvZXNuJ3QgY3Jhc2ggZHVlIHRvIHNvbWUgb2JqZWN0CglmaWxlIHByb2JsZW0gKGUuZy4gc29tZWJvZHkgaXMgcmVidWlsZGluZyB0aGUgZmlsZSBvdXQgZnJvbSB1bmRlcgoJZ2RiKS4KCgkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3Nfc3ltYm9saWMpOiBkZW1hbmdsZSB0aGUgc3ltYm9sLgoKCSogTWFrZWZpbGUuZGlzdCAoT1RIRVJTKTogUmVtb3ZlIHRkZXNjLWxpYiBiZWNhdXNlIGl0IGhhcyAKCU1vdG9yb2xhIGNvcHlyaWdodHMgaW4gaXQuICBNYWtlICJtYWtlIGdkYi50YXIuWiIgd29yay4KCShhbGxkZXBzLm1hayk6IHNvcnQgYW5kIHVuaXEgYWxsIHJlc3VsdHMgZnJvbSB0aGlzOyBkdXBsaWNhdGVzCglob3NlIGdkYi50YXIuWiBsaW5rIGJ1aWxkaW5nLiAgUmVtb3ZlIFJDUyBmaWxlcyBmcm9tCgl0Y29uZmlnIGFuZCB4Y29uZmlnLiAgQWRkIGNvbmZpZyBmaWxlcyBmb3Igc3VuMzg2LiAgQWRkCglhIGZldyBvZGQgZmlsZXMgdG8gT1RIRVJTIGFuZCBIRklMRVMuCgpNb24gU2VwIDEwIDIxOjIwOjI0IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJKiBNYWtlZmlsZS5kaXN0OiBQdWxsIHNvbGliLmMgdG8gdGNvbmZpZy9zdW4/b3M0LgoJUm9sbCB2ZXJzaW9uIG51bWJlciB0byAzLjkxLjUuICBNYWtlIGxpbnQgd29yayBpbiBiaW5kaXIuCgoJKiBSRUFETUU6ICBEb2N1bWVudCBjcm9zcy1kZWJ1Z2dpbmcgYW5kIG5ldyBmaWxlIHN0cnVjdHVyZS4KCgkqIGJsb2NrZnJhbWUuYzogTGludC4gIEluY2x1ZGUgInZhbHVlLmgiIHRvIGRlY2xhcmUgcmVhZF9yZWdpc3Rlci4KCShmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24pOiByZW1vdmUgZHVwbGljYXRlIGxpbmUuCgoJKiBjb21tYW5kLmg6IExpbnQuICBEZWNsYXJlIGVycm9yX25vX2FyZyBhbmQgZG9udF9yZXBlYXQuCgoJKiB0bS1uZXdzLmg6IFJlbW92ZSBpbmFkdmVydGVudGx5IGR1cGxpY2F0ZWQgc3R1ZmYuCgoJKiBtaXBzcmVhZC5jOiBSZW1vdmUgY2FjaGVfcGNfZnVuY3Rpb24gc3R1ZmYsIG5vdyBkb25lIGNsZWFubHkuCglDbGVhbiB1cCB1c2FnZSBvZiBtaXNjX2Z1bmN0aW9uX3R5cGUuICBEZWNsYXJlIHNvbWUgQ09SRV9BRERScy4KCgkqIGNvbmZpZy5nZGI6IEFsbG93IGBjb25maWcuZ2RiIGhvc3QgdGFyZ2V0JyBmb3JtLiAgQ2xlYW4KCXVwIHByZXZpb3VzIGNoYW5nZSB0aGF0IHByaW50ZWQgYm9ndXMgbWVzc2FnZXMgd2hlbiB5b3UganVzdCBzYWlkCglgY29uZmlnLmdkYicuCgoJKiBjb3JlLmM6ICNpbmNsdWRlICJjb21tYW5kLmgiIGZvciBsaW50LgoJKiBkYnhyZWFkLmM6IGxpbnQKCSogZXZhbC5jOiBsaW50CgkqIG1haW4uYzogUmVtb3ZlIHNvbWUgY2FzdHMgb2YgZW51bXMuICBMaW50LgoJKiBzb3VyY2UuYzogbGludAoJKiBzeW10YWIuYzogbGludAoJKiBzeW10YWIuaDogbGludAoJKiBleHByZWFkLnk6IGxpbnQKCSogdmFsYXJpdGguYzogbGludAoKCSogcHJpbnRjbWQuYyAoaW5pdGlhbGl6ZV9wcmludGNtZCk6IEZpeCB0aGlua28gaW4gaW5zcGVjdCBjbWQuCgkKCSogc3BhcmMtdGRlcC5jIChpc2FubnVsbGVkKTogVGFrZSBpbnN0cnVjdGlvbiBhcyBwYXJhbWV0ZXIsIGRvbid0CglyZWFkIGl0IGZyb20gbWVtb3J5LiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIHNhdmUgcHRyYWNlIGNhbGxzCglldmVudHVhbGx5LiAgIENoYW5nZWQgY2FsbGVyIHNpbmdsZV9zdGVwIHRvby4KCgkqIHNwYXJjLXhkZXAuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogQXZvaWQgcmVhZGluZyByZWdzCgl0aGF0IHdlIGFyZW4ndCBnb2luZyB0byB1c2UsIHNhdmluZyBtYW55IHB0cmFjZSBjYWxscywgZXNwZWNpYWxseQoJd2hlbiB3YXRjaHBvaW50aW5nIG9yIHNpbmdsZSBzdGVwcGluZy4gIFVzZSBzb21lICNkZWZpbmUncyBmb3IKCWNvbnN0YW50cy4KCShzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiBEaXR0by4KCShjb3JlX2ZpbGVfY29tbWFuZCk6IFVzZSBzb21lICNkZWZpbmUncyBmb3IgY29uc3RhbnRzLgoKCSogdG0tc3BhcmMuaDogQWRkICNkZWZpbmUncyBmb3Igc29tZSByZWdpc3RlciBudW1iZXJzLCBzbyB3ZQoJY2FuIGVsaW1pbmF0ZSB0aGUgdXNlIG9mIHJhbmRvbSBjb25zdGFudHMgaW4gc3BhcmMteGRlcC5jLgoKCSogc3RhY2suYyAoZnJhbWVfY29tbWFuZCwgcHJpbnRfZnJhbWVfaW5mbywgdXBfY29tbWFuZCwKCWRvd25fY29tbWFuZCkgUmVtb3ZlIGZyYW1lX2NoYW5nZWQsIHNpbmNlIGl0CgljYXVzZXMgYSBidWcgYW5kIGRvZXNuJ3Qgc2VlbSB0byBkbyBhbnl0aGluZyB1c2VmdWwuICBJbiBzb21lCglwbGFjZXMgaXQgd2FzIHVzZWQgYXMgYSBmbGFnLCBpbiBvdGhlcnMgYXMgYSBzdGFjayBsZXZlbCAoPykuCgoJKiB1dGlscy5jOiBVc2UgTUlTU0lOR19WUFJJTlRGIHJhdGhlciB0aGFuIEhBVkVfVlBSSU5URiwgc28gdGhlCglkZWZhdWx0IGlzIHRvIHVzZSB0aGUgcG9ydGFibGUgKHZwcmludGYpIHZlcnNpb24gcmF0aGVyIHRoYW4gdGhlCglrbHVkZ2UgdmVyc2lvbi4KCSogeG0tbmV3cy5oIChNSVNTSU5HX1ZQUklOVEYpOiBBZGQuCgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiBEZW1hbmdsZSBmYW5jeSB2dGJsIHByaW50b3V0cy4gIExpbnQuCgpTYXQgU2VwICA4IDAwOjI0OjEyIDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJKiBSZW1vdmUgc3R1ZmYgdGhhdCBmb3JjZXMgLUJzdGF0aWMgbGlua2luZyBvZiBnZGIsIGFuZCB3YXJuaW5ncwoJYWJvdXQgbGlua2luZyBkZWJ1Z2dlZCBwcm9ncmFtcyAtQnN0YXRpYyBpbiB0aGUgc3VuP29zNCBjb25maWcKCWZpbGVzIGluIHRjb25maWcgYW5kIHhjb25maWcgc3ViZGlyZWN0b3JpZXMuCgoJKiBtYWluLmMgKG1haW4pOiAgUmVtb3ZlIHVucmVhY2hlZCBleGl0KDApIG5vdyB0aGF0IHdlIGV4aXQKCXZpYSBxdWl0X2NvbW1hbmQoKS4KCgkqIENyZWF0ZSBUT0RPIGZpbGUgZm9yIG9ubGluZSBidWcgbGlzdC4gIFRoZXJlIGFyZSB0b28gbWFueQoJImxpdHRsZSIgYnVncyB0byBrZWVwIHRyYWNrIG9mIG9uIHBhcGVyLgoKCSogQ2hhbmdlIFByb2plY3RzIGZpbGUgdG8gcmVmZXIgdG8gYnVnLWdkYkBjeWdudXMuY29tCglyYXRoZXIgdGhhbiBraW5nZG9uQGFpLgoKRnJpIFNlcCAgNyAyMzozNToxNSAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogTWFrZWZpbGUuZGlzdCAoVkVSU0lPTik6IDMuOTEuNCBub3cuCgoJKiBzeW10YWIuYyAoaW5pdF9taXNjX2J1bmNoZXMpOiBSZW5hbWUgZnJvbSBpbml0X21pc2NfZnVuY3Rpb25zLgoJKGNvbmRlbnNlX21pc2NfYnVuY2hlcyk6IEFkZCBzYW5pdHkgY2hlY2sgdGhhdCBtaXNjX2NvdW50IGlzCgl0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIGJ1bmNoLgoJCgkqIGNvZmZyZWFkLmM6IHJlbmFtZSBpbml0X21pc2NfYnVuY2hlcy4gIFBhc3MgYW4gYXJndW1lbnQgCgl0byBjb25kZW5zZV9taXNjX2J1bmNoZXMgKGEgemVybykuCgoJKiBkYnhyZWFkLmMgKHBhcnRpYWxfc3ltYm9sX2ZpbGVfcmVhZCk6IENhbGwgaW5pdF9taXNjX2J1bmNoZXMKCWV2ZXJ5IHRpbWUgd2UgYXJlIGNhbGxlZDsgZG9uJ3QgcmVseSBvbiBvdXIgY2FsbGVyIHRvIGRvIGl0LgoJKGFkZF9maWxlKTogUmVtb3ZlIGNhbGwgdG8gaW5pdF9taXNjX2J1bmNoZXMuCgoJKiBtaXBzcmVhZC5jOiBPbmx5IHdhcm4sIGRvbid0IGVycm9yLCBpZiB1bmtub3duIHN5bWJvbCB0eXBlcy4KCVRoaXMga2VlcHMgYW4gb2xkIGdkYiBmcm9tIGZhbGxpbmcgb24gaXRzIGZhY2UgaWYgaXQgc2VlcyBuZXdseQoJZXh0ZW5kZWQgc3ltYm9sIGluZm8uICBSZW5hbWUgaW5pdF9taXNjX2J1bmNoZXMuCgpGcmkgU2VwICA3IDIyOjU4OjE1IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJKiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20gUGVyIEJvdGhuZXIgZm9yIERFQ3N0YXRpb25zIGFuZCBvdGhlcgoJTUlQUyBzdHVmZi4gIFRoZSByZXN0IGlzIEJvdGhuZXIgc3BlYWtpbmc6CgoJVGhlIG5leHQgbWVzc2FnZSBpcyBhIG1lcmdlciBvZiBBbGVzc2FuZG8gRm9yaW4ncyBtaXBzIHBvcnQgd2l0aAoJbWluZS4gIEkndmUgdHJpZWQgdG8gdXNlIG15IGdvb2QgaWYgYmlhc2VkIGp1ZGdtZW50IHRvIGdldAoJdGhlIGJlc3Qgb2YgYm90aC4gSXQgKmRvZXMqIG5lZWQgdGVzdGluZy4KCglTb21lIG9mIHRoZSBjaGFuZ2VzIGFyZSBnZW5lcmFsLCAqbm90KiBtaXBzLXNwZWNpZmljLgoKCXBhcmFtLmg6CglEaWRuJ3QgYmVsaWV2ZSBpbiBsaXR0bGUtZW5kaWFuIGJpdCBvcmRlci4KCVRoZXJlIGFyZSBzdGlsbCBpbmNvbnNpc3RlbmNpZXMgYWJvdXQgd2hldGhlciBmbGFncwoJbGlrZSBCSVRTX0JJR19FTkRJQU4gYXJlIGludGVnZXIgKCNpZiAuLi4pIG9yCglib29sZWFuICgjaWZkZWYgLi4uKS4gSSB0cmllZCB0byBwYXBlciBvdmVyIHRoZW0uCgoJZGJ4cmVhZC5jLGNvZmZyZWFkLmMsbWlwc3JlYWQuYyxzeW10YWIuYyxzeW10YWIuaDoKCU1vdmVkIHNvbWUgbWlzY19mdW5jdGlvbiBjb2RlIHRoYXQgd2FzIGNvbW1vbiB0bwoJe2RieCxjb2ZmLG1pcHN9cmVhZC5jIHRvIHN5bXRhYi5jLgoJSW4gdGhlIHByb2Nlc3MsIEkgdGhpbmsgSSBjbGVhbmVkIHRoaW5ncyB1cCBhIGJpdC4KCUF0IHRoZSBzYW1lIHRpbWUsIG1vdmVkIG9ic2F2ZXN0cmluZyBhbmQgb2Jjb25jYXQgdG8gc3ltdGFiLmMuCgoJZGJ4cmVhZC5jOgoJUmVtb3ZlZCBvYnNvbGV0ZSBjb25kZW5zZV9hZGRsX21pc2NfYnVuY2hlcyAodXNlCgljb25kZW5zZV9taXNjX2J1bmNoZXMoMSkgaW5zdGVhZCkuCgoJZXhlYy5jOgoJTmVlZGVkIHRvIGluY2x1ZGUgPHN5cy9kaXI+LCBhdCBsZWFzdCBvbiBERUNzdGF0aW9ucy4KCgl2YWxvcHMuYywgbWlwcy10ZGVwLmMsIHRtLW1pcHMuaDoKCUFkZGVkIFBVU0hfQVJHVU1FTlRTIG1hY3JvIHRvIHN1cHBvcnQgZnVubnkgYXJndW1lbnQtcHVzaGluZwoJY29udmVudGlvbnMgKHdoZW4gU1RBQ0tfQUxJR04gaXMgaW5zdWZmaWNpZW50KS4KCU5lZWRlZCBvbiBtaXBzLCB3aGVyZSBkb3VibGVzIG5lZWQgOC1ieXRlIGFsaWdubWVudCwKCWJ1dCBpbnRzIG9ubHkgbmVlZCA0LgoKCW1pcHMtb3Bjb2RlLmg6CglSZW1vdmVkIGNydWZ0IHRoYXQgd2FzIG5vdCBiZWluZyB1c2VkLgoJTWVyZ2VkIGluIG1hbnkgZml4ZXMgKG1vc3QgZnJvbSBGcmFuayBZZWxsaW4sIGZ5QGx1Y2lkLmNvbSkuCgoJbWlwcy1waW5zbi5jOgoJUHJpbnQgJCBiZWZvcmUgcmVnaXN0ZXItbmFtZXMgKEkgdGhpbmsgdGhhdCBtYWtlcyB0aGluZ3MgYSBsaXR0bGUKCW1vcmUgY29uc2lzdGVudCkuCglOZXZlciBwcmludCB0d28gaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIG9uZSBkZWxheXMuCglSZW1vdmVkIGhleC1kaXNhc3NlbWJsZSBzZXRfY21kLiAgKFRoaXMgaXMgbm90IG1pcHMtc3BlY2lmaWMsCglzbyBJIHRoaW5rIHRoZSBhcmd1bWVudCBpcyB3aGV0aGVyIGl0IGlzIGdlbmVyYWxseSB3b3J0aHdoaWxlIG9yIG5vdC4KCUknbSBpbmNsaW5lZCB0byB0aGluayBub3QsIGdpdmVuIGhvdyBlYXN5IGl0IGlzIHRvCgljb252ZXJ0IGJldHdlZW4gcmFkaXhlcyBpbiBnZGIuKQoKCW1pcHNyZWFkLmM6CglUaGlzIGlzIGJhc2ljYWxseSBBbGVzc2FuZG8ncyBjb2RlLgoJSXQgZG9lc24ndCB1c2Ugb2JzdGFja3M7IEkgY2hhbmdlZCBpdCB0byB1c2Ugb2JzdGFja3MKCWluIGEgZmV3IG1pbm9yIHBsYWNlcyB3aGVyZSB1c2luZyBtYWxsb2MgY2F1c2VzIGEKCW1lbW9yeSBsZWFrLiAoUHJvYmFibHksIG1vcmUgcGxhY2VzIGNvdWxkL3Nob3VsZCBiZSBjaGFuZ2VkLikKCUkgYWRkZWQgcmVjb3JkX21pc2NfZnVuY3Rpb24gd2hlcmUgaXQgd2FzIG1pc3NpbmcuCglJbiBzeW1ib2xfZmlsZV9jb21tYW5kIGFuZCBhZGRfZmlsZV9jb21tYW5kLCBJIHRyaWVkCgl0byBtYWtlIHRoZSBjb2RlIGNvbnNpc3RlbnQgd2l0aCBtb3JlIHJlY2VudCB2ZXJzaW9ucy4KCU1pbm9yIHN5bGlzdGljIGNoYW5nZXMgaW4gcGFyc2VfcHJvY2VkdXJlLgoJTWFrZSBhIC5nZGJpbmZvLiBwc3VlZG8tc3ltYm9sIHBvaW50IGJhY2sgdG8gdGhlIHJlYWwKCXByb2NlZHVyZSBzeW1ib2wgKHVzaW5nIHRoZSBpc3ltIGZpZWxkKS4KCgltaXBzLXRkZXAuYzoKCVRoaXMgaXMgYmFzaWNhbGx5IGZyb20gbXkgcG9ydCwgYnV0IHdpdGggYSBsb3Qgb2YgZGV0YWlscwoJYW5kIGEgbnVtYmVyIG9mIHJvdXRpbmVzIG1lcmdlZCBpbiBmcm9tIEFsZXNzYW5kbydzIHZlcnNpb24uCglJIGJhc2ljYWxseSB1c2VkIG15IGNvZGUgInJhdyIgYmFja3RyYWNlICh1c2UgaGV1cmlzdGljcwoJZnJvbSB0aGUgYWN0dWFsIGNvZGUsIHJhdGhlciB0aGFuIHN5bWJvbCB0YWJsZSBpbmZvKSAtIHRob3VnaAoJdGhlIGlkZWEgaXMgQWxlc3NhbmRybydzLiBJIGZlZWwgbXkgY29kZSBpcyBhIGxpdHRsZSBjbGVhbmVyCgloZXJlLCBwYXJ0aWN1bGFybHkgaW4gYmVpbmcgYSBsaXR0bGUgbW9yZSBmbGV4aWJsZSwgc3VjaCBhcyBiZWluZwoJYWJsZSB0byBoYW5kbGUgZ2NjLXByb2R1Y2VkIGNvZGUgKHdoaWNoIGl0IG5vdyBjYW4pLgoJSXQgYWxzbyBkb2Vzbid0IGRvIGZyYW1lIGNhY2hpbmcgKHdoaWNoIGlzIG5vdCB1c2VmdWwKCW1vcmUgcmVjZW50IGdkYiB2ZXJzaW9ucykuCglJIGFsc28gdXNlZCBteSBjb2RlIGZvciBwdXNoXy9wb3BfZHVtbXksIG1vcmUgb3IgbGVzcy4KCUkgdHJpZWQgdG8gaW5jb3Jwb3JhdGUgQUYncyBjb2RlIGZvciB0ZXN0aW5nIHNpZ3RyYW1wCgl3aGlsZSBiYWNrdHJhY2luZzsgSSBwcm9iYWJseSBnb3QgaXQgd3JvbmcuCglBZGRlZCBtaXBzX3ByaW50X3JlZ2lzdGVyLCB3aGljaCB0cmllcyB0byBzY3J1bmNoIGFzIG11Y2gKCWluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIG9uIGEgc2NyZWVuLi4uCglSZW1vdmVkIHRoZSBza2lwLXByb2xvZ3VlIHNldF9jbWQuIEFzIHdpdGggaGV4LWRpc2Fzc2VtYmxlIChzZWUKCXVuZGVyIG1pcHMtcGluc24uYyksIEkgZG9uJ3Qgc2VlIGFueXRoaW5nIG1pcHMtc3BlY2lmaWMgaGVyZSwKCWFuZCBJIGRvbid0IHNlZSBpdCBiZWluZyBhbGwgdGhhdCB1c2VmdWwgYW55d2F5LgoJCgl0bS1taXBzLmg6CglBZGRlZCBhICRmcCBwc3VlZG8tcmVnIGRpc3RpbmN0IGZyb20gJGZwIChuaWNlIGZvciBnY2MpLgoJVXNlIG1vcmUgcmVnaXN0ZXIgbmFtZXMgKHJhdGhlciB0aGFuIGhhcmQtY2FzZXMgbnVtYmVycykuCgkKVGh1IFNlcCAgNiAxODozMzoxNSAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogSGFjayB1cCAzLjkwLjExIGNoYW5nZXM6CgoJKiBNYWtlZmlsZS5kaXN0IChkZXBlbmQpOiBwYXJhbWV0ZXJpemUgJChHQ0MpLgoJQWRkIHNvbGliLmMgYW5kIHNvbGliLm8uCgkocmVhZGxpbmUpOiBGaXggdnBhdGggZm9yIGJvdGggYWJzb2x1dGUgb3IgcmVsYXRpdmUgU1JDRElSLgoKCSogYmxvY2tmcmFtZS5jOiBGaXggZnJvbSBTY2hhZWZlckBhc2Muc2xiLmNvbSBmb3Igc2hhcmVkIGxpYnMuCglBbHNvLCBsZXQgdGhlIHBhcnQgSSBkaWRuJ3QgdW5kZXJzdGFuZCBhdCBsZWFzdCBjb21waWxlIHNvCglJIGNhbiB0ZXN0IHRoZSByZXN0LiAgRklYTUUuCgoJKiBkYnhyZWFkLmM6IEZpeCB0aGlua28gdXNpbmcgc3RyY21wLgoJKGluaXRfcHN5bWJvbF9saXN0KTogZGVjbGFyZSBzdGF0aWMuCgkocGFydGlhbF9zeW1ib2xfZmlsZV9vcGVuKTogQ29tbWVudCBjbGVhbnVwcyBiZXR0ZXIsIGF2b2lkCgljbGVhbmluZyB1cCB0aGUgc3RyaW5nIHRhYmxlIHNpbmNlIHRoZSBjYWxsZXIgd2lsbCBkbyB0aGF0LgoJTW92ZSB0aGUgc3RhdCBmb3IgbW9kIHRpbWUgaW50byBzeW1ib2xfZmlsZV9jb21tYW5kLCB0ZW1wb3JhcmlseS4KCShUaGVyZSBzaG91bGQgYmUgYSBtb2QgdGltZSBmb3IgZWFjaCBzeW1ib2wgZmlsZSwgZXZlbnR1YWxseSwKCXRvIGNvbnRyb2wgaXRzIHJlcmVhZGluZy4gIEZJWE1FLikKCgkqIGluZnB0cmFjZS5jIChQVF9XUklURV9EKTogdXNlIHNhbWUgdmFsdWUgYXMgUFRfV1JJVEVfSSBmb3IKCVN1bk9TLCB3aGljaCBnaXZlcyBlcnJvciBmb3Igc2hhcmVkIGxpYnMgb3RoZXJ3aXNlLiAgKEZyb20KCVNjaGFlZmVyLCBwcm9iYWJseSBGSVhNRSBuZWVkcyB3b3JrIGZvciBwb3J0YWJpbGl0eS4pCgoJKiBzb2xpYi5jOiAgTW92ZSAjaW5jbHVkZSAicGFyYW0uaCIgdG8gd29yay4KCUxvd2VyY2FzZSBhbGwgdGhlIFVwcGVyY2FzZSBMZXR0ZXJzIEluIHRoZSBNZXNzYWdlcy4KCShmaW5kX3NvbGliKTogQ2xlYW4gdXAgaW5mZXJpb3Jfc29fbmFtZSBmb3IgZGVidWcgcHJpbnRvdXRzLgoJQWxsb3cgbm8gYXJndW1lbnQsIHRvIG1lYW4gYWxsIHNoYXJlZCBsaWJyYXJpZXMuCgoJKiBzeW1taXNjLmM6IGluY2x1ZGUgcGFyYW0uaCB0byBnZXQgQ0xFQVJfU09MSUIuCQoKV2VkIFNlcCAgNSAxODowMDowOCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogTWVyZ2UgaW4gS2luZ2RvbidzIGNoYW5nZXMgZnJvbSBGU0Y6IHRoZSBkaWZmcyBmcm9tIDMuOTAuOQoJICB0byAzLjkwLjExLiAgQ2hhbmdlTG9nIGVudHJpZXMgYmVsb3cgYXJlIGZyb20gdGhpcy4KCldlZCBKdW4gMTMgMDk6MTc6MzkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKCgkqIFZlcnNpb24gMy45MC4xMS4KCgkqIE1ha2VmaWxlLmRpc3QgKEhGSUxFUyk6IEFkZCB0bS1zdW5vcy5oLgoKVHVlIEp1biAxMiAxNjoxNToyNiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogVmVyc2lvbiAzLjkwLjEwLgoKCSogTWFrZWZpbGUuZGlzdCAoZ2RiLnRhci5aKTogQ2hhbmdlIGxpbmtpbmcgb2YgY29uZmlnIHNvIGl0IHdvcmtzLgoKVGh1IEp1biAgNyAxNjoyMjoyNyBFRFQgMTk5MCAgSmF5IEZlbmxhc29uIChoYWNrQGFpLm1pdC5lZHUpCgoJKiBzcGFyYy1vcGNvZGUuaCAgQWRkZWQgc2luZ2xlLW9wZXJhbmQgdmVyc2lvbiBvZiByZXR0LgoKTW9uIEp1biAgNCAxODoxMjozMSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogbS1zcGFyYy5oIChSRUdfU1RSVUNUX0hBU19BRERSLCBTVFJVQ1RfQVJHX1NZTV9HQVJCQUdFKToKCVB1dCBwYXJlbnMgYXJvdW5kIGdjY19wIGluIGV4cGFuc2lvbi4KClRodSBNYXkgMjQgMTU6NDQ6NTEgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKCgkqIHV0aWxzLmMgKGxpbmVzX3RvX2xpc3QpOiBSZXR1cm4gMTAgaWYgbGluZXNfcGVyX3BhZ2UgPT0gMC4KCldlZCBNYXkgMjMgMTY6MzY6MDQgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIENoYW5nZXMgZm9yIFN1biBzaGFyZWQgbGlicmFyaWVzOgoJYmxvY2tmcmFtZS5jIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24pOiBJZiBhIG5vbi10ZXh0IHN5bWJvbAoJaXMgZm91bmQsIHNldCAqYWRkcmVzcyA9IHBjIC0gRlVOQ1RJT05fU1RBUlRfT0ZGU0VULgoJYnJlYWtwb2ludC5jIChpbnNlcnRfYnJlYWtwb2ludHMpIFtESVNBQkxFX1VOU0VUVEFCTEVfQlJFQUtdOgoJRGlzYWJsZSBicmVha3BvaW50cyBpbnN0ZWFkIG9mIGdpdmluZyBhbiBlcnJvci4KCXNvdXJjZS5jIChzZWxlY3Rfc291cmNlX3N5bXRhYik6IEluaXRpYWxpemUgY3NfcHN0LgoJc3ltbWlzYy5jOiBDYWxsIENMRUFSX1NPTElCIGlmIGRlZmluZWQuCglzeW10YWIuaDogTWFrZSB0ZXh0e2xvdyxoaWdofSBDT1JFX0FERFIgbm90IGludC4KCShwc3ltdGFiKTogTmV3IGZpZWxkIGFkZHIuCglzb2xpYi5jOiBOZXcgZmlsZS4KCWRieHJlYWQuYzogTW92ZSBERUNMQVJFX0ZJTEVfSEVBREVSUyBvdXRzaWRlIGZ1bmN0aW9ucy4KCShyZWNvcmRfbWlzY19mdW5jdGlvbik6IEdpdmUgY29ycmVjdCB0eXBlIGZvciBOX0RBVEEgc3ltYm9scy4KCShjb25kZW5zZV9taXNjX2J1bmNoZXMpOiBkbyAibWlzY19mdW5jdGlvbl9jb3VudCA9IGoiIHJlZ2FyZGxlc3MKCW9mIGluY2xpbmsuCglUYWtlIGNvZGUgd2hpY2ggaXMgc2hhcmVkIGJldHdlZW4gc3ltYm9sX2ZpbGVfY29tbWFuZCBhbmQKCWFkZF9maWxlX2NvbW1hbmQgYW5kIHB1dCBpdCBpbnRvIHBhcnRpYWxfc3ltYm9sX2ZpbGVfe29wZW4scmVhZH0uCglTcGxpdCBhZGRfZmlsZV9jb21tYW5kIGludG8gYWRkX2ZpbGVfY29tbWFuZCBhbmQgYWRkX2ZpbGUuCglNYWtlIHBzeW10YWJfdG9fc3ltdGFiIHJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSBpZiB0aGUgZmlsZQoJaXMgbm90IHN5bWZpbGUuCglUd28gbmV3IHBhcmFtZXRlcnMgdG8gcmVhZF9kYnhfc3ltdGFiIGFuZCBzdGFydF9wc3ltdGFiLgoJdG0tc3Vub3MuaDogTmV3IGZpbGUuCgpUdWUgTWF5IDIyIDE3OjQzOjAzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBpbmZjbWQuYzogQ2hhbmdlIGNvbnRfY29tbWFuZCB0byBjb250aW51ZV9jb21tYW5kIGFuZCAiY29udCIKCXRvICJjb250aW51ZSIuCgpNb24gTWF5IDIxIDE0OjQxOjQxIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBicmVha3BvaW50LmMgKGVuYWJsZV9icmVha3BvaW50KTogR2V0IHZhbHVlIG9mIHdhdGNocG9pbnQuCgoJKiBkZWZzLmggW3NwYXJjXTogVXNlIDxhbGxvY2EuaD4gcmVnYXJkbGVzcyBvZiBfX0dOVUNfXy4KCgkqIHZhbHVlcy5jIChVU0VfU1RSVUNUX0NPTlZFTlRJT04pOiBDaGVjayBmb3Igc3RydWN0dXJlcyBvZgoJc2l6ZSAxLDIsNCw4IHJhdGhlciB0aGFuIHNpemUgPCA4LgoKCSogZGJ4cmVhZC5jIChkYnhfbG9va3VwX3R5cGUpOiBEbyBmLT5sZW5ndGggKj0gMiBhcyBtYW55IHRpbWVzCglhcyBuZWNlc3NhcnksIG5vdCBqdXN0IG9uY2UuCgoJKiBzcGFyYy1vcGNvZGUuaDogQWRkIGEgYnVuY2ggb2YgbmV3IG9wY29kZXMgd2hpY2ggU3VuIGFzIHN1cHBvcnRzLgoKVGh1IE1heSAxNyAxNTowNDowOSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSoge3QseH1tLXN1bjM4Ni5oLCBzdW4zODYteGRlcC5jLCB7eCx0fWNvbmZpZy9zdW4zODYKCgkqIHRtLW5ld3MuaDogQWRkIENBTExfRFVNTVlfKi4KCgkqIHRtLTY4ay5oOiBSZW1vdmUgZHVwbGljYXRlIGNvbW1lbnQgYXQgRlJBTUVfRklORF9TQVZFRF9SRUdTLgoKCSogY29uZmlnLmdkYjogSW4gbGlzdF9ob3N0LCBsaXN0X3RhcmdldCwgdXNlICR7aX0sIG5vdCAkaS4KClR1ZSBNYXkgMTUgMjE6Mjc6MTIgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIHNvdXJjZS5jIChmaW5kX3NvdXJjZV9saW5lcykgW0JST0tFTl9MQVJHRV9BTExPQ0FdOiBVc2UgeG1hbGxvYy4KCgkqIHNwYXJjLW9wY29kZS5oOiBDaGFuZ2UgYWxsIHN0b3JlIGZsb2F0aW5nLXBvaW50IHN0YXRlIHJlZ2lzdGVyCglpbnN0cnVjdGlvbnMgdG8gaGF2ZSB0aGUgcmlnaHQgbWF0Y2ggJiBsb3NlIGZpZWxkcy4KClNhdCBNYXkgIDUgMTI6Mzk6MTggMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIE1ha2VmaWxlLmRpc3Q6IE1vdmUgLUkke3NyY2Rpcn0gdG8gR0xPQkFMX0NGTEFHUyBhbmQgcGFzcwoJVlBBVEggdG8gcmVhZGxpbmUuCgljb25maWcuZ2RiOiBJZiBzcmNkaXIgIT0gLiwgY3JlYXRlIHJlYWRsaW5lIGRpcmVjdG9yeSBhbmQKCWNvcHkgYSBtYWtlZmlsZSBpbnRvIGl0LgoKCSogd2FpdC5oLCBpbmZydW4uYzogQ2hhbmdlIFdSRVRDT0RFIHRvIFdFWElUU1RBVFVTIGZvcgoJY29uc2lzdGVuY3kgd2l0aCBQT1NJWC4KCgkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X3N0b3Bfc3RhdHVzKTogRGlzYWJsZSB3YXRjaHBvaW50Cgl3aGVuIHdlIGV4aXQgaXRzIGV4cF92YWxpZF9ibG9jay4KClR1ZSBTZXAgIDQgMTE6NDY6NDYgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKCgkqIE1ha2VmaWxlLmRpc3Q6IEJ1bXAgdmVyc2lvbiB0byAzLjkxLjMuCgoJKiBDbGVhbiB1cCBoYW5kbGluZyBvZiBicmVha3BvaW50IGNvbW1hbmRzIChzb21ld2hhdCkuCgkgIFByb21wdGVkIGJ5IFRpZW1hbm4gYnVnIHJlcG9ydCAiY29udCAxMCIgZG9lc24ndCB3b3JrIGFueSBtb3JlLgoKCSAgaW5mZXJpb3IuaDogQWRkIGJyZWFrcG9pbnRfcHJvY2VlZGVkIHRvIGluZmVyaW9yIHN0YXR1cyBzdHJ1Y3QKCSAgYW5kIGdsb2JhbHM7IHNhdmUgaXQgYW5kIHJlc3RvcmUgaXQuCgkgIChjbGVhcl9icmVha3BvaW50X2NvbW1hbmRzKTogQ2xlYW51cCwgcmVtb3ZlIG9sZCAjZGVmaW5lLgoKCSAgaW5mcnVuLmMgKGNsZWFyX3Byb2NlZWRfc3RhdHVzKTogU2V0IGJyZWFrcG9pbnRfcHJvY2VlZGVkLgoJICAoc2F2ZV9pbmZlcmlvcl9zdGF0dXMsIHJlc3RvcmVfaW5mZXJpb3Jfc3RhdHVzKTogaGFuZGxlIGl0IGFsc28uCgkgIChwcm9jZWVkKTogUmVtb3ZlIGVhcmxpZXIgY29kZSB0aGF0IHNldCBicmVha3BvaW50X3Byb2NlZWRlZC4KCSAgSXQgaXMgbm93IHNldCBvbmx5IGluIGNsZWFyX3Byb2NlZWRfc3RhdHVzLgoJICAoY2xlYXJfcHJvY2VlZF9zdGF0dXMpOiBDbGVhbnVwLCB1c2UgYnBzdGF0X2NsZWFyIHJhdGhlcgoJICB0aGFuIGNsZWFyX2JyZWFrcG9pbnRfY29tbWFuZHMuICBObyBjYWxsZXJzIG5lZWQgdGhlIHN0b3BfYnBzdGF0CgkgIGJldHdlZW4gY2xlYXJfcHJvY2VlZF9zdGF0dXMgYW5kIHByb2NlZWQuCgoJICBpbmZjbWQuYzogQWRkIGJyZWFrcG9pbnRfcHJvY2VlZGVkIGRlZmluaXRpb24gYW5kIGNvbW1lbnQuCgkgIChjb250X2NvbW1hbmQsIGp1bXBfY29tbWFuZCwgc2lnbmFsX2NvbW1hbmQpOiBNb3ZlIGNhbGwgdG8KCSAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgcmlnaHQgbmV4dCB0byBjYWxsIHRvIHByb2NlZWQuCgoJICBicmVha3BvaW50LmMgKGJwc3RhdF9kb19hY3Rpb25zKTogQXZvaWQgY2xvYmJlcmluZyBvdXIKCSAgY2FsbGVyJ3MgYXJndW1lbnQgd2hpbGUgcnVubmluZyBkb3duIHRoZSBjaGFpbiBvZiBicmVha3BvaW50cy4KCSAgVXNlIG5ldyB2YXJpYWJsZSAiYnJlYWtwb2ludF9wcm9jZWVkZWQiIHRvIGRldGVybWluZSB3aGVuCgkgIGEgY29tbWFuZCB0aGF0IGl0IGV4ZWN1dGVzIG1vdmVzIHRoZSBpbmZlcmlvciBwYXN0IHRoZQoJICBicmVha3BvaW50LgoJICAoYnBzdGF0X2NsZWFyKTogSGFuZGxlIE5VTEwgYXJndW1lbnQuCgkgIChicHN0YXRfY2xlYXJfYWN0aW9ucyk6IEF2b2lkIHVzZWxlc3MgY2FsbCB0bwoJICBicmVha3BvaW50X2F1dG9fZGVsZXRlLgoJICAoZGVsZXRlX2JyZWFrcG9pbnQpOiAgQ2xlYW4gdXAgYnBzdGF0J3MgdGhhdCBhcmUgcG9pbnRpbmcgdG8KCSAgdGhlIGRlbGV0ZWQgYnJlYWtwb2ludCBmcm9tIHRoZSBzdG9wX2Jwc3RhdCBjaGFpbi4KCSAgKGJyZWFrcG9pbnRfYXV0b19kZWxldGUpOiBTaW1wbGlmeS4KCgkqIENsZWFuIHVwIGhhbmRsaW5nIG9mIEVPRiwgZXJyb3Igb24gc3RkaW4sIGV0Yy4gIFRoaXMgd2FzCgkgIHByb21wdGVkIGJ5IGEgbmV0d29yayBwcm9ibGVtIHRoYXQgY2F1c2VkIGdkYiB0byBnbyBpbnRvIGFuCgkgIGluZmluaXRlIGxvb3AgZmlsbGluZyB1cCBpdHMgbWFsbG9jJ2QgbWVtb3J5LgoKCSAgbWFpbi5jIChyZXR1cm5fdG9fdG9wX2xldmVsKTogQ2xlYW51cDogY2FsbCBicHN0YXRfY2xlYXJfYWN0aW9ucywKCSAgbm90IGNsZWFyX2JyZWFrcG9pbnRzX2NvbW1hbmRzLCB3aGljaCBpcyBub3cgZ29uZS4KCSAgKG1haW4pOiBJZiBjb21tYW5kX2xvb3AgcmV0dXJucyAoZS5nLiBmcm9tIEVPRiBvbiBzdGRpbiksIGRvCgkgIGEgcXVpdF9jb21tYW5kIChsb29waW5nIGJhY2sgdG8gY29tbWFuZF9sb29wIGlmIHF1aXRfY29tbWFuZAoJICBkb2Vzbid0IHJlYWxseSBxdWl0KS4KCSAgKGNvbW1hbmRfbG9vcCk6IGNoZWNrIHJlc3VsdCBmcm9tIGNvbW1hbmRfbGluZV9pbnB1dCBhbmQKCSAgZXhpdCBpZiBpdCByZXR1cm5zIE5VTEwsIHJhdGhlciB0aGFuIHBhc3NpbmcgdGhlIE5VTEwgdG8KCSAgZXhlY3V0ZV9jb21tYW5kLgoJICAoZ2RiX3JlYWRsaW5lKTogIEZyZWUgbWFsbG9jJ2QgcmVzdWx0IHNwYWNlIGJlZm9yZSByZXR1cm5pbmcKCSAgTlVMTCBmb3IgRU9GLgoKCSogdXRpbHMuYyAocXVlcnkpOiBIYW5kbGUgQy1kIHRvIG1lYW4gInllcyIsIGp1c3QgYXMgaWYgdGhlCgkgIGlucHV0IHdhcyBub3QgYSB0ZXJtaW5hbC4gIEFsc28gYXZvaWQgaW5maW5pdGUgbG9vcCBpZiBFT0YKCSAgb2NjdXJzIGluIG1pZC1pbnB1dC1saW5lIGJlZm9yZSBuZXdsaW5lLiAgVGhpcyBhbGxvd3MKCSAgcXVlcnkgdG8gYmUgdXNlZCBhdCBFT0Ygb24gc3RkaW4gd2l0aCByZWFzb25hYmxlIHJlc3VsdHMuCgoJKiBpbmZydW4uYyAocHJvY2VlZCk6IFNldCBicmVha3BvaW50X3Byb2NlZWRlZC4KCgkqIHZhbHVlcy5jICh2YWx1ZV9hc19sb25nKTogQXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGZvciBlbnVtcy4KCSAgKF9pbml0aWFsaXplX3ZhbHVlcyk6IEZpeCB0eXBvIGluIGhlbHAgbXNnIChraW5nZG9uKS4KCgkqIE1ha2VmaWxlLmRpc3QgKFJMX0xJQik6IFVzZSBSTF9MSUJfREVQIGZvciBkZXBlbmRlbmNpZXMsCgkgIFJMX0xJQiBmb3IgbGlua2luZy4gIFRoaXMgYWxsb3dzIC1scmVhZGxpbmUgZm9yIGxpbmtpbmcKCSAgYW5kIG5vdGhpbmcgZm9yIGRlcGVuZGVuY2llcywgb25jZSByZWFkbGluZSBpcyBhIHJlYWwgbGlicmFyeS4KCgkqIGNvbmZpZy5nZGI6IEppbSBLaW5nZG9uOiBnaXZlIHVzZWZ1bCBlcnJvciBtZXNzYWdlIGlmIHRoZQoJICBob3N0IG9yIHRhcmdldCB0eXBlIGlzIG5vdCByZWNvZ25pemVkLgoKCSogZGVmcy5oIChhbGxvY2EpOiBTUEFSQyA8YWxsb2NhLmg+IGRvZXMgbm90IGRlY2xhcmUgYWxsb2NhLAoJICBpdCBqdXN0IGRlZmluZXMgaXQuICBEdW1iLCBidXQgZGVhbCB3aXRoIGl0LgoKCSogSmltIEtpbmdkb24gc3VnZ2VzdHM6CgkgIGluIHhjb25maWcvc3VuM29zNCwgQ0ZMQUdTIHNob3VsZCBiZSBYTV9DRkxBR1MuCgpXZWQgQXVnIDI5IDE4OjAzOjI3IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCgoJKiBNYWtlZmlsZS5kaXN0IChWRVJTSU9OKTogQnVtcCB2ZXJzaW9uICMgdG8gMy45MS4yLgoKCSogQ2xlYW4gdXAgQm90aG5lcidzIGNoYW5nZXMuCgoJKiBibG9ja2ZyYW1lLmMgKGNsZWFyX3BjX2Z1bmN0aW9uX2NhY2hlKTogTmV3IGZ1bmN0aW9uLgoJKiBibG9ja2ZyYW1lLmM6IHJlbWFrZSBjYWNoZV9wY19mdW5jdGlvbl8qIHN0YXRpYy4KCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogcmVtb3ZlIHJlZmVyZW5jZXMgdG8KCQkgICAgY2FjaGVfcGNfZnVuY3Rpb25fKiB2YXJpYWJsZXMuCgkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IFVzZSBWT0ZGU0VUX1NUQVRJQy4KCSogcHJpbnRjbWQuYzogQXZvaWQga2x1ZGdpbmcgYSBnbG9iYWwgdmFyaWFibGUgKGFkZHJlc3NwcmludCkKCSAgdG8gYXZvaWQgcHJpbnRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcgdHdpY2UuICBJbnN0ZWFkLAoJICBwYXNzIHRoZSBmb3JtYXQgbGV0dGVyICdzJyBkb3duIGxvdyBlbm91Z2ggdGhhdCBpdCBjYW4gYmUgc2VlbgoJICB0byBhdm9pZCB0aGlzIHByb2JsZW0uCgkgIChwcmludF9mb3JtYXR0ZWQpOiBQYXNzIGZvcm1hdCBhcmcgdG8gdmFsdWVfcHJpbnQuCgkgIChyZXN0b3JlX2FkZHJlc3NwcmludCk6IFJlbW92ZSBmdW5jdGlvbi4KCSAgKGRvX2V4YW1pbmUpOiAgQXZvaWQgaGFja2luZyBhZGRyZXNzcHJpbnQsIGNsZWFudXBzIGFuZCBzdWNoLgoJICAocHJpbnRfZnJhbWVfYXJncyk6ICBBZGQgYSBjb21tZW50IHRvIGEgQm90aG5lciBjaGFuZ2UuCgkqIHN5bXRhYi5oOiBkZWZpbmUgVk9GRlNFVF9TVEFUSUMgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mICItMSIuCgkqIHN5bW1pc2MuYyAoZnJlZV9hbGxfc3ltdGFicyk6IENhbGwgY2xlYXJfcGNfZnVuY3Rpb25fY2FjaGUKCSAgdG8gd2lwZSBvdXQgdGhlIHZhbHVlcyBjYWNoZWQgaW4gYmxvY2tmcmFtZS5jLgoJKiBzeW10YWIuYyAoZmluZF9tZXRob2QpOiBBZGQgY29tbWVudCBzYXlpbmcgaG93IGJpZyB5b3UgbXVzdAoJICBhbGxvY2F0ZSB0byBiZSAiYmlnIGVub3VnaCIuICBQZXIgYmVpbmcgdGVyc2UgYWdhaW4uCgkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IEhhbmRsZSBmb3JtYXQgbGV0dGVyICJzIiB0byBwcmludAoJICBzdHJpbmdzIHdpdGhvdXQgYWRkcmVzc2VzLiAgQWRkIGNvbW1lbnQgdG8gdnRibCBwcmludGluZyBjb2RlCgkgIHdoaWNoIGNhc3RzIHdpdGggd2lsZCBhYmFuZG9uLiAgUmVhcnJhbmdlIHJlZmVyZW5jZS1wcmludGluZwoJICBjb2RlIHNvIGl0IHByaW50czoKCSAgICAgICBAMHhhZGRyOiB2YWx1ZQkJKHByaW50IHcvYWRkcmVzc3ByaW50KQoJICAgICAgIHZhbHVlCQkJKHByaW50IHcvfmFkZHJlc3NwcmludCkKCSAgICAgICBAMHhhZGRyCQkJKHBhcmFtZXRlciBsaXN0cyB3L2FkZHJlc3NwcmludCkKCSAgb3IgICBub3RoaW5nCQkJKHBhcmFtZXRlciBsaXN0cyB3L28gYWRkcmVzc3ByaW50KQoKVHVlIEF1ZyAyOCAxMDo0NzoxOCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogTWVyZ2UgbW9yZSBjaGFuZ2VzIGZyb20gUGVyIEJvdGhuZXI6CgpHZGIncyBoYW5kbGluZyBvZiBUWVBFX0NPREVfUkVGIHdhcyBzbyBjb3VudGVyLUMrKyAoYW5kIG90aGVyd2lzZQphbm5veWluZykgdGhhdCBJIHRyaWVkIHRvIGltcHJvdmUgaXQuIEhlcmUgYXJlIG15IHN1Z2dlc3Rpb25zLgoKCVRoZXNlIHBhdGNoZXMgYWxsIGF0dGVtcHQgdG8gaGFuZGxlIFRZUEVfQ09ERV9SRUYgKGFzIGluIEMrKykgYmV0dGVyLgoKCWZpbmR2YXIuYzoKCURvIGF1dG9tYXRpYyBkZS1yZWZlcmVuY2Ugd2hlbiB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSByZWZlcmVuY2UuCglwcmludGNtZC5jOgoJRG9uJ3QgZGVyZWZfcmVmIHdoZW4gcHJpbnRpbmcgcGFyYW1ldGVyIGxpc3RzLgoJdmFsb3BzLmM6CglNb3JlIGF0dGVtcHRzIGF0IHRyZWF0aW5nIHJlZmVybmVuY2VzIHByb3Blcmx5LgoJdmFscHJpbnQuYzoKCUluIHZhbF9wcmludCwgaWYgZGVyZWZfcmVmPT0wLCBkb24ndCBwcmludCBkYW5nbGluZyAiID0gIi4KCXZhbHVlLmg6CglBZGQgQ09FUkNFX1JFRiBtYWNybywgd2hpY2ggZGUtcmVmZXJlbmNlcyBhbiBSRUYuCgoJKiBNZXJnZSBjaGFuZ2VzIGZyb20gUGVyIEJvdGhuZXI6CgoqIEZpeGVkIChTb255IG5ld3MpLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMuCiogRml4ZWQgb3RoZXIgcHJvYmxlbXMgd2l0aCB1c2luZyB2YW5pbGxhIHBjYyBhbmQgbGliYyAoZW51bSBwcm9ibGVtczsKYXNzdW1wdGlvbiB0aGF0IHZzcHJpbnRmIGV4aXN0cykuCiogU29tZSBtYWpvciBzcGVlZC11cHMgKGZpbmNfcGNfcGFydGlhbF9mdW5jdGlvbiBub3cgY2FjaGVzIGEgbWF0Y2g7CnBhcnNpbmcgYXZvaWRzIGR1cGxpY2F0ZSBzeW1ib2xfbG9va3VwIGNhbGxzKS4KKiBDaGFuZ2VkIGhhbmRsaW5nIG9mIGJhc2VjbGFzc2VzIChubyBsb25nZXIgdXNlIGJhc2VjbGFzc2VzIGZpZWxkCm9mIHN0cnVjdCB0eXBlLCB1c2UgdGhlIGZpcnN0IG5fYmFzZWNsYXNzZXMgZmllbGRzIGluc3RlYWQpLgoqIFZhcmlvdXMgbWlub3IgY2hhbmdlcy9maXhlcywgbW9zdCBDKystcmVsYXRlZC4KCmJsb2NrZnJhbWUuYzoKQ2FjaGUgdGhlIG1vc3QgcHJldmlvdXMgbWF0Y2ggZnJvbSBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24uCihTYXZlIGJvdGggbG93IGFuZCBoaWdoIGVuZHMgb2YgbWF0Y2hpbmcgZnVuY3Rpb24ncyBwYyByYW5nZS4pClRoaXMgc3BlZWRzIHVwIHRoZSBsb29wIG9mIGluZnJ1bi5jOndhaXRfZm9yX2luZmVyaW9yIHF1aXRlCmEgYml0LCBhbmQgbWFrZXMgc3RlcC9uZXh0IGNvbW1hbmRzIG11Y2ggemlwcGllci4KY29tbWFuZC5jOgpBZGRlZCBhbiBlbnVtLT5pbnQgY2FzdCAob3RoZXJ3aXNlLCBzb21lIGNvbXBpbGVycyBiYXJmKS4KZGJ4cmVhZC5jOgpObyBsb25nZXIgc2V0IGJhc2VjbGFzcyBvZmZzZXQgdG8gMCwgc2luY2UgbXVsdGlwbGUKaW5oZXJpdGFuY2Ugbm93IG1vc3RseSB3b3Jrcy4KQWRkZWQgYSBudW1iZXIgb2YgY2FzdHMsIHRvIHNodXQgdXAgY29tcGlsZXIgd2FybmluZ3MKKGFmdGVyIHN0YWJzIHdoZXJlIG1hZGUgZW51bXMsIG5vdCBpbnRzKS4KV2hlbiBkaXNjYXJkaW5nIGEgc3ltYm9sIHRhYmxlIChpbiBzeW1ib2xfZmlsZV9jb21tYW5kKSwKbXVzdCBjbGVhciB0aGUgY2FjaGUgaW50cm9kdWNlZCBpbiBibG9ja2ZyYW1lLmMuCkRvbid0IGNvbnZlcnQgJHZ0YmxfcHRyX3R5cGUgdG8gdnRibCBhbnkgbW9yZS4KR2V0IHJpZCBvZiBUWVBFX0JBU0VDTEFTRUVTIGFuZCAgYmFzZWNsYXNzX3ZlYyAoc2VlIGFsc28gc3ltdGFiLmgpLgpNYXNrIG9mZiBzaWduIGJpdCBlbWl0dGVkIGJ5IGcrKyBmb3IgdmlydHVhbCB0YWJsZSBvZmZzZXQuClNldCB2b2Zmc2V0IHRvIC0xIChub3QgMSkgZm9yIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zLgpleHByZWFkLnk6CkNoYW5nZWQgcGFyc2luZy9sZXhpbmcgb2YgbmFtZXMgdG8gYXZvaWQgZG9pbmcgc3ltYm9sIGxvb2t1cCB0d2ljZQoob25jZSB3aGVuIGxleGluZyB0byBkZXRlcm1pbmUgc3ltYm9sIGNsYXNzLCBvbmNlIGZvciByZWFsKS4KTm93IG9ubHkgY2FsbCBzeW1ib2xfbG9va3VwIG9uY2UuIEZpZWxkcyBvZiAndGhpcycgd2luIGVzcGVjaWFsbHkgYmlnLgpwcmludGNtZC5jOgpTdWJwcmVzcyBwcmludGluZyBhZGRyIHR3aWNlIGluIHRoZSBjYXNlIG9mICd4L3MgYWRkcicuCnN5bXRhYi5jOgpsb29rdXBfYmFzZXR5cGVfdHlwZSBpcyBubyBsb25nZXIgdXNlZC4KQWRkIGZpbmRfbWV0aG9kcyBhcyByZWN1cnNpdmUgaGVscGVyIGZ1bmN0aW9uIHRvIGRlY29kZV9saW5lXzEuClRoaXMgYWxsb3dzIG11bHRpcGxlIGluaGVyaXRhbmNlIHRvIHdvcmsuCkFsc28sIG9uY2Ugb25lIG9yIG1vcmUgbWF0Y2hlcyBoYXMgYmVlbiBmb3VuZCwgZG8gbm90IGxvb2sgaW4KYmFzZS1jbGFzc2VzLiAoQmFzZWNsYXNzIG1ldGhvZHMgd291bGQgYmUgb3ZlcnJpZGRlbiwgYW55d2F5LikKc3ltdGFiLmg6ClJlbW92ZWQgYmFzZWNsYXNzZXMgYXJyYXkgaW4gc3RydWN0IHR5cGUuCkluc3RlYWQgb2YgdXNpbmcgYmFzZWNsYXNzZXNbaV0sIHVzZSBmaWVsZHNbaS0xXS4KQWRkZWQgdmlydHVhbF9maWVsZF9iaXRzW2ldIHRvIGluZGljYXRlIGlmIHRoZSBpJ3RoIGJhc2VjbGFzcyBpcyB2aXJ0dWFsLgpDaGFuZ2VkIHNpZ24gY29udmVudGlvbiBvZiB2b2Zmc2V0IChwcmV2aW91cyB3YXMgaW5jb25zaXN0ZW50KS4KdG0tbmV3cy5oOgpTb21lIG1hY3JvcyAoQ0FMTF9EVU1NWSBhbmQgcmVsYXRpdmVzKSB3ZXJlIG1pc3NpbmcuIFB1dCB0aGVtIGJhY2suCnV0aWxzLmM6ClVzZWQgdG8gYXNzdW1lIGV4aXN0ZW5jZSBvZiB2c3ByaW50Zi4gUmUtd3JpdHRlbiB0byBub3QgbmVlZCBpdAppZiBIQVZFX1ZQUklOVEYgaXMgdW5kZWZpbmVkLgp2YWxvcHMuYzoKdHlwZWNtcCB3YXMgdG9vIHBlc3NpbWlzdGljLiBNYWRlIGl0IGxlc3Mgc28uCnZhbHByaW50LmM6CkRvbid0IHByaW50IHNwYWNlIGFmdGVyIGFkZHJlc3MuCklmIHZ0YWJsZSBwb2ludHMgdG8gYSBtaXNjIHN5bWJvbCAod2l0aCAwIG9mZnNldCksIHByaW50IGl0LApzaW5jZSB0aGF0IGluZGljYXRlcyB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QuCkNoYW5nZWQgeXBlX3ByaW50X2Rlcml2YXRpb25faW5mbyB0byB1c2UgbmV3IGluaGVyaXRhbmNlCnNjaGVtZSAod2l0aG91dCBiYXNlY2xhc3NlcyB2ZWN0b3IpLgp2YWx1ZXMuYzoKSW4gdmFsdWVfcHJpbWl0aXZlX2ZpZWxkLCBmaXhlZCBzb21lIGJ1Z3MgbGVmdCBvdmVyIGZyb20gcHJldmlvdXMgc2V0IG9mIGZpeGVzLgpBbHNvLCBjaGFuZ2VzIG5lZWRlZCBiZWNhdXNlIFRZUEVfQkFTRUNMQVNTRVMgd2VyZSByZW1vdmVkLgp4bS1uZXdzLmg6ClJFR0lTVEVSX1VfQUREUiBkaWRuJ3Qgd29yayBmb3IgUEMuIFJld3JvdGUgdG8gdXNlIGFuIGFycmF5LgoKVHVlIEF1ZyAyMSAyMDowODo1NCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQoKCSogc291cmNlLmM6CiAgSWYgdGhlcmUgaXMgbm8gcGF0aCBzZXQsIGFuZCB0aGUgc3ltYm9scyBkb24ndCBpbmRpY2F0ZSB3aGF0IGRpcmVjdG9yeQogIGEgZmlsZSB3YXMgY29tcGlsZWQgaW4sIGxvb2sgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQnV0IGVpdGhlcgogIGEgcGF0aCBvciBhIGtub3duIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSB3aWxsIHByZXZlbnQgdGhpcy4KCgkqIGRieHJlYWQuYzoKICBUaHJlZSBpbmRlcGVuZGVudCBidWcgZml4ZXM6CiAgICogUmVtb3ZlIHRoZSAjaWYgMCBibG9jayB0aGF0IGJyZWFrcyBzb21lIHN0dWZmLgogICAqIFN1bk9TIDQuMSBmaXhlZCB0aGUgcHJvbW90ZWQtcGFyYW1ldGVyLXdyb25nLWFkZHIgYnVnIGluIFN1biBDOwogICAgIGFkYXB0IGdkYiB0byBlaXRoZXIgU3VuT1MgNC4wLiogb3IgNC4xLgogICAqIE1BWF9PRl9UWVBFIGFuZCBNSU5fT0ZfVFlQRSB0aGlua28uICBCeSB0ZWRnQHN1biwgSSB0aGluay4KIAoJKiBzeW10YWIuYzoKICBJbnN0YW50aWF0ZSB0aGUgY2xhc3MgVCB3aGVuIGxvb2tpbmcgZm9yIG1ldGhvZHMgaW4gaXQuICAoVGllbWFubkBzdW4pCgoJKiB2YWxwcmludC5jOgogICh0eXBlX3ByaW50KSBEZW1hbmdsZSB0aGUgbmFtZSBiZWluZyBwcmludGVkLgogICh0eXBlX3ByaW50X2Jhc2UpIEhhbmRsZSBib3RjaGVkIGRlbWFuZ2xpbmcgd2l0aG91dCBjb3JlZHVtcCAodGllbWFubikuCgoJKiB2YWx1ZXMuYzoKICAoY2hlY2tfc3R1Yl9tZXRob2QpOiAgRG9jdW1lbnQgcm91dGluZS4KCQkJKHRpZW1hbm4pIGZpeCBidWcgZm9yIG5vLWFyZyBmdW5jdGlvbnMKCQkJQXZvaWQgY2xvYmJlcmluZyBiZXlvbmQgZW5kIG9mIG1hbGxvYydkIHN0b3JhZ2UuCgkJCVRlcm1pbmF0ZSB0aGUgYXJndW1lbnQgbGlzdCBwcm9wZXJseS4KClNhdCBBdWcgMTggMDE6Mjk6NTkgMTk5MCAgUGVyIEJvdGhuZXIgKGJvdGhuZXJAY3Mud2lzYy5lZHUpCgoJKiBDaGFuZ2VzIG1lcmdlZCBieSBKb2huIEdpbG1vcmU6CiAgICAKYnJlYWtwb2ludC5jOgogIEluIGJyZWFrcG9pbnRfMSwgdXNlIG5ldyBwcmludF9hZGRyZXNzX3N5bWJvbGljIGluc3RlYWQKICBvZiBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24uIChUaGlzIGZvcmNlcyB1c2Ugb2YgYXNzZW1ibGVyLWxldmVsCiAgYWRkcmVzc2VzLCBhbmQgYXZvaWRzIG1pc2xlYWRpbmcgbm9uLW1hbmdsZWQgc291cmNlLWxldmVsIG5hbWVzLikKY3BsdXMtZGVtLmM6CiAgR2VuZXJhbGl6ZSBhbnNpIGFyZ3VtZW50IHN1Y2ggdGhhdCAtMSBtZWFucyBza2lwIGFyZ2xpc3QgdG90YWxseS4KICBSZW1vdmVkIGdsb2JhbCB2YXJpYWJsZSBwcmludF9hbnNpX3F1YWxpZmllcnMgKHdoaWNoIG1hZGUKICBjb2RlIG5vbi1yZWVudHJhbnQpLCBpbiBmYXZvciBvZiBleHRyYSBleHBsaWNpdCBhcmd1bWVudHMKICB0byBpbnRlcm5hbCByb3V0aW5lcy4KcHJpbnRjbWQuYzoKICBBZGQgbmV3IGhlbHBlciBmdW5jdGlvbiBwcmludF9hZGRyZXNzX3N5bWJvbGljLgogIFVzZSBmaW5kX3BjX21pc2NfZnVuY3Rpb24gaW5zdGVhZCBvZiBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24KICAoc2luY2Ugd2Ugd2FudCBhc3NlbWJsZXItbGV2ZWwgc3ltYm9scyBoZXJlKS4Kc3RhY2suYzoKICBQcmludCB1bmtub3duIGZ1bmN0aW9uIGFzIGp1c3QgImYgKC4uLikiLCBub3QgImYgKC4uLikgKC4uLikiLgogIFVzZSBuZXcgZnB1dHNfZGVtYW5nbGVkIGV4cGxpY2l0bHkuCnN5bXRhYi5jOgogIEZpeGVkIGEgdHlwaW5nIHZpb2xhdGlvbiAocHJvYmxlbTogdmFsdWUuaCBjYW5ub3QgYmUgaW1wb3J0ZWQKICB3aXRob3V0IHJlbmFtaW5nIG1hbnkgdmFyaWFibGUgaW4gdGhpcyBmaWxlKS4KICBsb29rdXBfc3ltYm9sOiBJZiBubyBtYXRjaGluZyBtaXNjX2Z1bmMsIGxvb2sgZm9yIGEgQysrLW1hbmdsZWQgbmFtZS4KICBkZWNvZGVfbGluZV8xOiBNb3ZlZCBmb3J3YXJkIHNvbWUgbmV2ZXItcmVhY2hlZCBjb2RlLgogIE1hZGUgZGVjb2RlX2xpbmVfMiBza2lwIGZ1bmN0aW9uIHByb2xvZ3VlcyBjb3JyZWN0bHkuCnV0aWxzLmM6CiAgZnB1dHNfZmlsdGVyZWQgc2hvdWxkIG5vdCBkZW1hbmdsZSBieSBkZWZhdWx0LgogIEFkZCBuZXcgZnB1dHNfZGVtYW5nbGVkIHRvIGRlbWFuZ2xlIG9uIGRlbWFuZC4uCnZhbG9wcy5jOgogIENoYW5nZSB2YWx1ZV9zdHJ1Y3RfZWx0IHRvIHVzZSB2YWx1ZV9wcmltaXRpdmVfZmllbGQgKHVzaW5nIHJlY3Vyc2l2ZQogIHV0aWxpdHkgZnVuY3Rpb24gc2VhcmNoX3N0cnVjdF9maWVsZCkuIFRoaXMgYWxsb3dzIGZvby5iYXIgdG8gd29yawogIGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSAoc28gZmFyIG9ubHkgZm9yIGRhdGEgZmllbGRzKS4KICBDaGFuZ2UgY2hlY2tfZmllbGQgaW4gdGhlIHNhbWUgd2F5IChyZWN1cnNpdmUgaGVscGVyIGZ1bmN0aW9uCiAgdG8gc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZSkuCiAgKE5vdGU6IHRoZXJlIGFyZSBtb3JlIG9mIHRoZXNlIHByb2JsZW1zIHRoYXQgSSBoYXZlbid0IGZpeGVkLgogIEFueSBjb2RlIHRoYXQgc2F5cyBUWVBFX0JBU0VDTEFTUyAodCwgMSkgaXMgcHJvYmFibHkgd3JvbmcuKQogIHZhbHVlX29mX3RoaXM6ICd0aGlzJyBzeW1ib2wgbmFtZSBpcyBub3cganVzdCAidGhpcyIsIG5vdGUgIiR0aGlzIi4KdmFscHJpbnQuYzoKICBEb24ndCBwcmludCBzdGF0aWMgbWVtYmVycy4KICBBdm9pZCBwcmludGluZyAibWVtYmVycyBvZiA8dHlwZT4iIGlmIHRoZXJlIGFyZSBub25lLgogIFNpbXBsaWZpZWQgdHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8gYnkgbWVyZ2luZyBkdXBsaWNhdGUgY29kZS4KICBSZW1vdmUgdXNlbGVzcyBibGFuayBsaW5lcyBpbiB0eXBlX3ByaW50X2Jhc2UgKHB0eXBlIGNvbW1hbmQpLgp2YWx1ZS5oOgogIEFkZGVkIGRlY2xhcmF0aW9uIG9mIG5ldyByb3V0aW5lIHZhbHVlX3ByaW1pdGl2ZV9maWVsZC4KdmFsdWVzLmM6CiAgQWRkZWQgdmFsdWVfcHJpbWl0aXZlX2ZpZWxkIHdoaWNoIGlzIGdlbmVyYWxpemVkIHZlcnNpb24gb2YKICB2YWx1ZV9maWVsZCB0aGF0IGNhbiBoYW5kbGUgbXVsdGlwbGUgaW5oZXJpdGFuY2UgKG5vbi16ZXJvIG9mZnNldHMgZXRjKS4KICBSZS1pbXBsZW1lbnRlZCB2YWx1ZV9maWVsZCB0byBjYWxsIHZhbHVlX3ByaW1pdGl2ZV9maWVsZC4KCkZyaSBBdWcgMTcgMjM6MzM6NDQgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKCgkqIGluZmNtZC5jIC0tIGluc2VydCBlbHNlIHRvIGF2b2lkICdkZWxldGUgZW52JyBjb3JlZHVtcCB3aGVuIHlvdQoJZGVsZXRlIHRoZSB3aG9sZSBlbnZpcm9ubWVudC4gIEthcmwgQmVycnkgcmVwb3J0ZWQgdGhlIGJ1Zy4KCSogc291cmNlLmMgLSBmaXggb3BlbnAgdG8gYXZvaWQgLy8ncyBpbiBmaWxlbmFtZXMsIHdoaWNoCgl0cmlnZ2VyIGFuIEVtYWNzIGJ1ZyBjYXVzaW5nIGl0IHRvIG5vdCBiZSBhYmxlIHRvIGZpbmQgZmlsZXMKCXdoZW4gcnVubmluZyBnZGIgaW4gYSB3aW5kb3cuCgkqIGRieHJlYWQuYyAtIHphcCB0aGUgI2lmIDAgdGhhdCBib3RjaGVzIHRoZSBhZGQtZmlsZSBjb2RlLgoJSXQgc2VlbXMgdG8gd29yayBhIGxvdCBiZXR0ZXIgd2l0aG91dCBhbGwgdGhlIGNvZGUgY29tbWVudGVkIG91dC4KCkZyaSBKdWwgMjAgMTY6NTg6NDYgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCgoJKiBNZXJnZSBUaWVtYW5uJ3MgYW5kIFRlZCBHb2xkc3RlaW4ncyBjaGFuZ2VzLCBkZXRhaWxlZCBiZWxvdywKCWludG8gZ2RiLTMuOTAuOS4KClR1ZSBKdWwgMTcgMTk6MzQ6MzMgMTk5MCAgVGVkIEdvbGRzdGVpbiAgKHRlZGcgYXQgZ29sZW0pCgoJKiBNYWtlZmlsZSAtIGFkZGVkIGEgJHtDRkxBR1N9IHRvIGEgY291cGxlIG9mIGVudHJpZXMsCglhZGRlZCByZW1vdGUtc2Euc3BhcmMuYwoJKiBhZGRlZCByZW1vdGUuc2Etc3BhcmMuYywgYSBtb2RpZmljYXRpb24gb2YgcmVtb3RlLmMKCXdoaWNoIGNvbmR1Y3RzIGEgZGlhbG9nIGRpcmVjdGx5IHdpdGggdGhlIFNwYXJjU3RhdGlvbiBwcm9tLgoJKiBicmVha3BvaW50LmMsIGluZnJ1bi5jLCBzcGFyY2RlcC5jICBhZGRlZCAKCXJlbW90ZV9pbnNlcnRfYnJlYWtwb2ludCgpLCBhbmQgcmVtb3RlX3JlbW92ZV9icmVha3BvaW50KCkgCgl0byBicmVha3BvaW50LmMgaW5zdGVhZCBvZiBkaXJlY3RseSB3cml0aW5nIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb25zLgoJKiBzcGFyY2RlcC5jIG9uIHJlbW90ZV9kZWJ1Z2dpbmcsdGhlcmUgaXMgbm8gbmVlZCAKCXRvIHJlbW92ZSBzaWdubGUgc3RlcCBicmVha3BvaW50IGluc3RydWN0aW9ucy4KCSogbWFpbi5jIGFkZGVkICItZXBvY2giIGZsYWcgYW5kICJpbnQgZXBvY2hfaW50ZXJmYWNlIiB0byBtYWluLmMKCWdsb2JhbCB2YXJpYWJsZQoJKiBwcmludGNtZC5jIC0gZXBvY2ggaW50ZXJmYWNlIHNlbmRzIGxpc3AgZXhwcmVzc2lvbnMgdG8gb3BlbiB1cAoJZXBvY2ggd2luZG93cyBvbiBpbnNwZWN0aW9uLgoJKiB2YWxwcmludC5jIC0gYWRkZWQgYXJyYXlwcmludCwgYW5kIGFkZHJlc3NwcmludCBhbmQgbWFkZSBhZGRpbmcKCWZvcm1hdCBjb250cm9scyBlYXNpZXIKCSogd2FpdC5oIGFkZGVkIGEgY291cGxlIG9mIHVuZGVmJ3MgYmVjYXVzZSB3ZSB3ZXJlIGdldHRpbmcKCWNvbXBsYWludHMgYWJvdXQgV1NUT1BTSUcgYW5kIFdURVJNU0lHIGJlZ2luIHJlZGVmaW5lZC4KCgpXZWQgSnVsICA0IDA1OjI3OjUxIDE5OTAgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgbWFzaGFtKQoKCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBBZGQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgbWV0aG9kIHN0dWJzCglpbiB0aGUgdHlwZSBpbmZvcm1hdGlvbi4KClR1ZSBKdWwgIDMgMDk6Mzk6MTggMTk5MCAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBtYXNoYW0pCgoJKiB2YWx1ZXMuYyAoYmFzZWNsYXNzX2FkZHIpOiBSdW4gbG9vcCBmcm9tIElOREVYKzEgdG8KCU5fQkFTRUNMQVNTRVM7IG90aGVyd2lzZSwgd2UgY2FuIHN0aWxsIGdldCBpbnRvIGEgbG9vcC4KCUBAIFRoaXMgc2hvdWxkIGJlIHJlc3RydWN0dXJlZCB0byB1c2UgYSBjbGVhbmVyIHNlYXJjaCBzdHJhdGVneS4KClN1biBKdWwgIDEgMTI6Mjg6NTEgMTk5MCAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBtYXNoYW0pCgoJKiBkYnhyZWFkLmMgKGRlZmluZV9zeW1ib2wscmVhZF90eXBlKTogR3JvayBHTlUgQysrJ3MgbmV3CglhYmJyZXZpYXRpb24gIlR0IiBmb3IgdGFncyB3aGljaCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlaXIKCXR5cGVkZWNscy4KCkZyaSBKdW4gMjkgMDE6MDM6NDYgMTk5MCAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBtYXNoYW0pCgoJKiBzeW10YWIuYyAobGlzdF9zeW1ib2xzKTogYWRkIGFiaWxpdHkgdG8gc2V0IGJyZWFrcG9pbnRzIG9uIGFsbAoJdGhlIGZ1bmN0aW9ucyB3aGljaCBtYXRjaCBhIHBhcnRpY3VsYXIgcmVndWxhciBleHByZXNzaW9uLgoKVHVlIEp1biAyNiAwNDoyNjoyOSAxOTkwICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IG1hc2hhbSkKCgkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZSk6IE5ldyBwYXJhbWV0ZXIgQU5TSSBzYXlzIHdoZXRoZXIgd2UKCXNob3VsZCBwcmludCBBTlNJIHF1YWxpZmllcnMgKHN1Y2ggYXMgYGNvbnN0JyBhbmQgYHZvbGF0aWxlJykuCglBbGwgY2FsbGVycyBjaGFuZ2VkIHRvIGNhbGwgd2l0aCBBTlNJID09IDEsIGV4Y2VwdCBmcm9tCglgY2hlY2tfbWV0aG9kX3N0dWInLCB3aGljaCB1c2VzIG9sZC1zdHlsZSBzeW50YXguCgoJKiBzeW1zZWcuaCAoc3RydWN0IGZuX2ZpZWxkKTogUmVtb3ZlIHVubmVjY2Vzc2FyeSBgYXJncycgZmllbGQuCgkqIHN5bXRhYi5oIChUWVBFX0ZOX0ZJRUxEX0FSR1MpOiBSZWRlZmluZWQuCgoJKiB2YWx1ZXMuYyAoY2hlY2tfc3R1Yl9tZXRob2QpOiBOZXcgZnVuY3Rpb24uCgoJKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEhhbmRsZSAibG9uZyBsb25nIiAoZW5jb2RlZCBhcyAneCcpLgoKCSogZGJ4cmVhZC5jIChyZWFkX3R5cGUpOiBIYW5kbGUgbmV3IEdOVSBDKysgbWV0aG9kIHR5cGUgc3R1YnMuCgkqIHZhbHByaW50ICh0eXBlX3ByaW50X2Jhc2UpOiBEaXR0by4KCgkqIHN5bXRhYi5jIChnZGJfbWFuZ2xlX3R5cGVuYW1lKTogTmV3IGZ1bmN0aW9uLgoKVHVlIEp1biAgNSAwMDoxODo0MyAxOTkwICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IGd6aWxsYSkKCgkqIGJyZWFrcG9pbnQuYyAoY2F0Y2hfY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4gIFByb3ZpZGVzIGEKCW1lY2hhbmlzbSB0byBzZXQgYnJlYWtwb2ludHMgYmFzZWQgb24gY2F0Y2ggY2xhdXNlcy4KCShkaXNhYmxlX2NhdGNoKTogU2ltaWxhciwgYnV0IGRpc2FibGVzIGJyZWFrcG9pbnRzIG9uIGNhdGNoCgljbGF1c2VzLgoJKGRlbGV0ZV9jYXRjaCk6IFNpbWlsYXIsIGJ1dCBkZWxldGVkIGJyZWFrcG9pbnRzIG9uIGNhdGNoIGNsYXVzZXMuCgpTdW4gSnVuICAzIDIyOjU0OjA4IDE5OTAgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgZ3ppbGxhKQoKCSogYmxvY2tmcmFtZS5jIChibG9ja3ZlY3Rvcl9mb3JfcGMpOiBOZXcgZnVuY3Rpb24uCgkqIGJsb2NrZnJhbWUuYyAoYmxvY2tfZm9yX3BjKTogQ2hhbmdlZCB0byBjYWxsCglgYmxvY2t2ZWN0b3JfZm9yX3BjJyBhbmQgZ2V0IHRoZSBibG9jayBpdHNlbGYuCgoJKiBzdGFjay5jIChjYXRjaF9pbmZvKTogTmV3IGZ1bmN0aW9uLiAgUHJpbnRzIGluZm8gYWJvdXQKCWV4Y2VwdGlvbnMgd2hpY2ggY2FuIGJlIGNhdWdodCBpbiB0aGUgY3VycmVudCBmcmFtZS4KCSogc3RhY2suYyAocHJpbnRfZnJhbWVfbGFiZWxfdmFycyk6IE5ldyBmdW5jdGlvbi4gIFNpbWlsYXIgdG8KCWBwcmludF9mcmFtZV9sb2NhbF92YXJzJy4KCSogc3RhY2suYyAocHJpbnRfYmxvY2tfZnJhbWVfbGFiZWxzKTogUHJpbnRzIG91dCBsYWJlbHMgdGhhdCBhcmUKCWRlZmluZWQgaW4gdGhpcyBmcmFtZS4gIFRoZXNlIGxhYmVscyBhcmUgZXhjZXB0aW9ucyB0aGF0IGNhbiBiZQoJY2F1Z2h0LgoKCSogZGJ4cmVhZC5jOiBVcGRhdGVkIHRvIGhhbmRsZSBOX0NBVENIIHN5bXRhYiB0eXBlcy4KClRodSBNYXkgIDMgMjI6MTA6MDAgMTk5MCAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCB0ZWFjYWtlKQoKCSogdmFscHJpbnQuYyAoZXZlcnl3aGVyZSk6IFRZUEVfTkFNRSAoVFlQRSkgbm8gbG9uZ2VyIGNvbWVzIGluIHRoZQoJZm9ybSAic3RydWN0IC4uLiIgZm9yIEdOVSBDKysuICBEb24ndCBmbHVzaCBhbnkgcGFydCBvZiBUWVBFX05BTUUKCXdoZW4gcHJpbnRpbmcgdGhlIHR5cGUuCgpXZWQgTWF5ICAyIDIyOjQzOjA0IDE5OTAgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgdGVhY2FrZSkKCgkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IFVzZSBgYmFzZWNsYXNzX2FkZHInIHRvIGFjY2VzcyB0aGUKCWJhc2VjbGFzc2VzIHBvaW50ZWQgdG8gdmlhIHRoZSBkZXJpdmVkIGNsYXNzIG9iamVjdCBhdCBWQUxBRERSLgoKCSogdmFsdWVzLmMgKGJhc2VjbGFzc19hZGRyKTogTmV3IGZ1bmN0aW9uLiAgQ2FzdHMgZGVyaXZlZCBwb2ludGVycwoJdG8gYmFzZWNsYXNzIHBvaW50ZXJzIHRha2luZyB2aXJ0dWFsIGJhc2VjbGFzc2VzIGFuZCBtdWx0aXBsZQoJaW5oZXJpdGFuY2UgaW50byBhY2NvdW50LgoKU2F0IE1heSAgNSAxMjozOToxOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogVmVyc2lvbiAzLjkwLjkuCgpGcmkgTWF5ICA0IDEyOjEyOjU1IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBicmVha3BvaW50LmMgKHdhdGNoX2NvbW1hbmQsIGJwc3RhdF9zdG9wX3N0YXR1cyk6IERlYWwgd2l0aAoJZXhwX3ZhbGlkX2Jsb2NrIGZpZWxkIGNvcnJlY3RseS4KCgkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFdoZW4gY2hlY2tpbmcgImRvbid0IGV2ZW4gdGhpbmsKCWFib3V0IGJyZWFrcG9pbnRzIiBpZiBzdG9wX3NpZ25hbCA9PSBTSUdUUkFQICYmIHRyYXBfZXhwZWN0ZWQsCglhbHNvIGNoZWNrIHN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQuCglJbnNlcnQgYnJlYWtwb2ludHMgYW5kIGNvbnRpbnVlIChub3Qgc3RlcCkgaWYKCXN0ZXBfcmVzdW1lX2JyZWFrX2FkZHJlc3MgIT0gTlVMTCwgZXZlbiBpZiBhbm90aGVyX3RyYXAuCglJZiB0cmFwX2V4cGVjdGVkIGFuZCB3ZSBlbnRlciBzaWd0cmFtcCwgdGhlbiBzZXQgdXAgYQoJc3RlcF9yZXN1bWVfYnJlYWsuCglJZiB0cmFwX2V4cGVjdGVkIGlzIHNldCB3aGVuIHdlIGhpdCB0aGUgc3RlcF9yZXN1bWVfYnJlYWssCglzZXQgYW5vdGhlcl90cmFwLgoJV2hlbiBjYWxsaW5nIHJlc3VtZSBhbmQgdHJhcF9leHBlY3RlZCBzYXlzIHRlbGwgcmVzdW1lIHRvIHN0ZXAKCSgyIHBsYWNlcyksIGFsc28gY2hlY2sgc3RlcF9yZXN1bWVfYnJlYWtfYWRkcmVzcy4KCgkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IERvbid0IHNldAoJcHJldl97cGMsc3AsZnVuY197c3RhcnQsbmFtZX19IGJlZm9yZSBjYWxsaW5nIHdhaXQgKCkuCglEbyBzZXQgdGhlbSBhZnRlciBleGl0aW5nIGxvb3AuCglNb3ZlIHRoZWlyIGRlY2xhcmF0aW9ucyBvdXRzaWRlIGZ1bmN0aW9ucy4KCShzdGFydF9pbmZlcmlvcik6IEluaXRpYWxpemUgdGhlbS4KClRodSBNYXkgIDMgMDA6MTU6MTEgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvciwgYWZ0ZXIgY2hlY2sgZm9yIHRyYXBfZXhwZWN0ZWQgPiAxKToKCVJlc3RvcmUgb2xkIGNvZGUgd2hpY2ggZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHRyYXBfZXhwZWN0ZWQgYW5kCglydW5uaW5nX2luX3NoZWxsLCBqdXN0IG1ha2UgdGhlIGxhdHRlciB0YWtlIGFueSBub24tVFJBUCBzaWduYWwsCglub3QganVzdCBTRUdWLgoKCSogdmFsdWVzLmMgKGFsbG9jYXRlX3ZhbHVlKTogWmVybyBWQUxVRV9PUFRJTUlaRURfT1VUIGZsYWcuCgoJKiBNYWtlZmlsZS5kaXN0IChwaW5zbi5vKTogVXNlIFBJTlNOX0NDIHRvIGNvbXBpbGUuCgl4Y29uZmlnLzNiMSAoQ0MsUElOU05fQ0MpOiBEZWZpbmUuCgoJKiB4Y29uZmlnL2FsdG9zLCBhbHRvcy1kZXAuYzogUmVuYW1lIGFsdG9zLWRlcC5jIHRvIGFsdG9zLXhkZXAuYy4KCgkqIFZlcnNpb24gMy45MC44CgoJKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyksCglpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpIFtTSElGVF9JTlNUX1JFR1NdOiBOZXcgY29kZS4KCgkqIHBhcmFtLmgsIHRtLTg4ay5oOiBEZWZpbmUgQUREUl9CSVRTXyouCglpbmZjbWQuYyAoanVtcF9jb21tYW5kLCByZWFkX3BjKSwgaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKSwKCXByaW50Y21kLmMgKGRvX29uZV9kaXNwbGF5KTogVXNlIHRoZW0uCgoJKiB1dGlscy5jOiBTcGxpdCAjaWZkZWYgVVNHIGludG8gYSBVU0dfVVRJTFMgYW5kIGEgUVVFVUVfTUlTU0lORy4KCXhtLTg4ay5oOiBEZWZpbmUgVVNHX1VUSUxTLgoKV2VkIE1heSAgMiAwMDowNTozMyAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogcHJpbnRjbWQuYyAocHJpbnRmX2NvbW1hbmQpIFtfX0lOVF9WQVJBUkdTX0hdOiBOZXcgY29kZS4KCShwcmludGZfY29tbWFuZCk6IEFkZCBmcm9tX3R0eSBwYXJhbWV0ZXIuCgoJKiB2YWxwcmludC5jICh2YWx1ZV9wcmludCk6IENoZWNrIFZBTFVFX09QVElNSVpFRF9PVVQgZmxhZy4KCgkqIHZhbHVlLmg6IEFkZCBvcHRpbWl6ZWRfb3V0IGZpZWxkIGFuZCBjaGFuZ2UgbGF6eSBmaWVsZCB0bwoJY2hhci4gIEFkZCBtYWNybyBWQUxVRV9PUFRJTUlaRURfT1VULgoKCSogaTM4Ni1waW5zbi5jOiBDaGFuZ2UgZnJvbSBFaXJpayBGdWxsZXIgdG8gd3JpdGUgdG8gc3RyZWFtIGRpcmVjdGx5CglpbnN0ZWFkIG9mIHN0dWZmaW5nIHRoaW5ncyBpbiBidWZmZXJzIChvYXBwZW5kLCBldGMpLgoKCSogYnJlYWtwb2ludC5jIChicHN0YXRfZG9fYWN0aW9ucyk6IElmICpCU1AgaXMgc2V0IHRvIE5VTEwgYnkKCWV4ZWN1dGVfY29tbWFuZCwgZXhpdCBib3RoIGxvb3BzLgoKCSogTWFrZWZpbGUuZGlzdDogRG9uJ3Qgc2V0IFRBUkdFVF9BUkNILiAgQWRkIC5jLm8gcnVsZS4KClR1ZSBNYXkgIDEgMTc6MDc6MjMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIE1ha2VmaWxlLmRpc3QgKFJBUFBfT0JTLCByYXBwKSwKCXJnZGIuYywgcnNlcmlhbC5jLCBydWRwLmMsIHNlcmlhbC5jLCB1ZHAuYywgeGRlcC5oLAoJcmVtb3RlLmg6IEFkZGVkLgoJbTY4ay14ZGVwLmMsIGNvcmVkZXAuYzogV3JhcCBpbiAjaWYgIWRlZmluZWQgKFJEQikuCgoJKiB2YWxvcHMuYyAodmFsdWVfc3RydWN0X2VsdCksIHZhbHVlcy5jICh2YWx1ZV9zdGF0aWNfZmllbGQpOgoJQ2hhbmdlIGVycm9yIG1lc3NhZ2VzIHRvIHJlbW92ZSByZWZlcmVuY2VzIHRvIGBpbmZvIG1ldGhvZHMnLgoKVHVlIEFwciAyNCAxMDoyNToxMCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogTW9yZSA4OGsgY2hhbmdlczoKCWluZnJ1bi5jIChzdGFydF9pbmZlcmlvcik6IEFkZCBTVEFSVF9JTkZFUklPUl9IT09LLgoJaW5mY21kLmMgW1NISUZUX0lOU1RfUkVHU106IE5ldyBjb2RlLgoJZmluZHZhci5jIChyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyk6IFJldHVybiBhIHZhbHVlLgoJaW5mY21kLmMgKGRvX3JlZ2lzdGVyc19pbmZvKTogQ2hlY2sgdmFsdWUgZnJvbQoJcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMuCgoJKiBjb21tYW5kLmMgKGRlbGV0ZV9jbWQpOiBGcmVlIHRoZSBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudChzKQoJd2UgYXJlIHJlbW92aW5nLgoKTW9uIEFwciAyMyAxMDo0MjoyMSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogTW9yZSA4OGsgY2hhbmdlczoKCWZpbmR2YXIuYyAoZ2V0X3NhdmVkX3JlZ2lzdGVyKTogTmV3IGZ1bmN0aW9uLgoJZmluZHZhci5jOiBSZXdyaXRlIGNvZGUgd2hpY2ggY2FsbGVkIGZpbmRfc2F2ZWRfcmVnaXN0ZXIgdG8KCWNhbGwgZ2V0X3NhdmVkX3JlZ2lzdGVyIGluc3RlYWQuCgpTdW4gQXByIDIyIDE0OjQ3OjUxIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSBwcmludGVkIHdoZW4KCXRoZSB0eXBlIGhhcyBUWVBFX0ZMQUdfU1RVQiBzZXQuCgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiBDaGVjayBmb3IgVFlQRV9DT0RFX1VOREVGLgoKCSogZmluZHZhci5jICh3cml0ZV9yZWdpc3Rlcik6IFNldCByZWdpc3Rlcl92YWxpZCAocmVnbm8pLgoKCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pOiBDaGVjayBmb3IgTlVMTCByZXR1cm4gZnJvbSBibG9ja19mb3JfcGMuCgpGcmkgQXByIDIwIDExOjMxOjIzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBmaW5kdmFyLmMgKHdyaXRlX3JlZ2lzdGVyKTogQWRkIFBSRVBBUkVfVE9fU1RPUkUuCgl7c3VuMyxzcGFyYyxzeW1tZXRyeX0teGRlcC5jIChQUkVQQVJFX1RPX1NUT1JFKTogQWRkLgoJaW5mcHRyYWNlLmMsIHttaXBzLHB5cixzeW1tZXRyeSxzdW4zLGFybSxocDMwMGhwdXh9LXhkZXAuYwoJKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IERvbid0IGNhbGwgcmVhZF9yZWdpc3Rlcl9ieXRlcy4KCXN5bW1ldHJ5LXhkZXAuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKToKCSNpZiAwIG91dCBjb2RlIHRvIGZldGNoIHJlZ2lzdGVycy4KCgkqIHZhbHVlcy5jICh2YWx1ZV9hc19sb25nKTogQ2FsbCBDT0VSQ0VfQVJSQVkuCgoJKiB0bS1zdW4zLmg6IEluY2x1ZGUgdG0tNjhrLmggbm90IG0tNjhrLmgKCgkqIHNwYXJjLXRkZXAuYyAoc2luZ2xlX3N0ZXApOiBTZXQgbmV4dF9wYywgbnBjNCB3aXRoaW4KCWlmICghb25lX3N0ZXBwZWQpLCBub3Qgb3V0c2lkZSBpdC4KCgkqIENoYW5nZXMgZnJvbSBEYXRhIEdlbmVyYWwgZm9yIDg4azoKCSogY29mZnJlYWQuYyAocmVhZF9maWxlX2hkcik6IEFkZCAqODgqTUFHSUMuCgkqIGNvZmZyZWFkLmMgKGhhdmVfc3ltYm9sX2ZpbGVfcCk6IE5ldyBmdW5jdGlvbi4KCSogY29mZnJlYWQuYyBbQ09GRl9DSEVDS19YX1pFUk9FU10gW1RERVNDXTogTmV3IGNvZGUuCgkqIGNvZmZyZWFkLmMgKHJlYWRfb25lX3N5bSk6IElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKCWF1eCBlbnRyeSwgZG9uJ3QgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlLCBqdXN0IGlnbm9yZSB0aGUKCWV4dHJhIG9uZXMuCgkqIGNvZmZyZWFkLmMgKHByb2Nlc3NfY29mZl9zeW1ib2wpOiBSZXBsYWNlIGNsaXBwZXIgd2l0aAoJQkVMSUVWRV9QQ0NfUFJPTU9USU9OIGluICNpZmRlZidzLgoJKiBjb2ZmcmVhZC5jOiBEZWZpbmUgTF9MTk5PMzIgaWYgbm90IGRlZmluZWQuCgkoZW50ZXJfbGluZW5vcyk6IFVzZSBpdC4KCSogYmxvY2tmcmFtZS5jOiBBZGQgSU5JVF9GUkFNRV9QQyBob29rIGFuZCB1c2UgaXQgaW4KCWdldF9wcmV2X2ZyYW1lX2luZm8uCgltLW04OGsuaDogVXNlIElOSVRfe0ZSQU1FX1BDLEVYVFJBX0ZSQU1FX0lORk99IHRvIGRvIHRkZXNjIHN0dWZmLgoJVXNlIGR1bW15IHZlcnNpb25zIG9mIEZSQU1FX0NIQUlOXyouCgkqIE1ha2VmaWxlLmRpc3QsIHhjb25maWcvaTM4Nio6IFJlbmFtZSBNX0NMSUJTIHRvIFhNX0NMSUJTIGFuZCBhZGQKCVRNX0NMSUJTIGFuZCBDREVQUy4KCXRkZXNjL2xpYmRjLm86IE5ldyB0YXJnZXQuCgl0ZGVzYy57YyxofSwgdGRlc2MvKiwge3QseH1jb25maWcvbTg4azogTmV3IGZpbGVzLgoKVGh1IEFwciAxMiAxNTo0NzowMCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogbTY4ay1vcGNvZGUuaCAoYnJhcywgYnNycyk6IFVzZSAiQnciIG5vdCAiQmciLgoKVHVlIEFwciAxMCAyMDo1MDoyNSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogVmVyc2lvbiAzLjkwLjcuCgoJKiB4bS1taXBzLmggKEJZVEVfT1JERVIpOiBJZiBub3QgZGVmaW5lZCwgbWFrZSBpdCBMSVRUTEVfRU5ESUFOLgoKCSogbWlwcy14ZGVwLmMgKHtmZXRjaCxzdG9yZX1faW5mZXJpb3JfcmVnaXN0ZXJzKTogUmVtb3ZlIHZhcmlhYmxlCglvZmZzZXQgYW5kIGp1c3QgdXNlIHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCAxKS4KCShjb3JlX2ZpbGVfY29tbWFuZCk6IFJlbW92ZSB2YXJpYWJsZSByZWdfb2Zmc2V0IGFuZCBqdXN0IHVzZQoJcmVnaXN0ZXJfYWRkciAocmVnbm8sIDApLgoKCSogZ2RiY29yZS5oIFtDT0ZGX0ZPUk1BVF06ICN1bmRlZiBhX21hZ2ljIGJlZm9yZSByZWRlZmluaW5nIGl0LgoKCSogaW5mcnVuLmMgKCJpZiAodHJhcF9leHBlY3RlZCAmJiBzdG9wX3NpZ25hbCAhPSBTSUdUUkFQKSIsIG5lYXIgZW5kCglvZiB3YWl0X2Zvcl9pbmZlcmlvcik6IEFsd2F5cyBwYXNzIDAgYXMgZmlyc3QgYXJnIHRvIHJlc3VtZS4KCSNpZiAwIG91dCAiU0lHU0VHViBpbiBzaGVsbCIgdGVzdCByaWdodCBhYm92ZSBpdCAobm93IHJlZHVuZGFudCkuCgoJKiBpMzg2LXBpbnNuLmMgKG9hcHBlbmRfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KCShvYXBwZW5kKTogTWFrZSBpdCAic3RhdGljIHZvaWQiIGFuZCBkZWNsYXJlIGF0IHRvcCBvZiBmaWxlLgoJKE9QX0osIE9QX0RJUik6IFVzZSBvYXBwZW5kX2FkZHJlc3MuCgpNb24gQXByICA5IDE1OjIyOjA5IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBtaXBzLXhkZXAuYzogSW5jbHVkZSA8bWlwcy9pbnN0Lmg+IG5vdCAibWlwcy9pbnN0LmgiLgoKCSogd2FpdC5oIFtIQVZFX1dBSVRfU1RSVUNUXTogUHV0ICNkZWZpbmVzIGluICNpZiAhZGVmaW5lZCBzbyB0aGF0CglpdCdzIE9LIGlmIHRoZXkgYXJlIGRlZmluZWQgaW4gPHN5cy93YWl0Lmg+LgoKCSogZmluZHZhci5jIChmZXRjaF9yZWdpc3RlcnMpOiBQYXNzICJyZWdpc3RlcnMiLCBub3QgIiZyZWdpc3RlcnMiLAoJdG8gcmVtb3RlX2ZldGNoX3JlZ2lzdGVycy4KCgkqIG1pcHMtdGRlcC5jIChfaW5pdGlhbGl6ZV9taXBzZGVwKTogUmVtb3ZlIGhleF9kaXNhc3NlbWJsZXIKCWFuZCByZS13cml0ZSBza2lwX3Byb2xvZ3VlIHRvIHVzZSBhZGRfc2V0X2NtZC4KCgkqIE1ha2VmaWxlLmRpc3QgKGFsbGRlcHMubWFrKTogRG9uJ3QgcHV0IFwgYWZ0ZXIgdGhlIGxhc3QKCWZpbGVuYW1lIGluIGVhY2ggbGlzdC4KClN1biBBcHIgIDggMDE6NTk6MTkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIFZlcnNpb24gMy45MC42LgoKCSogTWFrZWZpbGUuZGlzdCAoYWxsZGVwcy5tYWspOiAiWE1fRklMRSIgLT4gIlhNX0ZJTEU9Ii4KCgkqIHZhbGFyaXRoLmMgKHZhbHVlX3hfe3VuLGJpbn1vcCk6IHVzZSAib3BlcmF0b3IiIG5vdCAib3BlcmF0b3IgIgoJdG8gbWF0Y2ggZGJ4cmVhZC5jIGNoYW5nZSBvZiAxNiBNYXIgOTAuCgoJKiB2YWxhcml0aC5jICh2YWx1ZV94X3Vub3ApOiBQYXNzICZzdGF0aWNfbWVtZnVuY3AsCglub3Qgc3RhdGljX21lbWZ1bmNwLgoKCSogYnJlYWtwb2ludC5jOiBBZGQgd2F0Y2hwb2ludCBzdHVmZi4KCWJyZWFrcG9pbnQuaDogQWRkIGJwc3RhdF9zaG91bGRfc3RlcC4KCWluZnJ1bi5jIChwcm9jZWVkLCB3YWl0X2Zvcl9pbmZlcmlvcik6IFVzZSBpdC4KCWJyZWFrcG9pbnQuaDogQWRkIGJwc3RhdF9wcmludCAoYW5kIHJlbmFtZSBvbGQgYnBzdGF0X3ByaW50Cgl0byBicHN0YXRfc2hvdWxkX3ByaW50KS4KCWluZnJ1bi5jIChub3JtYWxfc3RvcCk6IFVzZSBpdC4KCgkqIHZhbHVlLmg6IEFkZCB2YWx1ZV9mcmVlLiAgRGVjbGFyZSBhIGZldyBmdW5jdGlvbnMuCgpTYXQgQXByICA3IDIxOjQzOjQzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IFJlbW92ZSBQUk9GSUxFX1RZUEVTIGNvZGUgYW5kCglpbnNlcnQgY29tbWVudCBzdWdnZXN0aW5nIGVhc3kgc2hlbGwgc2NyaXB0IGVxdWl2YWxlbnRzLgoKCSogdmFsdWVzLmMgKHVucGFja19sb25nKTogR2l2ZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yCgl1bnJlY29nbml6ZWQgc2l6ZXMgb2YgaW50cyBhbmQgZmxvYXRzLgoKRnJpIEFwciAgNiAwMDozMjoyMSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogZGJ4cmVhZC5jLCBnZGJjb3JlLmggKElTX09CSkVDVF9GSUxFKTogQ2hlY2sgZm9yIGFfZHJzaXplCglub256ZXJvIGFzIHdlbGwgYXMgYV90cnNpemUuCgoJKiBNb3JlIHBsYWNlczogVXNlIFNXQVBfVEFSR0VUX0FORF9IT1NULgoKCSogdmFsb3BzLmMgKGRlc3RydWN0b3JfbmFtZV9wKTogT25seSBza2lwICJzdHJ1Y3QgIiBpZiBwcmVzZW50LgoKCSogbWFpbi5jIChnZGJfcmVhZGxpbmUpOiBSZXR1cm4gTlVMTCBvbiBlbmQgb2YgZmlsZS4KCgkqIHNwYXJjLW9wY29kZS5oOiBBZGQgam1wIDErMiwgam1wIDEraSwgam1wIGkrMS4KCgkqIE1ha2VmaWxlLmRpc3Q6IE1ha2UgZXhwcmVhZC50YWIuYyB1bmFtYmlndW91c2x5IGJlIGluIHNyY2Rpci4KCgkqIG1haW4uYzogU3BsaXQgc291cmNlX2NvbW1hbmQgaW50byBzb3VyY2VfY29tbWFuZCBhbmQKCXJlYWRfY29tbWFuZF9maWxlLgoJKG1haW4pOiBBY2NlcHQgIi0iIGFzIGFyZyB0byArY29tbWFuZCBmb3Igc3RkaW4uCgoJKiBkYnhyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogRG9uJ3QgcmVhZCBzdHJpbmcgdGFibGUuCgkoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IFNhdmUgc3RyaW5nIHRhYmxlIHNpemUuCgoJKiBWZXJzaW9uIDMuOTAuNQoKCSogc3ltdGFiLmM6IFJlbW92ZSBkZWNsYXJhdGlvbiBvZiBsb29rdXBfbWlzY19mdW5jLgoKCSogbWlwcy1waW5zbi5jOiBBZGQgdXNlX2hleF9wIHN0dWZmIChyZS13b3JrZWQgZnJvbSBGb3JpbiBzdHVmZikuCgoJKiBtaXBzLW9wY29kZS5oOiBBZGQgYmRlbGF5IGZpZWxkLgoJbWlwcy1waW5zbi5jOiBWYXJpb3VzIGNoYW5nZXMgZnJvbSBGb3JpbiwgSSB0aGluayB0byBtYWtlIGl0IGxvb2sKCWxpa2UgdGhlIE1JUFMgYXNzZW1ibGVyIGZvcm1hdC4KCW1pcHMtdGRlcC5jLCBtaXBzLXhkZXAuYywgbWlwc3JlYWQuYzogVmFyaW91cyBjaGFuZ2VzIGZyb20gRm9yaW4uCgoJKiBnZGJjb3JlLmg6IERlY2xhcmUgcmVnaXN0ZXJfYWRkci4KCgkqIGdkYmNvcmUuaDogSW5jbHVkZSA8YS5vdXQuaD4sIGJlZm9yZSB0cnlpbmcgdG8gcmVkZWZpbmUgTl9UWFRBRERSCglhbmQgZnJpZW5kcy4KCXZhcmlvdXM6IERvbid0IGluY2x1ZGUgYm90aCBhLm91dC5oIGFuZCBnZGJjb3JlLmguCgoJKiBNYWtlZmlsZS5kaXN0IChIRklMRVMpOiBBZGQgcGFyYW0uaAoKCSogdXRpbHMuYyAoaW5pdF9tYWxsb2MpOiBNb3ZlZCBoZXJlIGZyb20gbWNoZWNrLmMgYW5kIG1vZGlmaWVkCgl0byB1c2UgdGhlIHN0YW5kYXJkIG1jaGVjay5jCglNYWtlZmlsZS5kaXN0OiBNb2RpZnkgdG8gcmVmbGVjdCBuZXcgbWNoZWNrLgoKVGh1IEFwciAgNSAxNjozODoyOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogdmFscHJpbnQuYyAodmFsX3ByaW50LCBwcmludF9oZXhfY2hhcnMpOiBQcmludCBpbnRlZ2VycwoJbGFyZ2VyIHRoYW4gTE9OR0VTVC4KCgkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1Yik6IEdpdmUgZXJyb3IgbWVzc2FnZSBpZiBhdHRlbXB0IHRvCglzdWJ0cmFjdCBzb21ldGhpbmcgb2YgdGhlIHdyb25nIHR5cGUgZnJvbSBhIHBvaW50ZXIuCgoJKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6IEluaXRpYWxpemUgcmV0dmFsIHRvIE5VTEwuCgoJKiBpMzg2LXRkZXAuYyAoaTM4Nl9wb3BfZnJhbWUpOiBDaGFuZ2UgYWRkciB0byBhZHIuCgpXZWQgQXByICA0IDA1OjIxOjUwIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCB0ZWVuYWdlLW11dGFudCkKCgkqIG1haW4uYyAoY29tbWFuZF9saW5lX2lucHV0KTogcmV0dXJuIE5VTEwgb24gZW5kIG9mIGZpbGUuCgkoZXhlY3V0ZV9jb21tYW5kKTogSWYgcCBpcyBOVUxMLCByZXR1cm4gYWxtb3N0IHJpZ2h0IGF3YXkuCgkocmVhZF9jb21tYW5kX2xpbmVzKTogVHJlYXQgZW5kIG9mIGZpbGUgbGlrZSAiZW5kIi4KCgkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiBDaGFuZ2UgaXQgc28gbnVtIGlzIG51bWJlcgoJb2YgaW50cyBvZiBhcmdzLCBub3QgbnVtYmVyIG9mIGFyZ3MuCgoJKiB4bS0qLmg6IE1ha2Ugc3VyZSBCWVRFX09SREVSIGlzIGRlZmluZWQuCglBbHNvIGZpeCB2YXJpb3VzICNpbmNsdWRlcyBvZiBvbGQgbmFtZXMgb2YgdGhpbmdzLgoKCSogbWFpbi5jIChjb21tYW5kX2xpbmVfaW5wdXQpOiBGaXggY29tbWVudCBjb2RlIG9mIDIgQXByLgoKCSogdmFsdWVzLmMgKHZhbHVlX2Zyb21fbG9uZywgdW5wYWNrX2xvbmcpOiBTV0FQX1RBUkdFVF9BTkRfSE9TVC4KCXZhcmlvdXM6IFJlcGxhY2Uge0JZVEVTLFdPUkRTfV9CSUdfRU5ESUFOIHdpdGggVEFSR0VUX0JZVEVfT1JERVIuCgl2YWxhcml0aC5jIHZhcmlvdXM6IFNXQVBfVEFSR0VUX0FORF9IT1NULgoJZGJ4cmVhZC5jIChSRUFEX0ZJTEVfSEVBREVSUyk6IFNXQVBfVEFSR0VUX0FORF9IT1NULgoJKFNXQVBfU1lNQk9MKTogTmV3IG1hY3JvLiAgVXNlIGl0IHdoZXJldmVyIHN5bWJ1Zl9pZHggaXMgaW5jcmVtZW50ZWQuCglleGVjLmMgKGV4ZWNfZmlsZV9jb21tYW5kKTogU1dBUF9UQVJHRVRfQU5EX0hPU1QuCgoJKiB2YWxhcml0aC5jICh2YWx1ZV9zdWJzY3JpcHRlZF9ydmFsdWUpOiBKdXN0IGJjb3B5KCkgdGhlCglhcHByb3ByaWF0ZSBieXRlcyByYXRoZXIgdGhhbiBwbGF5aW5nIHN0cmFuZ2UgZ2FtZXMgd2l0aAoJdmFsdWVfZnJvbV9sb25nLgoKCSogcGFyYW0uaCAoU1dBUF9UQVJHRVRfQU5EX0hPU1QpOiBOZXcgbWFjcm8uCgoJKiB0bS1ucDEuaCAoVjdfUkVHTlVNKTogQ2hhbmdlIGZyb20gMjcgdG8gMjYuCgkoUkVHSVNURVJfVklSVFVBTF9UWVBFKTogUmV0dXJuIGNvcnJlY3QgcmVzdWx0IGZvciB2ZWN0b3IgcmVncy4KCWdvdWxkLXRkZXAuYzogTmV3IGZpbGUuCgoJKiBNb3ZlIHJlYWRpbmcgb2YgcmVnaXN0ZXIgYmVmb3JlIHN0b3JlIGZyb20KCWZpbmR2YXIuYyAod3JpdGVfcmVnaXN0ZXIpIHRvCglpbmZwdHJhY2UuYywgKi14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyKS4KCgkqIGZpbmR2YXIuYyAoZmV0Y2hfcmVnaXN0ZXJzLCBzdG9yZV9yZWdpc3RlcnMpOiBOZXcgZnVuY3Rpb25zLgoJd3JpdGVfcmVnaXN0ZXJ7LF9ieXRlc306IFVzZSBzdG9yZV9yZWdpc3RlcnMgcmVnYXJkbGVzcyBvZgoJaGF2ZV9pbmZlcmlvcl9wLgoJcmVnaXN0ZXJzX3ZhbGlkOiBOZXcgdmFyaWFibGUuCgkoc3VwcGx5X3JlZ2lzdGVyLCByZWFkX3JlZ2lzdGVyLCBldGMuKTogVXNlIGl0LgoJKHJlYWRfcmVnaXN0ZXJfZ2VuKTogTmV3IHZhcmlhYmxlLgoJdmFyaW91czogVXNlIHJlYWRfcmVnaXN0ZXJfZ2VuIHJhdGhlciB0aGFuIHJlYWRfcmVnaXN0ZXJfYnl0ZXMKCXdoZXJlIGFwcHJvcHJpYXRlLgoJKi14ZGVwLmMgKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6IFJlbW92ZSByZW1vdGVfZGVidWdnaW5nIGNoZWNrLgoJaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yLCBzdGFydF9pbmZlcmlvcik6IENhbGwgcmVnaXN0ZXJzX2NoYW5nZWQKCW5vdCBmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMuCgkqLXhkZXAuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogQ2FsbCByZWdpc3RlcnNfZmV0Y2hlZCBpZgoJbm90IHNldHRpbmcgcmVnaXN0ZXJzIHZpYSBzdXBwbHlfcmVnaXN0ZXIsIGFuZCBpZiBmZXRjaGluZwoJYWxsIHJlZ2lzdGVycy4KCWluZnB0cmFjZS5jLCAqLXhkZXAuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogQWRkIHBhcmFtLAoJIyBvZiByZWdpc3RlciB0byBmZXRjaCAoLTEgZm9yIGFsbCkuCglpbmZwdHJhY2UuYywgaHAzMDBocHV4LXhkZXAuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKToKCUFjdHVhbGx5IGZldGNoIG9ubHkgdGhvc2UgcmVnaXN0ZXJzIG5lZWRlZC4KCXZhbHVlLmg6IERlY2xhcmUgYWxsIHRoZSBleHRlcm4gcmVnaXN0ZXIgZnVuY3Rpb25zIGZyb20gZmluZHZhci5jLgoKCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6IFRlc3QgZm9yIHNwZWNpZmljIGtpbmRzIG9mIEdDQwoJbGFiZWxzIChMSSUuKiwgTFBCJS4qLCBldGMpLCBub3QganVzdCA/PyUuKi4KCgkqIGNvZmZyZWFkLmMgKHJlY29yZF9taXNjX2Z1bmN0aW9uKTogVXNlIG1mX3RleHQgbm90IG1mX3Vua25vd24uCgoJKiB1dGlscy5jLGRlZnMuaCAobGluZXNfdG9fbGlzdCk6IE5ldyBmdW5jdGlvbi4KCXNvdXJjZS5jIChzZWxlY3Rfc291cmNlX3N5bXRhYiwgbGlzdF9jb21tYW5kLCBmb3J3YXJkX3NlYXJjaF9jb21tYW5kLAoJcmV2ZXJzZV9zZWFyY2hfY29tbWFuZCksIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOgoJVXNlIGl0IGluc3RlYWQgb2YgMTAuCgoJKiBtdW5jaDogSWYgTVVOQ0hfTk0gdmFyaWFibGUgZXhpc3RzLCB1c2UgaXQuCgoJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6IFNldCBybF9yZWFkbGluZV9uYW1lLgoJbWFpbi5jOiAjaW5jbHVkZSByZWFkbGluZS5oIGFuZCAjdW5kZWYgc2F2ZXN0cmluZy4KCVJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgdGhpbmdzIGRlY2xhcmVkIGluIHJlYWRsaW5lLmguCgoJKiBtYWluLmMgKGdkYl9yZWFkbGluZSk6IElmIGluc3RyZWFtID09IDAsIHJlYWQgZnJvbSBzdGRpbi4KCgkqIG1haW4uYyAobWFpbik6IE9ubHkgY2FsbCBjbGVhcmVyciBpZiBJU0FUVFkuICBFeGl0IGxvb3AgaWYKCWZlb2YgKGluc3RyZWFtKS4KCgkqIGluZmNtZC5jIChkZXRhY2hfY29tbWFuZCk6IFNldCBpbmZlcmlvcl9waWQgdG8gMCBhZnRlcgoJY2FsbGluZyByZW1vdGVfY2xvc2UuCgoJKiBtYWluLmMgKG1haW4pOiBJZiBleGVjIGFuZCBzeW0gZmlsZXMgYXJlIHRoZSBzYW1lLCBhbmQgdGhlcmUKCWlzIGFuIGVycm9yIHJlYWRpbmcgZXhlY2ZpbGUsIGRvbid0IHRyeSB0byByZWFkIHN5bSBmaWxlLgoKCSogaW5mY21kLmMgKGRldGFjaF9jb21tYW5kKSBbQVRUQUNIX0RFVEFDSF06IERvbid0IHRyeSB0byBkZXRhY2gKCWZyb20gaW5mZXJpb3Igd2hlbiByZW1vdGUgZGVidWdnaW5nLgoKCSogc291cmNlLmMgKHJldmVyc2Vfc2VhcmNoX2NvbW1hbmQpOiBDaGFuZ2Ugd2hpbGUgdGVzdCBmcm9tIDEgdG8KCWxpbmUgPiAxLgoKVHVlIEFwciAgMyAxODoxNDoxNCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogVmVyc2lvbiAzLjkwLjQuCgoJKiBNYWtlZmlsZS5kaXN0IChnZGIudGFyLlopOiBVc2UgLXogb3B0aW9uIHRvIHRhciByYXRoZXIgdGhhbgoJY3JlYXRpbmcgZ2RiLnRhciBhbmQgY2FsbGluZyBjb21wcmVzcyBzZXBhcmF0ZWx5LgoKCSogYnJlYWtwb2ludC5jIChyZWFkX21lbW9yeV9ub2JwdCk6IERvIG5vdCB0cmVhdCBiY29weSBhcyBpZiBpdAoJcmV0dXJuZWQgYW4gImVycm5vIiB2YWx1ZS4KCgkqIHZhcmlvdXM6IE1ha2Ugc3VyZSBnZGJjb3JlLmggaXMgbm90IGluY2x1ZGVkIGJlZm9yZSBhLm91dC5oLgoKCSogTWFrZWZpbGUuZGlzdCAoT1BDT0RFUyk6IEFkZCBtaXBzLW9wY29kZS5oLgoKCSogY29uZmlnLmdkYjogUHJpbnQgbGlzdHMgb2Yge2hvc3RzLHRhcmdldHN9IGFmdGVyIGZpbmRpbmcgc3JjZGlyLgoJV2hlbiBwYXJzaW5nICt7aG9zdCx0YXJnZXR9PSwgc3RyaXAgb2ZmICt7aG9zdCx0YXJnZXR9PSwgbm90ICt7eCx0fW09LgoKCSogTWFrZWZpbGUuZGlzdCAoZ2RiLnRhcik6IERvIHt0LHh9Y29uZmlnIG5vdCBqdXN0IGNvbmZpZy4KCk1vbiBBcHIgIDIgMDI6NDI6MjMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIHNwYXJjLW9wY29kZS5oIChpbmMpOiBGaXggaW5jb3JyZWN0IGxvc2UgZmllbGQuCgoJKiB2YWxhcml0aC5jICh2YWx1ZV9zdWJzY3JpcHRlZF9ydmFsdWUpOiBVc2UgVEFSR0VUX0JZVEVfT1JERVIsCglyYXRoZXIgdGhhbiBjaGVja2luZyBlbmRpYW5uZXNzIGF0IHJ1bnRpbWUuCgoJKiBtYWluLmMgKGNvbWFuZF9saW5lX2lucHV0KTogQWNjZXB0IGNvbW1lbnRzIGFueXdoZXJlLCBub3QKCWp1c3QgYXQgc3RhcnRzIG9mIGxpbmVzLgoKU2F0IE1hciAzMSAyMTo1OTozNSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogc3ltdGFiLmMgKGNoZWNrX3N0dWJfdHlwZSk6IENhbGwgbG9va3VwX3N5bWJvbCB3aXRoIDUgYXJncy4KCkZyaSBNYXIgMzAgMTU6MjM6NTIgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIGZyYW1lLmg6ICNpbmNsdWRlIHBhcmFtLmguCglwYXJhbS5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLgoKCSogaTM4Ni10ZGVwLmMgKGkzODZfZ2V0X2ZyYW1lX3NldHVwKTogRml4IGNvbW1lbnQgYWJvdXQgd2hhdAoJb3Bjb2RlIDB4NTUgaXMuCglJZiAweDgxIG9yIDB4ODMgaXMgZm9sbG93ZWQgYnkgc29tZXRoaW5nIGJlc2lkZXMgMHhlYywKCXB1dCBjb2Rlc3RyZWFtIGJhY2sgd2hlcmUgaXQgd2FzIGFuZCByZXR1cm4gMC4KCVtVU0VfTUFDSElORV9SRUdfSF06IEluY2x1ZGUgPG1hY2hpbmUvcmVnLmg+IG5vdCA8c3lzL3JlZy5oPgoJTW92ZSBpbmNsdWRlIG9mIGEub3V0LmggYWJvdmUgPHN5cy91c2VyLmg+LgoJKGkzODZfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogTWFrZSBsb2NhbHMgc2lnbmVkLgoJKGkzODZfZnJhbWVfZmluZF9zYXZlZF9yZWdzLCBpMzg2X3B1c2hfZHVtbXlfZnJhbWUsIGkzODZfcG9wX2ZyYW1lKToKCVVzZSBSRUdJU1RFUl9CWVRFUywgUkVHSVNURVJfUkFXX1NJWkUsIGV0Yy4gdG8gZGVhbCB3aXRoIGZsb2F0aW5nCglwb2ludCByZWdpc3RlcnMuCgpXZWQgTWFyIDI4IDE4OjMzOjQwIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBtb2xlLmFpLm1pdC5lZHUpCgoJKiBNYWtlZmlsZS5kaXN0IChPVEhFUlMpOiBBZGQgZ2RiLmR2aS4KCShnZGIuZHZpKTogTmV3IHJ1bGUuCgoJKiBicmVha3BvaW50LmMgKF9pbml0aWFsaXplX2JyZWFrcG9pbnQpOiBDbGVhbiB1cCBkb2NzdHJpbmdzIHNvCglhcyBub3QgdG8gbWVudGlvbiBzdWJjb21tYW5kcyAoZS5nLiBhdXRvLWRpc3BsYXkpLgoJQ2FsbCBhZGRfY21kIG5vdCBhZGRfYWJicmV2X2NtZCBmb3IgImRpc2FibGUgYnJlYWtwb2ludCIgYW5kCglwdXQgaXQgaW4gY2xhc3NfYWxpYXMuCgoJKiBicmVha3BvaW50LmMgKHNldF9icmVha3BvaW50X2NvdW50KTogTmV3IGZ1bmN0aW9uLgoJKHNldF9icmVha3BvaW50LCBicmVha19jb21tYW5kXzEpOiBVc2UgaXQuCgoJKiBicmVha3BvaW50LmMgKGdldF9udW1iZXIpOiBOZXcgZnVuY3Rpb24uCgkoKl9jb21tYW5kLCBtYXBfYnJlYWtwb2ludF9udW1iZXJzKTogVXNlIGl0LgoKCSogaW5mcHRyYWNlLmMgKHdyaXRlX2luZmVyaW9yX21lbW9yeSk6IFJlbW92ZSByZW1vdGVfZGVidWdnaW5nCglzdHVmZiAoaXMgaGFuZGxlZCBpbiBjb3JlLmMpLgoJKHJlYWRfaW5mZXJpb3JfbWVtb3J5KTogUmVtb3ZlICNpZiAwJ2Qgb3V0IHJlbW90ZV9kZWJ1Z2dpbmcgY29kZS4KClR1ZSBNYXIgMjcgMTY6NTE6MjcgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKCgkqIGluZmVyaW9yLmg6IEluY2x1ZGUgZnJhbWUuaC4KCgkqIGZpbmR2YXIuYyAod3JpdGVfcmVnaXN0ZXIpOiBSZXBsYWNlIHN1bjQgI2lmZGVmIHdpdGgKCWNoZWNrIG9mIENBTk5PVF9TVE9SRV9SRUdJU1RFUi4KCXhtLXNwYXJjLmg6IERlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIuCgoJKiBzcGFyYy10ZGVwLmM6IFJlbW92ZSBzdXBlcmZsdW91cyBkZWNsYXJhdGlvbiBvZgoJZ2V0X2JyZWFrcG9pbnRfY29tbWFuZHMuCgoJKiBicmVha3BvaW50LntjLGh9OiBBZGQgYnBzdGF0IHN0dWZmLgoJYnBzdGF0X2RvX2FjdGlvbjogUmUtd29yayBkb19icmVha3BvaW50X2NvbW1hbmRzIGludG8gdGhpcy4KCW1haW4uYyAoY29tbWFuZF9sb29wKTogQ2FsbCBicHN0YXRfZG9fYWN0aW9uIG5vdAoJZG9fYnJlYWtwb2ludF9jb21tYW5kcy4KCWluZmVyaW9yLmgsIGluZnJ1bi5jLCBicmVha3BvaW50LmMsIGluZmNtZC5jOgoJUmV3b3JrIGJyZWFrcG9pbnRfY29tbWFuZHMgYW5kIHN0b3BfYnJlYWtwb2ludAoJc3R1ZmYgdG8gdXNlIGJwc3RhdCBpbnN0ZWFkLgoKCSogaW5mY21kLmMgKHByb2dyYW1faW5mbyk6ICJpbmZvIHJlZyItPiJpbmZvIHJlZ2lzdGVycyIuCgoJKiBucDEtb3Bjb2RlLmg6IFJlbmFtZWQgZnJvbSBucGwtb3Bjb2RlLmguCglnb3VsZC1waW5zbi5jOiBJbmNsdWRlIG5wMS1vcGNvZGUuaC4KCU1ha2VmaWxlLmRpc3QgKE9QQ09ERVMpOiBDaGFuZ2UgbnBsLW9wY29kZS5oIHRvIG5wMS1vcGNvZGUuaAoKCSogY29mZnJlYWQuYyAocmVhZF9lbnVtX3R5cGUpOiBTdG9wIHJlYWRpbmcgd2hlbiB3ZSBoaXQgLmVvcy4KCk1vbiBNYXIgMjYgMTU6NTI6MzUgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIFZlcnNpb24gMy45MC4zLgoKCSogYnJlYWtwb2ludC5jIChyZWFkX21lbW9yeV9ub2JwdCk6IE5ldyBmdW5jdGlvbi4KCWdkYmNvcmUuaDogRGVjbGFyZSByZWFkX21lbW9yeV97bm9icHQsY2hlY2t9LgoJbWlwcy10ZGVwLmM6IFVzZSByZWFkX21lbW9yeV9ub2JwdCBub3QgYnJlYWtwb2ludF9zaGFkb3dfdmFsLgoKRnJpIE1hciAyMyAxNDoyNjozOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgbW9sZS5haS5taXQuZWR1KQoKCSogaW5mbG93LmMgKHRlcm1pbmFsX2luZmVyaW9yKTogUmVlbmFibGUgY29tbWVudGVkIG91dAoJaW5mZXJpb3JfdGhpc3J1bl90ZXJtaW5hbCBjaGVjay4KCSh0ZXJtaW5hbF9vdXJzXzEpOiBJZiBpbmZlcmlvcl90aGlzcnVuX3Rlcm1pbmFsIGlzIG5vbnplcm8sCglyZXR1cm4gaW1tZWRpYXRlbHkuCgoJKiBNYWtlZmlsZS5kaXN0OiBSZXdyaXRlIERFUEZJTEVTLCBNX0ZJTEUsIGV0Yy4gc3R1ZmYgdG8gZGVhbAoJd2l0aCBob3N0ICYgdGFyZ2V0IHNlcGFyYXRpb24uCgoJKiBjb25maWcvKjogU3BsaXQgaW50byB4Y29uZmlnLyogYW5kIHRjb25maWcvKi4KCSotZGVwLmM6IFNwbGl0IGludG8gKi14ZGVwLmMgYW5kICotdGRlcC5jLgoKCSogbWFpbi5jIChtYWluKTogQWx3YXlzIHBhc3MgdHdvIGFyZ3MgdG8geHJlYWxsb2MuCgpUaHUgTWFyIDIyIDIwOjI5OjI1IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBtb2xlLmFpLm1pdC5lZHUpCgoJKiBNYWtlZmlsZS5kaXN0ICh7LGRpc3R9Y2xlYW4pOiBybSB7eCx0fW0uaCBub3QgcGFyYW0uaAoJeGdkYi5vOiBSZW1vdmUgb2Jzb2xldGUgZGVwZW5kZW5jeSAobm93IGluIGRlcGVuZCkuCgoJKiBhcm0tcGluc24uYzogSW5jbHVkZSBhcm0tb3Bjb2RlLmggbm90IG9wY29kZS5oLgoKCSogbWlwcy1waW5zbi5jLCBtaXBzLW9wY29kZS5oOiBOZXcgZmlsZXMgZnJvbSBCb3RobmVyIChmcm9tCglyZWxlYXNlIG9mIDI0IEphbiA5MCB3aXRoIG1pcHMtb3Bjb2RlLmggcGF0Y2ggZnJvbSAxIEZlYiA5MCkuCgoJKiB1dGlscy5jICh4bWFsbG9jKTogUmV0dXJuIE5VTEwgb24gcmVxdWVzdCBmb3IgMCBieXRlcy4KCldlZCBNYXIgMjEgMTM6MzA6MDggMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKCgkqIGNvbmZpZy5nZGI6IFJlLXdyaXRlIG1hY2hpbmUgc3R1ZmYgdG8gZGVhbCB3aXRoIGhvc3QgJiB0YXJnZXQuCgoJKiB4bS1hbHRvcy5oOiBEb24ndCBkZWZpbmUgSEFWRV9XQUlUX1NUUlVDVC4KCgkqIG0tKi5oOiBTcGxpdCBpbnRvIHhtLSouaCBhbmQgdG0tKi5oLgoKCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogUHV0ICNpZmRlZiBzb255X25ld3MgY29kZQoJaW4gcmVnYXJkbGVzcyBvZiBtYWNoaW5lLgoKCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBBZGQgcXVvdGVzIGFuZCBjYXBpdGFsaXplIGVycm9yCgltZXNzYWdlICJubyBjbGFzcywgc3RydWN0LCBvciB1bmlvbiBuYW1lZCIuCgoJKiBNYWtlZmlsZS5kaXN0IChjcGx1cy1kZW0ubyk6IENvbXBpbGUgd2l0aCAtRG5vdW5kZXJzY29yZS4KCgkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiBVc2UgcHJpbnRfc3ltYm9sIHRvIHByaW50IGZ1bmN0aW9uIG5hbWUuCgoJKiBzeW10YWIuYyAob3V0cHV0X3NvdXJjZV9maWxlbmFtZSk6IERvbid0IHByaW50IGEgY29tbWEgaWYKCXdlIGFyZSBza2lwcGluZyBhIGZpbGVuYW1lIGFscmVhZHkgcHJpbnRlZC4KClR1ZSBNYXIgMjAgMTA6NDg6NTQgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKCgkqIHN5bXRhYi5jIChvdXRwdXRfc291cmNlX2ZpbGVuYW1lKTogRG9uJ3QgcHJpbnQgYSBmaWxlbmFtZQoJbW9yZSB0aGFuIG9uY2UuCgoJKiB1dGlscy5jIChmcHJpbnRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgoJZGVmcy5oOiBEZWNhbGFyZSBpdC4KCXZhcmlvdXM6IFVzZSBmcHJpbnRfc3ltYm9sIHRvIHByaW50IHN5bWJvbCBuYW1lcy4KCU1ha2VmaWxlLmRpc3QgKFNGSUxFUywgT0JTKTogQWRkIGNwbHVzLWRlbS57YyxvfS4KCk1vbiBNYXIgMTkgMTc6MTE6MDMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKCgkqIGNvZmZyZWFkLmMgKHJlYWRfZmlsZV9oZHIpOiBBZGQgTUM2OEs/P01BR0lDLgoKCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6IElnbm9yZSBzd2JlZyBhbmQgc3RyaW5nIGxhYmVsCglzeW1ib2xzLgoKCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6IEluY3JlbWVudCBudW1fb2JqZWN0X2ZpbGVzCglpbiBjYXNlIENfU1RBVCBub3QgQ19GSUxFLgoJTmV3IHZhcmlhYmxlIGluX3NvdXJjZV9maWxlLiAgU2V0IGl0IGluIGNhc2UgQ19GSUxFLgoJQ2hlY2sgaXQgaW4gY2FzZSBDX1NUQVQuCgoJKiBjb2ZmcmVhZC5jIFtGVU5DVElPTl9FUElMT0dVRV9TSVpFXTogTmV3IGNvZGUuCgltLXVtYXguaCAoRlVOQ1RJT05fRVBJTE9HVUVfU0laRSk6IERlZmluZS4KCgkqIGNvbmZpZy8zYjE6IE5ldyBmaWxlLgoKCSogY29uZmlnL3N1bio6IFByaW50IG1lc3NhZ2Ugd2FybmluZyBwZW9wbGUgdG8gdXNlIEdBUyB3aXRoIEdDQy4KClN1biBNYXIgMTggMDI6NTY6NDAgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKCgkqIGluZmNtZC5jIChydW5fc3RhY2tfZHVtbXkpOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZS4KCgkqIG0tNjhrLmggKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSk6IE1ha2UgcGMsIGZwLCBzcCBjaGFyICouCgoJKiBtLW1pcHMuaCAoTE9OR0VTVCwgQlVJTFRJTl9UWVBFX0xPTkdFU1QpOiBSZW1vdmUuCgpTYXQgTWFyIDE3IDIxOjI3OjQ5IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBtb2xlLmFpLm1pdC5lZHUpCgoJKiBtaXBzLWRlcC5jOiBSZW1vdmUgaW5mcHRyYWNlLmMgc3R1ZmYuCgoJKiBtLWJpZ21pcHMuaDogTmV3IGZpbGUuCgltLW1pcHMuaCBbTUlQU0VCXTogUmVtb3ZlICpfQklHX0VORElBTiBzdHVmZi4KCgkqIG0tc3BhcmMuaCAoRklYX0NBTExfRFVNTVkpOiBEbyBub3QgaW5zZXJ0IHVuaW1wIGluc3RydWN0aW9uCglpZiBmdW5jdGlvbiB3YXMgY29tcGlsZWQgd2l0aCBnY2MuCgoJKiBtLW1pcHMuaDogUmVtb3ZlIEZJWF9DQUxMX0RVTU1ZX0FMSUdORUQgYW5kIG1ha2UgRklYX0NBTExfRFVNTVkKCXVzZSBuZXcgYXJncy4KCgkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uKTogTmV3IGFyZ3MgdG8gRklYX0NBTExfRFVNTVkuCgltLSouaCAoRklYX0NBTExfRFVNTVkpOiBUYWtlIG5ldyBhcmdzLgoKCSogdmFsdWVzLmMgKHVzaW5nX3N0cnVjdF9yZXR1cm4pOiBOZXcgcGFyYW1ldGVyIGdjY19wLgoJdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pOiBOZXcgdmFyaWFibGUgdXNpbmdfZ2NjLgoJdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pIFtSRUdfU1RSVUNUX0hBU19BRERSXTogTmV3IGNvZGUuCgoJKiBtLW1pcHMuaCwgbWlwcy1kZXAuYzogTmV3IGZpbGVzIGZyb20gRm9yaW4uCgltLW1pcHMuaDogUmVwbGFjZSBSRVRVUk5fU1RSVUNUX0JZX1JFRiB3aXRoIFVTRV9TVFJVQ1RfQ09OVkVOVElPTi4KCkZyaSBNYXIgMTYgMTM6MTc6MTkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIE1ha2VmaWxlLmRpc3Q6IEFkZCBzb21lIGRlcGVuZGVuY2llcyBvZiBtLSouaCBmaWxlcy4KCShIRklMRVMpOiBBZGQgbS02OGsuaC4KCgkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IFB1dCAib3BlcmF0b3IrIiBub3QgIm9wZXJhdG9yICsiCglpbiBzeW10YWIuCgoJKiBjb3JlLmM6IFNwbGl0IHJlYWRfbWVtb3J5IGludG8gcmVhZF9tZW1vcnlfY2hlY2sgYW5kIHJlYWRfbWVtb3J5LgoJYnJlYWtwb2ludC5jIChpbnNlcnRfYnJlYWtwb2ludHMpOiBJZiBjYW4ndCByZWFkIG1lbW9yeSwKCXRlbGwgdXNlciB0aGF0IGVycm9yIHdhcyBkdWUgdG8gc2V0aW5nIGJyZWFrcG9pbnRzLgoKVGh1IE1hciAxNSAxMTo0NzoxOSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogaW5mcnVuLmMgW0NPRkZfRU5DQVBTVUxBVEVdOiBJbmNsdWRlIGEub3V0LmVuY2FwLmguCgoJKiBibG9ja2ZyYW1lLmMgKEZSQU1FTEVTU19MT09LX0ZPUl9QUk9MT0dVRSk6IE1ha2UgaXQgYSBmdW5jdGlvbi4KCXZhcmlvdXMgbS0qLmg6IENhbGwgZnVuY3Rpb24gbm90IG1hY3JvLgoJZnJhbWUuaDogRGVjbGFyZSB0aGUgZnVuY3Rpb24uCgpXZWQgTWFyIDE0IDAyOjQ0OjUxIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBzcGFyYy1kZXAuYzogSW5jbHVkZSBzaWduYW1lLmguCgoJKiBzcGFyYy1waW5zbi5jIChwcmludF9pbnNuKTogV2hlbiBsb29raW5nIGZvciBzZXRoaSBiZWZvcmUKCWRlbGF5ZWQgYnJhbmNoLCBjYWxsIHJlYWRfbWVtb3J5X25vZXJyIG5vdCByZWFkX21lbW9yeS4KCgkqIG0taXNpLmgsIG0tc3VuMy5oLCBtLW5ld3MuaCwgbS1ocDMwMGJzZC5oLCBtLWFsdG9zLmgsCgltLWhwMzAwaHB1eC5oLCBtLXN1bjIuaDogTWVyZ2UgbWFjaGluZSBzdHVmZiBleGNlcHQgaW5mZXJpb3IKCWZ1bmN0aW9uIGNhbGwgc3R1ZmYgaW50byBuZXcgZmlsZSBtLTY4ay5oLiAgQ3JlYXRlIG0tM2IxLmguCgpUdWUgTWFyIDEzIDIxOjM0OjMzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBpbmZsb3cuYyAobmV3X3R0eSk6IElmIGNhbid0IG9wZW4gdHR5LCBwcmludCBlcnJvciBtZXNzYWdlCgliZWZvcmUgZXhpdGluZy4KCgkqIGJsb2NrZnJhbWUuYzogUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIHBzeW10YWJfdG9fc3ltdGFiLgoJc3ltdGFiLmg6IERlY2xhcmUgcHN5bXRhYl90b19zeW10YWIuCglibG9ja2ZyYW1lLmM6IFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgYmxvY2tfZm9yX3BjIGFuZAoJZmluZF9wY19mdW5jdGlvbl9zdGFydC4KCWZyYW1lLmg6IEFkZCBkZWNsYXJhdGlvbnMgb2YgYmxvY2tfZm9yX3BjIGFuZCBmaW5kX3BjX2Z1bmN0aW9uX3N0YXJ0LgoJUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIG5vbmV4aXN0ZW50IGZ1bmN0aW9uIGZpbmRfcGNfZnVuY3Rpb24uCgl2YWx1ZXMuYzogaW5jbHVkZSBmcmFtZS5oIGluc3RlYWQgb2YgZGVjbGFyaW5nIGJsb2NrX2Zvcl9wYy4KCgkqIFZlcnNpb24gMy45MC4yLgoKTW9uIE1hciAxMiAxNDoyMDowNiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogbWFpbi5jIChtYWluKTogRGVsZXRlIHN1cGVyZmx1b3VzICJlIiBmcm9tIGxvbmdfb3B0aW9ucy4KClNhdCBNYXIgMTAgMTU6NDc6MjMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IFByaW50IDwlZCBiaXQgaW50ZWdlcj4gbm90IGp1c3QKCTxsYXJnZSBpbnRlZ2VyPi4KCgkqIGRieHJlYWQuYyAoZXJyb3JfdHlwZSk6IEZpeCBsb29wIHRoYXQgZmluZHMgJ1wwJyBzbyB0aGF0IG9uCglleGl0LCAqcHAgcG9pbnRzIHRvIHRoZSAnXDAnLCBub3QgdGhlIGNoYXJhY3RlciBhZnRlci4KCShyZWFkX3R5cGUpOiBNYWtlIHN1cmUgdGhhdCBwbGFjZXMgd2hpY2ggY2FsbCByZWFkX3R5cGUgYW5kIHRoZW4KCXRyeSB0byByZWFkIG1vcmUgaW5wdXQgc3RvcCBpbW1lZGlhdGVseSB3aXRoIGFub3RoZXIgZXJyb3IKCXVwb24gZW5jb3VudGVyaW5nICdcMCcuCgoJKiBkYnhyZWFkLmMgKHJlYWRfcmFuZ2VfdHlwZSk6IEZpeCBjaGVjayBmb3IgbGFyZ2Ugc2lnbmVkCglpbnRlZ3JhbCB0eXBlIHRvIG1hdGNoIGNvbW1lbnQgYW5kIHJlYWxpdHkuICBTZXQgVFlQRV9MRU5HVEggYmFzZWQKCW9uIG4yYml0cyBmb3Igc2lnbmVkLCBuM2JpdHMgZm9yIHVuc2lnbmVkLgoKCSogaW5mY21kLmMgKGNvbnRfY29tbWFuZCk6IFByaW50IHdhcm5pbmcgbWVzc2FnZSBpZiB3ZQoJZGVjaWRlIHRvIGlnbm9yZSB0aGUgYXJndW1lbnQuCgoJKiBnZGIudGV4aW5mbyAoYXR0YWNoKTogQHhyZWZ7QXR0YWNofSAtPiBAeHJlZntSZW1vdGV9LgoKRnJpIE1hciAgOSAxNjoyNjo0NyAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogc3ltdGFiLmggKGFkZHJlc3NfY2xhc3MpOiBSZWluc3RhdGUgTE9DX0VYVEVSTkFMIHdpdGggcmV3cml0dGVuCgljb21tZW50LgoKCSogZXhwcmVhZC55ICh5eWVycm9yLCBwYXJzZV9jXzEpOiBNYWtlIHl5ZXJyb3IgdGFrZSBhIGNoYXIgKiBhcmcuCgoJKiBtYWluLmMgKHN5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRG9uJ3QgY2FsbCBlcnJvcigpIG9uCgkiaW5mbyBqa2xkc2tmIi4KCgkqIG0tbnBsLmggKFVTRV9TVFJVQ1RfQ09OVkVOVElPTik6IENoYW5nZSA+PSB0byA+LgoKVGh1IE1hciAgOCAwMDoxOTowMSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogc3ltc2VnLmg6IE51a2UgbW9yZSBzeW1zZWcgcmVmZXJlbmNlcyBpbmNsdWRpbmcgTE9DX0VYVEVSTkFMLgoJUHV0IGNvbnRlbnRzIG9mCXN5bXNlZy5oIGludG8gc3ltdGFiLmggYW5kIHJlbW92ZSBzeW1zZWcuaC4KCldlZCBNYXIgIDcgMTg6MDI6MTUgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIHN5bXRhYi5oIChTWU1CT0xfTElORSk6IE5ldyBtYWNyby4KCXN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogQWNjZXB0IHZhcmlhYmxlIGFzIHdlbGwgYXMgZnVuY3Rpb24uCglMb29rdXAgdmFyaWFibGUvZnVuY3Rpb24gaW4gc2VsZWN0ZWQgYmxvY2sgaWYgbm8gZmlsZSBzcGVjaWZpZWQuCglwcmludGNtZC5jOiAjaWYgMCBvdXQgd2hlcmVpc19jb21tYW5kLgoKCSogY29tbWFuZC5jIChkb19zZXRzaG93X2NvbW1hbmQpOiBDYWxsIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbAoJYXJndW1lbnQgQy4KCW1haW4uYyAoc2V0X2hpc3Rvcnlfc2l6ZV9jb21tYW5kKTogVGFrZSBhcmd1bWVudCBDLgoJKHNldF92ZXJib3NlKTogTmV3IGZ1bmN0aW9uIHRvIHNldCBkb2NzdHJpbmcuCgkoaW5pdGlhbGl6ZV9tYWluKTogUHV0IHNldF92ZXJib3NlIGluIGNvbW1hbmQgbGlzdC4KCWNvbW1hbmQuYyAobG9va3VwX2NtZF8xKTogQWNjZXB0IHJlc3VsdF9saXN0IE5VTEwuCgoJKiB2YWxwcmludC5jIChfaW5pdGlhbGl6ZV92YWxwcmludCk6IENoYW5nZSBkb2NzdHJpbmcgZm9yCgkic2V0IHVuaW9ucHJpbnQiIHRvIG5vcm1hbCBzZXQvc2hvdyBmb3JtLgoKCSogY29tbWFuZC5jIChhZGRfc2hvd19mcm9tX3NldCk6IENoZWNrIHRoYXQgZG9jc3RyaW5nIHN0YXJ0cyB3aXRoCgkiU2V0ICIgYmVmb3JlIGFzc3VtaW5nIGl0IGRvZXMuCgoJKiBtYWluLmMgKHNob3dfaGlzdG9yeSk6IENhbGwgY21kX3Nob3dfbGlzdC4KCWNvbW1hbmQue2MsaH0gKGNtZF9zaG93X2xpc3QpOiBOZXcgZnVuY3Rpb24uCgljb21tYW5kLmg6IERlY2xhcmUgZG9fc2V0c2hvd19jb21tYW5kLgoKCSogY29tbWFuZC5oIChjbWRfbGlzdF9lbGVtZW50KTogTmV3IGZpZWxkIGNvbXBsZXRlci4KCW1haW4uYyAoc3ltYm9sX2NvbXBsZXRpb25fZnVuY3Rpb24pOiBVc2UgaXQuCglzeW10YWIuaDogRGVjbGFyZSBtYWtlX3N5bWJvbF9jb21wbGV0aW9uX2xpc3QuCgljb21tYW5kLmMgKGFkZF9jbWQpOiBTZXQgY29tcGxldGVyLgoJbWFpbi5jLCBnZGJjbWQuaCAobm9vcF9jb21wbGV0ZXIpOiBOZXcgZnVuY3Rpb24uCglpbmZjbWQuYzogU2V0IGNvbXBsZXRlciBmb3IgZW52aXJvbm1lbnQgZnVuY3Rpb25zLgoKCSogc3ltdGFiLmMgKHR5cGVzX2luZm8sIF9pbml0aWFsaXplX3N5bXRhYik6ICNpZiAwIG91dC4KCXZhcmlvdXM6IFVzZSBmcHV0c19maWx0ZXJlZCwgbm90IGZwcmludGZfZmlsdGVyZWQoJXMpLgoKCSogdmFscHJpbnQuYyAodHlwZV9wcmludF9iYXNlKTogQ2hlY2sgZm9yIGludGVnZXJzIGxhcmdlciB0aGFuCglMT05HRVNULgoKCSogc3VuMy1kZXAuYzogSW5jbHVkZSAic2lnbmFtZS5oIiBpbnN0ZWFkIG9mIGRpcmVjdGx5IGRlY2xhcmluZwoJc3lzX3NpZ2xpc3QuCgpUdWUgTWFyICA2IDE0OjU5OjM0IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBpbmZydW4uYyAoc2lnbmFsc19pbmZvKTogQWxsb3cgYXJndW1lbnQgdG8gYmUgYSBzaWduYWwgbmFtZQoJYXMgd2VsbCBhcyBhbiBleHByZXNzaW9uLgoJKGhhbmRsZV9jb21tYW5kKTogQ2hlY2sgZm9yIGVycm9yIGZyb20gc2lnX251bWJlci4KCgkqIG1haW4uYyAoZmxvYXRfaGFuZGxlcik6IENoYW5nZSBlcnJvciBtZXNzYWdlLgoKCSogaW5mbG93LmMgKGNyZWF0ZV9pbmZlcmlvcik6IElmIGdldGVudiAoIlNIRUxMIikgZXhpc3RzLCB1c2UgaXQKCWluc3RlYWQgb2YgL2Jpbi9zaC4KCgkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiLCBjYXNlIE5fU08pOiBOZXcgdmFyaWFibGUgZmlyc3Rfc3ltbnVtLgoJUGFzcyBpdCB0byB7c3RhcnQsZW5kfV9wc3ltdGFiLgoKCSogZGJ4cmVhZC5jIChyZWFkX29maWxlX3N5bXRhYik6IEluY3JlbWVudCBzeW1idWZfaWR4IGFuZCBzeW1udW0KCXdoZW4gY2FsbGluZyBwcm9jZXNzX3N5bWJvbF9wYWlyLgoKCSogc3ltdGFiLmMgKHNvdXJjZXNfaW5mbywgb3V0cHV0X3NvdXJjZV9maWxlbmFtZSk6CglSZS13cml0ZSBzbyBvdXRwdXRfc291cmNlX2ZpbGVuYW1lIHRha2VzIGEgZmlyc3QgcGFyYW1ldGVyCglpbnN0ZWFkIG9mIGEgbmV4dCBvbmUuCgoJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYiwgY2FzZSBOX1NPKTogV2hlbiBpbmNyZW1lbnRpbmcKCXN5bWJ1Zl9pZHgsIGluY3JlbWVudCBzeW1udW0gYWxzby4KCgkqIHZhbHVlcy5jIChzZXRfaW50ZXJuYWx2YXJfY29tcG9uZW50KTogVXNlIFZBTFVFX0NPTlRFTlRTLAoJbm90IFZBTFVFX0NPTlRFTlRTX1JBVy4KCgkqIHN5bW1pc2MuYyAoZnJlZV9zeW10YWIpOiBEb24ndCBmcmVlIGZpbGVuYW1lIChub3cgaW4gc3ltYm9sX29ic3RhY2spLgoKCSogZW52aXJvbi5jIChpbml0X2Vudmlyb24pOiBDb3B5IGVudGlyZSBzdHJpbmcsIGluY2x1ZGluZwoJdGVybWluYXRpbmcgJ1wwJy4KCgkqIHZhbHVlLmgsIHZhbHVlcy5jOiBSZW5hbWUgdmFsdWVfbGF6eSB0byB2YWx1ZV9mZXRjaF9sYXp5LgoJdmFsdWVzLmMgKHZhbHVlX29mX2ludGVybmFsdmFyKTogQ2FsbCB2YWx1ZV9mZXRjaF9sYXp5LgoKCSogZGJ4cmVhZC5jIChyZWFkX2h1Z2VfbnVtYmVyKTogUmV0dXJuIGFuIGVycm9yIG9uIGVuY291bnRlcmluZwoJYSBsYXJnZSBkZWNpbWFsIG51bWJlci4KCgkqIGRieHJlYWQuYyAocmVhZF9odWdlX251bWJlcik6IFJldmVyc2Ugc2Vuc2Ugb2Ygb3ZlcmZsb3cgdGVzdC4KCgkqIHZhbHByaW50LmMgKHZhbF9wcmludCwgY2FzZSBUWVBFX0NPREVfSU5UKTogQ2hlY2sgZm9yIGludGVnZXJzCglsYXJnZXIgdGhhbiBMT05HRVNULgoKCSogZGJ4cmVhZC5jIChyZWFkX29maWxlX3N5bXRhYik6IFdoZW4gY2FsbGluZyBwcm9jZXNzX29uZV9zeW1ib2wsCgljYWxsIGl0IHdpdGggZGVzYyBhbmQgdmFsdWUgcmF0aGVyIHRoYW4gd2l0aCBidWZwLT5uX3tkZXNjLHZhbHVlfS4KCgkqIGRlZnMuaCAoTE9OR19NQVgpOiBEZWZpbmUuCgoJKiBzdW4zLWRlcC5jOiBEZWNsYXJlIHN5c19zaWdsaXN0LgoKCSogaW5mcHRyYWNlLmM6IE1vdmUgaW5jbHVkZSBvZiBnZGJjb3JlLmggYWZ0ZXIgYS5vdXQuaAoKCSogTWFrZWZpbGUuZGlzdCAoZXhwcmVhZC5vLCBtY2hlY2subyk6IFJlbW92ZSBsZWFkaW5nICIuLyIgbm90CglsZWFkaW5nICIuIi4KCgkqIG0taHAzMDBocHV4LmggWyFIUFVYX1ZFUlNJT05fNV06IERlZmluZSBLRVJORUxfVV9BRERSX0hQVVguCglpbmZwdHJhY2UuYyBbS0VSTkVMX1VfQUREUl9IUFVYXSBbS0VSTkVMX1VfQUREUl9CU0RdOgoJU2V0IGtlcm5lbF91X2FkZHIgdXNpbmcgbmxpc3QoKS4KCW0taHAzMDBic2QuaDogRGVmaW5lIEtFUk5FTF9VX0FERFJfQlNELgoKTW9uIE1hciAgNSAxNjo1Mjo0MSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBJZiB2YWx1ZSBvZiAubyBzeW1ib2wgaXMgY3JhenksCglkb24ndCBlbmQgcHN5bXRhYi4KCgkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogSWdub3JlIGZpcnN0IG9mIGEgcGFpciBvZiBOX1NPCgl3aGVuIGJvdGggYXBwZWFyLgoJKHN0YXJ0X3N1YmZpbGUsIHN0YXJ0X3N5bXRhYik6IEV4dHJhIHBhcmFtZXRlciBkaXJuYW1lLgoJKHN0YXJ0X3N1YmZpbGUpOiBVc2Ugb2JzYXZlc3RyaW5nLCBub3Qgc2F2ZXN0cmluZywgZm9yIG5hbWUuCgl2YXJpb3VzOiBDYWxsIHN0YXJ0X3tzdWJmaWxlLHN5bXRhYn0gd2l0aCBleHRyYSBhcmd1bWVudC4KCShlbmRfc3ltdGFiKTogU2V0IGRpcm5hbWUgZmllbGQgaW4gc3ltdGFiLgoJKHJlYWRfb2ZpbGVfc3ltdGFiKTogQ2FsbCBwcm9jZXNzX3N5bWJvbF9wYWlyIG9uIHBhaXIgb2YgTl9TTy4KCShwcm9jZXNzX3N5bWJvbF9wYWlyKTogTmV3IGZ1bmN0aW9uLgoJc3ltdGFiLmggKHN5bXRhYik6IE5ldyBmaWVsZCBkaXJuYW1lLgoJc291cmNlLmMgKG9wZW5fc291cmNlX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCglzb3VyY2UuYzogVXNlIG9wZW5fc291cmNlX2ZpbGUgaW5zdGVhZCBvZiBvcGVucCB3aGVyZSBhcHByb3ByaWF0ZS4KCgkqIGRlZnMuaCAoVEFSR0VUX0NIQVJfQklUKTogRGVmaW5lLgoKU3VuIE1hciAgNCAxMzoxMTo0OCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogZGJ4cmVhZC5jIChmaWxsX3N5bWJ1Zik6IFByaW50IGVycm9yIG1lc3NhZ2VzIG5pY2VseS4KCgkqIE1ha2VmaWxlLmRpc3QgKFNGSUxFUyk6IFB1dCBzdGFuZGFsb25lLmMgYXQgZW5kLgoKCSogTWFrZWZpbGUuZGlzdCAoYWxsZGVwcy5tYWspOiBQdXQgb3V0IGJhY2tzbGFzaCBhZnRlciBhcm0tY29udmVydC5zLgoKCSogc3ltdGFiLntjLGh9IChidWlsdGluX3R5cGVfZXJyb3IpOiBOZXcgdHlwZS4KCXN5bXNlZy5oICh0eXBlX2NvZGUpOiBBZGQgVFlQRV9DT0RFX0VSUk9SLgoJdmFscHJpbnQuYyAodmFsX3ByaW50LCB0eXBlX3ByaW50X2Jhc2UpLAoJdmFsdWVzLmMgKHVzaW5nX3N0cnVjdF9yZXR1cm4sIHNldF9yZXR1cm5fdmFsdWUpOgoJQ2hlY2sgZm9yIGFuZCBkZWFsIHdpdGggVFlQRV9DT0RFX0VSUk9SLgoJZGJ4cmVhZC5jIChlcnJvcl90eXBlKTogTmV3IGZ1bmN0aW9uCgkocmVhZF90eXBlIGFuZCBzdWJyb3V0aW5lcyk6IENhbGwgZXJyb3JfdHlwZSBpbnN0ZWFkIG9mIGVycm9yLgoKCSogZGJ4cmVhZC5jIChyZWFkX2h1Z2VfbnVtYmVyKTogTmV3IGZ1bmN0aW9uLgoJKHJlYWRfcmFuZ2VfdHlwZSk6IFVzZSByZWFkX2h1Z2VfbnVtYmVyIGFuZCBjaGVjayByZXN1bHRzCgl0byBzZWUgaWYgaXQgaXMgYSBsYXJnZSBpbnRlZ3JhbCB0eXBlLgoKCSogc3ltbWlzYy5jOiBSZW1vdmUgc3ltc2VnIHN0dWZmLgoKCSogR291bGQgTlAxIGNoYW5nZXMgZnJvbSAob3IgaW5zcGlyZWQgYnkpIGNocG1qZEBnZHIuYmF0aC5hYy51awoJZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpIFtOX05CU1RTXToKCVRyZWF0IHRoaXMgYW5kIE5fTkJMQ1MgbGlrZSBOX0xDU1lNLCBldGMuCgkocHJvY2Vzc19vbmVfc3ltYm9sKSBbQkxPQ0tfQUREUkVTU19BQlNPTFVURV06IE5ldyBjb2RlLgoJbS1ucGwuaCAoVVNFX1NUUlVDVF9DT05WRU5USU9OKTogQWRkLgoJKElHTk9SRV9TWU1CT0wpOiBBZGQgMHhhNC4KCShFTkRfT0ZfVEVYVF9ERUZBVUxUKTogUmVtb3ZlLgoJKFNUUklOR19UQUJMRV9PRkZTRVQpOiBkb24ndCBhZGQgc2l6ZW9mKGludCkuCglbIUhBVkVfVlBSSU5URl06IERlZmluZSB2cHJpbnRmIHRvIGJlIGRvcHJudCwgbm90IHByaW50Zi4KCShCTE9DS19BRERSRVNTX0FCU09MVVRFKTogRGVmaW5lLgoJKEJSRUFLUE9JTlQpOiBQYWQgdG8gc2l6ZSBvZiBtYWNoaW5lIHdvcmQuCgkoU0FWRURfUENfQUZURVJfQ0FMTCk6IFJlbW92ZSBgIGF0IHN0YXJ0IG9mIGxpbmUgKCEpLgoJKFIyX1JFR05VTSk6IERlZmluZS4KCShTUF9SRUdOVU0sIEZQX1JFR05VTSk6IFN3aXRjaCBkZWZpbml0aW9ucy4KCShSRUdJU1RFUl9VX0FERFIpOiBVc2UgRlBfUkVHTlVNIGluIHBsYWNlIG9mIFNQX1JFR05VTS4KCShTVE9SRV9TVFJVQ1RfUkVUVVJOLCBFWFRBQ1RfUkVUVVJOX1ZBTFVFLCBTVE9SRV9SRVRVUk5fVkFMVUUsCgljYWxsIGZ1bmN0aW9uIHN0dWZmKToKCVJlcGxhY2UgYm9ndXMgZGVmaW5pdGlvbnMgd2l0aCBjb3JyZWN0IG9uZXMgZm9yIE5QMS4KCShDQU5OT1RfRVhFQ1VURV9TVEFDSyk6IERlZmluZS4KCShGUkFNRV9MT0NBTFNfQUREUkVTUyk6IERvbid0IGFkZCA4MC4KCShGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiBBbHNvIGdldCBTUC4KCWdvdWxkLXBpbnNuLmMgKGZpbmRmcmFtZSk6IE1vdmUgZnJhbWVjaGFpbiBkZWNsYXJhdGlvbiBvdXRzaWRlICNpZiAwLgoJaW5mcHRyYWNlLmMgKHdyaXRlX2luZmVyaW9yX21lbW9yeSk6IENoZWNrIGFkZHIgYWdhaW5zdCB0ZXh0X2VuZAoJYW5kIHVzZSBQVF9XUklURV9JIG9yIFBUX1dSSVRFX0QgYXMgYXBwcm9wcmlhdGUuCgkoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogRG9uJ3QgdHJ5IHRvIHdyaXRlIHJlZ2lzdGVycyBpbgoJQ0FOTk9UX1NUT1JFX1JFR0lTVEVSLgoJbS1ucGwuaCAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKTogRGVmaW5lLgoJbnBsLW9wY29kZS5oIChsaWwpOiAweGY4MDgwMDAwIC0+IDB4ZjgwYjAwMDAuCgkKCSogbXVuY2g6IERpc3Rpbmd1aXNoIGJldHdlZW4gQlNEIGFuZCBTeXN0ZW0gViBubSBieSBhY3R1YWxseQoJc2VlaW5nIHdoYXQgb3V0cHV0IGZyb20gbm0gbG9va3MgbGlrZS4KCkZyaSBNYXIgIDIgMTM6NDM6MzYgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiBDaGFuZ2UgaGlnaGVzdF9vZmZzZXQgdG8gcG9pbnQKCXRvIG5leHQgdW5wcmludGVkIGFyZy4KCgkqIG1haW4uYyAobWFpbik6IFByaW50ICJ0eXBlIGhlbHAgZm9yIGxpc3Qgb2YgY29tbWFuZHMiIGFsb25nCgl3aXRoIHRoZSB2ZXJzaW9uLiAgRm9sbG93IGl0IHdpdGggYSBibGFuayBsaW5lLgoKVGh1IE1hciAgMSAxNDo0OToyNiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogdmFscHJpbnQuYzogTW92ZSBwcmludF9hZGRyZXNzIGZvciBmdW5jdGlvbiBmcm9tIHZhbHVlX3ByaW50Cgl0byB2YWxfcHJpbnQuCgpXZWQgRmViIDI4IDE1OjA2OjEyIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBNYWtlZmlsZS5kaXN0IChtLXN1bjRvczQuaCk6IERlcGVuZCBvbiBtLXNwYXJjLmgKCgkqIE1ha2VmaWxlLmRpc3QgKHZlcnNpb24uYyk6IERlcGVuZCBvbiBNYWtlZmlsZS5kaXN0LCBub3QgTWFrZWZpbGUuCgoJKiBNYWtlZmlsZS5kaXN0OiBDaGFuZ2UgTUFLRUZJTEVTIHRvIE1ha2VmaWxlcy4KCgkqIHN5bXRhYi5oOiBEZWNsYXJlIGdldF9zeW1fZmlsZS4KCWNvcmUuYzogSW5jbHVkZSBzeW10YWIuaC4KCgkqIE1vdmUgc2lnbmFsIG5hbWUgc3R1ZmYgZnJvbSB1dGlscy5jIHRvIHNpZ25hbWUuYwoJTW92ZSBzaWduYWwgbmFtZSBzdHVmZiBmcm9tIGRlZnMuaCB0byBzaWduYW1lLmguCglNYWtlZmlsZS5kaXN0IChTRklMRVMsIEhGSUxFUywgT0JTKTogQWRkIHNpZ25hbWUue2MsaCxvfS4KCk1vbiBGZWIgMjYgMTI6MDM6MTIgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIGNvbW1hbmQuYyAoYWRkX2NtZCk6IERvbid0IGNhbGwgc2F2ZXN0cmluZyBvbiBuYW1lLgoKU3VuIEZlYiAyNSAxNTo1MjoxOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6IE1ha2UgaGlnaGVzdF9vZmZzZXQgYW4gaW50LgoJTmV3IHZhcmlhYmxlIGFyZ3NfcHJpbnRlZC4KCShwcmludF9mcmFtZV9uYW1lbGVzc19hcmdzKTogUmVtb3ZlIHBhcmFtZXRlciBlbmQgYW5kIGFkZCBudW0KCWFuZCBmaXJzdC4KCShwcmludF9mcmFtZV9hcmdzKTogQ2hhbmdlIGNhbGwgdG8gcHJpbnRfZnJhbWVfbmFtZWxlc3NfYXJncy4KCkZyaSBGZWIgMjMgMjE6NDA6MTUgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIHN0YWNrLmMgKHVwX2NvbW1hbmQsIGRvd25fY29tbWFuZCk6CglPbmx5IHByaW50IHN0YWNrIGZyYW1lIGlmIGZyb21fdHR5LgoKVGh1IEZlYiAyMiAxMjowMTozNiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogZXhwcmVhZC55OiBJbmxjdWRlIHZhbHVlLmggYW5kIGRvbid0IGNhc3QgcmV0dXJuIHZhbHVlIGZyb20KCWxvb2t1cF9pbnRlcm5hbHZhci4KCgkqIGluZnJ1bi5jOiBSZW1vdmUgY29kZSBpbiAjaWZkZWYgVU1BWF9QVFJBQ0UuCgoJKiB2YWx1ZXMuYyAoY29udmVuaWVuY2VfaW5mbyk6IFByaW50IGluIGZvcm0gIiRmb28gPSA1Ii4KCURvbid0IHByaW50ICJEZWJ1Z2dlciBjb252ZW5pZW5jZSB2YXJpYWJsZXM6IiBiZWZvcmUgZmlyc3Qgb25lLgoKCSogTWFrZWZpbGUuZGlzdDogUmVtb3ZlIEFERF9GSUxFUyBmcm9tIENMSUJTLgoJKGdkYiwga2RiLCB4Z2RiKTogUHV0IGluIEFERF9GSUxFUyBhcyB3ZWxsIGFzIENMSUJTLgoKCSogbS1weXIuaDogI2lmIDAgb3V0IGNhbGwgZHVtbXkgc3R1ZmYuCglQdXQgaW4gUE9QX0ZSQU1FIHdoaWNoIGp1c3QgY2FsbHMgZXJyb3IoKS4KCXZhbG9wcy5jOiBJZiBDQUxMX0RVTU1ZIGlzIG5vdCBkZWZpbmVkLCBwdXQgaW4gZHVtbXkgY2FsbF9mdW5jdGlvbgoJd2hpY2gganVzdCBwcmludHMgYW4gZXJyb3IgbWVzc2FnZS4KClR1ZSBGZWIgMjAgMjI6MTE6NDAgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIGJyZWFrcG9pbnQuYyAoY29tbWFuZHNfY29tbWFuZCk6IEFkZCBhcmcgZnJvbV90dHkuCgoJKiBtYWluLmMgKG1haW4pOiBQdXQgaWYgKCFzZXRqbXAgKHRvX3RvcF9sZXZlbCkpIGFyb3VuZCBjYWxscwoJdG8gKl9jb21tYW5kIG1hZGUgaW4gcmVzcG9uc2UgdG8gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KCk1vbiBGZWIgMTkgMTM6NTg6MjggMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIG1haW4uYyAobWFpbik6IFVzZSBnZXRvcHRfbG9uZ19vbmx5LiAgTW92ZSBvbmUtY2hhcmFjdGVyIG9wdGlvbnMKCXRvIGxvbmdfb3B0aW9ucy4gIFJlbW92ZSBlbnRyaWVzIHdoaWNoIGFyZSBqdXN0IHVuYW1iaWd1b3VzCglhYmJyZXZpYXRpb25zIG9mIG90aGVyIG9wdGlvbnMuCgoJKiBjb21tYW5kLmg6IEFkZCB0eXBlcyBjbWRfdHlwZXMgYW5kIHZhcl90eXBlcy4KCUFkZCBmaWVsZHMgdHlwZSwgdmFyX3R5cGUsIGFuZCB2YXIgdG8gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQuCgljb21tYW5kLmMgKGFkZF9zZXRfY21kLCBhZGRfc2V0X2Zyb21fc2hvdyk6IE5ldyBmdW5jdGlvbnMuCgkoYWRkX2NtZCk6IFNldCBjLT52YXJfdHlwZS4KCShhZGRfYWJicmV2X2NtZCk6IENhbGwgYWRkX2NtZCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGNvZGUuCgltYWluLmM6IEFkZCBzaG93bGlzdC4KCU1vdmUgcGFyc2VfYmluYXJ5X29wZXJhdGlvbiBmcm9tIG1haW4uYyB0byBjb21tYW5kLmMuCgljb21tYW5kLmMgKGRvX3NldHNob3dfY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KCWdkYmNtZC5oOiBOZXcgZmlsZS4KCU1ha2VmaWxlLmRpc3Q6IEFkZCBnZGJjbWQuaC4KCW1hbnkgZmlsZXM6IEluY2x1ZGUgZ2RiY21kLmgsIHVzZSBhZGRfc2V0X2NtZCBhbmQgYWRkX3Nob3dfZnJvbV9zZXQuCglSZXBsYWNlIGluZm8gKiB3aXRoIHNob3cgKiB3aGVyZSBhcHByb3ByaWF0ZS4KCXV0aWxzLmMgKGZwdXRzX2ZpbHRlcmVkKTogVXNlIFVJTlRfTUFYIGluIGxpbmVzX3Blcl9wYWdlIHRvIG1lYW4KCW5vIHBhZ2luZy4KCWRlZnMuaDogRGVmaW5lIFVJTlRfTUFYLgoJaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogVXNlIGV4ZWN1dGVfY29tbWFuZCwgbm90IHNldF9hcmdzX2NvbW1hbmQuCgltYWluLmMgKGV4ZWN1dGVfY29tbWFuZCk6IENhbGwgZG9fc2V0c2hvd19jb21tYW5kIGlmIG5lY2Vzc2FyeS4KCW1haW4uYyAoc2hvd19jb21tYW5kLCBzaG93X2hpc3RvcnkpOiBOZXcgZnVuY3Rpb25zLgoJbWFpbi5jIChpbml0aWFsaXplX21haW4pOiBDYWxsIGFkZF9wcmVmaXhfY21kCglmb3Igc2hvdyBhbmQgc2hvdyBoaXN0b3J5LgoKCSogY29mZnJlYWQuYyAoZW50ZXJfbGluZW5vcyk6IFByaW50IGVycm9yIGlmCglmaWxlX29mZnNldCA8IGxpbmV0YWJfb2Zmc2V0LgoKU3VuIEZlYiAxOCAxNTozNzowNSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogY29udmV4LWRlcC5jIChjb21tX3JlZ2lzdGVyc19pbmZvKTogRml4IHR5cG8uICAoImFyZ2MiLT4iYXJnIikuCgpXZWQgRmViIDE0IDIwOjQ1OjE0IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBjb25maWcuZ2RiOiBDcmVhdGUgTWFrZWZpbGUgd2l0aCBtYWtlLgoKCSogTWFrZWZpbGUuZGlzdCwgY29uZmlnLmdkYjogTW92ZSAic3JjZGlyPSIgbGluZSBmcm9tIE1ha2VmaWxlLmRpc3QKCXRvIG5ldyBmaWxlIE1ha2VmaWxlLnNyY2Rpci4KCgkqIHZhbHByaW50LmM6IEluY2x1ZGUgPGVycm5vLmg+LgoKCSogdmFsdWUuaDogRGVjbGFyZSB2YWx1ZV9jb2VyY2VfZnVuY3Rpb24uCgoJKiBmaW5kdmFyLmM6IEFkZCBtaXNzaW5nICIgYWZ0ZXIgI2luY2x1ZGUgImdkYmNvcmUuaAoKCSogbWFpbi5jIChtYWluKTogUmUtd3JpdGUgY29tbWFuZCBwYXJzaW5nIHRvIHVzZSBnZXRvcHQuCglPbiAiZ2RiICtoZWxwIiBwcmludCBvcHRpb25zIHdpdGggJysnIG5vdCAnLScuCglNYWtlZmlsZS5kaXN0OiBBZGQgZ2V0b3B0LgoKVHVlIEZlYiAxMyAwMDowODoyNyAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogTWFrZWZpbGUuZGlzdDogQWRkICJzcmNkaXI9LiIKCWNvbmZpZy5nZGI6IEVkaXQgc3JjZGlyPSByYXRoZXIgdGhhbiBhZGRpbmcgaXQgdG8gdGhlIGJlZ2lubmluZy4KCgkqIHB5ci1kZXAuYzogTWFrZSBnbG9iYWxfcmVnX29mZnNldCwgbGFzdF9mcmFtZV9vZmZzZXQgbm90IHN0YXRpYy4KCU1vdmUgZGVmaW5pdGlvbiBvZiByZWdfc3RhY2tfb2Zmc2V0IHRvIGNvcmUuYyBbUkVHX1NUQUNLX1NFR01FTlRdLgoKCSogY29uZmlnL3B5cmFtaWQ6IFByaW50IG1lc3NhZ2UgYWJvdXQgYWxsb2NhLgoKCSogYnJlYWtwb2ludC5jIChjbGVhcl9jb21tYW5kKTogV2hlbiBwcmludGluZyAibm8gYnJlYWtwb2ludCIKCWVycm9yLCBvbmx5IHVzZSBhcmcgaWYgbm9uLU5VTEwuCgoJKiBjb3JlLmMgKHJlYWRfbWVtb3J5KTogUmVuYW1lIHRvIHJlYWRfbWVtb3J5X25vZXJyLgoJKHJlYWRfbWVtb3J5KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGNhbGxzIHJlYWRfbWVtb3J5IGFuZCBjaGVja3MgZm9yIGVyci4KCWdkYmNvcmUuaDogRGVjbGFyZSBhbGwgZXh0ZXJuIGNvcmUuYyBmdW5jdGlvbnMuCgltb3ZlIG15cmVhZCBmcm9tIGNvcmUuYyB0byB1dGlscy5jLgoJZGVjbGFyZSBpdCBpbiBkZWZzLmguCgkocmVhZF9tZW1vcnlfaW50ZWdlcik6IG1vdmUgZnJvbSBpbmZjbWQuYyB0byBjb3JlLmMuCglnZGJjb3JlLmg6IERlY2xhcmUgaXQuCglNYW55IHBsYWNlczogUmVtb3ZlIGVycm9yIGNoZWNraW5nIG9uIHJlYWRfbWVtb3J5LCBvciBjYWxsCglyZWFkX21lbW9yeV9ub2VyciBpbnN0ZWFkLiAgSW5jbHVkZSAiZ2RiY29yZS5oIiBpZiBjYWxsaW5nIGVpdGhlci4KCgkqIHZhbHVlLmggKENPRVJDRV9BUlJBWSk6IENvZXJjZSBmdW5jdGlvbnMgdG8gZnVuY3Rpb24gcG9pbnRlcnMuCgl2YWxvcHMuYyAodmFsdWVfY29lcmNlX2Z1bmN0aW9uKTogTmV3IGZ1bmN0aW9uLgoKCSogY29yZS5jLCBjb252ZXgtZGVwLmMsIGFybS1kZXAuYyAoeGZlcl9jb3JlX2ZpbGUpOiBSZXR1cm4gRUlPCglpZiBhZGRyZXNzIG91dCBvZiBib3VuZHMuCgoJKiBtLWFybS5oLCBhcm0tZGVwLmMgYXJtLXBpbnNuLmMgYXJtLW9wY29kZS5oOiBOZXcgZmlsZXMuCglkYnhyZWFkLmMsIG0tY29udmV4LmggKFZBUklBQkxFU19JTlNJREVfQkxPQ0spOiBBZGQgZ2NjX3AgcGFyYW1ldGVyLgoJTWFrZWZpbGUuZGlzdCAoYWxsZGVwcy5tYWspOiBTcGVjaWFsIGNhc2UgZm9yIGFybS1jb252ZXJ0LnMuCglkYnhyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiBDaGVjayBmb3IgbG9jYWwgYmFzZWQgb24gaXQgbm90CgliZWluZyBhbnkgb25lIG9mIHRoZSBrbm93biBkZWZ0eXBlcy4KCXZhbHVlcy5jICh1c2luZ19zdHJ1Y3RfcmV0dXJuKTogVXNlIG5ldyBtYWNybyBVU0VfU1RSVUNUX0NPTlZFTlRJT04uCgoJKiBNYWtlZmlsZS5kaXN0LCBjb25maWcuZ2RiOiBQdXQgaW4gc3JjZGlyIHN0dWZmLgoKTW9uIEZlYiAxMiAyMjo0NjoxNiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogYnJlYWtwb2ludC5jOiBBZGQgYWRkcl9zdHJpbmcgYW5kIGNvbmRfc3RyaW5nIGZpZWxkcyB0bwoJc3RydWN0IGJyZWFrcG9pbnQuCgkoYnJlYWtfY29tbWFuZF8xKTogU2V0IHRoZW0uICBVc2UgbWVudGlvbiAoKS4KCShtZW50aW9uKTogQ3JlYXRlIHdpdGggY29kZSBmcm9tIGJyZWFrX2NvbW1hbmRfMS4KCShicmVha3BvaW50X3JlX3NldCk6IE5ldyBmdW5jdGlvbi4KCShicmVha3BvaW50X2NsZWFyKTogUmVtb3ZlLgoJKGNvbmRpdGlvbl9jb21tYW5kKTogU2V0IGNvbmRfc3RyaW5nLgoJKGJyZWFrcG9pbnRfZGVsZXRlKTogRnJlZSBjb25kX3N0cmluZyBhbmQgYWRkcl9zdHJpbmcuCglEZWNsYXJlIHBhcnNlX2NfMSdzIHR5cGUgYW5kIHJlbW92ZSBjYXN0cyB0byBzdHJ1Y3QgZXhwcmVzc2lvbiAqLgoJc3ltbWlzYy5jIChmcmVlX2FsbF9zeW10YWJzKTogRG9uJ3QgY2FsbCBicmVha3BvaW50X2NsZWFyLgoJZGJ4cmVhZC5jLCBjb2ZmcmVhZC5jIChyZXJlYWRfc3ltYm9scyk6IENhbGwgYnJlYWtwb2ludF9yZV9zZXQsCglJbmNsdWRlIGJyZWFrcG9pbnQuaC4KCWJyZWFrcG9pbnQuaDogTmV3IGZpbGUuCglkYnhyZWFkLmM6IE1vdmUgZGVjbGFyYXRpb24gb2Ygc3ltbWlzYy5jIGZ1bmN0aW9ucyB0byBzeW10YWIuaC4KClN1biBGZWIgMTEgMTc6Mjk6MjMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIHN5bXRhYi5jOiBNYWtlIGxvb2t1cF9ibG9ja19zeW10YWIgZXh0ZXJuLgoJc3ltdGFiLmg6IERlY2xhcmUgaXQuCgl2YWxvcHMuYyAodmFsdWVfb2ZfdGhpcyk6IFVzZSBpdC4KCkZyaSBGZWIgIDkgMDg6NTk6MzcgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIGNvbmZpZy9ocDMwMGhwdXg6IFByaW50IG1lc3NhZ2UgdGVsbGluZyBwZW9wbGUgdG8gdXNlIGdjYy4KCgkqIHZhbHVlLmg6IERlY2xhcmUgcHJpbnRfZmxvYXRpbmcuCglwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkLCBjYXNlICdmJyk6IFVzZSBwcmludF9mbG9hdGluZy4KCXZhbHByaW50LmMgKHZhbF9wcmludCwgY2FzZSBUWVBFX0NPREVfRkxUKTogVXNlIHByaW50X2Zsb2F0aW5nLgoJdmFscHJpbnQuYyAocHJpbnRfZmxvYXRpbmcpOiBNYWtlIHRoaXMgZnVuY3Rpb24gb3V0IG9mIGlzX25hbgoJYW5kIHRoZSBjb2RlIHdoaWNoIHdhcyBpbiB2YWxfcHJpbnQuCglQdXQgcGFyZW50aGVzZXMgYXJvdW5kIGhpZ2ggJiAweGZmZmZmLgoJUHJpbnQgc2lnbiBhbmQgZnJhY3Rpb24gZm9yIE5hTidzLgoJUHJpbnQgMTcgZGlnaXRzIG5vdCAxNiBmb3IgZG91Ymxlcy4KCShpc19uYW4pOiBSZW1vdmUuCgltLW5ld3MuaCwgbS1zdW4zLmg6IERlZmluZSBJRUVFX0ZMT0FULgoKCSogUmVuYW1lIGdsZC1waW5zbi5jIHRvIGdvdWxkLXBpbnNuLmMuCgljb25maWcve3BuLG5wbH06IENoYW5nZSBuYW1lIG9mIGdsZC1waW5zbi5jCgpUdWUgRmViICA2IDAwOjI1OjM2IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCgoJKiBpbmZwdHJhY2UuYzogRGVmaW5lIFBUX0FUVEFDSCBpZiBub3QgZGVmaW5lZC4KCW0taHAzMDBocHV4Lmg6IERlZmluZSBBVFRBQ0hfREVUQUNILgoKCSogbWFpbi5jIChpbml0aWFsaXplX21haW4pOiBDaGFuZ2UgYWxpYXMgY2xhc3MgdG8gYWxpYXNlcy4KCgkqIGRieHJlYWQuYzogU2VhcmNoIGFuZCBkZXN0cm95IHJlZmVyZW5jZXMgdG8gc3ltc2Vncy4KCUFsc28gcmVtb3ZlIHNvbWUgI2lmIDAnZCBjb2RlLgoKCSogY29yZS5jOiBSZW1vdmUgcmVyZWFkX2V4ZWMuCglkYnhyZWFkLmMgKHJlcmVhZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgoJZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogU2V0IHN5bWZpbGVfbXRpbWUuCgljb2ZmcmVhZC5jOiBTYW1lLgoJaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogQ2FsbCByZXJlYWRfc3ltYm9scyBub3QgcmVyZWFkX2V4ZWMuCgoJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiBXaGVuIHByaW50aW5nIHN0cmluZyBhZnRlciBjaGFyICosIHByaW50CglpdCBmb3IgIiIganVzdCBsaWtlIGFueSBvdGhlciBzdHJpbmcuCgoJKiBjb3JlLmMgKHJlcmVhZF9leGVjKTogTmV3IHByb2NlZHVyZS4KCWluZmNtZC5jIChydW5fY29tbWFuZCk6IENhbGwgcmVyZWFkX2V4ZWMuCgoJKiBjb2ZmcmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogQWRkIGZyb21fdHR5LgoKCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogT25seSBhc2sgYWJvdXQgbG9hZGluZyBuZXcKCXN5bWJvbCB0YWJsZSBpZiBmcm9tX3R0eS4KCk1vbiBGZWIgIDUgMDI6MjU6MjUgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIGluZmxvdy5jIChpbmZlcmlvcl9kaWVkKTogQ2FsbCBicmVha3BvaW50X2NsZWFyX2lnbm9yZV9jb3VudHMuCgoJKiBNYWtlZmlsZS5kaXN0IChPQlMpOiBSZW1vdmUgZGJ4cmVhZC5vIGFuZCBjb2ZmcmVhZC5vLgoKCSogY29uZmlnLmdkYjogSWdub3JlIGZpbGVzIGVuZGluZyBpbiAnIycgaW4gY29uZmlnLgoKCSogc3RhY2suYyAoYmFja3RyYWNlX2NvbW1hbmQpOiBBZGQgUVVJVCB0byBnZXRfcHJldl9mcmFtZSBsb29wcy4KClNhdCBGZWIgIDMgMjI6MjU6MDkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIE1ha2VmaWxlLmRpc3QgKFlBQ0MpOiBEb24ndCB1c2UgLXYuCgpGcmkgRmViICAyIDE5OjI2OjUwIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBtb2xlLmFpLm1pdC5lZHUpCgoJKiBjcmVhdGV0YWdzOiBPbmx5IGNoYW5nZSAubyB0byAuYyBhdCBlbmQgb2YgbmFtZS4KCgkqIE1ha2VmaWxlLmRpc3QgKGFsbGRlcHMubWFrKTogbmV3IHRhcmdldC4KCShNYWtlZmlsZSk6IGFkZCBhbGxkZXBzLm1hay4KCShTT1VSQ0VTKTogcmVtb3ZlIFBJTlNOUy4KCShUQUdGSUxFUzogdXNlIEFMTFBBUkFNLgoJKGdkYi50YXIpOiBhZGQgY29uZmlnLy4KCgkqIGNvbmZpZy5nZGI6IENoZWNrIGZvciBNX0ZJTEU9IG5vdCAjcGFyYW0uaAoJY29uZmlnLyo6IE1ha2Ugc3VyZSBNX0ZJTEU9IGV4aXN0cyB3aXRoIHNwYWNlIGFmdGVyIE1fRklMRT0uCglNYWtlZmlsZS5kaXN0IChUQUdTKTogUGFzcyBNX0ZJTEUgYW5kIERFUEZJTEVTLgoJY3JlYXRldGFnczogQ2hhbmdlIC5vIHRvIC5jLiAgUmVtb3ZlIHNwZWNpYWwgdGVzdHMgZm9yIGRlcC5jIGV0Yy4KCgkqIGRieHJlYWQuYywgY29mZnJlYWQuYzogRG9uJ3QgY2hlY2sgQ09GRl9GT1JNQVQgYW5kIFJFQURfREJYX0ZPUk1BVC4KCU1ha2VmaWxlLmRpc3Q6IE1vdmUge2RieCxjb2ZmfXJlYWQuYyBmcm9tIFNGSUxFUyB0byBBTExERVBGSUxFUy4KCWNvbmZpZy8qOiBhZGQgZGJ4cmVhZC5vIG9yIGNvZmZyZWFkLm8gdG8gZGVwZmlsZXMuCgoJKiBNYWtlZmlsZS5kaXN0IChkZXBlbmQpOiBEZXBlbmQgb24gJChTT1VSQ0VTKSwgbm90IGZvcmNlLgoKVGh1IEZlYiAgMSAxNzo0Mzo1NCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogc3ltbWlzYy5jIChwcmludF9zeW1ib2wpOiBQcmludCBuZXdsaW5lIGFmdGVyIGxhYmVsLgoKV2VkIEphbiAzMSAyMjozNTozOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogZGJ4cmVhZC5jIChyZWFkX2FkZGxfc3ltcyk6IFJlbW92ZSBjb2RlIHRoYXQgY2hlY2tzIGZvcgoJX2V0ZXh0LgoJTW92ZSBlbmRfb2ZfdGV4dF9hZGRyIGludG8gcmVhZF9kYnhfc3ltdGFiLgoJKHJlYWRfZGJ4X3N5bXRhYik6ICNpZiAwIG91dCBjb2RlIHdoaWNoIGNoZWNrcyBmb3IgX2V0ZXh0LgoKVHVlIEphbiAzMCAxNTo0MDoxOSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYWxiZXJ0LmFpLm1pdC5lZHUpCgoJKiBNYWtlZmlsZS5kaXN0IChnZGIudGFyKTogVXNlIHJlYWRsaW5lJ3MgIm1ha2UgcmVhZGxpbmUudGFyIgoJaW5zdGVhZCBvZiBoYXZpbmcgYSBsaXN0IG9mIHJlYWRsaW5lIGZpbGVzLgoKCSogaW5mcnVuLmMgKG5vcm1hbF9zdG9wKTogI2lmIDAgb3V0ICJ5b3UgaGF2ZSBmb3VuZCBhIGJ1ZyBpbiBzaCIuCgoJKiBtdW5jaCAoLURTWVNWKTogQ2hlY2sgZm9yIC50ZXh0IGF0IGVuZCBvZiBuYW1lLgoJT3B0aW9uYWxseSBhbGxvdyBleHRyYSB1bmRlcnNjb3JlIGJlZm9yZSBpbml0aWFsaXplLgoJUmVtb3ZlIHNwYWNlIGJldHdlZW4gIyEgYW5kIC9iaW4vc2guCgoJKiBtLW1lcmxpbi5oOiBQdXQgaW4gY2xhcmlmeWluZyBjb21tZW50cyBhYm91dCBTSEVMTF9GSUxFLgoJTWFrZWZpbGUuZGlzdCAoaW5zdGFsbCk6IEV4ZWN1dGUgTV9JTlNUQUxMLgoJY29uZmlnL21lcmxpbjogRGVmaW5lIE1fSU5TVEFMTC4KCk1vbiBKYW4gMjkgMDQ6MzI6MDkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKCgkqIGluZmxvdy5jOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gc2lnbmFsIGhhbmRsZXJzIGZyb20KCWludCAoKikoKSB0byB2b2lkICgqKSgpLgoKCSogbWFpbi5jOiBEZWNsYXJlIGluaXRfc2lnbmFscyBiZWZvcmUgdXNlICYgbWFrZSBpdCB2b2lkLgoJRGVjbGFyZSBpbml0aWFsaXplX2FsbF9maWxlcy4KCgkqIE1ha2VmaWxlLmRpc3QgKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0LgoKU2F0IEphbiAyNyAwMDoxOTo1MCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogZGVmcy5oIChlbnVtIGNvbW1hbmRfY2xhc3MpOiBSZW1vdmUgY29tbWEgYWZ0ZXIgbGFzdCBlbGVtZW50LgoKCSogTWFrZWZpbGUuZGlzdCAoZ2RiLnRhci5aKTogVXNlIGNvbXByZXNzIDxmb28gPmJhciByYXRoZXIKCXRoYW4gZGVsZXRpbmcgZ2RiLnRhci5aIGJlZm9yZSBzdGFydGluZy4KCgkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogQ29tcGFyZSBjb250ZXh0X3N0YWNrX2RlcHRoCgl3aXRoICFWQVJJQUJMRVNfSU5TSURFX0JMT0NLLCBub3QgVkFSSUFCTEVTX0lOU0lERV9CTE9DSy4KCgkqIG1jaGVjay5jOiBQdXQgd2hvbGUgZmlsZSBpbiAjaWYgZGVmaW5lZCBNQUxMT0NfUkFOR0VfQ0hFQ0suCgoJKiBtY2hlY2suYyAoY2hlY2toZHIpOiBDYWxsIGZhdGFsX2R1bXBfY29yZSBub3QgYWJvcnQuCgoJKiBtY2hlY2suYzogQ29weSBmcm9tIG1hbGxvYyBkaXN0cmlidXRpb24uCgoJKiBtYWluLmMgKG1haW4pOiBDYWxsIGluaXRfbWFsbG9jICgpLgoKCSogbWFpbi5jIChpbml0aWFsaXplX3NpZ25hbHMpOiBSZW5hbWUgdG8gaW5pdF9zaWduYWxzLgoKRnJpIEphbiAyNiAwMDo1MzoyMyAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgbW9sZS5haS5taXQuZWR1KQoKCSogKmRlcC5jOiBNYWtlIGNvcmVfZmlsZV9jb21tYW5kIHJldHVybiB2b2lkLgoKCSogZ2RiY29yZS5oIFshS0VSTkVMX1VfQUREUl06IERlY2xhcmUga2VybmVsX3VfYWRkci4KCWluZnB0cmFjZS5jIFshS0VSTkVMX1VfQUREUl06IE1ha2UgaXQgZXh0ZXJuLgoKCSogYWx0b3MtZGVwLmMgKE5CUEcsIFVQQUdFUyk6IFdyYXAgI2RlZmluZSBpbiAjaWYgIWRlZmluZWQuCgoJKiBtLXBuLmggKEdPVUxEX1BOKTogRGVmaW5lLgoJKi1waW5zbi5jOiBJbmNsdWRlIGFjdHVhbCBvcGNvZGUgdGFibGUgbm90IGp1c3Qgb3Bjb2RlLmgKCgkqIG1haW4uYyBbQUxJR05fU1RBQ0tfT05fU1RBUlRVUF06IE5ldyBjb2RlLgoJbS1pMzg2Lmg6IERlZmluZSBBTElHTl9TVEFDS19PTl9TVEFSVFVQLgoKCSogbS1tZXJsaW4uaCAoTk9fU0lHSU5URVJSVVBULCBTSEVMTF9GSUxFKTogRGVmaW5lLgoKCSogTW92ZSBjb2RlIGZyb20gaW5mcHRyYWNlIFtVU0VfUFRSQUNFX0dFVFJFR1NdIHRvIHN1bjMtZGVwLmMuCgltLXN1bnsyLDN9LmgsIG0tc3BhcmMuaDogRGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUy4KCgkqIE1ha2VmaWxlLmRpc3QsIGNvbmZpZy5nZGIsIGNvbmZpZy8qOgoJUmUtd3JpdGUgdG8gdXNlIG1hY2hpbmUtZGVwZW5kZW50IG1ha2VmaWxlcyBpbnN0ZWFkIG9mIGNwcC4KCgkqIG0taHAzMDBocHV4Lmg6IERlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMuCglpbmZwdHJhY2UuYzogUHV0IHtmZXRjaCxzdG9yZX1faW5mZXJpb3JfcmVnaXN0ZXJzIGluc2lkZQoJI2lmICFkZWZpbmVkIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUy4KCgkqIFNwbGl0IGV4ZWNjb3JlLmMgaW50byBleGVjLmMgYW5kIGNvcmVkZXAuYy4KCU1vdmUgYSBidW5jaCBvZiBzdHVmZiBmcm9tIGNvcmVkZXAuYyBhbmQgKmRlcC5jIHRvIGdkYmNvcmUuaC4KCgkqIGluZnB0cmFjZS5jICh7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyk6CglVc2UgVV9SRUdTX09GRlNFVCB0byBzZXQgb2Zmc2V0LgoJbS11bWF4Lmg6IERlZmluZSBVX1JFR1NfT0ZGU0VULgoKCSogbS11bWF4Lmg6IERlZmluZSBQVFJBQ0Vfe0FUVEFDSCxERVRBQ0h9LgoKCSogbS1pMzg2LmggKE5fU0VUX01BR0lDKTogRGVmaW5lLgoJbS1pMzg2Z2FzLmg6IGFkZCAjdW5kZWYgTl9TRVRfTUFHSUMuCgpUaHUgSmFuIDI1IDE4OjM5OjQ1IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBtb2xlLmFpLm1pdC5lZHUpCgoJKiBtLWhwMzAwYnNkLmg6IFJlbW92ZSBLRVJORUxfVV9BRERSLgoKCSogaW5mcHRyYWNlLmMgWyFLRVJORUxfVV9BRERSXTogR2V0IGFkZHJlc3Mgb2Yga2VybmVsIHUgYXJlYQoJYXQgcnVudGltZS4KCgkqIGluZnB0cmFjZS5jOiBSZXBsYWNlIG51bWJlcnMgd2l0aCBQVF9LSUxMLCBldGMuCgkoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogTG9vcCBmb3IgYXMgbWFueSB3b3JkcyBhcmUgaW4gdGhlIHJlZ2lzdGVyLgoKCSogaW5mcHRyYWNlLmMgW05PX1NJTkdMRV9TVEVQXTogQ2FsbCBzaW5nbGVfc3RlcCgpLgoKCSoga2lsbF9pbmZlcmlvcnssX2Zhc3R9OiBEZWNsYXJlIGFzIHJldHVybmluZyB2b2lkLgoKCSogbS1zdW4zLmggKFVTRV9QVFJBQ0VfR0VUUkVHUyk6IERlZmluZS4KCgkqIGV4ZWNjb3JlLmM6IEFkZCBJU19PQkpFQ1RfRklMRSAmIHJlbGF0ZWQgc3R1ZmYuCgoJKiBpbmZwdHJhY2UuYzogSW5jbHVkZSA8c3lzL3B0cmFjZS5oPi4KCVtBVFRBQ0hfREVUQUNIXSBbVVNFX1BUUkFDRV9HRVRSRUdTXTogTmV3IGNvZGUuCgoJKiBTcGxpdCBkZWZhdWx0LWRlcC5jIGludG8gaW5mcHRyYWNlLmMgYW5kIGV4ZWNjb3JlLmMuCgoJKiB2YWxwcmludC5jIFtJRUVFX0ZMT0FUXTogQ2hhbmdlIHZvaWQgKiB0byBjaGFyICouCgoJKiBicmVha3BvaW50LmM6IENoYW5nZSBwcmludGZfZmlsdGVyZWQoJXMpIHRvIGZwdXRzX2ZpbHRlcmVkLgoKV2VkIEphbiAyNCAwMDozNTo1MiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQoKCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogV2hlbiBmcmVlaW5nIGV2ZXJ5dGhpbmcsIGZyZWUKCXRoZSBzdHJpbmcgdGFibGUgdG9vLgoKCSogTWFrZWZpbGUuZGlzdCAoZ2RiMSk6IGFkZCAicm0gLWYgZ2RiMSIuCgoJKiBwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogSWYgc2l6ZSBpcyAwLCB1c2UgJ2InCgknaCcsICd3Jywgb3IgJ2cnIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4KCgkqIHN0YWNrLmMgKGJhY2t0cmFjZV9jb21tYW5kKTogUmVhZCBpbiBzeW1ib2xzIGZvciBmcmFtZXMgd2UnbGwKCXByaW50IGJlZm9yZSBwcmludGluZyB0aGVtLgoKCSogdmFsb3BzLmMgKHZhbHVlX2F0KTogRG9uJ3QgcHJpbnQgIkkvTyBlcnJvciIgb24gRUlPIGZyb20KCXB0cmFjZS4gIERvbid0IHByaW50ICJvdXQgb2YgYm91bmRzIiBmb3IgYW55IHB0cmFjZSBlcnJvcgoJZXhjZXB0IEVJTy4KCgkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSwgY2FzZSBUWVBFX0NPREVfRU5VTSk6CglQcmludCAiRk9PID0gNSIgbm90ICJGT08gOiA1Ii4KCgkqIHN5bXRhYi57YyxofTogTWFrZSBsb29rdXBfbWlzY19mdW5jIGV4dGVybi4KCgkqIE1ha2VmaWxlLmRpc3Q6IERlZmluZSBWRVJTSU9OIGluIG1ha2VmaWxlLCBhbmQgZ2VuZXJhdGUKCXZlcnNpb24uYyBhdXRvbWF0aWNhbGx5LgoJKGdkYi50YXIpOiBVc2UgZ2RiLSQoVkVSU0lPTiksIG5vdCBkaXN0LWdkYi4KCgkqIGV4cHJlYWQueSAoeXlsZXgpOiBVc2UgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSB0bwoJY3V0IGRvd24gb24gY2FsbHMgdG8gbG9va3VwX3N5bWJvbC4KCXN5bXRhYi57YyxofSAobG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSk6IE5ldyBmdW5jdGlvbi4KCShsb29rdXBfdHlwZW5hbWUpOiBVc2UgaXQuCgoJKiBzeW10YWIue2MsaH0gKGNoZWNrX3N0dWJfdHlwZSk6IE5ldyBmdW5jdGlvbi4KCXZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSwgdmFsX3ByaW50LCB0eXBlX3ByaW50X2Rlcml2YXRpb25faW5mbyksCgl2YWx1ZXMuYyAoYWxsb2NhdGVfdmFsdWUpOiBDYWxsIGl0LgoKCSogcHJpbnRjbWQuYyAod2hlcmVpc19jb21tYW5kKTogTmV3IGZ1bmN0aW9uLgoJc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wpOiBBZGQgc3ltdGFiIHBhcmFtZXRlci4KCXZhcmlvdXM6IFBhc3MgYWRkaXRpb25hbCBhcmd1bWVudCB0byBsb29rdXBfc3ltYm9sLgoJc3ltc2VnLmggKHN0cnVjdCBzeW1ib2wpOiBBZGQgbGluZSBmaWVsZC4KCWRieHJlYWQuYyAoZGVmaW5lX3N5bWJvbCk6IFNldCBzeW0tPmxpbmUuCgoJKiBkYnhyZWFkLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBSZWFkIHN0cmluZyB0YWJsZSBpbnRvCgltYWxsb2MnZCBtZW1vcnkgKHN5bWZpbGVfc3RyaW5nX3RhYmxlKSBhbmQgbGVhdmUgaXQgdGhlcmUuCgkocHN5bXRhYl90b19zeW10YWIpOiBVc2Ugc3ltZmlsZV9zdHJpbmdfdGFibGUuCgoJKiB1dGlscy5jIChzaWdfYWJicmV2KTogUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgoJaW5mcnVuLmMgKHNpZ19wcmludF97aGVhZGVyLGluZm99KTogQ29uc29saWRhdGUgZHVwbGljYXRlZAoJY29kZSBmcm9tIGhhbmRsZV9jb21tYW5kLCBzaWduYWxzX2luZm8uCgkoc2lnX3ByaW50X2luZm8pOiBKdXN0IHByaW50IG51bWJlciBpZiBubyBuYW1lIGZyb20gc2lnX2FiYnJldi4KCgkqIE1ha2VmaWxlLmRpc3QgKE9USEVSUyk6IEFkZCBDaGFuZ2VMb2ctMy54CgoJKiBpbmZydW4uYyAocmVzdG9yZV9pbmZlcmlvcl9zdGF0dXMpOiAjaWYgMCBvdXQKCSJVbmFibGUgdG8gcmVzdG9yZSBwcmV2aW91c2x5IHNlbGVjdGVkIGZyYW1lIiBlcnJvciBtZXNzYWdlLgoKCSogaW5mcnVuLmMgKHNpZ25hbHNfaW5mbywgaGFuZGxlX2NvbW1hbmQpOiBQcmludCBzaWduYWwKCWFiYnJldnMgYWxvbmcgd2l0aCBudW1iZXJzLgoKCSogaW5mcnVuLmMgKGhhbmRsZV9jb21tYW5kKTogQWNjZXB0IHN5bWJvbCBzaWduYWwgbmFtZXMuCgoJKiB1dGlscy5jIChzaWdfe251bWJlcixhYmJyZXZ9LCBpbml0X3NpZyk6IE5ldyBmdW5jdGlvbnMuCglfaW5pdGlhbGl6ZV91dGlsczogQ2FsbCBpbml0X3NpZyBmb3IgZWFjaCBzaWduYWwuCglkZWZzLmg6IERlY2xhcmUgdGhlbS4KCgkqIGRlZmF1bHQtZGVwLmMgKHJlYWRfaW5mZXJpb3JfbWVtb3J5KTogQ2hlY2sgcXVpdF9mbGFnIGluCglmZXRjaCBsb29wLgoKCSogQ2hhbmdlcyBmb3IgbGF6eSBmZXRjaGluZyAoc3BlZWRzIHRoaW5ncyB1cCBmb3IgYmlnIG9iamVjdHMpOgoJdmFsdWUuaCAoc3RydWN0IHZhbHVlKTogTmV3IGZpZWxkIGxhenkuCglWQUxVRV9DT05URU5UU19SQVcsIFZBTFVFX0xBWlksIHZhbHVlX2F0X2xhenk6IE5ldy4KCWZpbmR2YXIuYyAocmVhZF92YXJfdmFsdWUpOiBTZXQgbGF6eSBpbnN0ZWFkIG9mIGZldGNoaW5nLgoJdmFyaW91czogQ29weSBpbnRvIFZBTFVFX0NPTlRFTlRTX1JBVywgbm90IFZBTFVFX0NPTlRFTlRTLgoJdmFsb3BzLmM6IEFkZCB2YWx1ZV9hdF9sYXp5LCB2YWx1ZV9sYXp5LgoJdmFyaW91czogQ2FsbCB2YWx1ZV9hdF9sYXp5IGluc3RlYWQgb2YgdmFsdWVfYXQuCgoJKiBzeW10YWIuaCAoTE9OR0VTVCk6IERlZmluZS4KCgkqIG0tKi5oIChMT05HRVNULCBCVUlMVElOX1RZUEVfTE9OR0VTVCk6IERlbGV0ZSAoaW4gc3ltdGFiLmgpLgoKCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogI2lmIDAgb3V0IHN0b3AgaWYgQUJPVVRfVE9fUkVUVVJOCgoJKiB2ZXJzaW9uLmM6IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byA0LjBkZXZlbG9wbWVudAoKRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy0zLngKDApMb2NhbCBWYXJpYWJsZXM6Cm1vZGU6IGluZGVudGVkLXRleHQKbGVmdC1tYXJnaW46IDgKZmlsbC1jb2x1bW46IDc0CnZlcnNpb24tY29udHJvbDogbmV2ZXIKRW5kOgo=