LyoKICogQ29weXJpZ2h0IDIwMDUgSm9z6SBNYW51ZWwgRmVycmVyIE9ydGl6CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfU1BBTklTSCwgU1VCTEFOR19ORVVUUkFMCgoxMDAgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgIDAsIDAsIDIyMCwgNjIKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkRlc2NhcmdhbmRvIGVsIGNvbnRyb2wgQWN0aXZlIFggZGUgTW96aWxsYSIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiBDT05UUk9MICJQcm9ncmVzczEiLDEwMDAsIm1zY3Rsc19wcm9ncmVzczMyIixXU19CT1JERVJ8UEJTX1NNT09USCwxMCwxMCwyMDAsMTIKIExURVhUICIiLCAxMDQsIDEwLCAzMCwgMjAwLCAxMCwgU1NfQ0VOVEVSCiBQVVNIQlVUVE9OICJDYW5jZWxhciIsIElEQ0FOQ0VMLCA4NSwgNDQsIDUwLCAxNSwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFCkJFR0lOCiAxMDAxCSJFc3RhIGFwbGljYWNp824gZXN04SBzb2xpY2l0YW5kbyB1biBvYmpldG8gQWN0aXZlIFggZGUgbmF2ZWdhZG9yXG4iIFwKICAgICAgICAicGVybyBlbCBjb250cm9sIEFjdGl2ZSBYIGRlIE1vemlsbGEgbm8gZXN04SBpbnN0YWxhZG8gYWN0dWFsbWVudGUuIiBcCiAgICAgICAgIr9EZXNlYSBkZXNjYXJnYXJsbyBlIGluc3RhbGFybG8/IgpFTkQK