LyoKICogIE5vdGVwYWQgKER1dGNoIHJlc291cmNlcykKICoKICogIENvcHlyaWdodCAyMDAzIEhhbnMgTGVpZGVra2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJub3RlcGFkX3Jlcy5oIgoKTEFOR1VBR0UgTEFOR19EVVRDSCwgU1VCTEFOR19ORVVUUkFMCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkJlc3RhbmQiIHsKICBNRU5VSVRFTSAiJk5pZXV3IiwJCSAgICAgQ01EX05FVwogIE1FTlVJVEVNICImT3BlbmVuLi4uXHRDdHJsK08iLAkgICAgIENNRF9PUEVOCiAgTUVOVUlURU0gIk8mcHNsYWFuXHRDdHJsK1MiLAkgICAgIENNRF9TQVZFCiAgTUVOVUlURU0gIk9wcyZsYWFuIGFscy4uLiIsCSAgICAgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQWYmZHJ1a2tlbi4uLlx0Q3RybCtQIiwgICAgICBDTURfUFJJTlQKICBNRU5VSVRFTSAiUGEmZ2luYS1pbnN0ZWxsaW5nZW4uLi4iLCAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJQcmludGVyaW5zJnRlbGxpbmdlbi4uLiIsICAgIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBZnNsdWl0ZW4iLCAgICAgICAgICAgICBDTURfRVhJVAogfQpQT1BVUCAiQmUmd2Vya2VuIiB7CiAgTUVOVUlURU0gIiZPbmdlZGFhbiBtYWtlblx0Q3RybCtaIiwgICAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiSyZuaXBwZW5cdEN0cmwrWCIsICAgICAgICAgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZLb3Bp63Jlblx0Q3RybCtDIiwgICAgICAgICAgQ01EX0NPUFkKICBNRU5VSVRFTSAiJlBsYWtrZW5cdEN0cmwrViIsICAgICAgICAgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiJlZlcndpamRlcmVuXHREZWwiLCAgICAgICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBbGxlcyBzZWxlY3RlcmVuXHRDdHJsK0EiLCAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiVGlqZC8mZGF0dW1cdEY1IiwgICAgICAgICAgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkEmdXRvbWF0aXNjaGUgdGVydWdsb29wIiwgICAgQ01EX1dSQVAKICBNRU5VSVRFTSAiJkxldHRlcnR5cGUgaW5zdGVsbGVuLi4uIiwgICBDTURfRk9OVAogfQpQT1BVUCAiJlpvZWtlbiIgewogIE1FTlVJVEVNICImWm9la2VuLi4uXHRDdHJsK1oiLCAgICBDTURfU0VBUkNICiAgTUVOVUlURU0gIlYmb2xnZW5kZSB6b2VrZW5cdEYzIiwgIENNRF9TRUFSQ0hfTkVYVAogIE1FTlVJVEVNICImVmVydmFuZ2VuLi4uXHRDdHJsK0giLCBDTURfUkVQTEFDRQogfQpQT1BVUCAiJkhlbHAiIHsKICBNRU5VSVRFTSAiJkhlbHAtb25kZXJ3ZXJwZW4iLCAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJlpvZWtlbi4uLiIsICAgICAgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIkgmdWxwIGJpaiBIZWxwIiwgICAgIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJk92ZXIgTm90ZXBhZCIsIENNRF9IRUxQX0FCT1VUX05PVEVQQUQKIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJQYWdpbmEtaW5zdGVsbGluZ2VuIgp7CkxURVhUICAgICImS29wdGVrc3Q6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZWb2V0dGVrc3Q6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICImTWFyZ2VzIChtaWxsaW1ldGVyKToiLCAgMHgxNDQsICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAiTCZpbmtzOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImQm92ZW46IiwgICAgICAgICAweDE0OCwgICAgMjAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfVE9QVkFMVUUsICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlJlY2h0czoiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1JJR0hUVkFMVUUsICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZPbmRlcjoiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJPSyIsICAgICAgICBJRE9LLCAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJBbm51bGVyZW4iLCBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkhlbHAiLCAgICAgSURIRUxQLCAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpJRERfT0ZOX1RFTVBMQVRFICBESUFMT0cgNTAsNTAsMzAwLDE1ClNUWUxFIERTXzNETE9PSyB8IERTX0NPTlRST0wgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19DTElQU0lCTElOR1MgfCBXU19CT1JERVIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogIExURVhUICJDb2RlcmluZzoiLCAtMSwgNSwwLCA1MCwxMgogIENPTUJPQk9YIElEQ19PRk5fRU5DQ09NQk8sIDUzLDAsIDE1Niw0OCwgV1NfQ0hJTEQgfCBXU19WU0NST0xMIHwgQ0JTX0RST1BET1dOTElTVApFTkQKClNUUklOR1RBQkxFCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwgICAiJmYiClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIlBhZ2luYSAmcCIKClNUUklOR19OT1RFUEFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLbGFkYmxvayIKU1RSSU5HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZPVVQiClNUUklOR19XQVJOSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQUFSU0NIVVdJTkciClNUUklOR19JTkZPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvcm1hdGllIgoKU1RSSU5HX1VOVElUTEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hYW1sb29zIgoKU1RSSU5HX0FMTF9GSUxFUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUgYmVzdGFuZGVuICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVrc3RiZXN0YW5kZW4gKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXQgYmVzdGFuZCAnJXMnIGlzIHRlIGdyb290IHZvb3IgS2xhZGJsb2suXG4gXApHZWJydWlrIGVlbiBhbmRlcmUgZWRpdG9yLiIKU1RSSU5HX05PVEVYVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlUgaGVlZnQgZ2VlbiB0ZWtzdCBpbmdldm9lcmQuIFwKXG5UeXBlIHV3IHRla3N0IGVuIHByb2JlZXIgaGV0IG5vZ21hYWxzIgpTVFJJTkdfRE9FU05PVEVYSVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV0IGJlc3RhbmQgJyVzJ1xuYmVzdGFhdCBuaWV0XG5cbiBcCldpbHQgdSBlZW4gbmlldXcgYmVzdGFuZCBtYWtlbj8iClNUUklOR19OT1RTQVZFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXQgYmVzdGFuZCAnJXMnXG5pcyBnZXdpanppZ2RcblxuIFwKV2lsdCB1IGRlIHdpanppZ2luZ2VuIG9wc2xhYW4/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBrYW4gbmlldCB3b3JkZW4gZ2V2b25kZW4uIgpTVFJJTkdfT1VUX09GX01FTU9SWSwgICAgICAgICAgICAgICAgICAgICAgICAgICAiT252b2xkb2VuZGUgZ2VoZXVnZW4uIFwKXG5TbHVpdCBlZW4gb2YgbWVlciBhcHBsaWNhdGllcyBvbSBkZSBob2V2ZWVsaGVpZFxuYmVzY2hpa2JhYXIgZ2VoZXVnZW4gdGUgdmVyZ3JvdGVuLiIKClNUUklOR19VTklDT0RFX0xFLCAgICAgIlVuaWNvZGUgKFVURi0xNikiClNUUklOR19VTklDT0RFX0JFLCAgICAgIlVuaWNvZGUgKFVURi0xNiBiaWctZW5kaWFuKSIKClNUUklOR19MT1NTX09GX1VOSUNPREVfQ0hBUkFDVEVSUywgICAgICAgICAiJXNcblwKRGl0IGJlc3RhbmQgYmV2YXQgVW5pY29kZSB0ZWtlbnMgZGllIHZlcmxvcmVuIHp1bGxlbiBnYWFuXG5cCmFscyBkaXQgYmVzdGFuZCB3b3JkdCBvcGdlc2xhZ2VuIGluIGRlICVzIGNvZGVyaW5nLlxuXApLbGlrIG9wIEFubnVsZXJlbiBvbSBkZXplIHRla2VucyB0ZSBiZWhvdWRlbiwgZW4gc2VsZWN0ZWVyXG5cCmRhYXJuYSBlZW4gdmFuIGRlIFVuaWNvZGUtb3B0aWVzIGluIGRlIGNvZGVyaW5nc2tldXplbGlqc3QuXG5cCldpbHQgdSBkb29yZ2Fhbj8iCn0K