LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIndpbmhlbHBfcmVzLmgiCgpMQU5HVUFHRSBMQU5HX0tPUkVBTiwgU1VCTEFOR19ERUZBVUxUCgovKiBNZW51ICovCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAixsTAzygmRikiIHsKICBNRU5VSVRFTSAiv62x4igmTykuLi4iLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLAzrziKCZQKSIsIE1OSURfRklMRV9QUklOVAogIE1FTlVJVEVNICLHwbiwxc0gvLPBpCgmUykuLi4iLCBNTklEX0ZJTEVfU0VUVVAKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIsG+t+EoJkUpIiwgTU5JRF9GSUxFX0VYSVQKIH0KIFBPUFVQICLG7cH9KCZFKSIgewogICBNRU5VSVRFTSAiurm75ygmQykuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIsHWvK4oJkEpLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiw6WwpcfHKCZCKSIgewogICBNRU5VSVRFTSAiwaTAxygmRCkuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiv8m8xygmTykiIHsKICAgUE9QVVAJIrChtMnH0SC1tb/yuLsgurjAzLHiIgogICBCRUdJTgogICAgIE1FTlVJVEVNICKx4rq7IiwJTU5JRF9PUFRTX0hFTFBfREVGQVVMVAogICAgIE1FTlVJVEVNICK6uMDMseIiLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIrq4v6nB1sH2IL7KseIiLAlNTklEX09QVFNfSEVMUF9OT05WSVNJQkxFCiAgRU5ECiAgTUVOVUlURU0gIrHit88iLAkJTU5JRF9PUFRTX0hJU1RPUlkKICBQT1BVUCAgICAisduywyIKICBCRUdJTgogICAgTUVOVUlURU0gIsDbsNQiLAkJTU5JRF9PUFRTX0ZPTlRTX1NNQUxMCiAgICBNRU5VSVRFTSAiurjF6yIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAixamw1CIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIr3DvbrF2yC79rvzILvnv+siLAlNTklEX09QVFNfU1lTVEVNX0NPTE9SUwogfQogUE9QVVAgIrW1v/K4uygmSCkiIHsKICAgTUVOVUlURU0gIrW1v/K4uyC757/ruf0oJk8pIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAix9e78yDApygmVCkiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIsGkurgoJkkpLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICJXaW5lv6EgsPzHz7+pKCZBKSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgoKSUREX0lOREVYIERJQUxPRyAwLCAwLCAyMDAsIDE5MApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA5LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICLAzrWmvboiCnsKICAgIExJU1RCT1ggSURDX0lOREVYTElTVCwgMTAsIDEwLCAxODAsIDE1MCwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCn0KCklERF9TRUFSQ0ggRElBTE9HIDAsIDAsIDIwMCwgMTkwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDksICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIsOjseIiCnsKICAgIExURVhUICAivsbB9yCxuMf2tcfB9iC+ysC9IiwgLTEsIDEwLCAxMCwgMTgwLCAxNTAKfQoKLyogU3RyaW5ncyAqLwoKU1RSSU5HVEFCTEUKewpTVElEX1dJTkVfSEVMUCwgCSJXaW5lILW1v/K4uyIKU1RJRF9XSEVSUk9SLCAJCSK/obevIgpTVElEX1dBUk5JTkcsICAJCSKw5rDtIgpTVElEX0lORk8sICAJCSLBpLq4IgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSKxuMf2tcfB9iC+yr7SwL0iClNUSURfSExQRklMRV9FUlJPUl9zLCAJIrW1v/K4uyDGxMDPIGAlcye4piDA0LTCILW1wd8gv8C3+SC537v9IgpTVElEX0lOREVYLCAJCSK48cL3KCZDKSIKU1RJRF9DT05URU5UUywJCSK/5L7gIgpTVElEX0JBQ0ssIAkJIrXat84oJkIpIgpTVElEX0FMTF9GSUxFUywgCSK48LXnIMbEwM8gKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkitbW/8ri7IMbEwM8gKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSIlc8C7IMOjwLsgvPYgvvi9wLTPtNknLiDAzCDGxMDPwLsgwffBoiDDo7DavcC0z7HuPyIKU1RJRF9OT19SSUNIRURJVAkicmljaGVkaXQgILG4x/bAuyDDo8C7vPYgvve9wLTPtNkuLiDD67zSwd8iClNUSURfUFNIX0lOREVYLAkJIrW1v/K4uyC48cL3OiAiCn0KCkNPTlRFWFRfTUVOVSBNRU5VCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCQlNRU5VSVRFTSAiwda8ri4uLiIsICAgICAgIE1OSURfQ1RYVF9BTk5PVEFURQoJCU1FTlVJVEVNICK6ubvnIiwgICAgICAgICAgICAgICAgTU5JRF9DVFhUX0NPUFkKCQlNRU5VSVRFTSAiwM684i4uLiIsICAgICAgICAgICAgTU5JRF9DVFhUX1BSSU5UCgkJUE9QVVAgICAgIrHbssMiCgkJQkVHSU4KCQkJTUVOVUlURU0gIsG8sNQiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfU01BTEwKCQkJTUVOVUlURU0gIrq4xesiLCAgICAgIE1OSURfQ1RYVF9GT05UU19OT1JNQUwKCQkJTUVOVUlURU0gIrPQsNQiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfTEFSR0UKCQlFTkQKCQlQT1BVUCAgICK1tb/yuLsgIMfXu/MgurjAzLHiIgoJCUJFR0lOCgkJCU1FTlVJVEVNICKx4rq7IiwgICAgIE1OSURfQ1RYVF9IRUxQX0RFRkFVTFQKCQkJTUVOVUlURU0gIrq4wMyx4iIsICAgICBNTklEX0NUWFRfSEVMUF9WSVNJQkxFCgkJCU1FTlVJVEVNICK+yCC6uMDMseIiLCBNTklEX0NUWFRfSEVMUF9OT05WSVNJQkxFCgkJRU5ECgkJTUVOVUlURU0gIr3DvbrF2yC79rvzILvnv+siLCAgIE1OSURfQ1RYVF9TWVNURU1fQ09MT1JTCglFTkQKRU5ECg==