LyoKICogQ29weXJpZ2h0IDIwMDMgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogc2VlIHRoZSBvZmZpY2lhbCBEQ09NIHNwZWNpZmljYXRpb24KICogKHRoZXJlJ3MgYSBjb3B5IGF0IGh0dHA6Ly93d3cuZ3JpbWVzLmRlbW9uLmNvLnVrL0RDT00vRENPTVNwZWMuaHRtKSAqLwoKaW1wb3J0ICJ1bmtud24uaWRsIjsKClsKICB1dWlkKDk5ZmNmZTYwLTUyNjAtMTAxYi1iYmNiLTAwYWEwMDIxMzQ3YSksCiAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKXQppbnRlcmZhY2UgT2JqZWN0UnBjQmFzZVR5cGVzCnsKICB0eXBlZGVmIHVuc2lnbmVkIGh5cGVyIElEOwogIHR5cGVkZWYgSUQgTUlEOwogIHR5cGVkZWYgSUQgT1hJRDsKICB0eXBlZGVmIElEIE9JRDsKICB0eXBlZGVmIElEIFNFVElEOwogIHR5cGVkZWYgR1VJRCBJUElEOwogIHR5cGVkZWYgR1VJRCBDSUQ7CiAgdHlwZWRlZiBSRUZHVUlEIFJFRklQSUQ7CgogIGNvbnN0IHVuc2lnbmVkIHNob3J0IENPTV9NSU5PUl9WRVJTSU9OXzEgPSAxOwogIGNvbnN0IHVuc2lnbmVkIHNob3J0IENPTV9NSU5PUl9WRVJTSU9OXzIgPSAyOwoKICBjb25zdCB1bnNpZ25lZCBzaG9ydCBDT01fTUFKT1JfVkVSU0lPTiA9IDU7CiAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ09NX01JTk9SX1ZFUlNJT04gPSAzOwoKICB0eXBlZGVmIHN0cnVjdCB0YWdDT01WRVJTSU9OIHsKICAgIHVuc2lnbmVkIHNob3J0IE1ham9yVmVyc2lvbjsKICAgIHVuc2lnbmVkIHNob3J0IE1pbm9yVmVyc2lvbjsKICB9IENPTVZFUlNJT047CgogIGNvbnN0IHVuc2lnbmVkIGxvbmcgT1JQQ0ZfTlVMTCA9IDA7CiAgY29uc3QgdW5zaWduZWQgbG9uZyBPUlBDRl9MT0NBTCA9IDE7CiAgY29uc3QgdW5zaWduZWQgbG9uZyBPUlBDRl9SRVNFUlZFRDEgPSAyOwogIGNvbnN0IHVuc2lnbmVkIGxvbmcgT1JQQ0ZfUkVTRVJWRUQyID0gNDsKICBjb25zdCB1bnNpZ25lZCBsb25nIE9SUENGX1JFU0VSVkVEMyA9IDg7CiAgY29uc3QgdW5zaWduZWQgbG9uZyBPUlBDRl9SRVNFUlZFRDQgPSAxNjsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnT1JQQ19FWFRFTlQgewogICAgR1VJRCBpZDsKICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICAgIFtzaXplX2lzKChzaXplKzcpJn43KV0gYnl0ZSBkYXRhW107CiAgfSBPUlBDX0VYVEVOVDsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnT1JQQ19FWFRFTlRfQVJSQVkgewogICAgdW5zaWduZWQgbG9uZyBzaXplOwogICAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDsKICAgIFtzaXplX2lzKChzaXplKzEpJn4xLCksIHVuaXF1ZV0gT1JQQ19FWFRFTlQgKipleHRlbnQ7CiAgfSBPUlBDX0VYVEVOVF9BUlJBWTsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnT1JQQ1RISVMgewogICAgQ09NVkVSU0lPTiB2ZXJzaW9uOwogICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQxOwogICAgQ0lEIGNpZDsKICAgIFt1bmlxdWVdIE9SUENfRVhURU5UX0FSUkFZICpleHRlbnNpb25zOwogIH0gT1JQQ1RISVM7CgogIHR5cGVkZWYgc3RydWN0IHRhZ09SUENUSEFUIHsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICBbdW5pcXVlXSBPUlBDX0VYVEVOVF9BUlJBWSAqZXh0ZW5zaW9uczsKICB9IE9SUENUSEFUOwoKICBjb25zdCB1bnNpZ25lZCBzaG9ydCBOQ0FER19JUF9VRFAgPSAweDA4OwogIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5DQUNOX0lQX1RDUCA9IDB4MDc7CiAgY29uc3QgdW5zaWduZWQgc2hvcnQgTkNBREdfSVBYID0gMHgwRTsKICBjb25zdCB1bnNpZ25lZCBzaG9ydCBOQ0FDTl9TUFggPSAweDBDOwogIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5DQUNOX05CX05CID0gMHgxMjsKICBjb25zdCB1bnNpZ25lZCBzaG9ydCBOQ0FDTl9OQl9JUFggPSAweDBEOwogIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5DQUNOX0RORVRfTlNQID0gMHgwNDsKICBjb25zdCB1bnNpZ25lZCBzaG9ydCBOQ0FDTl9IVFRQID0gMHgxRjsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnU1RSSU5HQklORElORyB7CiAgICB1bnNpZ25lZCBzaG9ydCB3VG93ZXJJZDsKICAgIFtzdHJpbmddIFdDSEFSIGFOZXR3b3JrQWRkcltdOwogIH0gU1RSSU5HQklORElORzsKCiAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ09NX0NfQVVUSFpfTk9ORSA9IDB4ZmZmZjsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnU0VDVVJJVFlCSU5ESU5HIHsKICAgIHVuc2lnbmVkIHNob3J0IHdBdXRoblN2YzsKICAgIHVuc2lnbmVkIHNob3J0IHdBdXRoelN2YzsKICAgIFtzdHJpbmddIFdDSEFSIGFQcmluY05hbWVbXTsKICB9IFNFQ1VSSVRZQklORElORzsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnRFVBTFNUUklOR0FSUkFZIHsKICAgIHVuc2lnbmVkIHNob3J0IHdOdW1FbnRyaWVzOwogICAgdW5zaWduZWQgc2hvcnQgd1NlY3VyaXR5T2Zmc2V0OwogICAgW3NpemVfaXMod051bUVudHJpZXMpXSB1bnNpZ25lZCBzaG9ydCBhU3RyaW5nQXJyYXlbXTsKICB9IERVQUxTVFJJTkdBUlJBWTsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnT1hJRF9JTkZPIHsKICAgIERXT1JEIGR3VGlkOwogICAgRFdPUkQgZHdQaWQ7CiAgICBJUElEIGlwaWRSZW1Vbmtub3duOwogICAgRFdPUkQgZHdBdXRobkhpbnQ7CiAgICBEVUFMU1RSSU5HQVJSQVkgKnBzYTsKICB9IE9YSURfSU5GTzsKCiAgY29uc3QgdW5zaWduZWQgbG9uZyBPQkpSRUZfU0lHTkFUVVJFID0gMHg1NzRmNDU0ZDsgLyogIk1FT1ciICovCiAgY29uc3QgdW5zaWduZWQgbG9uZyBPQkpSRUZfU1RBTkRBUkQgPSAweDE7CiAgY29uc3QgdW5zaWduZWQgbG9uZyBPQkpSRUZfSEFORExFUiA9IDB4MjsKICBjb25zdCB1bnNpZ25lZCBsb25nIE9CSlJFRl9DVVNUT00gPSAweDQ7CiAgY29uc3QgdW5zaWduZWQgbG9uZyBTT1JGX09YUkVTMSA9IDB4MTsKICBjb25zdCB1bnNpZ25lZCBsb25nIFNPUkZfT1hSRVMyID0gMHgyMDsKICBjb25zdCB1bnNpZ25lZCBsb25nIFNPUkZfT1hSRVMzID0gMHg0MDsKICBjb25zdCB1bnNpZ25lZCBsb25nIFNPUkZfT1hSRVM0ID0gMHg4MDsKICBjb25zdCB1bnNpZ25lZCBsb25nIFNPUkZfT1hSRVM1ID0gMHgxMDA7CiAgY29uc3QgdW5zaWduZWQgbG9uZyBTT1JGX09YUkVTNiA9IDB4MjAwOwogIGNvbnN0IHVuc2lnbmVkIGxvbmcgU09SRl9PWFJFUzcgPSAweDQwMDsKICBjb25zdCB1bnNpZ25lZCBsb25nIFNPUkZfT1hSRVM4ID0gMHg4MDA7CiAgY29uc3QgdW5zaWduZWQgbG9uZyBTT1JGX05VTEwgPSAweDA7CiAgY29uc3QgdW5zaWduZWQgbG9uZyBTT1JGX05PUElORyA9IDB4MTAwMDsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnU1RET0JKUkVGIHsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICB1bnNpZ25lZCBsb25nIGNQdWJsaWNSZWZzOwogICAgT1hJRCBveGlkOwogICAgT0lEIG9pZDsKICAgIElQSUQgaXBpZDsKICB9IFNURE9CSlJFRjsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnT0JKUkVGIHsKICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlOwogICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgIEdVSUQgaWlkOwogICAgW3N3aXRjaF9pcyhmbGFncyldIHVuaW9uIHsKICAgIFtjYXNlKE9CSlJFRl9TVEFOREFSRCldIHN0cnVjdCBPUl9TVEFOREFSRCB7CiAgICAgICAgU1RET0JKUkVGIHN0ZDsKICAgICAgICBEVUFMU1RSSU5HQVJSQVkgc2FSZXNBZGRyOwogICAgICB9IHVfc3RhbmRhcmQ7CiAgICBbY2FzZShPQkpSRUZfSEFORExFUildIHN0cnVjdCBPUl9IQU5ETEVSIHsKICAgICAgICBTVERPQkpSRUYgc3RkOwogICAgICAgIENMU0lEIGNsc2lkOwogICAgICAgIERVQUxTVFJJTkdBUlJBWSBzYVJlc0FkZHI7CiAgICAgIH0gdV9oYW5kbGVyOwogICAgW2Nhc2UoT0JKUkVGX0NVU1RPTSldIHN0cnVjdCBPUl9DVVNUT00gewogICAgICAgIENMU0lEIGNsc2lkOwogICAgICAgIHVuc2lnbmVkIGxvbmcgY2JFeHRlbnNpb247CiAgICAgICAgVUxPTkcgc2l6ZTsKICAgICAgICBbc2l6ZV9pcyhzaXplKSwgcmVmXSBieXRlICpwRGF0YTsKICAgICAgfSB1X2N1c3RvbTsKICAgIH0gdV9vYmpyZWY7CiAgfSBPQkpSRUY7CgogIHR5cGVkZWYgc3RydWN0IHRhZ01JbnRlcmZhY2VQb2ludGVyIHsKICAgIFVMT05HIHVsQ250RGF0YTsKICAgIFtzaXplX2lzKHVsQ250RGF0YSldIEJZVEUgYWJEYXRhW107CiAgfSBNSW50ZXJmYWNlUG9pbnRlcjsKCiAgdHlwZWRlZiBbdW5pcXVlXSBNSW50ZXJmYWNlUG9pbnRlciAqUE1JbnRlcmZhY2VQb2ludGVyOwoKfSAvKiBpbnRlcmZhY2UgT2JqZWN0UnBjQmFzZVR5cGVzICovCgpbCiAgb2JqZWN0LAogIHV1aWQoMDAwMDAxMzEtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2KQpdCmludGVyZmFjZSBJUmVtVW5rbm93biA6IElVbmtub3duCnsKICB0eXBlZGVmIFt1bmlxdWVdIElSZW1Vbmtub3duICpMUFJFTVVOS05PV047CgogIHR5cGVkZWYgc3RydWN0IHRhZ1JFTVFJUkVTVUxUIHsKICAgIEhSRVNVTFQgaFJlc3VsdDsKICAgIFNURE9CSlJFRiBzdGQ7CiAgfSBSRU1RSVJFU1VMVDsKCiAgdHlwZWRlZiBzdHJ1Y3QgdGFnUkVNSU5URVJGQUNFUkVGIHsKICAgIElQSUQgaXBpZDsKICAgIHVuc2lnbmVkIGxvbmcgY1B1YmxpY1JlZnM7CiAgICB1bnNpZ25lZCBsb25nIGNQcml2YXRlUmVmczsKICB9IFJFTUlOVEVSRkFDRVJFRjsgCgogIEhSRVNVTFQgUmVtUXVlcnlJbnRlcmZhY2UoCiAgICBbaW5dIFJFRklQSUQgcmlwaWQsCiAgICBbaW5dIFVMT05HIGNSZWZzLAogICAgW2luXSB1bnNpZ25lZCBzaG9ydCBjSWlkcywKICAgIFtpbiwgc2l6ZV9pcyhjSWlkcyldIElJRCAqaWlkcywKICAgIFtvdXQsIHNpemVfaXMoLGNJaWRzKV0gUkVNUUlSRVNVTFQgKipwcFFJUmVzdWx0cyk7CgogIEhSRVNVTFQgUmVtQWRkUmVmKAogICAgW2luXSB1bnNpZ25lZCBzaG9ydCBjSW50ZXJmYWNlUmVmcywKICAgIFtpbiwgc2l6ZV9pcyhjSW50ZXJmYWNlUmVmcyldIFJFTUlOVEVSRkFDRVJFRiogSW50ZXJmYWNlUmVmcywKICAgIFtvdXQsIHNpemVfaXMoY0ludGVyZmFjZVJlZnMpXSBIUkVTVUxUICpwUmVzdWx0cyk7CgogIEhSRVNVTFQgUmVtUmVsZWFzZSgKICAgIFtpbl0gdW5zaWduZWQgc2hvcnQgY0ludGVyZmFjZVJlZnMsCiAgICBbaW4sIHNpemVfaXMoY0ludGVyZmFjZVJlZnMpXSBSRU1JTlRFUkZBQ0VSRUYqIEludGVyZmFjZVJlZnMpOwp9CgpbCiAgb2JqZWN0LAogIHV1aWQoMDAwMDAxNDItMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2KQpdCmludGVyZmFjZSBJUmVtVW5rbm93bjIgOiBJUmVtVW5rbm93bgp7CiAgdHlwZWRlZiBbdW5pcXVlXSBJUmVtVW5rbm93bjIgKkxQUkVNVU5LTk9XTjI7CgogIEhSRVNVTFQgUmVtUXVlcnlJbnRlcmZhY2UyKAogICAgW2luXSBSRUZJUElEIHJpcGlkLAogICAgW2luXSB1bnNpZ25lZCBzaG9ydCBjSWlkcywKICAgIFtpbiwgc2l6ZV9pcyhjSWlkcyldIElJRCAqaWlkcywKICAgIFtvdXQsIHNpemVfaXMoY0lpZHMpXSBIUkVTVUxUICpwaHIsCiAgICBbb3V0LCBzaXplX2lzKGNJaWRzKV0gTUludGVyZmFjZVBvaW50ZXIgKipwcE1JRik7Cn0KClsKICB1dWlkKDk5ZmNmZWM0LTUyNjAtMTAxYi1iYmNiLTAwYWEwMDIxMzQ3YSksCiAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKXQppbnRlcmZhY2UgSU9YSURSZXNvbHZlcgp7CiAgW2lkZW1wb3RlbnRdIGVycm9yX3N0YXR1c190IFJlc29sdmVPeGlkKAogICAgW2luXSBoYW5kbGVfdCBoUnBjLAogICAgW2luXSBPWElEICpwT3hpZCwKICAgIFtpbl0gdW5zaWduZWQgc2hvcnQgY1JlcXVlc3RlZFByb3RzZXFzLAogICAgW2luLCByZWYsIHNpemVfaXMoY1JlcXVlc3RlZFByb3RzZXFzKV0gdW5zaWduZWQgc2hvcnQgYXJSZXF1ZXN0ZWRQcm90c2Vxc1tdLAogICAgW291dCwgcmVmXSBEVUFMU1RSSU5HQVJSQVkgKipwcGRzYU94aWRCaW5kaW5ncywKICAgIFtvdXQsIHJlZl0gSVBJRCAqcGlwaWRSZW1Vbmtub3duLAogICAgW291dCwgcmVmXSBEV09SRCAqcEF1dGhuSGludCk7CgogIFtpZGVtcG90ZW50XSBlcnJvcl9zdGF0dXNfdCBTaW1wbGVQaW5nKAogICAgW2luXSBoYW5kbGVfdCBoUnBjLAogICAgW2luXSBTRVRJRCAqcFNldElkKTsKCiAgW2lkZW1wb3RlbnRdIGVycm9yX3N0YXR1c190IENvbXBsZXhQaW5nKAogICAgW2luXSBoYW5kbGVfdCBoUnBjLAogICAgW2luLCBvdXRdIFNFVElEICpwU2V0SWQsCiAgICBbaW5dIHVuc2lnbmVkIHNob3J0IFNlcXVlbmNlTnVtLAogICAgW2luXSB1bnNpZ25lZCBzaG9ydCBjQWRkVG9TZXQsCiAgICBbaW5dIHVuc2lnbmVkIHNob3J0IGNEZWxGcm9tU2V0LAogICAgW2luLCB1bmlxdWUsIHNpemVfaXMoY0FkZFRvU2V0KV0gT0lEIEFkZFRvU2V0W10sCiAgICBbaW4sIHVuaXF1ZSwgc2l6ZV9pcyhjRGVsRnJvbVNldCldIE9JRCBEZWxGcm9tU2V0W10sCiAgICBbb3V0XSB1bnNpZ25lZCBzaG9ydCAqcFBpbmdCYWNrb2ZmRmFjdG9yKTsKCiAgW2lkZW1wb3RlbnRdIGVycm9yX3N0YXR1c190IFNlcnZlckFsaXZlKAogICAgW2luXSBoYW5kbGVfdCBoUnBjKTsKCiAgW2lkZW1wb3RlbnRdIGVycm9yX3N0YXR1c190IFJlc29sdmVPeGlkMigKICAgIFtpbl0gaGFuZGxlX3QgaFJwYywKICAgIFtpbl0gT1hJRCAqcE94aWQsCiAgICBbaW5dIHVuc2lnbmVkIHNob3J0IGNSZXF1ZXN0ZWRQcm90c2VxcywKICAgIFtpbiwgcmVmLCBzaXplX2lzKGNSZXF1ZXN0ZWRQcm90c2VxcyldIHVuc2lnbmVkIHNob3J0IGFyUmVxdWVzdGVkUHJvdHNlcXNbXSwKICAgIFtvdXQsIHJlZl0gRFVBTFNUUklOR0FSUkFZICoqcHBkc2FPeGlkQmluZGluZ3MsCiAgICBbb3V0LCByZWZdIElQSUQgKnBpcGlkUmVtVW5rbm93biwKICAgIFtvdXQsIHJlZl0gRFdPUkQgKnBBdXRobkhpbnQsCiAgICBbb3V0LCByZWZdIENPTVZFUlNJT04gKnBDb21WZXJzaW9uKTsgCn0KClsKICB1dWlkKDRkOWY0YWI4LTdkMWMtMTFjZi04NjFlLTAwMjBhZjZlN2M1NyksCiAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKXQppbnRlcmZhY2UgSVJlbW90ZUFjdGl2YXRpb24KewogIGNvbnN0IHVuc2lnbmVkIGxvbmcgTU9ERV9HRVRfQ0xBU1NfT0JKRUNUID0gMHhmZmZmZmZmZjsKCiAgSFJFU1VMVCBSZW1vdGVBY3RpdmF0aW9uKAogICAgW2luXSBoYW5kbGVfdCBoUnBjLAogICAgW2luXSBPUlBDVEhJUyAqT1JQQ3RoaXMsCiAgICBbb3V0XSBPUlBDVEhBVCAqT1JQQ3RoYXQsCiAgICBbaW5dIEdVSUQgKkNsc2lkLAogICAgW2luLCBzdHJpbmcsIHVuaXF1ZV0gV0NIQVIgKnB3c3pPYmplY3ROYW1lLAogICAgW2luLCB1bmlxdWVdIE1JbnRlcmZhY2VQb2ludGVyICpwT2JqZWN0U3RvcmFnZSwKICAgIFtpbl0gRFdPUkQgQ2xpZW50SW1wTGV2ZWwsCiAgICBbaW5dIERXT1JEIE1vZGUsCiAgICBbaW5dIERXT1JEIEludGVyZmFjZXMsCiAgICBbaW4sIHVuaXF1ZSwgc2l6ZV9pcyhJbnRlcmZhY2VzKV0gSUlEICpwSUlEcywKICAgIFtpbl0gdW5zaWduZWQgc2hvcnQgY1JlcXVlc3RlZFByb3RzZXFzLAogICAgW2luLCBzaXplX2lzKGNSZXF1ZXN0ZWRQcm90c2VxcyldIHVuc2lnbmVkIHNob3J0IFJlcXVlc3RlZFByb3RzZXFzW10sCiAgICBbb3V0XSBPWElEICpwT3hpZCwKICAgIFtvdXRdIERVQUxTVFJJTkdBUlJBWSAqKnBwZHNhT3hpZEJpbmRpbmdzLAogICAgW291dF0gSVBJRCAqcGlwaWRSZW1Vbmtub3duLAogICAgW291dF0gRFdPUkQgKnBBdXRobkhpbnQsCiAgICBbb3V0XSBDT01WRVJTSU9OICpwU2VydmVyVmVyc2lvbiwKICAgIFtvdXRdIEhSRVNVTFQgKnBociwKICAgIFtvdXQsc2l6ZV9pcyhJbnRlcmZhY2VzKV0gTUludGVyZmFjZVBvaW50ZXIgKipwcEludGVyZmFjZURhdGEsCiAgICBbb3V0LHNpemVfaXMoSW50ZXJmYWNlcyldIEhSRVNVTFQgKnBSZXN1bHRzKTsKfQo=