LyoKICogV2luZUZpbGUKICogSHVuZ2FyaWFuIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDAgTWFydGluIEZ1Y2hzCiAqIENvcHlyaWdodCAyMDAyIFN0ZXZlbiBFZHdhcmRzCiAqIENvcHlyaWdodCAyMDAyIEFsZXhhbmRyZSBKdWxsaWFyZAogKiBDb3B5cmlnaHQgMjAwMiBab2x5IE5hZ3kKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19IVU5HQVJJQU4sIFNVQkxBTkdfREVGQVVMVAoKLyogTWVudSAqLwoKSURNX1dJTkVGSUxFIE1FTlUgRklYRUQgSU1QVVJFCnsKCVBPUFVQICImRuFqbCIgIHsKCQlNRU5VSVRFTSAiJk1lZ3luaXThc1x0RW50ZXIiICwJCQlJRF9BQ1RJVkFURQoJCU1FTlVJVEVNICLBdCZoZWx5ZXrpcy4uLlx0RjciICwgCQkJSURfRklMRV9NT1ZFCgkJTUVOVUlURU0gIiZN4XNvbOFzLi4uXHRGOCIgLAkJCTEwNwoJCU1FTlVJVEVNICImVuFn82xhcG9uLi4uXHRGOSIgLAkJMTE4CgkJTUVOVUlURU0gIiZU9nJs6XNcdERlbCIgLAkJCTEwOAoJCU1FTlVJVEVNICLBdCZuZXZleulzLi4uIiAsCQkJMTA5CgkJTUVOVUlURU0gIlQmdWxhamRvbnPhZ29rLi4uXHRBbHQrRW50ZXIiICwgSURfRURJVF9QUk9QRVJUSUVTCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZCZWNzb21hZ29s4XMuLi4iICwJCTExOQoJCU1FTlVJVEVNICJLJmljc29tYWdvbOFzLi4uIiAsCQkxMjAKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkZ1dHRhdOFzLi4uIiAsCQkJSURfRVhFQ1VURQoJCU1FTlVJVEVNICImTnlvbXRhdOFzLi4uIiAsIAkJCTEwMgoJCU1FTlVJVEVNICJU4XJz7XThcy4uLiIgLAkJMTAzCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gItpqICZtYXBwYS4uLiIgLAkJCTExMQoJCU1FTlVJVEVNICJLZXJlJnPpcy4uLiIgLAkJCTEwNAoJCU1FTlVJVEVNICJG4Wpsb2sga2kmduFsYXN6dOFzYS4uLiIgLAkJCTExNgoJCU1FTlVJVEVNIFNFUEFSQVRPUgojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIiZLaWzpcOlzXHRBbHQrWCIgLCAJCQlJRF9GSUxFX0VYSVQKI2Vsc2UKCQlNRU5VSVRFTSAiJktpbOlw6XMiLCAJCQkJSURfRklMRV9FWElUCiNlbmRpZgoJfQoKCVBPUFVQICImTGVtZXoiICB7CgkJTUVOVUlURU0gIkxlbWV6ICZt4XNvbOFzYS4uLiIgLAkJCTIwMQoJCU1FTlVJVEVNICImTGVtZXpjaW1rZS4uLiIgLAkJCTIwMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImRm9ybWF04Wzhcy4uLiIgLAkJCUlEX0ZPUk1BVF9ESVNLCiNpZmRlZiBfV0lOOTUKCQlNRU5VSVRFTSAiJlJlbmRzemVybGVtZXoga+lzeu106XNlLi4uIiwgLTEJLypAQCAqLwojZW5kaWYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkjhbPN6YXRpIG1lZ2hhanTzIGNzYXRsYWtvenRhdOFzYSIgLAkJCUlEX0NPTk5FQ1RfTkVUV09SS19EUklWRQoJCU1FTlVJVEVNICJI4WzzemF0aSBtZWdoYWp08yBsZXbhbGFzenThc2EiICwJCUlEX0RJU0NPTk5FQ1RfTkVUV09SS19EUklWRQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJNZWdvc3p04XMuLi4iICwJCQkyNTQKCQlNRU5VSVRFTSAiTWVnb3N6dOFzICZtZWdzevxudGV06XNlLi4uIiAsCQkJMjU1CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIk1lZ2hhanTzIGtpJnbhbGFzenThc2EuLi4iICwJCQkyNTEKCX0KCglQT1BVUCAiJk1hcHDhayIgIHsKCQlNRU5VSVRFTSAiJkv2dmV0a2V69SBzemludFx0KyIgLAkJCTMwMQoJCU1FTlVJVEVNICImRmEga2lueWl04XNhXHQqIiAsCQkzMDIKCQlNRU5VSVRFTSAiJk1pbmRlbiBraW55aXThc2FcdFN0cmcrKiIgLAkJMzAzCgkJTUVOVUlURU0gIkZhICZiZWNzdWvhc2FcdC0iICwJCQkzMDQKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkd5ZXJtZWtlayBraWplbPZs6XNlIiAsCQkJCTUwNQoJfQoKCVBPUFVQICImTul6ZXQiICB7CgkJTUVOVUlURU0gIiZUZWxqZXMiICwJCQk0MTMKCQlNRU5VSVRFTSAiJkv2bnl2dOFyZmEiICwJCQk0MTEKCQlNRU5VSVRFTSAiJkNzYWsgbWFwcOFrIiAsCQkJNDEyCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZGZWxvc3p04XMiICwJCQlJRF9WSUVXX1NQTElUCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZO6XYiICwJCQlJRF9WSUVXX05BTUUKCQlNRU5VSVRFTSAiJk1pbmRlbiBy6XN6bGV0IiAsCQkJCUlEX1ZJRVdfQUxMX0FUVFJJQlVURVMsIENIRUNLRUQKCQlNRU5VSVRFTSAiJkVneWVkaS4uLiIgLAkJCUlEX1ZJRVdfU0VMRUNURURfQVRUUklCVVRFUwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImUmVuZGV66XMgbul2IHN6ZXJpbnQiICwJCUlEX1ZJRVdfU09SVF9OQU1FCgkJTUVOVUlURU0gIlJlbmRleulzIGsmaXRlcmplc3p06XMgc3plcmludCIgLAlJRF9WSUVXX1NPUlRfVFlQRQoJCU1FTlVJVEVNICJSZW5kZXrpcyAmbelyZXQgc3plcmludCIgLCAJCUlEX1ZJRVdfU09SVF9TSVpFCgkJTUVOVUlURU0gIlJlbmRleulzICZk4XR1bSBzemVyaW50IiAsIAkJSURfVklFV19TT1JUX0RBVEUKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiRWd5ZWRpIHJlbmRleulzICYuLi4iICwJCQk0MDkKCX0KCglQT1BVUCAiJkJl4Wxs7XThc29rIiAgewoJCU1FTlVJVEVNICImTWVnZXL1c+106XMuLi4iICwJCS0xCgkJTUVOVUlURU0gIiZCZXT7a+lzemxldC4uLiIgLAkJCS0xCgkJTUVOVUlURU0gIkUmZ3llZGkgZXN6a/Z6dOFyLi4uIiAsIC0xCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZFc3pr9np04XIiICwJCUlEX1ZJRVdfVE9PTF9CQVIsIENIRUNLRUQKCQlNRU5VSVRFTSAiJkxlbWV6dOFyIiAsCQlJRF9WSUVXX0RSSVZFX0JBUiwgQ0hFQ0tFRAoJCU1FTlVJVEVNICImwWxsYXBvdHNvciIgLAlJRF9WSUVXX1NUQVRVU0JBUiwgQ0hFQ0tFRAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIiZUZWxqZXMga+lwZXJuefVzXHRDdHJsK1NoaWZ0K1MiICwgCUlEX1ZJRVdfRlVMTFNDUkVFTgojZW5kaWYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiUHJvZ3JhbWZ1dHRhdOFzIHV04W5pICZzemltYvNsdW0iICwJCS0xCgkJTUVOVUlURU0gIk1lZ3N6/G50ZXTpcyBhIHThcm9s4XMgduln6W4iICwJCQk1MTEKCX0KCgoJUE9QVVAgIiZCaXp0b25z4WciICB7CgkJTUVOVUlURU0gIiZIb3p64WbpculzLi4uIiAsCQk2MDUKCQlNRU5VSVRFTSAiJk5hcGzzeuFzLi4uIiAsCQkJNjA2CgkJTUVOVUlURU0gIiZUdWxhamRvbm9zLi4uIiAsCQk2MDcKCX0KCglQT1BVUCAiJkFibGFrb2siICB7CgkJTUVOVUlURU0gItpqIGEmYmxhayIgLAkJCUlEX1dJTkRPV19ORVcKCQlNRU5VSVRFTSAiTOlwY3P1emV0ZXMgZWxyZW5kZXrpc1x0Q3RybCtGNSIgLAkJSURfV0lORE9XX0NBU0NBREUKCQlNRU5VSVRFTSAiTW96YWlrc3plcvsgZWxyZW5kZXrpcyAmdu16c3ppbnRlc2VuIiAsCQlJRF9XSU5ET1dfVElMRV9IT1JaCgkJTUVOVUlURU0gIk1vemFpa3N6ZXL7IGVscmVuZGV66XMgZvwmZ2f1bGVnZXNlblx0Q3RybCtGNCIgLAkJSURfV0lORE9XX1RJTEVfVkVSVAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIkF1dG9tYXRpa3VzIGVscmVuZGV66XMiICwJCUlEX1dJTkRPV19BVVRPU09SVAojZW5kaWYKCQlNRU5VSVRFTSAiJlN6aW1i82x1bSBlbHJlbmRleulzIiAsCQlJRF9XSU5ET1dfQVJSQU5HRQoJCU1FTlVJVEVNICImRnJpc3PtdOlzXHRGNSIgLAkJSURfUkVGUkVTSAoJfQoKCVBPUFVQICImPyIgIHsKCQlNRU5VSVRFTSAiJlP6Z/MgdOltYWv2cvZrXHRGMSIgLAkJCUlEX0hFTFAKCQlNRU5VSVRFTSAiU/pn8yAma2VyZXPpcy4uLlx0RjEiICwJCQlJRF9IRUxQCgkJTUVOVUlURU0gIiZIYXN6buFsYXRcdEYxIiAsCQkJSURfSEVMUF9VU0lORwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCVBPUFVQICJJbmZvcm3hY2nzLi4uIiAgewoJCSAgTUVOVUlURU0gIiZXaW5lLXLzbC4uLiIgLAkJCUlEX0FCT1VUX1dJTkUKLyoKICoJCSAgTUVOVUlURU0gIiZMaWNlbnNlLi4uIgkJSURfTElDRU5TRQogKgkJICBNRU5VSVRFTSAiJk5PIFdBUlJBTlRZIgkJSURfTk9fV0FSUkFOVFkKICovCgkJfQoJfQp9CgoKSUREX0VYRUNVVEUgRElBTE9HIEZJWEVEIElNUFVSRSAxNSwgMTMsIDIxMCwgNjMKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiRnV0dGF04XMiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJQ09OVFJPTCAJCSIiLCAxMDEsICJTdGF0aWMiLCBTU19TSU1QTEV8U1NfTk9QUkVGSVgsIDMsIDYsIDE2MiwgMTAKCUNPTlRST0wgCQkiJlBhcmFuY3M6IiAsIC0xLCAiU3RhdGljIiwgU1NfTEVGVE5PV09SRFdSQVB8V1NfR1JPVVAsIDMsIDE4LCA2MCwgMTAKCUVESVRURVhUCQkyMDEsIDMsIDI5LCAxMzQsIDEyLCBFU19BVVRPSFNDUk9MTAoJQ09OVFJPTCAJCSImU3ppbWLzbHVta+ludCIgLCAyMTQsICJCdXR0b24iLCBCU19BVVRPQ0hFQ0tCT1h8V1NfVEFCU1RPUCwzLCA0NSwgNzEsIDEyCglERUZQVVNIQlVUVE9OCSJPSyIgLCAxLCAxNTgsIDYsIDQ3LCAxNAoJUFVTSEJVVFRPTgkJIk3pZ3NlIiAsIDIsIDE1OCwgMjMsIDQ3LCAxNAoJUFVTSEJVVFRPTgkJIiZT+mfzIiAsIDI1NCwgMTU4LCA0MywgNDcsIDE0Cn0K