Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8JICAgIEMgSW1wbGVtZW50YXRpb24gb2YgV3UncyBDb2xvciBRdWFudGl6ZXIgKHYuIDIpCi8vCSAgICAoc2VlIEdyYXBoaWNzIEdlbXMgdm9sLiBJSSwgcHAuIDEyNi0xMzMpCi8vCi8vIEF1dGhvcjoJWGlhb2xpbiBXdQovLyBEZXB0LiBvZiBDb21wdXRlciBTY2llbmNlCi8vIFVuaXYuIG9mIFdlc3Rlcm4gT250YXJpbwovLyBMb25kb24sIE9udGFyaW8gTjZBIDVCNwovLyB3dUBjc2QudXdvLmNhCi8vIAovLyBBbGdvcml0aG06IEdyZWVkeSBvcnRob2dvbmFsIGJpcGFydGl0aW9uIG9mIFJHQiBzcGFjZSBmb3IgdmFyaWFuY2UKLy8gCSAgIG1pbmltaXphdGlvbiBhaWRlZCBieSBpbmNsdXNpb24tZXhjbHVzaW9uIHRyaWNrcy4KLy8gCSAgIEZvciBzcGVlZCBubyBuZWFyZXN0IG5laWdoYm9yIHNlYXJjaCBpcyBkb25lLiBTbGlnaHRseQovLyAJICAgYmV0dGVyIHBlcmZvcm1hbmNlIGNhbiBiZSBleHBlY3RlZCBieSBtb3JlIHNvcGhpc3RpY2F0ZWQKLy8gCSAgIGJ1dCBtb3JlIGV4cGVuc2l2ZSB2ZXJzaW9ucy4KLy8gCi8vIFRoZSBhdXRob3IgdGhhbmtzIFRvbSBMYW5lIGF0IFRvbV9MYW5lQEcuR1AuQ1MuQ01VLkVEVSBmb3IgbXVjaCBvZgovLyBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gYW5kIGEgY3VyZSB0byBhIHByZXZpb3VzIGJ1Zy4KLy8gCi8vIEZyZWUgdG8gZGlzdHJpYnV0ZSwgY29tbWVudHMgYW5kIHN1Z2dlc3Rpb25zIGFyZSBhcHByZWNpYXRlZC4KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEhpc3RvcnkKLy8gLS0tLS0tLQovLyBKdWx5IDIwMDA6ICBDKysgSW1wbGVtZW50YXRpb24gb2YgV3UncyBDb2xvciBRdWFudGl6ZXIKLy8gICAgICAgICAgICAgYW5kIGFkYXB0YXRpb24gZm9yIHRoZSBGcmVlSW1hZ2UgMiBMaWJyYXJ5Ci8vICAgICAgICAgICAgIEF1dGhvcjogSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8gTWFyY2ggMjAwNDogQWRhcHRhdGlvbiBmb3IgdGhlIEZyZWVJbWFnZSAzIGxpYnJhcnkgKHBvcnQgdG8gYmlnIGVuZGlhbiBwcm9jZXNzb3JzKQovLyAgICAgICAgICAgICBBdXRob3I6IEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgojaW5jbHVkZSAiUXVhbnRpemVycy5oIgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLyAzRCBhcnJheSBpbmRleGF0aW9uCgojZGVmaW5lIElOREVYKHIsIGcsIGIpCSgociA8PCAxMCkgKyAociA8PCA2KSArIHIgKyAoZyA8PCA1KSArIGcgKyBiKQoKI2RlZmluZSBNQVhDT0xPUgkyNTYKCi8vIENvbnN0cnVjdG9yIC8gRGVzdHJ1Y3RvcgoKV3VRdWFudGl6ZXI6Old1UXVhbnRpemVyKEZJQklUTUFQICpkaWIpIHsKCXdpZHRoID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CgloZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CglwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOwoJbV9kaWIgPSBkaWI7CgoJZ20yID0gTlVMTDsKCXd0ID0gbXIgPSBtZyA9IG1iID0gTlVMTDsKCVFhZGQgPSBOVUxMOwoKCS8vIEFsbG9jYXRlIDNEIGFycmF5cwoJZ20yID0gKGZsb2F0KiltYWxsb2MoMzMgKiAzMyAqIDMzICogc2l6ZW9mKGZsb2F0KSk7Cgl3dCA9IChMT05HKiltYWxsb2MoMzMgKiAzMyAqIDMzICogc2l6ZW9mKExPTkcpKTsKCW1yID0gKExPTkcqKW1hbGxvYygzMyAqIDMzICogMzMgKiBzaXplb2YoTE9ORykpOwoJbWcgPSAoTE9ORyopbWFsbG9jKDMzICogMzMgKiAzMyAqIHNpemVvZihMT05HKSk7CgltYiA9IChMT05HKiltYWxsb2MoMzMgKiAzMyAqIDMzICogc2l6ZW9mKExPTkcpKTsKCgkvLyBBbGxvY2F0ZSBRYWRkCglRYWRkID0gKFdPUkQgKiltYWxsb2Moc2l6ZW9mKFdPUkQpICogd2lkdGggKiBoZWlnaHQpOwoKCWlmKCFnbTIgfHwgIXd0IHx8ICFtciB8fCAhbWcgfHwgIW1iIHx8ICFRYWRkKSB7CgkJaWYoZ20yKQlmcmVlKGdtMik7CgkJaWYod3QpCWZyZWUod3QpOwoJCWlmKG1yKQlmcmVlKG1yKTsKCQlpZihtZykJZnJlZShtZyk7CgkJaWYobWIpCWZyZWUobWIpOwoJCWlmKFFhZGQpICBmcmVlKFFhZGQpOwoJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7Cgl9CgltZW1zZXQoZ20yLCAwLCAzNTkzNyAqIHNpemVvZihmbG9hdCkpOwoJbWVtc2V0KHd0LCAwLCAzNTkzNyAqIHNpemVvZihMT05HKSk7CgltZW1zZXQobXIsIDAsIDM1OTM3ICogc2l6ZW9mKExPTkcpKTsKCW1lbXNldChtZywgMCwgMzU5MzcgKiBzaXplb2YoTE9ORykpOwoJbWVtc2V0KG1iLCAwLCAzNTkzNyAqIHNpemVvZihMT05HKSk7CgltZW1zZXQoUWFkZCwgMCwgc2l6ZW9mKFdPUkQpICogd2lkdGggKiBoZWlnaHQpOwp9CgpXdVF1YW50aXplcjo6fld1UXVhbnRpemVyKCkgewoJaWYoZ20yKQlmcmVlKGdtMik7CglpZih3dCkJZnJlZSh3dCk7CglpZihtcikJZnJlZShtcik7CglpZihtZykJZnJlZShtZyk7CglpZihtYikJZnJlZShtYik7CglpZihRYWRkKSAgZnJlZShRYWRkKTsKfQoKCi8vIEhpc3RvZ3JhbSBpcyBpbiBlbGVtZW50cyAxLi5ISVNUU0laRSBhbG9uZyBlYWNoIGF4aXMsCi8vIGVsZW1lbnQgMCBpcyBmb3IgYmFzZSBvciBtYXJnaW5hbCB2YWx1ZQovLyBOQjogdGhlc2UgbXVzdCBzdGFydCBvdXQgMCEKCi8vIEJ1aWxkIDMtRCBjb2xvciBoaXN0b2dyYW0gb2YgY291bnRzLCByL2cvYiwgY14yCnZvaWQgCld1UXVhbnRpemVyOjpIaXN0M0QoTE9ORyAqdnd0LCBMT05HICp2bXIsIExPTkcgKnZtZywgTE9ORyAqdm1iLCBmbG9hdCAqbTIsIGludCBSZXNlcnZlU2l6ZSwgUkdCUVVBRCAqUmVzZXJ2ZVBhbGV0dGUpIHsKCWludCBpbmQgPSAwOwoJaW50IGluciwgaW5nLCBpbmIsIHRhYmxlWzI1Nl07CglpbnQgaTsKCVdPUkQgeSwgeDsKCglmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKCQl0YWJsZVtpXSA9IGkgKiBpOwoKCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShtX2RpYiwgeSk7CgoJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspCXsKCQkJaW5yID0gKGJpdHNbRklfUkdCQV9SRURdID4+IDMpICsgMTsKCQkJaW5nID0gKGJpdHNbRklfUkdCQV9HUkVFTl0gPj4gMykgKyAxOwoJCQlpbmIgPSAoYml0c1tGSV9SR0JBX0JMVUVdID4+IDMpICsgMTsKCQkJaW5kID0gSU5ERVgoaW5yLCBpbmcsIGluYik7CgkJCVFhZGRbeSp3aWR0aCArIHhdID0gKFdPUkQpaW5kOwoJCQkvLyBbaW5yXVtpbmddW2luYl0KCQkJdnd0W2luZF0rKzsKCQkJdm1yW2luZF0gKz0gYml0c1tGSV9SR0JBX1JFRF07CgkJCXZtZ1tpbmRdICs9IGJpdHNbRklfUkdCQV9HUkVFTl07CgkJCXZtYltpbmRdICs9IGJpdHNbRklfUkdCQV9CTFVFXTsKCQkJbTJbaW5kXSArPSAoZmxvYXQpKHRhYmxlW2JpdHNbRklfUkdCQV9SRURdXSArIHRhYmxlW2JpdHNbRklfUkdCQV9HUkVFTl1dICsgdGFibGVbYml0c1tGSV9SR0JBX0JMVUVdXSk7CgkJCWJpdHMgKz0gMzsKCQl9Cgl9CgoJaWYoIFJlc2VydmVTaXplID4gMCApIHsKCQlpbnQgbWF4ID0gMDsKCQlmb3IoaSA9IDA7IGkgPCAzNTkzNzsgaSsrKSB7CgkJCWlmKCB2d3RbaW5kXSA+IG1heCApIG1heCA9IHZ3dFtpbmRdOwoJCX0KCQltYXgrKzsKCQlmb3IoaSA9IDA7IGkgPCBSZXNlcnZlU2l6ZTsgaSsrKSB7CgkJCWluciA9IChSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JSZWQgPj4gMykgKyAxOwoJCQlpbmcgPSAoUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiR3JlZW4gPj4gMykgKyAxOwoJCQlpbmIgPSAoUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiQmx1ZSA+PiAzKSArIDE7CgkJCWluZCA9IElOREVYKGluciwgaW5nLCBpbmIpOwoJCQl3dFtpbmRdID0gbWF4OwoJCQltcltpbmRdID0gbWF4ICogUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiUmVkOwoJCQltZ1tpbmRdID0gbWF4ICogUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiR3JlZW47CgkJCW1iW2luZF0gPSBtYXggKiBSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JCbHVlOwoJCQlnbTJbaW5kXSA9IChmbG9hdCltYXggKiAoZmxvYXQpKHRhYmxlW1Jlc2VydmVQYWxldHRlW2ldLnJnYlJlZF0gKyB0YWJsZVtSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JHcmVlbl0gKyB0YWJsZVtSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JCbHVlXSk7CgkJfQoJfQp9CgoKLy8gQXQgY29uY2x1c2lvbiBvZiB0aGUgaGlzdG9ncmFtIHN0ZXAsIHdlIGNhbiBpbnRlcnByZXQKLy8gd3Rbcl1bZ11bYl0gPSBzdW0gb3ZlciB2b3hlbCBvZiBQKGMpCi8vIG1yW3JdW2ddW2JdID0gc3VtIG92ZXIgdm94ZWwgb2YgcipQKGMpICAsICBzaW1pbGFybHkgZm9yIG1nLCBtYgovLyBtMltyXVtnXVtiXSA9IHN1bSBvdmVyIHZveGVsIG9mIGNeMipQKGMpCi8vIEFjdHVhbGx5IGVhY2ggb2YgdGhlc2Ugc2hvdWxkIGJlIGRpdmlkZWQgYnkgJ0ltYWdlU2l6ZScgdG8gZ2l2ZSB0aGUgdXN1YWwKLy8gaW50ZXJwcmV0YXRpb24gb2YgUCgpIGFzIHJhbmdpbmcgZnJvbSAwIHRvIDEsIGJ1dCB3ZSBuZWVkbid0IGRvIHRoYXQgaGVyZS4KCgovLyBXZSBub3cgY29udmVydCBoaXN0b2dyYW0gaW50byBtb21lbnRzIHNvIHRoYXQgd2UgY2FuIHJhcGlkbHkgY2FsY3VsYXRlCi8vIHRoZSBzdW1zIG9mIHRoZSBhYm92ZSBxdWFudGl0aWVzIG92ZXIgYW55IGRlc2lyZWQgYm94LgoKLy8gQ29tcHV0ZSBjdW11bGF0aXZlIG1vbWVudHMKdm9pZCAKV3VRdWFudGl6ZXI6Ok0zRChMT05HICp2d3QsIExPTkcgKnZtciwgTE9ORyAqdm1nLCBMT05HICp2bWIsIGZsb2F0ICptMikgewoJV09SRCBpbmQxLCBpbmQyOwoJQllURSBpLCByLCBnLCBiOwoJTE9ORyBsaW5lLCBsaW5lX3IsIGxpbmVfZywgbGluZV9iOwoJTE9ORyBhcmVhWzMzXSwgYXJlYV9yWzMzXSwgYXJlYV9nWzMzXSwgYXJlYV9iWzMzXTsKCWZsb2F0IGxpbmUyLCBhcmVhMlszM107CgogICAgZm9yKHIgPSAxOyByIDw9IDMyOyByKyspIHsKCQlmb3IoaSA9IDA7IGkgPD0gMzI7IGkrKykgewoJCQlhcmVhMltpXSA9IDA7CgkJCWFyZWFbaV0gPSBhcmVhX3JbaV0gPSBhcmVhX2dbaV0gPSBhcmVhX2JbaV0gPSAwOwoJCX0KCQlmb3IoZyA9IDE7IGcgPD0gMzI7IGcrKykgewoJCQlsaW5lMiA9IDA7CgkJCWxpbmUgPSBsaW5lX3IgPSBsaW5lX2cgPSBsaW5lX2IgPSAwOwoJCQlmb3IoYiA9IDE7IGIgPD0gMzI7IGIrKykgewkJCSAKCQkJCWluZDEgPSBJTkRFWChyLCBnLCBiKTsgLy8gW3JdW2ddW2JdCgkJCQlsaW5lICs9IHZ3dFtpbmQxXTsKCQkJCWxpbmVfciArPSB2bXJbaW5kMV07IAoJCQkJbGluZV9nICs9IHZtZ1tpbmQxXTsgCgkJCQlsaW5lX2IgKz0gdm1iW2luZDFdOwoJCQkJbGluZTIgKz0gbTJbaW5kMV07CgkJCQlhcmVhW2JdICs9IGxpbmU7CgkJCQlhcmVhX3JbYl0gKz0gbGluZV9yOwoJCQkJYXJlYV9nW2JdICs9IGxpbmVfZzsKCQkJCWFyZWFfYltiXSArPSBsaW5lX2I7CgkJCQlhcmVhMltiXSArPSBsaW5lMjsKCQkJCWluZDIgPSBpbmQxIC0gMTA4OTsgLy8gW3ItMV1bZ11bYl0KCQkJCXZ3dFtpbmQxXSA9IHZ3dFtpbmQyXSArIGFyZWFbYl07CgkJCQl2bXJbaW5kMV0gPSB2bXJbaW5kMl0gKyBhcmVhX3JbYl07CgkJCQl2bWdbaW5kMV0gPSB2bWdbaW5kMl0gKyBhcmVhX2dbYl07CgkJCQl2bWJbaW5kMV0gPSB2bWJbaW5kMl0gKyBhcmVhX2JbYl07CgkJCQltMltpbmQxXSA9IG0yW2luZDJdICsgYXJlYTJbYl07CgkJCX0KCQl9Cgl9Cn0KCi8vIENvbXB1dGUgc3VtIG92ZXIgYSBib3ggb2YgYW55IGdpdmVuIHN0YXRpc3RpYwpMT05HIApXdVF1YW50aXplcjo6Vm9sKCBCb3ggKmN1YmUsIExPTkcgKm1tdCApIHsKICAgIHJldHVybiggbW10W0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMSwgY3ViZS0+YjEpXSAKCQkgIC0gbW10W0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMSwgY3ViZS0+YjApXQoJCSAgLSBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBjdWJlLT5iMSldCgkJICArIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0KCQkgIC0gbW10W0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMSwgY3ViZS0+YjEpXQoJCSAgKyBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMCldCgkJICArIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KCQkgIC0gbW10W0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMCwgY3ViZS0+YjApXSApOwp9CgovLyBUaGUgbmV4dCB0d28gcm91dGluZXMgYWxsb3cgYSBzbGlnaHRseSBtb3JlIGVmZmljaWVudCBjYWxjdWxhdGlvbgovLyBvZiBWb2woKSBmb3IgYSBwcm9wb3NlZCBzdWJib3ggb2YgYSBnaXZlbiBib3guICBUaGUgc3VtIG9mIFRvcCgpCi8vIGFuZCBCb3R0b20oKSBpcyB0aGUgVm9sKCkgb2YgYSBzdWJib3ggc3BsaXQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbgovLyBhbmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyB1cHBlciBib3VuZC4KCgovLyBDb21wdXRlIHBhcnQgb2YgVm9sKGN1YmUsIG1tdCkgdGhhdCBkb2Vzbid0IGRlcGVuZCBvbiByMSwgZzEsIG9yIGIxCi8vIChkZXBlbmRpbmcgb24gZGlyKQoKTE9ORyAKV3VRdWFudGl6ZXI6OkJvdHRvbShCb3ggKmN1YmUsIEJZVEUgZGlyLCBMT05HICptbXQpIHsKICAgIHN3aXRjaChkaXIpCgl7CgkJY2FzZSBGSV9SR0JBX1JFRDoKCQkJcmV0dXJuKCAtIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzEsIGN1YmUtPmIxKV0KCQkJCSAgICArIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KCQkJCQkrIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KCQkJCQktIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0gKTsKCQkJYnJlYWs7CgkJY2FzZSBGSV9SR0JBX0dSRUVOOgoJCQlyZXR1cm4oIC0gbW10W0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMCwgY3ViZS0+YjEpXQoJCQkJICAgICsgbW10W0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMCwgY3ViZS0+YjApXQoJCQkJCSsgbW10W0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMCwgY3ViZS0+YjEpXQoJCQkJCS0gbW10W0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMCwgY3ViZS0+YjApXSApOwoJCQlicmVhazsKCQljYXNlIEZJX1JHQkFfQkxVRToKCQkJcmV0dXJuKCAtIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KCQkJCSAgICArIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0KCQkJCQkrIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KCQkJCQktIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0gKTsKCQkJYnJlYWs7Cgl9CgoJcmV0dXJuIDA7Cn0KCgovLyBDb21wdXRlIHJlbWFpbmRlciBvZiBWb2woY3ViZSwgbW10KSwgc3Vic3RpdHV0aW5nIHBvcyBmb3IKLy8gcjEsIGcxLCBvciBiMSAoZGVwZW5kaW5nIG9uIGRpcikKCkxPTkcgCld1UXVhbnRpemVyOjpUb3AoQm94ICpjdWJlLCBCWVRFIGRpciwgaW50IHBvcywgTE9ORyAqbW10KSB7CiAgICBzd2l0Y2goZGlyKQoJewoJCWNhc2UgRklfUkdCQV9SRUQ6CgkJCXJldHVybiggbW10W0lOREVYKHBvcywgY3ViZS0+ZzEsIGN1YmUtPmIxKV0gCgkJCQkgICAtbW10W0lOREVYKHBvcywgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KCQkJCSAgIC1tbXRbSU5ERVgocG9zLCBjdWJlLT5nMCwgY3ViZS0+YjEpXQoJCQkJICAgK21tdFtJTkRFWChwb3MsIGN1YmUtPmcwLCBjdWJlLT5iMCldICk7CgkJCWJyZWFrOwoJCWNhc2UgRklfUkdCQV9HUkVFTjoKCQkJcmV0dXJuKCBtbXRbSU5ERVgoY3ViZS0+cjEsIHBvcywgY3ViZS0+YjEpXSAKCQkJCSAgIC1tbXRbSU5ERVgoY3ViZS0+cjEsIHBvcywgY3ViZS0+YjApXQoJCQkJICAgLW1tdFtJTkRFWChjdWJlLT5yMCwgcG9zLCBjdWJlLT5iMSldCgkJCQkgICArbW10W0lOREVYKGN1YmUtPnIwLCBwb3MsIGN1YmUtPmIwKV0gKTsKCQkJYnJlYWs7CgkJY2FzZSBGSV9SR0JBX0JMVUU6CgkJCXJldHVybiggbW10W0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMSwgcG9zKV0KCQkJCSAgIC1tbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBwb3MpXQoJCQkJICAgLW1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzEsIHBvcyldCgkJCQkgICArbW10W0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMCwgcG9zKV0gKTsKCQkJYnJlYWs7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8vIENvbXB1dGUgdGhlIHdlaWdodGVkIHZhcmlhbmNlIG9mIGEgYm94IAovLyBOQjogYXMgd2l0aCB0aGUgcmF3IHN0YXRpc3RpY3MsIHRoaXMgaXMgcmVhbGx5IHRoZSB2YXJpYW5jZSAqIEltYWdlU2l6ZSAKCmZsb2F0Cld1UXVhbnRpemVyOjpWYXIoQm94ICpjdWJlKSB7CiAgICBmbG9hdCBkciA9IChmbG9hdCkgVm9sKGN1YmUsIG1yKTsgCiAgICBmbG9hdCBkZyA9IChmbG9hdCkgVm9sKGN1YmUsIG1nKTsgCiAgICBmbG9hdCBkYiA9IChmbG9hdCkgVm9sKGN1YmUsIG1iKTsKICAgIGZsb2F0IHh4ID0gIGdtMltJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzEsIGN1YmUtPmIxKV0gCgkJCS1nbTJbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcxLCBjdWJlLT5iMCldCgkJCSAtZ20yW0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMCwgY3ViZS0+YjEpXQoJCQkgK2dtMltJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0KCQkJIC1nbTJbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMSldCgkJCSArZ20yW0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMSwgY3ViZS0+YjApXQoJCQkgK2dtMltJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KCQkJIC1nbTJbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMCldOwoKICAgIHJldHVybiAoeHggLSAoZHIqZHIrZGcqZGcrZGIqZGIpLyhmbG9hdClWb2woY3ViZSx3dCkpOyAgICAKfQoKLy8gV2Ugd2FudCB0byBtaW5pbWl6ZSB0aGUgc3VtIG9mIHRoZSB2YXJpYW5jZXMgb2YgdHdvIHN1YmJveGVzLgovLyBUaGUgc3VtKGNeMikgdGVybXMgY2FuIGJlIGlnbm9yZWQgc2luY2UgdGhlaXIgc3VtIG92ZXIgYm90aCBzdWJib3hlcwovLyBpcyB0aGUgc2FtZSAodGhlIHN1bSBmb3IgdGhlIHdob2xlIGJveCkgbm8gbWF0dGVyIHdoZXJlIHdlIHNwbGl0LgovLyBUaGUgcmVtYWluaW5nIHRlcm1zIGhhdmUgYSBtaW51cyBzaWduIGluIHRoZSB2YXJpYW5jZSBmb3JtdWxhLAovLyBzbyB3ZSBkcm9wIHRoZSBtaW51cyBzaWduIGFuZCBNQVhJTUlaRSB0aGUgc3VtIG9mIHRoZSB0d28gdGVybXMuCgpmbG9hdApXdVF1YW50aXplcjo6TWF4aW1pemUoQm94ICpjdWJlLCBCWVRFIGRpciwgaW50IGZpcnN0LCBpbnQgbGFzdCAsIGludCAqY3V0LCBMT05HIHdob2xlX3IsIExPTkcgd2hvbGVfZywgTE9ORyB3aG9sZV9iLCBMT05HIHdob2xlX3cpIHsKCUxPTkcgaGFsZl9yLCBoYWxmX2csIGhhbGZfYiwgaGFsZl93OwoJaW50IGk7CglmbG9hdCB0ZW1wOwoKICAgIExPTkcgYmFzZV9yID0gQm90dG9tKGN1YmUsIGRpciwgbXIpOwogICAgTE9ORyBiYXNlX2cgPSBCb3R0b20oY3ViZSwgZGlyLCBtZyk7CiAgICBMT05HIGJhc2VfYiA9IEJvdHRvbShjdWJlLCBkaXIsIG1iKTsKICAgIExPTkcgYmFzZV93ID0gQm90dG9tKGN1YmUsIGRpciwgd3QpOwoKICAgIGZsb2F0IG1heCA9IDAuMDsKCiAgICAqY3V0ID0gLTE7CgogICAgZm9yIChpID0gZmlyc3Q7IGkgPCBsYXN0OyBpKyspIHsKCQloYWxmX3IgPSBiYXNlX3IgKyBUb3AoY3ViZSwgZGlyLCBpLCBtcik7CgkJaGFsZl9nID0gYmFzZV9nICsgVG9wKGN1YmUsIGRpciwgaSwgbWcpOwoJCWhhbGZfYiA9IGJhc2VfYiArIFRvcChjdWJlLCBkaXIsIGksIG1iKTsKCQloYWxmX3cgPSBiYXNlX3cgKyBUb3AoY3ViZSwgZGlyLCBpLCB3dCk7CgogICAgICAgIC8vIG5vdyBoYWxmX3ggaXMgc3VtIG92ZXIgbG93ZXIgaGFsZiBvZiBib3gsIGlmIHNwbGl0IGF0IGkKCgkJaWYgKGhhbGZfdyA9PSAwKSB7CQkvLyBzdWJib3ggY291bGQgYmUgZW1wdHkgb2YgcGl4ZWxzIQoJCQljb250aW51ZTsJCQkvLyBuZXZlciBzcGxpdCBpbnRvIGFuIGVtcHR5IGJveAoJCX0gZWxzZSB7CgkJCXRlbXAgPSAoKGZsb2F0KWhhbGZfcipoYWxmX3IgKyAoZmxvYXQpaGFsZl9nKmhhbGZfZyArIChmbG9hdCloYWxmX2IqaGFsZl9iKS9oYWxmX3c7CgkJfQoKCQloYWxmX3IgPSB3aG9sZV9yIC0gaGFsZl9yOwoJCWhhbGZfZyA9IHdob2xlX2cgLSBoYWxmX2c7CgkJaGFsZl9iID0gd2hvbGVfYiAtIGhhbGZfYjsKCQloYWxmX3cgPSB3aG9sZV93IC0gaGFsZl93OwoKICAgICAgICBpZiAoaGFsZl93ID09IDApIHsJCS8vIHN1YmJveCBjb3VsZCBiZSBlbXB0eSBvZiBwaXhlbHMhCgkJCWNvbnRpbnVlOwkJCS8vIG5ldmVyIHNwbGl0IGludG8gYW4gZW1wdHkgYm94CgkJfSBlbHNlIHsKCQkJdGVtcCArPSAoKGZsb2F0KWhhbGZfcipoYWxmX3IgKyAoZmxvYXQpaGFsZl9nKmhhbGZfZyArIChmbG9hdCloYWxmX2IqaGFsZl9iKS9oYWxmX3c7CgkJfQoKICAgIAlpZiAodGVtcCA+IG1heCkgewoJCQltYXg9dGVtcDsKCQkJKmN1dD1pOwoJCX0KICAgIH0KCiAgICByZXR1cm4gbWF4Owp9Cgpib29sCld1UXVhbnRpemVyOjpDdXQoQm94ICpzZXQxLCBCb3ggKnNldDIpIHsKCUJZVEUgZGlyOwoJaW50IGN1dHIsIGN1dGcsIGN1dGI7CgogICAgTE9ORyB3aG9sZV9yID0gVm9sKHNldDEsIG1yKTsKICAgIExPTkcgd2hvbGVfZyA9IFZvbChzZXQxLCBtZyk7CiAgICBMT05HIHdob2xlX2IgPSBWb2woc2V0MSwgbWIpOwogICAgTE9ORyB3aG9sZV93ID0gVm9sKHNldDEsIHd0KTsKCiAgICBmbG9hdCBtYXhyID0gTWF4aW1pemUoc2V0MSwgRklfUkdCQV9SRUQsIHNldDEtPnIwKzEsIHNldDEtPnIxLCAmY3V0ciwgd2hvbGVfciwgd2hvbGVfZywgd2hvbGVfYiwgd2hvbGVfdyk7ICAgIAoJZmxvYXQgbWF4ZyA9IE1heGltaXplKHNldDEsIEZJX1JHQkFfR1JFRU4sIHNldDEtPmcwKzEsIHNldDEtPmcxLCAmY3V0Zywgd2hvbGVfciwgd2hvbGVfZywgd2hvbGVfYiwgd2hvbGVfdyk7ICAgIAoJZmxvYXQgbWF4YiA9IE1heGltaXplKHNldDEsIEZJX1JHQkFfQkxVRSwgc2V0MS0+YjArMSwgc2V0MS0+YjEsICZjdXRiLCB3aG9sZV9yLCB3aG9sZV9nLCB3aG9sZV9iLCB3aG9sZV93KTsKCiAgICBpZiAoKG1heHIgPj0gbWF4ZykgJiYgKG1heHIgPj0gbWF4YikpIHsKCQlkaXIgPSBGSV9SR0JBX1JFRDsKCgkJaWYgKGN1dHIgPCAwKSB7CgkJCXJldHVybiBmYWxzZTsgLy8gY2FuJ3Qgc3BsaXQgdGhlIGJveAoJCX0KICAgIH0gZWxzZSBpZiAoKG1heGcgPj0gbWF4cikgJiYgKG1heGc+PW1heGIpKSB7CgkJZGlyID0gRklfUkdCQV9HUkVFTjsKCX0gZWxzZSB7CgkJZGlyID0gRklfUkdCQV9CTFVFOwoJfQoKCXNldDItPnIxID0gc2V0MS0+cjE7CiAgICBzZXQyLT5nMSA9IHNldDEtPmcxOwogICAgc2V0Mi0+YjEgPSBzZXQxLT5iMTsKCiAgICBzd2l0Y2ggKGRpcikgewoJCWNhc2UgRklfUkdCQV9SRUQ6CgkJCXNldDItPnIwID0gc2V0MS0+cjEgPSBjdXRyOwoJCQlzZXQyLT5nMCA9IHNldDEtPmcwOwoJCQlzZXQyLT5iMCA9IHNldDEtPmIwOwoJCQlicmVhazsKCgkJY2FzZSBGSV9SR0JBX0dSRUVOOgoJCQlzZXQyLT5nMCA9IHNldDEtPmcxID0gY3V0ZzsKCQkJc2V0Mi0+cjAgPSBzZXQxLT5yMDsKCQkJc2V0Mi0+YjAgPSBzZXQxLT5iMDsKCQkJYnJlYWs7CgoJCWNhc2UgRklfUkdCQV9CTFVFOgoJCQlzZXQyLT5iMCA9IHNldDEtPmIxID0gY3V0YjsKCQkJc2V0Mi0+cjAgPSBzZXQxLT5yMDsKCQkJc2V0Mi0+ZzAgPSBzZXQxLT5nMDsKCQkJYnJlYWs7CiAgICB9CgogICAgc2V0MS0+dm9sID0gKHNldDEtPnIxLXNldDEtPnIwKSooc2V0MS0+ZzEtc2V0MS0+ZzApKihzZXQxLT5iMS1zZXQxLT5iMCk7CiAgICBzZXQyLT52b2wgPSAoc2V0Mi0+cjEtc2V0Mi0+cjApKihzZXQyLT5nMS1zZXQyLT5nMCkqKHNldDItPmIxLXNldDItPmIwKTsKCiAgICByZXR1cm4gdHJ1ZTsKfQoKCnZvaWQKV3VRdWFudGl6ZXI6Ok1hcmsoQm94ICpjdWJlLCBpbnQgbGFiZWwsIEJZVEUgKnRhZykgewogICAgZm9yIChpbnQgciA9IGN1YmUtPnIwICsgMTsgciA8PSBjdWJlLT5yMTsgcisrKSB7CgkJZm9yIChpbnQgZyA9IGN1YmUtPmcwICsgMTsgZyA8PSBjdWJlLT5nMTsgZysrKSB7CgkJCWZvciAoaW50IGIgPSBjdWJlLT5iMCArIDE7IGIgPD0gY3ViZS0+YjE7IGIrKykgewoJCQkJdGFnW0lOREVYKHIsIGcsIGIpXSA9IChCWVRFKWxhYmVsOwoJCQl9CgkJfQoJfQp9CgovLyBXdSBRdWFudGl6YXRpb24gYWxnb3JpdGhtCkZJQklUTUFQICoKV3VRdWFudGl6ZXI6OlF1YW50aXplKGludCBQYWxldHRlU2l6ZSwgaW50IFJlc2VydmVTaXplLCBSR0JRVUFEICpSZXNlcnZlUGFsZXR0ZSkgewoJQllURSAqdGFnID0gTlVMTDsKCgl0cnkgewoJCUJveAljdWJlW01BWENPTE9SXTsKCQlpbnQJbmV4dDsKCQlMT05HIGksIHdlaWdodDsKCQlpbnQgazsKCQlmbG9hdCB2dltNQVhDT0xPUl0sIHRlbXA7CgkJCgkJLy8gQ29tcHV0ZSAzRCBoaXN0b2dyYW0KCgkJSGlzdDNEKHd0LCBtciwgbWcsIG1iLCBnbTIsIFJlc2VydmVTaXplLCBSZXNlcnZlUGFsZXR0ZSk7CgoJCS8vIENvbXB1dGUgbW9tZW50cwoKCQlNM0Qod3QsIG1yLCBtZywgbWIsIGdtMik7CgoJCWN1YmVbMF0ucjAgPSBjdWJlWzBdLmcwID0gY3ViZVswXS5iMCA9IDA7CgkJY3ViZVswXS5yMSA9IGN1YmVbMF0uZzEgPSBjdWJlWzBdLmIxID0gMzI7CgkJbmV4dCA9IDA7CgoJCWZvciAoaSA9IDE7IGkgPCBQYWxldHRlU2l6ZTsgaSsrKSB7CgkJCWlmKEN1dCgmY3ViZVtuZXh0XSwgJmN1YmVbaV0pKSB7CgkJCQkvLyB2b2x1bWUgdGVzdCBlbnN1cmVzIHdlIHdvbid0IHRyeSB0byBjdXQgb25lLWNlbGwgYm94CgkJCQl2dltuZXh0XSA9IChjdWJlW25leHRdLnZvbCA+IDEpID8gVmFyKCZjdWJlW25leHRdKSA6IDA7CgkJCQl2dltpXSA9IChjdWJlW2ldLnZvbCA+IDEpID8gVmFyKCZjdWJlW2ldKSA6IDA7CgkJCX0gZWxzZSB7CgkJCQkgIHZ2W25leHRdID0gMC4wOyAgIC8vIGRvbid0IHRyeSB0byBzcGxpdCB0aGlzIGJveCBhZ2FpbgoJCQkJICBpLS07ICAgICAgICAgICAgICAvLyBkaWRuJ3QgY3JlYXRlIGJveCBpCgkJCX0KCgkJCW5leHQgPSAwOyB0ZW1wID0gdnZbMF07CgoJCQlmb3IgKGsgPSAxOyBrIDw9IGk7IGsrKykgewoJCQkJaWYgKHZ2W2tdID4gdGVtcCkgewoJCQkJCXRlbXAgPSB2dltrXTsgbmV4dCA9IGs7CgkJCQl9CgkJCX0KCgkJCWlmICh0ZW1wIDw9IDAuMCkgewoJCQkJICBQYWxldHRlU2l6ZSA9IGkgKyAxOwoKCQkJCSAgLy8gRXJyb3I6ICJPbmx5IGdvdCAnUGFsZXR0ZVNpemUnIGJveGVzIgoKCQkJCSAgYnJlYWs7CgkJCX0KCQl9CgoJCS8vIFBhcnRpdGlvbiBkb25lCgoJCS8vIHRoZSBzcGFjZSBmb3IgYXJyYXkgZ20yIGNhbiBiZSBmcmVlZCBub3cKCgkJZnJlZShnbTIpOwoKCQlnbTIgPSBOVUxMOwoKCQkvLyBBbGxvY2F0ZSBhIG5ldyBkaWIKCgkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgOCk7CgoJCWlmIChuZXdfZGliID09IE5VTEwpIHsKCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKCQl9CgoJCS8vIGNyZWF0ZSBhbiBvcHRpbWl6ZWQgcGFsZXR0ZQoKCQlSR0JRVUFEICpuZXdfcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUobmV3X2RpYik7CgoJCXRhZyA9IChCWVRFKikgbWFsbG9jKDMzICogMzMgKiAzMyAqIHNpemVvZihCWVRFKSk7CgkJbWVtc2V0KHRhZywgMCwgMzMgKiAzMyAqIDMzICogc2l6ZW9mKEJZVEUpKTsKCgkJaWYgKHRhZyA9PSBOVUxMKSB7CgkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CgkJfQoKCQlmb3IgKGsgPSAwOyBrIDwgUGFsZXR0ZVNpemUgOyBrKyspIHsKCQkJTWFyaygmY3ViZVtrXSwgaywgdGFnKTsKCQkJd2VpZ2h0ID0gVm9sKCZjdWJlW2tdLCB3dCk7CgoJCQlpZiAod2VpZ2h0KSB7CgkJCQluZXdfcGFsW2tdLnJnYlJlZAk9IChCWVRFKSgoKGZsb2F0KVZvbCgmY3ViZVtrXSwgbXIpIC8gKGZsb2F0KXdlaWdodCkgKyAwLjVmKTsKCQkJCW5ld19wYWxba10ucmdiR3JlZW4gPSAoQllURSkoKChmbG9hdClWb2woJmN1YmVba10sIG1nKSAvIChmbG9hdCl3ZWlnaHQpICsgMC41Zik7CgkJCQluZXdfcGFsW2tdLnJnYkJsdWUJPSAoQllURSkoKChmbG9hdClWb2woJmN1YmVba10sIG1iKSAvIChmbG9hdCl3ZWlnaHQpICsgMC41Zik7CgkJCX0gZWxzZSB7CgkJCQkvLyBFcnJvcjogYm9ndXMgYm94ICdrJwoKCQkJCW5ld19wYWxba10ucmdiUmVkID0gbmV3X3BhbFtrXS5yZ2JHcmVlbiA9IG5ld19wYWxba10ucmdiQmx1ZSA9IDA7CQkKCQkJfQoJCX0KCgkJaW50IG5waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChuZXdfZGliKTsKCgkJZm9yIChXT1JEIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQkJQllURSAqbmV3X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhuZXdfZGliKSArICh5ICogbnBpdGNoKTsKCgkJCWZvciAoV09SRCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKCQkJCW5ld19iaXRzW3hdID0gdGFnW1FhZGRbeSp3aWR0aCArIHhdXTsKCQkJfQoJCX0KCgkJLy8gb3V0cHV0ICduZXdfcGFsJyBhcyBjb2xvciBsb29rLXVwIHRhYmxlIGNvbnRlbnRzLAoJCS8vICduZXdfYml0cycgYXMgdGhlIHF1YW50aXplZCBpbWFnZSAoYXJyYXkgb2YgdGFibGUgYWRkcmVzc2VzKS4KCgkJZnJlZSh0YWcpOwoKCQlyZXR1cm4gKEZJQklUTUFQKikgbmV3X2RpYjsKCX0gY2F0Y2goLi4uKSB7CgkJZnJlZSh0YWcpOwoJfQoKCXJldHVybiBOVUxMOwp9Cg==