LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDQgUGlvdHIgQ2FiYW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIndpbmhlbHBfcmVzLmgiCgovKiBNZW51ICovCgpNQUlOX01FTlUgTUVOVSBMQU5HVUFHRSBMQU5HX1BPTElTSCwgU1VCTEFOR19ERUZBVUxUCnsKIFBPUFVQICImUGxpayIgewogIE1FTlVJVEVNICImT3R383J6IiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkRydWt1aiIsIE1OSURfRklMRV9QUklOVAogIE1FTlVJVEVNICImVXN0YXdpZW5pYSBkcnVrYXJraS4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJld5apxjaWUiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIiZFZHljamEiIHsKICAgTUVOVUlURU0gIiZLb3BpdWouLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZTa29tZW50dWouLi4iLCBNTklEX0VESVRfQU5OT1RBVEUKIH0KIFBPUFVQICImWmFrs2Fka2EiIHsKICAgTUVOVUlURU0gIiZaZGVmaW5pdWouLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiJk9wdGlvbnMiIHsKICAgUE9QVVAJIkhlbHAgYWx3YXlzIHZpc2libGUiCiAgIEJFR0lOCiAgICAgTUVOVUlURU0gIkRlZmF1bHQiLAlNTklEX09QVFNfSEVMUF9ERUZBVUxUCiAgICAgTUVOVUlURU0gIlZpc2libGUiLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIk5vbiB2aXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfTk9OVklTSUJMRQogIEVORAogIE1FTlVJVEVNICJIaXN0b3J5IiwJCU1OSURfT1BUU19ISVNUT1JZCiAgUE9QVVAgICAgIkZvbnRzIgogIEJFR0lOCiAgICBNRU5VSVRFTSAiU21hbGwiLAkJTU5JRF9PUFRTX0ZPTlRTX1NNQUxMCiAgICBNRU5VSVRFTSAiTm9ybWFsIiwgICAgCU1OSURfT1BUU19GT05UU19OT1JNQUwKICAgIE1FTlVJVEVNICJMYXJnZSIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIlVzZSBzeXN0ZW0gY29sb3JzIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICJQb21vJmMiIHsKICAgTUVOVUlURU0gIiZQb21vYyIsIE1OSURfSEVMUF9IRUxQT04KICAgTUVOVUlURU0gIiZaYXdzemUgbmEgd2llcnpjaHUiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZPIHByb2dyYW1pZS4uLiIsIE1OSURfSEVMUF9BQk9VVAojaWZkZWYgV0lORUxJQgogICBNRU5VSVRFTSAiJk8gcHJvZ3JhbWllIFdJTkUiLCBNTklEX0hFTFBfV0lORQojZW5kaWYKIH0KfQoKSUREX0lOREVYIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyMDAsIDE5MCBMQU5HVUFHRSBMQU5HX1BPTElTSCwgU1VCTEFOR19ERUZBVUxUClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIkluZGVrcyIKewogICAgTElTVEJPWCBJRENfSU5ERVhMSVNULCAxMCwgMTAsIDE4MCwgMTUwLCBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKfQoKLyogU3RyaW5ncyAqLwpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX1BPTElTSCwgU1VCTEFOR19ERUZBVUxUCnsKU1RJRF9XSU5FX0hFTFAsIAkiV0lORSAtIFBvbW9jIgpTVElEX1dIRVJST1IsIAkJIkKjpUQiClNUSURfV0FSTklORywgIAkJIk9TVFJaRa9FTklFIgpTVElEX0lORk8sICAJCSJJbmZvcm1hY2phIgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSJOaWUgemFpbXBsZW1lbnRvd2FuZSIKU1RJRF9ITFBGSUxFX0VSUk9SX3MsIAkiQrO5ZCB3IHRyYWtjaWUgb2Rjenl0dSBwbGlrdSBwb21vY3kgYCVzJyIKU1RJRF9JTkRFWCwgCQkiJlphd2FydG+c5iIKU1RJRF9DT05URU5UUywgCQkiJlN6dWthaiIKU1RJRF9CQUNLLCAJCSImV3N0ZWN6IgpTVElEX0FMTF9GSUxFUywgCSJXc3p5c3RraWUgcGxpa2kgKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkiUGxpa2kgcG9tb2N5ICgqLmhscCkiClNUSURfRklMRV9OT1RfRk9VTkRfcwkiTmllIHpuYWxlemlvbm8gcGxpa3UgJyVzJy4gQ3p5IGNoY2VzeiBwb3N6dWth5iB0ZWdvIHBsaWt1IHNhbW9kemllbG5pZT8iClNUSURfTk9fUklDSEVESVQJIk5pZSB1ZGGzbyBzaeogem5hbGWf5iBtb2R1s3UgcmljaGVkaXQuLi4gV3mcd2lldGxlbmllIHBvbW9jeSBuaWUgamVzdCBtb79saXdlIgpTVElEX1BTSF9JTkRFWCwJCSJIZWxwIHRvcGljczogIgp9CgoKQ09OVEVYVF9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVApCRUdJTgoJUE9QVVAgIiIKCUJFR0lOCgkJTUVOVUlURU0gIkFkbm90YWNqYS4uLiIsICAgICAgIE1OSURfQ1RYVF9BTk5PVEFURQoJCU1FTlVJVEVNICJLb3BpdWoiLCAgICAgICAgICAgICAgICBNTklEX0NUWFRfQ09QWQoJCU1FTlVJVEVNICJEcnVrdWouLi4iLCAgICAgICAgICAgIE1OSURfQ1RYVF9QUklOVAoJCVBPUFVQICAgICJDemNpb25rYSIKCQlCRUdJTgoJCQlNRU5VSVRFTSAiTWGzYSIsICAgICAgIE1OSURfQ1RYVF9GT05UU19TTUFMTAoJCQlNRU5VSVRFTSAiTm9ybWFsbmEiLCAgICAgIE1OSURfQ1RYVF9GT05UU19OT1JNQUwKCQkJTUVOVUlURU0gIkR1v2EiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfTEFSR0UKCQlFTkQKCQlQT1BVUCAgICJQb21vYyB6YXdzemUgd2lkb2N6bmEiCgkJQkVHSU4KCQkJTUVOVUlURU0gIkRvbXmcbG5pZSIsICAgICBNTklEX0NUWFRfSEVMUF9ERUZBVUxUCgkJCU1FTlVJVEVNICJXaWRvY3puYSIsICAgICBNTklEX0NUWFRfSEVMUF9WSVNJQkxFCgkJCU1FTlVJVEVNICJOaWV3aWRvY3puYSIsIE1OSURfQ1RYVF9IRUxQX05PTlZJU0lCTEUKCQlFTkQKCQlNRU5VSVRFTSAiVb95aiBrb2xvcvN3IHN5c3RlbW93eWNoIiwgICBNTklEX0NUWFRfU1lTVEVNX0NPTE9SUwoJRU5ECkVORAo=