Ci8qISBcZmlsZSBnaW1fdHJpX2NvbGxpc2lvbi5oClxhdXRob3IgRnJhbmNpc2NvIExlf24gTt9qZXJhCiovCi8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoaXMgc291cmNlIGZpbGUgaXMgcGFydCBvZiBHSU1QQUNUIExpYnJhcnkuCgpGb3IgdGhlIGxhdGVzdCBpbmZvLCBzZWUgaHR0cDovL2dpbXBhY3Quc291cmNlZm9yZ2UubmV0LwoKQ29weXJpZ2h0IChjKSAyMDA2IEZyYW5jaXNjbyBMZW9uIE5hamVyYS4gQy5DLiA4MDA4NzM3MS4KZW1haWw6IHByb2plY3RpbGVtYW5AeWFob28uY29tCgogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIGxpYnJhcnkgaW4gdGhlCiAgICAgICBmaWxlIEdJTVBBQ1QtTElDRU5TRS1MR1BMLlRYVC4KICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBsaWJyYXJ5IGluCiAgICAgICB0aGUgZmlsZSBHSU1QQUNULUxJQ0VOU0UtQlNELlRYVC4KICAgKDMpIFRoZSB6bGliL2xpYnBuZyBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIGxpYnJhcnkgaW4KICAgICAgIHRoZSBmaWxlIEdJTVBBQ1QtTElDRU5TRS1aTElCLlRYVC4KCiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKIEdJTVBBQ1QtTElDRU5TRS1MR1BMLlRYVCwgR0lNUEFDVC1MSUNFTlNFLVpMSUIuVFhUIGFuZCBHSU1QQUNULUxJQ0VOU0UtQlNELlRYVCBmb3IgbW9yZSBkZXRhaWxzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKi8KCiNpbmNsdWRlICJCdWxsZXRDb2xsaXNpb24vR2ltcGFjdC9naW1fdHJpX2NvbGxpc2lvbi5oIgoKCiNkZWZpbmUgVFJJX0xPQ0FMX0VQU0lMT04gMC4wMDAwMDFmCiNkZWZpbmUgTUlOX0VER0VfRURHRV9ESVMgMC4wMDAwMWYKCgpjbGFzcyBHSU1fVFJJQU5HTEVfQ0FMQ1VMQVRJT05fQ0FDSEUKewpwdWJsaWM6CglHUkVBTCBtYXJnaW47CQoJYnRWZWN0b3IzIHR1X3ZlcnRpY2VzWzNdOwoJYnRWZWN0b3IzIHR2X3ZlcnRpY2VzWzNdOwoJYnRWZWN0b3I0IHR1X3BsYW5lOwoJYnRWZWN0b3I0IHR2X3BsYW5lOwoJYnRWZWN0b3IzIGNsb3Nlc3RfcG9pbnRfdTsKCWJ0VmVjdG9yMyBjbG9zZXN0X3BvaW50X3Y7CglidFZlY3RvcjMgZWRnZV9lZGdlX2RpcjsKCWJ0VmVjdG9yMyBkaXN0YW5jZXM7CglHUkVBTCBkdVs0XTsKCUdSRUFMIGR1MGR1MTsKCUdSRUFMIGR1MGR1MjsKCUdSRUFMIGR2WzRdOwoJR1JFQUwgZHYwZHYxOwoJR1JFQUwgZHYwZHYyOwkKCWJ0VmVjdG9yMyB0ZW1wX3BvaW50c1tNQVhfVFJJX0NMSVBQSU5HXTsKCWJ0VmVjdG9yMyB0ZW1wX3BvaW50czFbTUFYX1RSSV9DTElQUElOR107CglidFZlY3RvcjMgY29udGFjdF9wb2ludHNbTUFYX1RSSV9DTElQUElOR107CgkKCgoJLy8hIGlmIHJldHVybnMgZmFsc2UsIHRoZSBmYWNlcyBhcmUgcGFyYWxlbGUKCVNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgY29tcHV0ZV9pbnRlcnZhbHMoCgkJCQkJY29uc3QgR1JFQUwgJkQwLAoJCQkJCWNvbnN0IEdSRUFMICZEMSwKCQkJCQljb25zdCBHUkVBTCAmRDIsCgkJCQkJY29uc3QgR1JFQUwgJkQwRDEsCgkJCQkJY29uc3QgR1JFQUwgJkQwRDIsCgkJCQkJR1JFQUwgJiBzY2FsZV9lZGdlMCwKCQkJCQlHUkVBTCAmIHNjYWxlX2VkZ2UxLAoJCQkJCUdVSU5UICZlZGdlX2luZGV4MCwKCQkJCQlHVUlOVCAmZWRnZV9pbmRleDEpCgl7CgkJaWYoRDBEMT4wLjBmKQoJCXsKCQkJLyogaGVyZSB3ZSBrbm93IHRoYXQgRDBEMjw9MC4wICovCgkJCS8qIHRoYXQgaXMgRDAsIEQxIGFyZSBvbiB0aGUgc2FtZSBzaWRlLCBEMiBvbiB0aGUgb3RoZXIgb3Igb24gdGhlIHBsYW5lICovCgkJCXNjYWxlX2VkZ2UwID0gLUQyLyhEMC1EMik7CgkJCXNjYWxlX2VkZ2UxID0gLUQxLyhEMi1EMSk7CgkJCWVkZ2VfaW5kZXgwID0gMjtlZGdlX2luZGV4MSA9IDE7CgkJfQoJCWVsc2UgaWYoRDBEMj4wLjBmKQoJCXsKCQkJLyogaGVyZSB3ZSBrbm93IHRoYXQgZDBkMTw9MC4wICovCgkJCXNjYWxlX2VkZ2UwID0gLUQwLyhEMS1EMCk7CgkJCXNjYWxlX2VkZ2UxID0gLUQxLyhEMi1EMSk7CgkJCWVkZ2VfaW5kZXgwID0gMDtlZGdlX2luZGV4MSA9IDE7CgkJfQoJCWVsc2UgaWYoRDEqRDI+MC4wZiB8fCBEMCE9MC4wZikKCQl7CgkJCS8qIGhlcmUgd2Uga25vdyB0aGF0IGQwZDE8PTAuMCBvciB0aGF0IEQwIT0wLjAgKi8KCQkJc2NhbGVfZWRnZTAgPSAtRDAvKEQxLUQwKTsKCQkJc2NhbGVfZWRnZTEgPSAtRDIvKEQwLUQyKTsKCQkJZWRnZV9pbmRleDAgPSAwIDtlZGdlX2luZGV4MSA9IDI7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgoKCS8vISBjbGlwIHRyaWFuZ2xlCgkvKiEKCSovCglTSU1EX0ZPUkNFX0lOTElORSBHVUlOVCBjbGlwX3RyaWFuZ2xlKAoJCWNvbnN0IGJ0VmVjdG9yNCAmIHRyaV9wbGFuZSwKCQljb25zdCBidFZlY3RvcjMgKiB0cmlwb2ludHMsCgkJY29uc3QgYnRWZWN0b3IzICogc3JjcG9pbnRzLAoJCWJ0VmVjdG9yMyAqIGNsaXBfcG9pbnRzKQoJewoJCS8vIGVkZ2UgMAoKCQlidFZlY3RvcjQgZWRnZXBsYW5lOwoKCQlFREdFX1BMQU5FKHRyaXBvaW50c1swXSx0cmlwb2ludHNbMV0sdHJpX3BsYW5lLGVkZ2VwbGFuZSk7CgoJCUdVSU5UIGNsaXBwZWRfY291bnQgPSBQTEFORV9DTElQX1RSSUFOR0xFM0QoCgkJCWVkZ2VwbGFuZSxzcmNwb2ludHNbMF0sc3JjcG9pbnRzWzFdLHNyY3BvaW50c1syXSx0ZW1wX3BvaW50cyk7CgoJCWlmKGNsaXBwZWRfY291bnQgPT0gMCkgcmV0dXJuIDA7CgoJCS8vIGVkZ2UgMQoKCQlFREdFX1BMQU5FKHRyaXBvaW50c1sxXSx0cmlwb2ludHNbMl0sdHJpX3BsYW5lLGVkZ2VwbGFuZSk7CgoJCWNsaXBwZWRfY291bnQgPSBQTEFORV9DTElQX1BPTFlHT04zRCgKCQkJZWRnZXBsYW5lLHRlbXBfcG9pbnRzLGNsaXBwZWRfY291bnQsdGVtcF9wb2ludHMxKTsKCgkJaWYoY2xpcHBlZF9jb3VudCA9PSAwKSByZXR1cm4gMDsKCgkJLy8gZWRnZSAyCgoJCUVER0VfUExBTkUodHJpcG9pbnRzWzJdLHRyaXBvaW50c1swXSx0cmlfcGxhbmUsZWRnZXBsYW5lKTsKCgkJY2xpcHBlZF9jb3VudCA9IFBMQU5FX0NMSVBfUE9MWUdPTjNEKAoJCQllZGdlcGxhbmUsdGVtcF9wb2ludHMxLGNsaXBwZWRfY291bnQsY2xpcF9wb2ludHMpOwoKCQlyZXR1cm4gY2xpcHBlZF9jb3VudDsKCgoJCS8qR1VJTlQgaTAgPSAodHJpX3BsYW5lLmNsb3Nlc3RBeGlzKCkrMSklMzsKCQlHVUlOVCBpMSA9IChpMCsxKSUzOwoJCS8vIGVkZ2UgMAoJCWJ0VmVjdG9yMyB0ZW1wX3BvaW50c1tNQVhfVFJJX0NMSVBQSU5HXTsKCQlidFZlY3RvcjMgdGVtcF9wb2ludHMxW01BWF9UUklfQ0xJUFBJTkddOwoKCQlHVUlOVCBjbGlwcGVkX2NvdW50PSBQTEFORV9DTElQX1RSSUFOR0xFX0dFTkVSSUMoCgkJCTAsc3JjcG9pbnRzWzBdLHNyY3BvaW50c1sxXSxzcmNwb2ludHNbMl0sdGVtcF9wb2ludHMsCgkJCURJU1RBTkNFX0VER0UodHJpcG9pbnRzWzBdLHRyaXBvaW50c1sxXSxpMCxpMSkpOwoJCQoJCQoJCWlmKGNsaXBwZWRfY291bnQgPT0gMCkgcmV0dXJuIDA7CgoJCS8vIGVkZ2UgMQoJCWNsaXBwZWRfY291bnQgPSBQTEFORV9DTElQX1BPTFlHT05fR0VORVJJQygKCQkJMCx0ZW1wX3BvaW50cyxjbGlwcGVkX2NvdW50LHRlbXBfcG9pbnRzMSwKCQkJRElTVEFOQ0VfRURHRSh0cmlwb2ludHNbMV0sdHJpcG9pbnRzWzJdLGkwLGkxKSk7CgoJCWlmKGNsaXBwZWRfY291bnQgPT0gMCkgcmV0dXJuIDA7CgoJCS8vIGVkZ2UgMgoJCWNsaXBwZWRfY291bnQgPSBQTEFORV9DTElQX1BPTFlHT05fR0VORVJJQygKCQkJMCx0ZW1wX3BvaW50czEsY2xpcHBlZF9jb3VudCxjbGlwcGVkX3BvaW50cywKCQkJRElTVEFOQ0VfRURHRSh0cmlwb2ludHNbMl0sdHJpcG9pbnRzWzBdLGkwLGkxKSk7CgoJCXJldHVybiBjbGlwcGVkX2NvdW50OyovCgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCBzb3J0X2lzZWN0KAoJCUdSRUFMICYgaXNlY3QwLEdSRUFMICYgaXNlY3QxLEdVSU5UICZlMCxHVUlOVCAmZTEsYnRWZWN0b3IzICYgdmVjMCxidFZlY3RvcjMgJiB2ZWMxKQoJewoJCWlmKGlzZWN0MTxpc2VjdDApCgkJewoJCQkvL3N3YXAKCQkJR0lNX1NXQVBfTlVNQkVSUyhpc2VjdDAsaXNlY3QxKTsKCQkJR0lNX1NXQVBfTlVNQkVSUyhlMCxlMSk7CgkJCWJ0VmVjdG9yMyB0bXAgPSB2ZWMwOwoJCQl2ZWMwID0gdmVjMTsKCQkJdmVjMSA9IHRtcDsKCQl9Cgl9CgoJLy8hIFRlc3QgdmVyaWZ5aW5nIGludGVydmFsIGludGVyc2VjdGlvbiB3aXRoIHRoZSBkaXJlY3Rpb24gYmV0d2VlbiBwbGFuZXMKCS8qIQoJXHByZSB0dl9wbGFuZSBhbmQgdHVfcGxhbmUgbXVzdCBiZSBzZXQKCVxwb3N0CglkaXN0YW5jZXNbMl0gaXMgc2V0IHdpdGggdGhlIGRpc3RhbmNlCgljbG9zZXN0X3BvaW50X3UsIGNsb3Nlc3RfcG9pbnRfdiwgZWRnZV9lZGdlX2RpciBhcmUgc2V0IHRvbwoJXHJldHVybgoJLSAwOiBmYWNlcyBhcmUgcGFyYWxlbGUKCS0gMTogZmFjZSBVIGNhc3RzIGZhY2UgVgoJLSAyOiBmYWNlIFYgY2FzdHMgZmFjZSBVCgktIDM6IG5lYXJlc3QgZWRnZXMKCSovCglTSU1EX0ZPUkNFX0lOTElORSBHVUlOVCBjcm9zc19saW5lX2ludGVyc2VjdGlvbl90ZXN0KCkKCXsKCQkvLyBDb21wdXRlIGRpcmVjdGlvbiBvZiBpbnRlcnNlY3Rpb24gbGluZQoJCWVkZ2VfZWRnZV9kaXIgPSB0dV9wbGFuZS5jcm9zcyh0dl9wbGFuZSk7CgkJR1JFQUwgRGxlbjsKCQlWRUNfTEVOR1RIKGVkZ2VfZWRnZV9kaXIsRGxlbik7CgoJCWlmKERsZW48MC4wMDAxKQoJCXsKCQkJcmV0dXJuIDA7IC8vZmFjZXMgbmVhciBwYXJhbGVsZQoJCX0KCgkJZWRnZV9lZGdlX2Rpcio9IDEvRGxlbjsvL25vcm1hbGl6ZQoKCgkJLy8gQ29tcHV0ZSBpbnRlcnZhbCBmb3IgdHJpYW5nbGUgMQoJCUdVSU5UIHR1X2UwLHR1X2UxOy8vZWRnZSBpbmRpY2VzCgkJR1JFQUwgdHVfc2NhbGVfZTAsdHVfc2NhbGVfZTE7Ly9lZGdlIHNjYWxlCgkJaWYoIWNvbXB1dGVfaW50ZXJ2YWxzKGR1WzBdLGR1WzFdLGR1WzJdLAoJCQlkdTBkdTEsZHUwZHUyLHR1X3NjYWxlX2UwLHR1X3NjYWxlX2UxLHR1X2UwLHR1X2UxKSkgcmV0dXJuIDA7CgoJCS8vIENvbXB1dGUgaW50ZXJ2YWwgZm9yIHRyaWFuZ2xlIDIKCQlHVUlOVCB0dl9lMCx0dl9lMTsvL2VkZ2UgaW5kaWNlcwoJCUdSRUFMIHR2X3NjYWxlX2UwLHR2X3NjYWxlX2UxOy8vZWRnZSBzY2FsZQoKCQlpZighY29tcHV0ZV9pbnRlcnZhbHMoZHZbMF0sZHZbMV0sZHZbMl0sCgkJCWR2MGR2MSxkdjBkdjIsdHZfc2NhbGVfZTAsdHZfc2NhbGVfZTEsdHZfZTAsdHZfZTEpKSByZXR1cm4gMDsKCgkJLy9wcm95ZWN0ZWQgdmVydGljZXMKCQlidFZlY3RvcjMgdXBfZTAgPSB0dV92ZXJ0aWNlc1t0dV9lMF0ubGVycCh0dV92ZXJ0aWNlc1sodHVfZTArMSklM10sdHVfc2NhbGVfZTApOwoJCWJ0VmVjdG9yMyB1cF9lMSA9IHR1X3ZlcnRpY2VzW3R1X2UxXS5sZXJwKHR1X3ZlcnRpY2VzWyh0dV9lMSsxKSUzXSx0dV9zY2FsZV9lMSk7CgoJCWJ0VmVjdG9yMyB2cF9lMCA9IHR2X3ZlcnRpY2VzW3R2X2UwXS5sZXJwKHR2X3ZlcnRpY2VzWyh0dl9lMCsxKSUzXSx0dl9zY2FsZV9lMCk7CgkJYnRWZWN0b3IzIHZwX2UxID0gdHZfdmVydGljZXNbdHZfZTFdLmxlcnAodHZfdmVydGljZXNbKHR2X2UxKzEpJTNdLHR2X3NjYWxlX2UxKTsKCgkJLy9wcm95ZWN0ZWQgaW50ZXJ2YWxzCgkJR1JFQUwgaXNlY3RfdVtdID0ge3VwX2UwLmRvdChlZGdlX2VkZ2VfZGlyKSx1cF9lMS5kb3QoZWRnZV9lZGdlX2Rpcil9OwoJCUdSRUFMIGlzZWN0X3ZbXSA9IHt2cF9lMC5kb3QoZWRnZV9lZGdlX2RpciksdnBfZTEuZG90KGVkZ2VfZWRnZV9kaXIpfTsKCgkJc29ydF9pc2VjdChpc2VjdF91WzBdLGlzZWN0X3VbMV0sdHVfZTAsdHVfZTEsdXBfZTAsdXBfZTEpOwoJCXNvcnRfaXNlY3QoaXNlY3RfdlswXSxpc2VjdF92WzFdLHR2X2UwLHR2X2UxLHZwX2UwLHZwX2UxKTsKCgkJY29uc3QgR1JFQUwgbWlkcG9pbnRfdSA9IDAuNWYqKGlzZWN0X3VbMF0raXNlY3RfdVsxXSk7IC8vIG1pZHBvaW50CgkJY29uc3QgR1JFQUwgbWlkcG9pbnRfdiA9IDAuNWYqKGlzZWN0X3ZbMF0raXNlY3RfdlsxXSk7IC8vIG1pZHBvaW50CgoJCWlmKG1pZHBvaW50X3U8bWlkcG9pbnRfdikKCQl7CgkJCWlmKGlzZWN0X3VbMV0+PWlzZWN0X3ZbMV0pIC8vIGZhY2UgVSBjYXN0cyBmYWNlIFYKCQkJewoJCQkJcmV0dXJuIDE7CgkJCX0KCQkJZWxzZSBpZihpc2VjdF92WzBdPD1pc2VjdF91WzBdKSAvLyBmYWNlIFYgY2FzdHMgZmFjZSBVCgkJCXsKCQkJCXJldHVybiAyOwoJCQl9CgkJCS8vIGNsb3Nlc3QgcG9pbnRzCgkJCWNsb3Nlc3RfcG9pbnRfdSA9IHVwX2UxOwoJCQljbG9zZXN0X3BvaW50X3YgPSB2cF9lMDsKCQkJLy8gY2FsYyBlZGdlcyBhbmQgc2VwYXJhdGlvbgoKCQkJaWYoaXNlY3RfdVsxXSsgTUlOX0VER0VfRURHRV9ESVM8aXNlY3RfdlswXSkgLy9jYWxjIGRpc3RhbmNlIGJldHdlZW4gdHdvIGxpbmVzIGluc3RlYWQKCQkJewoJCQkJU0VHTUVOVF9DT0xMSVNJT04oCgkJCQkJdHVfdmVydGljZXNbdHVfZTFdLHR1X3ZlcnRpY2VzWyh0dV9lMSsxKSUzXSwKCQkJCQl0dl92ZXJ0aWNlc1t0dl9lMF0sdHZfdmVydGljZXNbKHR2X2UwKzEpJTNdLAoJCQkJCWNsb3Nlc3RfcG9pbnRfdSwKCQkJCQljbG9zZXN0X3BvaW50X3YpOwoKCQkJCWVkZ2VfZWRnZV9kaXIgPSBjbG9zZXN0X3BvaW50X3UtY2xvc2VzdF9wb2ludF92OwoJCQkJVkVDX0xFTkdUSChlZGdlX2VkZ2VfZGlyLGRpc3RhbmNlc1syXSk7CgkJCQllZGdlX2VkZ2VfZGlyICo9IDEuMGYvZGlzdGFuY2VzWzJdOy8vIG5vcm1hbGl6ZQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZGlzdGFuY2VzWzJdID0gaXNlY3RfdlswXS1pc2VjdF91WzFdOy8vZGlzdGFuY2UgbmVnYXRpdmUKCQkJCS8vZWRnZV9lZGdlX2RpciAqPSAtMS4wZjsgLy9ub3JtYWwgcG9pbnRpbmcgZnJvbSBWIHRvIFUKCQkJfQoKCQl9CgkJZWxzZQoJCXsKCQkJaWYoaXNlY3RfdlsxXT49aXNlY3RfdVsxXSkgLy8gZmFjZSBWIGNhc3RzIGZhY2UgVQoJCQl7CgkJCQlyZXR1cm4gMjsKCQkJfQoJCQllbHNlIGlmKGlzZWN0X3VbMF08PWlzZWN0X3ZbMF0pIC8vIGZhY2UgVSBjYXN0cyBmYWNlIFYKCQkJewoJCQkJcmV0dXJuIDE7CgkJCX0KCQkJLy8gY2xvc2VzdCBwb2ludHMKCQkJY2xvc2VzdF9wb2ludF91ID0gdXBfZTA7CgkJCWNsb3Nlc3RfcG9pbnRfdiA9IHZwX2UxOwoJCQkvLyBjYWxjIGVkZ2VzIGFuZCBzZXBhcmF0aW9uCgoJCQlpZihpc2VjdF92WzFdK01JTl9FREdFX0VER0VfRElTPGlzZWN0X3VbMF0pIC8vY2FsYyBkaXN0YW5jZSBiZXR3ZWVuIHR3byBsaW5lcyBpbnN0ZWFkCgkJCXsKCQkJCVNFR01FTlRfQ09MTElTSU9OKAoJCQkJCXR1X3ZlcnRpY2VzW3R1X2UwXSx0dV92ZXJ0aWNlc1sodHVfZTArMSklM10sCgkJCQkJdHZfdmVydGljZXNbdHZfZTFdLHR2X3ZlcnRpY2VzWyh0dl9lMSsxKSUzXSwKCQkJCQljbG9zZXN0X3BvaW50X3UsCgkJCQkJY2xvc2VzdF9wb2ludF92KTsKCgkJCQllZGdlX2VkZ2VfZGlyID0gY2xvc2VzdF9wb2ludF91LWNsb3Nlc3RfcG9pbnRfdjsKCQkJCVZFQ19MRU5HVEgoZWRnZV9lZGdlX2RpcixkaXN0YW5jZXNbMl0pOwoJCQkJZWRnZV9lZGdlX2RpciAqPSAxLjBmL2Rpc3RhbmNlc1syXTsvLyBub3JtYWxpemUKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRpc3RhbmNlc1syXSA9IGlzZWN0X3VbMF0taXNlY3RfdlsxXTsvL2Rpc3RhbmNlIG5lZ2F0aXZlCgkJCQkvL2VkZ2VfZWRnZV9kaXIgKj0gLTEuMGY7IC8vbm9ybWFsIHBvaW50aW5nIGZyb20gViB0byBVCgkJCX0KCQl9CgkJcmV0dXJuIDM7Cgl9CgoKCS8vISBjb2xsaWRlcyBieSB0d28gc2lkZXMKCVNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgdHJpYW5nbGVfY29sbGlzaW9uKAoJCQkJCWNvbnN0IGJ0VmVjdG9yMyAmIHUwLAoJCQkJCWNvbnN0IGJ0VmVjdG9yMyAmIHUxLAoJCQkJCWNvbnN0IGJ0VmVjdG9yMyAmIHUyLAoJCQkJCUdSRUFMIG1hcmdpbl91LAoJCQkJCWNvbnN0IGJ0VmVjdG9yMyAmIHYwLAoJCQkJCWNvbnN0IGJ0VmVjdG9yMyAmIHYxLAoJCQkJCWNvbnN0IGJ0VmVjdG9yMyAmIHYyLAoJCQkJCUdSRUFMIG1hcmdpbl92LAoJCQkJCUdJTV9UUklBTkdMRV9DT05UQUNUX0RBVEEgJiBjb250YWN0cykKCXsKCgkJbWFyZ2luID0gbWFyZ2luX3UgKyBtYXJnaW5fdjsKCgkJdHVfdmVydGljZXNbMF0gPSB1MDsKCQl0dV92ZXJ0aWNlc1sxXSA9IHUxOwoJCXR1X3ZlcnRpY2VzWzJdID0gdTI7CgoJCXR2X3ZlcnRpY2VzWzBdID0gdjA7CgkJdHZfdmVydGljZXNbMV0gPSB2MTsKCQl0dl92ZXJ0aWNlc1syXSA9IHYyOwoKCQkvL2NyZWF0ZSBwbGFuZXMKCQkvLyBwbGFuZSB2IHZzIFUgcG9pbnRzCgoJCVRSSUFOR0xFX1BMQU5FKHR2X3ZlcnRpY2VzWzBdLHR2X3ZlcnRpY2VzWzFdLHR2X3ZlcnRpY2VzWzJdLHR2X3BsYW5lKTsKCgkJZHVbMF0gPSBESVNUQU5DRV9QTEFORV9QT0lOVCh0dl9wbGFuZSx0dV92ZXJ0aWNlc1swXSk7CgkJZHVbMV0gPSBESVNUQU5DRV9QTEFORV9QT0lOVCh0dl9wbGFuZSx0dV92ZXJ0aWNlc1sxXSk7CgkJZHVbMl0gPSBESVNUQU5DRV9QTEFORV9QT0lOVCh0dl9wbGFuZSx0dV92ZXJ0aWNlc1syXSk7CgoKCQlkdTBkdTEgPSBkdVswXSAqIGR1WzFdOwoJCWR1MGR1MiA9IGR1WzBdICogZHVbMl07CgoKCQlpZihkdTBkdTE+MC4wZiAmJiBkdTBkdTI+MC4wZikJLy8gc2FtZSBzaWduIG9uIGFsbCBvZiB0aGVtICsgbm90IGVxdWFsIDAgPwoJCXsKCQkJaWYoZHVbMF08MCkgLy93ZSBuZWVkIHRlc3QgYmVoaW5kIHRoZSB0cmlhbmdsZSBwbGFuZQoJCQl7CgkJCQlkaXN0YW5jZXNbMF0gPSBHSU1fTUFYMyhkdVswXSxkdVsxXSxkdVsyXSk7CgkJCQlkaXN0YW5jZXNbMF0gPSAtZGlzdGFuY2VzWzBdOwoJCQkJaWYoZGlzdGFuY2VzWzBdPm1hcmdpbikgcmV0dXJuIGZhbHNlOyAvL25ldmVyIGludGVyc2VjdAoKCQkJCS8vcmVvcmRlciB0cmlhbmdsZSB2CgkJCQlWRUNfU1dBUCh0dl92ZXJ0aWNlc1swXSx0dl92ZXJ0aWNlc1sxXSk7CgkJCQlWRUNfU0NBTEVfNCh0dl9wbGFuZSwtMS4wZix0dl9wbGFuZSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkaXN0YW5jZXNbMF0gPSBHSU1fTUlOMyhkdVswXSxkdVsxXSxkdVsyXSk7CgkJCQlpZihkaXN0YW5jZXNbMF0+bWFyZ2luKSByZXR1cm4gZmFsc2U7IC8vbmV2ZXIgaW50ZXJzZWN0CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJLy9Mb29rIGlmIHdlIG5lZWQgdG8gaW52ZXJ0IHRoZSB0cmlhbmdsZQoJCQlkaXN0YW5jZXNbMF0gPSAoZHVbMF0rZHVbMV0rZHVbMl0pLzMuMGY7IC8vY2VudHJvaWQKCgkJCWlmKGRpc3RhbmNlc1swXTwwLjBmKQoJCQl7CgkJCQkvL3Jlb3JkZXIgdHJpYW5nbGUgdgoJCQkJVkVDX1NXQVAodHZfdmVydGljZXNbMF0sdHZfdmVydGljZXNbMV0pOwoJCQkJVkVDX1NDQUxFXzQodHZfcGxhbmUsLTEuMGYsdHZfcGxhbmUpOwoKCQkJCWRpc3RhbmNlc1swXSA9IEdJTV9NQVgzKGR1WzBdLGR1WzFdLGR1WzJdKTsKCQkJCWRpc3RhbmNlc1swXSA9IC1kaXN0YW5jZXNbMF07CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkaXN0YW5jZXNbMF0gPSBHSU1fTUlOMyhkdVswXSxkdVsxXSxkdVsyXSk7CgkJCX0KCQl9CgoKCQkvLyBwbGFuZSBVIHZzIFYgcG9pbnRzCgoJCVRSSUFOR0xFX1BMQU5FKHR1X3ZlcnRpY2VzWzBdLHR1X3ZlcnRpY2VzWzFdLHR1X3ZlcnRpY2VzWzJdLHR1X3BsYW5lKTsKCgkJZHZbMF0gPSBESVNUQU5DRV9QTEFORV9QT0lOVCh0dV9wbGFuZSx0dl92ZXJ0aWNlc1swXSk7CgkJZHZbMV0gPSBESVNUQU5DRV9QTEFORV9QT0lOVCh0dV9wbGFuZSx0dl92ZXJ0aWNlc1sxXSk7CgkJZHZbMl0gPSBESVNUQU5DRV9QTEFORV9QT0lOVCh0dV9wbGFuZSx0dl92ZXJ0aWNlc1syXSk7CgoJCWR2MGR2MSA9IGR2WzBdICogZHZbMV07CgkJZHYwZHYyID0gZHZbMF0gKiBkdlsyXTsKCgoJCWlmKGR2MGR2MT4wLjBmICYmIGR2MGR2Mj4wLjBmKQkvLyBzYW1lIHNpZ24gb24gYWxsIG9mIHRoZW0gKyBub3QgZXF1YWwgMCA/CgkJewoJCQlpZihkdlswXTwwKSAvL3dlIG5lZWQgdGVzdCBiZWhpbmQgdGhlIHRyaWFuZ2xlIHBsYW5lCgkJCXsKCQkJCWRpc3RhbmNlc1sxXSA9IEdJTV9NQVgzKGR2WzBdLGR2WzFdLGR2WzJdKTsKCQkJCWRpc3RhbmNlc1sxXSA9IC1kaXN0YW5jZXNbMV07CgkJCQlpZihkaXN0YW5jZXNbMV0+bWFyZ2luKSByZXR1cm4gZmFsc2U7IC8vbmV2ZXIgaW50ZXJzZWN0CgoJCQkJLy9yZW9yZGVyIHRyaWFuZ2xlIHUKCQkJCVZFQ19TV0FQKHR1X3ZlcnRpY2VzWzBdLHR1X3ZlcnRpY2VzWzFdKTsKCQkJCVZFQ19TQ0FMRV80KHR1X3BsYW5lLC0xLjBmLHR1X3BsYW5lKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRpc3RhbmNlc1sxXSA9IEdJTV9NSU4zKGR2WzBdLGR2WzFdLGR2WzJdKTsKCQkJCWlmKGRpc3RhbmNlc1sxXT5tYXJnaW4pIHJldHVybiBmYWxzZTsgLy9uZXZlciBpbnRlcnNlY3QKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkvL0xvb2sgaWYgd2UgbmVlZCB0byBpbnZlcnQgdGhlIHRyaWFuZ2xlCgkJCWRpc3RhbmNlc1sxXSA9IChkdlswXStkdlsxXStkdlsyXSkvMy4wZjsgLy9jZW50cm9pZAoKCQkJaWYoZGlzdGFuY2VzWzFdPDAuMGYpCgkJCXsKCQkJCS8vcmVvcmRlciB0cmlhbmdsZSB2CgkJCQlWRUNfU1dBUCh0dV92ZXJ0aWNlc1swXSx0dV92ZXJ0aWNlc1sxXSk7CgkJCQlWRUNfU0NBTEVfNCh0dV9wbGFuZSwtMS4wZix0dV9wbGFuZSk7CgoJCQkJZGlzdGFuY2VzWzFdID0gR0lNX01BWDMoZHZbMF0sZHZbMV0sZHZbMl0pOwoJCQkJZGlzdGFuY2VzWzFdID0gLWRpc3RhbmNlc1sxXTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRpc3RhbmNlc1sxXSA9IEdJTV9NSU4zKGR2WzBdLGR2WzFdLGR2WzJdKTsKCQkJfQoJCX0KCgkJR1VJTlQgYmw7CgkJLyogYmwgPSBjcm9zc19saW5lX2ludGVyc2VjdGlvbl90ZXN0KCk7CgkJaWYoYmw9PTMpCgkJewoJCQkvL3Rha2UgZWRnZSBkaXJlY3Rpb24gdG9vCgkJCWJsID0gZGlzdGFuY2VzLm1heEF4aXMoKTsKCQl9CgkJZWxzZQoJCXsqLwoJCQlibCA9IDA7CgkJCWlmKGRpc3RhbmNlc1swXTxkaXN0YW5jZXNbMV0pIGJsID0gMTsKCQkvL30KCgkJaWYoYmw9PTIpIC8vZWRnZSBlZGdlIHNlcGFyYXRpb24KCQl7CgkJCWlmKGRpc3RhbmNlc1syXT5tYXJnaW4pIHJldHVybiBmYWxzZTsKCgkJCWNvbnRhY3RzLm1fcGVuZXRyYXRpb25fZGVwdGggPSAtZGlzdGFuY2VzWzJdICsgbWFyZ2luOwoJCQljb250YWN0cy5tX3BvaW50c1swXSA9IGNsb3Nlc3RfcG9pbnRfdjsKCQkJY29udGFjdHMubV9wb2ludF9jb3VudCA9IDE7CgkJCVZFQ19DT1BZKGNvbnRhY3RzLm1fc2VwYXJhdGluZ19ub3JtYWwsZWRnZV9lZGdlX2Rpcik7CgoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCS8vY2xpcCBmYWNlIGFnYWluc3Qgb3RoZXIKCgkJCgkJR1VJTlQgcG9pbnRfY291bnQ7CgkJLy9UT0RPCgkJaWYoYmwgPT0gMCkgLy9jbGlwIFUgcG9pbnRzIGFnYWluc3QgVgoJCXsKCQkJcG9pbnRfY291bnQgPSBjbGlwX3RyaWFuZ2xlKHR2X3BsYW5lLHR2X3ZlcnRpY2VzLHR1X3ZlcnRpY2VzLGNvbnRhY3RfcG9pbnRzKTsKCQkJaWYocG9pbnRfY291bnQgPT0gMCkgcmV0dXJuIGZhbHNlOwkJCQkJCQoJCQljb250YWN0cy5tZXJnZV9wb2ludHModHZfcGxhbmUsbWFyZ2luLGNvbnRhY3RfcG9pbnRzLHBvaW50X2NvdW50KTsJCQkKCQl9CgkJZWxzZSAvL2NsaXAgViBwb2ludHMgYWdhaW5zdCBVCgkJewoJCQlwb2ludF9jb3VudCA9IGNsaXBfdHJpYW5nbGUodHVfcGxhbmUsdHVfdmVydGljZXMsdHZfdmVydGljZXMsY29udGFjdF9wb2ludHMpOwoJCQlpZihwb2ludF9jb3VudCA9PSAwKSByZXR1cm4gZmFsc2U7CQkJCgkJCWNvbnRhY3RzLm1lcmdlX3BvaW50cyh0dV9wbGFuZSxtYXJnaW4sY29udGFjdF9wb2ludHMscG9pbnRfY291bnQpOwoJCQljb250YWN0cy5tX3NlcGFyYXRpbmdfbm9ybWFsICo9IC0xLmY7CgkJfQoJCWlmKGNvbnRhY3RzLm1fcG9pbnRfY291bnQgPT0gMCkgcmV0dXJuIGZhbHNlOwoJCXJldHVybiB0cnVlOwoJfQoKfTsKCgovKmNsYXNzIEdJTV9UUklBTkdMRV9DQUxDVUxBVElPTl9DQUNIRQp7CnB1YmxpYzoKCUdSRUFMIG1hcmdpbjsKCUdVSU5UIGNsaXBwZWRfY291bnQ7CglidFZlY3RvcjMgdHVfdmVydGljZXNbM107CglidFZlY3RvcjMgdHZfdmVydGljZXNbM107CglidFZlY3RvcjMgdGVtcF9wb2ludHNbTUFYX1RSSV9DTElQUElOR107CglidFZlY3RvcjMgdGVtcF9wb2ludHMxW01BWF9UUklfQ0xJUFBJTkddOwoJYnRWZWN0b3IzIGNsaXBwZWRfcG9pbnRzW01BWF9UUklfQ0xJUFBJTkddOwoJR0lNX1RSSUFOR0xFX0NPTlRBQ1RfREFUQSBjb250YWN0czE7CglHSU1fVFJJQU5HTEVfQ09OVEFDVF9EQVRBIGNvbnRhY3RzMjsKCgoJLy8hIGNsaXAgdHJpYW5nbGUKCUdVSU5UIGNsaXBfdHJpYW5nbGUoCgkJY29uc3QgYnRWZWN0b3I0ICYgdHJpX3BsYW5lLAoJCWNvbnN0IGJ0VmVjdG9yMyAqIHRyaXBvaW50cywKCQljb25zdCBidFZlY3RvcjMgKiBzcmNwb2ludHMsCgkJYnRWZWN0b3IzICogY2xpcHBlZF9wb2ludHMpCgl7CgkJLy8gZWRnZSAwCgoJCWJ0VmVjdG9yNCBlZGdlcGxhbmU7CgoJCUVER0VfUExBTkUodHJpcG9pbnRzWzBdLHRyaXBvaW50c1sxXSx0cmlfcGxhbmUsZWRnZXBsYW5lKTsKCgkJR1VJTlQgY2xpcHBlZF9jb3VudCA9IFBMQU5FX0NMSVBfVFJJQU5HTEUzRCgKCQkJZWRnZXBsYW5lLHNyY3BvaW50c1swXSxzcmNwb2ludHNbMV0sc3JjcG9pbnRzWzJdLHRlbXBfcG9pbnRzKTsKCgkJaWYoY2xpcHBlZF9jb3VudCA9PSAwKSByZXR1cm4gMDsKCgkJLy8gZWRnZSAxCgoJCUVER0VfUExBTkUodHJpcG9pbnRzWzFdLHRyaXBvaW50c1syXSx0cmlfcGxhbmUsZWRnZXBsYW5lKTsKCgkJY2xpcHBlZF9jb3VudCA9IFBMQU5FX0NMSVBfUE9MWUdPTjNEKAoJCQllZGdlcGxhbmUsdGVtcF9wb2ludHMsY2xpcHBlZF9jb3VudCx0ZW1wX3BvaW50czEpOwoKCQlpZihjbGlwcGVkX2NvdW50ID09IDApIHJldHVybiAwOwoKCQkvLyBlZGdlIDIKCgkJRURHRV9QTEFORSh0cmlwb2ludHNbMl0sdHJpcG9pbnRzWzBdLHRyaV9wbGFuZSxlZGdlcGxhbmUpOwoKCQljbGlwcGVkX2NvdW50ID0gUExBTkVfQ0xJUF9QT0xZR09OM0QoCgkJCWVkZ2VwbGFuZSx0ZW1wX3BvaW50czEsY2xpcHBlZF9jb3VudCxjbGlwcGVkX3BvaW50cyk7CgoJCXJldHVybiBjbGlwcGVkX2NvdW50OwoJfQoKCgoKCS8vISBjb2xsaWRlcyBvbmx5IG9uIG9uZSBzaWRlCglib29sIHRyaWFuZ2xlX2NvbGxpc2lvbigKCQkJCQljb25zdCBidFZlY3RvcjMgJiB1MCwKCQkJCQljb25zdCBidFZlY3RvcjMgJiB1MSwKCQkJCQljb25zdCBidFZlY3RvcjMgJiB1MiwKCQkJCQlHUkVBTCBtYXJnaW5fdSwKCQkJCQljb25zdCBidFZlY3RvcjMgJiB2MCwKCQkJCQljb25zdCBidFZlY3RvcjMgJiB2MSwKCQkJCQljb25zdCBidFZlY3RvcjMgJiB2MiwKCQkJCQlHUkVBTCBtYXJnaW5fdiwKCQkJCQlHSU1fVFJJQU5HTEVfQ09OVEFDVF9EQVRBICYgY29udGFjdHMpCgl7CgoJCW1hcmdpbiA9IG1hcmdpbl91ICsgbWFyZ2luX3Y7CgoJCQoJCXR1X3ZlcnRpY2VzWzBdID0gdTA7CgkJdHVfdmVydGljZXNbMV0gPSB1MTsKCQl0dV92ZXJ0aWNlc1syXSA9IHUyOwoKCQl0dl92ZXJ0aWNlc1swXSA9IHYwOwoJCXR2X3ZlcnRpY2VzWzFdID0gdjE7CgkJdHZfdmVydGljZXNbMl0gPSB2MjsKCgkJLy9jcmVhdGUgcGxhbmVzCgkJLy8gcGxhbmUgdiB2cyBVIHBvaW50cwoKCgkJVFJJQU5HTEVfUExBTkUodHZfdmVydGljZXNbMF0sdHZfdmVydGljZXNbMV0sdHZfdmVydGljZXNbMl0sY29udGFjdHMxLm1fc2VwYXJhdGluZ19ub3JtYWwpOwoKCQljbGlwcGVkX2NvdW50ID0gY2xpcF90cmlhbmdsZSgKCQkJY29udGFjdHMxLm1fc2VwYXJhdGluZ19ub3JtYWwsdHZfdmVydGljZXMsdHVfdmVydGljZXMsY2xpcHBlZF9wb2ludHMpOwoKCQlpZihjbGlwcGVkX2NvdW50ID09IDAgKQoJCXsKCQkJIHJldHVybiBmYWxzZTsvL1JlamVjdAoJCX0KCgkJLy9maW5kIG1vc3QgZGVlcCBpbnRlcnZhbCBmYWNlMQoJCWNvbnRhY3RzMS5tZXJnZV9wb2ludHMoY29udGFjdHMxLm1fc2VwYXJhdGluZ19ub3JtYWwsbWFyZ2luLGNsaXBwZWRfcG9pbnRzLGNsaXBwZWRfY291bnQpOwoJCWlmKGNvbnRhY3RzMS5tX3BvaW50X2NvdW50ID09IDApIHJldHVybiBmYWxzZTsgLy8gdG9vIGZhcgoKCQkvL05vcm1hbCBwb2ludGluZyB0byB0cmlhbmdsZTEKCQkvL2NvbnRhY3RzMS5tX3NlcGFyYXRpbmdfbm9ybWFsICo9IC0xLmY7CgoJCS8vQ2xpcCB0cmkxIGJ5IHRyaTIgZWRnZXMKCgkJVFJJQU5HTEVfUExBTkUodHVfdmVydGljZXNbMF0sdHVfdmVydGljZXNbMV0sdHVfdmVydGljZXNbMl0sY29udGFjdHMyLm1fc2VwYXJhdGluZ19ub3JtYWwpOwoKCQljbGlwcGVkX2NvdW50ID0gY2xpcF90cmlhbmdsZSgKCQkJY29udGFjdHMyLm1fc2VwYXJhdGluZ19ub3JtYWwsdHVfdmVydGljZXMsdHZfdmVydGljZXMsY2xpcHBlZF9wb2ludHMpOwoKCQlpZihjbGlwcGVkX2NvdW50ID09IDAgKQoJCXsKCQkJIHJldHVybiBmYWxzZTsvL1JlamVjdAoJCX0KCgkJLy9maW5kIG1vc3QgZGVlcCBpbnRlcnZhbCBmYWNlMQoJCWNvbnRhY3RzMi5tZXJnZV9wb2ludHMoY29udGFjdHMyLm1fc2VwYXJhdGluZ19ub3JtYWwsbWFyZ2luLGNsaXBwZWRfcG9pbnRzLGNsaXBwZWRfY291bnQpOwoJCWlmKGNvbnRhY3RzMi5tX3BvaW50X2NvdW50ID09IDApIHJldHVybiBmYWxzZTsgLy8gdG9vIGZhcgoKCQljb250YWN0czIubV9zZXBhcmF0aW5nX25vcm1hbCAqPSAtMS5mOwoKCQkvLy8vY2hlY2sgbW9zdCBkaXIgZm9yIGNvbnRhY3RzCgkJaWYoY29udGFjdHMyLm1fcGVuZXRyYXRpb25fZGVwdGg8Y29udGFjdHMxLm1fcGVuZXRyYXRpb25fZGVwdGgpCgkJewoJCQljb250YWN0cy5jb3B5X2Zyb20oY29udGFjdHMyKTsKCQl9CgkJZWxzZQoJCXsKCQkJY29udGFjdHMuY29weV9mcm9tKGNvbnRhY3RzMSk7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCn07Ki8KCgoKYm9vbCBHSU1fVFJJQU5HTEU6OmNvbGxpZGVfdHJpYW5nbGVfaGFyZF90ZXN0KAoJCWNvbnN0IEdJTV9UUklBTkdMRSAmIG90aGVyLAoJCUdJTV9UUklBTkdMRV9DT05UQUNUX0RBVEEgJiBjb250YWN0X2RhdGEpIGNvbnN0CnsKCUdJTV9UUklBTkdMRV9DQUxDVUxBVElPTl9DQUNIRSBjYWxjX2NhY2hlOwkKCXJldHVybiBjYWxjX2NhY2hlLnRyaWFuZ2xlX2NvbGxpc2lvbigKCQkJCQltX3ZlcnRpY2VzWzBdLG1fdmVydGljZXNbMV0sbV92ZXJ0aWNlc1syXSxtX21hcmdpbiwKCQkJCQlvdGhlci5tX3ZlcnRpY2VzWzBdLG90aGVyLm1fdmVydGljZXNbMV0sb3RoZXIubV92ZXJ0aWNlc1syXSxvdGhlci5tX21hcmdpbiwKCQkJCQljb250YWN0X2RhdGEpOwoKfQoKCgoK