LyoKICogV2luZUZpbGUKICogU2ltcGxpZmllZCBDaGluZXNlIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDIgbGl1c3BpZGVyIDxsaXVzcGlkZXJAeWFob28uY29tPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0NISU5FU0UsIFNVQkxBTkdfQ0hJTkVTRV9TSU1QTElGSUVECgovKiBNZW51ICovCgpJRE1fV0lORUZJTEUgTUVOVSBGSVhFRCBJTVBVUkUKewogICAgUE9QVVAgIs7EvP6jqCZGo6kiICB7CiAgICAgICAgTUVOVUlURU0gIrTyv6qjqCZPo6lcdEVudGVyIiwgICAgICAgICAgIElEX0FDVElWQVRFCiAgICAgICAgTUVOVUlURU0gItLGtq+jqCZNo6kuLi5cdEY3IiwgICAgICAgICAgIElEX0ZJTEVfTU9WRQogICAgICAgIE1FTlVJVEVNICK4tNbGo6gmQ6OpLi4uXHRGOCIsICAgICAgICAgICBJRF9GSUxFX0NPUFkKICAgICAgICBNRU5VSVRFTSAizrvT2rz0zPmw5aOoJkmjqS4uLlx0RjkiLCAgICAgMTE4CiAgICAgICAgTUVOVUlURU0gIsm+s/2jqCZEo6lcdERlbCIsICAgICAgICAgICAgIElEX0ZJTEVfREVMRVRFCiAgICAgICAgTUVOVUlURU0gIrjEw/ujqCZOo6kuLi4iLCAgICAgICAgICAgICAgIDEwOQogICAgICAgIE1FTlVJVEVNICLK9NDUo6gmSaOpLi4uXHRBbHQrRW50ZXIiLCAgICBJRF9FRElUX1BST1BFUlRJRVMKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAi0bnL9aOoJk+jqS4uLiIsICAgICAgICAgICAgICAgMTE5CiAgICAgICAgTUVOVUlURU0gIr3i0bnL9aOoJk+jqS4uLiIsICAgICAgICAgICAgIDEyMAogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICLUy9DQo6gmUqOpLi4uIiwgICAgICAgICAgICAgICBJRF9FWEVDVVRFCiAgICAgICAgTUVOVUlURU0gIrTy06GjqCZQo6kuLi4iLCAgICAgICAgICAgICAgIDEwMgogICAgICAgIE1FTlVJVEVNICLF5NbDzsS8/s/gudguLi4iLCAgICAgICAgICAgICAxMDMKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAivajBosS/wryjqCZFo6kuLi4iLCAgICAgICAgICAgMTExCiAgICAgICAgTUVOVUlURU0gIrLp1dKjqCZIo6kuLi4iLCAgICAgICAgICAgICAgIDEwNAogICAgICAgIE1FTlVJVEVNICLRodTxzsS8/qOoJlOjqS4uLiIsICAgICAgICAgICAxMTYKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwogICAgICAgIE1FTlVJVEVNICLNy7P2o6gmWKOpXHRBbHQrWCIsICAgICAgICAgICBJRF9GSUxFX0VYSVQKI2Vsc2UKICAgICAgICBNRU5VSVRFTSAizcuz9qOoJlijqSIsICAgICAgICAgICAgICAgICAgSURfRklMRV9FWElUCiNlbmRpZgogICAgfQoKICAgIFBPUFVQICK0xcXMo6gmRKOpIiAgewogICAgICAgIE1FTlVJVEVNICK4tNbGo6gmQ6OpLi4uIiwgICAgICAgICAgICAgICAyMDEKICAgICAgICBNRU5VSVRFTSAiw/zD+6OoJkyjqS4uLiIsICAgICAgICAgICAgICAgMjAyCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIrjxyr27r6OoJqOpLi4uIiwgICAgICAgICAgICAgIElEX0ZPUk1BVF9ESVNLCiNpZmRlZiBfV0lOOTUKICAgICAgICBNRU5VSVRFTSAivajBos+1zbPFzKOoJk2jqS4uLiIsIC0xICAvKlRPRE8qLwojZW5kaWYKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiway90834wufH/bavxvejqCZOo6kiLCAgICAgICAgSURfQ09OTkVDVF9ORVRXT1JLX0RSSVZFCiAgICAgICAgTUVOVUlURU0gIrbPv6rN+MLnx/22r8b3way906OoJkSjqSIsICAgIElEX0RJU0NPTk5FQ1RfTkVUV09SS19EUklWRQogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICK5ss/tzqouLi4iLCAgICAgICAgICAgICAgICAgICAyNTQKICAgICAgICBNRU5VSVRFTSAiyb6z/bmyz+2jqCZSo6kuLi4iLCAgICAgICAgICAgMjU1CiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gItGh1PHH/bavxvejqCZTo6kuLi4iLCAgICAgICAgIDI1MQogICAgfQoKICAgIFBPUFVQICLEv8K8o6gmRKOpIiAgewogICAgICAgIE1FTlVJVEVNICLPwtK7suOjqCZOo6lcdCsiLCAgICAgICAgICAgICAzMDEKICAgICAgICBNRU5VSVRFTSAi1bm/qqOoJlSjqVx0KiIsICAgICAgICAgICAgICAgMzAyCiAgICAgICAgTUVOVUlURU0gIsirsr/Vub+qo6gmQaOpXHRTdHJnKyoiLCAgICAgIDMwMwogICAgICAgIE1FTlVJVEVNICLV27X+o6gmUqOpXHQtIiwgICAgICAgICAgICAgICAzMDQKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiseq8x9fTxL/CvKOoJk2jqSIsICAgICAgICAgICAgNTA1CiAgICB9CgogICAgUE9QVVAgIsrTzbyjqCZWo6kiICB7CiAgICAgICAgTUVOVUlURU0gIsS/wrzK97v6xvfE2sjdo6gmUqOpIiwgICAgICAgIDQxMwogICAgICAgIE1FTlVJVEVNICK99s/Uyr7Ev8K8yvejqCZFo6kiLCAgICAgICAgICA0MTEKICAgICAgICBNRU5VSVRFTSAivfbP1Mq+xL/CvMTayN2jqCZPo6kiLCAgICAgICAgNDEyCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIrfWuO6jqCZMo6kiLCAgICAgICAgICAgICAgICAgIElEX1ZJRVdfU1BMSVQKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAizsS8/sP7w/ujqCZOo6kiLCAgICAgICAgICAgICAgSURfVklFV19OQU1FCiAgICAgICAgTUVOVUlURU0gIs7EvP7P6s+kwdCx7aOoJkGjqSIsICAgICAgICAgIElEX1ZJRVdfQUxMX0FUVFJJQlVURVMsIENIRUNLRUQKICAgICAgICBNRU5VSVRFTSAisr+31sr00NSjqCZQo6kuLi4iLCAgICAgICAgICAgSURfVklFV19TRUxFQ1RFRF9BVFRSSUJVVEVTCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIrC0zsS8/sP7xcXQ8qOoJlOjqSIsICAgICAgICAgIElEX1ZJRVdfU09SVF9OQU1FCiAgICAgICAgTUVOVUlURU0gIrC0wODQzcXF0PKjqCZCo6kiLCAgICAgICAgICAgIElEX1ZJRVdfU09SVF9UWVBFCiAgICAgICAgTUVOVUlURU0gIrC0tPPQocXF0PKjqCZao6kiLCAgICAgICAgICAgIElEX1ZJRVdfU09SVF9TSVpFCiAgICAgICAgTUVOVUlURU0gIrC0yNXG2sXF0PKjqCZEo6kiLCAgICAgICAgICAgIElEX1ZJRVdfU09SVF9EQVRFCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIrao1sbFxdDyLi4uIiwgICAgICAgICAgICAgICAgIElEX1ZJRVdfRklMVEVSCiAgICB9CgogICAgUE9QVVAgItGhz+6jqCZPo6kiICB7CiAgICAgICAgTUVOVUlURU0gIsi3tqi3vcq9o6gmQ6OpLi4uIiwgICAgICAgICAgIDUwMQogICAgICAgIE1FTlVJVEVNICLX1szlo6gmRqOpLi4uIiwgICAgICAgICAgICAgICBJRF9TRUxFQ1RfRk9OVAogICAgICAgIE1FTlVJVEVNICK2qNbGuaS+38z1o6gmQqOpLi4uIiwgICAgICAgICA1MTIKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiuaS+38z1o6gmVKOpIiwgICAgICAgICAgICAgICAgSURfVklFV19UT09MX0JBUiwgQ0hFQ0tFRAogICAgICAgIE1FTlVJVEVNICLH/bavxvfB0LHto6gmRKOpIiwgICAgICAgICAgICBJRF9WSUVXX0RSSVZFX0JBUiwgQ0hFQ0tFRAogICAgICAgIE1FTlVJVEVNICLXtMyswLijqCZTo6kiLCAgICAgICAgICAgICAgICBJRF9WSUVXX1NUQVRVU0JBUiwgQ0hFQ0tFRAojaWZuZGVmIF9OT19FWFRFTlNJT05TCiAgICAgICAgTUVOVUlURU0gIsirxsGjqCZVo6lcdEN0cmwrU2hpZnQrUyIsICAgIElEX1ZJRVdfRlVMTFNDUkVFTgojZW5kaWYKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiJk1pbmltaXplIG9uIHJ1biIsICAgICAgICAgICAgNTA0CiAgICAgICAgTUVOVUlURU0gIiZTYXZlIHNldHRpbmdzIG9uIGV4aXQiLCAgICAgIDUxMQogICAgfQoKCiAgICBQT1BVUCAisLLIq6OoJlOjqSIgIHsKICAgICAgICBNRU5VSVRFTSAit8POyqOoJkGjqS4uLiIsICAgICAgICAgICAgICAgNjA1CiAgICAgICAgTUVOVUlURU0gIrXHwryjqCZMo6kuLi4iLCAgICAgICAgICAgICAgIDYwNgogICAgICAgIE1FTlVJVEVNICLL+dPQ1d+jqCZPo6kuLi4iLCAgICAgICAgICAgICA2MDcKICAgIH0KCiAgICBQT1BVUCAitLC/2qOoJlejqSIgIHsKICAgICAgICBNRU5VSVRFTSAi0MK9qKOoJlcpIiwgICAgICAgICAgICAgICAgICAgSURfV0lORE9XX05FVwogICAgICAgIE1FTlVJVEVNICKy47X+XHRDdHJsK0Y1IiwgICAgICAgICAgICAgICBJRF9XSU5ET1dfQ0FTQ0FERQogICAgICAgIE1FTlVJVEVNICLLrsa9xr3GzKOoJkijqSIsICAgICAgICAgICAgICBJRF9XSU5ET1dfVElMRV9IT1JaCiAgICAgICAgTUVOVUlURU0gIrS51rHGvcbMo6gmo6lcdEN0cmwrRjQiLCAgICAgIElEX1dJTkRPV19USUxFX1ZFUlQKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwogICAgICAgIE1FTlVJVEVNICLX1LavxcXB0CIsICAgICAgICAgICAgICAgICAgICBJRF9XSU5ET1dfQVVUT1NPUlQKI2VuZGlmCiAgICAgICAgTUVOVUlURU0gItfUtq/FxcHQzbyx6qOoJlOjqSIsICAgICAgICAgIElEX1dJTkRPV19BUlJBTkdFCiAgICAgICAgTUVOVUlURU0gIsui0MKjqCZSo6lcdEY1IiwgICAgICAgICAgICAgIElEX1JFRlJFU0gKICAgIH0KCiAgICBQT1BVUCAiJj8iICB7CiAgICAgICAgTUVOVUlURU0gIrDv1vrW98zio6gmSKOpXHRGMSIsICAgICAgICAgIElEX0hFTFAKICAgICAgICBNRU5VSVRFTSAiy9HL97Dv1vqjqCZTo6kuLi5cdEYxIiwgICAgICAgSURfSEVMUAogICAgICAgIE1FTlVJVEVNICLKudPDsO/W+qOoJlWjqVx0RjEiLCAgICAgICAgICBJRF9IRUxQX1VTSU5HCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIia52NPaIFdpbmVmaWxlLi4uIiwgICAgICAgICAgIElEX0FCT1VUCiAgICB9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICLUy9DQIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKICAgIENPTlRST0wgICAgICAgICAiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCiAgICBDT05UUk9MICAgICAgICAgIsP8we6jqCZDo6mjuiIsIC0xLCAiU3RhdGljIiwgU1NfTEVGVE5PV09SRFdSQVB8V1NfR1JPVVAsIDMsIDE4LCA2MCwgMTAKICAgIEVESVRURVhUICAgICAgICAyMDEsIDMsIDI5LCAxMzQsIDEyLCBFU19BVVRPSFNDUk9MTAogICAgQ09OVFJPTCAgICAgICAgICLX986qway906OoJlOjqSIsIDIxNCwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWHxXU19UQUJTVE9QLDMsIDQ1LCA3MSwgMTIKICAgIERFRlBVU0hCVVRUT04gICAiyLe2qCIsIDEsIDE1OCwgNiwgNDcsIDE0CiAgICBQVVNIQlVUVE9OICAgICAgIsihz/siLCAyLCAxNTgsIDIzLCA0NywgMTQKICAgIFBVU0hCVVRUT04gICAgICAisO/W+qOoJkijqSIsIDI1NCwgMTU4LCA0MywgNDcsIDE0Cn0K