LyoKICogV2luZUZpbGUKICogSXRhbGlhbiBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwIE1hcnRpbiBGdWNocwogKiBDb3B5cmlnaHQgMjAwMiBTdGV2ZW4gRWR3YXJkcwogKiBDb3B5cmlnaHQgMjAwMiBBbGV4YW5kcmUgSnVsbGlhcmQKICogQ29weXJpZ2h0IDIwMDQgSXZhbiBMZW8gUHVvdGkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgInJlc291cmNlLmgiCgpMQU5HVUFHRSBMQU5HX0lUQUxJQU4sIFNVQkxBTkdfTkVVVFJBTAoKLyogTWVudSAqLwoKSURNX1dJTkVGSUxFIE1FTlUgRklYRUQgSU1QVVJFCnsKICAgIFBPUFVQICImRmlsZSIgIHsKICAgICAgICBNRU5VSVRFTSAiJkFwcmlcdEludmlvIiwgICAgICAgICAgICAgICAgSURfQUNUSVZBVEUKICAgICAgICBNRU5VSVRFTSAiJlNwb3N0YS4uLlx0RjciLCAgICAgICAgICAgICAgSURfRklMRV9NT1ZFCiAgICAgICAgTUVOVUlURU0gIiZDb3BpYS4uLlx0RjgiLCAgICAgICAgICAgICAgIElEX0ZJTEVfQ09QWQogICAgICAgIE1FTlVJVEVNICImTmVnbGkgQXBwdW50aS4uLlx0RjkiLCAgICAgICAxMTgKICAgICAgICBNRU5VSVRFTSAiJkNhbmNlbGxhXHREZWwiLCAgICAgICAgICAgICAgSURfRklMRV9ERUxFVEUKICAgICAgICBNRU5VSVRFTSAiUmkmbm9taW5hLi4uIiwgICAgICAgICAgICAgICAgMTA5CiAgICAgICAgTUVOVUlURU0gIlByb3ByaSZldOAuLi5cdEFsdCtJbnZpbyIsICAgIElEX0VESVRfUFJPUEVSVElFUwogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICJDJm9tcHJpbWkuLi4iLCAgICAgICAgICAgICAgICAxMTkKICAgICAgICBNRU5VSVRFTSAiRGVjJm9tcHJpbWkuLi4iLCAgICAgICAgICAgICAgMTIwCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIiZFc2VndWkuLi4iLCAgICAgICAgICAgICAgICAgIElEX0VYRUNVVEUKICAgICAgICBNRU5VSVRFTSAiJlN0YW1wYS4uLiIsICAgICAgICAgICAgICAgICAgMTAyCiAgICAgICAgTUVOVUlURU0gIkFzc29jaWEuLi4iLCAgICAgICAgICAgICAgICAgIDEwMwogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICJDciZlYSBEaXJlY3RvcnkuLi4iLCAgICAgICAgICAxMTEKICAgICAgICBNRU5VSVRFTSAiQ2VyYyZhLi4uIiwgICAgICAgICAgICAgICAgICAgMTA0CiAgICAgICAgTUVOVUlURU0gIiZTZWxlemlvbmEgaSBmaWxlLi4uIiwgICAgICAgIDExNgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgojaWZuZGVmIF9OT19FWFRFTlNJT05TCiAgICAgICAgTUVOVUlURU0gIkUmc2NpXHRBbHQrWCIsICAgICAgICAgICAgICAgIElEX0ZJTEVfRVhJVAojZWxzZQogICAgICAgIE1FTlVJVEVNICJFJnNjaSIsICAgICAgICAgICAgICAgICAgICAgICBJRF9GSUxFX0VYSVQKI2VuZGlmCiAgICB9CgogICAgUE9QVVAgIiZEaXNjbyIgIHsKICAgICAgICBNRU5VSVRFTSAiJkNvcGlhIERpc2NvLi4uIiwgICAgICAgICAgICAgMjAxCiAgICAgICAgTUVOVUlURU0gIiZFdGljaGV0dGEgRGlzY28uLi4iLCAgICAgICAgIDIwMgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImRm9ybWF0dGEgRGlzY28uLi4iLCAgICAgICAgICBJRF9GT1JNQVRfRElTSwojaWZkZWYgX1dJTjk1CiAgICAgICAgTUVOVUlURU0gIiZDcmVhIERpc2NvIGRpIFNpc3RlbWEuLi4iLCAtMSAgICAvKlRPRE8qLwojZW5kaWYKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiQ29ubmV0dGkgJiBEcml2ZSBkaSBSZXRlIiwgICAgSURfQ09OTkVDVF9ORVRXT1JLX0RSSVZFCiAgICAgICAgTUVOVUlURU0gIiZEaXNjb25uZXR0aSBEcml2ZSBkaSBSZXRlIiwgIElEX0RJU0NPTk5FQ1RfTkVUV09SS19EUklWRQogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICJDb25kaXZpZGkgY29tZS4uLiIsICAgICAgICAgICAyNTQKICAgICAgICBNRU5VSVRFTSAiJlJpbXVvdmkgY29uZGl2aXNpb25lLi4uIiwgICAgMjU1CiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIiZTZWxlemlvbmEgRHJpdmUuLi4iLCAgICAgICAgIDI1MQogICAgfQoKICAgIFBPUFVQICImRGlyZWN0b3J5IiAgewogICAgICAgIE1FTlVJVEVNICImTGl2ZWxsbyBTdWNlc3Npdm9cdCsiLCAgICAgICAzMDEKICAgICAgICBNRU5VSVRFTSAiRXNwYW5kaSAmQWxiZXJvXHQqIiwgICAgICAgICAgMzAyCiAgICAgICAgTUVOVUlURU0gIkVzcGFuZGkgJnR1dHRvXHRTdHJnKyoiLCAgICAgIDMwMwogICAgICAgIE1FTlVJVEVNICJSaWR1Y2kgJkFsYmVyb1x0LSIsICAgICAgICAgICAzMDQKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiJlNlbGV6aW9uYSB1bml04CIsICAgICAgICAgICAgNTA1CiAgICB9CgogICAgUE9QVVAgIiZWaXN1YWxpenphIiAgewogICAgICAgIE1FTlVJVEVNICJBJmxiZXJvIGUgRGlyZWN0b3J5IiwgICAgICAgICA0MTMKICAgICAgICBNRU5VSVRFTSAiU28mbG8gQWxiZXJvIiwgICAgICAgICAgICAgICAgNDExCiAgICAgICAgTUVOVUlURU0gIiZTb2xvIERpcmVjdG9yeSIsICAgICAgICAgICAgIDQxMgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICJEaSZ2aWRpIiwgICAgICAgICAgICAgICAgICAgICBJRF9WSUVXX1NQTElUCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIiZOb21lIiwgICAgICAgICAgICAgICAgICAgICAgIElEX1ZJRVdfTkFNRQogICAgICAgIE1FTlVJVEVNICImTW9zdHJhIHR1dHRpIGkgZGV0dGFnbGkgc3VpIGZpbGUiLElEX1ZJRVdfQUxMX0FUVFJJQlVURVMsIENIRUNLRUQKICAgICAgICBNRU5VSVRFTSAiJk1vc3RyYSBkZXR0YWdsaSBwYXJ6aWFsaS4uLiIsSURfVklFV19TRUxFQ1RFRF9BVFRSSUJVVEVTCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIiZPcmRpbmEgcGVyIE5vbWUiLCAgICAgICAgICAgIElEX1ZJRVdfU09SVF9OQU1FCiAgICAgICAgTUVOVUlURU0gIiZPcmRpbmEgcGVyIFRpcG8iLCAgICAgICAgICAgIElEX1ZJRVdfU09SVF9UWVBFCiAgICAgICAgTUVOVUlURU0gIiZPcmRpbmEgcGVyIERpbWVuc2lvbmUiLCAgICAgIElEX1ZJRVdfU09SVF9TSVpFCiAgICAgICAgTUVOVUlURU0gIiZPcmRpbmEgcGVyIERhdGEiLCAgICAgICAgICAgIElEX1ZJRVdfU09SVF9EQVRFCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIk9yZGluYSBwZXIgJi4uLiIsICAgICAgICAgICAgIElEX1ZJRVdfRklMVEVSCiAgICB9CgogICAgUE9QVVAgIiZPcHppb25pIiAgewogICAgICAgIE1FTlVJVEVNICImQ29uZmVybWF6aW9uZS4uLiIsICAgICAgICAgICA1MDEKICAgICAgICBNRU5VSVRFTSAiJkZvbnQuLi4iLCAgICAgICAgICAgICAgICAgICAgSURfU0VMRUNUX0ZPTlQKICAgICAgICBNRU5VSVRFTSAiJlBlcnNvbmFsaXp6YSBiYXJyYSBkZWdsaSBzdHJ1bWVudGkuLi4iLCA1MTIKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiJkJhcnJhIGRlZ2xpIHN0cnVtZW50aSIsICAgICAgSURfVklFV19UT09MX0JBUiwgQ0hFQ0tFRAogICAgICAgIE1FTlVJVEVNICImQmFycmEgZGVpIERyaXZlIiwgICAgICAgICAgICBJRF9WSUVXX0RSSVZFX0JBUiwgQ0hFQ0tFRAogICAgICAgIE1FTlVJVEVNICImQmFycmEgZGkgc3RhdG8iLCAgICAgICAgICAgICBJRF9WSUVXX1NUQVRVU0JBUiwgQ0hFQ0tFRAojaWZuZGVmIF9OT19FWFRFTlNJT05TCiAgICAgICAgTUVOVUlURU0gIkEmIHR1dHRvIHNjaGVybW9cdEN0cmwrU2hpZnQrUyIsSURfVklFV19GVUxMU0NSRUVOCiNlbmRpZgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImRXNlZ3VpIG1pbmltaXp6YXRvIiwgICAgICAgICA1MDQKICAgICAgICBNRU5VSVRFTSAiJlNhbHZhIGltcG9zdGF6aW9uaSBhbGwndXNjaXRhIiw1MTEKICAgIH0KCgogICAgUE9QVVAgIiZTaWN1cmV6emEiICB7CiAgICAgICAgTUVOVUlURU0gIiZBY2Nlc3NpLi4uIiwgICAgICAgICAgICAgICAgIDYwNQogICAgICAgIE1FTlVJVEVNICImTG9nZ2luZy4uLiIsICAgICAgICAgICAgICAgICA2MDYKICAgICAgICBNRU5VSVRFTSAiJlByb3ByaWV0YXJpby4uLiIsICAgICAgICAgICAgNjA3CiAgICB9CgogICAgUE9QVVAgIiZGaW5lc3RyYSIgIHsKICAgICAgICBNRU5VSVRFTSAiTnVvdmEgJkZpbmVzdHJhIiwgICAgICAgICAgICAgSURfV0lORE9XX05FVwogICAgICAgIE1FTlVJVEVNICJGaW5lc3RyZSBhIGNhc2NhdGFcdEN0cmwrRjUiLCBJRF9XSU5ET1dfQ0FTQ0FERQogICAgICAgIE1FTlVJVEVNICJPcmRpbmEgJk9yaXpvbnRhbG1lbnRlIiwgICAgICBJRF9XSU5ET1dfVElMRV9IT1JaCiAgICAgICAgTUVOVUlURU0gIk9yZGluYSAmVmVydGljbG1lbnRlXHRDdHJsK0Y0IixJRF9XSU5ET1dfVElMRV9WRVJUCiNpZm5kZWYgX05PX0VYVEVOU0lPTlMKICAgICAgICBNRU5VSVRFTSAiRGlzcG9uaSBhdXRvbWF0aWNhbWVudGUiLCAgICAgSURfV0lORE9XX0FVVE9TT1JUCiNlbmRpZgogICAgICAgIE1FTlVJVEVNICJEaXNwb25pICZTaW1ib2xpIiwgICAgICAgICAgICBJRF9XSU5ET1dfQVJSQU5HRQogICAgICAgIE1FTlVJVEVNICImQWdnaW9ybmFcdEY1IiwgICAgICAgICAgICAgICBJRF9SRUZSRVNICiAgICB9CgogICAgUE9QVVAgIiZHdWlkYSIgIHsKICAgICAgICBNRU5VSVRFTSAiJlNvbW1hcmlvIGRlbGxhIEd1aWRhXHRGMSIsICAgSURfSEVMUAogICAgICAgIE1FTlVJVEVNICImQ2VyY2EgbmVsbGEgR3VpZGEuLi5cdEYxIiwgICBJRF9IRUxQCiAgICAgICAgTUVOVUlURU0gIiZVc28gZGVsbCBHdWlkYVx0RjEiLCAgICAgICAgIElEX0hFTFBfVVNJTkcKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiJkluZm9ybWF6aW9uaSBzdSBXaW5lZmlsZS4uLiIsSURfQUJPVVQKICAgIH0KfQoKCklERF9FWEVDVVRFIERJQUxPRyBGSVhFRCBJTVBVUkUgMTUsIDEzLCAyMTAsIDYzClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkVzZWd1aSIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiAgICBDT05UUk9MICAgICAgICAgIiIsIDEwMSwgIlN0YXRpYyIsIFNTX1NJTVBMRXxTU19OT1BSRUZJWCwgMywgNiwgMTYyLCAxMAogICAgQ09OVFJPTCAgICAgICAgICImQ29tYW5kbzoiLCAtMSwgIlN0YXRpYyIsIFNTX0xFRlROT1dPUkRXUkFQfFdTX0dST1VQLCAzLCAxOCwgNjAsIDEwCiAgICBFRElUVEVYVCAgICAgICAgMjAxLCAzLCAyOSwgMTM0LCAxMiwgRVNfQVVUT0hTQ1JPTEwKICAgIENPTlRST0wgICAgICAgICAiQ29tZSAmU2ltYm9sbyIsIDIxNCwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWHxXU19UQUJTVE9QLDMsIDQ1LCA3MSwgMTIKICAgIERFRlBVU0hCVVRUT04gICAiT0siLCAxLCAxNTgsIDYsIDQ3LCAxNAogICAgUFVTSEJVVFRPTiAgICAgICJBbm51bGxhIiwgMiwgMTU4LCAyMywgNDcsIDE0CiAgICBQVVNIQlVUVE9OICAgICAgIiZBaXV0byIsIDI1NCwgMTU4LCA0MywgNDcsIDE0Cn0KCklERF9TRUxFQ1RfREVTVElOQVRJT04gRElBTE9HIEZJWEVEIElNUFVSRSAxNSwgMTMsIDIxMCwgNjMKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiU2VsZWN0IGRlc3RpbmF0aW9uIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKICAgIENPTlRST0wgICAgICAgICAiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCiAgICBDT05UUk9MICAgICAgICAgIiZQZXJjb3JzbzoiLCAtMSwgIlN0YXRpYyIsIFNTX0xFRlROT1dPUkRXUkFQfFdTX0dST1VQLCAzLCAxOCwgNjAsIDEwCiAgICBFRElUVEVYVCAgICAgICAgMjAxLCAzLCAyOSwgMTM0LCAxMiwgRVNfQVVUT0hTQ1JPTEwKICAgIERFRlBVU0hCVVRUT04gICAiT0siLCAxLCAxNTgsIDYsIDQ3LCAxNAogICAgUFVTSEJVVFRPTiAgICAgICJBbm51bGxhIiwgMiwgMTU4LCAyMywgNDcsIDE0CiAgICBQVVNIQlVUVE9OICAgICAgIiZOYXZpZ2EiLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9CgpTVFJJTkdUQUJMRQp7CiAgICBJRFNfRk9OVF9TRUxfRExHX05BTUUgICAiQXBwbGljYSBsZSBpbXBvc3RhemlvbmkgZGVpIGZvbnQiCiAgICBJRFNfRk9OVF9TRUxfRVJST1IgICAgICAiU2kg6CB2ZXJpZmljYXRvIHVuIGVycm9yZSBkdXJhbnRlIGxhIHNlbGV6aW9uZSBkZWwgbnVvdm8gZm9udC4iCn0K