LyoKICogU3RhcnQKICogUG9ydHVndWVzZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAzIE1hcmNlbG8gRHVhcnRlCiAqIENvcHlyaWdodCAyMDA0IEFt6XJpY28gSm9z6SBNZWxvCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJyZXNvdXJjZXMuaCIKCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTgoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfVVNBR0UsICJJbmljaWEgdW0gcHJvZ3JhbWEsIG91IGFicmUgdW0gZG9jdW1lbnRvIG5vIHByb2dyYW1hIG5vcm1hbG1lbnRlIHVzYWRvIHBhcmEgYXJxdWl2b3MgY29tIGRldGVybWluYWRvIHN1ZnV4by5cblwKVXNvOlxuXApzdGFydCBbb3Dn9WVzXSBhcnF1aXZvX2RlX3Byb2dyYW1hIFthcmd1bWVudG9zLi4uXVxuXApzdGFydCBbb3Dn9WVzXSBhcnF1aXZvX2RlX2RvY3VtZW50by5leHRcblwKXG5cCk9wdGlvbnM6XG5cCi9NW2luaW1pemVkXSBJbmljaWEgbyBwcm9ncmFtYSBtaW5pbWl6YWRvLlxuXAovTUFYW2ltaXplZF0gSW5pY2lhIG8gcHJvZ3JhbWEgbWF4aW1pemFkby5cblwKL1JbZXN0b3JlZF0gIEluaWNpYSBvIHByb2dyYW1hIG5vcm1hbG1lbnRlIChzZW0gbWluaW1pemFyIG5lbSBtYXhpbWl6YXIpLlxuXAovV1thaXRdICAgICAgQWd1YXJkYSBxdWUgbyBwcm9ncmFtYSBpbmljaWFkbyB0ZXJtaW5lIGUgZW50428gcmV0b3JubyB1bSBj82RpZ28gKGV4aXQgY29kZSkuXG5cCi9Qcm9nSURPcGVuICBPcGVuIGEgZG9jdW1lbnQgdXNpbmcgdGhlIGZvbGxvd2luZyBwcm9nSUQuXG5cCi9MICAgICAgICAgICBNb3N0cmEgYSBsaWNlbudhIGFvIHVzdeFyaW8uXG5cClxuXApzdGFydC5leGUgdmVyc2lvbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWxcblwKU3RhcnQgbuNvIHZlbSBjb20gQUJTT0xVVEFNRU5URSBORU5IVU1BIEdBUkFOVElBOyBwYXJhIGRldGFoZXMgZXhlY3V0ZSBjb20gYSBvcOfjbyAvTC5cblwKRXN0ZSDpIHVtIHNvZnR3YXJlIGxpdnJlIChmcmVlIHNvZnR3YXJlKSwgZSB2b2PqIOkgYmVudmluZG8gYSByZWRpc3RyaWJ17S1sbyBzb2JcblwKY2VydGFzIGNvbmRp5/VlczsgZXhlY3V0ZSAnc3RhcnQgL0wnIHBhcmEgZGV0YWxoZXMuXG5cCiIKClNUUklOR19MSUNFTlNFLCAic3RhcnQuZXhlIHZlcnPjbyAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWxcblwKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuXAptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlXG5cCmFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjFcblwKb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG5cClxuXApUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcblwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcblwKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuXApHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cClxuXApZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlXG5cCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG5cCkZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuXG5cClxuXApWZWphIG8gYXJxdWl2byBDT1BZSU5HLkxJQiBwYXJhIGluZm9ybWHn428gc29icmUgYSBsaWNlbudhLlxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIkFwbGljYefjbyBu428gcG9kZSBzZXIgaW5pY2lhZGEsIG91IG7jbyBleGlzdGUgYXBsaWNh5+NvIGFzc29jaWFkYSBjb20gbyBhcnF1aXZvIGVzcGVjaWZpY2Fkby5cblNoZWxsRXhlY3V0ZUV4IGZhbGhvdSIKClNUUklOR19VTklYRkFJTCAiQ291bGQgbm90IHRyYW5zbGF0ZSB0aGUgc3BlY2lmaWVkIFVuaXggZmlsZW5hbWUgdG8gYSBET1MgZmlsZW5hbWUuIgp9CgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfVVNBR0UsICJJbmljaWEgdW0gcHJvZ3JhbWEsIG91IGFicmUgdW0gZG9jdW1lbnRvIG5vIHByb2dyYW1hIG5vcm1hbG1lbnRlIHVzYWRvIHBhcmEgZmljaGVpcm9zIGNvbSBkZXRlcm1pbmFkbyBzdWZpeG8uXG5cClVzbzpcblwKc3RhcnQgW29w5/Vlc10gZmljaGVpcm9fZGVfcHJvZ3JhbWEgW2FyZ3VtZW50b3MuLi5dXG5cCnN0YXJ0IFtvcOf1ZXNdIGZpY2hlaXJvX2RlX2RvY3VtZW50by5leHRcblwKXG5cCk9wdGlvbnM6XG5cCi9NW2luaW1pemVkXSBJbmljaWEgbyBwcm9ncmFtYSBtaW5pbWl6YWRvLlxuXAovTUFYW2ltaXplZF0gSW5pY2lhIG8gcHJvZ3JhbWEgbWF4aW1pemFkby5cblwKL1JbZXN0b3JlZF0gIEluaWNpYSBvIHByb2dyYW1hIG5vcm1hbG1lbnRlIChzZW0gbWluaW1pemFyIG5lbSBtYXhpbWl6YXIpLlxuXAovV1thaXRdICAgICAgQWd1YXJkYSBxdWUgbyBwcm9ncmFtYSBpbmljaWFkbyB0ZXJtaW5lIGUgZW50428gcmV0b3JuZSB1bSBj82RpZ28gKGV4aXQgY29kZSkuXG5cCi9MICAgICAgICAgICBNb3N0cmEgYSBsaWNlbudhIGFvIHV0aWxpemFkb3IuXG5cClxuXApzdGFydC5leGUgdmVyc2lvbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWxcblwKU3RhcnQgbuNvIHZlbSBjb20gQUJTT0xVVEFNRU5URSBORU5IVU1BIEdBUkFOVElBOyBwYXJhIGRldGFoZXMgZXhlY3V0ZSBjb20gYSBvcOfjbyAvTC5cblwKRXN0ZSDpIHVtIHNvZnR3YXJlIGxpdnJlIChmcmVlIHNvZnR3YXJlKSwgZSDpIGJlbS12aW5kbyBhIHJlZGlzdHJpYnXtLWxvIHNvYiBjZXJ0YXNcblwKY29uZGnn9WVzOyBleGVjdXRlICdzdGFydCAvTCcgcGFyYSBkZXRhbGhlcy5cblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUgdmVyc+NvIDAuMiBDb3B5cmlnaHQgKEMpIDIwMDMsIERhbiBLZWdlbFxuXApUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2VcblwKYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMVxuXApvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblwKXG5cClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuXApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG5cCkdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cblwKXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2VcblwKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcblwKRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cblwKXG5cClZlamEgbyBmaWNoZWlybyBDT1BZSU5HLkxJQiBwYXJhIGluZm9ybWHn428gc29icmUgYSBsaWNlbudhLlxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIkEgYXBsaWNh5+NvIG7jbyBwb2RlIHNlciBpbmljaWFkYSwgb3UgbuNvIGV4aXN0ZSBhcGxpY2Hn428gYXNzb2NpYWRhIGNvbSBvIGZpY2hlaXJvIGVzcGVjaWZpY2Fkby5cblNoZWxsRXhlY3V0ZUV4IGZhbGhhZG8iCgpTVFJJTkdfVU5JWEZBSUwgIkNvdWxkIG5vdCB0cmFuc2xhdGUgdGhlIHNwZWNpZmllZCBVbml4IGZpbGVuYW1lIHRvIGEgRE9TIGZpbGVuYW1lLiIKfQo=