LyoKIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgogY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsIGluc3RhbGxhdGlvbiwKIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIEFwcGxlIHNvZnR3YXJlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UKIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yCiByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KCiBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0IHRvIHRoZXNlCiB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMgY29weXJpZ2h0cyBpbgogdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZAogcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5CiBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQKIG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwKIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MKIG9yIGxvZ29zIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KIHRoZSBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiBFeGNlcHQgYXMgZXhwcmVzc2x5CiBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQogaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyCiBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZSBTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgoKIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8gV0FSUkFOVElFUywKIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsCiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUwogVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgoKIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCiAgICAgICAgICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLAogUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORAogV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUgogT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgIm1haW4uaCIKI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgoKc3RhdGljIHZvaWQgcGx1Z2luSW52YWxpZGF0ZShOUE9iamVjdCAqb2JqKTsKc3RhdGljIGJvb2wgcGx1Z2luSGFzUHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOwpzdGF0aWMgYm9vbCBwbHVnaW5IYXNNZXRob2QoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOwpzdGF0aWMgYm9vbCBwbHVnaW5HZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgTlBWYXJpYW50ICp2YXJpYW50KTsKc3RhdGljIGJvb2wgcGx1Z2luU2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqdmFyaWFudCk7CnN0YXRpYyBib29sIHBsdWdpbkludm9rZShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpOwpzdGF0aWMgYm9vbCBwbHVnaW5JbnZva2VEZWZhdWx0KE5QT2JqZWN0ICpvYmosIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KTsKc3RhdGljIE5QT2JqZWN0ICpwbHVnaW5BbGxvY2F0ZShOUFAgbnBwLCBOUENsYXNzICp0aGVDbGFzcyk7CnN0YXRpYyB2b2lkIHBsdWdpbkRlYWxsb2NhdGUoTlBPYmplY3QgKm9iaik7CnN0YXRpYyBib29sIHBsdWdpblJlbW92ZVByb3BlcnR5KE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOwpzdGF0aWMgYm9vbCBwbHVnaW5FbnVtZXJhdGUoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgKip2YWx1ZSwgdWludDMyX3QgKmNvdW50KTsKCgoKc3RhdGljIE5QQ2xhc3MgcGx1Z2luQ2xhc3MgPSB7CiAgICBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiwKICAgIHBsdWdpbkFsbG9jYXRlLAogICAgcGx1Z2luRGVhbGxvY2F0ZSwKICAgIHBsdWdpbkludmFsaWRhdGUsCiAgICBwbHVnaW5IYXNNZXRob2QsCiAgICBwbHVnaW5JbnZva2UsCiAgICBwbHVnaW5JbnZva2VEZWZhdWx0LAogICAgcGx1Z2luSGFzUHJvcGVydHksCiAgICBwbHVnaW5HZXRQcm9wZXJ0eSwKICAgIHBsdWdpblNldFByb3BlcnR5LAogICAgcGx1Z2luUmVtb3ZlUHJvcGVydHksCiAgICBwbHVnaW5FbnVtZXJhdGUKfTsKCk5QQ2xhc3MgKmdldFBsdWdpbkNsYXNzKHZvaWQpCnsKICAgIHJldHVybiAmcGx1Z2luQ2xhc3M7Cn0KCnN0YXRpYyBib29sIGlkZW50aWZpZXJzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKCiNkZWZpbmUgSURfVEVTVEZJTEVfUFJPUEVSVFkgICAgICAgICAgICAwCiNkZWZpbmUgTlVNX1BST1BFUlRZX0lERU5USUZJRVJTICAgICAgICAxCgpzdGF0aWMgTlBJZGVudGlmaWVyIHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnNbTlVNX1BST1BFUlRZX0lERU5USUZJRVJTXTsKc3RhdGljIGNvbnN0IE5QVVRGOCAqcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyTmFtZXNbTlVNX1BST1BFUlRZX0lERU5USUZJRVJTXSA9IHsKICAgICJ0ZXN0ZmlsZSIKfTsKCiNkZWZpbmUgSURfR0VUVEVTVEZJTEVfTUVUSE9EICAgICAgICAgICAgICAgICAgIDAKI2RlZmluZSBOVU1fTUVUSE9EX0lERU5USUZJRVJTICAgICAgICAgICAgICAgICAgMQoKc3RhdGljIE5QSWRlbnRpZmllciBwbHVnaW5NZXRob2RJZGVudGlmaWVyc1tOVU1fTUVUSE9EX0lERU5USUZJRVJTXTsKc3RhdGljIGNvbnN0IE5QVVRGOCAqcGx1Z2luTWV0aG9kSWRlbnRpZmllck5hbWVzW05VTV9NRVRIT0RfSURFTlRJRklFUlNdID0gewogICAgImdldFRlc3RGaWxlIgp9OwoKc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUlkZW50aWZpZXJzKHZvaWQpCnsKICAgIGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXJzKHBsdWdpblByb3BlcnR5SWRlbnRpZmllck5hbWVzLCBOVU1fUFJPUEVSVFlfSURFTlRJRklFUlMsIHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnMpOwogICAgYnJvd3Nlci0+Z2V0c3RyaW5naWRlbnRpZmllcnMocGx1Z2luTWV0aG9kSWRlbnRpZmllck5hbWVzLCBOVU1fTUVUSE9EX0lERU5USUZJRVJTLCBwbHVnaW5NZXRob2RJZGVudGlmaWVycyk7Cn0KCnN0YXRpYyBib29sIHBsdWdpbkhhc1Byb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKQp7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUFJPUEVSVFlfSURFTlRJRklFUlM7IGkrKykKICAgICAgICBpZiAobmFtZSA9PSBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzW2ldKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKfQoKc3RhdGljIGJvb2wgcGx1Z2luSGFzTWV0aG9kKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKQp7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUVUSE9EX0lERU5USUZJRVJTOyBpKyspCiAgICAgICAgaWYgKG5hbWUgPT0gcGx1Z2luTWV0aG9kSWRlbnRpZmllcnNbaV0pCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwp9CgpzdGF0aWMgYm9vbCBwbHVnaW5HZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgTlBWYXJpYW50ICp2YXJpYW50KQp7CiAgICBQbHVnaW5PYmplY3QgKnBsdWdpbiA9IChQbHVnaW5PYmplY3QgKilvYmo7CiAgICBpZiAobmFtZSA9PSBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzW0lEX1RFU1RGSUxFX1BST1BFUlRZXSkgewogICAgICAgIEJPT0xFQU5fVE9fTlBWQVJJQU5UKHRydWUsICp2YXJpYW50KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKc3RhdGljIGJvb2wgcGx1Z2luU2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqdmFyaWFudCkKewogICAgcmV0dXJuIGZhbHNlOwp9CgpzdGF0aWMgYm9vbCBwbHVnaW5JbnZva2UoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KQp7CiAgICBQbHVnaW5PYmplY3QgKnBsdWdpbiA9IChQbHVnaW5PYmplY3QgKilvYmo7CiAgICBpZiAobmFtZSA9PSBwbHVnaW5NZXRob2RJZGVudGlmaWVyc1tJRF9HRVRURVNURklMRV9NRVRIT0RdKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCnN0YXRpYyBib29sIHBsdWdpbkludm9rZURlZmF1bHQoTlBPYmplY3QgKm9iaiwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpCnsKICAgIHJldHVybiBmYWxzZTsKfQoKc3RhdGljIHZvaWQgcGx1Z2luSW52YWxpZGF0ZShOUE9iamVjdCAqb2JqKQp7CiAgICAvLyBSZWxlYXNlIGFueSByZW1haW5pbmcgcmVmZXJlbmNlcyB0byBKYXZhU2NyaXB0IG9iamVjdHMuCn0KCnN0YXRpYyBOUE9iamVjdCAqcGx1Z2luQWxsb2NhdGUoTlBQIG5wcCwgTlBDbGFzcyAqdGhlQ2xhc3MpCnsKICAgIFBsdWdpbk9iamVjdCAqbmV3SW5zdGFuY2UgPSAoUGx1Z2luT2JqZWN0KikgbWFsbG9jKHNpemVvZihQbHVnaW5PYmplY3QpKTsKICAgIG5ld0luc3RhbmNlLT5oZWFkZXIuX2NsYXNzID0gdGhlQ2xhc3M7CiAgICBuZXdJbnN0YW5jZS0+aGVhZGVyLnJlZmVyZW5jZUNvdW50ID0gMTsKCiAgICBpZiAoIWlkZW50aWZpZXJzSW5pdGlhbGl6ZWQpIHsKICAgICAgICBpZGVudGlmaWVyc0luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICBpbml0aWFsaXplSWRlbnRpZmllcnMoKTsKICAgIH0KCiAgICBuZXdJbnN0YW5jZS0+bnBwID0gbnBwOwoKICAgIHJldHVybiAmbmV3SW5zdGFuY2UtPmhlYWRlcjsKfQoKc3RhdGljIHZvaWQgcGx1Z2luRGVhbGxvY2F0ZShOUE9iamVjdCAqb2JqKQp7CiAgICBmcmVlKG9iaik7Cn0KCnN0YXRpYyBib29sIHBsdWdpblJlbW92ZVByb3BlcnR5KE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyIG5hbWUpCnsKICAgIHJldHVybiBmYWxzZTsKfQoKc3RhdGljIGJvb2wgcGx1Z2luRW51bWVyYXRlKE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyICoqdmFsdWUsIHVpbnQzMl90ICpjb3VudCkKewogICAgcmV0dXJuIGZhbHNlOwp9Cg==