LyoKICogQ29weXJpZ2h0IDIwMDYtMjAwOCBTYW11ZWwgTGlk6W4gQm9yZWxsCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJyZXNvdXJjZS5oIgoKTEFOR1VBR0UgTEFOR19TV0VESVNILCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFCnsKICAgIElEU19TVEFUVVNfRE9ORSAgICAgICAgICAgICJLbGFyIgogICAgSURTX1NUQVRVU19ET1dOTE9BRElOR0ZST00gIkjkbXRhciBmcuVuICVzLi4uIgp9CgpTVFJJTkdUQUJMRQp7CiAgICBJRFNfSFRNTERJU0FCTEVEICAgICJIVE1MLXZpc25pbmcg5HIgaW50ZSBha3RpdmVyYWQuIgogICAgSURTX0hUTUxET0NVTUVOVCAgICAiSFRNTC1kb2t1bWVudCIKICAgIElEU19ET1dOTE9BRElORyAgICAgIkjkbXRhci4uLiIKICAgIElEU19JTlNUQUxMSU5HICAgICAgIkluc3RhbGxlcmFyLi4uIgp9CgpJRF9EV0xfRElBTE9HIERJQUxPRyAgMCwgMCwgMjYwLCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfQ0VOVEVSIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiV2luZSBHZWNrbyBJbnN0YWxsYXRpb25zcHJvZ3JhbSIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiAgICBMVEVYVCAiV2luZSBrdW5kZSBpbnRlIGhpdHRhIHBha2V0ZXQgR2Vja28gdmlsa2V0IGty5HZzIGb2ciBhdHQgcHJvZ3JhbSBtZWQgaW5i5GRkYWQgSFRNTCAiIFwKICAgICAgICAgICJza2EgZnVuZ2VyYSBrb3JyZWt0LiBXaW5lIGthbiBo5G10YSBvY2ggaW5zdGFsbGVyYSBkZXQgYXV0b21hdGlza3Qg5XQgZGlnLlxuXG4iIFwKICAgICAgICAgICJPYnM6IER1IHJla29tbWVuZGVyYXMgYXR0IGFuduRuZGEgZGluIGRpc3RyaWJ1dGlvbnMgcGFrZXQgaSBzdORsbGV0LiBTZSBodHRwOi8vd2lraS53aW5laHEub3JnL0dlY2tvIGb2ciBtZXIgaW5mb3JtYXRpb24uIiwKICAgICAgICAgIElEX0RXTF9TVEFUVVMsIDEwLCAxMCwgMjQwLCA1MCwgU1NfTEVGVAogICAgQ09OVFJPTCAiRvZybG9wcCIsIElEX0RXTF9QUk9HUkVTUywgUFJPR1JFU1NfQ0xBU1NBLCBXU19CT1JERVJ8UEJTX1NNT09USCwgMTAsIDQwLCAyNDAsIDEyCiAgICBERUZQVVNIQlVUVE9OICImSW5zdGFsbGVyYSIsIElEX0RXTF9JTlNUQUxMLCAyMDAsIDcwLCA1MCwgMTUsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogICAgUFVTSEJVVFRPTiAiJkF2YnJ5dCIsIElEQ0FOQ0VMLCAxNDAsIDcwLCA1MCwgMTUsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAp9CgoKSUREX0hZUEVSTElOSyBESUFMT0cgMCwgMCwgMjUwLCA2NQpTVFlMRSBEU19DRU5URVIgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJIeXBlcmzkbmsiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogICAgR1JPVVBCT1ggIkzkbmtpbmZvcm1hdGlvbiIsIC0xLCA1LCA1LCAxOTAsIDU1CiAgICBMVEVYVCAiJlR5cDoiLCAtMSwgMTAsIDIyLCAyMCwgMTAKICAgIENPTUJPQk9YIElEQ19UWVBFLCAzNSwgMjAsIDQ1LCAxMDAsIFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZTQ1JPTEwgfCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX0hBU1NUUklOR1MKICAgIExURVhUICImVVJMOiIsIC0xLCAxMCwgNDIsIDIwLCAxMAogICAgRURJVFRFWFQgSURDX1VSTCwgMzUsIDQwLCAxNTAsIDE0LCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogICAgUFVTSEJVVFRPTiAiT0siLCBJRE9LLCAyMDAsIDEwLCA0NSwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICAgIFBVU0hCVVRUT04gIkF2YnJ5dCIsIElEQ0FOQ0VMLCAyMDAsIDI4LCA0NSwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAp9CgpJRF9QUk9NUFRfRElBTE9HIERJQUxPRyAwLCAwLCAyMDAsIDkwClNUWUxFIFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiAgICBMVEVYVCAiIiwgSURfUFJPTVBUX1BST01QVCwgMTAsIDEwLCAxODAsIDMwCiAgICBFRElUVEVYVCBJRF9QUk9NUFRfRURJVCwgMTAsIDQ1LCAxODAsIDE0LCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogICAgUFVTSEJVVFRPTiAiT0siLCBJRE9LLCA0MCwgNjUsIDQ1LCAxNSwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogICAgUFVTSEJVVFRPTiAiQXZicnl0IiwgSURDQU5DRUwsIDExNSwgNjUsIDQ1LCAxNSwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCn0K